www/biomaterials/wizards/move_biomaterial.jsp

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