source: trunk/www/biomaterials/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.6 KB
Line 
1<%-- $Id: list_events.jsp 5948 2012-02-08 13:16:27Z 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 pageEncoding="UTF-8" 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.BioMaterialEvent"
32  import="net.sf.basedb.core.BioPlateEvent"
33  import="net.sf.basedb.core.BioPlateEventParticipant"
34  import="net.sf.basedb.core.BioPlate"
35  import="net.sf.basedb.core.MeasuredBioMaterial"
36  import="net.sf.basedb.core.Quantity"
37  import="net.sf.basedb.core.Unit"
38  import="net.sf.basedb.core.ItemQuery"
39  import="net.sf.basedb.core.ItemResultIterator"
40  import="net.sf.basedb.core.Permission"
41  import="net.sf.basedb.core.PluginDefinition"
42  import="net.sf.basedb.core.PermissionDeniedException"
43  import="net.sf.basedb.core.query.Restrictions"
44  import="net.sf.basedb.core.query.Expressions"
45  import="net.sf.basedb.core.query.Orders"
46  import="net.sf.basedb.core.query.Hql"
47  import="net.sf.basedb.core.plugin.GuiContext"
48  import="net.sf.basedb.core.plugin.Plugin"
49  import="net.sf.basedb.util.Enumeration"
50  import="net.sf.basedb.util.units.UnitUtil"
51  import="net.sf.basedb.clients.web.Base"
52  import="net.sf.basedb.clients.web.ChangeHistoryUtil"
53  import="net.sf.basedb.clients.web.ModeInfo"
54  import="net.sf.basedb.clients.web.PermissionUtil"
55  import="net.sf.basedb.clients.web.util.HTML"
56  import="net.sf.basedb.util.Values"
57  import="net.sf.basedb.util.formatter.Formatter"
58  import="net.sf.basedb.clients.web.formatter.FormatterFactory"
59  import="net.sf.basedb.clients.web.extensions.ExtensionsControl"
60  import="net.sf.basedb.clients.web.extensions.JspContext"
61  import="net.sf.basedb.clients.web.extensions.renderer.PrefixSuffixRenderer"
62  import="net.sf.basedb.clients.web.extensions.toolbar.ToolbarUtil"
63  import="net.sf.basedb.util.extensions.ExtensionsInvoker"
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.BIOMATERIALEVENT;
75  private static final GuiContext guiContext = new GuiContext(itemType, GuiContext.Type.LIST);
76%>
77<%
78final Item bioMaterialType = Item.valueOf(request.getParameter("biomaterial_type"));
79final int bioMaterialId = Values.getInt(request.getParameter("biomaterial_id"));
80final SessionControl sc = Base.getExistingSessionControl(pageContext, Permission.DENIED, itemType);
81final String ID = sc.getId();
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("event", "events");
87final DbControl dc = sc.newDbControl();
88ItemResultIterator<BioMaterialEvent> events = null;
89try
90{
91  final MeasuredBioMaterial bioMaterial = (MeasuredBioMaterial)bioMaterialType.getById(dc, bioMaterialId);
92  final BioMaterialEvent creationEvent = bioMaterial.getCreationEvent();
93  final boolean createPermission = bioMaterial.hasPermission(Permission.WRITE);
94  final boolean deletePermission = createPermission;
95
96  String viewPage = null;
97  String listName = null;
98  if (bioMaterialType == Item.SAMPLE)
99  {
100    listName = "Samples";
101    viewPage = "../samples/index.jsp";
102  }
103  else if (bioMaterialType == Item.EXTRACT)
104  {
105    listName = "Extracts";
106    viewPage = "../extracts/index.jsp";
107  }
108 
109  Unit microGram = UnitUtil.getUnit(dc, Quantity.MASS, "µg");
110  Map<Plugin.MainType, Integer> pluginCount = PluginDefinition.countPlugins(dc, guiContext);
111  try
112  {
113    final ItemQuery<BioMaterialEvent> query = Base.getConfiguredQuery(dc, cc, true, bioMaterial.getEvents(), mode);
114    events = query.iterate(dc);
115  }
116  catch (Throwable t)
117  {
118    cc.setMessage(t.getMessage());
119    t.printStackTrace();
120  }
121  int numListed = 0;
122  Formatter<Date> dateFormatter = FormatterFactory.getDateFormatter(sc);
123  JspContext jspContext = ExtensionsControl.createContext(dc, pageContext, guiContext, bioMaterial);
124  ExtensionsInvoker invoker = ToolbarUtil.useExtensions(jspContext);
125  %>
126  <base:page title="<%=title%>" type="<%=mode.getPageType()%>">
127  <base:head scripts="table.js,tabcontrol.js" styles="table.css,toolbar.css,headertabcontrol.css,path.css">
128    <ext:scripts context="<%=jspContext%>" />
129    <ext:stylesheets context="<%=jspContext%>" />
130    <script language="JavaScript">
131    var submitPage = 'index.jsp';
132    var formId = 'events';
133    function newItem()
134    {
135      Main.viewOrEditItem('<%=ID%>', '<%=itemType.name()%>', 0, true, '&biomaterial_type=<%=bioMaterialType.name()%>&biomaterial_id=<%=bioMaterial.getId()%>');
136    }
137    function editItem(itemId)
138    {
139      Main.viewOrEditItem('<%=ID%>', '<%=itemType.name()%>', itemId, true, '&biomaterial_type=<%=bioMaterialType.name()%>&biomaterial_id=<%=bioMaterial.getId()%>');
140    }
141    function viewItem(itemId)
142    {
143      Main.viewOrEditItem('<%=ID%>', '<%=itemType.name()%>', itemId, false, '&biomaterial_type=<%=bioMaterialType.name()%>&biomaterial_id=<%=bioMaterial.getId()%>');
144    }
145    function itemOnClick(evt, itemId)
146    {
147      Table.itemOnClick(formId, evt, itemId, '<%=mode.getName()%>', viewItem, editItem, returnSelected);
148    }
149    function deleteItems()
150    {
151      var frm = document.forms[formId];
152      var numChecked = Forms.numChecked(frm);
153      if (numChecked == 0)
154      {
155        alert('Please select at least one item in the list');
156        return;
157      }
158      else
159      {
160        var rep = numChecked == 1 ? 'event' : 'events';
161        if (!confirm('You are about to delete '+numChecked+' '+rep+'. This can\'t be undone. Continue?'))
162        {
163          return;
164        }
165      }
166      frm.action = submitPage;
167      frm.cmd.value = 'DeleteItems';
168      frm.submit();
169    }
170    function configureColumns()
171    {
172      Table.configureColumns('<%=ID%>', formId, '<%=itemType.name()%>', '<%=(String)cc.getObject("defaultColumns")%>');
173    }
174    function runPlugin(cmd)
175    {
176      Table.submitToPopup(formId, cmd, 750, 500);
177    }
178    function returnSelected()
179    {
180      Table.returnSelected(formId, <%=callback != null ? "window.opener."+callback : "null" %>);
181      window.close();
182    }
183    function presetOnChange()
184    {
185      Table.presetOnChange('<%=ID%>', formId, '<%=itemType.name()%>', '<%=(String)cc.getObject("defaultColumns")%>');
186    }
187    function switchTab(tabControlId, tabId)
188    {
189      if (tabId == 'properties' || tabId == 'annotations' || tabId == 'overview' || tabId == 'history')
190      {
191        location.href = '<%=viewPage%>?ID=<%=ID%>&cmd=ViewItem&item_id=<%=bioMaterialId%>&tab='+tabId;
192      }
193      else
194      {
195        TabControl.setActiveTab(tabControlId, tabId);
196      }
197    }
198    </script>
199  </base:head>
200 
201  <base:body>
202    <p>
203    <p:path>
204      <p:pathelement title="<%=listName%>" href="<%=viewPage+"?ID="+ID%>" />
205      <p:pathelement title="<%=HTML.encodeTags(bioMaterial.getName())%>" />
206    </p:path>
207
208    <t:tabcontrol id="main" active="events" switch="switchTab">
209    <t:tab id="properties" title="Properties" />
210    <t:tab id="annotations" title="Annotations &amp; parameters"
211      tooltip="View annotation values and protocol parameters" />
212   
213    <t:tab id="events" title="Events">
214   
215    <%
216    if (cc.getMessage() != null)
217    {
218      %>
219      <div class="error"><%=cc.getMessage()%></div>
220      <%
221      cc.setMessage(null);
222    }
223    %>
224    <tbl:table 
225      id="events" 
226       
227      columns="<%=cc.getSetting("columns")%>"
228      sortby="<%=cc.getSortProperty()%>" 
229      direction="<%=cc.getSortDirection()%>"
230      title="<%=title%>"
231      action="index.jsp"
232      sc="<%=sc%>"
233      item="<%=itemType%>"
234      >
235      <tbl:hidden 
236        name="mode" 
237        value="<%=mode.getName()%>" 
238      />
239      <tbl:hidden 
240        name="biomaterial_id"
241        value="<%=String.valueOf(bioMaterialId)%>" 
242      />
243      <tbl:hidden 
244        name="biomaterial_type" 
245        value="<%=bioMaterialType.name()%>" 
246      />
247      <tbl:hidden 
248        name="callback" 
249        value="<%=callback%>" 
250        skip="<%=callback == null%>" 
251      />
252      <%
253      Enumeration<String, String> eventTypes = new Enumeration<String, String>();
254      for (BioMaterialEvent.Type et : BioMaterialEvent.Type.values())
255      {
256        eventTypes.add(Integer.toString(et.getValue()), HTML.encodeTags(et.toString()));
257      }
258      %>
259      <tbl:columndef 
260        id="type"
261        property="eventType"
262        datatype="int"
263        title="Type"
264        enumeration="<%=eventTypes%>"
265        sortable="true" 
266        filterable="true"
267        exportable="true"
268        show="always" 
269      />
270      <tbl:columndef 
271        id="id"
272        clazz="uniquecol"
273        property="id"
274        datatype="int"
275        title="ID"
276        sortable="true"
277        filterable="true"
278        exportable="true"
279      />
280      <tbl:columndef 
281        id="entryDate"
282        property="entryDate"
283        datatype="date"
284        title="Entry date"
285        sortable="true" 
286        filterable="true"
287        exportable="true"
288        formatter="<%=dateFormatter%>"
289      />
290      <tbl:columndef 
291        id="eventDate"
292        property="eventDate"
293        datatype="date"
294        title="Event date"
295        sortable="true" 
296        filterable="true"
297        exportable="true"
298        formatter="<%=dateFormatter%>"
299      />
300      <tbl:columndef 
301        id="quantity"
302        datatype="float"
303        title="Used quantity (µg)"
304        sortable="false" 
305        filterable="false"
306        exportable="false"
307        unit="<%=microGram%>"
308      />
309      <tbl:columndef
310        id="bioPlateEvent"
311        property="bioPlateEventParticipant.event.name"
312        datatype="string"
313        title="Plate event"
314        sortable="true" 
315        filterable="true"
316        exportable="true"
317      />
318      <tbl:columndef 
319        id="protocol"
320        property="protocol.name"
321        datatype="string"
322        title="Protocol"
323        sortable="true" 
324        filterable="true"
325        exportable="true"
326      />
327      <tbl:columndef 
328        id="user"
329        property="user.name"
330        datatype="string"
331        title="User"
332        sortable="true" 
333        filterable="true"
334        exportable="true"
335      />
336      <tbl:columndef 
337        id="comment"
338        property="comment"
339        datatype="string"
340        title="Comment" 
341        sortable="true" 
342        filterable="true" 
343        exportable="true"
344      />
345      <tbl:columndef
346        id="permission"
347        title="Permission"
348      />
349      <tbl:toolbar
350        visible="<%=mode.hasToolbar()%>"
351        >
352        <tbl:button 
353          disabled="<%=!createPermission%>" 
354          image="new.png" 
355          onclick="newItem()" 
356          title="New&hellip;" 
357          tooltip="<%=createPermission ? "Create new event" : "You do not have permission to create events"%>" 
358        />
359        <tbl:button 
360          disabled="<%=!deletePermission%>" 
361          image="delete.png" 
362          title="Delete&hellip;"
363          onclick="deleteItems()" 
364          tooltip="<%=deletePermission ? "Delete the selected events" : "You do not have permission to delete events"%>" 
365        />
366        <tbl:button 
367          image="columns.png" 
368          onclick="configureColumns()" 
369          title="Columns&hellip;" 
370          tooltip="Show, hide and re-order columns" 
371        />
372        <tbl:button 
373          image="import.png" 
374          onclick="runPlugin('ImportItems')" 
375          title="Import&hellip;" 
376          tooltip="Import data" 
377          visible="<%=pluginCount.containsKey(Plugin.MainType.IMPORT)%>"
378        />
379        <tbl:button 
380          image="export.png" 
381          onclick="runPlugin('ExportItems')" 
382          title="Export&hellip;" 
383          tooltip="Export data" 
384          visible="<%=pluginCount.containsKey(Plugin.MainType.EXPORT)%>"
385        />
386        <tbl:button 
387          image="runplugin.png" 
388          onclick="runPlugin('RunListPlugin')" 
389          title="Run plugin&hellip;" 
390          tooltip="Run a plugin" 
391          visible="<%=pluginCount.containsKey(Plugin.MainType.OTHER)%>"
392        />
393        <ext:render extensions="<%=invoker%>" context="<%=jspContext%>" 
394          wrapper="<%=new PrefixSuffixRenderer(jspContext, "<td>", "</td>") %>"/>
395      </tbl:toolbar>
396      <tbl:navigator
397        page="<%=cc.getPage()%>" 
398        rowsperpage="<%=cc.getRowsPerPage()%>" 
399        totalrows="<%=events == null ? 0 : events.getTotalCount()%>" 
400        visible="<%=mode.hasNavigator()%>"
401      />
402      <tbl:data>
403        <tbl:headers>
404          <tbl:headerrow>
405            <tbl:header colspan="3" />
406            <tbl:columnheaders />
407          </tbl:headerrow>
408          <tbl:headerrow>
409            <tbl:header subclass="index" />
410            <tbl:header 
411              subclass="check" 
412              visible="<%=mode.hasCheck()%>"
413              ><base:icon 
414                image="check_uncheck.png" 
415                tooltip="Check/uncheck all" 
416                onclick="Forms.checkUncheck(document.forms[formId])" 
417              /></tbl:header>
418            <tbl:header 
419              subclass="check" 
420              visible="<%=mode.hasRadio()%>"
421              />
422            <tbl:header 
423              subclass="icons" 
424              visible="<%=mode.hasIcons()%>"
425              />
426            <tbl:propertyfilter />
427          </tbl:headerrow>
428        </tbl:headers>
429        <tbl:rows>
430          <%
431          int index = cc.getPage()*cc.getRowsPerPage();
432          int selectedItemId = cc.getId();
433          if (events != null)
434          {
435            while (events.hasNext())
436            {
437              BioMaterialEvent item = events.next();
438              BioMaterialEvent.Type eventType = item.getEventType();
439              int itemId = item.getId();
440              String name = "TODO";
441              index++;
442              numListed++;
443              %>
444              <tbl:row>
445                <tbl:header 
446                  clazz="index"
447                  ><%=index%></tbl:header>
448                <tbl:header 
449                  clazz="check" 
450                  visible="<%=mode.hasCheck()%>"
451                  ><input 
452                    type="checkbox" 
453                    name="<%=itemId%>" 
454                    value="<%=itemId%>" 
455                    title="TODO" 
456                    <%=cc.getSelected().contains(itemId) ? "checked" : ""%>
457                  ></tbl:header>
458                <tbl:header 
459                  clazz="check" 
460                  visible="<%=mode.hasRadio()%>"
461                  ><input 
462                      type="radio" 
463                      name="item_id" 
464                      value="<%=itemId%>" 
465                      title="<%=name%>" 
466                      <%=selectedItemId == itemId ? "checked" : ""%>
467                    ></tbl:header>
468                <tbl:header 
469                  clazz="icons" 
470                  visible="<%=mode.hasIcons()%>"
471                  >&nbsp;</tbl:header>
472                <tbl:cell column="type">
473                  <%
474                  if (eventType == BioMaterialEvent.Type.OTHER)
475                  {
476                    if (item.hasPermission(Permission.WRITE))
477                    {
478                      %>
479                      <div class="link" onclick="itemOnClick(event, <%=itemId%>)"><%=eventType%></div>
480                      <%
481                    }
482                    else
483                    {
484                      %>
485                      <div class="link" onclick="viewItem(<%=itemId%>)"><%=eventType%></div>
486                      <%
487                    }
488                  }
489                  else if (eventType == BioMaterialEvent.Type.CREATION)
490                  {
491                    if (item.equals(creationEvent))
492                    {
493                      %>
494                      <div class="link" onclick="viewItem(<%=itemId%>)">
495                      Created
496                      </div>
497                      <%
498                    }
499                    else
500                    {
501                      MeasuredBioMaterial child = null;
502                      try
503                      {
504                        child = item.getBioMaterial();
505                      }
506                      catch (PermissionDeniedException ex)
507                      {}
508                      %>
509                      <div class="link" onclick="viewItem(<%=itemId%>)">
510                      Created <%=child == null ? "child" : child.getType().toString().toLowerCase() %>: <base:propertyvalue 
511                            item="<%=item%>" 
512                            property="bioMaterial"
513                            enableEditLink="<%=false%>" 
514                            enablePropertyLink="<%=false%>"
515                          />
516                      </div>
517                      <%
518                    }
519                  }
520                  else if (eventType == BioMaterialEvent.Type.BIOASSAY)
521                  {
522                    %>
523                    <div class="link" onclick="viewItem(<%=itemId%>)">
524                    Bioassay: <base:propertyvalue 
525                              item="<%=item%>" 
526                              property="physicalBioAssay"
527                              enableEditLink="<%=false%>" 
528                              enablePropertyLink="<%=false%>"
529                            />
530                    </div>
531                    <%
532                  }
533                  %>
534                </tbl:cell>
535                <tbl:cell column="id"><%=item.getId()%></tbl:cell>
536                <tbl:cell column="eventDate" value="<%=item.getEventDate()%>" />
537                <tbl:cell column="entryDate" value="<%=item.getEntryDate()%>" />
538                <tbl:cell column="quantity"><%=Values.formatNumber(item.getUsedQuantity(bioMaterial), 2)%></tbl:cell>
539                <tbl:cell column="bioPlateEvent">
540                  <%
541                  try
542                  {
543                    BioPlateEventParticipant participant = item.getBioPlateEventParticipant();
544                    if (participant != null)
545                    {
546                      BioPlateEvent event = participant.getEvent();
547                      String extraUrl = "";
548                      try
549                      {
550                        extraUrl = "&bioplate_id=" + participant.getBioPlate().getId();
551                      }
552                      catch (PermissionDeniedException ex)
553                      {}
554                      boolean editLink = event.hasPermission(Permission.WRITE);
555                      if (mode.hasPropertyLink())
556                      {
557                        %>
558                        <span class="link" 
559                          onclick="Main.itemOnClick(event, '<%=ID%>', 'BIOPLATEEVENT', <%=event.getId()%>, <%=editLink%>, '<%=extraUrl%>')"
560                          title="View this bioplate event <%=editLink? "(use CTRL, ALT or SHIFT to edit)" : ""%>"
561                        >
562                        <%=HTML.encodeTags(event.getName()) %>
563                        </span>
564                        <%
565                      }
566                      else
567                      {
568                        %>
569                        <%=HTML.encodeTags(event.getName()) %>
570                        <%
571                      }
572                    }
573                    else
574                    {
575                      %>
576                      <i>- none -</i>
577                      <%
578                    }
579                  }
580                  catch (PermissionDeniedException ex)
581                  {
582                    %>
583                    <i>- denied -</i>
584                    <%
585                  }
586                  %>
587                </tbl:cell>
588                <tbl:cell column="protocol"
589                  ><base:propertyvalue 
590                    item="<%=item%>" 
591                    property="protocol"
592                    enableEditLink="<%=mode.hasEditLink()%>" 
593                    enablePropertyLink="<%=mode.hasPropertyLink()%>"
594                  /></tbl:cell>
595                <tbl:cell column="user"
596                  ><base:propertyvalue 
597                    item="<%=item%>" 
598                    property="user"
599                    enableEditLink="<%=mode.hasEditLink()%>" 
600                    enablePropertyLink="<%=mode.hasPropertyLink()%>"
601                  /></tbl:cell>
602                <tbl:cell column="comment"><%=HTML.encodeTags(item.getComment())%></tbl:cell>
603                <tbl:cell column="permission"><%=PermissionUtil.getShortPermissions(item)%></tbl:cell>
604              </tbl:row>
605              <%
606            }
607          }
608          %>
609          </tbl:rows>
610        </tbl:data>
611      <%
612      if (numListed == 0)
613      {
614        %>
615        <tbl:panel><%=events == null || events.getTotalCount() == 0 ? "No events were found" : "No events on this page. Please select another page!" %></tbl:panel>
616        <%
617      }
618      else
619      {
620        %>
621        <tbl:navigator
622          page="<%=cc.getPage()%>" 
623          rowsperpage="<%=cc.getRowsPerPage()%>" 
624          totalrows="<%=events == null ? 0 : events.getTotalCount()%>" 
625          visible="<%=mode.hasNavigator()%>"
626          locked="true"
627        />
628        <%
629      }
630      %>
631    </tbl:table>
632    <base:buttongroup>
633      <base:button onclick="returnSelected();" title="Ok" visible="<%=mode.hasOkButton()%>" />
634      <base:button onclick="window.close();" title="Cancel" visible="<%=mode.hasCancelButton()%>" />
635      <base:button onclick="window.close();" title="Close" visible="<%=mode.hasCloseButton()%>" />
636    </base:buttongroup>
637    </t:tab>
638   
639    <t:tab id="overview" title="Overview" 
640      tooltip="Display a tree overview of related items" />
641    <t:tab id="history" title="Change history" 
642        tooltip="Displays a log of all modifications made to this item"
643        visible="<%=ChangeHistoryUtil.showChangeHistoryTab(sc)%>" />
644    </t:tabcontrol>
645
646  </base:body>
647  </base:page>
648  <%
649}
650finally
651{
652  if (events != null) events.close();
653  if (dc != null) dc.close();
654}
655%>
Note: See TracBrowser for help on using the repository browser.