source: trunk/www/biomaterials/samples/edit_sample.jsp @ 5645

Last change on this file since 5645 was 5645, checked in by Nicklas Nordborg, 11 years ago

References #1597: Subtypes of items

Added subtype functionality for sample list, view and edit dialog. Show the inversely related subtypes on the subtype view page.

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