source: extensions/net.sf.basedb.reggie/trunk/resources/sampleproc/rnaqc_plate_import.jsp @ 1915

Last change on this file since 1915 was 1915, checked in by Nicklas Nordborg, 9 years ago

Fixes #427: Re-organize jsp files into subfolders

File size: 13.0 KB
Line 
1<%@ page
2  pageEncoding="UTF-8"
3  session="false"
4  import="net.sf.basedb.core.User"
5  import="net.sf.basedb.core.DbControl"
6  import="net.sf.basedb.core.SessionControl"
7  import="net.sf.basedb.core.Application"
8  import="net.sf.basedb.clients.web.Base" 
9  import="net.sf.basedb.clients.web.util.HTML" 
10  import="net.sf.basedb.clients.web.extensions.ExtensionsControl"
11%>
12<%@ taglib prefix="base" uri="/WEB-INF/base.tld" %>
13<%@ taglib prefix="p" uri="/WEB-INF/path.tld" %>
14<%
15final SessionControl sc = Base.getExistingSessionControl(request, true);
16final String ID = sc.getId();
17final float scale = Base.getScale(sc);
18final String home = ExtensionsControl.getHomeUrl("net.sf.basedb.reggie");
19DbControl dc = null;
20try
21{
22  dc = sc.newDbControl();
23  final User user = User.getById(dc, sc.getLoggedInUserId());
24%>
25<base:page type="default" >
26<base:head scripts="ajax.js" styles="path.css">
27  <link rel="stylesheet" type="text/css" href="../css/reggie.css">
28  <script language="JavaScript" src="../reggie.js" type="text/javascript" charset="UTF-8"></script>
29 
30 
31<script language="JavaScript">
32var debug = false;
33var hasValididatedCsv = false;
34var qcRunDateIsValid = false;
35
36function init()
37{
38  var frm = document.forms['reggie'];
39
40}
41
42var lastExtension;
43function browseOnClick(extension)
44{
45  var frm = document.forms['reggie'];
46  if (frm[extension+'.path'].disabled) return;
47 
48  var url = getRoot() + 'filemanager/index.jsp?ID=<%=ID%>&cmd=SelectOne&callback=setFileCallback';
49  url += '&resetTemporary=1&tmpfilter:STRING:name='+escape('%.' + extension.substr(0, 3));
50  lastExtension = extension;
51  Main.openPopup(url, 'SelectFile', 1000, 700);
52}
53
54
55function setFileCallback(id, path)
56{
57  var frm = document.forms['reggie'];
58  frm[lastExtension+'.id'].value = id;
59  frm[lastExtension+'.path'].value = path;
60  if (lastExtension == 'csv')
61  {
62    preValidateCsvFile();
63  }
64  else
65  {
66    setInputStatus(lastExtension, '', 'valid');
67  }
68}
69
70
71function preValidateCsvFile()
72{
73  var frm = document.forms['reggie'];
74  var csvId = frm['csv.id'].value;
75  var csvPath = frm['csv.path'].value;
76  if (!csvId) return;
77 
78  var url = '../RnaQc.servlet?ID=<%=ID%>&cmd=PreValidateCaliperResults&csv='+csvId;
79 
80  var request = Ajax.getXmlHttpRequest();
81  request.open("POST", url, false);
82  request.send('');
83 
84  if (debug) Main.debug(request.responseText);
85  var response = JSON.parse(request.responseText); 
86 
87  if (response.messages && response.messages.length > 0)
88  {
89    var messages = '<ul>';
90    for (var i = 0; i < response.messages.length; i++)
91    {
92      messages += '<li>' + response.messages[i];
93    }
94    messages += '</ul>';
95    setInnerHTML('messages', messages);
96    Main.show('messages');
97  }
98  else
99  {
100    Main.hide('messages'); 
101  }
102 
103  if (response.status != 'ok')
104  {
105    setInputStatus('csv', response.message, 'invalid');
106    Main.addClass(document.getElementById('messages'), 'failure');
107    hasValidatedCsv = false;
108    Main.hide('bioplateSection');
109    return;
110  }
111
112  setInputStatus('csv', '', 'valid');
113  hasValidatedCsv = true;
114 
115  var bioplate = response.plate;
116 
117  Main.show('bioplateSection');
118  setInnerHTML('bioplate.name', '<span class="link" onclick="bioPlateOnClick(event, '+bioplate.id+')">'+bioplate.name+'</a>');
119  setInputStatus('bioplate', '', 'valid');
120  if (bioplate.QCRunDate)
121  {
122    frm.qcRunDate.value = bioplate.QCRunDate;
123    qcRunDateOnChange();
124    setInputStatus('bioplate', 'Data has already been imported to this plate', 'warning');
125  }
126  else
127  {
128    // Try to get date from the filename
129    var dates = csvPath.match(/\d\d\d\d-\d\d-\d\d/);
130    if (dates && dates.length >= 1)
131    {
132      var date = dates[0];
133      frm.qcRunDate.value = date.substr(0, 4)+date.substr(5, 2)+date.substr(8, 2);
134      qcRunDateOnChange();
135    }
136   
137  }
138  if (bioplate.QCOperator)
139  {
140    frm.qcOperator.value = bioplate.QCOperator;
141  }
142 
143}
144
145function bioPlateOnClick(event, id)
146{
147  Main.itemOnClick(event, '<%=ID%>', 'BIOPLATE', id, true);
148}
149
150function goImport()
151{
152  var frm = document.forms['reggie'];
153  var csvId = parseInt(frm['csv.id'].value, 10);
154  var gxdStdId = parseInt(frm['gxd.std.id'].value, 10);
155  var gxdHiId = parseInt(frm['gxd.hi.id'].value, 10);
156  var pdfId = parseInt(frm['pdf.id'].value, 10);
157 
158  if (!csvId)
159  {
160    setInputStatus('csv', 'Missing CSV file', 'invalid');
161    return;
162  }
163  if (!hasValidatedCsv) return;
164  if (frm.qcRunDate.value != '' && !qcRunDateIsValid) return;
165 
166  setInputStatus('csv', '', 'valid');
167 
168  Main.hide('goimport');
169
170  frm['csv.path'].disabled = true;
171  frm['gxd.std.path'].disabled = true;
172  frm['gxd.hi.path'].disabled = true;
173  frm['pdf.path'].disabled = true;
174  Main.addClass(document.getElementById('btnCsv'), 'disabled');
175  Main.addClass(document.getElementById('btnGxdStd'), 'disabled');
176  Main.addClass(document.getElementById('btnGxdHi'), 'disabled');
177  Main.addClass(document.getElementById('btnPdf'), 'disabled');
178 
179  var submitInfo = new Object();
180  submitInfo.csv = csvId;
181  submitInfo.gxdStd = gxdStdId;
182  submitInfo.gxdHi = gxdHiId;
183  submitInfo.pdf = pdfId;
184  submitInfo.QCRunDate = frm.qcRunDate.value;
185  submitInfo.QCOperator = frm.qcOperator.value;
186 
187  if (debug) Main.debug(JSON.stringify(submitInfo));
188 
189  var url = '../RnaQc.servlet?ID=<%=ID%>&cmd=ImportCaliperResults';
190 
191  var request = Ajax.getXmlHttpRequest();
192  try
193  {
194    showLoadingAnimation('Importing RQS values...');
195    request.open("POST", url, false);
196    request.send(JSON.stringify(submitInfo));
197  }
198  finally
199  {
200    hideLoadingAnimation();
201  }
202 
203  if (debug) Main.debug(request.responseText);
204  var response = JSON.parse(request.responseText);
205 
206  if (response.messages && response.messages.length > 0)
207  {
208    var msg = '<ul>';
209    for (var i = 0; i < response.messages.length; i++)
210    {
211      var msgLine = response.messages[i];
212      if (msgLine.indexOf('[Warning]') >= 0)
213      {
214        msg += '<li class="warning">' + msgLine.replace('[Warning]', '');
215      }
216      else
217      {
218        msg += '<li>' + msgLine;
219      }
220    }
221    msg += '</ul>';
222    setInnerHTML('messages', msg);
223    Main.show('messages');
224  }
225 
226  if (response.status != 'ok')
227  {
228    Main.addClass(document.getElementById('messages'), 'failure');
229    setFatalError(response.message);
230    return false;
231  }
232
233  Main.show('done');
234  Main.show('gorestart');
235 
236}
237
238
239function qcRunDateOnChange()
240{
241  var frm = document.forms['reggie'];
242  qcRunDateIsValid = false;
243  setInputStatus('qcRunDate', '', '');
244 
245  var qcRunDate = frm.qcRunDate.value;
246 
247  if (qcRunDate == '')
248  {
249    setInputStatus('qcRunDate', 'Missing', 'warning');
250  }
251  else
252  {
253    // Auto-fill the date if it's only given with 4(MMdd) or 6(yyMMdd) digits.   
254    qcRunDate = autoFillDate(qcRunDate);
255    frm.qcRunDate.value = qcRunDate;
256 
257    if (!Dates.isDate(qcRunDate, 'yyyyMMdd'))
258    {
259      setInputStatus('qcRunDate', 'Not a valid date', 'invalid');
260      return;
261    }
262    setInputStatus('qcRunDate', '', 'valid');
263  }
264 
265  qcRunDateIsValid = true;
266}
267
268</script>
269
270
271</base:head>
272<base:body onload="init()">
273
274  <p:path><p:pathelement 
275    title="Reggie" href="<%="../index.jsp?ID="+ID%>" 
276    /><p:pathelement title="RNA quality control - Import Caliper results" 
277    /></p:path>
278
279  <div class="content">
280  <%
281  if (sc.getActiveProjectId() == 0)
282  {
283    %>
284    <div class="messagecontainer note" style="width: 950px; margin-left: 20px; margin-bottom: 20px; margin-right: 0px; font-weight: bold; color: #cc0000;">
285      No project has been selected. You may proceed with the import but
286      you may not be able to update all items.
287    </div>
288    <%
289  }
290  %>
291
292  <form name="reggie" onsubmit="return false;">
293    <input type="hidden" name="csv.id" value="">
294    <input type="hidden" name="gxd.std.id" value="">
295    <input type="hidden" name="gxd.hi.id" value="">
296    <input type="hidden" name="pdf.id" value="">
297 
298  <!-- 1. Select bioplate -->
299  <table border="0" cellspacing="0" cellpadding="0" class="stepform">
300  <tr>
301    <td rowspan="2" class="stepno">1</td>
302    <td class="steptitle">Select data files</td>
303  </tr>
304  <tr>
305    <td class="stepfields">
306      <table border="0" cellspacing="0" cellpadding="0" width="100%">
307      <tr valign="top">
308        <td class="prompt">Well table CSV</td>
309        <td class="input">
310              <table border="0" cellspacing="0" cellpadding="0">
311              <tr>
312              <td><input class="text required" type="text" 
313                name="csv.path" value=""
314                size="50"></td>
315              <td style="padding-left: 4px;"><base:button 
316                  title="Browse&hellip;"
317                  onclick="browseOnClick('csv')"
318                  id="btnCsv"
319                  />
320              </td>
321              </tr>
322              </table>
323         
324        </td>
325        <td class="status" id="csv.status"></td>
326        <td class="help"><span id="csv.message" class="message" style="display: none;"></span>
327          Select the <b>Well Table CSV file</b> that contains the exported analysis result from the
328          Caliper software.
329        </td>
330      </tr>
331      <tr valign="top">
332        <td class="prompt">GXD standard</td>
333        <td class="input">
334              <table border="0" cellspacing="0" cellpadding="0">
335              <tr>
336              <td><input class="text" type="text" 
337                name="gxd.std.path" value=""
338                size="50"></td>
339              <td style="padding-left: 4px;"><base:button 
340                  title="Browse&hellip;"
341                  onclick="browseOnClick('gxd.std')"
342                  id="btnGxdStd"
343                  />
344              </td>
345              </tr>
346              </table>
347         
348        </td>
349        <td class="status" id="gxd.std.status"></td>
350        <td class="help"><span id="gxd.std.message" class="message" style="display: none;"></span>
351          Select the <b>Standard GXD file</b> that contains the raw data.
352        </td>
353      </tr>
354      <tr valign="top">
355        <td class="prompt">GXD high sense</td>
356        <td class="input">
357              <table border="0" cellspacing="0" cellpadding="0">
358              <tr>
359              <td><input class="text" type="text" 
360                name="gxd.hi.path" value=""
361                size="50"></td>
362              <td style="padding-left: 4px;"><base:button 
363                  title="Browse&hellip;"
364                  onclick="browseOnClick('gxd.hi')"
365                  id="btnGxdHi"
366                  />
367              </td>
368              </tr>
369              </table>
370         
371        </td>
372        <td class="status" id="gxd.hi.status"></td>
373        <td class="help"><span id="gxd.hi.message" class="message" style="display: none;"></span>
374          Select the <b>High sense GXD file</b> that contains the raw data.
375        </td>
376      </tr>
377      <tr valign="top">
378        <td class="prompt">PDF file</td>
379        <td class="input">
380              <table border="0" cellspacing="0" cellpadding="0">
381              <tr>
382              <td><input class="text" type="text" 
383                name="pdf.path" value=""
384                size="50"></td>
385              <td style="padding-left: 4px;"><base:button 
386                  title="Browse&hellip;"
387                  onclick="browseOnClick('pdf')"
388                  id="btnPdf"
389                  />
390              </td>
391              </tr>
392              </table>
393         
394        </td>
395        <td class="status" id="pdf.status"></td>
396        <td class="help"><span id="pdf.message" class="message" style="display: none;"></span>
397          Select the PDF file that contains a printout with diagrams and other
398          useful documentation.
399        </td>
400      </tr>
401      <tr id="bioplateSection">
402        <td class="prompt">Bioplate</td>
403        <td class="input" id="bioplate.name"><i>no file loaded</i></td>
404        <td class="status" id="bioplate.status"></td>
405        <td class="help"><span id="bioplate.message" class="message" style="display: none;"></span>
406        </td>
407      </tr>
408      <tr valign="top">
409        <td class="prompt">QC Run Date</td>
410        <td class="input" style="padding-left: 0px;">
411          <input type="text" name="qcRunDate" value="" size="12" maxlength="10"
412            onblur="qcRunDateOnChange()">
413        </td>
414        <td class="status" id="qcRunDate.status"></td>
415        <td class="help">
416          <span id="qcRunDate.message" class="message" style="display: none;"></span>(YYYYMMDD or MMDD)
417        </td>
418      </tr>
419      <tr valign="top">
420        <td class="prompt">QC Operator</td>
421        <td class="input" style="padding-left: 0px;">
422          <input type="text" name="qcOperator" value="<%=HTML.encodeTags(user.getName()) %>" size="50" maxlength="255">
423        </td>
424        <td class="status" id="qcOperator.status"></td>
425        <td class="help">
426          <span id="qcOperator.message" class="message" style="display: none;"></span>
427        </td>
428      </tr>
429      </table>
430    </td>
431  </tr>
432  </table>
433 
434  <div class="loading" id="loading" style="display: none;"><table><tr><td><img src="../images/loading.gif"></td><td id="loading.msg">Please wait...</td></tr></table></div>
435 
436  <div class="messagecontainer error" id="errorMessage" style="display: none; width: 950px; margin-left: 20px; margin-bottom: 0px;"></div>
437 
438  <div id="messages" class="success" style="display: none; width: 950px; margin-left: 20px; margin-top: 20px;"></div>
439 
440  <table style="margin-left: 20px; margin-top: 10px;" class="navigation">
441    <tr>
442      <td><base:button id="goimport" title="Import" image="<%=home+"/images/import.png"%>" onclick="goImport()"/></td>
443      <td><base:button id="gorestart" title="Restart" image="<%=home+"/images/goback.png"%>" onclick="goRestart(true)" style="display: none;"/></td>
444      <td id="gonext.message" class="message"></td>
445    </tr>
446  </table>
447  </form>
448  </div>
449 
450</base:body>
451</base:page>
452<%
453}
454finally
455{
456  if (dc != null) dc.close();
457}
458%>
Note: See TracBrowser for help on using the repository browser.