source: trunk/www/biomaterials/samples/list_samples.jsp @ 5948

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

References #1655: GUI improvements

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

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