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