source: extensions/net.sf.basedb.reggie/trunk/resources/index.jsp @ 2063

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

References #501: Generate lab protocol for clustering

Re-organized the lab protocol to make it more similar to the registration wizard. It is now divided into two parts. One for the clustering and one for the sequencing startup.

File size: 21.6 KB
Line 
1<%@ page
2  pageEncoding="UTF-8"
3  session="false"
4  import="net.sf.basedb.core.Application"
5  import="net.sf.basedb.core.User"
6  import="net.sf.basedb.core.Role"
7  import="net.sf.basedb.core.Group"
8  import="net.sf.basedb.core.DbControl"
9  import="net.sf.basedb.core.Item"
10  import="net.sf.basedb.core.Permission"
11  import="net.sf.basedb.core.SessionControl"
12  import="net.sf.basedb.core.SystemItems"
13  import="net.sf.basedb.core.ItemQuery"
14  import="net.sf.basedb.core.query.Expressions"
15  import="net.sf.basedb.core.query.Hql"
16  import="net.sf.basedb.core.query.Restrictions"
17  import="net.sf.basedb.clients.web.Base"
18  import="net.sf.basedb.clients.web.util.HTML"
19  import="net.sf.basedb.clients.web.extensions.ExtensionsControl"
20  import="net.sf.basedb.util.Values"
21  import="java.util.List"
22%>
23<%@ taglib prefix="base" uri="/WEB-INF/base.tld" %>
24<%@ taglib prefix="p" uri="/WEB-INF/path.tld" %>
25<%
26final SessionControl sc = Base.getExistingSessionControl(request, true);
27final String ID = sc.getId();
28final float scale = Base.getScale(sc);
29final String home = ExtensionsControl.getHomeUrl("net.sf.basedb.reggie");
30DbControl dc = null;
31try
32{
33  dc = sc.newDbControl();
34  final User user = User.getById(dc, sc.getLoggedInUserId());
35 
36  boolean isAdmin = user.getId() == SystemItems.getId(User.ROOT);
37  boolean isPatientCurator = false;
38  boolean hasCreateSamplePermission = sc.hasPermission(Permission.CREATE, Item.SAMPLE);
39  boolean hasCreateExtractPermission = sc.hasPermission(Permission.CREATE, Item.EXTRACT);
40  boolean hasCreateBioPlatePermission = sc.hasPermission(Permission.CREATE, Item.BIOPLATE);
41  if (!isAdmin)
42  {
43    try
44    {
45      Role admin = Role.getById(dc, SystemItems.getId(Role.ADMINISTRATOR));
46      isAdmin = sc.isMemberOf(admin);
47    }
48    catch (RuntimeException ex)
49    {}
50  }
51  try
52  {
53    ItemQuery<Group> query = Group.getQuery();
54    query.restrict(Restrictions.eq(Hql.property("name"), Expressions.string("PatientCurator")));
55    List<Group> result = query.list(dc);
56    if (result.size() == 1)
57    {
58      isPatientCurator = sc.isMemberOf(result.get(0));
59    }
60  }
61  catch (RuntimeException ex)
62  {}
63%>
64<base:page type="default" >
65<base:head styles="path.css" scripts="ajax.js">
66  <script language="JavaScript" src="reggie.js" type="text/javascript" charset="UTF-8"></script>
67  <link rel="stylesheet" type="text/css" href="css/reggie.css">
68  <script language="JavaScript">
69 
70  var debug = false;
71 
72  function caseSummary()
73  {
74    var frm = document.forms['reggie'];
75   
76    var caseName = frm.caseName.value;
77    if (!caseName)
78    {
79      alert('Please enter a 7-digit case id');
80      return;
81    }
82    location.href = 'reports/case_summary.jsp?ID=<%=ID%>&caseName='+encodeURIComponent(caseName);
83  }
84 
85  var currentCount;
86  function startCounting(what)
87  {
88    var url;
89    currentCount = what;
90    if (what == 'specimen')
91    {
92      url = 'PartitionRegistration.servlet?ID=<%=ID%>&cmd=CountSpecimenTubes';
93    }
94    else if (what == 'histology-lists')
95    {
96      url = 'Histology.servlet?ID=<%=ID%>&cmd=CountHistologyWorkLists';
97    }
98    else if (what == 'paraffin-blocks')
99    {
100      url = 'Histology.servlet?ID=<%=ID%>&cmd=CountParaffinBlocks';
101    }
102    else if (what == 'paraffin-blocks-without-heglass')
103    {
104      url = 'Histology.servlet?ID=<%=ID%>&cmd=CountParaffinBlocksWithoutHeGlass';
105    }
106    else if (what == 'lysate')
107    {
108      url = 'Extraction.servlet?ID=<%=ID%>&cmd=CountUnprocessedLysates';
109    }
110    else if (what == 'rnaqc')
111    {
112      url = 'RnaQc.servlet?ID=<%=ID%>&cmd=CountRnaExtractsWithoutQc';
113    }
114    else if (what == 'caliper-plates')
115    {
116      url = 'RnaQc.servlet?ID=<%=ID%>&cmd=CountActiveRnaQcBioPlates';
117    }
118    else if (what == 'rna-without-mrna')
119    {
120      url = 'MRna.servlet?ID=<%=ID%>&cmd=CountRnaWithoutMRna';
121    }
122    else if (what == 'mrna-plates')
123    {
124      url = 'MRna.servlet?ID=<%=ID%>&cmd=CountUnprocessedPlates&plateType=MRNA';
125    }
126    else if (what == 'cdna-plates')
127    {
128      url = 'MRna.servlet?ID=<%=ID%>&cmd=CountUnprocessedPlates&plateType=CDNA';
129    }
130    else if (what == 'cdna-plates-for-barcoding')
131    {
132      url = 'LibPrep.servlet?ID=<%=ID%>&cmd=CountCDNAPlatesForBarcoding';
133    }
134    else if (what == 'lib-plates')
135    {
136      url = 'LibPrep.servlet?ID=<%=ID%>&cmd=CountLibPlatesForLibPrep';
137    }
138    else if (what == 'lib-plates-for-pooling')
139    {
140      url = 'Pool.servlet?ID=<%=ID%>&cmd=CountLibraryPlatesForPooling';
141    }
142    else if (what == 'unregistered-pools')
143    {
144      url = 'Pool.servlet?ID=<%=ID%>&cmd=CountUnprocessedPools';
145    }
146    else if (what == 'unused-pools')
147    {
148      url = 'FlowCell.servlet?ID=<%=ID%>&cmd=CountUnusedPools';
149    }
150    else if (what == 'unregistered-flow-cells')
151    {
152      url = 'FlowCell.servlet?ID=<%=ID%>&cmd=CountUnprocessedFlowCells';
153    }
154   
155    if (url)
156    {
157      var request = Main.getAjaxRequest();
158      request.open("GET", url, false);
159      Ajax.setReadyStateHandler(request, onCounted, onCounted);
160      request.send(null);
161    }
162  }
163 
164  function onCounted(request)
165  {
166    if (debug) Main.debug(currentCount +': ' + Main.encodeTags(request.responseText));
167    var response;
168    var error = false;
169    try
170    {
171      response = JSON.parse(request.responseText);
172      if (response.status != 'ok')
173      {
174        error = response.message || response.stacktrace || 'Unexpected error';
175      }
176    }
177    catch (ex)
178    {
179      error = ex;
180    }
181   
182    if (currentCount == 'specimen')
183    {
184      var msg = error || 'Number of unpartitioned specimen';
185      var count = error ? -1 : response.count;
186      setCount('count.specimen', count, 'specimens', msg);
187      startCounting('histology-lists');
188    }
189    else if (currentCount == 'histology-lists')
190    {
191      var msg = error || 'Number of active histology work lists';
192      var count = error ? -1 : response.count;
193      setCount('count.histology-lists', count, 'work lists', msg);
194      startCounting('paraffin-blocks');
195    }
196    else if (currentCount == 'paraffin-blocks')
197    {
198      var msg = error || 'Number of paraffin blocks waiting for registration';
199      var count = error ? -1 : response.count;
200      setCount('count.paraffin-blocks', count, 'paraffin blocks', msg);
201      startCounting('paraffin-blocks-without-heglass');
202    }
203    else if (currentCount == 'paraffin-blocks-without-heglass')
204    {
205      var msg = error || 'Number of paraffin blocks without HE glass';
206      var count = error ? -1 : response.count;
207      setCount('count.paraffin-blocks-without-heglass', count, 'paraffin blocks', msg);
208      startCounting('lysate');
209    }
210    else if (currentCount == 'lysate')
211    {
212      var msg = error || 'Number of unprocessed lysates';
213      var count = error ? -1 : response.count;
214      setCount('count.lysate.1', count, 'lysates', msg);
215      setCount('count.lysate.2', count, 'lysates', msg);
216      startCounting('rnaqc');
217    }
218    else if (currentCount == 'rnaqc')
219    {
220      var msg = error || 'Number of RNA waiting for QC';
221      var count = error ? -1 : response.count;
222      setCount('count.rnaqc', count, 'RNA', msg);
223      startCounting('caliper-plates');
224    }
225    else if (currentCount == 'caliper-plates')
226    {
227      var msg = error || 'Number of active Caliper plates';
228      var count = error ? -1 : response.count;
229      setCount('count.caliper-plates.1', count, 'Caliper plates', msg);
230      setCount('count.caliper-plates.2', count, 'Caliper plates', msg);
231      startCounting('rna-without-mrna');
232    }
233    else if (currentCount == 'rna-without-mrna')
234    {
235      var msg = error || 'Number of RNA with no mRNA';
236      var count = error ? -1 : response.count;
237      setCount('count.rna-without-mrna', count, 'RNA', msg);
238      startCounting('mrna-plates');
239    }
240    else if (currentCount == 'mrna-plates')
241    {
242      var msg = error || 'Number of mRNA plates waiting for registration';
243      var count = error ? -1 : response.count;
244      setCount('count.mrna-plates.1', count, 'mRNA plates', msg);
245      setCount('count.mrna-plates.2', count, 'mRNA plates', msg);
246      startCounting('cdna-plates');
247    }
248    else if (currentCount == 'cdna-plates')
249    {
250      var msg = error || 'Number of cDNA plates waiting for registration';
251      var count = error ? -1 : response.count;
252      setCount('count.cdna-plates.1', count, 'cDNA plates', msg);
253      startCounting('cdna-plates-for-barcoding');
254    }
255    else if (currentCount == 'cdna-plates-for-barcoding')
256    {
257      var msg = error || 'Number of cDNA plates waiting for barcode layout';
258      var count = error ? -1 : response.count;
259      setCount('count.cdna-plates-for-barcoding', count, 'cDNA plates', msg);
260      startCounting('lib-plates')
261    }
262    else if (currentCount == 'lib-plates')
263    {
264      var msg = error || 'Number of Lib plates waiting for registration';
265      var count = error ? -1 : response.count;
266      setCount('count.lib-plates.1', count, 'Lib plates', msg);
267      setCount('count.lib-plates.2', count, 'Lib plates', msg);
268      setCount('count.lib-plates.3', count, 'Lib plates', msg);
269      startCounting('lib-plates-for-pooling');
270    }
271    else if (currentCount == 'lib-plates-for-pooling')
272    {
273      var msg = error || 'Number of Lib plates waiting for pooling';
274      var count = error ? -1 : response.count;
275      setCount('count.lib-plates-for-pooling', count, 'Lib plates', msg);
276      startCounting('unregistered-pools');
277    }
278    else if (currentCount == 'unregistered-pools')
279    {
280      var msg = error || 'Number of pools waiting for registration';
281      var count = error ? -1 : response.count;
282      setCount('count.pools.1', count, 'pools', msg);
283      setCount('count.pools.2', count, 'pools', msg);
284      startCounting('unused-pools');
285    }
286    else if (currentCount == 'unused-pools')
287    {
288      var msg = error || 'Number of pools waiting for sequencing';
289      var count = error ? -1 : response.count;
290      setCount('count.pools.3', count, 'pools', msg);
291      startCounting('unregistered-flow-cells');
292    }
293    else if (currentCount == 'unregistered-flow-cells')
294    {
295      var msg = error || 'Number of flow cells waiting for registration';
296      var count = error ? -1 : response.count;
297      setCount('count.flow-cells.1', count, 'flow cells', msg);
298      setCount('count.flow-cells.2', count, 'flow cells', msg);
299    }
300   
301  }
302 
303  function setCount(id, count, unit, msg)
304  {
305    var div = document.getElementById(id);
306    div.title = msg;
307    if (count == -1)
308    {
309      div.innerHTML = '(-)';
310    }
311    else
312    {
313      div.innerHTML = '(' + count + ')';
314    }
315  }
316 
317  </script>
318<style>
319dl
320{
321  margin-top: 0px;
322  padding: 3px;
323}
324dt
325{
326  margin-top: 0.5em;
327  margin-left: 0.5em;
328}
329dd
330{
331  margin-left: 0.5em;
332  margin-bottom: 0.5em;
333  padding-left: 3em;
334}
335ul
336{
337  margin-top: 0px;
338  margin-bottom: 0px;
339  margin-left: 0em;
340  padding-left: 0em;
341}
342li
343{
344  margin-left: 0em;
345}
346img
347{
348  vertical-align: text-bottom;
349}
350h3
351{
352  color: #333377;
353  background: #E8E8E8;
354  font-weight: bold;
355  margin-bottom: 0em;
356  padding: 1px 4px 1px 4px;
357  border: 1px solid #A0A0A0;
358  font-size: 1em;
359}
360a.not-implemented
361{
362  filter: url(css/filters.svg#grayscale); /* Firfox, etc */
363  filter: gray; /* IE */
364  opacity: 0.75;
365  pointer-events: none;
366}
367
368a.not-implemented:after
369{
370  content: ' -- coming soon';
371}
372.counter
373{
374  color: #999999;
375  font-style: italic;
376}
377</style>
378</base:head>
379<base:body onload="startCounting('specimen')">
380
381  <p:path><p:pathelement title="Reggie" /></p:path>
382
383  <div class="content">
384    <form name="reggie" onsubmit="return false;">
385    <div class="absolutefull" style="width: 50%;">
386      <div class="absolutefull" style="left: 1em; right: 0.5em; ">
387     
388        <h3>Sample processing wizards</h3>
389        <dl class="leftborder rightborder bottomborder">
390        <%
391        if (hasCreateSamplePermission)
392        {
393          %>
394          <dt>
395            <base:icon image="<%=home+"/images/specimen.png" %>" />
396            <a href="sampleproc/specimentube.jsp?ID=<%=ID%>">Specimen tube registration</a>
397          </dt>
398          <dd>
399            <ul>
400            <li>Register new specimen tubes.
401            <li>Update existing specimen tubes.
402            </ul>
403          </dd>
404          <%
405        }
406        if (hasCreateSamplePermission && hasCreateExtractPermission)
407        {
408          %>
409          <dt>
410            <base:icon image="<%=home+"/images/partition.png" %>" />
411            <a href="sampleproc/partitionform.jsp?ID=<%=ID%>">Partition wizard</a>
412          </dt>
413          <dd>
414            <ul>
415            <li>Register new partitions of existing specimens <span class="counter" id="count.specimen" title="Counting..."><img src="images/loading-small.gif"></span>
416            </ul>
417          </dd>
418          <%
419        }
420        if (hasCreateSamplePermission && hasCreateBioPlatePermission)
421        {
422          %>
423          <dt>
424            <base:icon image="<%=home+"/images/microscope.png" %>" />
425            Histology wizards
426          </dt>
427          <dd>
428            <ul>
429            <li><a href="sampleproc/histology_protocol.jsp?ID=<%=ID%>">Lab tracking protocol for FFPE/HE</a> <span class="counter" id="count.histology-lists" title="Counting..."><img src="images/loading-small.gif"></span>
430            <li><a href="sampleproc/histology_block.jsp?ID=<%=ID%>">Register paraffin blocks</a> <span class="counter" id="count.paraffin-blocks" title="Counting..."><img src="images/loading-small.gif"></span>
431            <li><a href="sampleproc/histology_glass.jsp?ID=<%=ID%>">Register histology HE glass information</a> <span class="counter" id="count.paraffin-blocks-without-heglass" title="Counting..."><img src="images/loading-small.gif"></span>
432            </ul>
433          </dd>
434          <%
435        }
436        if (hasCreateExtractPermission)
437        {
438          %>
439          <dt>
440            <base:icon image="<%=home+"/images/extraction.png" %>" />
441            DNA/RNA extraction wizards
442          </dt>
443          <dd>
444            <ul>
445            <li><a href="sampleproc/allprep_protocol.jsp?ID=<%=ID%>">Lab tracking protocol for Allprep isolation</a> <span class="counter" id="count.lysate.1" title="Counting..."><img src="images/loading-small.gif"></span>
446            <li><a href="sampleproc/extraction_registration.jsp?ID=<%=ID%>">DNA/RNA/FlowThrough registration</a> <span class="counter" id="count.lysate.2" title="Counting..."><img src="images/loading-small.gif"></span>
447            </ul>
448          </dd>
449          <dt>
450            <base:icon image="<%=home+"/images/rnaqc.png" %>" />
451            RNA quality control wizards
452          </dt>
453          <dd>
454            <ul>
455            <li><a href="sampleproc/rnaqc_aliquot.jsp?ID=<%=ID%>">Create aliquots on Bioanalyzer/Caliper plates</a> <span class="counter" id="count.rnaqc" title="Counting..."><img src="images/loading-small.gif"></span>
456            <li><a href="sampleproc/rnaqc_plate_export.jsp?ID=<%=ID%>">Export Caliper sample names and run parameters</a> <span class="counter" id="count.caliper-plates.1" title="Counting..."><img src="images/loading-small.gif"></span>
457            <li><a href="sampleproc/rnaqc_plate_import.jsp?ID=<%=ID%>">Import RQS scores from Caliper well table file</a> <span class="counter" id="count.caliper-plates.2" title="Counting..."><img src="images/loading-small.gif"></span>
458            </ul>
459          </dd>
460          <%
461        }
462        %>       
463        </dl>
464     
465     
466        <h3>Library preparation wizards</h3>
467        <dl class="leftborder rightborder bottomborder">
468        <%
469        if (hasCreateExtractPermission && hasCreateBioPlatePermission)
470        {
471          %>
472          <dt>
473            <base:icon image="<%=home+"/images/pipette.png" %>" />
474            RNA to cDNA wizards
475          </dt>
476          <dd>
477            <ul>
478            <li><a href="libprep/select_rna.jsp?ID=<%=ID%>">Create new mRNA plate</a> <span class="counter" id="count.rna-without-mrna" title="Counting..."><img src="images/loading-small.gif"></span>
479            <li><a href="libprep/mrna_protocol.jsp?ID=<%=ID%>">Lab protocols for mRNA and cDNA preparation</a> <span class="counter" id="count.mrna-plates.1" title="Counting..."><img src="images/loading-small.gif"></span>
480            <li><a href="libprep/mrna_registration.jsp?ID=<%=ID%>">mRNA registration and quality control results</a> <span class="counter" id="count.mrna-plates.2" title="Counting..."><img src="images/loading-small.gif"></span>
481            <li><a href="libprep/cdna_registration.jsp?ID=<%=ID%>">cDNA registration</a> <span class="counter" id="count.cdna-plates.1" title="Counting..."><img src="images/loading-small.gif"></span>
482            </ul>
483          </dd>
484         
485          <dt>
486            <base:icon image="<%=home+"/images/libprep.png" %>" />
487            Library preparation wizards
488          </dt>
489          <dd>
490            <ul>
491            <li><a href="libprep/assign_barcode.jsp?ID=<%=ID%>">Assign barcodes to cDNA plate</a> <span class="counter" id="count.cdna-plates-for-barcoding" title="Counting..."><img src="images/loading-small.gif"></span>
492            <li><a href="libprep/libprep_protocol.jsp?ID=<%=ID%>">Lab protocols and files for library preparation</a> <span class="counter" id="count.lib-plates.1" title="Counting..."><img src="images/loading-small.gif"></span>
493            <li><a href="libprep/libqc_registration.jsp?ID=<%=ID%>">Register quality control results</a> <span class="counter" id="count.lib-plates.2" title="Counting..."><img src="images/loading-small.gif"></span>
494            <li><a href="libprep/lib_registration.jsp?ID=<%=ID%>">Library registration</a> <span class="counter" id="count.lib-plates.3" title="Counting..."><img src="images/loading-small.gif"></span>
495            </ul>
496          </dd>
497          <dt>
498            <base:icon image="<%=home+"/images/flowcell.png" %>" />
499            Pooling and clustering wizards
500          </dt>
501          <dd>
502            <ul>
503            <li><a href="libprep/create_pools.jsp?ID=<%=ID%>">Create pooled libraries</a> <span class="counter" id="count.lib-plates-for-pooling" title="Counting..."><img src="images/loading-small.gif"></span>
504            <li><a href="libprep/pool_protocol.jsp?ID=<%=ID%>">Lab protocols for pooling</a> <span class="counter" id="count.pools.1" title="Counting..."><img src="images/loading-small.gif"></span>
505            <li><a href="libprep/pool_registration.jsp?ID=<%=ID%>">Register pooled libraries</a> <span class="counter" id="count.pools.2" title="Counting..."><img src="images/loading-small.gif"></span>
506            <li><a href="libprep/create_flowcells.jsp?ID=<%=ID%>">Create flow cells</a> <span class="counter" id="count.pools.3" title="Counting..."><img src="images/loading-small.gif"></span>
507            <li><a href="libprep/flowcell_protocol.jsp?ID=<%=ID%>">Lab protocol for clustering and sequencing startup</a> <span class="counter" id="count.flow-cells.1" title="Counting..."><img src="images/loading-small.gif"></span>
508            <li><a href="libprep/flowcell_registration.jsp?ID=<%=ID%>">Register clustering and sequencing startup</a> <span class="counter" id="count.flow-cells.2" title="Counting..."><img src="images/loading-small.gif"></span>
509            </ul>
510          </dd>
511          <%
512        }
513        %>
514        </dl>
515      </div>
516    </div>
517   
518    <div class="absolutefull" style="width: 50%; left: auto;">
519      <div class="absolutefull" style="left: 0.5em; right: 1em;">
520        <%
521        if (isAdmin)
522        {
523          %>
524          <h3>Server administrator wizards</h3>
525          <dl class="leftborder rightborder bottomborder">
526          <dt>
527            <base:icon image="<%=home + "/images/install.png" %>" />
528            <a href="admin/install.jsp?ID=<%=ID%>">Installation wizard</a>
529          </dt>
530          <dd>
531            <ul>
532            <li>Check that annotation types and other items used by Reggie exists in BASE.
533            <li>Create missing items.
534            </ul>
535          </dd>
536          </dl>
537          <%
538        }
539        if (isPatientCurator || isAdmin)
540        {
541          %>
542          <h3>Personal information wizards</h3>
543          <dl class="leftborder rightborder bottomborder">
544          <dt>
545            <base:icon image="<%=home + "/images/personal.png" %>"/>
546            <a href="personal/persinfo.jsp?ID=<%=ID%>">Pathology referral form registration</a>
547          </dt>
548          <dd>
549            <ul>
550            <li>Register new cases and patients.
551            <li>Update existing cases and specimen tubes.
552            </ul>
553          </dd>
554         
555          <dt>
556            <base:icon image="<%=home + "/images/blood.png" %>"/>
557            Blood referral form registration
558          </dt>
559          <dd>
560            <ul>
561            <li><a href="personal/bloodform.jsp?ID=<%=ID%>">Register new/updated blood referral forms and patients</a>
562            <li><a href="personal/bloodfollowupform.jsp?ID=<%=ID%>">Register new/updated follow-up blood referral forms</a>
563            </ul>
564          </dd>
565         
566          <dt>
567            <base:icon image="<%=home+"/images/consent.png" %>"/>
568            <a href="personal/consentform.jsp?ID=<%=ID%>">Consent form registration</a>
569          </dt>
570          <dd>
571            <ul>
572            <li>Register consent forms.
573            </ul>
574          </dd>
575         
576          <dt>
577            <base:icon image="<%=home+"/images/export_import.png" %>" />
578            Export/import information to/from external registers.
579          </dt>
580          <dd>
581            <ul>
582            <li><a href="personal/export_monthly_oplist.jsp?ID=<%=ID%>">Export monthly operation list</a>
583            <li><a href="personal/export_inca.jsp?ID=<%=ID%>">INCA export</a>
584            </ul>
585          </dd>
586          </dl>
587          <%
588        }
589        %>
590       
591        <h3>Statistics and reporting wizards</h3>
592        <dl class="leftborder rightborder bottomborder">
593          <dt>
594            <base:icon image="<%=home+"/images/case_summary.png" %>" />
595            Case summary
596          </dt>
597          <dd>
598            <table>
599            <tr>
600              <td><input type="text" class="text" 
601                name="caseName" title="Please enter a 7-digit case id" 
602                style="width: 25em;"
603                onkeypress="if (event.keyCode==13 && this.value) caseSummary()"></td>
604              <td><base:button title="Go" image="<%=home+"/images/gonext.png"%>" onclick="caseSummary()"/></td>
605            </tr>
606            </table>
607          </dd>
608       
609          <dt>
610            <base:icon image="<%=home+"/images/report.png" %>" />
611            <a href="reports/samplereportgenerator.jsp?ID=<%=ID%>">Sample source report</a>
612          </dt>       
613          <dd>       
614            <ul>
615            <li>Sample count report</li> 
616            <li>Consent count report</li> 
617            <li>Patient count report</li> 
618            <li>Overview report</li> 
619            <li>Missing sample data report</li> 
620            </ul>
621          </dd>
622          <dt>
623            <base:icon image="<%=home+"/images/chart_bar.png" %>" />
624            <a href="reports/scanbquartermonthreportgenerator.jsp?ID=<%=ID%>">Sample processing statistics</a>
625          </dt>       
626          <dd>       
627            <ul>
628            <li>SCAN-B quarter/month report</li> 
629            </ul>
630          </dd>
631        </dl>
632      </div>
633    </div>
634    </form>
635  </div>
636 
637</base:body>
638</base:page>
639<%
640}
641finally
642{
643  if (dc != null) dc.close();
644}
645%>
Note: See TracBrowser for help on using the repository browser.