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

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

References #1655: GUI improvements

Started with the list pages. So far the reporters and the biosurce, sample and extract list pages have been done. The other pages have just been modified to not cause any compilation problems and to display almost ok.

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