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

Last change on this file since 6539 was 6539, checked in by Nicklas Nordborg, 8 years ago

References #1843: Use snapshot manager to load annotations on list pages

Updated the snapshots so that units are also saved in them.

The samples list page has been updated to use the snapshots. The AnnotationLoaderUtil was created to make it easy to use the snapshots in a list context.

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