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

Last change on this file since 6701 was 6701, checked in by Nicklas Nordborg, 7 years ago

References #1912: Add more filter rows in list pages

Implemented on the biomaterial list pages.

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