source: trunk/www/biomaterials/samples/list_samples.jsp @ 5667

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

References #1153: Handling short read transcript sequence data

Fixes the sample and extract batch importers so that they can import both types of parent items.

Display the 'tag' for an extract in listings and on the view page.

Added 'none' option to parent type filter.

  • Property svn:eol-style set to native
  • Property svn:keywords set to Date Id
File size: 29.8 KB
Line 
1<%-- $Id: list_samples.jsp 5667 2011-06-23 12:06:39Z nicklas $
2  ------------------------------------------------------------------
3  Copyright (C) 2006 Jari Häkkinen, Nicklas Nordborg, Martin Svensson
4  Copyright (C) 2007 Johan Enell, 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  @author Nicklas
24  @version 2.0
25--%>
26<%@ page pageEncoding="UTF-8" session="false"
27  import="net.sf.basedb.core.SessionControl"
28  import="net.sf.basedb.core.DbControl"
29  import="net.sf.basedb.core.Item"
30  import="net.sf.basedb.core.Sample"
31  import="net.sf.basedb.core.Extract"
32  import="net.sf.basedb.core.BioPlate"
33  import="net.sf.basedb.core.BioSource"
34  import="net.sf.basedb.core.BioMaterialEvent"
35  import="net.sf.basedb.core.BioWell"
36  import="net.sf.basedb.core.AnnotationType"
37  import="net.sf.basedb.core.ItemSubtype"
38  import="net.sf.basedb.core.AnnotationSet"
39  import="net.sf.basedb.core.ItemQuery"
40  import="net.sf.basedb.core.Include"
41  import="net.sf.basedb.core.ItemResultIterator"
42  import="net.sf.basedb.core.ItemResultList"
43  import="net.sf.basedb.core.ItemContext"
44  import="net.sf.basedb.core.Nameable"
45  import="net.sf.basedb.core.Permission"
46  import="net.sf.basedb.core.PermissionDeniedException"
47  import="net.sf.basedb.core.PlateGeometry"
48  import="net.sf.basedb.core.PluginDefinition"
49  import="net.sf.basedb.core.Annotation"
50  import="net.sf.basedb.core.Quantity"
51  import="net.sf.basedb.core.Unit"
52  import="net.sf.basedb.core.query.Hql"
53  import="net.sf.basedb.core.query.Restrictions"
54  import="net.sf.basedb.core.query.Expressions"
55  import="net.sf.basedb.core.query.Orders"
56  import="net.sf.basedb.core.plugin.GuiContext"
57  import="net.sf.basedb.core.plugin.Plugin"
58  import="net.sf.basedb.core.Type"
59  import="net.sf.basedb.util.Enumeration"
60  import="net.sf.basedb.util.ShareableUtil"
61  import="net.sf.basedb.util.units.UnitUtil"
62  import="net.sf.basedb.clients.web.Base"
63  import="net.sf.basedb.clients.web.ModeInfo"
64  import="net.sf.basedb.clients.web.PermissionUtil"
65  import="net.sf.basedb.clients.web.util.HTML"
66  import="net.sf.basedb.util.Values"
67  import="net.sf.basedb.util.formatter.Formatter"
68  import="net.sf.basedb.util.formatter.WellCoordinateFormatter"
69  import="net.sf.basedb.clients.web.formatter.FormatterFactory"
70  import="net.sf.basedb.clients.web.extensions.ExtensionsControl"
71  import="net.sf.basedb.clients.web.extensions.JspContext"
72  import="net.sf.basedb.clients.web.extensions.renderer.PrefixSuffixRenderer"
73  import="net.sf.basedb.clients.web.extensions.toolbar.ToolbarUtil"
74  import="net.sf.basedb.util.extensions.ExtensionsInvoker"
75  import="java.util.Iterator" 
76  import="java.util.List"
77  import="java.util.Map"
78  import="java.util.Date"
79%>
80<%@ taglib prefix="base" uri="/WEB-INF/base.tld" %>
81<%@ taglib prefix="tbl" uri="/WEB-INF/table.tld" %>
82<%@ taglib prefix="ext" uri="/WEB-INF/extensions.tld" %>
83<%!
84  private static final Item itemType = Item.SAMPLE;
85  private static final GuiContext guiContext = new GuiContext(itemType, GuiContext.Type.LIST);
86%>
87<%
88final SessionControl sc = Base.getExistingSessionControl(pageContext, Permission.DENIED, itemType);
89final String ID = sc.getId();
90final boolean createPermission = sc.hasPermission(Permission.CREATE, itemType);
91final ItemContext cc = Base.getAndSetCurrentContext(sc, itemType, null, null);
92
93final ModeInfo mode = ModeInfo.get(request.getParameter("mode"));
94final String callback = request.getParameter("callback");
95final String title = mode.generateTitle("sample", "samples");
96final DbControl dc = sc.newDbControl();
97ItemResultIterator<Sample> samples = null;
98ItemResultList<AnnotationType> annotationTypes = null;
99try
100{
101  final ItemQuery<AnnotationType> annotationTypeQuery = Base.getAnnotationTypesQuery(itemType);
102  final ItemQuery<ItemSubtype> subtypesQuery = Base.getSubtypesQuery(itemType);
103 
104  // Child extracts
105  final ItemQuery<Extract> extractQuery = Extract.getQuery();
106  extractQuery.include(cc.getInclude());
107  extractQuery.restrict(Restrictions.eq(Hql.property("parent"), Hql.entityParameter("sample", Item.SAMPLE)));
108  extractQuery.order(Orders.asc(Hql.property("name")));
109  final boolean createExtractPermission = sc.hasPermission(Permission.CREATE, Item.EXTRACT);
110
111  // Child samples
112  final ItemQuery<Sample> childSamplesQuery = Sample.getQuery();
113  childSamplesQuery.join(Hql.innerJoin("creationEvent", "ce"));
114  childSamplesQuery.join(Hql.innerJoin("ce", "sources", "src"));
115  childSamplesQuery.restrict(Restrictions.eq(Hql.property("src", "bioMaterial"), Hql.entityParameter("sample", Item.SAMPLE)));
116  childSamplesQuery.order(Orders.asc(Hql.property("name")));
117  childSamplesQuery.include(cc.getInclude());
118 
119  // Parent samples
120  final ItemQuery<Sample> parentSamplesQuery = Sample.getQuery();
121  parentSamplesQuery.join(Hql.innerJoin("childCreationEvents", "cce"));
122  parentSamplesQuery.join(Hql.innerJoin("cce", "event", "evt"));
123  parentSamplesQuery.restrict(Restrictions.eq(Hql.alias("evt"), Hql.entityParameter("creationEvent", Item.BIOMATERIALEVENT)));
124  parentSamplesQuery.order(Orders.asc(Hql.property("name")));
125  parentSamplesQuery.include(cc.getInclude());
126
127  Unit microGram = UnitUtil.getUnit(dc, Quantity.MASS, "µg");
128  Map<Plugin.MainType, Integer> pluginCount = PluginDefinition.countPlugins(dc, guiContext);
129  annotationTypes = annotationTypeQuery.list(dc);
130  try
131  {
132    final ItemQuery<Sample> query = Base.getConfiguredQuery(dc, cc, true, Sample.getQuery(), mode);
133    samples = query.iterate(dc);
134  }
135  catch (Throwable t)
136  {
137    cc.setMessage(t.getMessage());
138    t.printStackTrace();
139  }
140  int numListed = 0;
141  Formatter<Date> dateFormatter = FormatterFactory.getDateFormatter(sc);
142  WellCoordinateFormatter rowFormatter = new WellCoordinateFormatter(true);
143  WellCoordinateFormatter columnFormatter = new WellCoordinateFormatter(false);
144 
145  Enumeration<String, String> wellRows = new Enumeration<String, String>();
146  ItemQuery<PlateGeometry> geometryQuery = PlateGeometry.getQuery(); 
147  geometryQuery.order(Orders.desc(Hql.property("rows")));
148  ItemResultIterator<PlateGeometry> result = geometryQuery.iterate(dc);
149  int maxRows = result.next().getRows();
150  for (int r = 0; r < maxRows; r++)
151  {
152    wellRows.add(Integer.toString(r), rowFormatter.format(r));
153  }
154  JspContext jspContext = ExtensionsControl.createContext(dc, pageContext, guiContext, null);
155  ExtensionsInvoker invoker = ToolbarUtil.useExtensions(jspContext);
156  %>
157  <base:page title="<%=title==null ? "Samples" : title%>" type="<%=mode.getPageType()%>">
158  <base:head scripts="menu.js,table.js" styles="menu.css,table.css">
159    <ext:scripts context="<%=jspContext%>" />
160    <ext:stylesheets context="<%=jspContext%>" />
161    <script language="JavaScript">
162    var submitPage = 'index.jsp';
163    var formId = 'samples';
164    function newItem()
165    {
166      Main.viewOrEditItem('<%=ID%>', '<%=itemType.name()%>', 0, true);
167    }
168    function newPooledItem()
169    {
170      Table.poolItems(submitPage, '<%=ID%>', formId, '<%=itemType.name()%>', 'NewPooledItem');
171    }
172    function editItem(itemId)
173    {
174      Main.viewOrEditItem('<%=ID%>', '<%=itemType.name()%>', itemId, true);
175    }
176    function viewItem(itemId)
177    {
178      Main.viewOrEditItem('<%=ID%>', '<%=itemType.name()%>', itemId, false);
179    }
180    function itemOnClick(evt, itemId)
181    {
182      Table.itemOnClick(formId, evt, itemId, '<%=mode.getName()%>', viewItem, editItem, returnSelected);
183    }
184    function newSample(sampleId)
185    {
186      Main.viewOrEditItem('<%=ID%>', 'SAMPLE', 0, true, '&sample_id='+sampleId);
187    }
188    function newExtract(sampleId)
189    {
190      Main.viewOrEditItem('<%=ID%>', 'EXTRACT', 0, true, '&sample_id='+sampleId);
191    }
192    function deleteItems()
193    {
194      var frm = document.forms[formId];
195      if (Forms.numChecked(frm) == 0)
196      {
197        alert('Please select at least one item in the list');
198        return;
199      }
200      frm.action = submitPage;
201      frm.cmd.value = 'DeleteItems';
202      frm.submit();
203    }
204    function restoreItems()
205    {
206      var frm = document.forms[formId];
207      if (Forms.numChecked(frm) == 0)
208      {
209        alert('Please select at least one item in the list');
210        return;
211      }
212      frm.action = submitPage;
213      frm.cmd.value = 'RestoreItems';
214      frm.submit();
215    }
216    function deleteItemPermanently(itemId)
217    {
218      Main.deleteItemPermanently('<%=ID%>', true, '<%=itemType.name()%>', itemId);
219    }
220    function setOwner()
221    {
222      Table.setOwnerOfItems(submitPage, '<%=ID%>', formId, '<%=itemType.name()%>', 'SetOwnerOfItems');
223    }
224    function shareItem(itemId)
225    {
226      Main.openPopup('index.jsp?ID=<%=ID%>&cmd=ShareItem&item_id='+itemId, 'ShareSamples', 600, 400);
227    }
228    function shareItems()
229    {
230      Table.shareItems(submitPage, '<%=ID%>', formId, '<%=itemType.name()%>', 'ShareItems');
231    }
232    function configureColumns()
233    {
234      Table.configureColumns('<%=ID%>', formId, '<%=itemType.name()%>', '<%=(String)cc.getObject("defaultColumns")%>');
235    }
236    function runPlugin(cmd)
237    {
238      Table.submitToPopup(formId, cmd, 740, 540);
239    }
240    function returnSelected()
241    {
242      Table.returnSelected(formId, <%=callback != null ? "window.opener."+callback : "null" %>);
243      window.close();
244    }
245    function presetOnChange()
246    {
247      Table.presetOnChange('<%=ID%>', formId, '<%=itemType.name()%>', '<%=(String)cc.getObject("defaultColumns")%>');
248    }
249    function newBioMaterialList()
250    {
251      var controller = Main.getController('BIOMATERIALLIST');
252      Table.submitToPopup(formId, 'CreateBioMaterialList', controller.width, controller.height);
253    }
254    function placeOnPlate()
255    {
256      Table.submitToPopup(formId, 'PlaceOnPlate', 900, 600);
257    }
258    </script>
259  </base:head>
260 
261  <base:body>
262    <%
263    if (cc.getMessage() != null)
264    {
265      %>
266      <div class="error"><%=cc.getMessage()%></div>
267      <%
268      cc.setMessage(null);
269    }
270    %>
271    <tbl:table 
272      id="samples" 
273      clazz="itemlist" 
274      columns="<%=cc.getSetting("columns")%>"
275      sortby="<%=cc.getSortProperty()%>" 
276      direction="<%=cc.getSortDirection()%>"
277      title="<%=title%>"
278      action="index.jsp"
279      sc="<%=sc%>"
280      item="<%=itemType%>"
281      >
282      <tbl:hidden 
283        name="mode" 
284        value="<%=mode.getName()%>" 
285      />
286      <tbl:hidden 
287        name="callback" 
288        value="<%=callback%>" 
289        skip="<%=callback == null%>" 
290      />
291      <tbl:columndef 
292        id="name"
293        property="name"
294        datatype="string"
295        title="Name"
296        sortable="true" 
297        filterable="true"
298        exportable="true"
299        show="always" 
300      />
301      <tbl:columndef 
302        id="itemSubtype"
303        property="itemSubtype"
304        sortproperty="itemSubtype.name"
305        exportproperty="itemSubtype.name:string"
306        datatype="int"
307        enumeration="<%=Enumeration.fromItems(subtypesQuery.list(dc), "-none-")%>"
308        title="Type"
309        sortable="true" 
310        filterable="true"
311        exportable="true"
312      />
313      <tbl:columndef 
314        id="id"
315        clazz="uniquecol"
316        property="id"
317        datatype="int"
318        title="ID"
319        sortable="true" 
320        filterable="true"
321        exportable="true" 
322      />
323      <tbl:columndef 
324        id="externalId"
325        property="externalId"
326        datatype="string"
327        title="External id"
328        sortable="true" 
329        filterable="true"
330        exportable="true"
331      />     
332      <tbl:columndef 
333        id="originalQuantity"
334        property="originalQuantity"
335        datatype="float"
336        title="Original quantity (µg)"
337        sortable="true" 
338        filterable="true"
339        exportable="true"
340        unit="<%=microGram%>"
341      />
342      <tbl:columndef 
343        id="remainingQuantity"
344        property="remainingQuantity"
345        datatype="float"
346        title="Remaining quantity (µg)"
347        sortable="true" 
348        filterable="true"
349        exportable="true"
350        unit="<%=microGram%>"
351      />
352      <tbl:columndef 
353        id="protocol"
354        property="creationEvent.protocol"
355        sortproperty="creationEvent.protocol.name"
356        filterproperty="creationEvent.protocol.name"
357        exportproperty="creationEvent.protocol.name"
358        datatype="string"
359        title="Protocol"
360        sortable="true" 
361        filterable="true"
362        exportable="true"
363      />
364      <tbl:columndef 
365        id="eventDate"
366        property="creationEvent.eventDate"
367        datatype="date"
368        title="Created"
369        sortable="true" 
370        filterable="true"
371        exportable="true"
372        formatter="<%=dateFormatter%>"
373      />
374      <tbl:columndef 
375        id="entryDate"
376        property="creationEvent.entryDate"
377        datatype="date"
378        title="Registered"
379        sortable="true" 
380        filterable="true"
381        exportable="true"
382        formatter="<%=dateFormatter%>"
383      />
384      <%
385      Enumeration<String, String> parentTypes = new Enumeration<String, String>();
386      parentTypes.add("", "-none-");
387      parentTypes.add(Integer.toString(Item.BIOSOURCE.getValue()), Item.BIOSOURCE.toString());
388      parentTypes.add(Integer.toString(Item.SAMPLE.getValue()), Item.SAMPLE.toString());
389      %>
390      <tbl:columndef
391        id="parentType"
392        title="Parent type"
393        property="parentType"
394        enumeration="<%=parentTypes%>"
395        datatype="int"
396        filterable="true"
397        exportable="true"
398        sortable="true"
399      />
400      <tbl:columndef
401        id="parents"
402        title="Parent items"
403        property="&creationEvent.sources(bioMaterial.name)"
404        sortproperty="parent.name"
405        datatype="string"
406        filterable="true"
407        exportable="true"
408        sortable="true"
409      />
410      <tbl:columndef
411        id="children"
412        title="Child samples"
413        property="&childCreationEvents(event.bioMaterial.name)"
414        datatype="string"
415        filterable="true"
416        exportable="true"
417      />
418      <tbl:columndef
419        id="extracts"
420        title="Extracts"
421        property="&children(name)"
422        datatype="string"
423        filterable="true"
424        exportable="true"
425      />
426      <tbl:columndef 
427        id="bioPlate"
428        property="bioWell.bioPlate.name"
429        sortproperty="bioWell.bioPlate.name"
430        filterproperty="bioWell.bioPlate.name"
431        exportproperty="bioWell.bioPlate.name"
432        datatype="string"
433        title="Bioplate"
434        sortable="true" 
435        filterable="true"
436        exportable="true"
437      />
438      <tbl:columndef 
439        id="bioWellRow"
440        property="bioWell.row"
441        sortproperty="bioWell.row"
442        datatype="int"
443        title="Biowell row" 
444        filterable="true"
445        enumeration="<%=wellRows%>"
446        exportable="true"
447        sortable="true"
448        formatter="<%=rowFormatter%>"
449      />
450      <tbl:columndef 
451        id="bioWellColumn"
452        property="bioWell.column"
453        sortproperty="bioWell.column"
454        datatype="int"
455        title="Biowell column"   
456        filterable="true"
457        exportable="true"
458        sortable="true"
459        formatter="<%=columnFormatter%>"
460      />     
461      <tbl:columndef 
462        id="owner"
463        property="owner.name"
464        datatype="string"
465        title="Owner"
466        sortable="true" 
467        filterable="true"
468        exportable="true"
469      />
470      <tbl:columndef 
471        id="description"
472        property="description"
473        datatype="string"
474        title="Description" 
475        sortable="true" 
476        filterable="true" 
477        exportable="true"
478      />     
479      <tbl:columndef
480        id="bioMaterialList"
481        property="@bioMaterialLists"
482        datatype="int"
483        title="Biomaterial list"
484        filterable="true"
485        enumeration="<%=Base.getBioMaterialListsEnum(dc, itemType, cc.getInclude())%>"
486        multiple="false"
487      />
488      <%
489      for (AnnotationType at : annotationTypes)
490      {
491        Enumeration<String, String> annotationEnum = null;
492        Formatter formatter = FormatterFactory.getTypeFormatter(sc, at.getValueType());
493        if (at.isEnumeration())
494        {
495          annotationEnum = new Enumeration<String, String>();
496          List<?> values = at.getValues();
497          for (Object value : values)
498          {
499            String encoded = formatter.format(value);
500            annotationEnum.add(encoded, encoded);
501          }
502        }
503        %>
504        <tbl:columndef 
505          id="<%="at"+at.getId()%>"
506          title="<%=HTML.encodeTags(at.getName())+" [A]"%>" 
507          property="<%="#"+at.getId()%>"
508          annotation="true"
509          datatype="<%=at.getValueType().getStringValue()%>"
510          enumeration="<%=annotationEnum%>"
511          sortable="false" 
512          filterable="true" 
513          exportable="true"
514          formatter="<%=formatter%>"
515          unit="<%=at.getDefaultUnit()%>"
516        />
517        <%
518      }
519      %>
520      <tbl:columndef
521        id="permission"
522        title="Permission"
523      />
524      <tbl:columndef
525        id="sharedTo"
526        title="Shared to"
527        filterable="true"
528        filterproperty="!sharedTo.name"
529        datatype="string"
530      />
531      <tbl:toolbar
532        visible="<%=mode.hasToolbar()%>"
533        >
534        <tbl:button 
535          disabled="<%=createPermission ? false : true%>" 
536          image="<%=createPermission ? "new.gif" : "new_disabled.gif"%>" 
537          onclick="newItem()" 
538          title="New&hellip;" 
539          tooltip="<%=createPermission ? "Create new sample" : "You do not have permission to create samples"%>" 
540        />
541        <tbl:button 
542          disabled="<%=createPermission ? false : true%>" 
543          image="<%=createPermission ? "new_pooled.gif" : "new_pooled_disabled.gif"%>" 
544          onclick="newPooledItem()" 
545          title="Pool&hellip;" 
546          tooltip="<%=createPermission ? "Create new pooled sample" : "You do not have permission to create samples"%>" 
547        />
548        <tbl:button 
549          image="delete.gif"
550          onclick="deleteItems()" 
551          title="Delete" 
552          tooltip="Delete the selected items" 
553        />
554        <tbl:button 
555          image="restore.gif"
556          onclick="restoreItems()" 
557          title="Restore" 
558          tooltip="Restore the selected (deleted) items"
559        />
560        <tbl:button 
561          image="share.gif"
562          onclick="shareItems()" 
563          title="Share&hellip;" 
564          tooltip="Share the selected items"
565        />
566        <tbl:button 
567          image="take_ownership.png"
568          onclick="setOwner()" 
569          title="Set owner&hellip;"
570          tooltip="Change owner of the selected items"
571        />
572        <tbl:button 
573          image="columns.gif" 
574          onclick="configureColumns()" 
575          title="Columns&hellip;" 
576          tooltip="Show, hide and re-order columns" 
577        />
578        <tbl:button
579          image="add.png"
580          onclick="newBioMaterialList()"
581          title="New biomaterial list&hellip;"
582          tooltip="Create a new biomaterial list from matching samples"
583          visible="<%=sc.hasPermission(Permission.CREATE, Item.BIOMATERIALLIST)%>"
584        />
585        <tbl:button 
586          image="place_on_plate.png" 
587          onclick="placeOnPlate()" 
588          title="Place on plate&hellip;" 
589          tooltip="Place the selected/matching samples on a bioplate" 
590        />
591        <tbl:button 
592          image="import.gif" 
593          onclick="runPlugin('ImportItems')" 
594          title="Import&hellip;" 
595          tooltip="Import data" 
596          visible="<%=pluginCount.containsKey(Plugin.MainType.IMPORT)%>"
597        />
598        <tbl:button 
599          image="export.gif" 
600          onclick="runPlugin('ExportItems')" 
601          title="Export&hellip;" 
602          tooltip="Export data" 
603          visible="<%=pluginCount.containsKey(Plugin.MainType.EXPORT)%>"
604        />
605        <tbl:button 
606          image="runplugin.gif" 
607          onclick="runPlugin('RunListPlugin')" 
608          title="Run plugin&hellip;" 
609          tooltip="Run a plugin" 
610          visible="<%=pluginCount.containsKey(Plugin.MainType.OTHER)%>"
611        />
612        <ext:render extensions="<%=invoker%>" context="<%=jspContext%>" 
613          wrapper="<%=new PrefixSuffixRenderer(jspContext, "<td>", "</td>") %>"/>
614      </tbl:toolbar>
615      <tbl:navigator
616        page="<%=cc.getPage()%>" 
617        rowsperpage="<%=cc.getRowsPerPage()%>" 
618        totalrows="<%=samples == null ? 0 : samples.getTotalCount()%>" 
619        visible="<%=mode.hasNavigator()%>"
620      />
621      <tbl:data>
622        <tbl:columns>
623        <tbl:presetselector 
624          clazz="columnheader"
625          colspan="3"
626          onchange="presetOnChange()"
627        />
628        </tbl:columns>
629
630        <tr>
631          <tbl:header 
632            clazz="index"
633            >&nbsp;</tbl:header>
634          <tbl:header 
635            clazz="check" 
636            visible="<%=mode.hasCheck()%>"
637            ><base:icon 
638              image="check_uncheck.gif" 
639              tooltip="Check/uncheck all" 
640              onclick="Forms.checkUncheck(document.forms[formId])" style="align: left;"
641            /></tbl:header>
642          <tbl:header 
643            clazz="check" 
644            visible="<%=mode.hasRadio()%>"
645            >&nbsp;</tbl:header>
646          <tbl:header 
647            clazz="icons" 
648            visible="<%=mode.hasIcons()%>"
649            >&nbsp;</tbl:header>
650          <tbl:propertyfilter />
651        </tr>
652         
653          <tbl:rows>
654          <%
655          int index = cc.getPage()*cc.getRowsPerPage();
656          int selectedItemId = cc.getId();
657          if (samples != null)
658          {           
659            while (samples.hasNext())
660            {
661              Sample item = samples.next();
662              Item parentType = item.getParentType();
663              BioMaterialEvent creationEvent = item.getCreationEvent();
664              int itemId = item.getId();
665              boolean usePermission = item.hasPermission(Permission.USE);
666              String openSharePopup = "shareItem("+itemId+")";
667              String deletePermanently = "deleteItemPermanently("+itemId+")";
668              boolean deletePermission = item.hasPermission(Permission.DELETE);
669              boolean sharePermission = item.hasPermission(Permission.SET_PERMISSION);
670              boolean writePermission = item.hasPermission(Permission.WRITE);
671              String tooltip = mode.isSelectionMode() ?
672                  "Select this item" : "View this item" + (writePermission ? " (use CTRL, ALT or SHIFT to edit)" : "");
673              String name = HTML.encodeTags(item.getName());
674              index++;
675              numListed++;
676              %>
677              <tbl:row>
678                <tbl:header 
679                  clazz="index"
680                  ><%=index%></tbl:header>
681                <tbl:header 
682                  clazz="check" 
683                  visible="<%=mode.hasCheck()%>"
684                  ><input 
685                    type="checkbox" 
686                    name="<%=itemId%>" 
687                    value="<%=itemId%>" 
688                    title="<%=name%>" 
689                    <%=cc.getSelected().contains(itemId) ? "checked" : ""%> 
690                  ></tbl:header>
691                <tbl:header 
692                  clazz="check" 
693                  visible="<%=mode.hasRadio()%>"
694                  ><input 
695                    type="radio" 
696                    name="item_id" 
697                    value="<%=itemId%>" 
698                    title="<%=name%>" 
699                    <%=selectedItemId == itemId ? "checked" : ""%>
700                  ></tbl:header>
701                <tbl:header 
702                  clazz="icons" 
703                  visible="<%=mode.hasIcons()%>"
704                  ><base:icon 
705                    image="<%=deletePermission ? "deleted.gif" : "deleted_disabled.gif"%>"
706                    onclick="<%=deletePermission ? deletePermanently : null%>"
707                    tooltip="This item has been scheduled for deletion" 
708                    visible="<%=item.isRemoved()%>"
709                  /><base:icon 
710                    image="<%=sharePermission ? "shared.gif" : "shared_disabled.gif"%>" 
711                    onclick="<%=sharePermission ? openSharePopup : null%>"
712                    tooltip="This item is shared to other users, groups and/or projects" 
713                    visible="<%=item.isShared()%>"
714                  />&nbsp;</tbl:header>
715                <tbl:cell column="name"><div class="link" 
716                  onclick="itemOnClick(<%=writePermission ? "event" : null%>, <%=itemId%>)"
717                  title="<%=tooltip%>"><%=name%></div></tbl:cell>
718                <tbl:cell column="id"><%=item.getId()%></tbl:cell>
719                <tbl:cell column="itemSubtype"><base:propertyvalue 
720                    item="<%=item%>" 
721                    property="itemSubtype"
722                    enableEditLink="<%=mode.hasEditLink()%>" 
723                    enablePropertyLink="<%=mode.hasPropertyLink()%>"
724                  /></tbl:cell>
725                <tbl:cell column="externalId"><%=HTML.encodeTags(item.getExternalId())%></tbl:cell>               
726                <tbl:cell column="originalQuantity"><%=Values.formatNumber(item.getOriginalQuantity(), 2)%></tbl:cell>
727                <tbl:cell column="remainingQuantity"><%=Values.formatNumber(item.getRemainingQuantity(), 2)%></tbl:cell>
728                <tbl:cell column="protocol"
729                  ><base:propertyvalue 
730                    item="<%=creationEvent%>" 
731                    property="protocol"
732                    enableEditLink="<%=mode.hasEditLink()%>" 
733                    enablePropertyLink="<%=mode.hasPropertyLink()%>"
734                  /></tbl:cell>
735                <%               
736                BioWell well = null;
737                boolean readBioWell = true;
738                try
739                {
740                  well = item.getBioWell();
741                }
742                catch(PermissionDeniedException e)
743                {
744                  readBioWell = false;
745                }
746                if (!readBioWell)
747                {
748                  %>
749                  <tbl:cell column="bioWellRow"><i>- denied -</i> </tbl:cell>
750                  <tbl:cell column="bioWellColumn"><i>- denied -</i> </tbl:cell>
751                  <tbl:cell column="bioPlate"><i>- denied -</i> </tbl:cell>
752                  <%
753                }
754                else if (well == null)
755                {
756                  %>
757                  <tbl:cell column="bioWellRow"><i>- none -</i> </tbl:cell>
758                  <tbl:cell column="bioWellColumn"><i>- none -</i> </tbl:cell>
759                  <tbl:cell column="bioPlate"><i>- none -</i> </tbl:cell>
760                  <%
761                 
762                }
763                else
764                {               
765                  %>
766                  <tbl:cell column="bioWellRow">
767                    <tbl:cellvalue value="<%=well.getRow()%>"/>
768                  </tbl:cell>
769                  <tbl:cell column="bioWellColumn">
770                    <tbl:cellvalue value="<%=well.getColumn()%>"/>
771                  </tbl:cell>
772                  <tbl:cell column="bioPlate"><%=Base.getLinkedName(ID, well.getPlate(), false, true)%></tbl:cell>
773                  <%
774                }
775                %>
776                <tbl:cell column="eventDate" value="<%=creationEvent.getEventDate()%>" />
777                <tbl:cell column="entryDate" value="<%=creationEvent.getEntryDate()%>" />
778                <tbl:cell column="parentType"><%=parentType == null ? "" : parentType.toString() %></tbl:cell>
779                <tbl:cell column="parents">
780                  <%
781                  if (item.hasSingleParent() || parentType == null)
782                  {
783                    %>
784                    <base:propertyvalue item="<%=item%>" property="parent"/>
785                    <%
786                  }
787                  else
788                  {
789                    String separator = "";
790                    parentSamplesQuery.setEntityParameter("creationEvent", creationEvent);
791                    for (Sample s : parentSamplesQuery.list(dc))
792                    {
793                      out.write(separator);
794                      if (mode.hasPropertyLink())
795                      {
796                        out.write(Base.getLinkedName(ID, s, false, mode.hasEditLink()));
797                      }
798                      else
799                      {
800                        out.write(HTML.encodeTags(s.getName()));
801                      }
802                      separator = ", ";
803                    }
804                  }
805                  %>
806                  <%=parentType != null ? "<span class=\"itemtype\">(" + parentType + ")</span>" : "" %>
807                </tbl:cell>
808                <tbl:cell column="children">
809                  <%
810                  childSamplesQuery.setEntityParameter("sample", item);
811                  String separator = "";
812                  for (Sample s : childSamplesQuery.list(dc))
813                  {
814                    out.write(separator);
815                    if (mode.hasPropertyLink())
816                    {
817                      out.write(Base.getLinkedName(ID, s, false, mode.hasEditLink()));
818                    }
819                    else
820                    {
821                      out.write(HTML.encodeTags(s.getName()));
822                    }
823                    separator = ", ";
824                  }
825                  %>
826                  <base:icon
827                    image="add.png" 
828                    onclick="<%="newSample("+itemId+")"%>" 
829                    tooltip="Create new child sample" 
830                    visible="<%=mode.hasEditLink() && createPermission && usePermission %>"
831                  />
832                </tbl:cell>
833                <tbl:cell column="extracts">
834                  <%
835                  extractQuery.setEntityParameter("sample", item);
836                  try
837                  {
838                    String separator = "";
839                    for(Extract e : extractQuery.list(dc))
840                    {
841                      out.write(separator);
842                      if (mode.hasPropertyLink())
843                      {
844                        out.write(Base.getLinkedName(ID, e, false, mode.hasEditLink()));
845                      }
846                      else
847                      {
848                        out.write(HTML.encodeTags(e.getName()));
849                      }
850                      separator = ", ";
851                    }
852                  }
853                  catch (Throwable t)
854                  {
855                    %>
856                    <div class="error"><%=t.getMessage()%></div>
857                    <%
858                  }
859                  %>
860                  <base:icon
861                    image="add.png" 
862                    onclick="<%="newExtract("+itemId+")"%>" 
863                    tooltip="Create new extract" 
864                    visible="<%=mode.hasEditLink() && createExtractPermission && usePermission %>"
865                  />
866                </tbl:cell>
867                <tbl:cell column="owner"
868                  ><base:propertyvalue 
869                    item="<%=item%>" 
870                    property="owner"
871                    enableEditLink="<%=mode.hasEditLink()%>" 
872                    enablePropertyLink="<%=mode.hasPropertyLink()%>" 
873                  /></tbl:cell>
874                <tbl:cell column="description"><%=HTML.encodeTags(item.getDescription())%></tbl:cell>               
875                <%
876                AnnotationSet as = item.isAnnotated() ? item.getAnnotationSet() : null;
877                if (as != null)
878                {
879                  for (AnnotationType at : annotationTypes)
880                  {
881                    if (as.hasAnnotation(at))
882                    {
883                      Annotation a = as.getAnnotation(at);
884                      String suffix = a.getUnitSymbol(null);
885                      if (suffix != null) suffix = "&nbsp;" + suffix;
886                      %>
887                      <tbl:cell 
888                        column="<%="at"+at.getId()%>"
889                        ><tbl:cellvalue 
890                          list="<%=a.getValues(null)%>"
891                          suffix="<%=suffix%>"
892                      /></tbl:cell>
893                      <%
894                    }
895                  }
896                }
897                %>
898                <tbl:cell column="permission"><%=PermissionUtil.getShortPermissions(item)%></tbl:cell>
899                <tbl:cell column="sharedTo">
900                  <%
901                  Iterator<Nameable> sharees = ShareableUtil.getSharedTo(dc, item).iterator();
902                  while(sharees.hasNext())
903                  {
904                    Nameable n = sharees.next();
905                    if (mode.hasPropertyLink())
906                    {
907                      out.write(Base.getLinkedName(ID, n, false, mode.hasEditLink()));
908                    }
909                    else
910                    {
911                      out.write(HTML.encodeTags(n.getName()));
912                    }
913                    out.write(sharees.hasNext() ? ", " : "");
914                  }
915                  %>
916                </tbl:cell>
917              </tbl:row>
918              <%
919              }
920            }
921          %>
922          </tbl:rows>
923      </tbl:data>
924      <%
925      if (numListed == 0)
926      {
927        %>
928        <tbl:panel><%=samples == null || samples.getTotalCount() == 0 ? "No samples were found" : "No samples on this page. Please select another page!" %></tbl:panel>
929        <%
930      }
931      else
932      {
933        %>
934        <tbl:navigator
935          page="<%=cc.getPage()%>" 
936          rowsperpage="<%=cc.getRowsPerPage()%>" 
937          totalrows="<%=samples == null ? 0 : samples.getTotalCount()%>" 
938          visible="<%=mode.hasNavigator()%>"
939          locked="true"
940        />
941        <%
942      }
943      %>
944    </tbl:table>
945    <base:buttongroup align="center" clazz="fixedatbottom">
946      <base:button onclick="returnSelected();" title="Ok" visible="<%=mode.hasOkButton()%>" />
947      <base:button onclick="window.close();" title="Cancel" visible="<%=mode.hasCancelButton()%>" />
948      <base:button onclick="window.close();" title="Close" visible="<%=mode.hasCloseButton()%>" />
949    </base:buttongroup>
950    <br><br><br>
951  </base:body>
952  </base:page>
953  <%
954}
955finally
956{
957  if (samples != null) samples.close();
958  if (dc != null) dc.close();
959}
960%>
Note: See TracBrowser for help on using the repository browser.