source: trunk/www/biomaterials/extracts/list_extracts.jsp @ 6038

Last change on this file since 6038 was 6038, checked in by Nicklas Nordborg, 10 years ago

References #1674: Define extension points for adding columns to table listings

Implemented for all list pages in the Biomaterial LIMS menu.

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