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