source: trunk/www/biomaterials/bioplates/events/list_events.jsp @ 5951

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

References #1655: GUI improvements

  • Fixes rest of list pages in Biomaterial LIMS menu
  • Introduced an 'iframe' page type so that thos pages doesn't have to 'cannibalise' on the 'popup' page type (doesn't works well with absolutely positioned content).
  • Fixed subclass="dialogbuttons" on all list pages when used in popup form


  • Property svn:eol-style set to native
  • Property svn:keywords set to Date Id
File size: 19.8 KB
Line 
1<%-- $Id $
2  ------------------------------------------------------------------
3  Copyright (C) 2010 Nicklas Nordborg
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 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 Nicklas
23--%>
24<%@page import="net.sf.basedb.core.BioPlateEventParticipant"%>
25<%@ page pageEncoding="UTF-8" session="false"
26  import="net.sf.basedb.core.SessionControl"
27  import="net.sf.basedb.core.DbControl"
28  import="net.sf.basedb.core.Item"
29  import="net.sf.basedb.core.BioPlate"
30  import="net.sf.basedb.core.BioPlateEvent"
31  import="net.sf.basedb.core.ItemQuery"
32  import="net.sf.basedb.core.Include"
33  import="net.sf.basedb.core.ItemResultIterator"
34  import="net.sf.basedb.core.ItemResultList"
35  import="net.sf.basedb.core.ItemContext"
36  import="net.sf.basedb.core.Nameable"
37  import="net.sf.basedb.core.Permission"
38  import="net.sf.basedb.core.PermissionDeniedException"
39  import="net.sf.basedb.core.PlateGeometry"
40  import="net.sf.basedb.core.PluginDefinition"
41  import="net.sf.basedb.core.query.Hql"
42  import="net.sf.basedb.core.query.Restrictions"
43  import="net.sf.basedb.core.query.Expressions"
44  import="net.sf.basedb.core.query.Orders"
45  import="net.sf.basedb.core.plugin.GuiContext"
46  import="net.sf.basedb.core.plugin.Plugin"
47  import="net.sf.basedb.core.Type"
48  import="net.sf.basedb.util.Enumeration"
49  import="net.sf.basedb.util.ShareableUtil"
50  import="net.sf.basedb.clients.web.Base"
51  import="net.sf.basedb.clients.web.ChangeHistoryUtil"
52  import="net.sf.basedb.clients.web.ModeInfo"
53  import="net.sf.basedb.clients.web.PermissionUtil"
54  import="net.sf.basedb.clients.web.util.HTML"
55  import="net.sf.basedb.util.Values"
56  import="net.sf.basedb.util.formatter.Formatter"
57  import="net.sf.basedb.clients.web.formatter.FormatterFactory"
58  import="net.sf.basedb.clients.web.extensions.ExtensionsControl"
59  import="net.sf.basedb.clients.web.extensions.JspContext"
60  import="net.sf.basedb.clients.web.extensions.renderer.PrefixSuffixRenderer"
61  import="net.sf.basedb.clients.web.extensions.toolbar.ToolbarUtil"
62  import="net.sf.basedb.util.extensions.ExtensionsInvoker"
63  import="java.util.Iterator" 
64  import="java.util.List"
65  import="java.util.Map"
66  import="java.util.Date"
67%>
68<%@ taglib prefix="base" uri="/WEB-INF/base.tld" %>
69<%@ taglib prefix="tbl" uri="/WEB-INF/table.tld" %>
70<%@ taglib prefix="t" uri="/WEB-INF/tab.tld" %>
71<%@ taglib prefix="p" uri="/WEB-INF/path.tld" %>
72<%@ taglib prefix="ext" uri="/WEB-INF/extensions.tld" %>
73<%!
74  private static final Item itemType = Item.BIOPLATEEVENT;
75  private static final GuiContext guiContext = new GuiContext(itemType, GuiContext.Type.LIST);
76%>
77<%
78final int bioPlateId = Values.getInt(request.getParameter("bioplate_id"));
79final SessionControl sc = Base.getExistingSessionControl(pageContext, Permission.DENIED, itemType);
80final String ID = sc.getId();
81final boolean createPermission = sc.hasPermission(Permission.CREATE, itemType);
82final ItemContext cc = Base.getAndSetCurrentContext(sc, itemType, null, null);
83
84final ModeInfo mode =  ModeInfo.get(request.getParameter("mode"));
85final String callback = request.getParameter("callback");
86final String title = mode.generateTitle("bioplate event", "bioplate events");
87final DbControl dc = sc.newDbControl();
88ItemResultIterator<BioPlateEvent> events = null;
89try
90{
91
92  final BioPlate bioPlate = BioPlate.getById(dc, bioPlateId);
93  Map<Plugin.MainType, Integer> pluginCount = PluginDefinition.countPlugins(dc, guiContext);
94  try
95  {
96    final ItemQuery<BioPlateEvent> query = Base.getConfiguredQuery(dc, cc, true, bioPlate.getEvents(), mode);
97    events = query.iterate(dc);
98  }
99  catch (Throwable t)
100  {
101    cc.setMessage(t.getMessage());
102    t.printStackTrace();
103  }
104  int numListed = 0;
105  Formatter<Date> dateFormatter = FormatterFactory.getDateFormatter(sc);
106  JspContext jspContext = ExtensionsControl.createContext(dc, pageContext, guiContext, bioPlate);
107  ExtensionsInvoker invoker = ToolbarUtil.useExtensions(jspContext);
108  %>
109  <base:page title="<%=title%>" type="<%=mode.getPageType()%>">
110  <base:head scripts="table.js,tabcontrol.js" styles="table.css,toolbar.css,headertabcontrol.css,path.css">
111    <ext:scripts context="<%=jspContext%>" />
112    <ext:stylesheets context="<%=jspContext%>" />
113    <script language="JavaScript">
114    var submitPage = 'index.jsp';
115    var formId = 'events';
116    function editItem(itemId)
117    {
118      Main.viewOrEditItem('<%=ID%>', '<%=itemType.name()%>', itemId, true);
119    }
120    function viewItem(itemId)
121    {
122      Main.viewOrEditItem('<%=ID%>', '<%=itemType.name()%>', itemId, false, '&bioplate_id=<%=bioPlateId%>');
123    }
124    function itemOnClick(evt, itemId)
125    {
126      Table.itemOnClick(formId, evt, itemId, '<%=mode.getName()%>', viewItem, editItem, returnSelected);
127    }
128    function deleteItems()
129    {
130      var frm = document.forms[formId];
131      if (Forms.numChecked(frm) == 0)
132      {
133        alert('Please select at least one item in the list');
134        return;
135      }
136      frm.action = submitPage;
137      frm.cmd.value = 'DeleteItems';
138      frm.submit();
139    }
140    function restoreItems()
141    {
142      var frm = document.forms[formId];
143      if (Forms.numChecked(frm) == 0)
144      {
145        alert('Please select at least one item in the list');
146        return;
147      }
148      frm.action = submitPage;
149      frm.cmd.value = 'RestoreItems';
150      frm.submit();
151    }
152    function deleteItemPermanently(itemId)
153    {
154      Main.deleteItemPermanently('<%=ID%>', true, '<%=itemType.name()%>', itemId);
155    }
156    function setOwner()
157    {
158      Table.setOwnerOfItems(submitPage, '<%=ID%>', formId, '<%=itemType.name()%>', 'SetOwnerOfItems');
159    }
160    function shareItem(itemId)
161    {
162      Main.openPopup('index.jsp?ID=<%=ID%>&cmd=ShareItem&item_id='+itemId, 'ShareEvent', 600, 400);
163    }
164    function shareItems()
165    {
166      Table.shareItems(submitPage, '<%=ID%>', formId, '<%=itemType.name()%>', 'ShareItems');
167    }
168    function configureColumns()
169    {
170      Table.configureColumns('<%=ID%>', formId, '<%=itemType.name()%>', '<%=(String)cc.getObject("defaultColumns")%>');
171    }
172    function runPlugin(cmd)
173    {
174      Table.submitToPopup(formId, cmd, 750, 500);
175    }
176    function returnSelected()
177    {
178      Table.returnSelected(formId, <%=callback != null ? "window.opener."+callback : "null" %>);
179      window.close();
180    }
181    function presetOnChange()
182    {
183      Table.presetOnChange('<%=ID%>', formId, '<%=itemType.name()%>', '<%=(String)cc.getObject("defaultColumns")%>');
184    }
185    function switchTab(tabControlId, tabId)
186    {
187      if (tabId == 'properties' || tabId == 'annotations' || tabId == 'history')
188      {
189        location.href = '../index.jsp?ID=<%=ID%>&cmd=ViewItem&item_id=<%=bioPlateId%>&tab='+tabId;
190      }
191      else if (tabId == 'biowells')
192      {
193        location.href = '../wells/index.jsp?ID=<%=ID%>&bioplate_id=<%=bioPlateId%>';
194      }
195      else
196      {
197        TabControl.setActiveTab(tabControlId, tabId);
198      }
199    }
200    </script>
201  </base:head>
202 
203  <base:body>
204    <%
205    if (!mode.isSelectionMode())
206    {
207      %>
208      <p:path><p:pathelement 
209        title="Bioplates" href="<%="../index.jsp?ID="+ID%>" 
210        /><p:pathelement title="<%=HTML.encodeTags(bioPlate.getName())%>"
211        /></p:path>
212      <%
213    }
214    else
215    {
216      %>
217      <h1><%=title %></h1>
218      <%
219    }
220    %>
221   
222    <t:tabcontrol 
223      id="main" 
224      subclass="content mastertabcontrol"
225      notabs="<%=mode.isSelectionMode() %>"
226      active="events" switch="switchTab">
227    <t:tab id="properties" title="Properties" />
228    <t:tab id="annotations" title="Annotations" />       
229    <t:tab id="biowells" title="Wells" />
230    <t:tab id="events" title="Plate events">
231    <tbl:table 
232      id="events" 
233      columns="<%=cc.getSetting("columns")%>"
234      sortby="<%=cc.getSortProperty()%>" 
235      direction="<%=cc.getSortDirection()%>"
236      action="index.jsp"
237      sc="<%=sc%>"
238      item="<%=itemType%>"
239      subclass="fulltable"
240      >
241      <tbl:hidden 
242        name="mode" 
243        value="<%=mode.getName()%>" 
244      />
245      <tbl:hidden 
246        name="bioplate_id" 
247        value="<%=String.valueOf(bioPlateId)%>" 
248      />
249      <tbl:hidden 
250        name="callback" 
251        value="<%=callback%>" 
252        skip="<%=callback == null%>" 
253      />
254      <tbl:columndef 
255        id="name"
256        property="name"
257        datatype="string"
258        title="Name"
259        sortable="true" 
260        filterable="true"
261        exportable="true"
262        show="always" 
263      />
264      <tbl:columndef 
265        id="id"
266        clazz="uniquecol"
267        property="id"
268        datatype="int"
269        title="ID"
270        sortable="true" 
271        filterable="true"
272        exportable="true" 
273      />
274      <tbl:columndef 
275        id="eventType"
276        property="eventType.name"
277        datatype="string"
278        title="Event type" 
279        sortable="true" 
280        filterable="true" 
281        exportable="true"
282      />     
283      <tbl:columndef 
284        id="role"
285        property="$bpp.role"
286        datatype="string"
287        title="Role" 
288        sortable="true" 
289        filterable="true" 
290        exportable="true"
291      />     
292      <tbl:columndef 
293        id="protocol"
294        property="protocol.name"
295        datatype="string"
296        title="Protocol"
297        sortable="true" 
298        filterable="true"
299        exportable="true"
300      />
301      <tbl:columndef 
302        id="hardware"
303        property="hardware.name"
304        datatype="string"
305        title="Hardware"
306        sortable="true" 
307        filterable="true"
308        exportable="true"
309      />
310      <tbl:columndef 
311        id="eventDate"
312        property="eventDate"
313        datatype="date"
314        title="Date"
315        sortable="true" 
316        filterable="true"
317        exportable="true"
318        formatter="<%=dateFormatter%>"
319      />
320      <tbl:columndef 
321        id="entryDate"
322        property="entryDate"
323        datatype="date"
324        title="Registered"
325        sortable="true" 
326        filterable="true"
327        exportable="true"
328        formatter="<%=dateFormatter%>"
329      />
330      <tbl:columndef
331        id="participants"
332        title="Participants"
333        property="&participants(bioPlate.name)"
334        datatype="string"
335        filterable="true"
336        exportable="true"
337      />
338      <tbl:columndef 
339        id="owner"
340        property="owner.name"
341        datatype="string"
342        title="Owner"
343        sortable="true" 
344        filterable="true"
345        exportable="true"
346      />
347      <tbl:columndef 
348        id="description"
349        property="description"
350        datatype="string"
351        title="Description" 
352        sortable="true" 
353        filterable="true" 
354        exportable="true"
355      />     
356      <tbl:columndef
357        id="permission"
358        title="Permission"
359      />
360      <tbl:columndef
361        id="sharedTo"
362        title="Shared to"
363        filterable="true"
364        filterproperty="!sharedTo.name"
365        datatype="string"
366      />
367      <div class="panelgroup bottomborder">
368        <tbl:toolbar
369          visible="<%=mode.hasToolbar()%>"
370          subclass="bottomborder"
371          >
372          <tbl:button 
373            image="delete.png"
374            onclick="deleteItems()" 
375            title="Delete" 
376            tooltip="Delete the selected items" 
377          />
378          <tbl:button 
379            image="restore.png"
380            onclick="restoreItems()" 
381            title="Restore" 
382            tooltip="Restore the selected (deleted) items"
383          />
384          <tbl:button 
385            image="share.png"
386            onclick="shareItems()" 
387            title="Share&hellip;" 
388            tooltip="Share the selected items"
389          />
390          <tbl:button 
391            image="take_ownership.png"
392            onclick="setOwner()" 
393            title="Set owner&hellip;"
394            tooltip="Change owner of the selected items"
395          />
396          <tbl:button 
397            image="columns.png" 
398            onclick="configureColumns()" 
399            title="Columns&hellip;" 
400            tooltip="Show, hide and re-order columns" 
401          />
402          <tbl:button 
403            image="import.png" 
404            onclick="runPlugin('ImportItems')" 
405            title="Import&hellip;" 
406            tooltip="Import data" 
407            visible="<%=pluginCount.containsKey(Plugin.MainType.IMPORT)%>"
408          />
409          <tbl:button 
410            image="export.png" 
411            onclick="runPlugin('ExportItems')" 
412            title="Export&hellip;" 
413            tooltip="Export data" 
414            visible="<%=pluginCount.containsKey(Plugin.MainType.EXPORT)%>"
415          />
416          <tbl:button 
417            image="runplugin.png" 
418            onclick="runPlugin('RunListPlugin')" 
419            title="Run plugin&hellip;" 
420            tooltip="Run a plugin" 
421            visible="<%=pluginCount.containsKey(Plugin.MainType.OTHER)%>"
422          />
423          <ext:render extensions="<%=invoker%>" context="<%=jspContext%>" 
424            wrapper="<%=new PrefixSuffixRenderer(jspContext, "<td>", "</td>") %>"/>
425        </tbl:toolbar>
426        <tbl:panel>
427          <tbl:presetselector 
428            onchange="presetOnChange()"
429          />
430          <tbl:navigator
431            page="<%=cc.getPage()%>" 
432            rowsperpage="<%=cc.getRowsPerPage()%>" 
433            totalrows="<%=events == null ? 0 : events.getTotalCount()%>" 
434            visible="<%=mode.hasNavigator()%>"
435          />
436        </tbl:panel>
437      </div>
438      <tbl:data>
439        <tbl:headers>
440          <tbl:headerrow>
441            <tbl:header colspan="3" />
442            <tbl:columnheaders />
443          </tbl:headerrow>
444          <tbl:headerrow>
445            <tbl:header subclass="index" />
446            <tbl:header 
447              subclass="check" 
448              visible="<%=mode.hasCheck()%>"
449              ><base:icon 
450                image="check_uncheck.png" 
451                tooltip="Check/uncheck all" 
452                onclick="Forms.checkUncheck(document.forms[formId])" 
453              /></tbl:header>
454            <tbl:header 
455              subclass="check" 
456              visible="<%=mode.hasRadio()%>"
457              />
458            <tbl:header 
459              subclass="icons" 
460              visible="<%=mode.hasIcons()%>"
461              />
462            <tbl:propertyfilter />
463          </tbl:headerrow>
464        </tbl:headers>
465        <tbl:rows>
466          <%
467          if (cc.getMessage() != null)
468          {
469            %>
470            <tbl:panel clazz="messagepanel">
471              <div class="messagecontainer error"><%=cc.getMessage()%></div>
472            </tbl:panel>
473            <%
474            cc.setMessage(null);
475          }
476          int index = cc.getPage()*cc.getRowsPerPage();
477          int selectedItemId = cc.getId();
478          if (events != null)
479          {           
480            while (events.hasNext())
481            {
482              BioPlateEvent item = events.next();
483              int itemId = item.getId();
484              boolean usePermission = item.hasPermission(Permission.USE);
485              String openSharePopup = "shareItem("+itemId+")";
486              String deletePermanently = "deleteItemPermanently("+itemId+")";
487              boolean deletePermission = item.hasPermission(Permission.DELETE);
488              boolean sharePermission = item.hasPermission(Permission.SET_PERMISSION);
489              boolean writePermission = item.hasPermission(Permission.WRITE);
490              String tooltip = mode.isSelectionMode() ?
491                  "Select this item" : "View this item" + (writePermission ? " (use CTRL, ALT or SHIFT to edit)" : "");
492              String name = HTML.encodeTags(item.getName());
493              index++;
494              numListed++;
495              %>
496              <tbl:row>
497                <tbl:header 
498                  clazz="index"
499                  ><%=index%></tbl:header>
500                <tbl:header 
501                  clazz="check" 
502                  visible="<%=mode.hasCheck()%>"
503                  ><input 
504                    type="checkbox" 
505                    name="<%=itemId%>" 
506                    value="<%=itemId%>" 
507                    title="<%=name%>" 
508                    <%=cc.getSelected().contains(itemId) ? "checked" : ""%> 
509                  ></tbl:header>
510                <tbl:header 
511                  clazz="check" 
512                  visible="<%=mode.hasRadio()%>"
513                  ><input 
514                    type="radio" 
515                    name="item_id" 
516                    value="<%=itemId%>" 
517                    title="<%=name%>" 
518                    <%=selectedItemId == itemId ? "checked" : ""%>
519                  ></tbl:header>
520                <tbl:header 
521                  clazz="icons" 
522                  visible="<%=mode.hasIcons()%>"
523                  ><base:icon 
524                    image="deleted.png"
525                    onclick="<%=deletePermission ? deletePermanently : null%>"
526                    tooltip="This item has been scheduled for deletion" 
527                    visible="<%=item.isRemoved()%>"
528                  /><base:icon 
529                    image="shared.png" 
530                    onclick="<%=sharePermission ? openSharePopup : null%>"
531                    tooltip="This item is shared to other users, groups and/or projects" 
532                    visible="<%=item.isShared()%>"
533                  />&nbsp;</tbl:header>
534                <tbl:cell column="name"><div class="link" 
535                  onclick="itemOnClick(<%=writePermission ? "event" : null%>, <%=itemId%>)"
536                  title="<%=tooltip%>"><%=name%></div></tbl:cell>
537                <tbl:cell column="id"><%=item.getId()%></tbl:cell>
538                <tbl:cell column="eventType"><base:propertyvalue 
539                    item="<%=item%>" 
540                    property="eventType"
541                    enableEditLink="<%=mode.hasEditLink()%>" 
542                    enablePropertyLink="<%=mode.hasPropertyLink()%>"
543                  /></tbl:cell>
544                <tbl:cell column="role"><%=HTML.encodeTags(item.getParticipant(bioPlate).getRole())%></tbl:cell>
545                <tbl:cell column="protocol"
546                  ><base:propertyvalue 
547                    item="<%=item%>" 
548                    property="protocol"
549                    enableEditLink="<%=mode.hasEditLink()%>" 
550                    enablePropertyLink="<%=mode.hasPropertyLink()%>"
551                  /></tbl:cell>
552                <tbl:cell column="hardware"
553                  ><base:propertyvalue 
554                    item="<%=item%>" 
555                    property="hardware"
556                    enableEditLink="<%=mode.hasEditLink()%>" 
557                    enablePropertyLink="<%=mode.hasPropertyLink()%>"
558                  /></tbl:cell>
559                <tbl:cell column="eventDate" value="<%=item.getEventDate()%>" />
560                <tbl:cell column="entryDate" value="<%=item.getEntryDate()%>" />
561                <tbl:cell column="participants">
562                  <%
563                  ItemQuery<BioPlateEventParticipant> participantQuery = item.getParticipants();
564                  participantQuery.join(Hql.innerJoin(null, "bioPlate", "bpl", true));
565                  participantQuery.include(Include.ALL);
566                  participantQuery.order(Orders.asc(Hql.property("role")));
567                  participantQuery.order(Orders.asc(Hql.property("index")));
568                  participantQuery.order(Orders.asc(Hql.property("bpl", "name")));
569                  for (BioPlateEventParticipant participant : participantQuery.list(dc))
570                  {
571                    %>
572                    <base:propertyvalue 
573                      item="<%=participant%>" 
574                      property="bioPlate" 
575                      enableEditLink="<%=mode.hasEditLink()%>" 
576                      enablePropertyLink="<%=mode.hasPropertyLink()%>"
577                    /> (<%=participant.getRole()%>)<br>
578                    <%
579                  }
580                  %>
581                </tbl:cell>
582                <tbl:cell column="owner"
583                  ><base:propertyvalue 
584                    item="<%=item%>" 
585                    property="owner"
586                    enableEditLink="<%=mode.hasEditLink()%>" 
587                    enablePropertyLink="<%=mode.hasPropertyLink()%>" 
588                  /></tbl:cell>
589                <tbl:cell column="description"><%=HTML.encodeTags(item.getDescription())%></tbl:cell>               
590                <tbl:cell column="permission"><%=PermissionUtil.getShortPermissions(item)%></tbl:cell>
591                <tbl:cell column="sharedTo">
592                  <%
593                  Iterator<Nameable> sharees = ShareableUtil.getSharedTo(dc, item).iterator();
594                  while(sharees.hasNext())
595                  {
596                    Nameable n = sharees.next();
597                    if (mode.hasPropertyLink())
598                    {
599                      out.write(Base.getLinkedName(ID, n, false, mode.hasEditLink()));
600                    }
601                    else
602                    {
603                      out.write(HTML.encodeTags(n.getName()));
604                    }
605                    out.write(sharees.hasNext() ? ", " : "");
606                  }
607                  %>
608                </tbl:cell>
609              </tbl:row>
610              <%
611              }
612            }
613          if (numListed == 0)
614          {
615            %>
616            <tbl:panel clazz="messagepanel">
617              <div class="messagecontainer note">
618                <%=events == null || events.getTotalCount() == 0 ? "No events were found" : "No events on this page. Please select another page!" %>
619              </div>
620            </tbl:panel>
621            <%
622          }
623          %>
624        </tbl:rows>
625      </tbl:data>
626    </tbl:table>
627    </t:tab>
628    <t:tab id="history" title="Change history" 
629        tooltip="Displays a log of all modifications made to this item"
630        visible="<%=ChangeHistoryUtil.showChangeHistoryTab(sc)%>" />
631    </t:tabcontrol>
632
633    <base:buttongroup subclass="dialogbuttons">
634      <base:button onclick="returnSelected();" title="Ok" visible="<%=mode.hasOkButton()%>" />
635      <base:button onclick="window.close();" title="Cancel" visible="<%=mode.hasCancelButton()%>" />
636      <base:button onclick="window.close();" title="Close" visible="<%=mode.hasCloseButton()%>" />
637    </base:buttongroup>
638
639  </base:body>
640  </base:page>
641  <%
642}
643finally
644{
645  if (events != null) events.close();
646  if (dc != null) dc.close();
647}
648%>
Note: See TracBrowser for help on using the repository browser.