source: extensions/net.sf.basedb.reggie/branches/2.15-stable/resources/libprep/rna_dilution_registration.jsp @ 2505

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

Fixes #604: New wizard "RNA dilution registration"

Added the new RNA dilution registration wizard.

File size: 10.3 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<script language="JavaScript">
31
32var debug = 1;
33var currentStep = 1;
34
35var dateIsValid = [];
36
37var commentsIsValid = false;
38
39function init()
40{
41  var frm = document.forms['reggie'];
42  var bioplates = getMRnaBioPlates();
43 
44  // Load existing mRNA plates without a dilution date
45  var plates = frm.bioplate;
46  if (bioplates != null && bioplates.length > 0)
47  {
48    for (var i=0; i < bioplates.length; i++)
49    {
50      var bioplate = bioplates[i];
51      var option = new Option(bioplate.name, bioplate.id);
52      option.comments = bioplate.comments;
53      plates.options[plates.length] = option;
54    }
55    bioplateIsValid = true;
56    setInputStatus('bioplate', '', 'valid');
57    bioPlateOnChange();
58  }
59  else
60  {
61    var msg = 'No mRNA bioplates available for processing.';
62    setFatalError(msg);
63    return;
64  }
65
66  // All is ok
67  frm.bioplate.focus();
68}
69
70
71function goNextAuto()
72{
73  goNext(false);
74}
75
76function goNext(manual)
77{
78  setInnerHTML('gonext.message', '');
79  if (currentStep == 1)
80  {   
81    gotoStep2();
82  }
83  setCurrentStep(currentStep);
84}
85
86
87
88function getMRnaBioPlates()
89{
90  var frm = document.forms['reggie']; 
91 
92  var request = Ajax.getXmlHttpRequest();
93  try
94  {
95    showLoadingAnimation('Loading histology work lists...');
96    var url = '../MRna.servlet?ID=<%=ID%>&cmd=GetUnprocessedPlates&plateType=MRNA&onlyUndiluted=1';   
97    request.open("GET", url, false); 
98    request.send(null);
99  }
100  finally
101  {
102    hideLoadingAnimation();
103  }
104 
105  if (debug) Main.debug(request.responseText);
106  var response = JSON.parse(request.responseText); 
107  if (response.status != 'ok')
108  {
109    setFatalError(response.message);
110    return false;
111  }
112  return response.bioplates;
113}
114
115function gotoStep2()
116{
117  var frm = document.forms['reggie']; 
118  frm.bioplate.disabled = true;
119
120 
121  currentStep = 2;
122  Main.show('step.2.section');
123  Main.addClass(document.getElementById('step.1.section'), 'disabled');
124  Main.hide('gonext');
125  Main.show('gocancel');
126  Main.show('goregister');
127 
128  frm.dilutionDate.focus();
129}
130
131
132function bioPlateOnChange()
133{
134  var frm = document.forms['reggie'];
135  frm.comments.value = frm.bioplate[frm.bioplate.selectedIndex].comments;
136}
137
138
139function dateOnChange(dateField)
140{
141  var frm = document.forms['reggie'];
142
143  setInputStatus(dateField, '', '');
144  dateIsValid[dateField] = false;
145  var date = frm[dateField].value;
146
147  if (date == '')
148  {
149    setInputStatus(dateField, 'Missing date', 'invalid');
150    return;
151  }
152
153  // Auto-fill the date if it's only given with 4(MMdd) or 6(yyMMdd) digits.   
154  date = autoFillDate(date);
155  frm[dateField].value = date;
156  if (!Dates.isDate(date, 'yyyyMMdd'))
157  {
158    setInputStatus(dateField, 'Not a valid date', 'invalid');
159    return;
160  }
161 
162  dateIsValid[dateField] = true;
163  setInputStatus(dateField, '', 'valid');
164}
165
166function setDate(frmName, dateField, date)
167{
168  var frm = document.forms['reggie'];
169  frm[dateField].value = date;
170  dateOnChange(dateField);
171  frm[dateField].focus();
172}
173
174function step2IsValid()
175{
176  var frm = document.forms['reggie'];
177  if (dateIsValid['dilutionDate'] == false) return false;
178  return true;
179}
180
181function goRegister()
182{
183  if (!step2IsValid()) return;
184
185  var frm = document.forms['reggie'];
186 
187  Main.hide('goregister');
188  Main.hide('gocancel');
189  Main.hide('gonext.message');
190  Main.addClass(document.getElementById('step.2.section'), 'disabled');
191
192  frm.dilutionDate.disabled = true;
193  frm.dilutionOperator.disabled = true;
194  frm.comments.disabled = true;
195 
196  var submitInfo = {};
197  submitInfo.bioplate = parseInt(frm.bioplate.value, 10);
198  submitInfo.dilutionDate = frm.dilutionDate.value;
199  submitInfo.dilutionOperator = frm.dilutionOperator.value;
200  submitInfo.comments = frm.comments.value;
201 
202  if (debug) Main.debug(JSON.stringify(submitInfo));
203  var url = '../MRna.servlet?ID=<%=ID%>&cmd=RegisterRNADilution';
204 
205  var request = Ajax.getXmlHttpRequest();
206  try
207  {
208    showLoadingAnimation('Performing registration...');
209    request.open("POST", url, false);
210    request.send(JSON.stringify(submitInfo));
211  }
212  finally
213  {
214    hideLoadingAnimation();
215  }
216 
217  if (debug) Main.debug(request.responseText);
218  var response = JSON.parse(request.responseText);
219 
220  if (response.messages && response.messages.length > 0)
221  {
222    var msg = '<ul>';
223    for (var i = 0; i < response.messages.length; i++)
224    {
225      var msgLine = response.messages[i];
226      if (msgLine.indexOf('[Warning]') >= 0)
227      {
228        msg += '<li class="warning">' + msgLine.replace('[Warning]', '');
229      }
230      else
231      {
232        msg += '<li>' + msgLine;
233      }
234    }
235    msg += '</ul>';
236    setInnerHTML('messages', msg);
237    Main.show('messages');
238  }
239 
240  if (response.status != 'ok')
241  {
242    Main.addClass(document.getElementById('messages'), 'failure');
243    setFatalError(response.message);
244    return false;
245  }
246
247  Main.show('gorestart');
248}
249
250
251</script>
252
253</base:head>
254<base:body onload="init()">
255
256  <p:path><p:pathelement 
257    title="Reggie" href="<%="../index.jsp?ID="+ID%>" 
258    /><p:pathelement title="RNA dilution registration" 
259    /></p:path>
260
261  <div class="content">
262  <%
263  if (sc.getActiveProjectId() == 0)
264  {
265    %>
266    <div class="messagecontainer note" style="width: 950px; margin-left: 20px; margin-bottom: 20px; margin-right: 0px; font-weight: bold; color: #cc0000;">
267      No project has been selected. You may proceed with the registration but
268      created items will not be shared.
269    </div>
270    <%
271  }
272  %>
273
274  <form name="reggie" onsubmit="return false;">
275    <input type="hidden" name="pdf.id" value="">
276 
277  <div id="step.1.section">
278  <table class="stepform">
279  <tr>
280    <td rowspan="3" class="stepno">1</td>
281    <td class="steptitle">Select mRNA bioplate</td>
282  </tr>
283  <tr>
284    <td class="stepfields">
285      <table>
286      <tr valign="top">
287        <td class="prompt">mRNA bioplate</td>
288        <td class="input"><select class="required" style="width:90%;" 
289            name="bioplate" id="bioplate" onchange="bioPlateOnChange()"></select>
290        </td>
291        <td class="status" id="bioplate.status"></td>
292        <td class="help"><span id="bioplate.message" class="message" style="display: none;"></span>
293          Select an existing mRNA bioplate. The list contain all mRNA bioplates that
294          has not been diluted, but not yet registered as completed (determined by the absence of a
295          'DilutionDate' annotation).
296        </td>
297      </tr>
298      </table>
299    </td>
300  </tr>
301  </table>
302  </div>
303 
304  <div id="step.2.section" style="display: none;">
305  <table class="stepform">
306  <tr>
307    <td rowspan="3" class="stepno">2</td>
308    <td class="steptitle">mRNA preparation information</td>
309  </tr>
310  <tr>
311    <td class="stepfields">
312      <table>
313      <tr valign="top">
314        <td class="prompt">Dilution date</td>
315        <td class="input">
316          <input type="text" class="required" name="dilutionDate" value="" size="12" maxlength="10"
317            onblur="dateOnChange(this.name)" onkeypress="focusOnEnter(event, 'dilutionOperator')">
318            <base:icon 
319              onclick="Dates.selectDate('Dilution date', 'reggie', 'dilutionDate', 'setDate', 'yyyyMMdd')"
320              image="calendar.png" 
321              tooltip="Select a date from a calendar" 
322              tabindex="-1"
323            />
324        </td>
325        <td class="status" id="dilutionDate.status"></td>
326        <td class="help">
327          <span id="dilutionDate.message" class="message" style="display: none;"></span>Date the RNA was diluted (YYYYMMDD or MMDD)
328        </td>
329      </tr>
330      <tr valign="top">
331        <td class="prompt">Operator</td>
332        <td class="input">
333          <input type="text" name="dilutionOperator" value="<%=HTML.encodeTags(user.getName()) %>" 
334            style="width: 90%;" maxlength="255" onkeypress="focusOnEnter(event, 'comments')">
335        </td>
336        <td class="status" id="dilutionOperator.status"></td>
337        <td class="help">
338          <span id="dilutionOperator.message" class="message" style="display: none;"></span>
339        </td>
340      </tr>
341      <tr valign="top">
342        <td class="prompt">Comments</td>
343        <td class="input"><textarea rows="4" cols="50" style="width: 90%;" name="comments" value=""></textarea></td>
344        <td class="status" id="comments.status"></td>
345        <td class="help"><span id="comments.message" class="message" style="display: none;"></span>Comments about the mRNA processing.</td>
346      </tr>
347      </table>
348    </td>
349  </tr>
350  </table>
351  </div>
352 
353  <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>
354 
355  <div class="messagecontainer error" id="errorMessage" style="display: none; width: 950px; margin-left: 20px; margin-bottom: 0px;"></div>
356 
357  <div id="messages" class="success" style="display: none; width: 950px; margin-left: 20px; margin-top: 20px;"></div>
358 
359  <table style="margin-left: 20px; margin-top: 10px;" class="navigation">
360    <tr>
361      <td><base:button id="gocancel" title="Cancel" onclick="goRestart(false)" style="display: none;"/></td>
362      <td><base:button id="gonext" title="Next" image="<%=home+"/images/gonext.png"%>" onclick="goNext(true)"/></td>
363      <td><base:button id="goregister" title="Register" image="<%=home+"/images/import.png"%>" onclick="goRegister()" style="display: none;"/></td>
364      <td><base:button id="gorestart" title="Restart" image="<%=home+"/images/goback.png"%>" onclick="goRestart(true)" style="display: none;"/></td>
365      <td id="gonext.message" class="message"></td>
366    </tr>
367  </table>
368 
369  </form>
370  </div>
371 
372</base:body>
373</base:page>
374<%
375}
376finally
377{
378  if (dc != null) dc.close();
379}
380%>
Note: See TracBrowser for help on using the repository browser.