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

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

References #1597: Subtypes of items

Added Subtypable interface and ItemSubtype item (and corresponding data-layer classes). File, Protocol, Software and Hardware are implementing the new interface and the FileType, ProtocolType, SoftwareType and HardwareType + data-layer classes have been deleted.

The rest of the changes are dependencies that have been updated to use the new subtype functionality.

There is no updgrade script yet. This will need to move existing *Type items into ItemSubtype and update all links from the other items. Then it can remove the old columns and tables. We also need to fix context-related information, but I think we have most functionality for this.

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