source: branches/3.4-stable/www/biomaterials/bioplates/wells/list_biowells.jsp @ 6780

Last change on this file since 6780 was 6780, checked in by Nicklas Nordborg, 8 years ago

Fixes #1929: Add 'none' option in annotation filters

  • Property svn:eol-style set to native
  • Property svn:keywords set to Id
File size: 22.1 KB
Line 
1<%-- $Id: list_biowells.jsp 6780 2015-03-18 06:53:09Z nicklas $
2  ------------------------------------------------------------------
3  Copyright (C) 2005 Nicklas Nordborg
4  Copyright (C) 2006 Jari Häkkinen, Nicklas Nordborg, 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 Martin
24  @version 2.10
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.Include"
31  import="net.sf.basedb.core.ItemContext"
32  import="net.sf.basedb.core.AnnotationType"
33  import="net.sf.basedb.core.BioPlate"
34  import="net.sf.basedb.core.BioPlateType"
35  import="net.sf.basedb.core.BioWell"
36  import="net.sf.basedb.core.MeasuredBioMaterial"
37  import="net.sf.basedb.core.BioMaterialEvent"
38  import="net.sf.basedb.core.ItemQuery"
39  import="net.sf.basedb.core.ItemResultIterator"
40  import="net.sf.basedb.core.ItemResultList"
41  import="net.sf.basedb.core.Permission"
42  import="net.sf.basedb.core.PluginDefinition"
43  import="net.sf.basedb.core.PermissionDeniedException"
44  import="net.sf.basedb.core.Unit"
45  import="net.sf.basedb.core.Quantity"
46  import="net.sf.basedb.core.query.Restrictions"
47  import="net.sf.basedb.core.query.Expressions"
48  import="net.sf.basedb.core.query.Orders"
49  import="net.sf.basedb.core.query.Hql"
50  import="net.sf.basedb.core.plugin.GuiContext"
51  import="net.sf.basedb.core.plugin.Plugin"
52  import="net.sf.basedb.core.snapshot.AnnotationLoaderUtil"
53  import="net.sf.basedb.core.snapshot.AnnotationTypeFilter"
54  import="net.sf.basedb.core.snapshot.AnnotationSnapshot"
55  import="net.sf.basedb.core.snapshot.AnnotationSetSnapshot"
56  import="net.sf.basedb.core.snapshot.SnapshotManager"
57  import="net.sf.basedb.util.Enumeration"
58  import="net.sf.basedb.util.units.UnitUtil"
59  import="net.sf.basedb.clients.web.Base"
60  import="net.sf.basedb.clients.web.ChangeHistoryUtil"
61  import="net.sf.basedb.clients.web.ModeInfo"
62  import="net.sf.basedb.clients.web.PermissionUtil"
63  import="net.sf.basedb.clients.web.util.HTML"
64  import="net.sf.basedb.util.Values"
65  import="net.sf.basedb.util.formatter.Formatter"
66  import="net.sf.basedb.util.formatter.WellCoordinateFormatter"
67  import="net.sf.basedb.clients.web.formatter.FormatterFactory"
68  import="net.sf.basedb.clients.web.extensions.ExtensionsControl"
69  import="net.sf.basedb.clients.web.extensions.JspContext"
70  import="net.sf.basedb.clients.web.extensions.renderer.PrefixSuffixRenderer"
71  import="net.sf.basedb.clients.web.extensions.toolbar.ToolbarUtil"
72  import="net.sf.basedb.clients.web.extensions.list.ListColumnUtil"
73  import="net.sf.basedb.util.extensions.ExtensionsInvoker"
74  import="java.util.ArrayList"
75  import="java.util.List"
76  import="java.util.Map"
77  import="java.util.Date"
78%>
79<%@ taglib prefix="base" uri="/WEB-INF/base.tld" %>
80<%@ taglib prefix="tbl" uri="/WEB-INF/table.tld" %>
81<%@ taglib prefix="t" uri="/WEB-INF/tab.tld" %>
82<%@ taglib prefix="p" uri="/WEB-INF/path.tld" %>
83<%@ taglib prefix="ext" uri="/WEB-INF/extensions.tld" %>
84<%!
85  private static final Item itemType = Item.BIOWELL;
86  private static final GuiContext guiContext = new GuiContext(itemType, GuiContext.Type.LIST);
87%>
88<%
89final int bioPlateId = Values.getInt(request.getParameter("bioplate_id"));
90final SessionControl sc = Base.getExistingSessionControl(pageContext, Permission.DENIED, itemType);
91final String ID = sc.getId();
92final ItemContext cc = Base.getAndSetCurrentContext(sc, itemType, null, null);
93
94final ModeInfo mode = ModeInfo.get(request.getParameter("mode"));
95final String callback = request.getParameter("callback");
96final String title = mode.generateTitle("biowell", "biowells");
97final DbControl dc = sc.newDbControl();
98ItemResultIterator<BioWell> biowells = null;
99List<AnnotationLoaderUtil> annotationLoaders = new ArrayList<AnnotationLoaderUtil>();
100
101Formatter<Date> dateTimeFormatter = FormatterFactory.getDateTimeFormatter(sc);
102Formatter<Date> dateFormatter = FormatterFactory.getDateFormatter(sc);
103
104WellCoordinateFormatter rowFormatter = new WellCoordinateFormatter(true);
105WellCoordinateFormatter columnFormatter = new WellCoordinateFormatter(false);
106
107try
108{
109  final BioPlate bioplate = BioPlate.getById(dc, bioPlateId);
110  final BioPlateType bioPlateType = bioplate.getBioPlateType();
111  final boolean createPermission = bioplate.hasPermission(Permission.WRITE);
112  final boolean deletePermission = createPermission;
113  final BioWell.LockMode lockMode = bioPlateType.getLockMode();
114  final Item bioMaterialType = bioPlateType.getBioMaterialType();
115
116  Enumeration<String, String> rows = new Enumeration<String,String>();
117  for (int r = 0; r < bioplate.getPlateGeometry().getRows() && r < 256; r++)
118  {
119    rows.add(Integer.toString(r), rowFormatter.format(r));
120  }
121 
122  Enumeration<String, String> columns = new Enumeration<String,String>();
123  for (int c = 0; c < bioplate.getPlateGeometry().getColumns() && c < 256; c++)
124  {
125    columns.add(Integer.toString(c), columnFormatter.format(c));
126  }
127 
128  Map<Plugin.MainType, Integer> pluginCount = PluginDefinition.countPlugins(dc, guiContext);
129  Formatter<Number> numericFormatter = FormatterFactory.getNumberFormatter(sc);
130  Unit microGram = UnitUtil.getUnit(dc, Quantity.MASS, "µg");
131
132  SnapshotManager manager = new SnapshotManager();
133  if (bioMaterialType != null)
134  {
135    final ItemQuery<AnnotationType> annotationTypeQuery = Base.getAnnotationTypesQuery(bioMaterialType);
136    for (AnnotationType at : annotationTypeQuery.list(dc))
137    {
138      annotationLoaders.add(new AnnotationLoaderUtil(dc, manager, at));
139    }
140  }
141
142  try
143  {
144    final ItemQuery<BioWell> query = Base.getConfiguredQuery(dc, cc, true, bioplate.getBioWells(), mode);
145    query.join(Hql.leftJoin(null, "bioMaterial", "mbm", null, true));
146    query.join(Hql.leftJoin("mbm", "creationEvent", "evt", null, true));
147    query.join(Hql.leftJoin("mbm", "owner", "usr", null, false));
148    query.join(Hql.leftJoin("evt", "protocol", "pcl", null, false));
149    if (!"row".equals(cc.getSortProperty())) query.order(Orders.asc(Hql.property("row")));
150    if (!"column".equals(cc.getSortProperty())) query.order(Orders.asc(Hql.property("column")));
151    biowells = query.iterate(dc);
152  }
153  catch (Throwable t)
154  {
155    cc.setMessage(t.getMessage());
156    t.printStackTrace();
157  }
158  int numListed = 0;
159  JspContext jspContext = ExtensionsControl.createContext(dc, pageContext, guiContext, bioplate);
160  ExtensionsInvoker invoker = ToolbarUtil.useExtensions(jspContext);
161  ExtensionsInvoker columnsInvoker = ListColumnUtil.useExtensions(jspContext);
162  %>
163  <base:page title="<%=title%>" type="<%=mode.getPageType()%>" id="list-page">
164  <base:head scripts="table.js,tabcontrol-2.js,~biowells.js" styles="table.css,toolbar.css,headertabcontrol.css,path.css">
165    <ext:scripts context="<%=jspContext%>" />
166    <ext:stylesheets context="<%=jspContext%>" />
167  </base:head>
168  <base:body>
169    <%
170    if (!mode.isSelectionMode())
171    {
172      %>
173      <p:path><p:pathelement 
174        title="Bioplates" href="<%="../index.jsp?ID="+ID%>" 
175        /><p:pathelement title="<%=HTML.encodeTags(bioplate.getName())%>" 
176        /></p:path>
177      <%
178    }
179    else
180    {
181      %>
182      <h1><%=title%></h1>
183      <%
184    }
185    %>
186    <t:tabcontrol 
187      id="main"
188      subclass="content mastertabcontrol"
189      active="biowells" 
190      notabs="<%=mode.isSelectionMode()%>"
191      >
192    <t:tab id="properties" title="Properties" />
193    <t:tab id="annotations" title="Annotations" />       
194    <t:tab id="biowells" title="Wells">
195    <tbl:table 
196      id="biowells" 
197      columns="<%=cc.getSetting("columns")%>"
198      sortby="<%=cc.getSortProperty()%>" 
199      direction="<%=cc.getSortDirection()%>"
200      action="index.jsp"
201      sc="<%=sc%>"
202      item="<%=itemType%>"
203      subclass="fulltable"
204      >
205      <tbl:hidden 
206        name="mode" 
207        value="<%=mode.getName()%>" 
208      />
209      <tbl:hidden 
210        name="bioplate_id" 
211        value="<%=String.valueOf(bioPlateId)%>" 
212      />
213      <tbl:hidden 
214        name="callback" 
215        value="<%=callback%>" 
216        skip="<%=callback == null%>" 
217      />
218      <tbl:columndef 
219        id="row"
220        property="row"
221        datatype="int"
222        title="Row"
223        sortable="true" 
224        filterable="true"
225        enumeration="<%=rows%>"
226        exportable="true"
227        show="always" 
228        formatter="<%=rowFormatter%>"
229      />
230      <tbl:columndef 
231        id="column"
232        property="column"
233        datatype="int"
234        title="Column"
235        sortable="true" 
236        filterable="true"
237        enumeration="<%=columns%>"
238        exportable="true"
239        show="always" 
240        formatter="<%=columnFormatter%>"
241      />
242      <tbl:columndef 
243        id="id"
244        clazz="uniquecol"
245        property="id"
246        datatype="int"
247        title="ID"
248        sortable="true"
249        filterable="true"
250        exportable="true"
251      /> 
252      <tbl:columndef 
253        id="bioMaterial.name"
254        property="$mbm.name"
255        exportproperty="bioMaterial.name"
256        datatype="string"
257        title="Name"
258        sortable="true" 
259        filterable="true"
260        exportable="true"
261      />
262      <tbl:columndef 
263        id="bioMaterial.externalId"
264        property="$mbm.externalId"
265        exportproperty="bioMaterial.externalId"
266        datatype="string"
267        title="External id"
268        sortable="true" 
269        filterable="true"
270        exportable="true"
271      />     
272      <tbl:columndef 
273        id="bioMaterial.originalQuantity"
274        property="$mbm.originalQuantity"
275        exportproperty="bioMaterial.originalQuantity"
276        datatype="float"
277        title="Original quantity (µg)"
278        sortable="true" 
279        filterable="true"
280        exportable="true"
281        unit="<%=microGram%>"
282        formatter="<%=numericFormatter%>"
283      />
284      <tbl:columndef 
285        id="bioMaterial.remainingQuantity"
286        property="$mbm.remainingQuantity"
287        exportproperty="bioMaterial.remainingQuantity"
288        datatype="float"
289        title="Remaining quantity (µg)"
290        sortable="true" 
291        filterable="true"
292        exportable="true"
293        unit="<%=microGram%>"
294        formatter="<%=numericFormatter%>"
295      />
296      <tbl:columndef 
297        id="bioMaterial.protocol"
298        property="$evt.protocol"
299        sortproperty="$pcl.name"
300        filterproperty="$pcl.name"
301        exportproperty="bioMaterial.creationEvent.protocol.name"
302        datatype="string"
303        title="Protocol"
304        sortable="true" 
305        filterable="true"
306        exportable="true"
307      />
308      <tbl:columndef 
309        id="bioMaterial.entryDate"
310        property="$evt.entryDate"
311        exportproperty="bioMaterial.creationEvent.entryDate"
312        datatype="date"
313        title="Registered"
314        sortable="true" 
315        filterable="true"
316        exportable="true"
317        formatter="<%=dateFormatter%>"
318      />
319      <tbl:columndef 
320        id="bioMaterial.eventDate"
321        property="$evt.eventDate"
322        exportproperty="bioMaterial.creationEvent.eventDate"
323        datatype="date"
324        title="Created"
325        sortable="true" 
326        filterable="true"
327        exportable="true"
328        formatter="<%=dateFormatter%>"
329      />
330      <tbl:columndef 
331        id="bioMaterial.owner"
332        property="$usr.name"
333        exportproperty="bioMaterial.owner.name"
334        datatype="string"
335        title="Owner"
336        sortable="true" 
337        filterable="true"
338        exportable="true"
339      />
340      <tbl:columndef 
341        id="bioMaterial.description"
342        property="$mbm.description"
343        exportproperty="bioMaterial.description"
344        datatype="string"
345        title="Description" 
346        sortable="true" 
347        filterable="true" 
348        exportable="true"
349      />
350      <tbl:columndef
351        id="bioMaterialList"
352        property="@bioMaterial.bioMaterialLists"
353        datatype="int"
354        title="Biomaterial list"
355        filterable="true"
356        enumeration="<%=Base.getBioMaterialListsEnum(dc, bioMaterialType, Include.ALL)%>"
357        multiple="false"
358      />
359      <tbl:columndef 
360        id="originalBioMaterial.name"
361        property="originalBioMaterial.name"
362        datatype="string"
363        title="Original biomaterial"
364        sortable="true" 
365        filterable="true"
366        exportable="true"
367      />
368      <%
369      for (AnnotationLoaderUtil loader : annotationLoaders)
370      {
371        AnnotationType at = loader.getAnnotationType();
372        Enumeration<String, String> annotationEnum = null;
373        Formatter formatter = FormatterFactory.getTypeFormatter(sc, at.getValueType());
374        if (at.isEnumeration())
375        {
376          annotationEnum = new Enumeration<String, String>();
377          if (!at.getDisplayAsList()) annotationEnum.add("", "-none-");
378          List<?> values = at.getValues();
379          for (Object value : values)
380          {
381            String encoded = formatter.format(value);
382            annotationEnum.add(encoded, encoded);
383          }
384        }
385        %>
386        <tbl:columndef 
387          id="<%="at"+at.getId()%>"
388          title="<%=HTML.encodeTags(at.getName())+" [A]"%>" 
389          property="<%="$mbm.#"+at.getId()%>"
390          annotation="true"
391          datatype="<%=at.getValueType().getStringValue()%>"
392          enumeration="<%=annotationEnum%>"
393          smartenum="<%=at.getDisplayAsList() %>"
394          sortable="<%=at.getMultiplicity() == 1%>" 
395          filterable="true" 
396          exportable="false"
397          formatter="<%=formatter%>"
398          unit="<%=at.getDefaultUnit()%>"
399        />
400        <%
401      }
402      %>
403      <tbl:columndef
404        id="permission"
405        title="Permission"
406      />
407      <tbl:columndef 
408        id="xt-columns" 
409        extensions="<%=columnsInvoker%>" 
410        jspcontext="<%=jspContext%>" 
411      />
412      <div class="panelgroup bg-filled-50 bottomborder">
413        <tbl:toolbar
414          visible="<%=mode.hasToolbar()%>"
415          subclass="bottomborder"
416          >
417          <tbl:button 
418            id="btnColumns"
419            image="columns.png" 
420            title="Columns&hellip;" 
421            tooltip="Show, hide and re-order columns" 
422          />
423          <tbl:button 
424            id="btnImport"
425            data-plugin-type="IMPORT"
426            image="import.png" 
427            title="Import&hellip;" 
428            tooltip="Import data" 
429            visible="<%=pluginCount.containsKey(Plugin.MainType.IMPORT)%>"
430          />
431          <tbl:button 
432            id="btnExport"
433            data-plugin-type="EXPORT"
434            image="export.png" 
435            title="Export&hellip;" 
436            tooltip="Export data" 
437            visible="<%=pluginCount.containsKey(Plugin.MainType.EXPORT)%>"
438          />
439          <tbl:button 
440            id="btnRunPlugin"
441            data-plugin-type="OTHER"
442            image="runplugin.png" 
443            title="Run plugin&hellip;" 
444            tooltip="Run a plugin" 
445            visible="<%=pluginCount.containsKey(Plugin.MainType.OTHER)%>"
446          />
447          <ext:render extensions="<%=invoker%>" context="<%=jspContext%>" 
448            wrapper="<%=new PrefixSuffixRenderer(jspContext, "<td>", "</td>") %>"/>
449        </tbl:toolbar>
450        <tbl:panel>
451          <tbl:presetselector />
452          <tbl:navigator
453            page="<%=cc.getPage()%>" 
454            rowsperpage="<%=cc.getRowsPerPage()%>" 
455            totalrows="<%=biowells == null ? 0 : biowells.getTotalCount()%>" 
456            visible="<%=mode.hasNavigator()%>"
457          />
458        </tbl:panel>
459      </div>
460      <tbl:data>
461        <tbl:headers>
462          <tbl:headerrow>
463            <tbl:header colspan="3" />
464            <tbl:columnheaders />
465          </tbl:headerrow>
466          <tbl:headerrow>
467            <tbl:header subclass="index" />
468            <tbl:header 
469              subclass="check" 
470              visible="<%=mode.hasCheck()%>"
471              ><base:icon 
472                id="check.uncheck"
473                image="check_uncheck.png" 
474                tooltip="Check/uncheck all" 
475                 
476              /></tbl:header>
477            <tbl:header 
478              subclass="check" 
479              visible="<%=mode.hasRadio()%>"
480              />
481            <tbl:header 
482              subclass="icons" 
483              visible="<%=mode.hasIcons()%>"
484              />
485            <tbl:propertyfilter />
486          </tbl:headerrow>
487        </tbl:headers>
488        <tbl:rows>
489          <%
490          if (cc.getMessage() != null)
491          {
492            %>
493            <tbl:panel subclass="bg-filled-50">
494              <div class="messagecontainer error"><%=cc.getMessage()%></div>
495            </tbl:panel>
496            <%
497            cc.setMessage(null);
498          }
499          int index = cc.getPage()*cc.getRowsPerPage();
500          int selectedItemId = cc.getId();
501          if (biowells != null)
502          {           
503            while (biowells.hasNext())
504            {
505              BioWell item = biowells.next();
506              int itemId = item.getId();
507              String coordinate = rowFormatter.format(item.getRow()) + columnFormatter.format(item.getColumn());
508              index++;
509              numListed++;
510              MeasuredBioMaterial bioMaterial = null;
511              BioMaterialEvent creationEvent = null;
512              boolean editWellPermission = item.hasPermission(Permission.USE);
513              try
514              {
515                bioMaterial = item.getBioMaterial();
516                if (bioMaterial != null)
517                {
518                  creationEvent = bioMaterial.getCreationEvent();
519                  editWellPermission &= bioMaterial.hasPermission(Permission.WRITE) && !bioMaterial.isLockedInWell();
520                }
521                else
522                {
523                  editWellPermission &= item.canAddBioMaterial();
524                }
525              }
526              catch (PermissionDeniedException ex)
527              {
528                editWellPermission = false;
529              }
530              %>
531              <tbl:row>
532                <tbl:header 
533                  clazz="index"
534                  ><%=index%></tbl:header>
535                <tbl:header 
536                  clazz="check" 
537                  visible="<%=mode.hasCheck()%>"
538                  ><input 
539                    type="checkbox" 
540                    name="<%=itemId%>" 
541                    value="<%=itemId%>" 
542                    title="<%=coordinate%>" 
543                    <%=cc.getSelected().contains(itemId) ? "checked" : ""%> 
544                  ></tbl:header>
545                <tbl:header 
546                  clazz="check" 
547                  visible="<%=mode.hasRadio()%>"
548                  ><input 
549                    type="radio" 
550                    name="item_id" 
551                    value="<%=itemId%>" 
552                    title="<%=coordinate%>" 
553                    <%=selectedItemId == itemId ? "checked" : ""%>
554                  ></tbl:header>
555                <tbl:header 
556                  clazz="icons" 
557                  visible="<%=mode.hasIcons()%>"
558                  >&nbsp;</tbl:header>
559               
560                <tbl:cell column="id"><%=item.getId()%></tbl:cell>
561                <tbl:cell column="row">
562                  <%
563                  if (mode.isSelectionMode())
564                  {
565                    %>
566                    <div 
567                      class="link table-item"
568                      data-item-id="<%=itemId%>"
569                      tabindex="0"
570                      title="Select this item">
571                      <tbl:cellvalue value="<%=item.getRow()%>" />
572                    </div>
573                  <%
574                  }
575                  else
576                  {
577                    %><tbl:cellvalue value="<%=item.getRow()%>" /><%
578                  }
579                  %>
580                </tbl:cell>
581                <tbl:cell column="column" value="<%=item.getColumn()%>" />
582                <tbl:cell column="bioMaterial.name">
583                  <base:propertyvalue 
584                      item="<%=item%>" 
585                      property="bioMaterial"
586                      enableEditLink="<%=mode.hasEditLink()%>" 
587                      enablePropertyLink="<%=mode.hasPropertyLink()%>"
588                  />
589                  <base:icon 
590                    visible="<%=editWellPermission%>"
591                    subclass="link auto-init"
592                    data-auto-init="item-link" 
593                    data-item-type="BIOWELL" 
594                    data-item-id="<%=itemId %>"
595                    image="edit.png"
596                    tooltip="<%=bioMaterial == null ? "Add biomaterial to this well" : "Change the biomaterial in this well"%>"
597                  />
598                  <base:icon 
599                    visible="<%=!editWellPermission%>"
600                    image="locked.png"
601                    tooltip="<%=item.hasBeenUsed() ? "This well has already been used" : "This well is locked for modification"%>"
602                  />
603                </tbl:cell>
604                <tbl:cell column="bioMaterial.owner"
605                  ><base:propertyvalue 
606                    item="<%=bioMaterial%>" 
607                    property="owner"
608                    enableEditLink="<%=mode.hasEditLink()%>" 
609                    enablePropertyLink="<%=mode.hasPropertyLink()%>" 
610                  /></tbl:cell>
611                <tbl:cell column="bioMaterial.description"><base:propertyvalue item="<%=bioMaterial%>" property="description"/></tbl:cell>
612                <tbl:cell column="bioMaterial.protocol"><base:propertyvalue item="<%=creationEvent%>" property="protocol"/></tbl:cell>
613                <tbl:cell column="bioMaterial.entryDate" value="<%=creationEvent == null ? null : creationEvent.getEntryDate() %>" />
614                <tbl:cell column="bioMaterial.eventDate" value="<%=creationEvent == null ? null : creationEvent.getEntryDate() %>" />
615                <tbl:cell column="bioMaterial.externalId"><%=HTML.encodeTags(bioMaterial == null ? null : bioMaterial.getExternalId())%></tbl:cell>               
616                <tbl:cell column="bioMaterial.originalQuantity" value="<%=bioMaterial == null ? null : bioMaterial.getOriginalQuantity()%>" />
617                <tbl:cell column="bioMaterial.remainingQuantity" value="<%=bioMaterial == null ? null : bioMaterial.getRemainingQuantity()%>" />
618                <tbl:cell column="originalBioMaterial.name"><base:propertyvalue item="<%=item%>" property="originalBioMaterial" /></tbl:cell>
619                <%
620                if (bioMaterial != null && bioMaterial.isAnnotated())
621                {
622                  AnnotationSetSnapshot snapshot = manager.getSnapshot(dc, bioMaterial.getAnnotationSet().getId());
623                  for (AnnotationLoaderUtil loader : annotationLoaders)
624                  {
625                    %>
626                    <tbl:cell 
627                      column="<%="at"+loader.getId()%>"
628                      ><%
629                      if (loader.find(snapshot)) 
630                      {
631                        %><tbl:cellvalue 
632                          list="<%=loader.getValues()%>"
633                          suffix="<%=loader.getUnitSymbol()%>"
634                        /><%
635                      }
636                      %></tbl:cell>
637                    <%
638                  }
639                }
640                %>
641                <tbl:cell column="permission"><%=PermissionUtil.getShortPermissions(item)%></tbl:cell>
642                <tbl:xt-cells dc="<%=dc%>" item="<%=item%>">
643                  <tbl:cell column="xt-columns" />
644                </tbl:xt-cells>
645              </tbl:row>
646              <%
647            }
648          }
649          if (numListed == 0)
650          {
651            %>
652            <tbl:panel subclass="bg-filled-50">
653              <div class="messagecontainer note">
654                <%=biowells == null || biowells.getTotalCount() == 0 ? "No biowells were found" : "No biowells on this page. Please select another page!" %>
655              </div>
656            </tbl:panel>
657            <%
658          }
659          %>
660        </tbl:rows>
661      </tbl:data>
662    </tbl:table>
663    </t:tab>
664   
665    <t:tab id="events" title="Plate events" />
666    <t:tab id="overview" title="Overview" 
667      tooltip="Display a tree overview of related items" />
668    <t:tab id="history" title="Change history" 
669        tooltip="Displays a log of all modifications made to this item"
670        visible="<%=ChangeHistoryUtil.showChangeHistoryTab(sc)%>" />
671    </t:tabcontrol>
672
673    <base:buttongroup subclass="dialogbuttons">
674      <base:button id="btnOk" title="Ok" visible="<%=mode.hasOkButton()%>" />
675      <base:button id="close" title="Cancel" visible="<%=mode.hasCancelButton()%>" />
676      <base:button id="close" title="Close" visible="<%=mode.hasCloseButton()%>" />
677    </base:buttongroup>
678
679  </base:body>
680  </base:page>
681  <%
682}
683finally
684{
685  if (biowells != null) biowells.close();
686  if (dc != null) dc.close();
687}
688%>
Note: See TracBrowser for help on using the repository browser.