source: trunk/www/biomaterials/extracts/edit_extract.jsp @ 5708

Last change on this file since 5708 was 5708, checked in by Nicklas Nordborg, 10 years ago

References #1590: Documentation cleanup

Biomaterials section. Added empty sections for biomaterial lists and bioplate events that hopefully will be written some day. All screen shots must be updated.

Fixed spelling of "bioplate" in a lot of jsp scripts.

Display well coordinates without brackets. A1 instead of [A,1].

Fixed an issue with the regular expression used to link different help texts in the web client.

Reorganized the biomaterial lims menu so that it is consistent with the documentation.

  • Property svn:eol-style set to native
  • Property svn:keywords set to Date Id
File size: 30.9 KB
Line 
1<%-- $Id: edit_extract.jsp 5708 2011-08-25 12:48:46Z nicklas $
2  ------------------------------------------------------------------
3  Copyright (C) 2005 Nicklas Nordborg
4  Copyright (C) 2006 Johan Enell, Jari Häkkinen, Nicklas Nordborg, Martin Svensson
5
6  This file is part of BASE - BioArray Software Environment.
7  Available at http://base.thep.lu.se/
8
9  BASE is free software; you can redistribute it and/or
10  modify it under the terms of the GNU General Public License
11  as published by the Free Software Foundation; either version 3
12  of the License, or (at your option) any later version.
13
14  BASE is distributed in the hope that it will be useful,
15  but WITHOUT ANY WARRANTY; without even the implied warranty of
16  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17  GNU General Public License for more details.
18
19  You should have received a copy of the GNU General Public License
20  along with BASE. If not, see <http://www.gnu.org/licenses/>.
21  ------------------------------------------------------------------
22
23
24  @author Nicklas
25  @version 2.0
26--%>
27<%@ page pageEncoding="UTF-8" session="false"
28  import="net.sf.basedb.core.SessionControl"
29  import="net.sf.basedb.core.DbControl"
30  import="net.sf.basedb.core.Item"
31  import="net.sf.basedb.core.Type"
32  import="net.sf.basedb.core.ItemContext"
33  import="net.sf.basedb.core.SystemItems"
34  import="net.sf.basedb.core.Permission"
35  import="net.sf.basedb.core.Sample"
36  import="net.sf.basedb.core.Extract"
37  import="net.sf.basedb.core.ItemSubtype"
38  import="net.sf.basedb.core.Tag"
39  import="net.sf.basedb.core.BioMaterialEvent"
40  import="net.sf.basedb.core.BioPlate"
41  import="net.sf.basedb.core.BioWell"
42  import="net.sf.basedb.core.Protocol"
43  import="net.sf.basedb.core.Project"
44  import="net.sf.basedb.core.PermissionDeniedException"
45  import="net.sf.basedb.core.BaseException"
46  import="net.sf.basedb.core.ItemQuery"
47  import="net.sf.basedb.core.ItemResultList"
48  import="net.sf.basedb.core.Include"
49  import="net.sf.basedb.core.query.Orders"
50  import="net.sf.basedb.core.query.Hql"
51  import="net.sf.basedb.core.query.Expressions"
52  import="net.sf.basedb.core.query.Restrictions"
53  import="net.sf.basedb.clients.web.Base"
54  import="net.sf.basedb.clients.web.util.HTML"
55  import="net.sf.basedb.util.Values"
56  import="net.sf.basedb.util.ListUtil"
57  import="net.sf.basedb.util.formatter.Formatter"
58  import="net.sf.basedb.util.formatter.WellCoordinateFormatter"
59  import="net.sf.basedb.clients.web.formatter.FormatterFactory"
60  import="net.sf.basedb.clients.web.formatter.FormatterSettings" 
61  import="net.sf.basedb.core.plugin.GuiContext"
62  import="net.sf.basedb.clients.web.extensions.ExtensionsControl"
63  import="net.sf.basedb.clients.web.extensions.JspContext"
64  import="net.sf.basedb.clients.web.extensions.edit.EditUtil"
65  import="net.sf.basedb.util.extensions.ExtensionsInvoker"
66  import="java.util.List"
67  import="java.util.Set"
68  import="java.util.HashSet"
69  import="java.util.Date"
70  import="java.util.Collections"
71%>
72<%@ taglib prefix="base" uri="/WEB-INF/base.tld" %>
73<%@ taglib prefix="t" uri="/WEB-INF/tab.tld" %>
74<%
75final Item itemType = Item.EXTRACT;
76final SessionControl sc = Base.getExistingSessionControl(pageContext, true);
77final ItemContext cc = Base.getAndSetCurrentContext(sc, itemType, null, null);
78final int itemId = cc.getId();
79final String ID = sc.getId();
80final float scale = Base.getScale(sc);
81final DbControl dc = sc.newDbControl();
82try
83{
84  String title = null;
85  Extract extract = null;
86  BioMaterialEvent creationEvent = null;
87  Date eventDate = null;
88  Item parentType = null;
89  boolean lockEventProperties = false;
90 
91  WellCoordinateFormatter rowFormatter = new WellCoordinateFormatter(true);
92  WellCoordinateFormatter columnFormatter = new WellCoordinateFormatter(false);
93
94  boolean readCurrentSubtype = true;
95  ItemSubtype currentSubtype = null;
96  boolean readCurrentProtocol = true;
97  Protocol currentProtocol = null;
98  boolean readCurrentTag = true;
99  Tag currentTag = null;
100  boolean readCurrentSample = true;
101  Sample currentSample = null;
102  Float usedFromSample = null;
103  String name = null;
104  ItemQuery<Extract> extractsQuery = null;
105  boolean readCurrentBioWell = true;
106  BioWell currentBioWell = null; 
107  boolean lockedWell = false;
108  boolean readCurrentBioPlate = true;
109  BioPlate currentBioPlate = null;
110 
111  if (itemId == 0)
112  {
113    title = "Create extract";
114    cc.removeObject("item");
115    if (cc.getPropertyFilter("creationEvent.protocol.name") != null)
116    {
117      currentProtocol = Base.getFirstMatching(dc, Protocol.getQuery(), "name", cc.getPropertyFilter("creationEvent.protocol.name"));
118    }
119    if (cc.getPropertyFilter("tag.name") != null)
120    {
121      currentTag = Base.getFirstMatching(dc, Tag.getQuery(), "name", cc.getPropertyFilter("tag.name"));
122    }
123    int currentSubtypeId = Values.getInt(request.getParameter("subtype_id"));
124    List<ItemSubtype> relatedToParent = Collections.emptyList();
125    int sampleId = Values.getInt(request.getParameter("sample_id"));
126    int extractId = Values.getInt(request.getParameter("extract_id"));
127
128    if (sampleId != 0)
129    {
130      currentSample  = Sample.getById(dc, sampleId);
131      parentType = Item.SAMPLE;
132      name = currentSample.getName() + ".e" + (currentSample.countExtracts() + 1);     
133      if (currentSubtypeId == 0)
134      {
135        relatedToParent = ItemSubtype.getParentSubtypes(dc, currentSample, Item.EXTRACT);
136      }
137    }
138    else if (extractId != 0)
139    {
140      parentType = Item.EXTRACT;
141      Extract e = Extract.getById(dc, extractId);
142      name = e.getName() + ".e" + (e.countExtracts()+1);
143      extractsQuery = Extract.getQuery();
144      extractsQuery.restrict(Restrictions.eq(Hql.property("id"), Expressions.integer(extractId)));
145      if (currentSubtypeId == 0)
146      {
147        relatedToParent = ItemSubtype.getParentSubtypes(dc, e, Item.EXTRACT);
148      }
149    }
150    else if (Values.getBoolean(request.getParameter("pooled")))
151    {
152      parentType = Item.EXTRACT;
153      name = Values.getString(cc.getPropertyValue("name"), "New pooled extract");
154      extractsQuery = Extract.getQuery();
155      extractsQuery.restrict(Restrictions.in(Hql.property("id"), Expressions.parameter("selected")));
156      extractsQuery.setParameter("selected", cc.getSelected(), Type.INT);
157    }
158    else
159    {
160      name = Values.getString(cc.getPropertyValue("name"), "New extract");
161    }
162    if (currentSubtypeId == 0) 
163    {
164      if (relatedToParent.size() > 0)
165      {
166        // Find most recently used related subtype
167        List<ItemSubtype> recentSubtypes = (List<ItemSubtype>)cc.getRecent(dc, Item.ITEMSUBTYPE);
168        currentSubtype = ListUtil.findFirstCommon(recentSubtypes, relatedToParent, relatedToParent.get(0));
169      }
170      else
171      {
172        int recentSubtypeId = Values.getInt(cc.getRecent(Item.ITEMSUBTYPE.name(), 0));
173        currentSubtypeId = Values.getInt(cc.getPropertyValue("itemSubtype"), recentSubtypeId);
174        if (currentSubtypeId > 0) currentSubtype = ItemSubtype.getById(dc, currentSubtypeId);
175      }
176    }
177    eventDate = (Date)cc.getPropertyObject("creationEvent.eventDate");   
178  }
179  else
180  {
181    extract = Extract.getById(dc, itemId);
182    extract.checkPermission(Permission.WRITE);
183    parentType = extract.getParentType();
184    cc.setObject("item", extract);
185    title = "Edit extract -- " + HTML.encodeTags(extract.getName());
186 
187    creationEvent = extract.getCreationEvent();
188    eventDate = creationEvent.getEventDate();
189    name = extract.getName();
190    lockEventProperties = !creationEvent.hasPermission(Permission.WRITE);
191   
192    try
193    {
194      currentSubtype = extract.getItemSubtype();
195    }
196    catch (PermissionDeniedException ex)
197    {
198      readCurrentSubtype = false;
199    }
200
201    try
202    {
203      currentProtocol = creationEvent.getProtocol();
204    }
205    catch (PermissionDeniedException ex)
206    {
207      readCurrentProtocol = false;
208    }
209 
210    try
211    {
212      currentTag = extract.getTag();
213    }
214    catch (PermissionDeniedException ex)
215    {
216      readCurrentTag = false;
217    }
218
219    try
220    {
221      if (parentType == Item.SAMPLE)
222      {
223        currentSample = (Sample)extract.getParent();
224        if (currentSample != null) 
225        {
226          usedFromSample = creationEvent.getUsedQuantity(currentSample);
227        }
228      }
229    }
230    catch (PermissionDeniedException ex)
231    {
232      readCurrentSample = false;
233    }
234    try
235    {
236      currentBioWell = extract.getBioWell();
237      lockedWell = extract.isLockedInWell();
238      if (currentBioWell != null)
239      {
240        currentBioPlate = currentBioWell.getPlate();
241      }
242    }
243    catch (PermissionDeniedException ex)
244    {
245      readCurrentBioWell = false;
246      readCurrentBioPlate = false;
247    }
248 
249    // Query to retrieve pooled extracts
250    if (parentType == Item.EXTRACT)
251    {
252      extractsQuery = (ItemQuery<Extract>)creationEvent.getSources();
253    }
254  }
255 
256  // Default items
257  int activeProjectId = sc.getActiveProjectId();
258  List<Protocol> defaultProtocols = null;
259  if (activeProjectId > 0)
260  {
261    Project activeProject = Project.getById(dc, activeProjectId);
262    ItemSubtype protocolSubtype = currentSubtype == null ? null : currentSubtype.getRelatedSubtype(Item.PROTOCOL);
263    if (protocolSubtype == null) protocolSubtype = ItemSubtype.getById(dc, SystemItems.getId(Protocol.EXTRACTION));
264    defaultProtocols = (List<Protocol>)activeProject.findDefaultItems(dc, protocolSubtype, false);
265  }
266
267  // Load recently used items
268  List<Protocol> recentProtocols = (List<Protocol>)cc.getRecent(dc, Item.PROTOCOL, currentSubtype);
269  List<Sample> recentSamples = (List<Sample>)cc.getRecent(dc, Item.SAMPLE);
270  List<BioPlate> recentBioPlates = (List<BioPlate>)cc.getRecent(dc, Item.BIOPLATE, currentSubtype);
271  List<Tag> recentTags = (List<Tag>)cc.getRecent(dc, Item.TAG, currentSubtype);
272 
273  // Query to retrieve item types
274  final ItemQuery<ItemSubtype> subtypesQuery = Base.getSubtypesQuery(itemType);
275  subtypesQuery.include(Include.ALL);
276
277  final String clazz = "class=\"text\"";
278  final String requiredClazz = "class=\"text required\"";
279  Formatter<Date> dateFormatter = FormatterFactory.getDateFormatter(sc);
280  String dateFormat = FormatterSettings.getDateFormat(sc);
281  String jsDateFormat = HTML.javaScriptEncode(dateFormat);
282  String htmlDateFormat = HTML.encodeTags(dateFormat);
283  JspContext jspContext = ExtensionsControl.createContext(dc, pageContext, GuiContext.item(itemType), extract);
284  ExtensionsInvoker invoker = EditUtil.useEditExtensions(jspContext);
285  %>
286  <base:page type="popup" title="<%=title%>">
287  <base:head scripts="tabcontrol.js,annotations.js,linkitems.js,subtypes.js,ajax.js,json2.js" styles="tabcontrol.css">
288    <ext:scripts context="<%=jspContext%>" />
289    <ext:stylesheets context="<%=jspContext%>" />
290    <script language="JavaScript">
291    // Validate the "Extract" tab
292    function validateExtract()
293    {
294      var frm = document.forms['extract'];
295      if (Main.trimString(frm.name.value) == '')
296      {
297        alert("You must enter a name");
298        frm.name.focus();
299        return false;
300      }
301      if (Main.trimString(frm.bioplate_id.value) != 0 && Main.trimString(frm.biowell_id.value) == 0)
302      {
303        alert("You must choose a biowell from the bioplate");
304        return false;
305      }
306      return true;
307    }
308
309    // Submit the form
310    function saveSettings()
311    {
312      var frm = document.forms['extract'];
313      if (TabControl.validateActiveTab('settings'))
314      {
315        if (annotationsLoaded)
316        {
317          Annotations.addModifiedAnnotationsToForm(frames.annotations, frm);
318        }
319        if (inheritedAnnotationsLoaded)
320        {
321          Annotations.addInheritedAnnotationsToForm(frames.inheritedAnnotations, frm);
322        }
323        frm.modifiedExtracts.value = Link.exportModified(frm, 'E', true).join(',');
324        frm.removedExtracts.value = Link.getActionIds(-1, 'E').join(',');
325        frm.submit();
326      }
327    }
328   
329    var annotationsLoaded = false;
330    var inheritedAnnotationsLoaded = false;
331    var parentsChanged = false;
332    var protocolChanged = false;
333    function switchTab(tabControlId, tabId)
334    {
335      if (TabControl.setActiveTab(tabControlId, tabId))
336      {
337        if (tabId == 'annotations' && (protocolChanged || !annotationsLoaded))
338        {
339          Annotations.loadAnnotateFrame(frames.annotations, '<%=ID%>', '<%=itemType.name()%>', <%=itemId%>, getProtocolId());
340          annotationsLoaded = true;
341          protocolChanged = false;
342        }
343        else if (tabId == 'inheritedAnnotations' && 
344          (parentsChanged || !inheritedAnnotationsLoaded))
345        {
346          Annotations.loadInheritFrame(frames.inheritedAnnotations, '<%=ID%>', '<%=itemType.name()%>', <%=itemId%>, getParents());
347          inheritedAnnotationsLoaded = true;
348          parentsChanged = false;
349        }
350      }
351    }
352
353    function getProtocolId()
354    {
355      var frm = document.forms['extract'];
356      var protocolId = 0;
357      if (frm.protocol_id.length > 0 && !frm.protocol_id.disabled)
358      {
359        protocolId = Math.abs(parseInt(frm.protocol_id[frm.protocol_id.selectedIndex].value));       
360      }
361      return protocolId;
362    }
363
364    function getParents()
365    {
366      var frm = document.forms['extract'];
367      var parents = new Array();
368      if (frm.parentType[0].checked)
369      {
370        var sampleId = Math.abs(parseInt(frm.sample_id[frm.sample_id.selectedIndex].value));
371        if (sampleId > 0) parents[parents.length] = 'SAMPLE:'+sampleId;
372      }
373      else
374      {
375        var ids = Link.getListIds(frm.extracts, 'E');
376        if (ids.length > 0)
377        {
378          parents[parents.length] = 'EXTRACT:'+ids.join(':');
379        }
380      }
381      return parents;
382    }
383   
384    function subtypeOnChange()
385    {
386      var frm = document.forms['extract'];
387      var subtypeId = ItemSubtype.getSubtypeId('extract');
388      var recentInfo = ItemSubtype.getRecentAndRelatedInfo(subtypeId, 'EXTRACT', ['PROTOCOL', 'BIOPLATE', 'TAG', 'SAMPLE', 'EXTRACT']);
389      protocolChanged = ItemSubtype.updateSelectionList(frm.protocol_id, recentInfo.PROTOCOL['recent'], recentInfo.PROTOCOL['default']);
390      ItemSubtype.updateSelectionList(frm.tag_id, recentInfo.TAG['recent']);
391      ItemSubtype.updateSelectionList(frm.bioplate_id, recentInfo.BIOPLATE['recent']);
392    }
393   
394    function selectProtocolOnClick()
395    {
396      var frm = document.forms['extract'];
397      var url = '../../admin/protocols/index.jsp?ID=<%=ID%>&cmd=UpdateContext&mode=selectone';
398      url += '&callback=setProtocolCallback&resetTemporary=1';
399      url += ItemSubtype.createRelatedFilter('extract', 'PROTOCOL', <%=SystemItems.getId(Protocol.EXTRACTION)%>);
400      if (frm.protocol_id.length > 1)
401      {
402        var id = Math.abs(parseInt(frm.protocol_id[1].value));       
403        url += '&item_id='+id;
404      }
405      Main.openPopup(url, 'SelectProtocol', 1000, 700);
406    }
407    function setProtocolCallback(id, name)
408    {
409      var frm = document.forms['extract'];
410      var list = frm.protocol_id;
411      if (list.length < 2 || list[1].value == '0') // >
412      {
413        Forms.addListOption(list, 1, new Option());
414      }
415      list[1].value = id;
416      list[1].text = name;
417      list.selectedIndex = 1;
418      protocolChanged = true;
419    }
420    function protocolOnChange()
421    {
422      protocolChanged = true;
423    }
424    function selectTagOnClick()
425    {
426      var frm = document.forms['extract'];
427      var url = '../tags/index.jsp?ID=<%=ID%>&cmd=UpdateContext&mode=selectone';
428      url += '&callback=setTagCallback&resetTemporary=1';
429      url += ItemSubtype.createRelatedFilter('extract', 'TAG');
430      if (frm.tag_id.length > 1)
431      {
432        var id = Math.abs(parseInt(frm.tag_id[1].value));       
433        url += '&item_id='+id;
434      }
435      Main.openPopup(url, 'SelectTag', 1000, 700);
436    }
437    function setTagCallback(id, name)
438    {
439      var frm = document.forms['extract'];
440      var list = frm.tag_id;
441      if (list.length < 2 || list[1].value == '0') // >
442      {
443        Forms.addListOption(list, 1, new Option());
444      }
445      list[1].value = id;
446      list[1].text = name;
447      list.selectedIndex = 1;
448    }
449    function selectBioPlateOnClick()
450    {
451      var frm = document.forms['extract'];
452      var url = '../bioplates/index.jsp?ID=<%=ID%>&cmd=UpdateContext&mode=selectone&callback=setBioPlateCallback';
453      if (frm.bioplate_id.length > 1)
454      {
455        var id = Math.abs(parseInt(frm.bioplate_id[1].value));       
456        url += '&item_id='+id;
457      }
458      url += '&resetTemporary=1&tmpfilter:INT:bioPlateType.lockMode=<><%=BioWell.LockMode.LOCKED_AFTER_CREATE.getValue()%>';
459      url += '&tmpfilter:BOOLEAN:destroyed=false';
460      Main.openPopup(url, 'SelectBioplate', 1000, 700);
461    }
462    function setBioPlateCallback(id, name)
463    {
464      var frm = document.forms['extract'];
465      var list = frm.bioplate_id;
466      if (list.length < 2 || list[1].value == '0') // >
467      {
468        Forms.addListOption(list, 1, new Option());
469      }
470      list[1].value = id;
471      list[1].text = name;
472      list.selectedIndex = 1;
473      frm.biowell_id.remove(1);
474      frm.biowell_id.disabled = false;
475    }
476    function bioPlateOnChange()
477    {
478      var frm = document.forms['extract'];
479      var list = frm.bioplate_id;
480      frm.biowell_id.selectedIndex=0;
481      frm.biowell_id.remove(1);     
482    }
483
484    function initBioWell()
485    {
486      var frm = document.forms['extract'];
487      <%
488      if (currentBioWell != null)
489      {
490        %>
491        var list = frm.biowell_id;
492        var wellId = <%=currentBioWell.getId()%>;
493        Forms.addListOption(list, 1, new Option());
494        list[1].value = '<%=currentBioWell.getId()*(extract == null ? 1 : -1)%>';
495        list[1].text = '[<%=rowFormatter.format(currentBioWell.getRow())%>,<%=columnFormatter.format(currentBioWell.getColumn())%>]';
496        list.selectedIndex = 1;
497      <%
498      }
499      %>
500    }         
501    function selectBioWellOnClick()
502    {
503      var frm = document.forms['extract'];
504      var bioplate_list = frm.bioplate_id;     
505      var bioplateId = Math.abs(parseInt(bioplate_list[bioplate_list.selectedIndex].value))
506      if (Main.trimString(frm.bioplate_id.value) == 0)
507      {
508        alert("You must first select the bioplate where the biowell is located");
509        return;
510      }     
511       
512      var url = '../bioplates/wells/index.jsp?ID=<%=ID%>&cmd=UpdateContext&mode=selectone&callback=setBioWellCallback';
513      if (frm.biowell_id.length > 1)
514      {
515        var id = Math.abs(parseInt(frm.biowell_id[1].value));       
516        url += '&item_id='+id;
517      }
518      url += '&bioplate_id='+bioplateId;
519      url += '&resetTemporary=1&tmpfilter:STRING:$mbm.name='+escape('=');
520      url += '&tmpfilter:STRING:originalBioMaterial.name='+escape('=');
521      url += '&columns=row,column';
522      Main.openPopup(url, 'SelectBiowell', 700, 700);
523    }
524    function setBioWellCallback(id, name)
525    {
526      var frm = document.forms['extract'];
527      var list = frm.biowell_id;
528      if (list.length < 2 || list[1].value == '0') // >
529      {
530        Forms.addListOption(list, 1, new Option());
531      }
532      list[1].value = id;
533      list[1].text = name;
534      list.selectedIndex = 1;
535    }
536   
537    function parentTypeOnClick()
538    {
539      var frm = document.forms['extract'];
540      var useExtracts = frm.parentType[1].checked;
541      frm.sample_id.disabled = useExtracts;
542      frm.used_from_sample.disabled = useExtracts;
543      frm.extracts.disabled = !useExtracts;
544      frm.used_quantity.disabled = !useExtracts;
545      parentsChanged = true;
546    }
547    function sampleOnChange()
548    {
549      parentsChanged = true;
550    }
551   
552    function selectSampleOnClick()
553    {
554      var frm = document.forms['extract'];
555      var url = '../samples/index.jsp?ID=<%=ID%>&cmd=UpdateContext&mode=selectone';
556      url += '&callback=setSampleCallback&resetTemporary=1';
557      url += ItemSubtype.createRelatedFilter('extract', 'SAMPLE');
558      if (frm.sample_id.length > 1)
559      {
560        var id = Math.abs(parseInt(frm.sample_id[1].value));       
561        url += '&item_id='+id;
562      }
563      Main.openPopup(url, 'SelectSample', 1000, 700);
564    }
565    function setSampleCallback(id, name)
566    {
567      var frm = document.forms['extract'];
568      var list = frm.sample_id;
569      if (list.length < 2 || list[1].value == '0') // >
570      {
571        Forms.addListOption(list, 1, new Option());
572      }
573      list[1].value = id;
574      list[1].text = name;
575      list.selectedIndex = 1;
576      frm.parentType[0].checked = true;
577      frm.parentType[1].checked = false;
578      parentTypeOnClick();
579      parentsChanged = true;
580    }
581   
582    function addExtractsOnClick()
583    {
584      var frm = document.forms['extract'];
585      var url = 'index.jsp?ID=<%=ID%>&cmd=UpdateContext&mode=selectmultiple';
586      url += '&callback=addExtractCallback&resetTemporary=1';
587      url += ItemSubtype.createRelatedFilter('extract', 'EXTRACT');
588      Main.openPopup(url, 'AddExtracts', 1000, 700);
589    }
590   
591    function addExtractCallback(extractId, name)
592    {
593      var item = Link.getItem('E', extractId);
594      if (!item) item = new Item('E', extractId, name+' [-]', '', '');
595      Link.addItem(document.forms['extract'].extracts, item);
596      frm.parentType[0].checked = false;
597      frm.parentType[1].checked = true;
598      parentTypeOnClick();
599      parentsChanged = true;
600    }
601    function extractsOnChange()
602    {
603      var frm = document.forms['extract'];
604      var item = frm.extracts[frm.extracts.selectedIndex].item;
605      if (item && item.id)
606      {
607        frm.used_quantity.value = item.value;
608        frm.used_quantity.focus();
609      }
610      else
611      {
612        frm.used_quantity.value = '';
613      }
614    }
615    function usedQuantityOnBlur()
616    {
617      var frm = document.forms['extract'];
618      var usedQuantity = frm.used_quantity.value;
619      var displayQuantity = usedQuantity == '' ? '-' : usedQuantity+' µg';
620      for (var i = 0; i < frm.extracts.length; i++) // >
621      {
622        var option = frm.extracts[i];
623        if (option.selected && option.item.id)
624        {
625          option.item.value = usedQuantity;
626          var text = option.text.replace(/\[.*\]/, '['+displayQuantity+']');
627          option.text = text;
628        }
629      }
630    }
631    function usedFromSampleOnBlur()
632    {
633      var frm = document.forms['extract'];
634     
635      var sampleId = parseInt(frm.sample_id[frm.sample_id.selectedIndex].value);
636      if (sampleId < 0)
637      {
638        frm.sample_id[frm.sample_id.selectedIndex].value = -sampleId;
639      }
640    }
641   
642
643    function removeOnClick()
644    {
645      Link.removeSelected(document.forms['extract'].extracts);
646      parentsChanged = true;
647    }
648
649    function init()
650    {
651      <%
652      if (extract == null)
653      {
654        %>
655        var frm = document.forms['extract'];
656        frm.name.focus();
657        frm.name.select();
658        <%
659      }
660      %>
661      initBioWell();     
662      initExtracts();
663      parentTypeOnClick();
664    }
665    function initExtracts()
666    {
667      var extracts = document.forms['extract'].extracts;
668      <%
669      if (extractsQuery != null)
670      {
671        extractsQuery.include(Include.ALL);
672        extractsQuery.order(Orders.asc(Hql.property("name")));
673        ItemResultList<Extract> extracts = extractsQuery.list(dc);
674        for (Extract e : extracts)
675        {
676          if (extract != null)
677          {
678            String usedQuantity = Values.formatNumber(creationEvent.getUsedQuantity(e), -1);
679            %>
680            Link.addNewItem(extracts, new Item('E', <%=e.getId()%>, '<%=HTML.javaScriptEncode(e.getName())%> [<%=usedQuantity%> µg]', '<%=usedQuantity%>'));
681            <%
682          }
683          else
684          {
685            %>
686            Link.addItem(extracts, new Item('E', <%=e.getId()%>, '<%=HTML.javaScriptEncode(e.getName())%> [-]', '', ''));
687            <%
688           
689          }
690        }
691      }
692      %>
693    }
694    </script>
695  </base:head>
696  <base:body onload="init()">
697    <p>
698    <form action="index.jsp?ID=<%=ID%>" method="post" name="extract" onsubmit="return false;">
699    <input type="hidden" name="cmd" value="UpdateItem">
700
701    <h3 class="docked"><%=title%> <base:help tabcontrol="settings" /></h3>
702    <t:tabcontrol id="settings" contentstyle="<%="height: "+(int)(scale*370)+"px;"%>" 
703      position="bottom"  remember="<%=extract != null%>" switch="switchTab"
704      extensions="<%=invoker%>">
705    <t:tab id="info" title="Extract" validate="validateExtract()" helpid="extract.edit">
706      <table class="form" cellspacing=0>
707      <tr>
708        <td class="prompt">Name</td>
709        <td><input <%=requiredClazz%> type="text" name="name" 
710          value="<%=HTML.encodeTags(name)%>" 
711          size="40" maxlength="<%=Extract.MAX_NAME_LENGTH%>"></td>
712      </tr>
713      <tr valign="top">
714        <td class="prompt">Type</td>
715        <td colspan="2">
716          <select name="subtype_id"
717            <%=!readCurrentSubtype ? "disabled readonly class=\"disabled selectionlist\"" : "class=\"selectionlist\""%>
718            onchange="subtypeOnChange()"
719            >
720          <%
721          if (!readCurrentSubtype)
722          {
723            %>
724            <option value="-1">- denied -
725            <%
726          }
727          else
728          {
729            %>
730            <option value="0">-none-
731            <%
732            int currentSubtypeId = currentSubtype == null ? 0 : currentSubtype.getId();
733            for (ItemSubtype subtype : subtypesQuery.list(dc))
734            {
735              int id = subtype.getId();
736              if (id != currentSubtypeId && subtype.isRemoved()) continue;
737              %>
738              <option value="<%=id == currentSubtypeId && extract != null ? -id : id%>" 
739                <%=id == currentSubtypeId ? "selected" : ""%>
740                title="<%=HTML.encodeTags(subtype.getDescription()) %>"
741                ><%=HTML.encodeTags(subtype.getName())%>
742              <%
743            }
744          }
745          %>
746          </select>
747        </td>
748      </tr>
749      <tr>
750        <td class="prompt">Tag</td>
751        <td>
752          <base:select 
753            id="tag_id"
754            clazz="selectionlist"
755            required="false"
756            current="<%=currentTag%>"
757            denied="<%=!readCurrentTag%>"
758            recent="<%=recentTags%>"
759            newitem="<%=extract == null%>"
760            onselect="selectTagOnClick()"
761          />
762        </td>
763      </tr>
764      <tr>
765        <td class="prompt">External ID</td>
766        <td><input <%=clazz%> type="text" name="external_id" 
767          value="<%=HTML.encodeTags(extract == null ? Values.getString(cc.getPropertyValue("externalId"), "") : extract.getExternalId())%>" 
768          size="40" maxlength="<%=Extract.MAX_EXTERNAL_ID_LENGTH%>"></td>
769      </tr>
770      <tr>
771        <td class="prompt">Original quantity</td>
772        <td><input <%=clazz%> type="text" name="original_quantity" 
773          value="<%=Values.formatNumber(extract == null ? Values.getFloat(cc.getPropertyValue("originalQuantity"), null): extract.getOriginalQuantity(), -1)%>" size="12" 
774          maxlength="10" onkeypress="return Numbers.numberOnly(event)"> (µg)</td>
775      </tr>
776      <tr>
777        <td class="prompt">Created</td>
778        <td>
779          <table border="0" cellspacing="0" cellpadding="0">
780          <tr>
781          <td>
782            <input <%=clazz%> type="text" name="event_date" <%=lockEventProperties ? "disabled" : ""%>
783              value="<%=HTML.encodeTags(dateFormatter.format(eventDate))%>" 
784              size="20" maxlength="20" title="Enter date in format: <%=htmlDateFormat%>">
785            &nbsp;
786          </td>
787          <td>
788          <base:button 
789            onclick="<%="Dates.selectDate('Created', 'extract', 'event_date', null, '"+jsDateFormat+"')"%>"
790            image="calendar.png" 
791            title="Calendar&hellip;" 
792            tooltip="Select a date from a calendar" 
793            disabled="<%=lockEventProperties%>"
794          />
795          </td>
796          </tr>
797          </table>
798        </td>
799      </tr>
800      <tr>
801        <td class="prompt">Registered</td>
802        <td><%=dateFormatter.format(creationEvent == null ? new Date() : creationEvent.getEntryDate())%></td>
803      </tr>
804      <tr>
805        <td class="prompt">Protocol</td>
806        <td>
807          <base:select 
808            id="protocol_id"
809            clazz="selectionlist"
810            required="false"
811            current="<%=currentProtocol%>"
812            denied="<%=!readCurrentProtocol%>"
813            recent="<%=recentProtocols%>"
814            defaultitems="<%=defaultProtocols%>"
815            newitem="<%=extract == null%>"
816            onselect="selectProtocolOnClick()"
817            onchange="protocolOnChange()"
818            disabled="<%=lockEventProperties%>"
819          />
820        </td>
821      </tr>
822      <tr>
823        <td class="prompt">Bioplate</td>
824        <td>
825          <base:select 
826            id="bioplate_id"
827            clazz="selectionlist"
828            required="false"
829            current="<%=currentBioPlate%>"
830            denied="<%=!readCurrentBioPlate%>"
831            recent="<%=recentBioPlates%>"
832            newitem="<%=extract == null%>"
833            onselect="selectBioPlateOnClick()"
834            onchange="bioPlateOnChange()"
835            disabled="<%=lockedWell%>"
836          />
837        </td>
838      </tr>
839      <tr>
840        <td class="prompt">Biowell</td>
841        <td>
842          <base:select 
843            id="biowell_id"
844            clazz="selectionlist"
845            required="false"           
846            current="<%=null %>"
847            denied="<%=!readCurrentBioWell%>"
848            newitem="<%=extract == null%>"
849            onselect="selectBioWellOnClick()"
850            onchange="bioWellOnChange()"
851            disabled="<%=lockedWell%>"
852          />
853        </td>
854      </tr>
855      <tr valign=top>
856        <td class="prompt">Description</td>
857        <td nowrap>
858          <textarea <%=clazz%> rows="4" cols="40" name="description" wrap="virtual"
859            ><%=HTML.encodeTags(extract == null ? cc.getPropertyValue("description") : extract.getDescription())%></textarea>
860          <a href="javascript:Main.zoom('Description', 'extract', 'description')"
861            title="Edit in larger window"><base:icon image="zoom.gif" /></a>
862        </td>
863      </tr>
864      </table>
865      <div align=right>&nbsp;<i><base:icon image="required.gif" /> = required information</i></div>
866    </t:tab>
867   
868    <t:tab id="parents" title="Parents" helpid="extract.parent">
869      <table class="form" cellspacing=0>
870      <tr>
871        <td class="prompt">Parent type</td>
872        <td>
873          <input type="radio" name="parentType" id="parentType.sample" 
874            value="SAMPLE" onclick="parentTypeOnClick()"
875            <%=parentType != Item.EXTRACT ? "checked" : ""%>
876            ><label for="parentType.sample">Sample</label>
877          <input type="radio" name="parentType" id="parentType.extract" 
878            value="EXTRACT" onclick="parentTypeOnClick()"
879            <%=parentType == Item.EXTRACT ? "checked" : ""%>
880            ><label for="parentType.extract">Extract</label>
881        </td>
882      </tr>
883      <tr valign="top">
884        <td class="prompt">Sample</td>
885        <td>
886          <base:select 
887            id="sample_id"
888            clazz="selectionlist"
889            buttonstyle="width: 150px;"
890            buttonicon="add.png"
891            buttontitle="Select sample&hellip;"
892            required="false"
893            current="<%=currentSample%>"
894            denied="<%=!readCurrentSample%>"
895            recent="<%=recentSamples%>"
896            selectrecent="false"
897            newitem="<%=extract == null%>"
898            onselect="selectSampleOnClick()"
899            onchange="sampleOnChange()"
900          />
901        </td>
902      </tr>
903      <tr>
904        <td class="subprompt">-</td>
905        <td>
906          used quantity
907          <input <%=clazz%> type="text" name="used_from_sample" value="<%=Values.formatNumber(usedFromSample, -1)%>"
908            size="12" maxlength="10" onkeypress="return Numbers.numberOnly(event)"
909            onblur="usedFromSampleOnBlur()"> (µg)
910        </td>
911      </tr>
912      <tr valign="top">
913        <td class="prompt">Extracts</td>
914        <td>
915          <table border="0" cellspacing="0" cellpadding="0">
916          <tr valign="top">
917          <td>
918            <select name="extracts" size="12" multiple class="selectionlist" 
919              onchange="extractsOnChange()">
920            </select>&nbsp;
921            <input type="hidden" name="modifiedExtracts" value="">
922            <input type="hidden" name="removedExtracts" value="">
923          </td>
924          <td>
925            <table border="0" cellspacing="0" cellpadding="0">
926            <tr><td style="padding: 1px 0px 4px 0px;"><base:button 
927              style="width: 150px;"
928              onclick="addExtractsOnClick()" 
929              title="Add&nbsp;extracts&hellip;" 
930              tooltip="Add extracts"
931              /></td></tr>
932            <tr><td width="150"><base:button 
933              style="width: 150px;"
934              onclick="removeOnClick()" 
935              title="Remove" 
936              tooltip="Remove the selected extracts"
937            /></td></tr>
938            </table>
939          </td>
940          </tr>
941          </table>
942        </td>
943      </tr>
944      <tr>
945        <td class="subprompt">-</td>
946        <td>used quantity
947        <input <%=clazz%> type="text" name="used_quantity" value=""
948              size="12" maxlength="10" onkeypress="return Numbers.numberOnly(event)"
949              onkeyup="usedQuantityOnBlur();"
950            > (µg)
951        </td>
952      </tr>         
953      </table>
954    </t:tab>
955
956    <t:tab id="annotations" title="Annotations &amp; parameters" 
957      helpid="annotations.edit" tooltip="Enter values for annotations and protocol parameters">
958      <iframe name="annotations" id="idAnnotations" src="../../common/annotations/wait.jsp" 
959        width="100%"  height="<%=(int)(scale*370)%>" frameborder=0 vspace=0 hspace=0
960        marginwidth=0 marginheight=0 scrolling="auto" style="overflow: visible"></iframe>
961    </t:tab>
962   
963    <t:tab id="inheritedAnnotations" title="Inherited annotations" helpid="annotations.edit.inherited">
964   
965      <iframe name="inheritedAnnotations" id="idInheritedAnnotations" src="../../common/annotations/wait.jsp" 
966        width="100%"  height="<%=(int)(scale*370)%>" frameborder=0 vspace=0 hspace=0
967        marginwidth=0 marginheight=0 scrolling="auto" style="overflow: visible"></iframe>
968    </t:tab>
969    </t:tabcontrol>
970
971    <table align="center">
972    <tr>
973      <td width="50%"><base:button onclick="saveSettings()" title="Save" /></td>
974      <td width="50%"><base:button onclick="window.close()" title="Cancel" /></td>
975    </tr>
976    </table>
977    </form>
978  </base:body>
979  </base:page>
980  <%
981}
982finally
983{
984  if (dc != null) dc.close();
985}
986%>
Note: See TracBrowser for help on using the repository browser.