source: trunk/www/biomaterials/bioplates/view_bioplate.jsp @ 5937

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

References #1655: GUI improvements

  • Fixes rest of view pages in biomaterials menu.
  • Use SVG filter to make disabled button images grayscale.
  • Property svn:eol-style set to native
  • Property svn:keywords set to Id
File size: 19.7 KB
Line 
1<%-- $Id: view_bioplate.jsp 5937 2012-01-27 11:00:26Z 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 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.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.BioPlate"
37  import="net.sf.basedb.core.BioWell"
38  import="net.sf.basedb.core.MeasuredBioMaterial"
39  import="net.sf.basedb.core.PlateGeometry"
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.ItemResultList"
44  import="net.sf.basedb.core.MultiPermissions"
45  import="net.sf.basedb.core.PermissionDeniedException"
46  import="net.sf.basedb.core.PluginDefinition"
47  import="net.sf.basedb.core.plugin.GuiContext"
48  import="net.sf.basedb.core.plugin.Plugin"
49  import="net.sf.basedb.core.Project"
50  import="net.sf.basedb.core.query.Orders"
51  import="net.sf.basedb.core.query.Hql"
52  import="net.sf.basedb.clients.web.Base"
53  import="net.sf.basedb.clients.web.ChangeHistoryUtil"
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.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.BIOPLATE;
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  Map<Plugin.MainType, Integer> pluginCount = PluginDefinition.countPlugins(dc, guiContext);
91
92  String title = null;
93  BioPlate bioplate = BioPlate.getById(dc, itemId);
94  Item bioMaterialType = bioplate.getBioPlateType().getBioMaterialType();
95  PlateGeometry geometry = bioplate.getPlateGeometry();
96 
97  final boolean writePermission = bioplate.hasPermission(Permission.WRITE);
98  final boolean deletePermission = bioplate.hasPermission(Permission.DELETE);
99  final boolean sharePermission = bioplate.hasPermission(Permission.SET_PERMISSION);
100  final boolean setOwnerPermission = bioplate.hasPermission(Permission.SET_OWNER);
101  final boolean isRemoved = bioplate.isRemoved();
102  final boolean isUsed = isRemoved && bioplate.isUsed();
103  final boolean deletePermanentlyPermission = deletePermission && !isUsed;
104  final boolean isOwner = bioplate.isOwner();
105  JspContext jspContext = ExtensionsControl.createContext(dc, pageContext, guiContext, bioplate);
106  ExtensionsInvoker invoker = ToolbarUtil.useExtensions(jspContext);
107  Formatter<Date> dateFormatter = FormatterFactory.getDateFormatter(sc);
108  %>
109  <base:page title="<%=title%>">
110  <base:head scripts="tabcontrol.js,table.js,ajax.js,json2.js" 
111    styles="toolbar.css,table.css,headertabcontrol.css,path.css,plate.css">
112    <ext:scripts context="<%=jspContext%>" />
113    <ext:stylesheets context="<%=jspContext%>" />
114    <script language="JavaScript">
115    function editItem()
116    {
117      Main.viewOrEditItem('<%=ID%>', '<%=itemType.name()%>', <%=itemId%>, true);
118    }
119    function shareItem()
120    {
121      Main.openPopup('index.jsp?ID=<%=ID%>&cmd=ShareItem&item_id=<%=itemId%>', 'SharePlate', 600, 400);
122    }
123    function deleteItem()
124    {
125      location.replace('index.jsp?ID=<%=ID%>&cmd=DeleteItem&item_id=<%=itemId%>');
126    }
127    function restoreItem()
128    {
129      location.replace('index.jsp?ID=<%=ID%>&cmd=RestoreItem&item_id=<%=itemId%>');
130    }
131    function deleteItemPermanently()
132    {
133      Main.deleteItemPermanently('<%=ID%>', true, '<%=itemType.name()%>', <%=itemId%>, '&callback=itemDeleted');
134    }
135    function itemDeleted()
136    {
137      Main.listItems('<%=ID%>', '<%=itemType.name()%>');
138    }
139    function showUsingItems()
140    {
141      Main.showUsingItems('<%=ID%>', '<%=itemType.name()%>', <%=itemId%>);
142    }
143    function setOwner()
144    {
145      Main.openPopup('index.jsp?ID=<%=ID%>&cmd=SetOwnerOfItem&item_id=<%=itemId%>', 'SetOwnerOfItem', 450, 300);
146    }
147    function runPlugin(cmd)
148    {
149      Main.openPopup('index.jsp?ID=<%=ID%>&cmd='+cmd+'&item_id=<%=itemId%>', 'RunPlugin'+cmd, 750, 500);
150    }
151    function viewWells()
152    {
153      location.href = 'wells/index.jsp?ID=<%=ID%>&bioplate_id=<%=itemId%>';
154    }
155    function viewEvents()
156    {
157      location.href = 'events/index.jsp?ID=<%=ID%>&bioplate_id=<%=itemId%>';
158    }
159    function switchTab(tabControlId, tabId)
160    {
161      if (tabId == 'history' && tabId != '<%=tab%>')
162      {
163        location.href = 'index.jsp?ID=<%=ID%>&cmd=ViewItem&item_id=<%=itemId%>&tab='+tabId;
164      }
165      else if (tabId == 'wells')
166      {
167        viewWells();
168      }
169      else if (tabId == 'events')
170      {
171        viewEvents();
172      }
173      else
174      {
175        TabControl.setActiveTab(tabControlId, tabId);
176      }
177    }
178    function editWell(wellId)
179    {
180      Main.viewOrEditItem('<%=ID%>', 'BIOWELL', wellId, true);
181    }
182    function showWellInfo(evt, coordinate, wellId)
183    {
184      // Display the 'wellInfo' postit note
185      var wellInfo = document.getElementById('wellInfo');
186      var wellTd = document.getElementById('well.' + wellId);
187      var pos = Main.getElementPosition(wellTd);
188      wellInfo.style.left = (pos.left + pos.width - 5) + 'px';
189      wellInfo.style.top = (pos.top + 10) + 'px';
190      Main.show('wellInfo');
191
192      // Get the well information
193      var info = wellInfoCache['well.'+wellId];
194      if (!info)
195      {
196        // Use Ajax to load the information
197        wellInfo.innerHTML = '[' + coordinate + '] loading, please wait...';
198        info = loadWellInfo(wellId);
199      }
200      var html;
201      var bioMaterial = info.bioMaterial;
202      if (bioMaterial)
203      {
204        if (bioMaterial.denied)
205        {
206          html = 'Denied';
207        }
208        else
209        {
210          var id = bioMaterial.id;
211          var type = bioMaterial.type;
212          var subtype = bioMaterial.subtype;
213          html = Main.linkItem('<%=ID%>', type, id, bioMaterial.editable, bioMaterial.name);
214          html += ': <b>' + type + '</b>';
215          if (subtype) html += ' <span class="itemsubtype">[' + subtype.name + ']</span>';
216          html += '<br>'+bioMaterial.description;
217        }
218      }
219      else
220      {
221        html = 'Empty';
222      }
223      wellInfo.innerHTML = html;
224    }
225    function hideWellInfo()
226    {
227      Main.hide('wellInfo');
228    }
229    var wellInfoCache = new Array();
230    function loadWellInfo(wellId)
231    {
232      var request = Ajax.getXmlHttpRequest();
233      var url = 'wells/ajax.jsp?ID=<%=ID%>&cmd=WellInfo&encodeStrings=1&item_id=' + wellId;
234      request.open("GET", url, false);
235      // NOTE! 'false' causes code to wait for the response. aka. 'Synchronous AJAX' or SJAX.
236      request.send(null);
237      var response = Ajax.parseJsonResponse(request.responseText);
238      if (response.status != 'ok')
239      {
240        alert(response.message);
241        return false;
242      }
243
244      wellInfoCache['well.'+wellId] = response;
245      return response;
246    }
247    function viewOrEditWellItem(event, itemType, itemId, editable)
248    {
249      //Main.viewOrEditItem('<%=ID%>', itemType, itemId, editable);
250      Main.itemOnClick(event, '<%=ID%>', itemType, itemId, editable);
251    }
252    function moveBioMaterial()
253    {
254      Main.openPopup('index.jsp?ID=<%=ID%>&item_id=<%=itemId%>&cmd=MoveBioMaterial', 'MoveBioMaterial', 900, 600);
255    }
256    function createChildBioPlate()
257    {
258      Main.openPopup('index.jsp?ID=<%=ID%>&item_id=<%=itemId%>&cmd=CreateChildBioPlate', 'CreateChildBioPlate', 900, 600);
259    }
260    </script>
261  </base:head>
262  <base:body attributes="onmouseout='hideWellInfo()'">
263    <p:path><p:pathelement 
264      title="Bioplates" href="<%="index.jsp?ID="+ID%>" /><p:pathelement 
265      title="<%=HTML.encodeTags(bioplate.getName())%>" /></p:path>
266   
267    <t:tabcontrol id="main" 
268      subclass="content mastertabcontrol"
269      active="<%=tab%>" switch="switchTab" remember="false">
270    <t:tab id="properties" title="Properties">
271      <div>
272      <table class="fullform">
273      <tr>
274        <th class="itemstatus">
275          <base:icon 
276            image="shared.gif" 
277            visible="<%=bioplate.isShared()%>"
278            tooltip="This item is shared to other users, groups and/or projects"
279          />
280          <base:icon 
281            image="deleted.gif"
282            onclick="deleteItemPermanently()"
283            tooltip="This item has been flagged for deletion. Click to delete it now."
284            enabled="<%=deletePermanentlyPermission %>"
285            visible="<%=isRemoved%>" 
286          />
287          <base:icon image="used.gif" 
288            onclick="showUsingItems()"
289            tooltip="This item is used by other items and can't be permanently deleted. Show the items that are using this one"
290            visible="<%=isRemoved && isUsed%>" />
291        </th>
292        <td style="padding: 0px;" colspan="2">
293          <tbl:toolbar subclass="bottomborder">
294     
295            <tbl:button 
296              disabled="<%=writePermission ? false : true%>" 
297              image="edit.gif" 
298              onclick="editItem()" 
299              title="Edit&hellip;" 
300              tooltip="<%=writePermission ? "Edit this bioplate" : "You do not have permission to edit this bioplate"%>" 
301            />
302            <tbl:button 
303              disabled="<%=deletePermission ? false : true%>" 
304              image="delete.gif" 
305              onclick="deleteItem()" 
306              title="Delete"
307              visible="<%=!bioplate.isRemoved()%>"
308              tooltip="<%=deletePermission ? "Delete this bioplate" : "You do not have permission to delete this bioplate"%>" 
309            />
310            <tbl:button 
311              disabled="<%=writePermission ? false : true%>" 
312              image="restore.gif" 
313              onclick="restoreItem()" 
314              title="Restore"
315              visible="<%=bioplate.isRemoved()%>"
316              tooltip="<%=writePermission ? "Restore this bioplate" : "You do not have permission to restore this bioplate"%>" 
317            />
318            <tbl:button 
319              disabled="<%=sharePermission ? false : true%>"
320              image="share.gif"
321              onclick="shareItem()" 
322              title="Share&hellip;" 
323              tooltip="<%=sharePermission ? "Share this bioplate to other user, groups and projects" : "You do not have permission to share this bioplate"%>"
324            />
325            <tbl:button 
326              disabled="<%=setOwnerPermission ? false : true%>"
327              image="take_ownership.png"
328              onclick="setOwner()" 
329              title="Set owner&hellip;"
330              tooltip="<%=setOwnerPermission ? "Change owner of this item" : "You do not have permission to change ownership of this item"%>"
331            />
332            <tbl:button 
333              image="move_to_plate.png" 
334              onclick="moveBioMaterial()" 
335              title="Move biomaterial&hellip;" 
336              tooltip="Move biomaterial on this plate to another plate" 
337            />
338            <tbl:button 
339              image="add.png" 
340              onclick="createChildBioPlate()" 
341              title="<%="Create child bioplate" + (bioMaterialType == Item.EXTRACT ? "/bioassay" : "") +"&hellip;"%>" 
342              tooltip="Create one or more child biomaterial plates" 
343              visible="<%=bioMaterialType != null%>"
344            />
345            <tbl:button 
346              image="import.gif" 
347              onclick="runPlugin('ImportItem')" 
348              title="Import&hellip;" 
349              tooltip="Import data" 
350              visible="<%=pluginCount.containsKey(Plugin.MainType.IMPORT)%>"
351            />
352            <tbl:button 
353              image="export.gif" 
354              onclick="runPlugin('ExportItem')" 
355              title="Export&hellip;" 
356              tooltip="Export data" 
357              visible="<%=pluginCount.containsKey(Plugin.MainType.EXPORT)%>"
358            />
359            <tbl:button 
360              image="runplugin.gif" 
361              onclick="runPlugin('RunPlugin')" 
362              title="Run plugin&hellip;" 
363              tooltip="Run a plugin" 
364              visible="<%=pluginCount.containsKey(Plugin.MainType.OTHER)%>"
365            />
366            <ext:render extensions="<%=invoker%>" context="<%=jspContext%>" 
367              wrapper="<%=new PrefixSuffixRenderer(jspContext, "<td>", "</td>") %>"/>
368            <tbl:button
369              image="help.png"
370              onclick="<%="Main.openHelp('" + ID +"', 'plate.view.properties')"%>"
371              title="Help&hellip;"
372              tooltip="Get help about this page"
373            />
374          </tbl:toolbar>
375        </td>
376      </tr>
377    </table>
378    <table style="width: 100%;" class="bottomborder">
379    <tr valign="top">
380      <td style="width: 50%; height: 100%;">
381      <table class="fullform" >
382      <tr>
383        <th>Name</th>
384        <td><%=HTML.encodeTags(bioplate.getName())%></td>
385      </tr>
386      <tr>
387        <th>Barcode</th>
388        <td><%=HTML.encodeTags(bioplate.getBarcode())%></td>
389      </tr>
390      <tr>
391        <th>Destroyed</th>
392        <td><%=bioplate.isDestroyed() ? "yes" : "no"%></td>
393      </tr>
394      <tr>
395        <th>Bioplate type</th>
396        <td><base:propertyvalue item="<%=bioplate%>" property="bioPlateType" /></td>
397      </tr>
398      <tr>
399        <th>Geometry</th>
400        <td><base:propertyvalue item="<%=bioplate%>" property="plateGeometry" /></td>
401      </tr>
402      <tr>
403        <th>Free (total) wells</th>
404        <td><%=bioplate.getFreeWells()%> (<%=bioplate.getTotalWells()%>)</td>
405      </tr>
406      <tr>
407        <th>Freezer</th>
408        <td><base:propertyvalue item="<%=bioplate%>" property="freezer" /></td>
409      </tr>
410      <tr>
411        <th>Owner</th>
412        <td><base:propertyvalue item="<%=bioplate%>" property="owner" /></td>
413      </tr>
414      <tr>
415        <th>Permissions</th>
416        <td><%=PermissionUtil.getFullPermissionNames(bioplate)%></td>
417      </tr>
418      <tr class="dynamic">
419        <th>Description</th>
420        <td><%=HTML.niceFormat(bioplate.getDescription())%></td>
421      </tr>
422      </table>
423      </td>
424      <td style="width: 50%; padding: 1em;">
425        <table class="plate" onmouseout="event.cancelBubble=true">
426        <%
427        int columns = geometry.getColumns();
428        int rows = geometry.getRows();
429        WellCoordinateFormatter rowF = new WellCoordinateFormatter(true);
430        WellCoordinateFormatter colF = new WellCoordinateFormatter(false);
431        %>
432        <tr><td></td>
433        <%
434        for (int c = 0; c < columns; ++c)
435        {
436          %>
437          <td class="columnheader"><%=colF.format(c)%></td>
438          <%
439        }
440        %>
441        </tr>
442        <%
443        for (int r = 0; r < rows; ++r)
444        {
445          String row = rowF.format(r);
446          %>
447          <tr><td class="rowheader"><%=row%></td>
448          <%
449          for (int c = 0; c < columns; ++c)
450          {
451            BioWell well = bioplate.getBioWell(r, c);
452            if (well == null) continue;
453            boolean isEmpty = well.isEmpty();
454            boolean hasBeenUsed = well.hasBeenUsed();
455            boolean canAddBioMaterial = well.canAddBioMaterial();
456            boolean canClearBioMaterial = well.canClearBioMaterial();
457            boolean usePermission = well.hasPermission(Permission.USE);
458           
459            boolean deniedBioMaterial = false;
460           
461            String cls = "well";
462            String tooltip = "";
463            String onClick = null;
464            String onMouseOver = "hideWellInfo()";
465           
466            if (isEmpty)
467            {
468              cls += " empty";
469              if (usePermission && canAddBioMaterial)
470              {
471                // The used is allowed to add biomaterial to the empty well
472                cls += " editable";
473                onClick = "editWell(" + well.getId() + ")";
474                tooltip = "Add biomaterial to this well";
475              }
476              else if (hasBeenUsed) 
477              {
478                // The well has been used and it is not allowed to add biomaterial
479                cls += " wasused";
480                onMouseOver = "showWellInfo(event, '" + row + (c+1) + "', " + well.getId() + ")";
481                tooltip = "This well has already been used";
482              }
483              else
484              {
485                // The user doesn't have permission to add biomaterial
486                cls += " locked";
487                tooltip = "You are not allowed to add biomaterial to this well";
488              }
489            }
490            else
491            {
492              cls += " used";
493              try
494              {
495                MeasuredBioMaterial bioMaterial = well.getBioMaterial();
496                onMouseOver = "showWellInfo(event, '" + row + (c+1) + "', " + well.getId() + ")";
497                if (usePermission && canClearBioMaterial && bioMaterial.hasPermission(Permission.WRITE))
498                {
499                  // The user is allowed to replace/remove the biomaterial in the well
500                  cls += " editable";
501                  onClick = "editWell(" + well.getId() + ")";
502                  if (canAddBioMaterial)
503                  {
504                    // Replace and/or remove
505                    tooltip = "Change biomaterial in this well";
506                  }
507                  else
508                  {
509                    // Remove only
510                    tooltip = "Remove the biomaterial from this well";
511                  }
512                }
513                else
514                {
515                  cls += " locked";
516                  tooltip = "This well is locked for modifications";
517                }
518              }
519              catch (PermissionDeniedException ex)
520              {
521                cls += " denied";
522                tooltip = "Access denied";
523              }
524            }
525            %>
526            <td class="<%=cls%>" id="well.<%=well.getId()%>"
527              <%=onClick != null ? "onclick=\"" + onClick + "\"" : ""%>
528              <%=onMouseOver != null ? "onmouseover=\"" + onMouseOver + "\"" : ""%>
529              title="<%=tooltip%>"></td>
530            <%
531          }
532          %>
533          </tr>
534          <%
535        }
536        %>
537        </table>
538      </td>
539    </tr>
540    </table>
541    </div>
542     
543      <jsp:include page="../../common/anytoany/list_anytoany.jsp">
544        <jsp:param name="ID" value="<%=ID%>" />
545        <jsp:param name="item_type" value="<%=itemType.name()%>" />
546        <jsp:param name="item_id" value="<%=itemId%>" />
547        <jsp:param name="title" value="Other items related to this bioplate" />
548      </jsp:include>
549      <jsp:include page="../../common/share/list_share.jsp">
550        <jsp:param name="ID" value="<%=ID%>" />
551        <jsp:param name="item_type" value="<%=itemType.name()%>" />
552        <jsp:param name="item_id" value="<%=itemId%>" />
553        <jsp:param name="title" value="Shared to" />
554      </jsp:include>
555      </t:tab>
556     
557      <t:tab id="annotations" title="Annotations" 
558        tooltip="View annotation values" clazz="white">
559        <jsp:include page="../../common/annotations/list_annotations.jsp">
560          <jsp:param name="item_type" value="<%=itemType.name()%>" />
561          <jsp:param name="item_id" value="<%=itemId%>" />
562          <jsp:param name="ID" value="<%=ID%>" />
563        </jsp:include>
564      </t:tab>
565
566      <t:tab id="wells" title="Wells" />
567      <t:tab id="events" title="Plate events" />
568      <t:tab id="history" title="Change history" 
569        tooltip="Displays a log of all modifications made to this item"
570        visible="<%=ChangeHistoryUtil.showChangeHistoryTab(sc)%>">
571        <%
572        if ("history".equals(tab))
573        {
574          %>
575          <jsp:include page="../../common/history/frameset.jsp">
576            <jsp:param name="source_type" value="<%=itemType.name()%>" />
577            <jsp:param name="source_id" value="<%=itemId%>" />
578            <jsp:param name="ID" value="<%=ID%>" />
579          </jsp:include>
580          <%
581        }
582        %>
583      </t:tab>
584    </t:tabcontrol>
585   
586    <div class="postit" id="wellInfo" style="display:none; width: 20em; min-height: 3em;" onmouseout="event.cancelBubble=true"></div>
587  </base:body>
588  </base:page>
589  <%
590}
591finally
592{
593  if (dc != null) dc.close();
594}
595%>
Note: See TracBrowser for help on using the repository browser.