source: branches/3.2-stable/www/biomaterials/samples/list_samples.jsp @ 6251

Last change on this file since 6251 was 6251, checked in by Nicklas Nordborg, 9 years ago

Fixes #1746: The original and remaining quantity values are always displayed with 2 decimals

Needed to fix in a lot more places than I thought. Hope I have found all of them...

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