www/biomaterials/wizards/place_on_plate.jsp

Code
Comments
Other
Rev Date Author Line
5527 13 Dec 10 nicklas 1 <%-- $Id$
5527 13 Dec 10 nicklas 2   ------------------------------------------------------------------
5527 13 Dec 10 nicklas 3   Copyright (C) 2010 Nicklas Nordborg
5527 13 Dec 10 nicklas 4
5527 13 Dec 10 nicklas 5   This file is part of BASE - BioArray Software Environment.
5527 13 Dec 10 nicklas 6   Available at http://base.thep.lu.se/
5527 13 Dec 10 nicklas 7
5527 13 Dec 10 nicklas 8   BASE is free software; you can redistribute it and/or
5527 13 Dec 10 nicklas 9   modify it under the terms of the GNU General Public License
5527 13 Dec 10 nicklas 10   as published by the Free Software Foundation; either version 3
5527 13 Dec 10 nicklas 11   of the License, or (at your option) any later version.
5527 13 Dec 10 nicklas 12
5527 13 Dec 10 nicklas 13   BASE is distributed in the hope that it will be useful,
5527 13 Dec 10 nicklas 14   but WITHOUT ANY WARRANTY; without even the implied warranty of
5527 13 Dec 10 nicklas 15   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
5527 13 Dec 10 nicklas 16   GNU General Public License for more details.
5527 13 Dec 10 nicklas 17
5527 13 Dec 10 nicklas 18   You should have received a copy of the GNU General Public License
5527 13 Dec 10 nicklas 19   along with BASE. If not, see <http://www.gnu.org/licenses/>.
5527 13 Dec 10 nicklas 20   ------------------------------------------------------------------
5527 13 Dec 10 nicklas 21
5527 13 Dec 10 nicklas 22   @author Nicklas
5527 13 Dec 10 nicklas 23 --%>
5527 13 Dec 10 nicklas 24 <%@ page pageEncoding="UTF-8" session="false"
5528 15 Dec 10 nicklas 25   import="net.sf.basedb.core.BioPlateEvent"
5536 21 Dec 10 nicklas 26   import="net.sf.basedb.core.BioPlateEventType"
5527 13 Dec 10 nicklas 27   import="net.sf.basedb.core.MeasuredBioMaterial"
5528 15 Dec 10 nicklas 28   import="net.sf.basedb.core.Hardware"
6997 03 Nov 15 nicklas 29   import="net.sf.basedb.core.Kit"
5528 15 Dec 10 nicklas 30   import="net.sf.basedb.core.Protocol"
5710 29 Aug 11 nicklas 31   import="net.sf.basedb.core.ItemSubtype"
5527 13 Dec 10 nicklas 32   import="net.sf.basedb.core.DbControl"
5710 29 Aug 11 nicklas 33   import="net.sf.basedb.core.SystemItems"
5527 13 Dec 10 nicklas 34   import="net.sf.basedb.core.Item"
5527 13 Dec 10 nicklas 35   import="net.sf.basedb.core.ItemContext"
5527 13 Dec 10 nicklas 36   import="net.sf.basedb.core.ItemQuery"
5527 13 Dec 10 nicklas 37   import="net.sf.basedb.core.SessionControl"
5528 15 Dec 10 nicklas 38   import="net.sf.basedb.core.query.Restrictions"
5528 15 Dec 10 nicklas 39   import="net.sf.basedb.core.query.Hql"
5527 13 Dec 10 nicklas 40   import="net.sf.basedb.util.Values"
5528 15 Dec 10 nicklas 41   import="net.sf.basedb.util.formatter.Formatter"
5528 15 Dec 10 nicklas 42   import="net.sf.basedb.clients.web.formatter.FormatterFactory"
5528 15 Dec 10 nicklas 43   import="net.sf.basedb.clients.web.formatter.FormatterSettings"
5527 13 Dec 10 nicklas 44   import="net.sf.basedb.clients.web.Base"
5527 13 Dec 10 nicklas 45   import="net.sf.basedb.clients.web.util.HTML"
5527 13 Dec 10 nicklas 46   import="java.util.List"
5528 15 Dec 10 nicklas 47   import="java.util.Date"
5529 15 Dec 10 nicklas 48   import="java.util.Collections"
5527 13 Dec 10 nicklas 49 %>
5527 13 Dec 10 nicklas 50 <%@ taglib prefix="base" uri="/WEB-INF/base.tld" %>
5528 15 Dec 10 nicklas 51 <%@ taglib prefix="tbl" uri="/WEB-INF/table.tld" %>
5527 13 Dec 10 nicklas 52 <%
5527 13 Dec 10 nicklas 53 final Item itemType = Item.valueOf(request.getParameter("itemType"));
5527 13 Dec 10 nicklas 54 final SessionControl sc = Base.getExistingSessionControl(pageContext, true);
5536 21 Dec 10 nicklas 55 final ItemContext cc = sc.getCurrentContext(Item.BIOPLATEEVENT, BioPlateEventType.PLACE_ON_PLATE);
5527 13 Dec 10 nicklas 56 final String ID = sc.getId();
5527 13 Dec 10 nicklas 57 final float scale = Base.getScale(sc);
7954 12 May 21 nicklas 58 final DbControl dc = sc.newDbControl(":Place on plate wizard");
5527 13 Dec 10 nicklas 59 try
5527 13 Dec 10 nicklas 60 {
5528 15 Dec 10 nicklas 61   // Load recently used items
7605 26 Feb 19 nicklas 62   List<Hardware> recentHardware = cc.getRecent(dc, Item.HARDWARE);
7605 26 Feb 19 nicklas 63   List<Protocol> recentProtocols = cc.getRecent(dc, Item.PROTOCOL);
7605 26 Feb 19 nicklas 64   List<Kit> recentKits = cc.getRecent(dc, Item.KIT);
5528 15 Dec 10 nicklas 65   
7605 26 Feb 19 nicklas 66   ItemQuery<MeasuredBioMaterial> query = cc.getQuery();
5529 15 Dec 10 nicklas 67   List<MeasuredBioMaterial> bioMaterial = Collections.emptyList();
5710 29 Aug 11 nicklas 68   ItemSubtype commonSubtype = null;
5529 15 Dec 10 nicklas 69   if (query != null)
5529 15 Dec 10 nicklas 70   {
5529 15 Dec 10 nicklas 71     query.restrict(Restrictions.eq(Hql.property("bioWell"), null));
5529 15 Dec 10 nicklas 72     query.setMaxResults(-1);
5529 15 Dec 10 nicklas 73     query.setFirstResult(0);
5529 15 Dec 10 nicklas 74     bioMaterial = query.list(dc);
5536 21 Dec 10 nicklas 75     cc.setQuery(null);
5529 15 Dec 10 nicklas 76   }
6217 14 Dec 12 nicklas 77   
5528 15 Dec 10 nicklas 78   final Formatter<Date> dateFormatter = FormatterFactory.getDateFormatter(sc);
5528 15 Dec 10 nicklas 79   final String dateFormat = FormatterSettings.getDateFormat(sc);
5528 15 Dec 10 nicklas 80   final String jsDateFormat = HTML.javaScriptEncode(dateFormat);
5528 15 Dec 10 nicklas 81   final String htmlDateFormat = HTML.encodeTags(dateFormat);
5528 15 Dec 10 nicklas 82   final boolean autoSelectUnmappedItem = Values.getBoolean(sc.getUserClientSetting("place-on-plate.auto-select-unmapped-item"), true);
5527 13 Dec 10 nicklas 83   
6396 23 Jan 14 nicklas 84   // Find out if all selected biomaterial has a common subtype
6396 23 Jan 14 nicklas 85   boolean first = true;
6396 23 Jan 14 nicklas 86   for (MeasuredBioMaterial bm : bioMaterial)
6396 23 Jan 14 nicklas 87   {
6396 23 Jan 14 nicklas 88     if (first)
5527 13 Dec 10 nicklas 89     {
6396 23 Jan 14 nicklas 90       commonSubtype = bm.getItemSubtype();
6396 23 Jan 14 nicklas 91       first = false;
5527 13 Dec 10 nicklas 92     }
6396 23 Jan 14 nicklas 93     else if (commonSubtype != null)
5527 13 Dec 10 nicklas 94     {
6396 23 Jan 14 nicklas 95       if (!commonSubtype.equals(bm.getItemSubtype()))
5527 13 Dec 10 nicklas 96       {
6396 23 Jan 14 nicklas 97         commonSubtype = null;
6396 23 Jan 14 nicklas 98         break;
5527 13 Dec 10 nicklas 99       }
5527 13 Dec 10 nicklas 100     }
6396 23 Jan 14 nicklas 101   }
5527 13 Dec 10 nicklas 102
6396 23 Jan 14 nicklas 103   ItemSubtype protocolType = null;
6396 23 Jan 14 nicklas 104   ItemSubtype hardwareType = null;
6997 03 Nov 15 nicklas 105   ItemSubtype kitType = null;
6396 23 Jan 14 nicklas 106   if (commonSubtype != null)
6396 23 Jan 14 nicklas 107   {
6396 23 Jan 14 nicklas 108     protocolType = commonSubtype.getRelatedSubtype(Item.PROTOCOL);
6396 23 Jan 14 nicklas 109     hardwareType = commonSubtype.getRelatedSubtype(Item.HARDWARE);
6997 03 Nov 15 nicklas 110     kitType = commonSubtype.getRelatedSubtype(Item.KIT);
6396 23 Jan 14 nicklas 111   }
6396 23 Jan 14 nicklas 112   if (protocolType == null)
6396 23 Jan 14 nicklas 113   {
6396 23 Jan 14 nicklas 114     String defaultId = Protocol.getDefaultSystemId(itemType);
6396 23 Jan 14 nicklas 115     if (defaultId != null) protocolType = ItemSubtype.getById(dc, SystemItems.getId(defaultId));
6396 23 Jan 14 nicklas 116   }
6396 23 Jan 14 nicklas 117   if (hardwareType == null)
6396 23 Jan 14 nicklas 118   {
6396 23 Jan 14 nicklas 119     String defaultId = Hardware.getDefaultSystemId(itemType);
6396 23 Jan 14 nicklas 120     if (defaultId != null) hardwareType = ItemSubtype.getById(dc, SystemItems.getId(defaultId));
6396 23 Jan 14 nicklas 121   }
6997 03 Nov 15 nicklas 122   if (kitType == null)
6997 03 Nov 15 nicklas 123   {
6997 03 Nov 15 nicklas 124     String defaultId = Kit.getDefaultSystemId(itemType);
6997 03 Nov 15 nicklas 125     if (defaultId != null) kitType = ItemSubtype.getById(dc, SystemItems.getId(defaultId));
6997 03 Nov 15 nicklas 126   }
6396 23 Jan 14 nicklas 127   %>
6396 23 Jan 14 nicklas 128   <base:page type="popup" title="Place biomaterial on plate">
6396 23 Jan 14 nicklas 129   <base:head scripts="plate.js,js-draw.js,~wizards.js,~place_on_plate.js" styles="plate.css,toolbar.css" />
6396 23 Jan 14 nicklas 130   <base:body>
6396 23 Jan 14 nicklas 131     <div id="canvas" style="position: absolute; z-index: 99;"></div>
6396 23 Jan 14 nicklas 132     <h1>Place biomaterial on plate <base:help helpid="bioplateevent.place-on-plate" /></h1>
5527 13 Dec 10 nicklas 133     
6396 23 Jan 14 nicklas 134     <div id="page-data" class="datacontainer"
6396 23 Jan 14 nicklas 135       data-protocol-type="<%=protocolType != null ? protocolType.getId() : 0 %>"
6997 03 Nov 15 nicklas 136       data-kit-type="<%=kitType != null ? kitType.getId() : 0 %>"
6396 23 Jan 14 nicklas 137       data-hardware-type="<%=hardwareType != null ? hardwareType.getId() : 0 %>"
6396 23 Jan 14 nicklas 138       data-biomaterial-type="<%=itemType.getValue()%>"
6396 23 Jan 14 nicklas 139       data-common-subtype="<%=commonSubtype != null ? commonSubtype.getId() : 0 %>"
6396 23 Jan 14 nicklas 140     ></div>
5527 13 Dec 10 nicklas 141     
5927 16 Jan 12 nicklas 142     <form name="main" action="index.jsp" method="post">
5528 15 Dec 10 nicklas 143       <input type="hidden" name="ID" value="<%=ID%>">
5528 15 Dec 10 nicklas 144       <input type="hidden" name="cmd" value="PlaceOnPlate">
5528 15 Dec 10 nicklas 145       <input type="hidden" name="itemType" value="<%=itemType.name()%>">
5528 15 Dec 10 nicklas 146       <input type="hidden" name="plate_id" value="">
5528 15 Dec 10 nicklas 147       <input type="hidden" name="rows" value="">
5528 15 Dec 10 nicklas 148       <input type="hidden" name="columns" value="">
5927 16 Jan 12 nicklas 149     
5927 16 Jan 12 nicklas 150     <div class="content">
5528 15 Dec 10 nicklas 151     <%
5528 15 Dec 10 nicklas 152     if (bioMaterial.size() == 0)
5528 15 Dec 10 nicklas 153     {
5528 15 Dec 10 nicklas 154       %>
6611 20 Nov 14 nicklas 155       <div class="absolutefull bg-filled-50 bottomborder">
5927 16 Jan 12 nicklas 156       <div class="messagecontainer error">
5528 15 Dec 10 nicklas 157       No biomaterial selected. Please close this window and select one or more items that
5528 15 Dec 10 nicklas 158       are not already placed on a plate.
5528 15 Dec 10 nicklas 159       </div>
6611 20 Nov 14 nicklas 160       </div>
5528 15 Dec 10 nicklas 161       <%
5528 15 Dec 10 nicklas 162     }
5528 15 Dec 10 nicklas 163     else
5528 15 Dec 10 nicklas 164     {
5528 15 Dec 10 nicklas 165       %>
6997 03 Nov 15 nicklas 166       <div class="absolutefull" style="height: 12em;">
6611 20 Nov 14 nicklas 167         <div class="absolutefull" style="width: 50%; bottom: 2em;">
6611 20 Nov 14 nicklas 168           <table class="fullform input100 smaller">
5536 21 Dec 10 nicklas 169           <tr>
6611 20 Nov 14 nicklas 170             <th>Event name</th>
6611 20 Nov 14 nicklas 171             <td><input class="text required" type="text" name="name" 
6611 20 Nov 14 nicklas 172               value="Place biomaterial on plate" 
6611 20 Nov 14 nicklas 173               maxlength="<%=BioPlateEvent.MAX_NAME_LENGTH%>"></td>
6611 20 Nov 14 nicklas 174           </tr>
6611 20 Nov 14 nicklas 175           <tr>
6611 20 Nov 14 nicklas 176             <th>Event date</th>
6611 20 Nov 14 nicklas 177             <td>
6611 20 Nov 14 nicklas 178               <input class="text" type="text" name="event_date" id="event_date" style="width: 15em;"
6611 20 Nov 14 nicklas 179                 value="<%=HTML.encodeTags(dateFormatter.format(new Date()))%>" 
6611 20 Nov 14 nicklas 180                 maxlength="20" title="Enter date in format: <%=htmlDateFormat%>">
6611 20 Nov 14 nicklas 181               <base:calendar textarea="event_date" title="Event date" />
5536 21 Dec 10 nicklas 182             </td>
6611 20 Nov 14 nicklas 183           </tr>
6611 20 Nov 14 nicklas 184           <tr>
6611 20 Nov 14 nicklas 185             <th>Protocol</th>
6611 20 Nov 14 nicklas 186             <td>
6611 20 Nov 14 nicklas 187               <base:select 
6611 20 Nov 14 nicklas 188                 id="protocol_id"
6611 20 Nov 14 nicklas 189                 clazz="selectionlist"
6611 20 Nov 14 nicklas 190                 required="false"
6611 20 Nov 14 nicklas 191                 current="<%=null%>"
6611 20 Nov 14 nicklas 192                 recent="<%=recentProtocols%>"
6611 20 Nov 14 nicklas 193               />
5536 21 Dec 10 nicklas 194             </td>
6611 20 Nov 14 nicklas 195           </tr>
6611 20 Nov 14 nicklas 196           <tr>
6997 03 Nov 15 nicklas 197             <th>Kit</th>
6997 03 Nov 15 nicklas 198             <td>
6997 03 Nov 15 nicklas 199               <base:select 
6997 03 Nov 15 nicklas 200                 id="kit_id"
6997 03 Nov 15 nicklas 201                 clazz="selectionlist"
6997 03 Nov 15 nicklas 202                 required="false"
6997 03 Nov 15 nicklas 203                 current="<%=null%>"
6997 03 Nov 15 nicklas 204                 recent="<%=recentKits%>"
6997 03 Nov 15 nicklas 205               />
6997 03 Nov 15 nicklas 206             </td>
6997 03 Nov 15 nicklas 207           </tr>
6997 03 Nov 15 nicklas 208           <tr>
6611 20 Nov 14 nicklas 209             <th>Hardware</th>
6611 20 Nov 14 nicklas 210             <td>
6611 20 Nov 14 nicklas 211               <base:select 
6611 20 Nov 14 nicklas 212                 id="hardware_id"
6611 20 Nov 14 nicklas 213                 clazz="selectionlist"
6611 20 Nov 14 nicklas 214                 required="false"
6611 20 Nov 14 nicklas 215                 current="<%=null%>"
6611 20 Nov 14 nicklas 216                 recent="<%=recentHardware%>"
6611 20 Nov 14 nicklas 217               />
6611 20 Nov 14 nicklas 218             </td>
6611 20 Nov 14 nicklas 219           </tr>
5536 21 Dec 10 nicklas 220           </table>
6611 20 Nov 14 nicklas 221         </div>
6611 20 Nov 14 nicklas 222         <div class="absolutefull" style="left: 50%; width: 50%;">
6611 20 Nov 14 nicklas 223           <table style="width: 100%;">
6611 20 Nov 14 nicklas 224           <tr>
6611 20 Nov 14 nicklas 225             <td><b>Description</b><br>
6611 20 Nov 14 nicklas 226               <textarea class="text" rows="4" name="description" id="description" style="width: calc(100% - 10px);"
6611 20 Nov 14 nicklas 227               ></textarea></td>
6611 20 Nov 14 nicklas 228             <td style="width: 20px;">
6611 20 Nov 14 nicklas 229               <base:zoom textarea="description" title="Description" />
6611 20 Nov 14 nicklas 230             </td>
6611 20 Nov 14 nicklas 231           </tr>
6611 20 Nov 14 nicklas 232           </table>
6611 20 Nov 14 nicklas 233         </div>
6611 20 Nov 14 nicklas 234         <div class="absolutefull" style="top: auto; height: 2em;">
6611 20 Nov 14 nicklas 235           <tbl:toolbar id="toolbar.mappings" subclass="topborder bottomborder bg-filled-50" style="height: 100%;">
6396 23 Jan 14 nicklas 236             <tbl:button 
6176 19 Oct 12 nicklas 237               id="btnSelectPlate"
6396 23 Jan 14 nicklas 238               title="Select plate&hellip;" 
5927 16 Jan 12 nicklas 239               image="place_on_plate.png" 
5927 16 Jan 12 nicklas 240               tooltip="Select the destination plate"
5927 16 Jan 12 nicklas 241             />
6396 23 Jan 14 nicklas 242             <tbl:button 
6396 23 Jan 14 nicklas 243               id="btnClearMapping"
6396 23 Jan 14 nicklas 244               title="Clear" 
5927 16 Jan 12 nicklas 245               image="cancel.png" 
5927 16 Jan 12 nicklas 246               tooltip="Clear all mapped wells"
5927 16 Jan 12 nicklas 247             />
6396 23 Jan 14 nicklas 248             <tbl:button 
6396 23 Jan 14 nicklas 249               id="btnPlaceByRow"
6396 23 Jan 14 nicklas 250               title="Place by row" 
5927 16 Jan 12 nicklas 251               image="place_by_row.png" 
5927 16 Jan 12 nicklas 252               tooltip="Place remaining items; start with rows"
5927 16 Jan 12 nicklas 253             />
6396 23 Jan 14 nicklas 254             <tbl:button 
6396 23 Jan 14 nicklas 255               id="btnPlaceByColumn"
6396 23 Jan 14 nicklas 256               title="Place by column" 
5927 16 Jan 12 nicklas 257               image="place_by_column.png" 
5927 16 Jan 12 nicklas 258               tooltip="Place remaining items; start with columns"
5927 16 Jan 12 nicklas 259             />
5927 16 Jan 12 nicklas 260           </tbl:toolbar>
6611 20 Nov 14 nicklas 261         </div>
5927 16 Jan 12 nicklas 262       </div>
5536 21 Dec 10 nicklas 263       
6997 03 Nov 15 nicklas 264       <div class="absolutefull bottomborder" style="top: 12em;">
5927 16 Jan 12 nicklas 265         <div class="absolutefull rightborder" style="width: 280px;">
6611 20 Nov 14 nicklas 266           <div class="absolutefull bg-filled-100" style="height: 2em;">
5927 16 Jan 12 nicklas 267             <div class="padded">
5927 16 Jan 12 nicklas 268             <b>Items to place</b> <%=commonSubtype != null ? "<span class=\"itemsubtype\">[" + HTML.encodeTags(commonSubtype.getName()) + "]</span>" : "" %>
5927 16 Jan 12 nicklas 269             </div>
5540 13 Jan 11 nicklas 270           </div>
5927 16 Jan 12 nicklas 271
5927 16 Jan 12 nicklas 272           <div id="itemlist" class="absolutefull biomateriallist topborder" 
6396 23 Jan 14 nicklas 273             style="top: 2em; bottom: 2em;">
6611 20 Nov 14 nicklas 274               <table style="width: 100%; height: 100%; border-collapse: separate;">
5927 16 Jan 12 nicklas 275               <%
5927 16 Jan 12 nicklas 276               for (MeasuredBioMaterial bm : bioMaterial)
5927 16 Jan 12 nicklas 277               {
5927 16 Jan 12 nicklas 278                 String itemId = Integer.toString(bm.getId());
5927 16 Jan 12 nicklas 279                 String fullLabel = bm.getName();
5927 16 Jan 12 nicklas 280                 String label = Values.trimString(fullLabel, 30);
5927 16 Jan 12 nicklas 281                 %>
6396 23 Jan 14 nicklas 282                 <tr id="itemlist.<%=itemId%>" class="item" 
6396 23 Jan 14 nicklas 283                   data-item-id="<%=itemId %>"
6396 23 Jan 14 nicklas 284                   data-name="<%=HTML.encodeTags(bm.getName()) %>"
6396 23 Jan 14 nicklas 285                   style="height: 1.5em;" title="<%=fullLabel == label ? "" : HTML.encodeTags(fullLabel)%>"
6396 23 Jan 14 nicklas 286                   >
6611 20 Nov 14 nicklas 287                   <td class="info bg-filled-100" id="itemlist.<%=itemId%>.info"></td>
6611 20 Nov 14 nicklas 288                   <td class="label interactable" id="itemlist.<%=itemId%>.label"><%=HTML.encodeTags(label)%></td>
5927 16 Jan 12 nicklas 289                 </tr>
5927 16 Jan 12 nicklas 290                 <%
5927 16 Jan 12 nicklas 291               }
5927 16 Jan 12 nicklas 292               %>
5927 16 Jan 12 nicklas 293               <tr style="height: auto;" class="item">
5927 16 Jan 12 nicklas 294                 <td class="info"></td>
5927 16 Jan 12 nicklas 295                 <td></td>
5927 16 Jan 12 nicklas 296               </tr>
5927 16 Jan 12 nicklas 297               </table>
5927 16 Jan 12 nicklas 298           </div>
6611 20 Nov 14 nicklas 299           <div class="absolutefull bg-filled-100 topborder" style="top: auto; height: 2em;">
5927 16 Jan 12 nicklas 300               <input type="checkbox" name="autoSelectUnmappedItem" id="autoSelectUnmappedItem"
5927 16 Jan 12 nicklas 301                 <%=autoSelectUnmappedItem ? "checked" : ""%> value="1"><label for="autoSelectUnmappedItem">Auto-select next unmapped item</label>
5927 16 Jan 12 nicklas 302           </div>
5927 16 Jan 12 nicklas 303         </div>
5927 16 Jan 12 nicklas 304         <div class="absolutefull" style="left: 280px;">
6611 20 Nov 14 nicklas 305           <div class="absolutefull bg-filled-100" style="height: 2em;">
5927 16 Jan 12 nicklas 306             <div class="padded">
5540 13 Jan 11 nicklas 307             <b>Destination plate:</b> <span id="plate.name"><i>no plate selected</i></span>
5927 16 Jan 12 nicklas 308             </div>
5927 16 Jan 12 nicklas 309           </div>
5927 16 Jan 12 nicklas 310           <div class="absolutefull topborder" style="top: 2em;">
5927 16 Jan 12 nicklas 311             <table style="margin: auto; height: 100%;"><tr><td>
5540 13 Jan 11 nicklas 312             <div id="plate"></div>
5927 16 Jan 12 nicklas 313             </td></tr></table>
5528 15 Dec 10 nicklas 314           </div>
5927 16 Jan 12 nicklas 315         </div>
5927 16 Jan 12 nicklas 316       </div>
5528 15 Dec 10 nicklas 317       <%
5528 15 Dec 10 nicklas 318     }
5528 15 Dec 10 nicklas 319     %>
5927 16 Jan 12 nicklas 320   </div>
5927 16 Jan 12 nicklas 321   </form>
5527 13 Dec 10 nicklas 322     
5927 16 Jan 12 nicklas 323   <base:buttongroup subclass="dialogbuttons">
6396 23 Jan 14 nicklas 324     <base:button id="btnSave" disabled="<%=bioMaterial.size() == 0 %>" title="Save" />
6396 23 Jan 14 nicklas 325     <base:button id="close" title="Cancel" />
5927 16 Jan 12 nicklas 326   </base:buttongroup>
5927 16 Jan 12 nicklas 327     
5527 13 Dec 10 nicklas 328   </base:body>
5527 13 Dec 10 nicklas 329   </base:page>
5527 13 Dec 10 nicklas 330   <%
5527 13 Dec 10 nicklas 331 }
5527 13 Dec 10 nicklas 332 finally
5527 13 Dec 10 nicklas 333 {
5527 13 Dec 10 nicklas 334   if (dc != null) dc.close();
5527 13 Dec 10 nicklas 335 }
5527 13 Dec 10 nicklas 336 %>