source: trunk/www/lims/plates/events/edit_event.jsp @ 2486

Last change on this file since 2486 was 2486, checked in by Martin Svensson, 16 years ago

References #173. Possible to attach a hardware to a PlateEvent? in the GUI

  • Property svn:eol-style set to native
  • Property svn:keywords set to Date Id
File size: 12.1 KB
Line 
1<%-- $Id: edit_event.jsp 2486 2006-08-03 15:20:10Z martin $
2  ------------------------------------------------------------------
3  Copyright (C) Authors contributing to this file.
4
5  This file is part of BASE - BioArray Software Environment.
6  Available at http://base.thep.lu.se/
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 2
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 this program; if not, write to the Free Software
20  Foundation, Inc., 59 Temple Place - Suite 330,
21  Boston, MA  02111-1307, USA.
22  ------------------------------------------------------------------
23
24
25  @author Nicklas
26  @version 2.0
27--%>
28<%@ page
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.Hardware"
36  import="net.sf.basedb.core.HardwareType"
37  import="net.sf.basedb.core.Include"
38  import="net.sf.basedb.core.Plate"
39  import="net.sf.basedb.core.PlateType"
40  import="net.sf.basedb.core.PlateEvent"
41  import="net.sf.basedb.core.PlateEventType"
42  import="net.sf.basedb.core.Protocol"
43  import="net.sf.basedb.core.ProtocolType"
44  import="net.sf.basedb.core.ItemQuery"
45  import="net.sf.basedb.core.ItemResultList"
46  import="net.sf.basedb.core.PermissionDeniedException"
47  import="net.sf.basedb.core.BaseException"
48  import="net.sf.basedb.core.query.Hql"
49  import="net.sf.basedb.core.query.Restrictions"
50  import="net.sf.basedb.core.query.Expressions"
51  import="net.sf.basedb.core.query.Orders"
52  import="net.sf.basedb.clients.web.Base"
53  import="net.sf.basedb.clients.web.WebException"
54  import="net.sf.basedb.clients.web.util.HTML"
55  import="net.sf.basedb.clients.web.util.Values"
56  import="java.util.List"
57  import="java.util.Set"
58  import="java.util.HashSet"
59  import="java.util.Date"
60%>
61<%@ taglib prefix="base" uri="/WEB-INF/base.tld" %>
62<%@ taglib prefix="t" uri="/WEB-INF/tab.tld" %>
63<%
64final Item itemType = Item.PLATEEVENT;
65final SessionControl sc = Base.getExistingSessionControl(pageContext, true);
66final ItemContext cc = Base.getAndSetCurrentContext(sc, itemType, null, null);
67final int itemId = cc.getId();
68final int plateId = Values.getInt(request.getParameter("plate_id"));
69final String ID = sc.getId();
70final float scale = Base.getScale(sc);
71final DbControl dc = sc.newDbControl();
72try
73{
74  String title = null;
75  PlateEvent event = null;
76  Plate plate = null;
77  PlateEventType eventType = null;
78
79  Protocol currentProtocol = null;
80  boolean readCurrentProtocol = true;
81  ProtocolType currentProtocolType = null;
82  boolean readCurrentProtocolType = true;
83  Hardware currentHardware = null;
84  boolean readCurrentHardware = true;
85
86  ItemResultList<PlateEventType> eventTypes = null;
87  if (itemId == 0)
88  {
89    title = "Create event";
90    cc.removeObject("item");
91   
92    plate = Plate.getById(dc, plateId);
93    ItemQuery<PlateEventType> eventTypesQuery = plate.getPlateType().getEventTypes();
94    eventTypesQuery.order(Orders.asc(Hql.property("ordinal")));
95    eventTypesQuery.join(Hql.leftJoin(null, "plateEvents", "event", 
96      Restrictions.eq(Hql.property("event", "plate"), Hql.entity(plate))));
97    eventTypesQuery.restrict(Restrictions.eq(Hql.alias("event"), null));
98    eventTypes = eventTypesQuery.list(dc);
99    if (eventTypes.size() == 0)
100    {
101      throw new WebException("popup", "No more event types can be created", 
102        "One event of each event type has already been created for this plate.");
103    }   
104   
105    if (cc.getPropertyFilter("protocolType.name") != null)
106    {
107      currentProtocol = Base.getFirstMatching(dc, Protocol.getQuery(), "name", cc.getPropertyFilter("protocol.name"));
108    }
109  }
110  else
111  {
112    event = PlateEvent.getById(dc, itemId);
113    eventType = event.getPlateEventType();
114    cc.setObject("item", event);
115    title = "Edit event  -- " + HTML.encodeTags(eventType.getName());
116    try
117    {
118      currentProtocol = event.getProtocol();
119    }
120    catch (PermissionDeniedException ex)
121    {
122      readCurrentProtocol = false;
123    }
124    try
125    {
126      currentProtocolType = eventType.getProtocolType();
127    }
128    catch (PermissionDeniedException ex)
129    {
130      readCurrentProtocolType = false;
131    }
132    try
133    {
134      currentHardware = event.getHardware();
135    }
136    catch(PermissionDeniedException ex)
137    {
138      readCurrentHardware = false;
139    }
140  }
141 
142  if (event != null && !event.hasPermission(Permission.WRITE))
143  {
144    throw new PermissionDeniedException(Permission.WRITE, itemType.toString());
145  }
146  final String clazz = "class=\"text\"";
147  final String requiredClazz = "class=\"text required\"";
148  %>
149
150  <base:page type="popup" title="<%=title%>">
151  <base:head scripts="tabcontrol.js" styles="tabcontrol.css">
152    <script language="JavaScript">
153    // Validate the "Event" tab
154    function validateEvent()
155    {
156      var frm = document.forms['event'];
157      return true;
158    }
159
160    // Submit the form
161    function saveSettings()
162    {
163      var frm = document.forms['event'];
164      if (TabControl.validateActiveTab('settings'))
165      {
166        frm.submit();
167      }
168    }
169   
170    var protocolTypeFilter = <%=currentProtocolType != null ? currentProtocolType.getId() : 0%>;   
171    function selectProtocolOnClick()
172    {
173      var frm = document.forms['event'];
174      var url = '../../../admin/protocols/index.jsp?ID=<%=ID%>&cmd=UpdateContext&mode=selectone&callback=setProtocolCallback';
175      if (frm.protocol_id.length > 1)
176      {
177        var id = Math.abs(parseInt(frm.protocol_id[1].value));       
178        url += '&item_id='+id;
179      }
180      if (protocolTypeFilter)
181      {
182        url += '&filter:INT:protocolType='+protocolTypeFilter;
183      }
184      Main.openPopup(url, 'SelectProtocol', 1000, 700);
185    }
186    function setProtocolCallback(protocolId, name)
187    {
188      var frm = document.forms['event'];
189      if (frm.protocol_id.length < 2) // >
190      {
191        frm.protocol_id[frm.protocol_id.length] = new Option();
192      }
193      frm.protocol_id[1].value = protocolId;
194      frm.protocol_id[1].text = name;
195      frm.protocol_id.selectedIndex = 1;
196    }
197    function selectHardwareOnClick()
198    {
199      var frm = document.forms['event'];
200      var url = '../../../admin/hardware/index.jsp?ID=<%=ID%>&cmd=UpdateContext&mode=selectone&callback=setHardwareCallback';
201      if (frm.hardware_id.length > 1)
202      {
203        var id = Math.abs(parseInt(frm.hardware_id[1].value));
204        url += '&item_id='+id;
205      }
206      Main.openPopup(url, 'SelectHardware', 1000, 700);
207    }
208    function setHardwareCallback(hardwareId, name)
209    {
210      var frm = document.forms['event'];
211      if (frm.hardware_id.length < 2)
212      {
213        frm.hardware_id[frm.hardware_id.length] = new Option();
214      }
215      frm.hardware_id[1].value = hardwareId;
216      frm.hardware_id[1].text = name;
217      frm.hardware_id.selectedIndex = 1;
218    }
219
220    function init()
221    {
222      var frm = document.forms['event'];
223      plateEventTypeOnChange();
224    }
225    <%
226    if (event == null)
227    {
228      %>
229      var protocolTypes = new Array();
230      <%
231      for (PlateEventType pet : eventTypes)
232      {
233        try
234        {
235          ProtocolType pt = pet.getProtocolType();
236          if (pt != null)
237          {
238            %>
239            protocolTypes['P<%=pet.getId()%>'] = <%=pt.getId()%>;
240            <%
241          }
242        }
243        catch (Throwable t)
244        {}
245      }
246    }
247    %>
248    function plateEventTypeOnChange()
249    {
250      var frm = document.forms['event'];
251      if (frm.plateeventtype_id)
252      {
253        var eventTypeId = frm.plateeventtype_id[frm.plateeventtype_id.selectedIndex].value;
254        protocolTypeFilter = protocolTypes['P'+eventTypeId];
255      }
256    }
257    </script>
258  </base:head>
259  <base:body onload="init()">
260    <p>
261    <form action="index.jsp?ID=<%=ID%>" method="post" name="event" onsubmit="return false;">
262    <input type="hidden" name="cmd" value="UpdateItem">
263    <input type="hidden" name="plate_id" value="<%=plateId%>">
264
265    <h3 class="docked"><%=title%> <base:help tabcontrol="settings" /></h3>
266    <t:tabcontrol id="settings" contentstyle="<%="height: "+(int)(scale*250)+"px;"%>" 
267      position="bottom" remember="<%=event != null%>">
268    <t:tab id="info" title="Event" validate="validateEvent()" helpid="plateevent.edit">
269      <table class="form" cellspacing=0>
270      <tr>
271        <td class="prompt">Event type</td>
272        <td>
273          <%
274          if (event == null)
275          {
276            %>
277            <select name="plateeventtype_id" class="required" onchange="plateEventTypeOnChange()">
278            <%
279            for (PlateEventType pet : eventTypes)
280            {
281              %>
282              <option value="<%=pet.getId()%>"><%=pet.getOrdinal()%>. <%=HTML.encodeTags(pet.getName())%>
283              <%
284            }
285            %>
286            </select>
287            <%
288          }
289          else
290          {
291            %>
292            <%=eventType.getOrdinal()%>. <%=HTML.encodeTags(eventType.getName())%>
293            <%
294          }
295          %>
296        </td>
297      </tr>
298      <tr>
299        <td class="prompt">Event date</td>
300        <td>
301          <table border="0" cellspacing="0" cellpadding="0">
302          <tr>
303          <td>
304            <input <%=clazz%> type="text" name="event_date" 
305              value="<%=Values.formatDate(event == null ? Values.getDate(cc.getPropertyValue("eventDate"), new Date()) : event.getEventDate())%>" 
306              size="12" maxlength="10" onkeypress="return Dates.dateOnly(event)">
307            (yyyy-mm-dd)&nbsp;
308          </td>
309          <td>
310          <base:button 
311            onclick="Dates.selectDate('Date', 'event', 'event_date')" 
312            image="calendar.png"
313            title="Calendar&hellip;" 
314            tooltip="Select a date from a calendar" 
315          />
316          </td>
317          </tr>
318          </table>
319        </td>
320      </tr>
321      <tr>
322        <td class="prompt">Entry date</td>
323        <td><%=Values.formatDate(event == null ? new Date() : event.getEntryDate())%></td>
324      </tr>
325      <tr>
326        <td class="prompt">Protocol</td>
327        <td>
328          <table border="0" cellspacing="0" cellpadding="0">
329          <tr>
330          <td>
331            <select name="protocol_id" size="1" 
332              <%=!readCurrentProtocol ? "disabled readonly class=\"disabled\"" : ""%>
333              style="width: 20em;">
334            <%
335            if (!readCurrentProtocol)
336            {
337              %>
338              <option value="-1">- denied -
339              <%
340            }
341            else
342            {
343              %>
344              <option value="0">- none -
345              <%
346              if (currentProtocol != null)
347              {
348                %>
349                <option value="<%=event == null ? currentProtocol.getId() : -currentProtocol.getId()%>" 
350                  selected><%=HTML.encodeTags(currentProtocol.getName())%>
351                <%
352              }
353            }
354            %>
355            </select>
356            &nbsp;
357          </td>
358          <td><base:button onclick="selectProtocolOnClick()" 
359            title="Select&hellip;" disabled="<%=!readCurrentProtocol%>" /></td>
360          </tr>
361          </table>
362        </td>
363      </tr>
364      <tr>
365        <td class="prompt">Hardware</td>
366        <td>
367          <table border="0" cellspacing="0" cellpadding="0">
368          <tr>
369          <td>
370            <select name="hardware_id" size="1"
371              <%=!readCurrentHardware ? "disabled readonly class=\"disabled\"" : ""%>
372              style="width: 20em;">
373            <%
374            if (!readCurrentHardware)
375            {
376              %>
377              <option value="-1">- denied -
378              <%
379            }
380            else
381            {
382              %>
383              <option value="0">- none -
384              <%
385              if (currentHardware != null)
386              {
387                %>
388                <option value="<%=event == null ? currentHardware.getId() : -currentHardware.getId()%>"
389                  selected><%=HTML.encodeTags(currentHardware.getName())%>
390                <%               
391              }
392            }
393            %>
394            </select>
395            &nbsp;
396          </td>
397          <td><base:button onclick="selectHardwareOnClick()"
398            title="Select&hellip;" disabled="<%=!readCurrentHardware%>"/></td>
399          </tr>
400          </table>
401        </td>
402      </tr>
403      <tr valign=top>
404        <td class="prompt">Comment</td>
405        <td nowrap>
406          <textarea <%=clazz%> rows="4" cols="40" 
407            name="comment" wrap="virtual"><%=HTML.encodeTags(event == null ? cc.getPropertyValue("comment") : event.getComment())%></textarea>
408          <a href="javascript:Main.zoom('Comment', 'event', 'comment')" title="Edit in larger window"><base:icon image="zoom.gif" /></a>
409        </td>
410      </tr>
411      </table>
412      <div align=right>&nbsp;<i><base:icon image="required.gif" /> = required information</i></div>
413    </t:tab>
414    </t:tabcontrol>
415
416    <table align="center">
417    <tr>
418      <td width="50%"><base:button onclick="saveSettings()" title="Save" /></td>
419      <td width="50%"><base:button onclick="window.close()" title="Cancel" /></td>
420    </tr>
421    </table>
422    </form>
423  </base:body>
424  </base:page>
425  <%
426}
427finally
428{
429  if (dc != null) dc.close();
430}
431%>
Note: See TracBrowser for help on using the repository browser.