source: trunk/www/biomaterials/bioplates/wells/list_biowells.jsp @ 5525

Last change on this file since 5525 was 5525, checked in by Nicklas Nordborg, 11 years ago

References #1536: Bioplate events (take 2)

Added functions in the gui for viewing event information. This should more or less complete this ticket, but I think an actual use case for new plate events should be implemented before closing this ticket.

  • Property svn:eol-style set to native
  • Property svn:keywords set to Id
File size: 16.8 KB
Line 
1<%-- $Id: list_biowells.jsp 5525 2010-12-06 12:09:29Z nicklas $
2  ------------------------------------------------------------------
3  Copyright (C) 2005 Nicklas Nordborg
4  Copyright (C) 2006 Jari Häkkinen, Nicklas Nordborg, Martin Svensson
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 Martin
24  @version 2.10
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.Include"
31  import="net.sf.basedb.core.ItemContext"
32  import="net.sf.basedb.core.BioPlate"
33  import="net.sf.basedb.core.BioPlateType"
34  import="net.sf.basedb.core.BioWell"
35  import="net.sf.basedb.core.MeasuredBioMaterial"
36  import="net.sf.basedb.core.BioMaterialEvent"
37  import="net.sf.basedb.core.ItemQuery"
38  import="net.sf.basedb.core.ItemResultIterator"
39  import="net.sf.basedb.core.ItemResultList"
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.core.data.ReporterData"
50  import="net.sf.basedb.util.Enumeration"
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.util.formatter.WellCoordinateFormatter"
59  import="net.sf.basedb.clients.web.formatter.FormatterFactory"
60  import="net.sf.basedb.clients.web.extensions.ExtensionsControl"
61  import="net.sf.basedb.clients.web.extensions.JspContext"
62  import="net.sf.basedb.clients.web.extensions.renderer.PrefixSuffixRenderer"
63  import="net.sf.basedb.clients.web.extensions.toolbar.ToolbarUtil"
64  import="net.sf.basedb.util.extensions.ExtensionsInvoker"
65  import="java.util.List"
66  import="java.util.Map"
67  import="java.util.Date"
68%>
69<%@ taglib prefix="base" uri="/WEB-INF/base.tld" %>
70<%@ taglib prefix="tbl" uri="/WEB-INF/table.tld" %>
71<%@ taglib prefix="t" uri="/WEB-INF/tab.tld" %>
72<%@ taglib prefix="p" uri="/WEB-INF/path.tld" %>
73<%@ taglib prefix="ext" uri="/WEB-INF/extensions.tld" %>
74<%!
75  private static final Item itemType = Item.BIOWELL;
76  private static final GuiContext guiContext = new GuiContext(itemType, GuiContext.Type.LIST);
77%>
78<%
79final int bioPlateId = Values.getInt(request.getParameter("bioplate_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("biowell", "biowells");
87final DbControl dc = sc.newDbControl();
88ItemResultIterator<BioWell> biowells = null;
89
90Formatter<Date> dateTimeFormatter = FormatterFactory.getDateTimeFormatter(sc);
91Formatter<Date> dateFormatter = FormatterFactory.getDateFormatter(sc);
92
93WellCoordinateFormatter rowFormatter = new WellCoordinateFormatter(true);
94WellCoordinateFormatter columnFormatter = new WellCoordinateFormatter(false);
95
96try
97{
98  final BioPlate bioplate = BioPlate.getById(dc, bioPlateId);
99  final BioPlateType bioPlateType = bioplate.getBioPlateType();
100  final boolean createPermission = bioplate.hasPermission(Permission.WRITE);
101  final boolean deletePermission = createPermission;
102  final BioWell.LockMode lockMode = bioPlateType.getLockMode();
103
104  Enumeration<String, String> rows = new Enumeration<String,String>();
105  for (int r = 0; r < bioplate.getPlateGeometry().getRows(); r++)
106  {
107    rows.add(Integer.toString(r), rowFormatter.format(r));
108  }
109 
110  Map<Plugin.MainType, Integer> pluginCount = PluginDefinition.countPlugins(dc, guiContext);
111 
112  try
113  {
114    final ItemQuery<BioWell> query = Base.getConfiguredQuery(dc, cc, true, bioplate.getBioWells(), mode);
115    query.join(Hql.leftJoin(null, "bioMaterial", "mbm", null, true));
116    query.join(Hql.leftJoin("mbm", "creationEvent", "evt", null, true));
117    if (!"row".equals(cc.getSortProperty())) query.order(Orders.asc(Hql.property("row")));
118    if (!"column".equals(cc.getSortProperty())) query.order(Orders.asc(Hql.property("column")));
119    biowells = query.iterate(dc);
120  }
121  catch (Throwable t)
122  {
123    cc.setMessage(t.getMessage());
124    t.printStackTrace();
125  }
126  int numListed = 0;
127  JspContext jspContext = ExtensionsControl.createContext(dc, pageContext, guiContext, bioplate);
128  ExtensionsInvoker invoker = ToolbarUtil.useExtensions(jspContext);
129  %>
130  <base:page title="<%=title%>" type="<%=mode.getPageType()%>">
131  <base:head scripts="table.js,tabcontrol.js" styles="table.css,headertabcontrol.css,path.css">
132    <ext:scripts context="<%=jspContext%>" />
133    <ext:stylesheets context="<%=jspContext%>" />
134    <script language="JavaScript">
135    var submitPage = 'index.jsp';
136    var formId = 'biowells';
137
138    function editItem(itemId)
139    {
140      Main.viewOrEditItem('<%=ID%>', '<%=itemType.name()%>', itemId, true);
141    }
142    function itemOnClick(itemId)
143    {
144      Table.itemOnClick(formId, null, itemId, '<%=mode.getName()%>', null, null, returnSelected);
145    }
146    function configureColumns()
147    {
148      Table.configureColumns('<%=ID%>', formId, '<%=itemType.name()%>', '<%=(String)cc.getObject("defaultColumns")%>');
149    }
150    function runPlugin(cmd)
151    {
152      Table.submitToPopup(formId, cmd, 740, 540);
153    }
154    function returnSelected()
155    {
156      Table.returnSelected(formId, <%=callback != null ? "window.opener."+callback : "null" %>);
157      window.close();
158    }
159    function presetOnChange()
160    {
161      Table.presetOnChange('<%=ID%>', formId, '<%=itemType.name()%>', '<%=(String)cc.getObject("defaultColumns")%>');
162    }
163    function switchTab(tabControlId, tabId)
164    {
165      if (tabId == 'properties' || tabId == 'annotations' || tabId == 'history')
166      {
167        location.href = '../index.jsp?ID=<%=ID%>&cmd=ViewItem&item_id=<%=bioPlateId%>&tab='+tabId;
168      }
169      else if (tabId == 'events')
170      {
171        location.href = '../events/index.jsp?ID=<%=ID%>&bioplate_id=<%=bioPlateId%>';
172      }
173      else
174      {
175        TabControl.setActiveTab(tabControlId, tabId);
176      }
177    }
178    </script>
179  </base:head>
180 
181  <base:body>
182    <%
183    if (!mode.isSelectionMode())
184    {
185      %>
186      <p>
187      <p:path>
188        <p:pathelement title="Bioplates" href="<%="../index.jsp?ID="+ID%>" />
189        <p:pathelement title="<%=HTML.encodeTags(bioplate.getName())%>" />
190      </p:path>
191      <%
192    }
193    %>
194
195    <t:tabcontrol id="main" active="biowells" switch="switchTab" notabs="<%=mode.isSelectionMode()%>">
196    <t:tab id="properties" title="Properties" />
197    <t:tab id="annotations" title="Annotations" />       
198    <t:tab id="biowells" title="Wells">
199   
200    <%
201    if (cc.getMessage() != null)
202    {
203      %>
204      <div class="error"><%=cc.getMessage()%></div>
205      <%
206      cc.setMessage(null);
207    }
208    %>
209    <tbl:table 
210      id="biowells" 
211      clazz="itemlist" 
212      columns="<%=cc.getSetting("columns")%>"
213      sortby="<%=cc.getSortProperty()%>" 
214      direction="<%=cc.getSortDirection()%>"
215      title="<%=title%>"
216      action="index.jsp"
217      sc="<%=sc%>"
218      item="<%=itemType%>"
219      >
220      <tbl:hidden 
221        name="mode" 
222        value="<%=mode.getName()%>" 
223      />
224      <tbl:hidden 
225        name="bioplate_id" 
226        value="<%=String.valueOf(bioPlateId)%>" 
227      />
228      <tbl:hidden 
229        name="callback" 
230        value="<%=callback%>" 
231        skip="<%=callback == null%>" 
232      />
233      <tbl:columndef 
234        id="row"
235        property="row"
236        datatype="int"
237        title="Row"
238        sortable="true" 
239        filterable="true"
240        enumeration="<%=rows%>"
241        exportable="true"
242        show="always" 
243        formatter="<%=rowFormatter%>"
244      />
245      <tbl:columndef 
246        id="column"
247        property="column"
248        datatype="int"
249        title="Column"
250        sortable="true" 
251        filterable="true"
252        exportable="true"
253        show="always" 
254        formatter="<%=columnFormatter%>"
255      />
256      <tbl:columndef 
257        id="id"
258        clazz="uniquecol"
259        property="id"
260        datatype="int"
261        title="ID"
262        sortable="true"
263        filterable="true"
264        exportable="true"
265      /> 
266      <tbl:columndef 
267        id="bioMaterial.name"
268        property="$mbm.name"
269        datatype="string"
270        title="[Biomtrl] Name"
271        sortable="true" 
272        filterable="true"
273        exportable="true"
274      />
275      <tbl:columndef 
276        id="bioMaterial.description"
277        property="$mbm.description"
278        datatype="string"
279        title="[Biomtrl] Description" 
280        sortable="true" 
281        filterable="true" 
282        exportable="true"
283      />
284      <tbl:columndef 
285        id="bioMaterial.entryDate"
286        property="$evt.entryDate"
287        datatype="date"
288        title="[Biomtrl] Registered"
289        sortable="true" 
290        filterable="true"
291        exportable="true"
292        formatter="<%=dateFormatter%>"
293      />
294      <tbl:columndef
295        id="bioMaterialList"
296        property="@bioMaterial.bioMaterialLists"
297        datatype="int"
298        title="[Biomtrl] Biomaterial list"
299        filterable="true"
300        enumeration="<%=Base.getBioMaterialListsEnum(dc, null, Include.ALL)%>"
301        multiple="false"
302      />
303      <tbl:columndef 
304        id="originalBioMaterial.name"
305        property="originalBioMaterial.name"
306        datatype="string"
307        title="[Biomtrl] Original"
308        sortable="true" 
309        filterable="true"
310        exportable="true"
311      />
312      <tbl:columndef
313        id="permission"
314        title="Permission"
315      />
316      <tbl:toolbar
317        visible="<%=mode.hasToolbar()%>"
318        >
319        <tbl:button 
320          image="columns.gif" 
321          onclick="configureColumns()" 
322          title="Columns&hellip;" 
323          tooltip="Show, hide and re-order columns" 
324        />
325        <tbl:button 
326          image="import.gif" 
327          onclick="runPlugin('ImportItems')" 
328          title="Import&hellip;" 
329          tooltip="Import data" 
330          visible="<%=pluginCount.containsKey(Plugin.MainType.IMPORT)%>"
331        />
332        <tbl:button 
333          image="export.gif" 
334          onclick="runPlugin('ExportItems')" 
335          title="Export&hellip;" 
336          tooltip="Export data" 
337          visible="<%=pluginCount.containsKey(Plugin.MainType.EXPORT)%>"
338        />
339        <tbl:button 
340          image="runplugin.gif" 
341          onclick="runPlugin('RunListPlugin')" 
342          title="Run plugin&hellip;" 
343          tooltip="Run a plugin" 
344          visible="<%=pluginCount.containsKey(Plugin.MainType.OTHER)%>"
345        />
346        <ext:render extensions="<%=invoker%>" context="<%=jspContext%>" 
347          wrapper="<%=new PrefixSuffixRenderer(jspContext, "<td>", "</td>") %>"/>
348      </tbl:toolbar>
349      <tbl:navigator
350        page="<%=cc.getPage()%>" 
351        rowsperpage="<%=cc.getRowsPerPage()%>" 
352        totalrows="<%=biowells == null ? 0 : biowells.getTotalCount()%>" 
353        visible="<%=mode.hasNavigator()%>"
354      />
355      <tbl:data>
356        <tbl:columns>
357        <tbl:presetselector 
358          clazz="columnheader"
359          colspan="3"
360          onchange="presetOnChange()"
361        />
362        </tbl:columns>
363         
364        <tr>
365          <tbl:header 
366            clazz="index"
367            >&nbsp;</tbl:header>
368          <tbl:header 
369            clazz="check" 
370            visible="<%=mode.hasCheck()%>"
371            ><base:icon 
372              image="check_uncheck.gif" 
373              tooltip="Check/uncheck all" 
374              onclick="Forms.checkUncheck(document.forms[formId])" style="align: left;"
375            /></tbl:header>
376          <tbl:header 
377            clazz="check" 
378            visible="<%=mode.hasRadio()%>"
379            />
380          <tbl:header 
381            clazz="icons" 
382            visible="<%=mode.hasIcons()%>"
383            >&nbsp;</tbl:header>
384          <tbl:propertyfilter />
385        </tr>
386   
387          <tbl:rows>
388          <%
389          int index = cc.getPage()*cc.getRowsPerPage();
390          int selectedItemId = cc.getId();
391          if (biowells != null)
392          {           
393            while (biowells.hasNext())
394            {
395              BioWell item = biowells.next();
396              int itemId = item.getId();
397              index++;
398              numListed++;
399              MeasuredBioMaterial bioMaterial = null;
400              BioMaterialEvent creationEvent = null;
401              boolean editWellPermission = true;
402              try
403              {
404                bioMaterial = item.getBioMaterial();
405                if (bioMaterial != null)
406                {
407                  creationEvent = bioMaterial.getCreationEvent();
408                  editWellPermission = bioMaterial.hasPermission(Permission.WRITE) && !bioMaterial.isLockedInWell();
409                }
410                else
411                {
412                  editWellPermission = item.canAddBioMaterial();
413                }
414              }
415              catch (PermissionDeniedException ex)
416              {
417                editWellPermission = false;
418              }
419              %>
420              <tbl:row>
421                <tbl:header 
422                  clazz="index"
423                  ><%=index%></tbl:header>
424                <tbl:header 
425                  clazz="check" 
426                  visible="<%=mode.hasCheck()%>"
427                  ><input 
428                    type="checkbox" 
429                    name="<%=itemId%>" 
430                    value="<%=itemId%>" 
431                    title="[<%=rowFormatter.format(item.getRow())%>,<%=columnFormatter.format(item.getColumn())%>]" 
432                    <%=cc.getSelected().contains(itemId) ? "checked" : ""%> 
433                  ></tbl:header>
434                <tbl:header 
435                  clazz="check" 
436                  visible="<%=mode.hasRadio()%>"
437                  ><input 
438                    type="radio" 
439                    name="item_id" 
440                    value="<%=itemId%>" 
441                    title="[<%=rowFormatter.format(item.getRow())%>,<%=columnFormatter.format(item.getColumn())%>]" 
442                    <%=selectedItemId == itemId ? "checked" : ""%>
443                  ></tbl:header>
444                <tbl:header 
445                  clazz="icons" 
446                  visible="<%=mode.hasIcons()%>"
447                  >&nbsp;</tbl:header>
448               
449                <tbl:cell column="id"><%=item.getId()%></tbl:cell>
450                <tbl:cell column="row">
451                  <%
452                  if (mode.isSelectionMode())
453                  {
454                    %>
455                    <div class="link" onclick="itemOnClick(<%=itemId%>)" title="Select this item">
456                      <tbl:cellvalue value="<%=item.getRow()%>" />
457                    </div>
458                  <%
459                  }
460                  else
461                  {
462                    %><tbl:cellvalue value="<%=item.getRow()%>" /><%
463                  }
464                  %>
465                </tbl:cell>
466                <tbl:cell column="column" value="<%=item.getColumn()%>" />
467                <tbl:cell column="bioMaterial.name">
468                  <base:propertyvalue 
469                      item="<%=item%>" 
470                      property="bioMaterial"
471                      enableEditLink="<%=mode.hasEditLink()%>" 
472                      enablePropertyLink="<%=mode.hasPropertyLink()%>"
473                  />
474                  <base:icon 
475                    visible="<%=editWellPermission%>"
476                    image="edit.gif"
477                    tooltip="<%=bioMaterial == null ? "Add biomaterial to this well" : "Change the biomaterial in this well"%>"
478                    onclick="<%="editItem("+item.getId()+")"%>"
479                  />
480                  <base:icon 
481                    visible="<%=!editWellPermission%>"
482                    image="locked.gif"
483                    tooltip="<%=item.hasBeenUsed() ? "This well has already been used" : "This well is locked for modification"%>"
484                  />
485                </tbl:cell>
486                <tbl:cell column="bioMaterial.description"><base:propertyvalue item="<%=item%>" property="bioMaterial.description"/></tbl:cell>
487                <tbl:cell column="bioMaterial.entryDate" value="<%=creationEvent == null ? null : creationEvent.getEntryDate() %>" />
488                <tbl:cell column="originalBioMaterial.name"><base:propertyvalue item="<%=item%>" property="originalBioMaterial" /></tbl:cell>
489                <tbl:cell column="permission"><%=PermissionUtil.getShortPermissions(item)%></tbl:cell>
490              </tbl:row>
491              <%
492            }
493          }
494          %>
495          </tbl:rows>
496        </tbl:data>
497      <%
498      if (numListed == 0)
499      {
500        %>
501        <tbl:panel><%=biowells == null || biowells.getTotalCount() == 0 ? "No biowells were found" : "No biowells on this page. Please select another page!" %></tbl:panel>
502        <%
503      }
504      else
505      {
506        %>
507        <tbl:navigator
508          page="<%=cc.getPage()%>" 
509          rowsperpage="<%=cc.getRowsPerPage()%>" 
510          totalrows="<%=biowells == null ? 0 : biowells.getTotalCount()%>" 
511          visible="<%=mode.hasNavigator()%>"
512          locked="true"
513        />
514        <%
515      }
516      %>
517    </tbl:table>
518    <base:buttongroup align="center" clazz="fixedatbottom">
519      <base:button onclick="returnSelected();" title="Ok" visible="<%=mode.hasOkButton()%>" />
520      <base:button onclick="window.close();" title="Cancel" visible="<%=mode.hasCancelButton()%>" />
521      <base:button onclick="window.close();" title="Close" visible="<%=mode.hasCloseButton()%>" />
522    </base:buttongroup>
523 
524    </t:tab>
525    <t:tab id="events" title="Plate events" />
526    <t:tab id="history" title="Change history" 
527        tooltip="Displays a log of all modifications made to this item"
528        visible="<%=ChangeHistoryUtil.showChangeHistoryTab(sc)%>" />
529    </t:tabcontrol>
530
531 
532  </base:body>
533  </base:page>
534  <%
535}
536finally
537{
538  if (biowells != null) biowells.close();
539  if (dc != null) dc.close();
540}
541%>
Note: See TracBrowser for help on using the repository browser.