source: trunk/www/lims/arrayslides/create_wizard.jsp @ 5917

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

References #1655: GUI improvements

Edit dialogs for array lims.

  • Property svn:eol-style set to native
  • Property svn:keywords set to Id
File size: 11.9 KB
Line 
1<%-- $Id: create_wizard.jsp 5917 2011-12-19 11:28:45Z nicklas $
2  ------------------------------------------------------------------
3  BioArray Software Environment (BASE) - http://base.thep.lu.se/
4  Copyright (C) 2006 Johan Enell, Nicklas Nordborg, Martin Svensson
5
6  This file is part of BASE.
7
8  BASE is free software; you can redistribute it and/or
9  modify it under the terms of the GNU General Public License
10  as published by the Free Software Foundation; either version 3
11  of the License, or (at your option) any later version.
12
13  BASE is distributed in the hope that it will be useful,
14  but WITHOUT ANY WARRANTY; without even the implied warranty of
15  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16  GNU General Public License for more details.
17
18  You should have received a copy of the GNU General Public License
19  along with BASE. If not, see <http://www.gnu.org/licenses/>.
20  ------------------------------------------------------------------
21
22  @author Martin
23  @version 2.0
24--%>
25
26
27
28<%@ page pageEncoding="UTF-8" session="false"
29  import="net.sf.basedb.core.SessionControl"
30  import="net.sf.basedb.core.DbControl"
31  import="net.sf.basedb.core.Item"
32  import="net.sf.basedb.core.ItemContext"
33  import="net.sf.basedb.core.SystemItems"
34  import="net.sf.basedb.core.Permission"
35  import="net.sf.basedb.core.Include"
36  import="net.sf.basedb.core.ArraySlide"
37  import="net.sf.basedb.core.ArrayBatch" 
38  import="net.sf.basedb.core.PermissionDeniedException"
39  import="net.sf.basedb.core.BaseException"
40  import="net.sf.basedb.core.query.Orders"
41  import="net.sf.basedb.core.query.Hql"
42  import="net.sf.basedb.clients.web.Base"
43  import="net.sf.basedb.clients.web.util.HTML"
44  import="net.sf.basedb.util.Values"
45  import="java.util.List"
46 
47%>
48<%@ taglib prefix="base" uri="/WEB-INF/base.tld" %>
49<%@ taglib prefix="t" uri="/WEB-INF/tab.tld" %>
50<%@ taglib prefix="tbl" uri="/WEB-INF/table.tld" %>
51<%
52final Item itemType = Item.ARRAYSLIDE;
53final SessionControl sc = Base.getExistingSessionControl(pageContext, true);
54final ItemContext cc = Base.getAndSetCurrentContext(sc, itemType, null, null);
55final int itemId = cc.getId();
56final String ID = sc.getId();
57final String cmd = request.getParameter("cmd");
58final float scale = Base.getScale(sc);
59final DbControl dc = sc.newDbControl();
60
61try
62{ 
63  String title = null;
64  ArraySlide slide = null;
65  String name = "New slides.";
66 
67  boolean readCurrentArrayBatch = true;
68  ArrayBatch currentArrayBatch = null;
69 
70  // Load recently used items
71  List<ArrayBatch> recentArrayBatches = (List<ArrayBatch>)cc.getRecent(dc, Item.ARRAYBATCH);
72
73  title = "Create array slides";
74  cc.removeObject("item");
75  int arrayBatchId = Values.getInt(request.getParameter("arraybatch_id"));
76  if (arrayBatchId != 0)
77  {
78    currentArrayBatch = ArrayBatch.getById(dc, arrayBatchId);
79  }
80  else if (cc.getPropertyFilter("arrayBatch.name") != null)
81  {
82    currentArrayBatch = Base.getFirstMatching(dc, ArrayBatch.getQuery(), "name", cc.getPropertyFilter("arrayBatch.name"));
83  }
84  if (currentArrayBatch != null)
85  {
86    name = HTML.encodeTags(currentArrayBatch.getName()) + ".";
87  }
88
89  if (slide != null && !slide.hasPermission(Permission.WRITE))
90  {
91    throw new PermissionDeniedException(Permission.WRITE, itemType.toString());
92  }
93  final String clazz = "class=\"text\"";
94  final String requiredClazz = "class=\"text required\""; 
95  %>
96
97  <base:page type="popup" title="<%=title%>">
98  <base:head scripts="tabcontrol.js" styles="tabcontrol.css,toolbar.css">
99    <script language="JavaScript">
100    // Validate the "ArraySlide" tab
101    function validateArraySlide()
102    {
103      var frm = document.forms['WizardStep1'];
104      if (Main.trimString(frm.name.value) == '')
105      {
106        alert("You must enter a name");
107        frm.name.focus();
108        return false;
109      }
110      if (frm.arraybatch_id && 
111        (frm.arraybatch_id.length == 0 || frm.arraybatch_id[frm.arraybatch_id.selectedIndex].value == 0))
112      {
113        alert("You must select an array batch");
114        return false;
115      }
116      if (Main.trimString(frm.quantity.value) == '')
117      {
118        alert("You must enter a quantity of slides.");
119        frm.quantity.focus();
120        return false;
121      }
122      if (frm.quantity.value < 1)
123      {
124        alert("The quantity of array slides to be created must be at least 1.")
125        frm.quantity.value = 1;
126        frm.quantity.select();
127        return false;
128      }
129      else if (frm.quantity.value > 999)
130      {
131        alert("The quantity of array slides to be created must be lower than 1000.")
132        frm.quantity.value = 1;
133        frm.quantity.select();
134        return false;
135      }
136      return true;
137    }
138   
139    function validateNames()
140    {
141      var frm = document.forms['WizardStep2'];
142      var quantity = parseInt(frm.quantity.value);
143      for (i = 0; i < quantity; i++)
144      {
145        var name = frm['name'+i];
146        if (Main.trimString(name.value) == '')
147        {
148          name.focus();
149          alert('You must enter a name for slide ' + i);
150          return false;
151        }
152      }
153      return true;
154    }
155   
156    // Submit the step 1 form and continue to step 2
157    function nextStep()
158    {     
159      if (validateArraySlide())
160      {
161        var frm = document.forms['WizardStep1'];
162        frm.submit();
163      }
164    }   
165    // Submit and finish the wizard
166    function saveSettings()
167    {
168      if (validateNames())
169      {
170        var frm = document.forms['WizardStep2'];   
171        frm.submit();
172      }
173    }
174
175    function selectArrayBatchOnClick()
176    {
177      var frm = document.forms['WizardStep1'];
178      var url = '../../lims/arraybatches/index.jsp?ID=<%=ID%>&cmd=UpdateContext&mode=selectone&callback=setArrayBatchCallback';
179      if (frm.arraybatch_id.length > 0) url += '&item_id='+frm.arraybatch_id[0].value;
180      Main.openPopup(url, 'SelectArrayBatch', 1000, 700);
181    }
182    function setArrayBatchCallback(id, name)
183    {
184      var frm = document.forms['WizardStep1'];
185      var list = frm.arraybatch_id;
186      if (list.length < 1 || list[0].value == '0') // >
187      {
188        Forms.addListOption(list, 0, new Option());
189      }
190      list[0].value = id;
191      list[0].text = name;
192      list.selectedIndex = 0;
193    }
194   
195    function pasteMultiple(prefix)
196    {
197      Main.openPopup('paste_multiple.jsp?ID=<%=ID%>&form=WizardStep2&prefix=' + prefix, 'PasteMultiple', 400, 600);
198    }
199
200    function clearAll(prefix)
201    {
202      var frm = document.forms['WizardStep2'];
203      var i = 0;
204      var field;
205      while(field = frm[prefix+i])
206      {
207        field.value = '';
208        i++;
209      }
210    }
211   
212    function init()
213    {         
214      var frm = document.forms['WizardStep1'];
215      if (frm != null)
216      {
217        frm.name.focus();
218        frm.name.select();
219      }
220      else
221      {
222        frm = document.forms['WizardStep2'];
223        frm.barcode1.focus();
224      }
225    }
226    </script>
227  </base:head>
228  <base:body onload="init()">
229    <%
230    //Wizard step1
231    if (cmd.equals("WizardStep1"))
232    {
233    %>       
234      <h1><%=title%> <base:help tabcontrol="settings" /></h1>
235      <form action="create_wizard.jsp?ID=<%=ID%>" method="post" name="WizardStep1" onsubmit="return false;">
236      <input type="hidden" name="cmd" value="WizardStep2">
237     
238      <div class="content bottomborder">
239        <table class="fullform input100">
240        <tr>
241          <th>Name</th>
242          <td><input <%=requiredClazz%> type="text" name="name"
243            value="<%=name%>"
244            maxlength="<%=ArraySlide.MAX_NAME_LENGTH%>"></td>
245          <td></td>
246        </tr>
247        <tr>
248          <th>Array batch</th>
249          <td>
250            <base:select 
251              id="arraybatch_id"
252              clazz="selectionlist required"
253              required="true"
254              current="<%=currentArrayBatch%>"
255              denied="<%=!readCurrentArrayBatch%>"
256              recent="<%=recentArrayBatches%>"
257              newitem="true"
258              onselect="selectArrayBatchOnClick()"
259            />
260          </td>
261          <td></td>
262        </tr>
263        <tr>
264          <th>Quantity</th>
265          <td><input <%=requiredClazz%> type="text" name="quantity" value="50" 
266             maxlength="3" style="width: 5em;"
267            onkeypress="return Numbers.integerOnly(event)"><i> (1-999)</i></td>
268          <td></td>
269        </tr>
270        <tr>
271          <th>Start at</th>
272          <td><input <%=clazz%> type="text" name="start_at" value="1" 
273            maxlength="10" style="width: 10em;"
274            onkeypress="return Numbers.integerOnly(event)">
275          </td>
276          <td></td>
277        </tr>
278        <tr>
279          <th class="subprompt">- pad size</th>
280          <td>
281            <input <%=clazz%> type="text" name="pad_length" value="" 
282            maxlength="1" style="width: 10em;"
283            onkeypress="return Numbers.integerOnly(event)">
284          </td>
285          <td>
286        </tr>
287        <tr>
288          <th class="subprompt"></th>
289          <td>
290            <div class="messagecontainer help">
291            The index number will be padded with zeroes to this length
292            (ie, 1 --&gt; Slide.001; 10 --&gt; Slide.010). Leave empty
293            for automatic selection.
294            </div>
295          </td>
296          <td></td>
297        </tr>
298        <tr class="dynamic">
299          <th>Description</th>
300          <td>
301            <textarea <%=clazz%> rows="6" name="description" 
302              ><%=HTML.encodeTags(cc.getPropertyValue("description"))%></textarea>
303          </td>
304          <td style="width: 20px;">
305            <base:icon image="zoom.png" 
306              onclick="Main.zoom('Description', 'WizardStep1', 'description')"
307              tooltip="Edit in larger window"
308            />
309          </td>
310        </tr>
311        </table>
312        </div>
313      </form>
314    <%
315    }
316    //Wizard step 2
317    else if (cmd.equals("WizardStep2"))
318    {
319      name = Values.getStringOrNull(request.getParameter("name"));
320      String description = Values.getString(request.getParameter("description"), "");
321      arrayBatchId = Values.getInt(request.getParameter("arraybatch_id"));
322      int quantity = Values.getInt(request.getParameter("quantity"));
323      int startAt = Values.getInt(request.getParameter("start_at"), 1);
324      %> 
325      <h1><%=title%> <base:help tabcontrol="settings" /></h1>
326      <form action="index.jsp?ID=<%=ID%>" method="post" name="WizardStep2" onsubmit="return false;">       
327      <input type="hidden" name="cmd" value="CreateItems">
328      <input type="hidden" name="description" value="<%=HTML.encodeTags(description)%>">
329      <input type="hidden" name="arraybatch_id" value="<%=arrayBatchId%>">
330      <input type="hidden" name="quantity" value="<%=quantity%>">
331      <input type="hidden" name="start_at" value="<%=startAt%>">
332     
333      <div class="content bottomborder">
334
335        <table class="fullform input100">
336          <colgroup>
337            <col style="max-width: 5em;">
338            <col span="2" style="width: 47%;">
339          </colgroup>
340          <tbody class="section">
341          <tr>
342            <th>&nbsp;</th>
343            <th>Name:
344              <base:icon image="paste.png" onclick="pasteMultiple('name')" 
345                tooltip="Paste multiple values in a single large textarea" />
346              <base:icon image="clear_down.png" onclick="clearAll('name')" 
347                tooltip="Clear all values" />
348            </th>
349            <th>Barcode:
350              <base:icon image="paste.png" onclick="pasteMultiple('barcode')" 
351                tooltip="Paste multiple values in a single large textarea" />
352              <base:icon image="clear_down.png" onclick="clearAll('barcode')" 
353                tooltip="Clear all values" />
354            </th>
355          </tr>
356          </tbody>
357          <tbody>
358          <%
359          int padLength = Values.getInt(request.getParameter("pad_length"));
360          if (padLength == 0)
361          {
362            int lastIndex = startAt + quantity - 1;
363            padLength = (int)Math.log10(lastIndex) + 1;
364          }
365          for (int i = 0; i < quantity; i++)
366          {
367            int index = startAt + i;
368            String paddedName = name + net.sf.basedb.util.MD5.leftPad(String.valueOf(index), '0', padLength);
369            %>
370            <tr>
371              <th><%=index%></th>
372              <td><input type="text" <%=requiredClazz%> name="name<%=i%>" 
373                value="<%=paddedName%>" size="40" maxlength="<%=ArraySlide.MAX_NAME_LENGTH%>"></td>
374              <td><input <%=clazz%> type="text" name="barcode<%=i%>" 
375                size="40" maxlength="<%=ArraySlide.MAX_BARCODE_LENGTH%>">
376              </td>             
377            </tr>
378            <%
379          }
380          %>
381          <tr class="dynamic">
382            <th></th>
383            <td></td>
384            <td></td>
385          </tr>
386          </tbody>
387        </table>
388        </div>
389      </form>
390     
391    <%
392    }
393    %>   
394    <div class="legend" style="height: 2em;">
395      <base:icon image="required.gif" /> = required information
396    </div>
397   
398    <base:buttongroup subclass="dialogbuttons">
399      <base:button onclick="saveSettings();" title="Save" visible="<%=cmd.equals("WizardStep2")%>" />
400      <base:button onclick="nextStep();" title="Next" image="gonext.png" visible="<%=cmd.equals("WizardStep1")%>" />
401      <base:button onclick="window.close();" title="Cancel" />
402    </base:buttongroup>
403  </base:body>
404  </base:page>
405<%
406}
407finally
408{
409  if (dc != null) dc.close();
410}
411%>
Note: See TracBrowser for help on using the repository browser.