source: trunk/www/lims/plates/view_plate.jsp @ 5943

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

References #1655: GUI improvements

Plate section of Array LIMS.

  • Property svn:eol-style set to native
  • Property svn:keywords set to Date Id
File size: 16.6 KB
Line 
1<%-- $Id: view_plate.jsp 5943 2012-02-01 14:49:04Z nicklas $
2  ------------------------------------------------------------------
3  Copyright (C) 2006 Jari Häkkinen, Nicklas Nordborg, Martin Svensson
4  Copyright (C) 2007 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 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.SystemItems"
30  import="net.sf.basedb.core.Group"
31  import="net.sf.basedb.core.Item"
32  import="net.sf.basedb.core.ItemContext"
33  import="net.sf.basedb.core.Permission"
34  import="net.sf.basedb.core.AnnotationType"
35  import="net.sf.basedb.core.AnnotationSet"
36  import="net.sf.basedb.core.Plate"
37  import="net.sf.basedb.core.PlateType"
38  import="net.sf.basedb.core.PlateGeometry"
39  import="net.sf.basedb.core.PlateMapping"
40  import="net.sf.basedb.core.User"
41  import="net.sf.basedb.core.ItemQuery"
42  import="net.sf.basedb.core.Include"
43  import="net.sf.basedb.core.ItemResultIterator"
44  import="net.sf.basedb.core.ItemResultList"
45  import="net.sf.basedb.core.MultiPermissions"
46  import="net.sf.basedb.core.PermissionDeniedException"
47  import="net.sf.basedb.core.PluginDefinition"
48  import="net.sf.basedb.core.plugin.GuiContext"
49  import="net.sf.basedb.core.plugin.Plugin"
50  import="net.sf.basedb.core.Project"
51  import="net.sf.basedb.core.query.Orders"
52  import="net.sf.basedb.core.query.Hql"
53  import="net.sf.basedb.clients.web.Base"
54  import="net.sf.basedb.clients.web.ChangeHistoryUtil"
55  import="net.sf.basedb.clients.web.PermissionUtil"
56  import="net.sf.basedb.clients.web.util.HTML"
57  import="net.sf.basedb.util.Values"
58  import="net.sf.basedb.util.formatter.Formatter"
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.Collections"
66  import="java.util.Date"
67  import="java.util.Map"
68  import="java.util.Set"
69  import="java.util.List"
70%>
71<%@ taglib prefix="base" uri="/WEB-INF/base.tld" %>
72<%@ taglib prefix="t" uri="/WEB-INF/tab.tld" %>
73<%@ taglib prefix="tbl" uri="/WEB-INF/table.tld" %>
74<%@ taglib prefix="p" uri="/WEB-INF/path.tld" %>
75<%@ taglib prefix="ext" uri="/WEB-INF/extensions.tld" %>
76<%!
77  private static final Item itemType = Item.PLATE;
78  private static final GuiContext guiContext = new GuiContext(itemType, GuiContext.Type.ITEM);
79%>
80<%
81final SessionControl sc = Base.getExistingSessionControl(pageContext, true);
82final String ID = sc.getId();
83final ItemContext cc = Base.getAndSetCurrentContext(sc, itemType, null, null);
84final int itemId = cc.getId();
85final String tab = Values.getString(request.getParameter("tab"), "properties");
86final float scale = Base.getScale(sc);
87final DbControl dc = sc.newDbControl();
88try
89{
90  Formatter<Date> dateFormatter = FormatterFactory.getDateFormatter(sc);
91  Map<Plugin.MainType, Integer> pluginCount = PluginDefinition.countPlugins(dc, guiContext);
92
93  String title = null;
94  Plate plate = Plate.getById(dc, itemId);
95 
96  PlateMapping currentPlateMapping = null;
97  try
98  {
99    currentPlateMapping = plate.getPlateMapping();
100  }
101  catch (PermissionDeniedException ex)
102  {}
103 
104  final boolean writePermission = plate.hasPermission(Permission.WRITE);
105  final boolean deletePermission = plate.hasPermission(Permission.DELETE);
106  final boolean sharePermission = plate.hasPermission(Permission.SET_PERMISSION);
107  final boolean setOwnerPermission = plate.hasPermission(Permission.SET_OWNER);
108  final boolean isRemoved = plate.isRemoved();
109  final boolean isUsed = isRemoved && plate.isUsed();
110  final boolean deletePermanentlyPermission = deletePermission && !isUsed;
111  final boolean isOwner = plate.isOwner();
112  JspContext jspContext = ExtensionsControl.createContext(dc, pageContext, guiContext, plate);
113  ExtensionsInvoker invoker = ToolbarUtil.useExtensions(jspContext);
114  %>
115  <base:page title="<%=title%>">
116  <base:head scripts="tabcontrol.js,table.js" styles="toolbar.css,table.css,headertabcontrol.css,path.css">
117    <ext:scripts context="<%=jspContext%>" />
118    <ext:stylesheets context="<%=jspContext%>" />
119    <script language="JavaScript">
120    function editItem()
121    {
122      Main.viewOrEditItem('<%=ID%>', '<%=itemType.name()%>', <%=itemId%>, true);
123    }
124    function shareItem()
125    {
126      Main.openPopup('index.jsp?ID=<%=ID%>&cmd=ShareItem&item_id=<%=itemId%>', 'SharePlate', 600, 400);
127    }
128    function deleteItem()
129    {
130      location.replace('index.jsp?ID=<%=ID%>&cmd=DeleteItem&item_id=<%=itemId%>');
131    }
132    function restoreItem()
133    {
134      location.replace('index.jsp?ID=<%=ID%>&cmd=RestoreItem&item_id=<%=itemId%>');
135    }
136    function deleteItemPermanently()
137    {
138      Main.deleteItemPermanently('<%=ID%>', true, '<%=itemType.name()%>', <%=itemId%>, '&callback=itemDeleted');
139    }
140    function itemDeleted()
141    {
142      Main.listItems('<%=ID%>', '<%=itemType.name()%>');
143    }
144    function showUsingItems()
145    {
146      Main.showUsingItems('<%=ID%>', '<%=itemType.name()%>', <%=itemId%>);
147    }
148    function setOwner()
149    {
150      Main.openPopup('index.jsp?ID=<%=ID%>&cmd=SetOwnerOfItem&item_id=<%=itemId%>', 'SetOwnerOfItem', 450, 300);
151    }
152    function runPlugin(cmd)
153    {
154      Main.openPopup('index.jsp?ID=<%=ID%>&cmd='+cmd+'&item_id=<%=itemId%>', 'RunPlugin'+cmd, 750, 500);
155    }
156    function viewWells()
157    {
158      location.href = 'wells/index.jsp?ID=<%=ID%>&plate_id=<%=itemId%>';
159    }
160    function viewEvents()
161    {
162      location.href = 'events/index.jsp?ID=<%=ID%>&plate_id=<%=itemId%>';
163    }
164    function switchTab(tabControlId, tabId)
165    {
166      if (tabId == 'history' && tabId != '<%=tab%>')
167      {
168        location.href = 'index.jsp?ID=<%=ID%>&cmd=ViewItem&item_id=<%=itemId%>&tab='+tabId;
169      }
170      else if (tabId == 'events')
171      {
172        viewEvents();
173      }
174      else if (tabId == 'wells')
175      {
176        viewWells();
177      }
178      else
179      {
180        TabControl.setActiveTab(tabControlId, tabId);
181      }
182    }
183    </script>
184  </base:head>
185  <base:body>
186    <p:path><p:pathelement 
187      title="Plates" href="<%="index.jsp?ID="+ID%>" 
188      /><p:pathelement title="<%=HTML.encodeTags(plate.getName())%>" 
189      /></p:path>
190   
191    <t:tabcontrol 
192      id="main" 
193      subclass="content mastertabcontrol" 
194      active="<%=tab%>" switch="switchTab" remember="false">
195    <t:tab id="properties" title="Properties">
196      <div>
197      <table class="fullform bottomborder">
198      <tr>
199        <th class="itemstatus">
200          <base:icon 
201            image="shared.gif" 
202            visible="<%=plate.isShared()%>"
203            tooltip="This item is shared to other users, groups and/or projects"
204          />
205          <base:icon 
206            image="deleted.gif"
207            onclick="deleteItemPermanently()"
208            tooltip="This item has been flagged for deletion. Click to delete it now."
209            enabled="<%=deletePermanentlyPermission %>"
210            visible="<%=isRemoved%>" 
211          />
212          <base:icon image="used.gif" 
213            onclick="showUsingItems()"
214            tooltip="This item is used by other items and can't be permanently deleted. Show the items that are using this one"
215            visible="<%=isRemoved && isUsed%>" />
216        </th>
217        <td style="padding: 0px;">
218          <tbl:toolbar subclass="bottomborder">
219            <tbl:button 
220              disabled="<%=!writePermission%>" 
221              image="edit.gif" 
222              onclick="editItem()" 
223              title="Edit&hellip;" 
224              tooltip="<%=writePermission ? "Edit this plate" : "You do not have permission to edit this plate"%>" 
225            />
226            <tbl:button 
227              disabled="<%=!deletePermission%>" 
228              image="delete.gif" 
229              onclick="deleteItem()" 
230              title="Delete"
231              visible="<%=!plate.isRemoved()%>"
232              tooltip="<%=deletePermission ? "Delete this plate" : "You do not have permission to delete this plate"%>" 
233            />
234            <tbl:button 
235              disabled="<%=!writePermission%>" 
236              image="restore.gif" 
237              onclick="restoreItem()" 
238              title="Restore"
239              visible="<%=plate.isRemoved()%>"
240              tooltip="<%=writePermission ? "Restore this plate" : "You do not have permission to restore this plate"%>" 
241            />
242            <tbl:button 
243              disabled="<%=!sharePermission%>"
244              image="share.gif"
245              onclick="shareItem()" 
246              title="Share&hellip;" 
247              tooltip="<%=sharePermission ? "Share this plate to other user, groups and projects" : "You do not have permission to share this plate"%>"
248            />
249            <tbl:button 
250              disabled="<%=!setOwnerPermission%>"
251              image="take_ownership.png"
252              onclick="setOwner()" 
253              title="Set owner&hellip;"
254              tooltip="<%=setOwnerPermission ? "Change owner of this item" : "You do not have permission to change ownership of this item"%>"
255            />
256            <tbl:button 
257              image="import.gif" 
258              onclick="runPlugin('ImportItem')" 
259              title="Import&hellip;" 
260              tooltip="Import data" 
261              visible="<%=pluginCount.containsKey(Plugin.MainType.IMPORT)%>"
262            />
263            <tbl:button 
264              image="export.gif" 
265              onclick="runPlugin('ExportItem')" 
266              title="Export&hellip;" 
267              tooltip="Export data" 
268              visible="<%=pluginCount.containsKey(Plugin.MainType.EXPORT)%>"
269            />
270            <tbl:button 
271              image="runplugin.gif" 
272              onclick="runPlugin('RunPlugin')" 
273              title="Run plugin&hellip;" 
274              tooltip="Run a plugin" 
275              visible="<%=pluginCount.containsKey(Plugin.MainType.OTHER)%>"
276            />
277            <ext:render extensions="<%=invoker%>" context="<%=jspContext%>" 
278              wrapper="<%=new PrefixSuffixRenderer(jspContext, "<td>", "</td>") %>"/>
279            <tbl:button
280              image="help.png"
281              onclick="<%="Main.openHelp('" + ID +"', 'plate.view.properties')"%>"
282              title="Help&hellip;"
283              tooltip="Get help about this page"
284            />
285          </tbl:toolbar>
286        </td>
287      </tr>
288      <tr>
289        <th>Name</th>
290        <td><%=HTML.encodeTags(plate.getName())%></td>
291      </tr>
292      <tr>
293        <th>Registered</th>
294        <td><%=dateFormatter.format(plate.getEntryDate())%></td>
295      </tr>
296      <tr>
297        <th>Barcode</th>
298        <td><%=HTML.encodeTags(plate.getBarcode())%></td>
299      </tr>
300      <tr>
301        <th>Destroyed</th>
302        <td><%=plate.isDestroyed() ? "yes" : "no"%></td>
303      </tr>
304      <tr>
305        <th>Type</th>
306        <td><base:propertyvalue item="<%=plate%>" property="plateType" /></td>
307      </tr>
308      <tr>
309        <th>Geometry</th>
310        <td><base:propertyvalue item="<%=plate%>" property="plateType.plateGeometry" /></td>
311      </tr>
312      <tr>
313        <th>Merge mapping</th>
314        <td><%
315          if (currentPlateMapping != null && currentPlateMapping.getImage() != null)
316          {
317            %>
318            <img id="mappingImage" src="../../images/platemappings/<%=currentPlateMapping.getImage()%>" align="right">
319            <%
320          }
321          %>
322          <base:propertyvalue item="<%=plate%>" property="plateMapping" />
323        </td>
324      </tr>
325      <tr>
326        <th>Owner</th>
327        <td><base:propertyvalue item="<%=plate%>" property="owner" /></td>
328      </tr>
329      <tr>
330        <th>Permissions</th>
331        <td><%=PermissionUtil.getFullPermissionNames(plate)%></td>
332      </tr>
333      <tr>
334        <th>Description</th>
335        <td><%=HTML.niceFormat(plate.getDescription())%></td>
336      </tr>
337      </table>
338      </div>
339      <%
340      ItemQuery<Plate> parentPlatesQuery = plate.getParentPlates();
341      parentPlatesQuery.include(Include.ALL);
342      parentPlatesQuery.order(Orders.asc(Hql.property("name")));
343      ItemResultList<Plate> parentPlates = parentPlatesQuery.list(dc);
344      %>
345      <base:section
346        id="parents"
347        title="<%="Parent plates (" + parentPlates.size() + ")"%>"
348        context="<%=cc%>"
349        >
350        <%
351        if (parentPlates.size() == 0)
352        {
353          %>
354          <div class="messagecontainer note">
355          This plate doesn't have any parents (or, you don't have permission to view them).
356          </div>
357          <%
358        }
359        else
360        {
361          %>
362          <tbl:table
363            id="parentplates"
364            columns="all"
365            >
366          <tbl:columndef 
367            id="name"
368            title="Name"
369          />
370          <tbl:columndef 
371            id="index"
372            title="Index"
373          />
374          <tbl:columndef 
375            id="description"
376            title="Description"
377          />
378          <tbl:data>
379            <tbl:headers>
380              <tbl:headerrow>
381                <tbl:columnheaders />
382              </tbl:headerrow>
383            </tbl:headers>
384            <tbl:rows>
385            <%
386            for (Plate item : parentPlates)
387            {
388              %>
389              <tbl:row>
390                <tbl:cell column="name"><base:icon 
391                    image="deleted.gif" 
392                    tooltip="This item has been scheduled for deletion" 
393                    visible="<%=item.isRemoved()%>"
394                  /><%=Base.getLinkedName(ID, item, false, true)%></tbl:cell>
395                <tbl:cell column="index"><%=plate.getSourceIndex(item)+1%></tbl:cell>
396                <tbl:cell column="description"><%=HTML.encodeTags(item.getDescription())%></tbl:cell>
397              </tbl:row>
398              <%
399            }
400            %>
401            </tbl:rows>
402          </tbl:data>
403          </tbl:table>
404          <%
405        }
406        %>
407      </base:section>
408      <%
409      ItemQuery<Plate> childPlatesQuery = plate.getChildPlates();
410      childPlatesQuery.include(Include.ALL);
411      childPlatesQuery.order(Orders.asc(Hql.property("name")));
412      ItemResultList<Plate> childPlates = childPlatesQuery.list(dc);
413      %>
414      <base:section
415        id="children"
416        title="<%="Child plates (" + childPlates.size() + ")"%>"
417        context="<%=cc%>"
418        >
419        <%
420        if (childPlates.size() == 0)
421        {
422          %>
423          <div class="messagecontainer note">
424          This plate doesn't have any children (or, you don't have permission to view them).
425          </div>
426          <%
427        }
428        else
429        {
430          %>
431          <tbl:table
432            id="childplates"
433            columns="all"
434            >
435          <tbl:columndef 
436            id="name"
437            title="Name"
438          />
439          <tbl:columndef
440            id="mapping"
441            title="Mapping"
442          />
443          <tbl:columndef 
444            id="index"
445            title="Index"
446          />
447          <tbl:columndef 
448            id="description"
449            title="Description"
450          />
451          <tbl:data>
452            <tbl:headers>
453              <tbl:headerrow>
454                <tbl:columnheaders />
455              </tbl:headerrow>
456            </tbl:headers>
457            <tbl:rows>
458            <%
459            for (Plate item : childPlates)
460            {
461              %>
462              <tbl:row>
463                <tbl:cell column="name"><base:icon 
464                    image="deleted.gif" 
465                    tooltip="This item has been scheduled for deletion" 
466                    visible="<%=item.isRemoved()%>"
467                  /><%=Base.getLinkedName(ID, item, false, true)%></tbl:cell>
468                <tbl:cell column="mapping"><base:propertyvalue item="<%=item%>" property="plateMapping" /></tbl:cell>
469                <tbl:cell column="index"><%=item.getSourceIndex(plate) + 1%></tbl:cell>
470                <tbl:cell column="description"><%=HTML.encodeTags(item.getDescription())%></tbl:cell>
471              </tbl:row>
472              <%
473            }
474            %>
475            </tbl:rows>
476          </tbl:data>
477          </tbl:table>
478          <%
479        }
480        %>
481      </base:section>
482      <jsp:include page="../../common/anytoany/list_anytoany.jsp">
483        <jsp:param name="ID" value="<%=ID%>" />
484        <jsp:param name="item_type" value="<%=itemType.name()%>" />
485        <jsp:param name="item_id" value="<%=itemId%>" />
486        <jsp:param name="title" value="Other items related to this plate" />
487      </jsp:include>
488      <jsp:include page="../../common/share/list_share.jsp">
489        <jsp:param name="ID" value="<%=ID%>" />
490        <jsp:param name="item_type" value="<%=itemType.name()%>" />
491        <jsp:param name="item_id" value="<%=itemId%>" />
492        <jsp:param name="title" value="Shared to" />
493      </jsp:include>
494      </t:tab>
495     
496      <t:tab id="annotations" title="Annotations" 
497        tooltip="View annotation values" clazz="white">
498        <jsp:include page="../../common/annotations/list_annotations.jsp">
499          <jsp:param name="item_type" value="<%=itemType.name()%>" />
500          <jsp:param name="item_id" value="<%=itemId%>" />
501          <jsp:param name="ID" value="<%=ID%>" />
502        </jsp:include>
503      </t:tab>
504
505      <t:tab id="events" title="Events" />
506      <t:tab id="wells" title="Wells" />
507      <t:tab id="history" title="Change history" 
508        tooltip="Displays a log of all modifications made to this item"
509        visible="<%=ChangeHistoryUtil.showChangeHistoryTab(sc)%>">
510        <%
511        if ("history".equals(tab))
512        {
513          %>
514          <jsp:include page="../../common/history/frameset.jsp">
515            <jsp:param name="source_type" value="<%=itemType.name()%>" />
516            <jsp:param name="source_id" value="<%=itemId%>" />
517            <jsp:param name="ID" value="<%=ID%>" />
518          </jsp:include>
519          <%
520        }
521        %>
522      </t:tab>
523    </t:tabcontrol>
524
525  </base:body>
526  </base:page>
527  <%
528}
529finally
530{
531  if (dc != null) dc.close();
532}
533
534%>
Note: See TracBrowser for help on using the repository browser.