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

Last change on this file since 1546 was 1546, checked in by Nicklas Nordborg, 10 years ago

References #366: Import annotations and other information from Caliper output

The important features has been implemented. There is still some more to do on the error handling side and maybe also on the usability side.

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