source: extensions/net.sf.basedb.reggie/branches/ticket-489/resources/index.jsp @ 2117

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

References #489: Histology scoring wizard

  • Added 7 new annotations for keeping the scores.
  • Added entry point for the scoring wizard on the Reggie start page.
  • Implemented counting of unscored HE glass
  • Started with method for loading the information that is needed to be able to score a set of HE glass.
File size: 22.1 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 == 'unscored-heglass')
107    {
108      url = 'Histology.servlet?ID=<%=ID%>&cmd=CountUnscoredHeGlass';
109    }
110    else if (what == 'lysate')
111    {
112      url = 'Extraction.servlet?ID=<%=ID%>&cmd=CountUnprocessedLysates';
113    }
114    else if (what == 'rnaqc')
115    {
116      url = 'RnaQc.servlet?ID=<%=ID%>&cmd=CountRnaExtractsWithoutQc';
117    }
118    else if (what == 'caliper-plates')
119    {
120      url = 'RnaQc.servlet?ID=<%=ID%>&cmd=CountActiveRnaQcBioPlates';
121    }
122    else if (what == 'rna-without-mrna')
123    {
124      url = 'MRna.servlet?ID=<%=ID%>&cmd=CountRnaWithoutMRna';
125    }
126    else if (what == 'mrna-plates')
127    {
128      url = 'MRna.servlet?ID=<%=ID%>&cmd=CountUnprocessedPlates&plateType=MRNA';
129    }
130    else if (what == 'cdna-plates')
131    {
132      url = 'MRna.servlet?ID=<%=ID%>&cmd=CountUnprocessedPlates&plateType=CDNA';
133    }
134    else if (what == 'cdna-plates-for-barcoding')
135    {
136      url = 'LibPrep.servlet?ID=<%=ID%>&cmd=CountCDNAPlatesForBarcoding';
137    }
138    else if (what == 'lib-plates')
139    {
140      url = 'LibPrep.servlet?ID=<%=ID%>&cmd=CountLibPlatesForLibPrep';
141    }
142    else if (what == 'lib-plates-for-pooling')
143    {
144      url = 'Pool.servlet?ID=<%=ID%>&cmd=CountLibraryPlatesForPooling';
145    }
146    else if (what == 'unregistered-pools')
147    {
148      url = 'Pool.servlet?ID=<%=ID%>&cmd=CountUnprocessedPools';
149    }
150    else if (what == 'unused-pools')
151    {
152      url = 'FlowCell.servlet?ID=<%=ID%>&cmd=CountUnusedPools';
153    }
154    else if (what == 'unregistered-flow-cells')
155    {
156      url = 'FlowCell.servlet?ID=<%=ID%>&cmd=CountUnprocessedFlowCells';
157    }
158   
159    if (url)
160    {
161      var request = Main.getAjaxRequest();
162      request.open("GET", url, false);
163      Ajax.setReadyStateHandler(request, onCounted, onCounted);
164      request.send(null);
165    }
166  }
167 
168  function onCounted(request)
169  {
170    if (debug) Main.debug(currentCount +': ' + Main.encodeTags(request.responseText));
171    var response;
172    var error = false;
173    try
174    {
175      response = JSON.parse(request.responseText);
176      if (response.status != 'ok')
177      {
178        error = response.message || response.stacktrace || 'Unexpected error';
179      }
180    }
181    catch (ex)
182    {
183      error = ex;
184    }
185   
186    if (currentCount == 'specimen')
187    {
188      var msg = error || 'Number of unpartitioned specimen';
189      var count = error ? -1 : response.count;
190      setCount('count.specimen', count, 'specimens', msg);
191      startCounting('histology-lists');
192    }
193    else if (currentCount == 'histology-lists')
194    {
195      var msg = error || 'Number of active histology work lists';
196      var count = error ? -1 : response.count;
197      setCount('count.histology-lists', count, 'work lists', msg);
198      startCounting('paraffin-blocks');
199    }
200    else if (currentCount == 'paraffin-blocks')
201    {
202      var msg = error || 'Number of paraffin blocks waiting for registration';
203      var count = error ? -1 : response.count;
204      setCount('count.paraffin-blocks', count, 'paraffin blocks', msg);
205      startCounting('paraffin-blocks-without-heglass');
206    }
207    else if (currentCount == 'paraffin-blocks-without-heglass')
208    {
209      var msg = error || 'Number of paraffin blocks without HE glass';
210      var count = error ? -1 : response.count;
211      setCount('count.paraffin-blocks-without-heglass', count, 'paraffin blocks', msg);
212      startCounting('unscored-heglass');
213    }
214    else if (currentCount == 'unscored-heglass')
215    {
216      var msg = error || 'Number of unscored HE glass';
217      var count = error ? -1 : response.count;
218      setCount('count.unscored-heglass', count, 'HE glass', msg);
219      startCounting('lysate');
220    }
221    else if (currentCount == 'lysate')
222    {
223      var msg = error || 'Number of unprocessed lysates';
224      var count = error ? -1 : response.count;
225      setCount('count.lysate.1', count, 'lysates', msg);
226      setCount('count.lysate.2', count, 'lysates', msg);
227      startCounting('rnaqc');
228    }
229    else if (currentCount == 'rnaqc')
230    {
231      var msg = error || 'Number of RNA waiting for QC';
232      var count = error ? -1 : response.count;
233      setCount('count.rnaqc', count, 'RNA', msg);
234      startCounting('caliper-plates');
235    }
236    else if (currentCount == 'caliper-plates')
237    {
238      var msg = error || 'Number of active Caliper plates';
239      var count = error ? -1 : response.count;
240      setCount('count.caliper-plates.1', count, 'Caliper plates', msg);
241      setCount('count.caliper-plates.2', count, 'Caliper plates', msg);
242      startCounting('rna-without-mrna');
243    }
244    else if (currentCount == 'rna-without-mrna')
245    {
246      var msg = error || 'Number of RNA with no mRNA';
247      var count = error ? -1 : response.count;
248      setCount('count.rna-without-mrna', count, 'RNA', msg);
249      startCounting('mrna-plates');
250    }
251    else if (currentCount == 'mrna-plates')
252    {
253      var msg = error || 'Number of mRNA plates waiting for registration';
254      var count = error ? -1 : response.count;
255      setCount('count.mrna-plates.1', count, 'mRNA plates', msg);
256      setCount('count.mrna-plates.2', count, 'mRNA plates', msg);
257      startCounting('cdna-plates');
258    }
259    else if (currentCount == 'cdna-plates')
260    {
261      var msg = error || 'Number of cDNA plates waiting for registration';
262      var count = error ? -1 : response.count;
263      setCount('count.cdna-plates.1', count, 'cDNA plates', msg);
264      startCounting('cdna-plates-for-barcoding');
265    }
266    else if (currentCount == 'cdna-plates-for-barcoding')
267    {
268      var msg = error || 'Number of cDNA plates waiting for barcode layout';
269      var count = error ? -1 : response.count;
270      setCount('count.cdna-plates-for-barcoding', count, 'cDNA plates', msg);
271      startCounting('lib-plates')
272    }
273    else if (currentCount == 'lib-plates')
274    {
275      var msg = error || 'Number of Lib plates waiting for registration';
276      var count = error ? -1 : response.count;
277      setCount('count.lib-plates.1', count, 'Lib plates', msg);
278      setCount('count.lib-plates.2', count, 'Lib plates', msg);
279      setCount('count.lib-plates.3', count, 'Lib plates', msg);
280      startCounting('lib-plates-for-pooling');
281    }
282    else if (currentCount == 'lib-plates-for-pooling')
283    {
284      var msg = error || 'Number of Lib plates waiting for pooling';
285      var count = error ? -1 : response.count;
286      setCount('count.lib-plates-for-pooling', count, 'Lib plates', msg);
287      startCounting('unregistered-pools');
288    }
289    else if (currentCount == 'unregistered-pools')
290    {
291      var msg = error || 'Number of pools waiting for registration';
292      var count = error ? -1 : response.count;
293      setCount('count.pools.1', count, 'pools', msg);
294      setCount('count.pools.2', count, 'pools', msg);
295      startCounting('unused-pools');
296    }
297    else if (currentCount == 'unused-pools')
298    {
299      var msg = error || 'Number of pools waiting for sequencing';
300      var count = error ? -1 : response.count;
301      setCount('count.pools.3', count, 'pools', msg);
302      startCounting('unregistered-flow-cells');
303    }
304    else if (currentCount == 'unregistered-flow-cells')
305    {
306      var msg = error || 'Number of flow cells waiting for registration';
307      var count = error ? -1 : response.count;
308      setCount('count.flow-cells.1', count, 'flow cells', msg);
309      setCount('count.flow-cells.2', count, 'flow cells', msg);
310    }
311   
312  }
313 
314  function setCount(id, count, unit, msg)
315  {
316    var div = document.getElementById(id);
317    div.title = msg;
318    if (count == -1)
319    {
320      div.innerHTML = '(-)';
321    }
322    else
323    {
324      div.innerHTML = '(' + count + ')';
325    }
326  }
327 
328  </script>
329<style>
330dl
331{
332  margin-top: 0px;
333  padding: 3px;
334}
335dt
336{
337  margin-top: 0.5em;
338  margin-left: 0.5em;
339}
340dd
341{
342  margin-left: 0.5em;
343  margin-bottom: 0.5em;
344  padding-left: 3em;
345}
346ul
347{
348  margin-top: 0px;
349  margin-bottom: 0px;
350  margin-left: 0em;
351  padding-left: 0em;
352}
353li
354{
355  margin-left: 0em;
356}
357img
358{
359  vertical-align: text-bottom;
360}
361h3
362{
363  color: #333377;
364  background: #E8E8E8;
365  font-weight: bold;
366  margin-bottom: 0em;
367  padding: 1px 4px 1px 4px;
368  border: 1px solid #A0A0A0;
369  font-size: 1em;
370}
371a.not-implemented
372{
373  filter: url(css/filters.svg#grayscale); /* Firfox, etc */
374  filter: gray; /* IE */
375  opacity: 0.75;
376  pointer-events: none;
377}
378
379a.not-implemented:after
380{
381  content: ' -- coming soon';
382}
383.counter
384{
385  color: #999999;
386  font-style: italic;
387}
388</style>
389</base:head>
390<base:body onload="startCounting('specimen')">
391
392  <p:path><p:pathelement title="Reggie" /></p:path>
393
394  <div class="content">
395    <form name="reggie" onsubmit="return false;">
396    <div class="absolutefull" style="width: 50%;">
397      <div class="absolutefull" style="left: 1em; right: 0.5em; ">
398     
399        <h3>Sample processing wizards</h3>
400        <dl class="leftborder rightborder bottomborder">
401        <%
402        if (hasCreateSamplePermission)
403        {
404          %>
405          <dt>
406            <base:icon image="<%=home+"/images/specimen.png" %>" />
407            <a href="sampleproc/specimentube.jsp?ID=<%=ID%>">Specimen tube registration</a>
408          </dt>
409          <dd>
410            <ul>
411            <li>Register new specimen tubes.
412            <li>Update existing specimen tubes.
413            </ul>
414          </dd>
415          <%
416        }
417        if (hasCreateSamplePermission && hasCreateExtractPermission)
418        {
419          %>
420          <dt>
421            <base:icon image="<%=home+"/images/partition.png" %>" />
422            <a href="sampleproc/partitionform.jsp?ID=<%=ID%>">Partition wizard</a>
423          </dt>
424          <dd>
425            <ul>
426            <li>Register new partitions of existing specimens <span class="counter" id="count.specimen" title="Counting..."><img src="images/loading-small.gif"></span>
427            </ul>
428          </dd>
429          <%
430        }
431        if (hasCreateSamplePermission && hasCreateBioPlatePermission)
432        {
433          %>
434          <dt>
435            <base:icon image="<%=home+"/images/microscope.png" %>" />
436            Histology wizards
437          </dt>
438          <dd>
439            <ul>
440            <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>
441            <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>
442            <li><a href="sampleproc/histology_glass.jsp?ID=<%=ID%>">Register HE glass</a> <span class="counter" id="count.paraffin-blocks-without-heglass" title="Counting..."><img src="images/loading-small.gif"></span>
443            <li><a href="sampleproc/histology_score.jsp?ID=<%=ID%>">Score HE glass</a> <span class="counter" id="count.unscored-heglass" title="Counting..."><img src="images/loading-small.gif"></span>
444            </ul>
445          </dd>
446          <%
447        }
448        if (hasCreateExtractPermission)
449        {
450          %>
451          <dt>
452            <base:icon image="<%=home+"/images/extraction.png" %>" />
453            DNA/RNA extraction wizards
454          </dt>
455          <dd>
456            <ul>
457            <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>
458            <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>
459            </ul>
460          </dd>
461          <dt>
462            <base:icon image="<%=home+"/images/rnaqc.png" %>" />
463            RNA quality control wizards
464          </dt>
465          <dd>
466            <ul>
467            <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>
468            <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>
469            <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>
470            </ul>
471          </dd>
472          <%
473        }
474        %>       
475        </dl>
476     
477     
478        <h3>Library preparation wizards</h3>
479        <dl class="leftborder rightborder bottomborder">
480        <%
481        if (hasCreateExtractPermission && hasCreateBioPlatePermission)
482        {
483          %>
484          <dt>
485            <base:icon image="<%=home+"/images/pipette.png" %>" />
486            RNA to cDNA wizards
487          </dt>
488          <dd>
489            <ul>
490            <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>
491            <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>
492            <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>
493            <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>
494            </ul>
495          </dd>
496         
497          <dt>
498            <base:icon image="<%=home+"/images/libprep.png" %>" />
499            Library preparation wizards
500          </dt>
501          <dd>
502            <ul>
503            <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>
504            <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>
505            <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>
506            <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>
507            </ul>
508          </dd>
509          <dt>
510            <base:icon image="<%=home+"/images/flowcell.png" %>" />
511            Pooling and clustering wizards
512          </dt>
513          <dd>
514            <ul>
515            <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>
516            <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>
517            <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>
518            <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>
519            <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>
520            <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>
521            </ul>
522          </dd>
523          <%
524        }
525        %>
526        </dl>
527      </div>
528    </div>
529   
530    <div class="absolutefull" style="width: 50%; left: auto;">
531      <div class="absolutefull" style="left: 0.5em; right: 1em;">
532        <%
533        if (isAdmin)
534        {
535          %>
536          <h3>Server administrator wizards</h3>
537          <dl class="leftborder rightborder bottomborder">
538          <dt>
539            <base:icon image="<%=home + "/images/install.png" %>" />
540            <a href="admin/install.jsp?ID=<%=ID%>">Installation wizard</a>
541          </dt>
542          <dd>
543            <ul>
544            <li>Check that annotation types and other items used by Reggie exists in BASE.
545            <li>Create missing items.
546            </ul>
547          </dd>
548          </dl>
549          <%
550        }
551        if (isPatientCurator || isAdmin)
552        {
553          %>
554          <h3>Personal information wizards</h3>
555          <dl class="leftborder rightborder bottomborder">
556          <dt>
557            <base:icon image="<%=home + "/images/personal.png" %>"/>
558            <a href="personal/persinfo.jsp?ID=<%=ID%>">Pathology referral form registration</a>
559          </dt>
560          <dd>
561            <ul>
562            <li>Register new cases and patients.
563            <li>Update existing cases and specimen tubes.
564            </ul>
565          </dd>
566         
567          <dt>
568            <base:icon image="<%=home + "/images/blood.png" %>"/>
569            Blood referral form registration
570          </dt>
571          <dd>
572            <ul>
573            <li><a href="personal/bloodform.jsp?ID=<%=ID%>">Register new/updated blood referral forms and patients</a>
574            <li><a href="personal/bloodfollowupform.jsp?ID=<%=ID%>">Register new/updated follow-up blood referral forms</a>
575            </ul>
576          </dd>
577         
578          <dt>
579            <base:icon image="<%=home+"/images/consent.png" %>"/>
580            <a href="personal/consentform.jsp?ID=<%=ID%>">Consent form registration</a>
581          </dt>
582          <dd>
583            <ul>
584            <li>Register consent forms.
585            </ul>
586          </dd>
587         
588          <dt>
589            <base:icon image="<%=home+"/images/export_import.png" %>" />
590            Export/import information to/from external registers.
591          </dt>
592          <dd>
593            <ul>
594            <li><a href="personal/export_monthly_oplist.jsp?ID=<%=ID%>">Export monthly operation list</a>
595            <li><a href="personal/export_inca.jsp?ID=<%=ID%>">INCA export</a>
596            </ul>
597          </dd>
598          </dl>
599          <%
600        }
601        %>
602       
603        <h3>Statistics and reporting wizards</h3>
604        <dl class="leftborder rightborder bottomborder">
605          <dt>
606            <base:icon image="<%=home+"/images/case_summary.png" %>" />
607            Case summary
608          </dt>
609          <dd>
610            <table>
611            <tr>
612              <td><input type="text" class="text" 
613                name="caseName" title="Please enter a 7-digit case id" 
614                style="width: 25em;"
615                onkeypress="if (event.keyCode==13 && this.value) caseSummary()"></td>
616              <td><base:button title="Go" image="<%=home+"/images/gonext.png"%>" onclick="caseSummary()"/></td>
617            </tr>
618            </table>
619          </dd>
620       
621          <dt>
622            <base:icon image="<%=home+"/images/report.png" %>" />
623            <a href="reports/samplereportgenerator.jsp?ID=<%=ID%>">Sample source report</a>
624          </dt>       
625          <dd>       
626            <ul>
627            <li>Sample count report</li> 
628            <li>Consent count report</li> 
629            <li>Patient count report</li> 
630            <li>Overview report</li> 
631            <li>Missing sample data report</li> 
632            </ul>
633          </dd>
634          <dt>
635            <base:icon image="<%=home+"/images/chart_bar.png" %>" />
636            <a href="reports/scanbquartermonthreportgenerator.jsp?ID=<%=ID%>">Sample processing statistics</a>
637          </dt>       
638          <dd>       
639            <ul>
640            <li>SCAN-B quarter/month report</li> 
641            </ul>
642          </dd>
643        </dl>
644      </div>
645    </div>
646    </form>
647  </div>
648 
649</base:body>
650</base:page>
651<%
652}
653finally
654{
655  if (dc != null) dc.close();
656}
657%>
Note: See TracBrowser for help on using the repository browser.