www/biomaterials/samples/list_samples.jsp

Code
Comments
Other
Rev Date Author Line
1872 31 Jan 06 nicklas 1 <%-- $Id$
1872 31 Jan 06 nicklas 2   ------------------------------------------------------------------
4889 06 Apr 09 nicklas 3   Copyright (C) 2006 Jari Häkkinen, Nicklas Nordborg, Martin Svensson
3675 16 Aug 07 jari 4   Copyright (C) 2007 Johan Enell, Martin Svensson
1872 31 Jan 06 nicklas 5
2304 22 May 06 jari 6   This file is part of BASE - BioArray Software Environment.
2304 22 May 06 jari 7   Available at http://base.thep.lu.se/
1872 31 Jan 06 nicklas 8
1872 31 Jan 06 nicklas 9   BASE is free software; you can redistribute it and/or
1872 31 Jan 06 nicklas 10   modify it under the terms of the GNU General Public License
4476 05 Sep 08 jari 11   as published by the Free Software Foundation; either version 3
1872 31 Jan 06 nicklas 12   of the License, or (at your option) any later version.
1872 31 Jan 06 nicklas 13
1872 31 Jan 06 nicklas 14   BASE is distributed in the hope that it will be useful,
1872 31 Jan 06 nicklas 15   but WITHOUT ANY WARRANTY; without even the implied warranty of
1872 31 Jan 06 nicklas 16   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
1872 31 Jan 06 nicklas 17   GNU General Public License for more details.
1872 31 Jan 06 nicklas 18
1872 31 Jan 06 nicklas 19   You should have received a copy of the GNU General Public License
4510 11 Sep 08 jari 20   along with BASE. If not, see <http://www.gnu.org/licenses/>.
1872 31 Jan 06 nicklas 21   ------------------------------------------------------------------
1872 31 Jan 06 nicklas 22
1872 31 Jan 06 nicklas 23   @author Nicklas
1872 31 Jan 06 nicklas 24   @version 2.0
1872 31 Jan 06 nicklas 25 --%>
5426 24 Sep 10 nicklas 26 <%@ page pageEncoding="UTF-8" session="false"
1872 31 Jan 06 nicklas 27   import="net.sf.basedb.core.SessionControl"
1872 31 Jan 06 nicklas 28   import="net.sf.basedb.core.DbControl"
1872 31 Jan 06 nicklas 29   import="net.sf.basedb.core.Item"
1872 31 Jan 06 nicklas 30   import="net.sf.basedb.core.Sample"
2421 22 Jun 06 martin 31   import="net.sf.basedb.core.Extract"
4729 14 Jan 09 martin 32   import="net.sf.basedb.core.BioPlate"
2421 22 Jun 06 martin 33   import="net.sf.basedb.core.BioSource"
1872 31 Jan 06 nicklas 34   import="net.sf.basedb.core.BioMaterialEvent"
4729 14 Jan 09 martin 35   import="net.sf.basedb.core.BioWell"
1872 31 Jan 06 nicklas 36   import="net.sf.basedb.core.AnnotationType"
5645 27 May 11 nicklas 37   import="net.sf.basedb.core.ItemSubtype"
1872 31 Jan 06 nicklas 38   import="net.sf.basedb.core.AnnotationSet"
1872 31 Jan 06 nicklas 39   import="net.sf.basedb.core.ItemQuery"
1872 31 Jan 06 nicklas 40   import="net.sf.basedb.core.Include"
1872 31 Jan 06 nicklas 41   import="net.sf.basedb.core.ItemResultIterator"
1872 31 Jan 06 nicklas 42   import="net.sf.basedb.core.ItemResultList"
1872 31 Jan 06 nicklas 43   import="net.sf.basedb.core.ItemContext"
7813 19 May 20 nicklas 44   import="net.sf.basedb.core.ItemList"
3553 09 Jul 07 martin 45   import="net.sf.basedb.core.Nameable"
1872 31 Jan 06 nicklas 46   import="net.sf.basedb.core.Permission"
2421 22 Jun 06 martin 47   import="net.sf.basedb.core.PermissionDeniedException"
4869 31 Mar 09 martin 48   import="net.sf.basedb.core.PlateGeometry"
1872 31 Jan 06 nicklas 49   import="net.sf.basedb.core.PluginDefinition"
4555 02 Oct 08 nicklas 50   import="net.sf.basedb.core.Annotation"
4555 02 Oct 08 nicklas 51   import="net.sf.basedb.core.Quantity"
4555 02 Oct 08 nicklas 52   import="net.sf.basedb.core.Unit"
1872 31 Jan 06 nicklas 53   import="net.sf.basedb.core.query.Hql"
1872 31 Jan 06 nicklas 54   import="net.sf.basedb.core.query.Restrictions"
1872 31 Jan 06 nicklas 55   import="net.sf.basedb.core.query.Expressions"
2421 22 Jun 06 martin 56   import="net.sf.basedb.core.query.Orders"
1872 31 Jan 06 nicklas 57   import="net.sf.basedb.core.plugin.GuiContext"
1872 31 Jan 06 nicklas 58   import="net.sf.basedb.core.plugin.Plugin"
6539 26 Sep 14 nicklas 59   import="net.sf.basedb.core.snapshot.AnnotationLoaderUtil"
6539 26 Sep 14 nicklas 60   import="net.sf.basedb.core.snapshot.AnnotationTypeFilter"
6539 26 Sep 14 nicklas 61   import="net.sf.basedb.core.snapshot.AnnotationSnapshot"
6539 26 Sep 14 nicklas 62   import="net.sf.basedb.core.snapshot.AnnotationSetSnapshot"
6539 26 Sep 14 nicklas 63   import="net.sf.basedb.core.snapshot.SnapshotManager"
2421 22 Jun 06 martin 64   import="net.sf.basedb.core.Type"
1872 31 Jan 06 nicklas 65   import="net.sf.basedb.util.Enumeration"
3553 09 Jul 07 martin 66   import="net.sf.basedb.util.ShareableUtil"
4555 02 Oct 08 nicklas 67   import="net.sf.basedb.util.units.UnitUtil"
1872 31 Jan 06 nicklas 68   import="net.sf.basedb.clients.web.Base"
1872 31 Jan 06 nicklas 69   import="net.sf.basedb.clients.web.ModeInfo"
2401 21 Jun 06 martin 70   import="net.sf.basedb.clients.web.PermissionUtil"
1872 31 Jan 06 nicklas 71   import="net.sf.basedb.clients.web.util.HTML"
2753 20 Oct 06 nicklas 72   import="net.sf.basedb.util.Values"
2942 22 Nov 06 nicklas 73   import="net.sf.basedb.util.formatter.Formatter"
4869 31 Mar 09 martin 74   import="net.sf.basedb.util.formatter.WellCoordinateFormatter"
7813 19 May 20 nicklas 75   import="net.sf.basedb.util.formatter.NameableFormatter"
7813 19 May 20 nicklas 76   import="net.sf.basedb.clients.web.formatter.LinkedItemFormatter"
2942 22 Nov 06 nicklas 77   import="net.sf.basedb.clients.web.formatter.FormatterFactory"
4882 03 Apr 09 nicklas 78   import="net.sf.basedb.clients.web.extensions.ExtensionsControl"
4882 03 Apr 09 nicklas 79   import="net.sf.basedb.clients.web.extensions.JspContext"
4882 03 Apr 09 nicklas 80   import="net.sf.basedb.clients.web.extensions.renderer.PrefixSuffixRenderer"
7604 25 Feb 19 nicklas 81   import="net.sf.basedb.clients.web.extensions.toolbar.ButtonAction" 
4882 03 Apr 09 nicklas 82   import="net.sf.basedb.clients.web.extensions.toolbar.ToolbarUtil"
7604 25 Feb 19 nicklas 83   import="net.sf.basedb.clients.web.extensions.list.ListColumnAction"
6028 26 Mar 12 nicklas 84   import="net.sf.basedb.clients.web.extensions.list.ListColumnUtil"
7337 12 Apr 17 nicklas 85   import="net.sf.basedb.clients.web.util.ProjectSpecificInfoFilter"
4882 03 Apr 09 nicklas 86   import="net.sf.basedb.util.extensions.ExtensionsInvoker"
3553 09 Jul 07 martin 87   import="java.util.Iterator" 
1872 31 Jan 06 nicklas 88   import="java.util.List"
1872 31 Jan 06 nicklas 89   import="java.util.Map"
2942 22 Nov 06 nicklas 90   import="java.util.Date"
6539 26 Sep 14 nicklas 91   import="java.util.ArrayList"
1872 31 Jan 06 nicklas 92 %>
1872 31 Jan 06 nicklas 93 <%@ taglib prefix="base" uri="/WEB-INF/base.tld" %>
1872 31 Jan 06 nicklas 94 <%@ taglib prefix="tbl" uri="/WEB-INF/table.tld" %>
4882 03 Apr 09 nicklas 95 <%@ taglib prefix="ext" uri="/WEB-INF/extensions.tld" %>
1872 31 Jan 06 nicklas 96 <%!
1872 31 Jan 06 nicklas 97   private static final Item itemType = Item.SAMPLE;
1872 31 Jan 06 nicklas 98   private static final GuiContext guiContext = new GuiContext(itemType, GuiContext.Type.LIST);
1872 31 Jan 06 nicklas 99 %>
1872 31 Jan 06 nicklas 100 <%
1872 31 Jan 06 nicklas 101 final SessionControl sc = Base.getExistingSessionControl(pageContext, Permission.DENIED, itemType);
1872 31 Jan 06 nicklas 102 final String ID = sc.getId();
1872 31 Jan 06 nicklas 103 final boolean createPermission = sc.hasPermission(Permission.CREATE, itemType);
1872 31 Jan 06 nicklas 104 final ItemContext cc = Base.getAndSetCurrentContext(sc, itemType, null, null);
1872 31 Jan 06 nicklas 105
1872 31 Jan 06 nicklas 106 final ModeInfo mode = ModeInfo.get(request.getParameter("mode"));
7813 19 May 20 nicklas 107 final Formatter<Nameable> nameableFormatter = mode.hasPropertyLink() ? new LinkedItemFormatter(mode.hasEditLink()) : new NameableFormatter();
1872 31 Jan 06 nicklas 108 final String callback = request.getParameter("callback");
1872 31 Jan 06 nicklas 109 final String title = mode.generateTitle("sample", "samples");
7954 12 May 21 nicklas 110 final DbControl dc = sc.newDbControl(":List "+itemType);
1872 31 Jan 06 nicklas 111 ItemResultIterator<Sample> samples = null;
6539 26 Sep 14 nicklas 112 List<AnnotationLoaderUtil> annotationLoaders = new ArrayList<AnnotationLoaderUtil>();
1872 31 Jan 06 nicklas 113 try
1872 31 Jan 06 nicklas 114 {
6690 21 Jan 15 nicklas 115   ItemQuery<AnnotationType> annotationTypeQuery = Base.getAnnotationTypesQuery(itemType);
5645 27 May 11 nicklas 116   final ItemQuery<ItemSubtype> subtypesQuery = Base.getSubtypesQuery(itemType);
5664 23 Jun 11 nicklas 117   
5664 23 Jun 11 nicklas 118   // Child extracts
2421 22 Jun 06 martin 119   final ItemQuery<Extract> extractQuery = Extract.getQuery();
2421 22 Jun 06 martin 120   extractQuery.include(cc.getInclude());
5567 10 Feb 11 nicklas 121   extractQuery.restrict(Restrictions.eq(Hql.property("parent"), Hql.entityParameter("sample", Item.SAMPLE)));
2421 22 Jun 06 martin 122   extractQuery.order(Orders.asc(Hql.property("name")));
2421 22 Jun 06 martin 123   final boolean createExtractPermission = sc.hasPermission(Permission.CREATE, Item.EXTRACT);
1872 31 Jan 06 nicklas 124
5664 23 Jun 11 nicklas 125   // Child samples
5567 10 Feb 11 nicklas 126   final ItemQuery<Sample> childSamplesQuery = Sample.getQuery();
5567 10 Feb 11 nicklas 127   childSamplesQuery.join(Hql.innerJoin("creationEvent", "ce"));
5567 10 Feb 11 nicklas 128   childSamplesQuery.join(Hql.innerJoin("ce", "sources", "src"));
5663 22 Jun 11 nicklas 129   childSamplesQuery.restrict(Restrictions.eq(Hql.property("src", "bioMaterial"), Hql.entityParameter("sample", Item.SAMPLE)));
5567 10 Feb 11 nicklas 130   childSamplesQuery.order(Orders.asc(Hql.property("name")));
7813 19 May 20 nicklas 131   childSamplesQuery.setIncludes(cc.getInclude());
5567 10 Feb 11 nicklas 132   
5664 23 Jun 11 nicklas 133   // Parent samples
5567 10 Feb 11 nicklas 134   final ItemQuery<Sample> parentSamplesQuery = Sample.getQuery();
5662 20 Jun 11 nicklas 135   parentSamplesQuery.join(Hql.innerJoin("childCreationEvents", "cce"));
5662 20 Jun 11 nicklas 136   parentSamplesQuery.join(Hql.innerJoin("cce", "event", "evt"));
5567 10 Feb 11 nicklas 137   parentSamplesQuery.restrict(Restrictions.eq(Hql.alias("evt"), Hql.entityParameter("creationEvent", Item.BIOMATERIALEVENT)));
5567 10 Feb 11 nicklas 138   parentSamplesQuery.order(Orders.asc(Hql.property("name")));
7813 19 May 20 nicklas 139   parentSamplesQuery.setIncludes(cc.getInclude());
5567 10 Feb 11 nicklas 140
7813 19 May 20 nicklas 141   // List membership
7813 19 May 20 nicklas 142   final ItemQuery<ItemList> listQuery = ItemList.getQuery();
7813 19 May 20 nicklas 143   listQuery.setIncludes(cc.getInclude());
7813 19 May 20 nicklas 144   listQuery.join(Hql.innerJoin("members", "m"));
7813 19 May 20 nicklas 145   listQuery.restrict(Restrictions.eq(Hql.property("memberType"), Expressions.integer(itemType.getValue())));
7813 19 May 20 nicklas 146   listQuery.restrict(Restrictions.eq(Hql.alias("m"), Expressions.parameter("itemId", Type.INT)));
7813 19 May 20 nicklas 147   listQuery.order(Orders.asc(Hql.property("name")));
7813 19 May 20 nicklas 148   
4888 06 Apr 09 nicklas 149   Unit microGram = UnitUtil.getUnit(dc, Quantity.MASS, "µg");
1872 31 Jan 06 nicklas 150   Map<Plugin.MainType, Integer> pluginCount = PluginDefinition.countPlugins(dc, guiContext);
6539 26 Sep 14 nicklas 151   SnapshotManager manager = new SnapshotManager();
7337 12 Apr 17 nicklas 152   ProjectSpecificInfoFilter psInfo = new ProjectSpecificInfoFilter();
6539 26 Sep 14 nicklas 153   for (AnnotationType at : annotationTypeQuery.list(dc))
6539 26 Sep 14 nicklas 154   {
6539 26 Sep 14 nicklas 155     annotationLoaders.add(new AnnotationLoaderUtil(dc, manager, at));
6539 26 Sep 14 nicklas 156   }
6690 21 Jan 15 nicklas 157   annotationTypeQuery = Base.getInheritedAnnotationColumns(cc.getSetting("columns"));
6690 21 Jan 15 nicklas 158   for (AnnotationType at : annotationTypeQuery.list(dc))
6690 21 Jan 15 nicklas 159   {
6690 21 Jan 15 nicklas 160     annotationLoaders.add(new AnnotationLoaderUtil(dc, manager, at, false, true));
6690 21 Jan 15 nicklas 161   }
7914 23 Feb 21 nicklas 162   JspContext jspContext = ExtensionsControl.createContext(dc, pageContext, guiContext, null);
2029 20 Feb 06 nicklas 163   try
2029 20 Feb 06 nicklas 164   {
7914 23 Feb 21 nicklas 165     final ItemQuery<Sample> query = Base.getConfiguredQuery(dc, cc, jspContext, true, Sample.getQuery(), mode);
2029 20 Feb 06 nicklas 166     samples = query.iterate(dc);
2029 20 Feb 06 nicklas 167   }
2029 20 Feb 06 nicklas 168   catch (Throwable t)
2029 20 Feb 06 nicklas 169   {
2029 20 Feb 06 nicklas 170     cc.setMessage(t.getMessage());
4555 02 Oct 08 nicklas 171     t.printStackTrace();
2029 20 Feb 06 nicklas 172   }
1872 31 Jan 06 nicklas 173   int numListed = 0;
2942 22 Nov 06 nicklas 174   Formatter<Date> dateFormatter = FormatterFactory.getDateFormatter(sc);
6268 11 Apr 13 nicklas 175   Formatter<Number> numericFormatter = FormatterFactory.getNumberFormatter(sc);
4869 31 Mar 09 martin 176   WellCoordinateFormatter rowFormatter = new WellCoordinateFormatter(true);
4869 31 Mar 09 martin 177   WellCoordinateFormatter columnFormatter = new WellCoordinateFormatter(false);
4869 31 Mar 09 martin 178   
4869 31 Mar 09 martin 179   Enumeration<String, String> wellRows = new Enumeration<String, String>();
4869 31 Mar 09 martin 180   ItemQuery<PlateGeometry> geometryQuery = PlateGeometry.getQuery();  
4869 31 Mar 09 martin 181   geometryQuery.order(Orders.desc(Hql.property("rows")));
4869 31 Mar 09 martin 182   ItemResultIterator<PlateGeometry> result = geometryQuery.iterate(dc);
4869 31 Mar 09 martin 183   int maxRows = result.next().getRows();
6497 26 Jun 14 nicklas 184   for (int r = 0; r < maxRows && r < 256; r++)
4869 31 Mar 09 martin 185   {
4869 31 Mar 09 martin 186     wellRows.add(Integer.toString(r), rowFormatter.format(r));
4869 31 Mar 09 martin 187   }
6497 26 Jun 14 nicklas 188   
6497 26 Jun 14 nicklas 189   Enumeration<String, String> wellColumns = new Enumeration<String, String>();
6497 26 Jun 14 nicklas 190   ItemQuery<PlateGeometry> columnsGeometryQuery = PlateGeometry.getQuery();  
6497 26 Jun 14 nicklas 191   columnsGeometryQuery.order(Orders.desc(Hql.property("columns")));
6497 26 Jun 14 nicklas 192   ItemResultIterator<PlateGeometry> columnsResult = columnsGeometryQuery.iterate(dc);
6497 26 Jun 14 nicklas 193   int maxColumns = columnsResult.next().getColumns();
6497 26 Jun 14 nicklas 194   for (int c = 0; c < maxColumns && c < 256; c++)
6497 26 Jun 14 nicklas 195   {
6497 26 Jun 14 nicklas 196     wellColumns.add(Integer.toString(c), columnFormatter.format(c));
6497 26 Jun 14 nicklas 197   }
6497 26 Jun 14 nicklas 198
7604 25 Feb 19 nicklas 199   ExtensionsInvoker<ButtonAction> invoker = ToolbarUtil.useExtensions(jspContext);
7604 25 Feb 19 nicklas 200   ExtensionsInvoker<ListColumnAction<Sample,?>> columnsInvoker = ListColumnUtil.useExtensions(jspContext);
1872 31 Jan 06 nicklas 201   %>
6260 27 Mar 13 nicklas 202   <base:page title="<%=title==null ? "Samples" : title%>" type="<%=mode.getPageType()%>" id="list-page">
6260 27 Mar 13 nicklas 203   <base:head scripts="table.js,~samples.js" styles="table.css,toolbar.css,toolbar.css">
4882 03 Apr 09 nicklas 204     <ext:scripts context="<%=jspContext%>" />
4882 03 Apr 09 nicklas 205     <ext:stylesheets context="<%=jspContext%>" />
1872 31 Jan 06 nicklas 206   </base:head>
1872 31 Jan 06 nicklas 207   
1872 31 Jan 06 nicklas 208   <base:body>
5918 21 Dec 11 nicklas 209     <h1><%=title==null ? "Samples" : title%></h1>
5918 21 Dec 11 nicklas 210     <div class="content">
1872 31 Jan 06 nicklas 211     <tbl:table 
1872 31 Jan 06 nicklas 212       id="samples" 
1872 31 Jan 06 nicklas 213       columns="<%=cc.getSetting("columns")%>"
1872 31 Jan 06 nicklas 214       sortby="<%=cc.getSortProperty()%>" 
1872 31 Jan 06 nicklas 215       direction="<%=cc.getSortDirection()%>"
1872 31 Jan 06 nicklas 216       action="index.jsp"
1872 31 Jan 06 nicklas 217       sc="<%=sc%>"
1872 31 Jan 06 nicklas 218       item="<%=itemType%>"
6701 30 Jan 15 nicklas 219       filterrows="<%=cc.getFilterRows()%>"
5948 08 Feb 12 nicklas 220       subclass="fulltable"
6690 21 Jan 15 nicklas 221       data-inherited-annotations="true"
7842 01 Sep 20 nicklas 222       data-relateditem-columns="true"
7982 14 Jun 21 nicklas 223       stickyheaders="<%=cc.getSetting("columns.sticky", "name")%>"
1872 31 Jan 06 nicklas 224       >
1872 31 Jan 06 nicklas 225       <tbl:hidden 
1872 31 Jan 06 nicklas 226         name="mode" 
1872 31 Jan 06 nicklas 227         value="<%=mode.getName()%>" 
1872 31 Jan 06 nicklas 228       />
1872 31 Jan 06 nicklas 229       <tbl:hidden 
1872 31 Jan 06 nicklas 230         name="callback" 
1872 31 Jan 06 nicklas 231         value="<%=callback%>" 
1872 31 Jan 06 nicklas 232         skip="<%=callback == null%>" 
1872 31 Jan 06 nicklas 233       />
1872 31 Jan 06 nicklas 234       <tbl:columndef 
1872 31 Jan 06 nicklas 235         id="name"
1872 31 Jan 06 nicklas 236         property="name"
1872 31 Jan 06 nicklas 237         datatype="string"
1872 31 Jan 06 nicklas 238         title="Name"
1872 31 Jan 06 nicklas 239         sortable="true" 
1872 31 Jan 06 nicklas 240         filterable="true"
1872 31 Jan 06 nicklas 241         exportable="true"
1872 31 Jan 06 nicklas 242         show="always" 
1872 31 Jan 06 nicklas 243       />
1872 31 Jan 06 nicklas 244       <tbl:columndef 
5645 27 May 11 nicklas 245         id="itemSubtype"
5645 27 May 11 nicklas 246         property="itemSubtype"
5645 27 May 11 nicklas 247         sortproperty="itemSubtype.name"
5666 23 Jun 11 nicklas 248         exportproperty="itemSubtype.name:string"
5645 27 May 11 nicklas 249         datatype="int"
5645 27 May 11 nicklas 250         enumeration="<%=Enumeration.fromItems(subtypesQuery.list(dc), "-none-")%>"
5645 27 May 11 nicklas 251         title="Type"
5645 27 May 11 nicklas 252         sortable="true" 
5645 27 May 11 nicklas 253         filterable="true"
5645 27 May 11 nicklas 254         exportable="true"
5645 27 May 11 nicklas 255       />
5645 27 May 11 nicklas 256       <tbl:columndef 
4331 11 Jun 08 martin 257         id="id"
4387 11 Aug 08 nicklas 258         clazz="uniquecol"
4331 11 Jun 08 martin 259         property="id"
4331 11 Jun 08 martin 260         datatype="int"
4331 11 Jun 08 martin 261         title="ID"
4331 11 Jun 08 martin 262         sortable="true" 
4331 11 Jun 08 martin 263         filterable="true"
4331 11 Jun 08 martin 264         exportable="true" 
4331 11 Jun 08 martin 265       />
4331 11 Jun 08 martin 266       <tbl:columndef 
1872 31 Jan 06 nicklas 267         id="externalId"
1872 31 Jan 06 nicklas 268         property="externalId"
1872 31 Jan 06 nicklas 269         datatype="string"
1872 31 Jan 06 nicklas 270         title="External id"
1872 31 Jan 06 nicklas 271         sortable="true" 
1872 31 Jan 06 nicklas 272         filterable="true"
1872 31 Jan 06 nicklas 273         exportable="true"
2421 22 Jun 06 martin 274       />      
1872 31 Jan 06 nicklas 275       <tbl:columndef 
1872 31 Jan 06 nicklas 276         id="originalQuantity"
1872 31 Jan 06 nicklas 277         property="originalQuantity"
1872 31 Jan 06 nicklas 278         datatype="float"
4888 06 Apr 09 nicklas 279         title="Original quantity (µg)"
1872 31 Jan 06 nicklas 280         sortable="true" 
1872 31 Jan 06 nicklas 281         filterable="true"
1872 31 Jan 06 nicklas 282         exportable="true"
4555 02 Oct 08 nicklas 283         unit="<%=microGram%>"
6268 11 Apr 13 nicklas 284         formatter="<%=numericFormatter%>"
1872 31 Jan 06 nicklas 285       />
1872 31 Jan 06 nicklas 286       <tbl:columndef 
1872 31 Jan 06 nicklas 287         id="remainingQuantity"
1872 31 Jan 06 nicklas 288         property="remainingQuantity"
1872 31 Jan 06 nicklas 289         datatype="float"
4888 06 Apr 09 nicklas 290         title="Remaining quantity (µg)"
1872 31 Jan 06 nicklas 291         sortable="true" 
1872 31 Jan 06 nicklas 292         filterable="true"
1872 31 Jan 06 nicklas 293         exportable="true"
4555 02 Oct 08 nicklas 294         unit="<%=microGram%>"
6268 11 Apr 13 nicklas 295         formatter="<%=numericFormatter%>"
1872 31 Jan 06 nicklas 296       />
1872 31 Jan 06 nicklas 297       <tbl:columndef 
1872 31 Jan 06 nicklas 298         id="protocol"
1872 31 Jan 06 nicklas 299         property="creationEvent.protocol"
1872 31 Jan 06 nicklas 300         sortproperty="creationEvent.protocol.name"
1872 31 Jan 06 nicklas 301         filterproperty="creationEvent.protocol.name"
1872 31 Jan 06 nicklas 302         exportproperty="creationEvent.protocol.name"
1872 31 Jan 06 nicklas 303         datatype="string"
1872 31 Jan 06 nicklas 304         title="Protocol"
1872 31 Jan 06 nicklas 305         sortable="true" 
1872 31 Jan 06 nicklas 306         filterable="true"
1872 31 Jan 06 nicklas 307         exportable="true"
1872 31 Jan 06 nicklas 308       />
1872 31 Jan 06 nicklas 309       <tbl:columndef 
6993 03 Nov 15 nicklas 310         id="kit"
6993 03 Nov 15 nicklas 311         property="creationEvent.kit"
6993 03 Nov 15 nicklas 312         sortproperty="creationEvent.kit.name"
6993 03 Nov 15 nicklas 313         filterproperty="creationEvent.kit.name"
6993 03 Nov 15 nicklas 314         exportproperty="creationEvent.kit.name"
6993 03 Nov 15 nicklas 315         datatype="string"
6993 03 Nov 15 nicklas 316         title="Kit"
6993 03 Nov 15 nicklas 317         sortable="true" 
6993 03 Nov 15 nicklas 318         filterable="true"
6993 03 Nov 15 nicklas 319         exportable="true"
6993 03 Nov 15 nicklas 320       />
6993 03 Nov 15 nicklas 321       <tbl:columndef 
1872 31 Jan 06 nicklas 322         id="eventDate"
1872 31 Jan 06 nicklas 323         property="creationEvent.eventDate"
1872 31 Jan 06 nicklas 324         datatype="date"
1872 31 Jan 06 nicklas 325         title="Created"
1872 31 Jan 06 nicklas 326         sortable="true" 
1872 31 Jan 06 nicklas 327         filterable="true"
1872 31 Jan 06 nicklas 328         exportable="true"
2942 22 Nov 06 nicklas 329         formatter="<%=dateFormatter%>"
1872 31 Jan 06 nicklas 330       />
1872 31 Jan 06 nicklas 331       <tbl:columndef 
1872 31 Jan 06 nicklas 332         id="entryDate"
1872 31 Jan 06 nicklas 333         property="creationEvent.entryDate"
1872 31 Jan 06 nicklas 334         datatype="date"
1872 31 Jan 06 nicklas 335         title="Registered"
1872 31 Jan 06 nicklas 336         sortable="true" 
1872 31 Jan 06 nicklas 337         filterable="true"
1872 31 Jan 06 nicklas 338         exportable="true"
2942 22 Nov 06 nicklas 339         formatter="<%=dateFormatter%>"
1872 31 Jan 06 nicklas 340       />
5664 23 Jun 11 nicklas 341       <%
5664 23 Jun 11 nicklas 342       Enumeration<String, String> parentTypes = new Enumeration<String, String>();
5667 23 Jun 11 nicklas 343       parentTypes.add("", "-none-");
5664 23 Jun 11 nicklas 344       parentTypes.add(Integer.toString(Item.BIOSOURCE.getValue()), Item.BIOSOURCE.toString());
5664 23 Jun 11 nicklas 345       parentTypes.add(Integer.toString(Item.SAMPLE.getValue()), Item.SAMPLE.toString());
5664 23 Jun 11 nicklas 346       %>
2421 22 Jun 06 martin 347       <tbl:columndef
5664 23 Jun 11 nicklas 348         id="parentType"
5664 23 Jun 11 nicklas 349         title="Parent type"
5664 23 Jun 11 nicklas 350         property="parentType"
5664 23 Jun 11 nicklas 351         enumeration="<%=parentTypes%>"
5664 23 Jun 11 nicklas 352         datatype="int"
5664 23 Jun 11 nicklas 353         filterable="true"
5664 23 Jun 11 nicklas 354         exportable="true"
5664 23 Jun 11 nicklas 355         sortable="true"
5664 23 Jun 11 nicklas 356       />
5664 23 Jun 11 nicklas 357       <tbl:columndef
2421 22 Jun 06 martin 358         id="parents"
5663 22 Jun 11 nicklas 359         title="Parent items"
5662 20 Jun 11 nicklas 360         property="&creationEvent.sources(bioMaterial.name)"
5663 22 Jun 11 nicklas 361         sortproperty="parent.name"
4613 29 Oct 08 nicklas 362         datatype="string"
4613 29 Oct 08 nicklas 363         filterable="true"
4901 23 Apr 09 martin 364         exportable="true"
5663 22 Jun 11 nicklas 365         sortable="true"
2421 22 Jun 06 martin 366       />
2421 22 Jun 06 martin 367       <tbl:columndef
5567 10 Feb 11 nicklas 368         id="children"
5567 10 Feb 11 nicklas 369         title="Child samples"
5662 20 Jun 11 nicklas 370         property="&childCreationEvents(event.bioMaterial.name)"
5567 10 Feb 11 nicklas 371         datatype="string"
5567 10 Feb 11 nicklas 372         filterable="true"
5567 10 Feb 11 nicklas 373         exportable="true"
5567 10 Feb 11 nicklas 374       />
5567 10 Feb 11 nicklas 375       <tbl:columndef
2421 22 Jun 06 martin 376         id="extracts"
2421 22 Jun 06 martin 377         title="Extracts"
4613 29 Oct 08 nicklas 378         property="&children(name)"
4613 29 Oct 08 nicklas 379         datatype="string"
4613 29 Oct 08 nicklas 380         filterable="true"
4901 23 Apr 09 martin 381         exportable="true"
4730 15 Jan 09 martin 382       />
4730 15 Jan 09 martin 383       <tbl:columndef 
4730 15 Jan 09 martin 384         id="bioPlate"
4730 15 Jan 09 martin 385         property="bioWell.bioPlate.name"
4730 15 Jan 09 martin 386         sortproperty="bioWell.bioPlate.name"
4730 15 Jan 09 martin 387         filterproperty="bioWell.bioPlate.name"
4730 15 Jan 09 martin 388         exportproperty="bioWell.bioPlate.name"
4730 15 Jan 09 martin 389         datatype="string"
4730 15 Jan 09 martin 390         title="Bioplate"
4730 15 Jan 09 martin 391         sortable="true" 
4730 15 Jan 09 martin 392         filterable="true"
4730 15 Jan 09 martin 393         exportable="true"
4730 15 Jan 09 martin 394       />
4730 15 Jan 09 martin 395       <tbl:columndef 
4734 23 Jan 09 martin 396         id="bioWellRow"
4730 15 Jan 09 martin 397         property="bioWell.row"
4730 15 Jan 09 martin 398         sortproperty="bioWell.row"
4734 23 Jan 09 martin 399         datatype="int"
4734 23 Jan 09 martin 400         title="Biowell row"   
4730 15 Jan 09 martin 401         filterable="true"
4869 31 Mar 09 martin 402         enumeration="<%=wellRows%>"
4730 15 Jan 09 martin 403         exportable="true"
4734 23 Jan 09 martin 404         sortable="true"
4869 31 Mar 09 martin 405         formatter="<%=rowFormatter%>"
4734 23 Jan 09 martin 406       />
4734 23 Jan 09 martin 407       <tbl:columndef 
4734 23 Jan 09 martin 408         id="bioWellColumn"
4734 23 Jan 09 martin 409         property="bioWell.column"
4734 23 Jan 09 martin 410         sortproperty="bioWell.column"
4734 23 Jan 09 martin 411         datatype="int"
4734 23 Jan 09 martin 412         title="Biowell column"   
4734 23 Jan 09 martin 413         filterable="true"
6497 26 Jun 14 nicklas 414         enumeration="<%=wellColumns%>"
4734 23 Jan 09 martin 415         exportable="true"
4734 23 Jan 09 martin 416         sortable="true"
4869 31 Mar 09 martin 417         formatter="<%=columnFormatter%>"
2421 22 Jun 06 martin 418       />      
1872 31 Jan 06 nicklas 419       <tbl:columndef 
1872 31 Jan 06 nicklas 420         id="owner"
1872 31 Jan 06 nicklas 421         property="owner.name"
1872 31 Jan 06 nicklas 422         datatype="string"
1872 31 Jan 06 nicklas 423         title="Owner"
1872 31 Jan 06 nicklas 424         sortable="true" 
1872 31 Jan 06 nicklas 425         filterable="true"
1872 31 Jan 06 nicklas 426         exportable="true"
1872 31 Jan 06 nicklas 427       />
1872 31 Jan 06 nicklas 428       <tbl:columndef 
1872 31 Jan 06 nicklas 429         id="description"
1872 31 Jan 06 nicklas 430         property="description"
1872 31 Jan 06 nicklas 431         datatype="string"
1872 31 Jan 06 nicklas 432         title="Description" 
1872 31 Jan 06 nicklas 433         sortable="true" 
1872 31 Jan 06 nicklas 434         filterable="true" 
1872 31 Jan 06 nicklas 435         exportable="true"
2401 21 Jun 06 martin 436       />      
4728 14 Jan 09 nicklas 437       <tbl:columndef
6749 19 Feb 15 nicklas 438         id="itemList"
6749 19 Feb 15 nicklas 439         property="§itemLists"
6749 19 Feb 15 nicklas 440         datatype="int"
6749 19 Feb 15 nicklas 441         title="Item list"
6749 19 Feb 15 nicklas 442         filterable="true"
6749 19 Feb 15 nicklas 443         enumeration="<%=Base.getItemListsEnum(dc, itemType, cc.getInclude())%>"
6749 19 Feb 15 nicklas 444       />
1872 31 Jan 06 nicklas 445       <%
6539 26 Sep 14 nicklas 446       for (AnnotationLoaderUtil loader : annotationLoaders)
1872 31 Jan 06 nicklas 447       {
6539 26 Sep 14 nicklas 448         AnnotationType at = loader.getAnnotationType();
1872 31 Jan 06 nicklas 449         Enumeration<String, String> annotationEnum = null;
7605 26 Feb 19 nicklas 450         Formatter<Object> formatter = FormatterFactory.getTypeFormatter(sc, at.getValueType());
1872 31 Jan 06 nicklas 451         if (at.isEnumeration())
1872 31 Jan 06 nicklas 452         {
1872 31 Jan 06 nicklas 453           annotationEnum = new Enumeration<String, String>();
6784 18 Mar 15 nicklas 454           if (!at.getDisplayAsList()) annotationEnum.add("", "-none-");
1872 31 Jan 06 nicklas 455           List<?> values = at.getValues();
1872 31 Jan 06 nicklas 456           for (Object value : values)
1872 31 Jan 06 nicklas 457           {
2942 22 Nov 06 nicklas 458             String encoded = formatter.format(value);
1872 31 Jan 06 nicklas 459             annotationEnum.add(encoded, encoded);
1872 31 Jan 06 nicklas 460           }
1872 31 Jan 06 nicklas 461         }
1872 31 Jan 06 nicklas 462         %>
1872 31 Jan 06 nicklas 463         <tbl:columndef 
6690 21 Jan 15 nicklas 464           id="<%=(loader.isSearchingInheritedAnnotations() ? "ia" : "at")+at.getId()%>"
6690 21 Jan 15 nicklas 465           title="<%=HTML.encodeTags(at.getName())+(loader.isSearchingInheritedAnnotations() ? " [I]" : " [A]")%>" 
6690 21 Jan 15 nicklas 466           property="<%=(loader.isSearchingInheritedAnnotations() ? "##" : "#")+at.getId()%>"
1872 31 Jan 06 nicklas 467           annotation="true"
1872 31 Jan 06 nicklas 468           datatype="<%=at.getValueType().getStringValue()%>"
1872 31 Jan 06 nicklas 469           enumeration="<%=annotationEnum%>"
5674 27 Jun 11 nicklas 470           smartenum="<%=at.getDisplayAsList() %>"
6690 21 Jan 15 nicklas 471           sortable="<%=at.getMultiplicity() == 1 && !loader.isSearchingInheritedAnnotations()%>" 
1872 31 Jan 06 nicklas 472           filterable="true" 
1872 31 Jan 06 nicklas 473           exportable="true"
2942 22 Nov 06 nicklas 474           formatter="<%=formatter%>"
4555 02 Oct 08 nicklas 475           unit="<%=at.getDefaultUnit()%>"
1872 31 Jan 06 nicklas 476         />
1872 31 Jan 06 nicklas 477         <%
1872 31 Jan 06 nicklas 478       }
1872 31 Jan 06 nicklas 479       %>
2401 21 Jun 06 martin 480       <tbl:columndef
2401 21 Jun 06 martin 481         id="permission"
2401 21 Jun 06 martin 482         title="Permission"
2401 21 Jun 06 martin 483       />
3553 09 Jul 07 martin 484       <tbl:columndef
3553 09 Jul 07 martin 485         id="sharedTo"
3553 09 Jul 07 martin 486         title="Shared to"
5164 27 Oct 09 nicklas 487         filterable="true"
5164 27 Oct 09 nicklas 488         filterproperty="!sharedTo.name"
5164 27 Oct 09 nicklas 489         datatype="string"
3553 09 Jul 07 martin 490       />
6028 26 Mar 12 nicklas 491       <tbl:columndef 
6028 26 Mar 12 nicklas 492         id="xt-columns" 
6028 26 Mar 12 nicklas 493         extensions="<%=columnsInvoker%>" 
6028 26 Mar 12 nicklas 494         jspcontext="<%=jspContext%>" 
6028 26 Mar 12 nicklas 495       />
6028 26 Mar 12 nicklas 496       
6604 18 Nov 14 nicklas 497       <div class="panelgroup bg-filled-50 bottomborder">
5948 08 Feb 12 nicklas 498         <tbl:toolbar
5954 13 Feb 12 nicklas 499           subclass="bottomborder"
5948 08 Feb 12 nicklas 500           visible="<%=mode.hasToolbar()%>"
5948 08 Feb 12 nicklas 501           >
5948 08 Feb 12 nicklas 502           <tbl:button 
6260 27 Mar 13 nicklas 503             id="btnNewItem"
5948 08 Feb 12 nicklas 504             disabled="<%=!createPermission%>" 
5948 08 Feb 12 nicklas 505             image="new.png" 
5948 08 Feb 12 nicklas 506             title="New&hellip;" 
5948 08 Feb 12 nicklas 507             tooltip="<%=createPermission ? "Create new sample" : "You do not have permission to create samples"%>" 
5948 08 Feb 12 nicklas 508           />
5948 08 Feb 12 nicklas 509           <tbl:button 
6260 27 Mar 13 nicklas 510             id="btnNewPooledItem"
5948 08 Feb 12 nicklas 511             disabled="<%=!createPermission%>" 
5948 08 Feb 12 nicklas 512             image="new_pooled.png" 
5948 08 Feb 12 nicklas 513             title="Pool&hellip;" 
5948 08 Feb 12 nicklas 514             tooltip="<%=createPermission ? "Create new pooled sample" : "You do not have permission to create samples"%>" 
5948 08 Feb 12 nicklas 515           />
5948 08 Feb 12 nicklas 516           <tbl:button 
6260 27 Mar 13 nicklas 517             id="btnDeleteItems"
5948 08 Feb 12 nicklas 518             image="delete.png"
5948 08 Feb 12 nicklas 519             title="Delete" 
5948 08 Feb 12 nicklas 520             tooltip="Delete the selected items" 
5948 08 Feb 12 nicklas 521           />
5948 08 Feb 12 nicklas 522           <tbl:button 
6260 27 Mar 13 nicklas 523             id="btnRestoreItems"
5948 08 Feb 12 nicklas 524             image="restore.png"
5948 08 Feb 12 nicklas 525             title="Restore" 
5948 08 Feb 12 nicklas 526             tooltip="Restore the selected (deleted) items"
5948 08 Feb 12 nicklas 527           />
5948 08 Feb 12 nicklas 528           <tbl:button 
6260 27 Mar 13 nicklas 529             id="btnShareItems"
5948 08 Feb 12 nicklas 530             image="share.png"
5948 08 Feb 12 nicklas 531             title="Share&hellip;" 
5948 08 Feb 12 nicklas 532             tooltip="Share the selected items"
5948 08 Feb 12 nicklas 533           />
5948 08 Feb 12 nicklas 534           <tbl:button 
6260 27 Mar 13 nicklas 535             id="btnSetOwner"
5948 08 Feb 12 nicklas 536             image="take_ownership.png"
5948 08 Feb 12 nicklas 537             title="Set owner&hellip;"
5948 08 Feb 12 nicklas 538             tooltip="Change owner of the selected items"
5948 08 Feb 12 nicklas 539           />
5948 08 Feb 12 nicklas 540           <tbl:button 
6260 27 Mar 13 nicklas 541             id="btnColumns"
5948 08 Feb 12 nicklas 542             image="columns.png" 
5948 08 Feb 12 nicklas 543             title="Columns&hellip;" 
5948 08 Feb 12 nicklas 544             tooltip="Show, hide and re-order columns" 
5948 08 Feb 12 nicklas 545           />
5948 08 Feb 12 nicklas 546           <tbl:button
6750 19 Feb 15 nicklas 547             id="btnNewItemList"
6750 19 Feb 15 nicklas 548             image="add.png"
6750 19 Feb 15 nicklas 549             title="New item list&hellip;"
6750 19 Feb 15 nicklas 550             tooltip="Create a new item list from matching samples"
6750 19 Feb 15 nicklas 551             visible="<%=sc.hasPermission(Permission.CREATE, Item.ITEMLIST)%>"
6750 19 Feb 15 nicklas 552           />
7813 19 May 20 nicklas 553           <tbl:button
7813 19 May 20 nicklas 554             id="btnAddToItemList"
7813 19 May 20 nicklas 555             image="add.png"
7813 19 May 20 nicklas 556             title="Add to item list&hellip;"
7813 19 May 20 nicklas 557             tooltip="Add samples to an existing item list"
7813 19 May 20 nicklas 558           />
5948 08 Feb 12 nicklas 559           <tbl:button 
6260 27 Mar 13 nicklas 560             id="btnPlaceOnPlate"
5948 08 Feb 12 nicklas 561             image="place_on_plate.png" 
5948 08 Feb 12 nicklas 562             title="Place on plate&hellip;" 
5948 08 Feb 12 nicklas 563             tooltip="Place the selected/matching samples on a bioplate" 
5948 08 Feb 12 nicklas 564           />
6695 28 Jan 15 nicklas 565           <tbl:button
6695 28 Jan 15 nicklas 566             id="btnInheritAnnotations"
6695 28 Jan 15 nicklas 567             image="inherit.png"
6695 28 Jan 15 nicklas 568             title="Inherit annotations&hellip;"
6695 28 Jan 15 nicklas 569             tooltip="Batch inherit annotations from parent items"
6695 28 Jan 15 nicklas 570           />
5948 08 Feb 12 nicklas 571           <tbl:button 
6260 27 Mar 13 nicklas 572             id="btnImport"
6260 27 Mar 13 nicklas 573             data-plugin-type="IMPORT"
5948 08 Feb 12 nicklas 574             image="import.png" 
5948 08 Feb 12 nicklas 575             title="Import&hellip;" 
5948 08 Feb 12 nicklas 576             tooltip="Import data" 
5948 08 Feb 12 nicklas 577             visible="<%=pluginCount.containsKey(Plugin.MainType.IMPORT)%>"
5948 08 Feb 12 nicklas 578           />
5948 08 Feb 12 nicklas 579           <tbl:button 
6260 27 Mar 13 nicklas 580             id="btnExport"
6260 27 Mar 13 nicklas 581             data-plugin-type="EXPORT"
5948 08 Feb 12 nicklas 582             image="export.png" 
5948 08 Feb 12 nicklas 583             title="Export&hellip;" 
5948 08 Feb 12 nicklas 584             tooltip="Export data" 
5948 08 Feb 12 nicklas 585             visible="<%=pluginCount.containsKey(Plugin.MainType.EXPORT)%>"
5948 08 Feb 12 nicklas 586           />
5948 08 Feb 12 nicklas 587           <tbl:button 
6260 27 Mar 13 nicklas 588             id="btnRunPlugin"
6260 27 Mar 13 nicklas 589             data-plugin-type="OTHER"
5948 08 Feb 12 nicklas 590             image="runplugin.png" 
5948 08 Feb 12 nicklas 591             title="Run plugin&hellip;" 
5948 08 Feb 12 nicklas 592             tooltip="Run a plugin" 
5948 08 Feb 12 nicklas 593             visible="<%=pluginCount.containsKey(Plugin.MainType.OTHER)%>"
5948 08 Feb 12 nicklas 594           />
5948 08 Feb 12 nicklas 595           <ext:render extensions="<%=invoker%>" context="<%=jspContext%>" 
7604 25 Feb 19 nicklas 596             wrapper="<%=new PrefixSuffixRenderer<ButtonAction>(jspContext, "<td>", "</td>") %>"/>
5948 08 Feb 12 nicklas 597         </tbl:toolbar>
5948 08 Feb 12 nicklas 598         <tbl:panel>
6182 23 Oct 12 nicklas 599           <tbl:presetselector />
5948 08 Feb 12 nicklas 600           <tbl:navigator
5948 08 Feb 12 nicklas 601             page="<%=cc.getPage()%>" 
5948 08 Feb 12 nicklas 602             rowsperpage="<%=cc.getRowsPerPage()%>" 
5948 08 Feb 12 nicklas 603             totalrows="<%=samples == null ? 0 : samples.getTotalCount()%>" 
5948 08 Feb 12 nicklas 604             visible="<%=mode.hasNavigator()%>"
5948 08 Feb 12 nicklas 605           />
5948 08 Feb 12 nicklas 606         </tbl:panel>
5948 08 Feb 12 nicklas 607       </div>
1872 31 Jan 06 nicklas 608       <tbl:data>
5948 08 Feb 12 nicklas 609         <tbl:headers>
5948 08 Feb 12 nicklas 610           <tbl:headerrow>
7943 04 May 21 nicklas 611             <tbl:header clazz="row-index bg-filled-100" />
5948 08 Feb 12 nicklas 612             <tbl:columnheaders />
5948 08 Feb 12 nicklas 613           </tbl:headerrow>
6701 30 Jan 15 nicklas 614           <%
6701 30 Jan 15 nicklas 615           int numFilters = cc.getNumPropertyFilters();
6701 30 Jan 15 nicklas 616           int numRows = cc.getFilterRows();
6701 30 Jan 15 nicklas 617           for (int filterNo = 0; filterNo < numRows; filterNo++)
6701 30 Jan 15 nicklas 618           {
6701 30 Jan 15 nicklas 619             boolean lastRow = filterNo == numRows-1;
6701 30 Jan 15 nicklas 620             %>
6701 30 Jan 15 nicklas 621             <tbl:headerrow>
7943 04 May 21 nicklas 622               <tbl:header subclass="row-index bg-filled-100">
7943 04 May 21 nicklas 623                 <div class="index-<%=mode.getName()%>">
7943 04 May 21 nicklas 624                   <div class="index"></div>
7943 04 May 21 nicklas 625                   <div class="check">
7943 04 May 21 nicklas 626                     <base:icon 
7943 04 May 21 nicklas 627                       subclass="link table-check"
7943 04 May 21 nicklas 628                       image="check_uncheck.png" 
7943 04 May 21 nicklas 629                       tooltip="Toggle all (use CTRL, ALT or SHIFT to check/uncheck)" 
7943 04 May 21 nicklas 630                       visible="<%=lastRow && mode.hasCheck()%>"
7943 04 May 21 nicklas 631                     />
7943 04 May 21 nicklas 632                   </div>
7943 04 May 21 nicklas 633                   <div class="icons">
7943 04 May 21 nicklas 634                     <base:icon
7943 04 May 21 nicklas 635                       subclass="link table-filter-row-action"
7943 04 May 21 nicklas 636                       image="add.png"
7943 04 May 21 nicklas 637                       tooltip="Add extra filter row"
7943 04 May 21 nicklas 638                       visible="<%=lastRow%>"
7943 04 May 21 nicklas 639                     /><base:icon
7943 04 May 21 nicklas 640                       subclass="link table-filter-row-action"
7943 04 May 21 nicklas 641                       image="remove.png"
7943 04 May 21 nicklas 642                       tooltip="Remove this filter row"
7943 04 May 21 nicklas 643                       visible="<%=numRows > 1 || numFilters > 0 %>"
7943 04 May 21 nicklas 644                       data-remove-row="<%=filterNo%>"
7943 04 May 21 nicklas 645                     />
7943 04 May 21 nicklas 646                   </div>
7943 04 May 21 nicklas 647                 </div>
6701 30 Jan 15 nicklas 648               </tbl:header>
6701 30 Jan 15 nicklas 649               <tbl:propertyfilter row="<%=filterNo%>" />
6701 30 Jan 15 nicklas 650             </tbl:headerrow>
6701 30 Jan 15 nicklas 651             <%
6701 30 Jan 15 nicklas 652           }
6701 30 Jan 15 nicklas 653           %>
7913 22 Feb 21 nicklas 654           <tbl:columnsubtitles />
5948 08 Feb 12 nicklas 655         </tbl:headers>
5948 08 Feb 12 nicklas 656         <tbl:rows>
5948 08 Feb 12 nicklas 657           <%
5948 08 Feb 12 nicklas 658           if (cc.getMessage() != null)
5948 08 Feb 12 nicklas 659           {
5948 08 Feb 12 nicklas 660             %>
6604 18 Nov 14 nicklas 661             <tbl:panel subclass="bg-filled-50">
5948 08 Feb 12 nicklas 662               <div class="messagecontainer error"><%=cc.getMessage()%></div>
5948 08 Feb 12 nicklas 663             </tbl:panel>
5948 08 Feb 12 nicklas 664             <%
5948 08 Feb 12 nicklas 665             cc.setMessage(null);
5948 08 Feb 12 nicklas 666           }
1872 31 Jan 06 nicklas 667           
1872 31 Jan 06 nicklas 668           int index = cc.getPage()*cc.getRowsPerPage();
1872 31 Jan 06 nicklas 669           int selectedItemId = cc.getId();
2029 20 Feb 06 nicklas 670           if (samples != null)
2501 09 Aug 06 martin 671           {            
2029 20 Feb 06 nicklas 672             while (samples.hasNext())
2029 20 Feb 06 nicklas 673             {
2029 20 Feb 06 nicklas 674               Sample item = samples.next();
5663 22 Jun 11 nicklas 675               Item parentType = item.getParentType();
2029 20 Feb 06 nicklas 676               BioMaterialEvent creationEvent = item.getCreationEvent();
2029 20 Feb 06 nicklas 677               int itemId = item.getId();
2421 22 Jun 06 martin 678               boolean usePermission = item.hasPermission(Permission.USE);
6221 10 Jan 13 nicklas 679               
6221 10 Jan 13 nicklas 680               
4003 26 Nov 07 nicklas 681               boolean deletePermission = item.hasPermission(Permission.DELETE);
2437 28 Jun 06 nicklas 682               boolean sharePermission = item.hasPermission(Permission.SET_PERMISSION);
2501 09 Aug 06 martin 683               boolean writePermission = item.hasPermission(Permission.WRITE);
2501 09 Aug 06 martin 684               String tooltip = mode.isSelectionMode() ?
2501 09 Aug 06 martin 685                   "Select this item" : "View this item" + (writePermission ? " (use CTRL, ALT or SHIFT to edit)" : "");
2029 20 Feb 06 nicklas 686               String name = HTML.encodeTags(item.getName());
2029 20 Feb 06 nicklas 687               index++;
2029 20 Feb 06 nicklas 688               numListed++;
2029 20 Feb 06 nicklas 689               %>
2029 20 Feb 06 nicklas 690               <tbl:row>
7943 04 May 21 nicklas 691                 <tbl:header clazz="row-index bg-filled-100">
7943 04 May 21 nicklas 692                   <div class="index-<%=mode.getName()%>">
7943 04 May 21 nicklas 693                     <div class="index <%=index>999?"index-smaller":""%>"><%=index%></div>
7943 04 May 21 nicklas 694                     <div class="check">
7943 04 May 21 nicklas 695                       <base:input
7943 04 May 21 nicklas 696                         type="checkbox" 
7943 04 May 21 nicklas 697                         name="<%=itemId%>" 
7943 04 May 21 nicklas 698                         value="<%=itemId%>" 
7943 04 May 21 nicklas 699                         title="<%=name%>" 
7943 04 May 21 nicklas 700                         checked="<%=cc.getSelected().contains(itemId)%>"
7943 04 May 21 nicklas 701                         visible="<%=mode.hasCheck()%>"
7943 04 May 21 nicklas 702                       />
7943 04 May 21 nicklas 703                       <base:input 
7943 04 May 21 nicklas 704                         type="radio" 
7943 04 May 21 nicklas 705                         name="item_id" 
7943 04 May 21 nicklas 706                         value="<%=itemId%>" 
7943 04 May 21 nicklas 707                         title="<%=name%>" 
7943 04 May 21 nicklas 708                         checked="<%=selectedItemId == itemId%>"
7943 04 May 21 nicklas 709                         visible="<%=mode.hasRadio()%>"
7943 04 May 21 nicklas 710                       />
7943 04 May 21 nicklas 711                     </div>
7943 04 May 21 nicklas 712                     <div class="icons">
7943 04 May 21 nicklas 713                       <base:icon 
7943 04 May 21 nicklas 714                         image="deleted.png"
7943 04 May 21 nicklas 715                         id="<%="delete."+itemId %>"
7943 04 May 21 nicklas 716                         subclass="<%=deletePermission ? "table-delete-item" : "disabled" %>"
7943 04 May 21 nicklas 717                         data-item-id="<%=itemId%>"
7943 04 May 21 nicklas 718                         tooltip="This item has been scheduled for deletion" 
7943 04 May 21 nicklas 719                         visible="<%=item.isRemoved()%>"
7943 04 May 21 nicklas 720                       /><base:icon 
7943 04 May 21 nicklas 721                         image="shared.png" 
7943 04 May 21 nicklas 722                         id="<%="share."+itemId %>"
7943 04 May 21 nicklas 723                         subclass="<%=sharePermission ? "table-share-item" : "disabled" %>"
7943 04 May 21 nicklas 724                         data-item-id="<%=itemId%>"
7943 04 May 21 nicklas 725                         tooltip="This item is shared to other users, groups and/or projects" 
7943 04 May 21 nicklas 726                         visible="<%=item.isShared()%>"
7943 04 May 21 nicklas 727                       />
7943 04 May 21 nicklas 728                     </div>
7943 04 May 21 nicklas 729                   </div>
7943 04 May 21 nicklas 730                 </tbl:header>
6260 27 Mar 13 nicklas 731                 <tbl:cell column="name"><div 
6260 27 Mar 13 nicklas 732                   class="link table-item"
6260 27 Mar 13 nicklas 733                   data-item-id="<%=itemId%>"
6260 27 Mar 13 nicklas 734                   data-no-edit="<%=writePermission ? 0 : 1 %>" 
6260 27 Mar 13 nicklas 735                   tabindex="0"
7943 04 May 21 nicklas 736                   title="<%=tooltip%>"
7943 04 May 21 nicklas 737                   ><%=name%></div></tbl:cell>
4331 11 Jun 08 martin 738                 <tbl:cell column="id"><%=item.getId()%></tbl:cell>
5645 27 May 11 nicklas 739                 <tbl:cell column="itemSubtype"><base:propertyvalue 
5645 27 May 11 nicklas 740                     item="<%=item%>" 
5645 27 May 11 nicklas 741                     property="itemSubtype"
5645 27 May 11 nicklas 742                     enableEditLink="<%=mode.hasEditLink()%>" 
5645 27 May 11 nicklas 743                     enablePropertyLink="<%=mode.hasPropertyLink()%>"
5645 27 May 11 nicklas 744                   /></tbl:cell>
2421 22 Jun 06 martin 745                 <tbl:cell column="externalId"><%=HTML.encodeTags(item.getExternalId())%></tbl:cell>                
6268 11 Apr 13 nicklas 746                 <tbl:cell column="originalQuantity" value="<%=item.getOriginalQuantity()%>" />
6268 11 Apr 13 nicklas 747                 <tbl:cell column="remainingQuantity" value="<%=item.getRemainingQuantity()%>" />
2354 07 Jun 06 martin 748                 <tbl:cell column="protocol"
2354 07 Jun 06 martin 749                   ><base:propertyvalue 
2354 07 Jun 06 martin 750                     item="<%=creationEvent%>" 
2354 07 Jun 06 martin 751                     property="protocol"
2354 07 Jun 06 martin 752                     enableEditLink="<%=mode.hasEditLink()%>" 
2354 07 Jun 06 martin 753                     enablePropertyLink="<%=mode.hasPropertyLink()%>"
2354 07 Jun 06 martin 754                   /></tbl:cell>
6993 03 Nov 15 nicklas 755                 <tbl:cell column="kit"
6993 03 Nov 15 nicklas 756                   ><base:propertyvalue 
6993 03 Nov 15 nicklas 757                     item="<%=creationEvent%>" 
6993 03 Nov 15 nicklas 758                     property="kit"
6993 03 Nov 15 nicklas 759                     enableEditLink="<%=mode.hasEditLink()%>" 
6993 03 Nov 15 nicklas 760                     enablePropertyLink="<%=mode.hasPropertyLink()%>"
6993 03 Nov 15 nicklas 761                   /></tbl:cell>
4869 31 Mar 09 martin 762                 <%                
4869 31 Mar 09 martin 763                 BioWell well = null;
4869 31 Mar 09 martin 764                 boolean readBioWell = true;
4869 31 Mar 09 martin 765                 try
4869 31 Mar 09 martin 766                 {
4869 31 Mar 09 martin 767                   well = item.getBioWell();
4869 31 Mar 09 martin 768                 }
4869 31 Mar 09 martin 769                 catch(PermissionDeniedException e)
4869 31 Mar 09 martin 770                 {
4869 31 Mar 09 martin 771                   readBioWell = false;
4869 31 Mar 09 martin 772                 }
4869 31 Mar 09 martin 773                 if (!readBioWell)
4869 31 Mar 09 martin 774                 {
4869 31 Mar 09 martin 775                   %>
4869 31 Mar 09 martin 776                   <tbl:cell column="bioWellRow"><i>- denied -</i> </tbl:cell>
4869 31 Mar 09 martin 777                   <tbl:cell column="bioWellColumn"><i>- denied -</i> </tbl:cell>
4869 31 Mar 09 martin 778                   <tbl:cell column="bioPlate"><i>- denied -</i> </tbl:cell>
4869 31 Mar 09 martin 779                   <%
4869 31 Mar 09 martin 780                 }
4869 31 Mar 09 martin 781                 else if (well == null)
4869 31 Mar 09 martin 782                 {
4869 31 Mar 09 martin 783                   %>
4869 31 Mar 09 martin 784                   <tbl:cell column="bioWellRow"><i>- none -</i> </tbl:cell>
4869 31 Mar 09 martin 785                   <tbl:cell column="bioWellColumn"><i>- none -</i> </tbl:cell>
4869 31 Mar 09 martin 786                   <tbl:cell column="bioPlate"><i>- none -</i> </tbl:cell>
4869 31 Mar 09 martin 787                   <%
4869 31 Mar 09 martin 788                   
4869 31 Mar 09 martin 789                 }
4869 31 Mar 09 martin 790                 else
4869 31 Mar 09 martin 791                 {                
4869 31 Mar 09 martin 792                   %>
4869 31 Mar 09 martin 793                   <tbl:cell column="bioWellRow">
4869 31 Mar 09 martin 794                     <tbl:cellvalue value="<%=well.getRow()%>"/>
4869 31 Mar 09 martin 795                   </tbl:cell>
4869 31 Mar 09 martin 796                   <tbl:cell column="bioWellColumn">
4869 31 Mar 09 martin 797                     <tbl:cellvalue value="<%=well.getColumn()%>"/>
4869 31 Mar 09 martin 798                   </tbl:cell>
4869 31 Mar 09 martin 799                   <tbl:cell column="bioPlate"><%=Base.getLinkedName(ID, well.getPlate(), false, true)%></tbl:cell>
4869 31 Mar 09 martin 800                   <%
4869 31 Mar 09 martin 801                 }
4869 31 Mar 09 martin 802                 %>
2942 22 Nov 06 nicklas 803                 <tbl:cell column="eventDate" value="<%=creationEvent.getEventDate()%>" />
2942 22 Nov 06 nicklas 804                 <tbl:cell column="entryDate" value="<%=creationEvent.getEntryDate()%>" />
5664 23 Jun 11 nicklas 805                 <tbl:cell column="parentType"><%=parentType == null ? "" : parentType.toString() %></tbl:cell>
2421 22 Jun 06 martin 806                 <tbl:cell column="parents">
2421 22 Jun 06 martin 807                   <%
5664 23 Jun 11 nicklas 808                   if (item.hasSingleParent() || parentType == null)
2421 22 Jun 06 martin 809                   {
5963 15 Feb 12 nicklas 810                     Float usedQuantity = null;
5963 15 Feb 12 nicklas 811                     if (parentType == Item.SAMPLE)
5963 15 Feb 12 nicklas 812                     {
5963 15 Feb 12 nicklas 813                       try
5963 15 Feb 12 nicklas 814                       {
5963 15 Feb 12 nicklas 815                         usedQuantity = creationEvent.getUsedQuantity((Sample)item.getParent());
5963 15 Feb 12 nicklas 816                       }
5963 15 Feb 12 nicklas 817                       catch (PermissionDeniedException ex)
5963 15 Feb 12 nicklas 818                       {}
5963 15 Feb 12 nicklas 819                     }
5663 22 Jun 11 nicklas 820                     %>
5663 22 Jun 11 nicklas 821                     <base:propertyvalue item="<%=item%>" property="parent"/>
6319 09 Sep 13 nicklas 822                     <%=usedQuantity != null ? "(" + numericFormatter.format(usedQuantity) + "µg)" : ""%>
5663 22 Jun 11 nicklas 823                     <%
5663 22 Jun 11 nicklas 824                   }
5663 22 Jun 11 nicklas 825                   else
5663 22 Jun 11 nicklas 826                   {
2421 22 Jun 06 martin 827                     String separator = "";
5567 10 Feb 11 nicklas 828                     parentSamplesQuery.setEntityParameter("creationEvent", creationEvent);
5567 10 Feb 11 nicklas 829                     for (Sample s : parentSamplesQuery.list(dc))
2421 22 Jun 06 martin 830                     {
5963 15 Feb 12 nicklas 831                       Float usedQuantity = creationEvent.getUsedQuantity(s);
2421 22 Jun 06 martin 832                       out.write(separator);
2421 22 Jun 06 martin 833                       if (mode.hasPropertyLink())
2421 22 Jun 06 martin 834                       {
2421 22 Jun 06 martin 835                         out.write(Base.getLinkedName(ID, s, false, mode.hasEditLink()));
2421 22 Jun 06 martin 836                       }
2421 22 Jun 06 martin 837                       else
2421 22 Jun 06 martin 838                       {
2421 22 Jun 06 martin 839                         out.write(HTML.encodeTags(s.getName()));
2421 22 Jun 06 martin 840                       }
5963 15 Feb 12 nicklas 841                       if (usedQuantity != null)
5963 15 Feb 12 nicklas 842                       {
6319 09 Sep 13 nicklas 843                         out.write(" (" + numericFormatter.format(usedQuantity) + "µg)");
5963 15 Feb 12 nicklas 844                       }
2421 22 Jun 06 martin 845                       separator = ", ";
2421 22 Jun 06 martin 846                     }
2421 22 Jun 06 martin 847                   }
2421 22 Jun 06 martin 848                   %>
5948 08 Feb 12 nicklas 849                   <%=parentType != null ? "<span class=\"itemsubtype\">(" + parentType + ")</span>" : "" %>
4613 29 Oct 08 nicklas 850                 </tbl:cell>
5567 10 Feb 11 nicklas 851                 <tbl:cell column="children">
5567 10 Feb 11 nicklas 852                   <%
5567 10 Feb 11 nicklas 853                   childSamplesQuery.setEntityParameter("sample", item);
5567 10 Feb 11 nicklas 854                   %>
7813 19 May 20 nicklas 855                   <%=Values.getString(childSamplesQuery.list(dc), ", ", false, nameableFormatter) %>
5663 22 Jun 11 nicklas 856                   <base:icon
6260 27 Mar 13 nicklas 857                     id="<%="newsample."+itemId%>"
5663 22 Jun 11 nicklas 858                     image="add.png" 
6260 27 Mar 13 nicklas 859                     subclass="auto-init"
6260 27 Mar 13 nicklas 860                     data-auto-init="new-sample"
6260 27 Mar 13 nicklas 861                     data-item-id="<%=itemId %>"
5663 22 Jun 11 nicklas 862                     tooltip="Create new child sample" 
5663 22 Jun 11 nicklas 863                     visible="<%=mode.hasEditLink() && createPermission && usePermission %>"
5663 22 Jun 11 nicklas 864                   />
5567 10 Feb 11 nicklas 865                 </tbl:cell>
2421 22 Jun 06 martin 866                 <tbl:cell column="extracts">
2421 22 Jun 06 martin 867                   <%
5567 10 Feb 11 nicklas 868                   extractQuery.setEntityParameter("sample", item);
2421 22 Jun 06 martin 869                   %>
7813 19 May 20 nicklas 870                   <%=Values.getString(extractQuery.list(dc), ", ", false, nameableFormatter) %>
2421 22 Jun 06 martin 871                   <base:icon
6260 27 Mar 13 nicklas 872                     id="<%="newsample."+itemId%>"
2421 22 Jun 06 martin 873                     image="add.png" 
6260 27 Mar 13 nicklas 874                     subclass="auto-init"
6260 27 Mar 13 nicklas 875                     data-auto-init="new-extract"
6260 27 Mar 13 nicklas 876                     data-item-id="<%=itemId %>"
4537 18 Sep 08 nicklas 877                     tooltip="Create new extract" 
2421 22 Jun 06 martin 878                     visible="<%=mode.hasEditLink() && createExtractPermission && usePermission %>"
2421 22 Jun 06 martin 879                   />
2421 22 Jun 06 martin 880                 </tbl:cell>
7813 19 May 20 nicklas 881                 <tbl:cell column="itemList">
7813 19 May 20 nicklas 882                   <%
7813 19 May 20 nicklas 883                   listQuery.setParameter("itemId", itemId, Type.INT);
7813 19 May 20 nicklas 884                   %>
7813 19 May 20 nicklas 885                   <%=Values.getString(listQuery.list(dc), ", ", false, nameableFormatter) %>
7813 19 May 20 nicklas 886                 </tbl:cell>
2354 07 Jun 06 martin 887                 <tbl:cell column="owner"
2354 07 Jun 06 martin 888                   ><base:propertyvalue 
2354 07 Jun 06 martin 889                     item="<%=item%>" 
2354 07 Jun 06 martin 890                     property="owner"
2354 07 Jun 06 martin 891                     enableEditLink="<%=mode.hasEditLink()%>" 
2354 07 Jun 06 martin 892                     enablePropertyLink="<%=mode.hasPropertyLink()%>"  
2354 07 Jun 06 martin 893                   /></tbl:cell>
2401 21 Jun 06 martin 894                 <tbl:cell column="description"><%=HTML.encodeTags(item.getDescription())%></tbl:cell>                
2029 20 Feb 06 nicklas 895                 <%
6539 26 Sep 14 nicklas 896                 if (item.isAnnotated())
2029 20 Feb 06 nicklas 897                 {
6539 26 Sep 14 nicklas 898                   AnnotationSetSnapshot snapshot = manager.getSnapshot(dc, item.getAnnotationSet().getId());
6539 26 Sep 14 nicklas 899                   for (AnnotationLoaderUtil loader : annotationLoaders)
2942 22 Nov 06 nicklas 900                   {
6721 10 Feb 15 nicklas 901                     %>
6721 10 Feb 15 nicklas 902                     <tbl:cell 
6721 10 Feb 15 nicklas 903                       column="<%=(loader.isSearchingInheritedAnnotations() ? "ia" : "at")+loader.getId()%>"
6721 10 Feb 15 nicklas 904                       ><%
7337 12 Apr 17 nicklas 905                       if (loader.find(snapshot, psInfo.reset())) 
6721 10 Feb 15 nicklas 906                       {
6721 10 Feb 15 nicklas 907                         %><tbl:cellvalue 
6539 26 Sep 14 nicklas 908                           list="<%=loader.getValues()%>"
8160 07 Jun 23 nicklas 909                           bulletlist="<%=loader.useBulletList() %>"
6539 26 Sep 14 nicklas 910                           suffix="<%=loader.getUnitSymbol()%>"
8083 20 Oct 22 nicklas 911                           clazz="<%=psInfo.hasProjectSpecificAnnotation() ? "ps-annotation" : null%>"
6721 10 Feb 15 nicklas 912                         /><%
6721 10 Feb 15 nicklas 913                       }
6721 10 Feb 15 nicklas 914                       %></tbl:cell>
6721 10 Feb 15 nicklas 915                     <%
2942 22 Nov 06 nicklas 916                   }
2029 20 Feb 06 nicklas 917                 }
2029 20 Feb 06 nicklas 918                 %>
2401 21 Jun 06 martin 919                 <tbl:cell column="permission"><%=PermissionUtil.getShortPermissions(item)%></tbl:cell>
3553 09 Jul 07 martin 920                 <tbl:cell column="sharedTo">
7813 19 May 20 nicklas 921                   <%=Values.getString(ShareableUtil.getSharedTo(dc, item), ", ", false, nameableFormatter) %>
3553 09 Jul 07 martin 922                 </tbl:cell>
6028 26 Mar 12 nicklas 923                 <tbl:xt-cells dc="<%=dc%>" item="<%=item%>">
6028 26 Mar 12 nicklas 924                   <tbl:cell column="xt-columns" />
6028 26 Mar 12 nicklas 925                 </tbl:xt-cells>
2029 20 Feb 06 nicklas 926               </tbl:row>
1872 31 Jan 06 nicklas 927               <%
1872 31 Jan 06 nicklas 928               }
1872 31 Jan 06 nicklas 929             }
5948 08 Feb 12 nicklas 930             if (numListed == 0)
5948 08 Feb 12 nicklas 931             {
5948 08 Feb 12 nicklas 932               %>
6604 18 Nov 14 nicklas 933               <tbl:panel subclass="bg-filled-50">
5948 08 Feb 12 nicklas 934                 <div class="messagecontainer note">
5948 08 Feb 12 nicklas 935                 <%=samples == null || samples.getTotalCount() == 0 ? "No samples were found" : "No samples on this page. Please select another page!" %>
5948 08 Feb 12 nicklas 936                 </div>
5948 08 Feb 12 nicklas 937               </tbl:panel>
5948 08 Feb 12 nicklas 938               <%
5948 08 Feb 12 nicklas 939             }
5948 08 Feb 12 nicklas 940             %>
1872 31 Jan 06 nicklas 941           </tbl:rows>
1872 31 Jan 06 nicklas 942       </tbl:data>
1872 31 Jan 06 nicklas 943     </tbl:table>
5918 21 Dec 11 nicklas 944     </div>
5918 21 Dec 11 nicklas 945
5918 21 Dec 11 nicklas 946     <base:buttongroup subclass="dialogbuttons">
6260 27 Mar 13 nicklas 947       <base:button id="btnOk" title="Ok" visible="<%=mode.hasOkButton()%>" />
6260 27 Mar 13 nicklas 948       <base:button id="close" title="Cancel" visible="<%=mode.hasCancelButton()%>" />
6260 27 Mar 13 nicklas 949       <base:button id="close" title="Close" visible="<%=mode.hasCloseButton()%>" />
1872 31 Jan 06 nicklas 950     </base:buttongroup>
1872 31 Jan 06 nicklas 951   </base:body>
1872 31 Jan 06 nicklas 952   </base:page>
1872 31 Jan 06 nicklas 953   <%
1872 31 Jan 06 nicklas 954 }
1872 31 Jan 06 nicklas 955 finally
1872 31 Jan 06 nicklas 956 {
1872 31 Jan 06 nicklas 957   if (samples != null) samples.close();
1872 31 Jan 06 nicklas 958   if (dc != null) dc.close();
1872 31 Jan 06 nicklas 959 }
3675 16 Aug 07 jari 960 %>