source: trunk/www/lims/plates/events/list_events.jsp @ 5062

Last change on this file since 5062 was 5062, checked in by Nicklas Nordborg, 14 years ago

References #108: Logging the change history of an item

  • Added "Change history" tab to view pages for Array lims items.
  • Property svn:eol-style set to native
  • Property svn:keywords set to Date Id
File size: 15.6 KB
Line 
1<%-- $Id: list_events.jsp 5062 2009-08-19 09:35:32Z nicklas $
2  ------------------------------------------------------------------
3  Copyright (C) 2006 Jari Häkkinen, Nicklas Nordborg, Martin Svensson
4  Copyright (C) 2007 Johan Enell
5
6  This file is part of BASE - BioArray Software Environment.
7  Available at http://base.thep.lu.se/
8
9  BASE is free software; you can redistribute it and/or
10  modify it under the terms of the GNU General Public License
11  as published by the Free Software Foundation; either version 3
12  of the License, or (at your option) any later version.
13
14  BASE is distributed in the hope that it will be useful,
15  but WITHOUT ANY WARRANTY; without even the implied warranty of
16  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17  GNU General Public License for more details.
18
19  You should have received a copy of the GNU General Public License
20  along with BASE. If not, see <http://www.gnu.org/licenses/>.
21  ------------------------------------------------------------------
22
23  @author Nicklas
24  @version 2.0
25--%>
26<%@ page session="false"
27  import="net.sf.basedb.core.SessionControl"
28  import="net.sf.basedb.core.DbControl"
29  import="net.sf.basedb.core.Item"
30  import="net.sf.basedb.core.ItemContext"
31  import="net.sf.basedb.core.Plate"
32  import="net.sf.basedb.core.PlateEvent"
33  import="net.sf.basedb.core.PlateEventType"
34  import="net.sf.basedb.core.ItemQuery"
35  import="net.sf.basedb.core.ItemResultIterator"
36  import="net.sf.basedb.core.Permission"
37  import="net.sf.basedb.core.PluginDefinition"
38  import="net.sf.basedb.core.PermissionDeniedException"
39  import="net.sf.basedb.core.query.Restrictions"
40  import="net.sf.basedb.core.query.Expressions"
41  import="net.sf.basedb.core.query.Orders"
42  import="net.sf.basedb.core.query.Hql"
43  import="net.sf.basedb.core.plugin.GuiContext"
44  import="net.sf.basedb.core.plugin.Plugin"
45  import="net.sf.basedb.clients.web.Base"
46  import="net.sf.basedb.clients.web.ModeInfo"
47  import="net.sf.basedb.clients.web.ChangeHistoryUtil"
48  import="net.sf.basedb.clients.web.PermissionUtil"
49  import="net.sf.basedb.clients.web.util.HTML"
50  import="net.sf.basedb.util.Values"
51  import="net.sf.basedb.util.formatter.Formatter"
52  import="net.sf.basedb.clients.web.formatter.FormatterFactory"
53  import="net.sf.basedb.clients.web.extensions.ExtensionsControl"
54  import="net.sf.basedb.clients.web.extensions.JspContext"
55  import="net.sf.basedb.clients.web.extensions.renderer.PrefixSuffixRenderer"
56  import="net.sf.basedb.clients.web.extensions.toolbar.ToolbarUtil"
57  import="net.sf.basedb.util.extensions.ExtensionsInvoker"
58  import="java.util.List"
59  import="java.util.Map"
60  import="java.util.Date"
61%>
62<%@ taglib prefix="base" uri="/WEB-INF/base.tld" %>
63<%@ taglib prefix="tbl" uri="/WEB-INF/table.tld" %>
64<%@ taglib prefix="t" uri="/WEB-INF/tab.tld" %>
65<%@ taglib prefix="p" uri="/WEB-INF/path.tld" %>
66<%@ taglib prefix="ext" uri="/WEB-INF/extensions.tld" %>
67<%!
68  private static final Item itemType = Item.PLATEEVENT;
69  private static final GuiContext guiContext = new GuiContext(itemType, GuiContext.Type.LIST);
70%>
71<%
72final int plateId = Values.getInt(request.getParameter("plate_id"));
73final SessionControl sc = Base.getExistingSessionControl(pageContext, Permission.DENIED, itemType);
74final String ID = sc.getId();
75final ItemContext cc = Base.getAndSetCurrentContext(sc, itemType, null, null);
76
77final ModeInfo mode = ModeInfo.get(request.getParameter("mode"));
78final String callback = request.getParameter("callback");
79final String title = mode.generateTitle("event", "events");
80final DbControl dc = sc.newDbControl();
81ItemResultIterator<PlateEvent> events = null;
82try
83{
84  final Plate plate = Plate.getById(dc, plateId);
85  final boolean createPermission = plate.hasPermission(Permission.WRITE);
86  final boolean deletePermission = createPermission;
87
88  Formatter<Date> dateFormatter = FormatterFactory.getDateFormatter(sc);
89
90  Map<Plugin.MainType, Integer> pluginCount = PluginDefinition.countPlugins(dc, guiContext);
91  try
92  {
93    final ItemQuery<PlateEvent> query = Base.getConfiguredQuery(cc, true, plate.getEvents(), mode);
94    events = query.iterate(dc);
95  }
96  catch (Throwable t)
97  {
98    cc.setMessage(t.getMessage());
99  }
100  int numListed = 0;
101  JspContext jspContext = ExtensionsControl.createContext(dc, pageContext, guiContext, plate);
102  ExtensionsInvoker invoker = ToolbarUtil.useExtensions(jspContext);
103  %>
104  <base:page title="<%=title%>" type="<%=mode.getPageType()%>">
105  <base:head scripts="table.js,tabcontrol.js" styles="table.css,headertabcontrol.css,path.css">
106    <ext:scripts context="<%=jspContext%>" />
107    <ext:stylesheets context="<%=jspContext%>" />
108    <script language="JavaScript">
109    var submitPage = 'index.jsp';
110    var formId = 'events';
111    function newItem()
112    {
113      Main.viewOrEditItem('<%=ID%>', '<%=itemType.name()%>', 0, true, '&plate_id=<%=plateId%>');
114    }
115    function editItem(itemId)
116    {
117      Main.viewOrEditItem('<%=ID%>', '<%=itemType.name()%>', itemId, true);
118    }
119    function viewItem(itemId)
120    {
121      Main.viewOrEditItem('<%=ID%>', '<%=itemType.name()%>', itemId, false);
122    }
123    function itemOnClick(evt, itemId)
124    {
125      Table.itemOnClick(formId, evt, itemId, '<%=mode.getName()%>', viewItem, editItem, returnSelected);
126    }
127    function deleteItems()
128    {
129      var frm = document.forms[formId];
130      var numChecked = Forms.numChecked(frm);
131      if (numChecked == 0)
132      {
133        alert('Please select at least one item in the list');
134        return;
135      }
136      else
137      {
138        var rep = numChecked == 1 ? 'event' : 'events';
139        if (!confirm('You are about to delete '+numChecked+' '+rep+'. This can\'t be undone. Continue?'))
140        {
141          return;
142        }
143      }
144      frm.action = submitPage;
145      frm.cmd.value = 'DeleteItems';
146      frm.submit();
147    }
148    function configureColumns()
149    {
150      Table.configureColumns('<%=ID%>', formId, '<%=itemType.name()%>', '<%=(String)cc.getObject("defaultColumns")%>');
151    }
152    function runPlugin(cmd)
153    {
154      Table.submitToPopup(formId, cmd, 540, 460);
155    }
156    function returnSelected()
157    {
158      Table.returnSelected(formId, <%=callback != null ? "window.opener."+callback : "null" %>);
159      window.close();
160    }
161    function presetOnChange()
162    {
163      Table.presetOnChange('<%=ID%>', formId, '<%=itemType.name()%>', '<%=(String)cc.getObject("defaultColumns")%>');
164    }
165    function switchTab(tabControlId, tabId)
166    {
167      if (tabId == 'properties' || tabId == 'annotations' || tabId == 'history')
168      {
169        location.href = '../index.jsp?ID=<%=ID%>&cmd=ViewItem&item_id=<%=plateId%>&tab='+tabId;
170      }
171      else if (tabId == 'wells')
172      {
173        location.href = '../wells/index.jsp?ID=<%=ID%>&plate_id=<%=plateId%>';
174      }
175      else
176      {
177        TabControl.setActiveTab(tabControlId, tabId);
178      }
179    }
180    </script>
181  </base:head>
182 
183  <base:body>
184    <p>
185    <p:path>
186      <p:pathelement title="Plates" href="<%="../index.jsp?ID="+ID%>" />
187      <p:pathelement title="<%=HTML.encodeTags(plate.getName())%>" />
188    </p:path>
189
190    <t:tabcontrol id="main" active="events" switch="switchTab">
191    <t:tab id="properties" title="Properties" />
192    <t:tab id="annotations" title="Annotations" />
193   
194    <t:tab id="events" title="Events">
195   
196    <%
197    if (cc.getMessage() != null)
198    {
199      %>
200      <div class="error"><%=cc.getMessage()%></div>
201      <%
202      cc.setMessage(null);
203    }
204    %>
205    <tbl:table 
206      id="events" 
207      clazz="itemlist" 
208      columns="<%=cc.getSetting("columns")%>"
209      sortby="<%=cc.getSortProperty()%>" 
210      direction="<%=cc.getSortDirection()%>"
211      title="<%=title%>"
212      action="index.jsp"
213      sc="<%=sc%>"
214      item="<%=itemType%>"
215      >
216      <tbl:hidden 
217        name="mode" 
218        value="<%=mode.getName()%>" 
219      />
220      <tbl:hidden 
221        name="plate_id" 
222        value="<%=String.valueOf(plateId)%>" 
223      />
224      <tbl:hidden 
225        name="callback" 
226        value="<%=callback%>" 
227        skip="<%=callback == null%>" 
228      />
229      <tbl:columndef 
230        id="ordinal"
231        property="plateEventType.ordinal"
232        datatype="int"
233        title="Ordinal"
234        sortable="true" 
235        filterable="true"
236        exportable="true"
237        show="always" 
238      />
239      <tbl:columndef 
240        id="id"
241        clazz="uniquecol"
242        property="id"
243        datatype="int"
244        title="ID"
245        sortable="true"
246        filterable="true"
247        exportable="true"
248      />
249      <tbl:columndef 
250        id="eventType"
251        property="plateEventType.name"
252        datatype="string"
253        title="Event type"
254        sortable="true" 
255        filterable="true"
256        exportable="true"
257        show="always" 
258      />
259      <tbl:columndef 
260        id="eventDate"
261        property="eventDate"
262        datatype="date"
263        title="Created"
264        sortable="true" 
265        filterable="true"
266        exportable="true"
267        formatter="<%=dateFormatter%>"
268      />
269      <tbl:columndef 
270        id="entryDate"
271        property="entryDate"
272        datatype="date"
273        title="Registered"
274        sortable="true" 
275        filterable="true"
276        exportable="true"
277        formatter="<%=dateFormatter%>"
278      />
279      <tbl:columndef 
280        id="protocol"
281        property="protocol.name"
282        datatype="string"
283        title="Protocol"
284        sortable="true" 
285        filterable="true"
286        exportable="true"
287      />
288      <tbl:columndef
289        id="hardware"
290        property="hardware.name"
291        datatype="string"
292        title="Hardware"
293        sortable="true"
294        filterable="true"
295        exportable="true"
296      />
297      <tbl:columndef 
298        id="comment"
299        property="comment"
300        datatype="string"
301        title="Comment" 
302        sortable="true" 
303        filterable="true" 
304        exportable="true"
305      />
306      <tbl:columndef 
307        id="user"
308        property="user.name"
309        datatype="string"
310        title="User"
311        sortable="true" 
312        filterable="true"
313        exportable="true"
314      />
315      <tbl:toolbar
316        visible="<%=mode.hasToolbar()%>"
317        >
318        <tbl:button 
319          disabled="<%=createPermission ? false : true%>" 
320          image="<%=createPermission ? "new.gif" : "new_disabled.gif"%>" 
321          onclick="newItem()" 
322          title="New&hellip;" 
323          tooltip="<%=createPermission ? "Create new event" : "You do not have permission to create events"%>" 
324        />
325        <tbl:button 
326          disabled="<%=deletePermission ? false : true%>" 
327          image="<%=deletePermission ? "delete.gif" : "delete_disabled.gif"%>" 
328          title="Delete&hellip;"
329          onclick="deleteItems()" 
330          tooltip="<%=deletePermission ? "Delete the selected events" : "You do not have permission to delete events"%>" 
331        />
332        <tbl:button 
333          image="columns.gif" 
334          onclick="configureColumns()" 
335          title="Columns&hellip;" 
336          tooltip="Show, hide and re-order columns" 
337        />
338        <tbl:button 
339          image="import.gif" 
340          onclick="runPlugin('ImportItems')" 
341          title="Import&hellip;" 
342          tooltip="Import data" 
343          visible="<%=pluginCount.containsKey(Plugin.MainType.IMPORT)%>"
344        />
345        <tbl:button 
346          image="export.gif" 
347          onclick="runPlugin('ExportItems')" 
348          title="Export&hellip;" 
349          tooltip="Export data" 
350          visible="<%=pluginCount.containsKey(Plugin.MainType.EXPORT)%>"
351        />
352        <tbl:button 
353          image="runplugin.gif" 
354          onclick="runPlugin('RunListPlugin')" 
355          title="Run plugin&hellip;" 
356          tooltip="Run a plugin" 
357          visible="<%=pluginCount.containsKey(Plugin.MainType.OTHER)%>"
358        />
359        <ext:render extensions="<%=invoker%>" context="<%=jspContext%>" 
360          wrapper="<%=new PrefixSuffixRenderer(jspContext, "<td>", "</td>") %>"/>
361      </tbl:toolbar>
362      <tbl:navigator
363        page="<%=cc.getPage()%>" 
364        rowsperpage="<%=cc.getRowsPerPage()%>" 
365        totalrows="<%=events == null ? 0 : events.getTotalCount()%>" 
366        visible="<%=mode.hasNavigator()%>"
367      />
368      <tbl:data>
369        <tbl:columns>
370        <tbl:presetselector 
371          clazz="columnheader"
372          colspan="3"
373          onchange="presetOnChange()"
374        />
375        </tbl:columns>
376         
377        <tr>
378          <tbl:header 
379            clazz="index"
380            >&nbsp;</tbl:header>
381          <tbl:header 
382            clazz="check" 
383            visible="<%=mode.hasCheck()%>"
384            ><base:icon 
385              image="check_uncheck.gif" 
386              tooltip="Check/uncheck all" 
387              onclick="Forms.checkUncheck(document.forms[formId])" style="align: left;"
388            /></tbl:header>
389          <tbl:header 
390            clazz="check" 
391            visible="<%=mode.hasRadio()%>"
392            />
393          <tbl:header 
394            clazz="icons" 
395            visible="<%=mode.hasIcons()%>"
396            >&nbsp;</tbl:header>
397          <tbl:propertyfilter />
398        </tr>
399   
400          <tbl:rows>
401          <%
402          int index = cc.getPage()*cc.getRowsPerPage();
403          int selectedItemId = cc.getId();
404          if (events != null)
405          {
406            while (events.hasNext())
407            {
408              PlateEvent item = events.next();
409              PlateEventType eventType = item.getPlateEventType();
410              int itemId = item.getId();
411              String name = HTML.encodeTags(eventType.getName());
412              boolean writePermission = item.hasPermission(Permission.WRITE);
413              String tooltip = mode.isSelectionMode() ? 
414                  "Select this item" : "View this item" + (writePermission ? " (use CTRL, ALT or SHIFT to edit)" : "");
415              index++;
416              numListed++;
417              %>
418              <tbl:row>
419                <tbl:header 
420                  clazz="index"
421                  ><%=index%></tbl:header>
422                <tbl:header 
423                  clazz="check" 
424                  visible="<%=mode.hasCheck()%>"
425                  ><input 
426                      type="checkbox" 
427                      name="<%=itemId%>" 
428                      value="<%=itemId%>" 
429                      title="<%=name%>" 
430                      <%=cc.getSelected().contains(itemId) ? "checked" : ""%>
431                    ></tbl:header>
432                <tbl:header 
433                  clazz="check" 
434                  visible="<%=mode.hasRadio()%>"
435                  ><input 
436                      type="radio" 
437                      name="item_id" 
438                      value="<%=itemId%>" 
439                      title="<%=name%>" 
440                      <%=selectedItemId == itemId ? "checked" : ""%>
441                    ></tbl:header>
442                <tbl:header 
443                  clazz="icons" 
444                  visible="<%=mode.hasIcons()%>"
445                  >&nbsp;</tbl:header>
446                <tbl:cell column="ordinal"><%=eventType.getOrdinal()%></tbl:cell>
447                <tbl:cell column="id"><%=item.getId()%></tbl:cell>
448                <tbl:cell column="eventType"><div class="link" 
449                  onclick="itemOnClick(<%=writePermission ? "event" : null%>, <%=itemId%>)" 
450                  title="<%=tooltip%>"><%=name%></div></tbl:cell>
451                <tbl:cell column="protocol"
452                  ><base:propertyvalue 
453                    item="<%=item%>" 
454                    property="protocol"
455                    enableEditLink="<%=mode.hasEditLink()%>" 
456                    enablePropertyLink="<%=mode.hasPropertyLink()%>"
457                  /></tbl:cell>
458                <tbl:cell column="hardware"
459                  ><base:propertyvalue 
460                    item="<%=item%>"
461                    property="hardware"
462                    enableEditLink="<%=mode.hasEditLink()%>"
463                    enablePropertyLink="<%=mode.hasPropertyLink()%>"
464                  /></tbl:cell>
465                <tbl:cell column="entryDate" value="<%=item.getEntryDate()%>" />
466                <tbl:cell column="eventDate" value="<%=item.getEventDate()%>" />
467                <tbl:cell column="comment"><%=HTML.encodeTags(item.getComment())%></tbl:cell>
468                <tbl:cell column="user"
469                  ><base:propertyvalue 
470                    item="<%=item%>" 
471                    property="user"
472                    enableEditLink="<%=mode.hasEditLink()%>" 
473                    enablePropertyLink="<%=mode.hasPropertyLink()%>"
474                  /></tbl:cell>
475              </tbl:row>
476              <%
477            }
478          }
479          %>
480          </tbl:rows>
481        </tbl:data>
482      <%
483      if (numListed == 0)
484      {
485        %>
486        <tbl:panel><%=events == null || events.getTotalCount() == 0 ? "No events were found" : "No events on this page. Please select another page!" %></tbl:panel>
487        <%
488      }
489      else
490      {
491        %>
492        <tbl:navigator
493          page="<%=cc.getPage()%>" 
494          rowsperpage="<%=cc.getRowsPerPage()%>" 
495          totalrows="<%=events == null ? 0 : events.getTotalCount()%>" 
496          visible="<%=mode.hasNavigator()%>"
497          locked="true"
498        />
499        <%
500      }
501      %>
502    </tbl:table>
503    <base:buttongroup align="center">
504      <base:button onclick="returnSelected();" title="Ok" visible="<%=mode.hasOkButton()%>" />
505      <base:button onclick="window.close();" title="Cancel" visible="<%=mode.hasCancelButton()%>" />
506      <base:button onclick="window.close();" title="Close" visible="<%=mode.hasCloseButton()%>" />
507    </base:buttongroup>
508    </t:tab>
509   
510    <t:tab id="wells" title="Wells" />
511    <t:tab id="history" title="Change history" 
512        tooltip="Displays a log of all modifications made to this item"
513        visible="<%=ChangeHistoryUtil.showChangeHistoryTab(sc)%>" />
514    </t:tabcontrol>
515
516 
517  </base:body>
518  </base:page>
519  <%
520}
521finally
522{
523  if (events != null) events.close();
524  if (dc != null) dc.close();
525}
526%>
Note: See TracBrowser for help on using the repository browser.