extensions/net.sf.basedb.meludi/trunk/resources/libprep/libprep_protocol2.jsp

Code
Comments
Other
Rev Date Author Line
3449 28 Jul 15 olle 1 <%@ page
3449 28 Jul 15 olle 2   pageEncoding="UTF-8"
3449 28 Jul 15 olle 3   session="false"
3449 28 Jul 15 olle 4   import="net.sf.basedb.core.User"
3449 28 Jul 15 olle 5   import="net.sf.basedb.core.DbControl"
3449 28 Jul 15 olle 6   import="net.sf.basedb.core.SessionControl"
3449 28 Jul 15 olle 7   import="net.sf.basedb.core.Application"
3449 28 Jul 15 olle 8   import="net.sf.basedb.core.Extract"
3449 28 Jul 15 olle 9   import="net.sf.basedb.core.BioMaterial"
3449 28 Jul 15 olle 10   import="net.sf.basedb.core.MeasuredBioMaterial"
3449 28 Jul 15 olle 11   import="net.sf.basedb.core.BioMaterialEventSource"
3449 28 Jul 15 olle 12   import="net.sf.basedb.core.BioPlate"
3449 28 Jul 15 olle 13   import="net.sf.basedb.core.BioWell"
3449 28 Jul 15 olle 14   import="net.sf.basedb.core.PermissionDeniedException"
3449 28 Jul 15 olle 15   import="net.sf.basedb.core.ItemQuery"
3449 28 Jul 15 olle 16   import="net.sf.basedb.core.query.Restrictions"
3449 28 Jul 15 olle 17   import="net.sf.basedb.core.query.Hql"
3449 28 Jul 15 olle 18   import="net.sf.basedb.util.Values"
3449 28 Jul 15 olle 19   import="net.sf.basedb.util.formatter.WellCoordinateFormatter"
3449 28 Jul 15 olle 20   import="net.sf.basedb.util.extensions.Extension"
3449 28 Jul 15 olle 21   import="net.sf.basedb.clients.web.Base"  
3449 28 Jul 15 olle 22   import="net.sf.basedb.clients.web.util.HTML"
3449 28 Jul 15 olle 23   import="net.sf.basedb.clients.web.extensions.ExtensionsControl"
3449 28 Jul 15 olle 24   import="java.util.List"
3449 28 Jul 15 olle 25   import="java.util.ArrayList"
3449 28 Jul 15 olle 26 %>
3449 28 Jul 15 olle 27 <%@ taglib prefix="base" uri="/WEB-INF/base.tld" %>
3449 28 Jul 15 olle 28 <%
3449 28 Jul 15 olle 29 final SessionControl sc = Base.getExistingSessionControl(request, true);
3449 28 Jul 15 olle 30 final String ID = sc.getId();
3449 28 Jul 15 olle 31 final String home = ExtensionsControl.getHomeUrl("net.sf.basedb.meludi");
3449 28 Jul 15 olle 32 final String root = request.getContextPath();
3449 28 Jul 15 olle 33 DbControl dc = null;
3449 28 Jul 15 olle 34 try
3449 28 Jul 15 olle 35 {
3449 28 Jul 15 olle 36   dc = sc.newDbControl();
3449 28 Jul 15 olle 37   final Extension meludi = ExtensionsControl.get(dc).getExtension("net.sf.basedb.meludi");
3449 28 Jul 15 olle 38   final User user = User.getById(dc, sc.getLoggedInUserId());
3449 28 Jul 15 olle 39   int libPlateId = Values.getInt(request.getParameter("bioplate"));
3449 28 Jul 15 olle 40   String poolSchema = request.getParameter("poolSchema");
3449 28 Jul 15 olle 41   String barcodeVariant = request.getParameter("barcodeVariant");
3449 28 Jul 15 olle 42   
3449 28 Jul 15 olle 43   BioPlate plate = BioPlate.getById(dc, libPlateId);
3449 28 Jul 15 olle 44   int columns = plate.getColumns();
3449 28 Jul 15 olle 45   int rows = plate.getRows();
3449 28 Jul 15 olle 46   String view = Values.getString(request.getParameter("view"), "list");
3449 28 Jul 15 olle 47   String title = "Lab protocol for " + HTML.encodeTags(plate.getName()) + " - " + (view.equals("list") ? "list" : "table");
3449 28 Jul 15 olle 48 %>
3449 28 Jul 15 olle 49 <base:page id="protocol" type="iframe" favicon="<%=home+"/images/libprep.png"%>" title="<%=title%>" noskin="true">
3449 28 Jul 15 olle 50 <base:head
3449 28 Jul 15 olle 51   scripts="~../meludi-2.js,~pools.js,~plate.js,~libprep_protocol.js" 
3449 28 Jul 15 olle 52   styles="~../css/meludi-2.css,~../css/printable.css,~../css/plate.css"
3449 28 Jul 15 olle 53   >
3449 28 Jul 15 olle 54   <style>
3449 28 Jul 15 olle 55   table.protocolheader
3449 28 Jul 15 olle 56   {
3449 28 Jul 15 olle 57     width: 100%;
3449 28 Jul 15 olle 58     border: 1px solid #000000;
3449 28 Jul 15 olle 59     margin-bottom: 1em;
3449 28 Jul 15 olle 60     border-collapse: collapse;
3449 28 Jul 15 olle 61   }
3449 28 Jul 15 olle 62
3449 28 Jul 15 olle 63   table.protocolheader > tbody > tr
3449 28 Jul 15 olle 64   {
3449 28 Jul 15 olle 65     vertical-align: top;
3449 28 Jul 15 olle 66     height: 1.25em;
3449 28 Jul 15 olle 67   }
3449 28 Jul 15 olle 68
3449 28 Jul 15 olle 69   table.protocolheader > tbody > tr > th
3449 28 Jul 15 olle 70   {
3449 28 Jul 15 olle 71     text-align: left;
3449 28 Jul 15 olle 72     font-size: 1em;
3449 28 Jul 15 olle 73     background-color: #F0F0F0;
3449 28 Jul 15 olle 74     padding: 2px;
3449 28 Jul 15 olle 75   }
3449 28 Jul 15 olle 76   
3449 28 Jul 15 olle 77   table.protocolheader > tbody > tr > td
3449 28 Jul 15 olle 78   {
3449 28 Jul 15 olle 79     text-align: left;
3449 28 Jul 15 olle 80     font-size: 1em;
3449 28 Jul 15 olle 81     padding: 2px;
3449 28 Jul 15 olle 82   }
3449 28 Jul 15 olle 83   
3449 28 Jul 15 olle 84   #listview
3449 28 Jul 15 olle 85   {
3449 28 Jul 15 olle 86     width: 100%;
3449 28 Jul 15 olle 87     font-size: 85%;
3449 28 Jul 15 olle 88     border-collapse: collapse;
3449 28 Jul 15 olle 89     border: 1px solid #000000;
3449 28 Jul 15 olle 90   }
3449 28 Jul 15 olle 91   
3449 28 Jul 15 olle 92   #listview tr.evencol
3449 28 Jul 15 olle 93   {
3449 28 Jul 15 olle 94     background-color: #F0F0F0;
3449 28 Jul 15 olle 95   }
3449 28 Jul 15 olle 96   
3449 28 Jul 15 olle 97   #listview thead
3449 28 Jul 15 olle 98   {
3449 28 Jul 15 olle 99     border: 1px solid #000000;
3449 28 Jul 15 olle 100     background-color: #F0F0F0;
3449 28 Jul 15 olle 101   }
3449 28 Jul 15 olle 102   
3449 28 Jul 15 olle 103   #listview tbody
3449 28 Jul 15 olle 104   {
3449 28 Jul 15 olle 105     page-break-inside: avoid;
3449 28 Jul 15 olle 106     border-top: 1px solid #000000;
3449 28 Jul 15 olle 107     border-bottom: 1px solid #000000;
3449 28 Jul 15 olle 108   }
3449 28 Jul 15 olle 109   
3449 28 Jul 15 olle 110   #listview th
3449 28 Jul 15 olle 111   {
3449 28 Jul 15 olle 112     border-left: 1px solid #000000;
3449 28 Jul 15 olle 113   }
3449 28 Jul 15 olle 114   
3449 28 Jul 15 olle 115   #listview td
3449 28 Jul 15 olle 116   {
3449 28 Jul 15 olle 117     border-left: 1px solid #000000;
3449 28 Jul 15 olle 118     border-top: 1px dotted #666666;
3449 28 Jul 15 olle 119     vertical-align: middle;
3449 28 Jul 15 olle 120   }
3449 28 Jul 15 olle 121   
3449 28 Jul 15 olle 122   #listview .col-num
3449 28 Jul 15 olle 123   {
3449 28 Jul 15 olle 124     width: 1.75em;
3449 28 Jul 15 olle 125     text-align: center;
3449 28 Jul 15 olle 126     font-size: 125%;
3449 28 Jul 15 olle 127     font-weight: bold;
3449 28 Jul 15 olle 128     vertical-align: top;
3449 28 Jul 15 olle 129   }
3449 28 Jul 15 olle 130   
3449 28 Jul 15 olle 131   #listview .lib
3449 28 Jul 15 olle 132   {
3449 28 Jul 15 olle 133     width: 15em;
3449 28 Jul 15 olle 134     text-align: center;
3449 28 Jul 15 olle 135   }
3449 28 Jul 15 olle 136   
3449 28 Jul 15 olle 137   #listview .empty .lib
3449 28 Jul 15 olle 138   {
3449 28 Jul 15 olle 139     font-style: italic;
3449 28 Jul 15 olle 140     color: #666666;
3449 28 Jul 15 olle 141     text-align: center;
3449 28 Jul 15 olle 142   }
3449 28 Jul 15 olle 143   
3449 28 Jul 15 olle 144   #listview .workplate, #listview .barcode
3449 28 Jul 15 olle 145   {
3449 28 Jul 15 olle 146     width: 7em;
3449 28 Jul 15 olle 147     text-align: center;
3449 28 Jul 15 olle 148   }
3449 28 Jul 15 olle 149   #listview .remarks
3449 28 Jul 15 olle 150   {
3449 28 Jul 15 olle 151     vertical-align: top;
3449 28 Jul 15 olle 152     padding-left: 0.25em;
3449 28 Jul 15 olle 153   }
3449 28 Jul 15 olle 154   
3449 28 Jul 15 olle 155   /* Divide the 12 wells across the full page */
3449 28 Jul 15 olle 156   #plateview .well
3449 28 Jul 15 olle 157   {
3449 28 Jul 15 olle 158     width: 8.2%;
3449 28 Jul 15 olle 159     max-width: 8.2%;
3449 28 Jul 15 olle 160     min-width: 8.2%;
3449 28 Jul 15 olle 161     padding: 4px;
3449 28 Jul 15 olle 162   }
3449 28 Jul 15 olle 163   
3449 28 Jul 15 olle 164   #plateview .well:hover
3449 28 Jul 15 olle 165   {
3449 28 Jul 15 olle 166     padding: 3px;
3449 28 Jul 15 olle 167   }
3449 28 Jul 15 olle 168     
3449 28 Jul 15 olle 169   #plateview .rowheader
3449 28 Jul 15 olle 170   {
3449 28 Jul 15 olle 171     width: 2em;
3449 28 Jul 15 olle 172   }
3449 28 Jul 15 olle 173   
3449 28 Jul 15 olle 174   #plateview .lib
3449 28 Jul 15 olle 175   {
3449 28 Jul 15 olle 176     font-weight: bold;
3449 28 Jul 15 olle 177     margin-bottom: 0.25em;
3449 28 Jul 15 olle 178   }
3449 28 Jul 15 olle 179   #plateview .remarks
3449 28 Jul 15 olle 180   {
3449 28 Jul 15 olle 181     color: #C80000;
3449 28 Jul 15 olle 182     font-style: italic;
3449 28 Jul 15 olle 183   }
3449 28 Jul 15 olle 184   
3449 28 Jul 15 olle 185   #plateview .well.primary.empty
3449 28 Jul 15 olle 186   {
3449 28 Jul 15 olle 187     background-color: #FFFFFF;
3449 28 Jul 15 olle 188   }
3449 28 Jul 15 olle 189   
3449 28 Jul 15 olle 190   </style>
3449 28 Jul 15 olle 191 </base:head>
3449 28 Jul 15 olle 192 <base:body>
3449 28 Jul 15 olle 193   <div class="paper <%=view.equals("list") ? "" : "landscape"%>">
3449 28 Jul 15 olle 194
3449 28 Jul 15 olle 195   <form name="meludi" id="wizard">
3449 28 Jul 15 olle 196   
3449 28 Jul 15 olle 197   <div id="page-data" class="datacontainer"
3449 28 Jul 15 olle 198     data-view="<%=view%>"
3449 28 Jul 15 olle 199     data-libplate="<%=libPlateId%>"
3449 28 Jul 15 olle 200     data-schema="<%=poolSchema%>"
3449 28 Jul 15 olle 201     data-barcode-variant="<%=barcodeVariant%>"
3449 28 Jul 15 olle 202     data-rows="<%=rows%>"
3449 28 Jul 15 olle 203     data-columns="<%=columns%>"
3449 28 Jul 15 olle 204   ></div>
3449 28 Jul 15 olle 205
3449 28 Jul 15 olle 206   <div id="wizard-status"></div>
3449 28 Jul 15 olle 207
3449 28 Jul 15 olle 208   <div id="all-protocol" style="display: none;">
3449 28 Jul 15 olle 209
3449 28 Jul 15 olle 210   <div id="print-instructions" class="noprint fullwidth">
3449 28 Jul 15 olle 211     <base:button id="print-button" image="<%=home+"/images/print.png"%>" title="Print&hellip;" />
3449 28 Jul 15 olle 212     <span id="printNote">
3449 28 Jul 15 olle 213     <b>Note!</b> 
3449 28 Jul 15 olle 214     <%
3449 28 Jul 15 olle 215     if (view.equals("list"))
3449 28 Jul 15 olle 216     {
3449 28 Jul 15 olle 217       %>
3449 28 Jul 15 olle 218       For better printing reduce margins to about <i>5mm</i> and set page orientation
3449 28 Jul 15 olle 219       to <i>portrait</i>. To fit everything on a single page, scale down to <i>60-70%</i>.
3449 28 Jul 15 olle 220       <%
3449 28 Jul 15 olle 221     }
3449 28 Jul 15 olle 222     else
3449 28 Jul 15 olle 223     {
3449 28 Jul 15 olle 224       %>
3449 28 Jul 15 olle 225       For better printing reduce margins to about <i>5mm</i> and set page orientation
3449 28 Jul 15 olle 226       to <i>landscape</i>. The recommended scale is <i>100%</i>.
3449 28 Jul 15 olle 227       <%
3449 28 Jul 15 olle 228     }
3449 28 Jul 15 olle 229     %>
3449 28 Jul 15 olle 230     </span>
3449 28 Jul 15 olle 231     <br clear="all">
3449 28 Jul 15 olle 232   </div>
3449 28 Jul 15 olle 233
3449 28 Jul 15 olle 234   
3449 28 Jul 15 olle 235   <h1>Lab protocol for library preparation <span class="meludi">MeLuDI <%=meludi.getAbout().getVersion() %></span></h1>
3449 28 Jul 15 olle 236
3449 28 Jul 15 olle 237   <table style="width: 100%;" class="protocolheader">
3449 28 Jul 15 olle 238   <tr style="border-bottom: 1px solid #000000;">
3449 28 Jul 15 olle 239     <th style="width: 15%;">Work plate</th>
3449 28 Jul 15 olle 240     <td style="width: 30%; border-right: 1px solid #000000;"><%=HTML.encodeTags(plate.getName())%></td>
3449 28 Jul 15 olle 241     <th style="width: 15%;">LibPrep</th>
3449 28 Jul 15 olle 242     <th style="width: 20%;">Date</th>
3449 28 Jul 15 olle 243     <th style="width: 20%;">Operator</th>
3449 28 Jul 15 olle 244   </tr>
3449 28 Jul 15 olle 245   <tr>
3449 28 Jul 15 olle 246     <td rowspan="2" colspan="2" style="width: 50%; border-right: 1px solid #000000;"><%=HTML.niceFormat(plate.getDescription()) %></td>
3449 28 Jul 15 olle 247     <td style="border-right: 1px solid #000000;">Amplification</td>
3449 28 Jul 15 olle 248     <td style="border-right: 1px solid #000000;"></td>
3449 28 Jul 15 olle 249     <td></td>
3449 28 Jul 15 olle 250   </tr>
3449 28 Jul 15 olle 251   <tr style="border-top: 1px solid #CCCCCC;">
3449 28 Jul 15 olle 252     <td style="border-right: 1px solid #000000;">Cleanup</td>
3449 28 Jul 15 olle 253     <td style="border-right: 1px solid #000000;"></td>
3449 28 Jul 15 olle 254     <td></td>
3449 28 Jul 15 olle 255   </tr>
3449 28 Jul 15 olle 256   </table>
3449 28 Jul 15 olle 257
3449 28 Jul 15 olle 258   <%
3449 28 Jul 15 olle 259   if (view.equals("list"))
3449 28 Jul 15 olle 260   {
3449 28 Jul 15 olle 261     %>
3449 28 Jul 15 olle 262     <div id="listviewcontainer">
3449 28 Jul 15 olle 263     <table style="width: 100%;" id="listview">
3449 28 Jul 15 olle 264     <thead>
3449 28 Jul 15 olle 265       <tr class="toprow">
3449 28 Jul 15 olle 266         <th></th>
3449 28 Jul 15 olle 267         <th class="lib"></th>
3449 28 Jul 15 olle 268         <th class="workplate">Work</th>
3449 28 Jul 15 olle 269         <th class="barcode">TruSeq</th>
3449 28 Jul 15 olle 270         <th></th>
3449 28 Jul 15 olle 271       </tr>
3449 28 Jul 15 olle 272       <tr>
3449 28 Jul 15 olle 273         <th></th>
3449 28 Jul 15 olle 274         <th class="lib">Library</th>
3449 28 Jul 15 olle 275         <th class="workplate">plate</th>
3449 28 Jul 15 olle 276         <th class="barcode">index</th>
3449 28 Jul 15 olle 277         <th>Remarks</th>
3449 28 Jul 15 olle 278       </tr>
3449 28 Jul 15 olle 279     </thead>
3449 28 Jul 15 olle 280     <%
3449 28 Jul 15 olle 281     WellCoordinateFormatter rowF = new WellCoordinateFormatter(true);
3449 28 Jul 15 olle 282     WellCoordinateFormatter colF = new WellCoordinateFormatter(false);
3449 28 Jul 15 olle 283     for (int c = 0; c < columns; ++c)
3449 28 Jul 15 olle 284     {
3449 28 Jul 15 olle 285       String rowClass = c % 2 == 0 ? "evencol" : "oddcol";
3449 28 Jul 15 olle 286       %>
3449 28 Jul 15 olle 287       <tbody>
3449 28 Jul 15 olle 288       <%
3449 28 Jul 15 olle 289       for (int r = 0; r < rows; ++r)
3449 28 Jul 15 olle 290       {
3449 28 Jul 15 olle 291         String idSuffix = c + "." + r;
3449 28 Jul 15 olle 292         %>
3449 28 Jul 15 olle 293         <tr class="<%=rowClass%> empty" id="row.<%=idSuffix%>">
3449 28 Jul 15 olle 294           <%
3449 28 Jul 15 olle 295           if (r == 0)
3449 28 Jul 15 olle 296           {
3449 28 Jul 15 olle 297             %>
3449 28 Jul 15 olle 298             <td id="col.<%=c%>" class="col-num" rowspan="<%=rows%>"><%=c+1%></td>
3449 28 Jul 15 olle 299             <%
3449 28 Jul 15 olle 300           }
3449 28 Jul 15 olle 301           %>
3449 28 Jul 15 olle 302           <td class="lib" id="lib.<%=idSuffix%>">empty</td>
3449 28 Jul 15 olle 303           <td class="workplate"><%=rowF.format(r)+colF.format(c)%></td>
3449 28 Jul 15 olle 304           <td class="barcode" id="barcode.<%=idSuffix%>"></td>
3449 28 Jul 15 olle 305           <td class="remarks" id="remarks.<%=idSuffix%>"></td>
3449 28 Jul 15 olle 306         </tr>
3449 28 Jul 15 olle 307         <%
3449 28 Jul 15 olle 308       }
3449 28 Jul 15 olle 309       %>
3449 28 Jul 15 olle 310       </tbody>
3449 28 Jul 15 olle 311       <%
3449 28 Jul 15 olle 312     }
3449 28 Jul 15 olle 313     %>
3449 28 Jul 15 olle 314     </table>
3449 28 Jul 15 olle 315     </div>
3449 28 Jul 15 olle 316     <%
3449 28 Jul 15 olle 317   }
3449 28 Jul 15 olle 318   else
3449 28 Jul 15 olle 319   {
3449 28 Jul 15 olle 320     %>
3449 28 Jul 15 olle 321     <div id="plateviewcontainer">
3449 28 Jul 15 olle 322     <table class="plate" style="margin: 0em 0 0 0; width: 100%;" id="plateview">
3449 28 Jul 15 olle 323     <%
3449 28 Jul 15 olle 324     WellCoordinateFormatter rowF = new WellCoordinateFormatter(true);
3449 28 Jul 15 olle 325     WellCoordinateFormatter colF = new WellCoordinateFormatter(false);
3449 28 Jul 15 olle 326     %>
3449 28 Jul 15 olle 327     <tr class="header">
3449 28 Jul 15 olle 328       <th></th>
3449 28 Jul 15 olle 329       <%
3449 28 Jul 15 olle 330       for (int c = 0; c < columns; ++c)
3449 28 Jul 15 olle 331       {
3449 28 Jul 15 olle 332         %>
3449 28 Jul 15 olle 333         <th id="col.<%=c%>"><%=colF.format(c)%></th>
3449 28 Jul 15 olle 334         <%
3449 28 Jul 15 olle 335       }
3449 28 Jul 15 olle 336       %>
3449 28 Jul 15 olle 337     </tr>
3449 28 Jul 15 olle 338     <tbody>
3449 28 Jul 15 olle 339     <%
3449 28 Jul 15 olle 340     for (int r = 0; r < rows; ++r)
3449 28 Jul 15 olle 341     {
3449 28 Jul 15 olle 342       String row = rowF.format(r);
3449 28 Jul 15 olle 343       %>
3449 28 Jul 15 olle 344       <tr class="row-<%=r%>">
3449 28 Jul 15 olle 345         <th id="row.<%=r%>" class="rowheader"><%=row%></th>
3449 28 Jul 15 olle 346         <%
3449 28 Jul 15 olle 347         for (int c = 0; c < columns; ++c)
3449 28 Jul 15 olle 348         {
3449 28 Jul 15 olle 349           %>
3449 28 Jul 15 olle 350           <td class="well col-<%=c%>" id="well.<%=r%>.<%=c%>"></td>
3449 28 Jul 15 olle 351           <%
3449 28 Jul 15 olle 352         }
3449 28 Jul 15 olle 353         %>
3449 28 Jul 15 olle 354       </tr>
3449 28 Jul 15 olle 355       <%
3449 28 Jul 15 olle 356     }
3449 28 Jul 15 olle 357     %>
3449 28 Jul 15 olle 358     </tbody>
3449 28 Jul 15 olle 359     <tr id="pool-row">
3449 28 Jul 15 olle 360       <th colspan="13">&nbsp;</th>
3449 28 Jul 15 olle 361     </tr>
3449 28 Jul 15 olle 362     </table>
3449 28 Jul 15 olle 363     </div>
3449 28 Jul 15 olle 364     <%
3449 28 Jul 15 olle 365   }
3449 28 Jul 15 olle 366   %>
3449 28 Jul 15 olle 367 </div>
3449 28 Jul 15 olle 368 </form>
3449 28 Jul 15 olle 369 </div>
3449 28 Jul 15 olle 370 </base:body>
3449 28 Jul 15 olle 371 </base:page>
3449 28 Jul 15 olle 372 <%
3449 28 Jul 15 olle 373 }
3449 28 Jul 15 olle 374 finally
3449 28 Jul 15 olle 375 {
3449 28 Jul 15 olle 376   if (dc != null) dc.close();
3449 28 Jul 15 olle 377 }
3449 28 Jul 15 olle 378 %>