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

Last change on this file since 5667 was 5667, checked in by Nicklas Nordborg, 11 years ago

References #1153: Handling short read transcript sequence data

Fixes the sample and extract batch importers so that they can import both types of parent items.

Display the 'tag' for an extract in listings and on the view page.

Added 'none' option to parent type filter.

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