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

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

References #1655: GUI improvements

Started with the list pages. So far the reporters and the biosurce, sample and extract list pages have been done. The other pages have just been modified to not cause any compilation problems and to display almost ok.

  • Property svn:eol-style set to native
  • Property svn:keywords set to Date Id
File size: 19.4 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    <p>
205    <p:path>
206      <p:pathelement title="Bioplates" href="<%="../index.jsp?ID="+ID%>" />
207      <p:pathelement title="<%=HTML.encodeTags(bioPlate.getName())%>" />
208    </p:path>
209   
210    <t:tabcontrol id="main" active="events" switch="switchTab">
211    <t:tab id="properties" title="Properties" />
212    <t:tab id="annotations" title="Annotations" />       
213    <t:tab id="biowells" title="Wells" />
214    <t:tab id="events" title="Plate events">
215   
216    <%
217    if (cc.getMessage() != null)
218    {
219      %>
220      <div class="error"><%=cc.getMessage()%></div>
221      <%
222      cc.setMessage(null);
223    }
224    %>
225    <tbl:table 
226      id="events" 
227       
228      columns="<%=cc.getSetting("columns")%>"
229      sortby="<%=cc.getSortProperty()%>" 
230      direction="<%=cc.getSortDirection()%>"
231      title="<%=title%>"
232      action="index.jsp"
233      sc="<%=sc%>"
234      item="<%=itemType%>"
235      >
236      <tbl:hidden 
237        name="mode" 
238        value="<%=mode.getName()%>" 
239      />
240      <tbl:hidden 
241        name="bioplate_id" 
242        value="<%=String.valueOf(bioPlateId)%>" 
243      />
244      <tbl:hidden 
245        name="callback" 
246        value="<%=callback%>" 
247        skip="<%=callback == null%>" 
248      />
249      <tbl:columndef 
250        id="name"
251        property="name"
252        datatype="string"
253        title="Name"
254        sortable="true" 
255        filterable="true"
256        exportable="true"
257        show="always" 
258      />
259      <tbl:columndef 
260        id="id"
261        clazz="uniquecol"
262        property="id"
263        datatype="int"
264        title="ID"
265        sortable="true" 
266        filterable="true"
267        exportable="true" 
268      />
269      <tbl:columndef 
270        id="eventType"
271        property="eventType.name"
272        datatype="string"
273        title="Event type" 
274        sortable="true" 
275        filterable="true" 
276        exportable="true"
277      />     
278      <tbl:columndef 
279        id="role"
280        property="$bpp.role"
281        datatype="string"
282        title="Role" 
283        sortable="true" 
284        filterable="true" 
285        exportable="true"
286      />     
287      <tbl:columndef 
288        id="protocol"
289        property="protocol.name"
290        datatype="string"
291        title="Protocol"
292        sortable="true" 
293        filterable="true"
294        exportable="true"
295      />
296      <tbl:columndef 
297        id="hardware"
298        property="hardware.name"
299        datatype="string"
300        title="Hardware"
301        sortable="true" 
302        filterable="true"
303        exportable="true"
304      />
305      <tbl:columndef 
306        id="eventDate"
307        property="eventDate"
308        datatype="date"
309        title="Date"
310        sortable="true" 
311        filterable="true"
312        exportable="true"
313        formatter="<%=dateFormatter%>"
314      />
315      <tbl:columndef 
316        id="entryDate"
317        property="entryDate"
318        datatype="date"
319        title="Registered"
320        sortable="true" 
321        filterable="true"
322        exportable="true"
323        formatter="<%=dateFormatter%>"
324      />
325      <tbl:columndef
326        id="participants"
327        title="Participants"
328        property="&participants(bioPlate.name)"
329        datatype="string"
330        filterable="true"
331        exportable="true"
332      />
333      <tbl:columndef 
334        id="owner"
335        property="owner.name"
336        datatype="string"
337        title="Owner"
338        sortable="true" 
339        filterable="true"
340        exportable="true"
341      />
342      <tbl:columndef 
343        id="description"
344        property="description"
345        datatype="string"
346        title="Description" 
347        sortable="true" 
348        filterable="true" 
349        exportable="true"
350      />     
351      <tbl:columndef
352        id="permission"
353        title="Permission"
354      />
355      <tbl:columndef
356        id="sharedTo"
357        title="Shared to"
358        filterable="true"
359        filterproperty="!sharedTo.name"
360        datatype="string"
361      />
362      <tbl:toolbar
363        visible="<%=mode.hasToolbar()%>"
364        >
365        <tbl:button 
366          image="delete.png"
367          onclick="deleteItems()" 
368          title="Delete" 
369          tooltip="Delete the selected items" 
370        />
371        <tbl:button 
372          image="restore.png"
373          onclick="restoreItems()" 
374          title="Restore" 
375          tooltip="Restore the selected (deleted) items"
376        />
377        <tbl:button 
378          image="share.png"
379          onclick="shareItems()" 
380          title="Share&hellip;" 
381          tooltip="Share the selected items"
382        />
383        <tbl:button 
384          image="take_ownership.png"
385          onclick="setOwner()" 
386          title="Set owner&hellip;"
387          tooltip="Change owner of the selected items"
388        />
389        <tbl:button 
390          image="columns.png" 
391          onclick="configureColumns()" 
392          title="Columns&hellip;" 
393          tooltip="Show, hide and re-order columns" 
394        />
395        <tbl:button 
396          image="import.png" 
397          onclick="runPlugin('ImportItems')" 
398          title="Import&hellip;" 
399          tooltip="Import data" 
400          visible="<%=pluginCount.containsKey(Plugin.MainType.IMPORT)%>"
401        />
402        <tbl:button 
403          image="export.png" 
404          onclick="runPlugin('ExportItems')" 
405          title="Export&hellip;" 
406          tooltip="Export data" 
407          visible="<%=pluginCount.containsKey(Plugin.MainType.EXPORT)%>"
408        />
409        <tbl:button 
410          image="runplugin.png" 
411          onclick="runPlugin('RunListPlugin')" 
412          title="Run plugin&hellip;" 
413          tooltip="Run a plugin" 
414          visible="<%=pluginCount.containsKey(Plugin.MainType.OTHER)%>"
415        />
416        <ext:render extensions="<%=invoker%>" context="<%=jspContext%>" 
417          wrapper="<%=new PrefixSuffixRenderer(jspContext, "<td>", "</td>") %>"/>
418      </tbl:toolbar>
419      <tbl:navigator
420        page="<%=cc.getPage()%>" 
421        rowsperpage="<%=cc.getRowsPerPage()%>" 
422        totalrows="<%=events == null ? 0 : events.getTotalCount()%>" 
423        visible="<%=mode.hasNavigator()%>"
424      />
425      <tbl:data>
426        <tbl:headers>
427          <tbl:headerrow>
428            <tbl:header colspan="3" />
429            <tbl:columnheaders />
430          </tbl:headerrow>
431          <tbl:headerrow>
432            <tbl:header subclass="index" />
433            <tbl:header 
434              subclass="check" 
435              visible="<%=mode.hasCheck()%>"
436              ><base:icon 
437                image="check_uncheck.png" 
438                tooltip="Check/uncheck all" 
439                onclick="Forms.checkUncheck(document.forms[formId])" 
440              /></tbl:header>
441            <tbl:header 
442              subclass="check" 
443              visible="<%=mode.hasRadio()%>"
444              />
445            <tbl:header 
446              subclass="icons" 
447              visible="<%=mode.hasIcons()%>"
448              />
449            <tbl:propertyfilter />
450          </tbl:headerrow>
451        </tbl:headers>
452        <tbl:rows>
453          <%
454          int index = cc.getPage()*cc.getRowsPerPage();
455          int selectedItemId = cc.getId();
456          if (events != null)
457          {           
458            while (events.hasNext())
459            {
460              BioPlateEvent item = events.next();
461              int itemId = item.getId();
462              boolean usePermission = item.hasPermission(Permission.USE);
463              String openSharePopup = "shareItem("+itemId+")";
464              String deletePermanently = "deleteItemPermanently("+itemId+")";
465              boolean deletePermission = item.hasPermission(Permission.DELETE);
466              boolean sharePermission = item.hasPermission(Permission.SET_PERMISSION);
467              boolean writePermission = item.hasPermission(Permission.WRITE);
468              String tooltip = mode.isSelectionMode() ?
469                  "Select this item" : "View this item" + (writePermission ? " (use CTRL, ALT or SHIFT to edit)" : "");
470              String name = HTML.encodeTags(item.getName());
471              index++;
472              numListed++;
473              %>
474              <tbl:row>
475                <tbl:header 
476                  clazz="index"
477                  ><%=index%></tbl:header>
478                <tbl:header 
479                  clazz="check" 
480                  visible="<%=mode.hasCheck()%>"
481                  ><input 
482                    type="checkbox" 
483                    name="<%=itemId%>" 
484                    value="<%=itemId%>" 
485                    title="<%=name%>" 
486                    <%=cc.getSelected().contains(itemId) ? "checked" : ""%> 
487                  ></tbl:header>
488                <tbl:header 
489                  clazz="check" 
490                  visible="<%=mode.hasRadio()%>"
491                  ><input 
492                    type="radio" 
493                    name="item_id" 
494                    value="<%=itemId%>" 
495                    title="<%=name%>" 
496                    <%=selectedItemId == itemId ? "checked" : ""%>
497                  ></tbl:header>
498                <tbl:header 
499                  clazz="icons" 
500                  visible="<%=mode.hasIcons()%>"
501                  ><base:icon 
502                    image="deleted.png"
503                    onclick="<%=deletePermission ? deletePermanently : null%>"
504                    tooltip="This item has been scheduled for deletion" 
505                    visible="<%=item.isRemoved()%>"
506                  /><base:icon 
507                    image="shared.png" 
508                    onclick="<%=sharePermission ? openSharePopup : null%>"
509                    tooltip="This item is shared to other users, groups and/or projects" 
510                    visible="<%=item.isShared()%>"
511                  />&nbsp;</tbl:header>
512                <tbl:cell column="name"><div class="link" 
513                  onclick="itemOnClick(<%=writePermission ? "event" : null%>, <%=itemId%>)"
514                  title="<%=tooltip%>"><%=name%></div></tbl:cell>
515                <tbl:cell column="id"><%=item.getId()%></tbl:cell>
516                <tbl:cell column="eventType"><base:propertyvalue 
517                    item="<%=item%>" 
518                    property="eventType"
519                    enableEditLink="<%=mode.hasEditLink()%>" 
520                    enablePropertyLink="<%=mode.hasPropertyLink()%>"
521                  /></tbl:cell>
522                <tbl:cell column="role"><%=HTML.encodeTags(item.getParticipant(bioPlate).getRole())%></tbl:cell>
523                <tbl:cell column="protocol"
524                  ><base:propertyvalue 
525                    item="<%=item%>" 
526                    property="protocol"
527                    enableEditLink="<%=mode.hasEditLink()%>" 
528                    enablePropertyLink="<%=mode.hasPropertyLink()%>"
529                  /></tbl:cell>
530                <tbl:cell column="hardware"
531                  ><base:propertyvalue 
532                    item="<%=item%>" 
533                    property="hardware"
534                    enableEditLink="<%=mode.hasEditLink()%>" 
535                    enablePropertyLink="<%=mode.hasPropertyLink()%>"
536                  /></tbl:cell>
537                <tbl:cell column="eventDate" value="<%=item.getEventDate()%>" />
538                <tbl:cell column="entryDate" value="<%=item.getEntryDate()%>" />
539                <tbl:cell column="participants">
540                  <%
541                  ItemQuery<BioPlateEventParticipant> participantQuery = item.getParticipants();
542                  participantQuery.join(Hql.innerJoin(null, "bioPlate", "bpl", true));
543                  participantQuery.include(Include.ALL);
544                  participantQuery.order(Orders.asc(Hql.property("role")));
545                  participantQuery.order(Orders.asc(Hql.property("index")));
546                  participantQuery.order(Orders.asc(Hql.property("bpl", "name")));
547                  for (BioPlateEventParticipant participant : participantQuery.list(dc))
548                  {
549                    %>
550                    <base:propertyvalue 
551                      item="<%=participant%>" 
552                      property="bioPlate" 
553                      enableEditLink="<%=mode.hasEditLink()%>" 
554                      enablePropertyLink="<%=mode.hasPropertyLink()%>"
555                    /> (<%=participant.getRole()%>)<br>
556                    <%
557                  }
558                  %>
559                </tbl:cell>
560                <tbl:cell column="owner"
561                  ><base:propertyvalue 
562                    item="<%=item%>" 
563                    property="owner"
564                    enableEditLink="<%=mode.hasEditLink()%>" 
565                    enablePropertyLink="<%=mode.hasPropertyLink()%>" 
566                  /></tbl:cell>
567                <tbl:cell column="description"><%=HTML.encodeTags(item.getDescription())%></tbl:cell>               
568                <tbl:cell column="permission"><%=PermissionUtil.getShortPermissions(item)%></tbl:cell>
569                <tbl:cell column="sharedTo">
570                  <%
571                  Iterator<Nameable> sharees = ShareableUtil.getSharedTo(dc, item).iterator();
572                  while(sharees.hasNext())
573                  {
574                    Nameable n = sharees.next();
575                    if (mode.hasPropertyLink())
576                    {
577                      out.write(Base.getLinkedName(ID, n, false, mode.hasEditLink()));
578                    }
579                    else
580                    {
581                      out.write(HTML.encodeTags(n.getName()));
582                    }
583                    out.write(sharees.hasNext() ? ", " : "");
584                  }
585                  %>
586                </tbl:cell>
587              </tbl:row>
588              <%
589              }
590            }
591          %>
592          </tbl:rows>
593      </tbl:data>
594      <%
595      if (numListed == 0)
596      {
597        %>
598        <tbl:panel><%=events == null || events.getTotalCount() == 0 ? "No events were found" : "No events on this page. Please select another page!" %></tbl:panel>
599        <%
600      }
601      else
602      {
603        %>
604        <tbl:navigator
605          page="<%=cc.getPage()%>" 
606          rowsperpage="<%=cc.getRowsPerPage()%>" 
607          totalrows="<%=events == null ? 0 : events.getTotalCount()%>" 
608          visible="<%=mode.hasNavigator()%>"
609          locked="true"
610        />
611        <%
612      }
613      %>
614    </tbl:table>
615    <base:buttongroup clazz="fixedatbottom">
616      <base:button onclick="returnSelected();" title="Ok" visible="<%=mode.hasOkButton()%>" />
617      <base:button onclick="window.close();" title="Cancel" visible="<%=mode.hasCancelButton()%>" />
618      <base:button onclick="window.close();" title="Close" visible="<%=mode.hasCloseButton()%>" />
619    </base:buttongroup>
620    </t:tab>
621    <t:tab id="history" title="Change history" 
622        tooltip="Displays a log of all modifications made to this item"
623        visible="<%=ChangeHistoryUtil.showChangeHistoryTab(sc)%>" />
624    </t:tabcontrol>
625  </base:body>
626  </base:page>
627  <%
628}
629finally
630{
631  if (events != null) events.close();
632  if (dc != null) dc.close();
633}
634%>
Note: See TracBrowser for help on using the repository browser.