source: trunk/www/biomaterials/samples/view_sample.jsp @ 5935

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

References #1655: GUI improvements

  • More changes to table and section taglibs. Simple item lists should now display ok (after using a different set of tags for the header row)
  • Hidable sections have been re-designed and should now look a bit better. However, in many of the places we use a section it is only used when there is data to list. The section should be used in all cases so we need to move the conditional test inside.
  • The code for listing "Shared to" information for items have been moved to an "include" page and the old code has been replaced in a lot of pages (may still be missing some).
  • The "Annotations & parameter" tab have been fixed with the new design.
  • The biosource, sample, extract and tag view pages have also been fixed.


  • Property svn:eol-style set to native
  • Property svn:keywords set to Date Id
File size: 19.3 KB
Line 
1<%-- $Id: view_sample.jsp 5935 2012-01-26 15:22:21Z nicklas $
2  ------------------------------------------------------------------
3  Copyright (C) 2006 Johan Enell, 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.Extract"
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.Sample"
35  import="net.sf.basedb.core.BioSource"
36  import="net.sf.basedb.core.BioMaterial"
37  import="net.sf.basedb.core.BioMaterialEvent"
38  import="net.sf.basedb.core.BioMaterialEventSource"
39  import="net.sf.basedb.core.BioWell"
40  import="net.sf.basedb.core.Protocol"
41  import="net.sf.basedb.core.User"
42  import="net.sf.basedb.core.Group"
43  import="net.sf.basedb.core.ItemProxy"
44  import="net.sf.basedb.core.ItemQuery"
45  import="net.sf.basedb.core.ItemResultList"
46  import="net.sf.basedb.core.query.ResultList"
47  import="net.sf.basedb.core.SpecialQuery"
48  import="net.sf.basedb.core.Include"
49  import="net.sf.basedb.core.MultiPermissions"
50  import="net.sf.basedb.core.query.Orders"
51  import="net.sf.basedb.core.query.Hql"
52  import="net.sf.basedb.core.PermissionDeniedException"
53  import="net.sf.basedb.core.PluginDefinition"
54  import="net.sf.basedb.core.plugin.GuiContext"
55  import="net.sf.basedb.core.plugin.Plugin"
56  import="net.sf.basedb.core.Project"
57  import="net.sf.basedb.clients.web.Base"
58  import="net.sf.basedb.clients.web.ChangeHistoryUtil"
59  import="net.sf.basedb.clients.web.PermissionUtil"
60  import="net.sf.basedb.clients.web.util.HTML"
61  import="net.sf.basedb.util.Values"
62  import="net.sf.basedb.util.formatter.Formatter"
63  import="net.sf.basedb.util.formatter.WellCoordinateFormatter"
64  import="net.sf.basedb.clients.web.formatter.FormatterFactory"
65  import="net.sf.basedb.clients.web.extensions.ExtensionsControl"
66  import="net.sf.basedb.clients.web.extensions.JspContext"
67  import="net.sf.basedb.clients.web.extensions.renderer.PrefixSuffixRenderer"
68  import="net.sf.basedb.clients.web.extensions.toolbar.ToolbarUtil"
69  import="net.sf.basedb.util.extensions.ExtensionsInvoker"
70  import="java.util.ArrayList"
71  import="java.util.Collections"
72  import="java.util.Date"
73  import="java.util.Map"
74  import="java.util.Set"
75  import="java.util.List"
76%>
77<%@ taglib prefix="base" uri="/WEB-INF/base.tld" %>
78<%@ taglib prefix="t" uri="/WEB-INF/tab.tld" %>
79<%@ taglib prefix="tbl" uri="/WEB-INF/table.tld" %>
80<%@ taglib prefix="p" uri="/WEB-INF/path.tld" %>
81<%@ taglib prefix="ext" uri="/WEB-INF/extensions.tld" %>
82<%!
83  private static final Item itemType = Item.SAMPLE;
84  private static final GuiContext guiContext = new GuiContext(itemType, GuiContext.Type.ITEM);
85%>
86<%
87final SessionControl sc = Base.getExistingSessionControl(pageContext, true);
88final String ID = sc.getId();
89final ItemContext cc = Base.getAndSetCurrentContext(sc, itemType, null, null);
90final int itemId = cc.getId();
91final String tab = Values.getString(request.getParameter("tab"), "properties");
92final float scale = Base.getScale(sc);
93final DbControl dc = sc.newDbControl();
94try
95{
96  Formatter<Date> dateFormatter = FormatterFactory.getDateFormatter(sc);
97  Map<Plugin.MainType, Integer> pluginCount = PluginDefinition.countPlugins(dc, guiContext);
98
99  WellCoordinateFormatter rowFormatter = new WellCoordinateFormatter(true);
100  WellCoordinateFormatter columnFormatter = new WellCoordinateFormatter(false);
101 
102  String title = null;
103  Sample sample = Sample.getById(dc, itemId);
104  BioMaterialEvent creationEvent = sample.getCreationEvent();
105 
106  final boolean usePermission = sample.hasPermission(Permission.USE);
107  final boolean writePermission = sample.hasPermission(Permission.WRITE);
108  final boolean deletePermission = sample.hasPermission(Permission.DELETE);
109  final boolean sharePermission = sample.hasPermission(Permission.SET_PERMISSION);
110  final boolean setOwnerPermission = sample.hasPermission(Permission.SET_OWNER);
111  final boolean isRemoved = sample.isRemoved();
112  final boolean isUsed = isRemoved && sample.isUsed();
113  final boolean deletePermanentlyPermission = deletePermission && !isUsed;
114  final boolean isOwner = sample.isOwner();
115  JspContext jspContext = ExtensionsControl.createContext(dc, pageContext, guiContext, sample);
116  ExtensionsInvoker invoker = ToolbarUtil.useExtensions(jspContext);
117  %>
118  <base:page title="<%=title%>">
119  <base:head scripts="table.js,tabcontrol.js" styles="table.css,toolbar.css,headertabcontrol.css,path.css">
120    <ext:scripts context="<%=jspContext%>" />
121    <ext:stylesheets context="<%=jspContext%>" />
122    <script language="JavaScript">
123    function editItem()
124    {
125      Main.viewOrEditItem('<%=ID%>', '<%=itemType.name()%>', <%=itemId%>, true);
126    }
127    function shareItem()
128    {
129      Main.openPopup('index.jsp?ID=<%=ID%>&cmd=ShareItem&item_id=<%=itemId%>', 'ShareSample', 600, 400);
130    }
131    function newExtract()
132    {
133      Main.viewOrEditItem('<%=ID%>', 'EXTRACT', 0, true, '&sample_id=<%=itemId%>');
134    }
135    function newSample()
136    {
137      Main.viewOrEditItem('<%=ID%>', 'SAMPLE', 0, true, '&sample_id=<%=itemId%>');
138    }
139    function deleteItem()
140    {
141      location.replace('index.jsp?ID=<%=ID%>&cmd=DeleteItem&item_id=<%=itemId%>');
142    }
143    function restoreItem()
144    {
145      location.replace('index.jsp?ID=<%=ID%>&cmd=RestoreItem&item_id=<%=itemId%>');
146    }
147    function deleteItemPermanently()
148    {
149      Main.deleteItemPermanently('<%=ID%>', true, '<%=itemType.name()%>', <%=itemId%>, '&callback=itemDeleted');
150    }
151    function itemDeleted()
152    {
153      Main.listItems('<%=ID%>', '<%=itemType.name()%>');
154    }
155    function showUsingItems()
156    {
157      Main.showUsingItems('<%=ID%>', '<%=itemType.name()%>', <%=itemId%>);
158    }
159    function setOwner()
160    {
161      Main.openPopup('index.jsp?ID=<%=ID%>&cmd=SetOwnerOfItem&item_id=<%=itemId%>', 'SetOwnerOfItem', 450, 300);
162    }
163    function runPlugin(cmd)
164    {
165      Main.openPopup('index.jsp?ID=<%=ID%>&cmd='+cmd+'&item_id=<%=itemId%>', 'RunPlugin'+cmd, 750, 500);
166    }
167    function viewEvents()
168    {
169      location.href = '../events/index.jsp?ID=<%=ID%>&cmd=List&biomaterial_id=<%=itemId%>&biomaterial_type=<%=itemType.name()%>';
170    }
171    function switchTab(tabControlId, tabId)
172    {
173      if (TabControl.isActive(tabControlId, tabId)) return;
174      if ((tabId == 'overview' || tabId == 'history') && tabId != '<%=tab%>')
175      {
176        location.href = 'index.jsp?ID=<%=ID%>&cmd=ViewItem&item_id=<%=itemId%>&tab='+tabId;
177      }
178      else if (tabId == 'events')
179      {
180        viewEvents();
181      }
182      else
183      {
184        TabControl.setActiveTab(tabControlId, tabId);
185      }
186    }
187    </script>
188  </base:head>
189  <base:body>
190    <p:path><p:pathelement 
191      title="Samples" href="<%="index.jsp?ID="+ID%>" /><p:pathelement 
192      title="<%=HTML.encodeTags(sample.getName())%>" /></p:path>
193   
194    <t:tabcontrol id="main" 
195      subclass="content mastertabcontrol"
196      active="<%=tab%>" switch="switchTab" remember="false">
197    <t:tab id="properties" title="Properties">
198
199      <div>
200      <table class="fullform bottomborder">
201      <tr>
202        <th class="itemstatus">
203          <base:icon 
204            image="shared.gif" 
205            visible="<%=sample.isShared()%>"
206            tooltip="This item is shared to other users, groups and/or projects"
207          />
208          <base:icon 
209            image="deleted.gif"
210            onclick="deleteItemPermanently()"
211            tooltip="This item has been flagged for deletion. Click to delete it now."
212            enabled="<%=deletePermanentlyPermission %>"
213            visible="<%=isRemoved%>" 
214          />
215          <base:icon image="used.gif" 
216            onclick="showUsingItems()"
217            tooltip="This item is used by other items and can't be permanently deleted. Show the items that are using this one"
218            visible="<%=isRemoved && isUsed%>" />
219        </th>
220        <td style="padding: 0px;">
221
222        <tbl:toolbar subclass="bottomborder">
223          <tbl:button 
224            disabled="<%=writePermission ? false : true%>" 
225            image="edit.gif" 
226            onclick="editItem()" 
227            title="Edit&hellip;" 
228            tooltip="<%=writePermission ? "Edit this sample" : "You do not have permission to edit this sample"%>" 
229          />
230          <tbl:button 
231            disabled="<%=deletePermission ? false : true%>" 
232            image="delete.gif" 
233            onclick="deleteItem()" 
234            title="Delete"
235            visible="<%=!sample.isRemoved()%>"
236            tooltip="<%=deletePermission ? "Delete this sample" : "You do not have permission to delete this sample"%>" 
237          />
238          <tbl:button 
239            disabled="<%=writePermission ? false : true%>" 
240            image="restore.gif" 
241            onclick="restoreItem()" 
242            title="Restore"
243            visible="<%=sample.isRemoved()%>"
244            tooltip="<%=writePermission ? "Restore this sample" : "You do not have permission to restore this sample"%>" 
245          />
246          <tbl:button 
247            disabled="<%=sharePermission ? false : true%>"
248            image="share.gif"
249            onclick="shareItem()" 
250            title="Share&hellip;" 
251            tooltip="<%=sharePermission ? "Share this sample to other user, groups and projects" : "You do not have permission to share this sample"%>"
252          />
253          <tbl:button 
254            disabled="<%=setOwnerPermission ? false : true%>"
255            image="take_ownership.png"
256            onclick="setOwner()" 
257            title="Set owner&hellip;"
258            tooltip="<%=setOwnerPermission ? "Change owner of this item" : "You do not have permission to change ownership of this item"%>"
259          />
260          <tbl:button
261            image="add.png"
262            onclick="newSample()"
263            title="New child sample&hellip;"
264            tooltip="Create a new child sample from this sample"
265            visible="<%=sc.hasPermission(Permission.CREATE, Item.SAMPLE) && usePermission%>"
266          />
267          <tbl:button
268            image="add.png"
269            onclick="newExtract()"
270            title="New child extract&hellip;"
271            tooltip="Create a new extract from this sample"
272            visible="<%=sc.hasPermission(Permission.CREATE, Item.EXTRACT) && usePermission%>"
273          />
274          <tbl:button 
275            image="import.gif" 
276            onclick="runPlugin('ImportItem')" 
277            title="Import&hellip;" 
278            tooltip="Import data" 
279            visible="<%=pluginCount.containsKey(Plugin.MainType.IMPORT)%>"
280          />
281          <tbl:button 
282            image="export.gif" 
283            onclick="runPlugin('ExportItem')" 
284            title="Export&hellip;" 
285            tooltip="Export data" 
286            visible="<%=pluginCount.containsKey(Plugin.MainType.EXPORT)%>"
287          />
288          <tbl:button 
289            image="runplugin.gif" 
290            onclick="runPlugin('RunPlugin')" 
291            title="Run plugin&hellip;" 
292            tooltip="Run a plugin" 
293            visible="<%=pluginCount.containsKey(Plugin.MainType.OTHER)%>"
294          /> 
295          <ext:render extensions="<%=invoker%>" context="<%=jspContext%>" 
296            wrapper="<%=new PrefixSuffixRenderer(jspContext, "<td>", "</td>") %>"/>
297          <tbl:button
298            image="help.png"
299            onclick="<%="Main.openHelp('" + ID +"', 'sample.view.properties')"%>"
300            title="Help&hellip;"
301            tooltip="Get help about this page"
302          />   
303          </tbl:toolbar>
304        </td>
305      </tr>
306      <tr>
307        <th>Name</th>
308        <td><%=HTML.encodeTags(sample.getName())%></td>
309      </tr>
310      <tr>
311        <th>Type</th>
312        <td><base:propertyvalue item="<%=sample%>" property="itemSubtype" /></td>
313      </tr>
314      <tr>
315        <th>External ID</th>
316        <td><%=HTML.encodeTags(sample.getExternalId())%></td>
317      </tr>
318      <tr>
319        <th>Created</th>
320        <td><%=dateFormatter.format(creationEvent.getEventDate())%></td>
321      </tr>
322      <tr>
323        <th>Registered</th>
324        <td><%=dateFormatter.format(creationEvent.getEntryDate())%></td>
325      </tr>
326      <tr>
327        <th>Protocol</th>
328        <td><base:propertyvalue item="<%=creationEvent%>" property="protocol" /></td>
329      </tr>
330      <tr>
331        <th>Original quantity</th>
332        <td><%=Values.formatNumber(sample.getOriginalQuantity(), 2, " µg")%></td>
333      </tr>
334      <tr>
335        <th class="subprompt">- remaining</th>
336        <td><%=Values.formatNumber(sample.getRemainingQuantity(), 2, " µg")%></td>
337      </tr>
338      <tr>
339        <th>Bioplate</th>
340        <td>
341          <base:propertyvalue item="<%=sample%>" property="bioWell.bioPlate" />
342          <%
343          try
344          {
345            BioWell well = sample.getBioWell();
346            if (well != null)
347            {
348              %>
349              [<%=rowFormatter.format(well.getRow())%><%=columnFormatter.format(well.getColumn())%>]
350              <base:icon image="locked.gif"  visible="<%=sample.isLockedInWell()%>"/>
351            <%
352            }
353          }
354          catch (PermissionDeniedException ex)
355          {}
356          %>
357        </td>
358      </tr>
359      <tr>
360        <th>Owner</th>
361        <td><base:propertyvalue item="<%=sample%>" property="owner" /></td>
362      </tr>
363      <tr>
364        <th>Permissions</th>
365        <td><%=PermissionUtil.getFullPermissionNames(sample)%></td>
366      </tr>
367      <tr>
368        <th>Description</th>
369        <td><%=HTML.niceFormat(sample.getDescription())%></td>
370      </tr>
371      </table>
372      </div>
373     
374      <%
375      SpecialQuery<BioMaterialEventSource> sourceQuery = creationEvent.getEventSources();
376      sourceQuery.order(Orders.asc(Hql.property("bioMaterial.name")));
377      ResultList<BioMaterialEventSource> sources = sourceQuery.list(dc);
378      %>
379      <base:section 
380        id="parentsSection" 
381        title="<%="Parent items (" + sources.size() + ")"%>"
382        context="<%=cc%>"
383        >
384        <%
385        if (sources.size() == 0)
386        {
387          %>
388          <div class="messagecontainer note">
389          This sample doesn't have any parent items
390          (or, you don't have permission to view them).
391          </div>
392          <%
393        }
394        else
395        {
396          %>
397          <tbl:table
398            id="parents"
399           
400            columns="all"
401          >
402          <tbl:columndef 
403            id="name"
404            title="Name"
405          />
406          <tbl:columndef 
407            id="type"
408            title="Type"
409          />
410          <tbl:columndef 
411            id="quantity"
412            title="Used quantity (µg)"
413          />
414          <tbl:columndef 
415            id="description"
416            title="Description"
417          />
418          <tbl:data>
419            <tbl:headers>
420              <tbl:headerrow>
421                <tbl:columnheaders />
422              </tbl:headerrow>
423            </tbl:headers>
424            <tbl:rows>
425            <%
426            for (BioMaterialEventSource item : sources)
427            {
428              BioMaterial bm = null;
429              try
430              {
431                bm = item.getBioMaterial();
432              }
433              catch (PermissionDeniedException ex)
434              {}
435              %>
436              <tbl:row>
437                <tbl:cell column="name"><base:icon 
438                    image="deleted.gif" 
439                    tooltip="This item has been scheduled for deletion" 
440                    visible="<%=bm != null && bm.isRemoved()%>"
441                  /><%=Base.getLinkedName(ID, bm, bm == null, true)%></tbl:cell>
442                <tbl:cell column="type"><%=bm != null ? bm.getType() : "" %></tbl:cell>
443                <tbl:cell column="quantity"><%=Values.formatNumber(item.getUsedQuantity(), 2)%></tbl:cell>
444                <tbl:cell column="description"><%=HTML.encodeTags(bm == null ? "" : bm.getDescription())%></tbl:cell>
445              </tbl:row>
446              <%
447            }
448            %>
449            </tbl:rows>
450          </tbl:data>
451          </tbl:table>
452          <%
453        }
454        %>
455      </base:section>
456      <%
457      SpecialQuery<BioMaterialEventSource> childQuery = sample.getChildCreationEvents();
458      childQuery.join(Hql.innerJoin("es", "event", "evt", true));
459      childQuery.join(Hql.innerJoin("evt", "bioMaterial", "bm", true));
460      childQuery.order(Orders.asc(Hql.property("bm", "name")));
461      ResultList<BioMaterialEventSource> children = childQuery.list(dc);
462      %>
463      <base:section 
464        id="childSection" 
465        title="<%="Child items (" + children.size() + ")"%>"
466        context="<%=cc%>"
467        >
468        <%
469        if (children.size() == 0)
470        {
471          %>
472          <div class="messagecontainer help">
473          No child items have been created from this sample
474          (or, you don't have permission to view them).
475          </div>
476          <%
477        }
478        else
479        {
480          %>
481          <tbl:table 
482            id="children"
483           
484            columns="all"
485            >
486            <tbl:columndef 
487              id="name"
488              title="Name"
489            />
490            <tbl:columndef 
491              id="type"
492              title="Type"
493            />
494            <tbl:columndef 
495              id="quantity"
496              title="Used quantity (µg)"
497            />
498            <tbl:columndef 
499              id="description"
500              title="Description"
501            />
502            <tbl:data>
503              <tbl:headers>
504                <tbl:headerrow>
505                  <tbl:columnheaders />
506                </tbl:headerrow>
507              </tbl:headers>
508              <tbl:rows>
509              <%
510              for (BioMaterialEventSource item : children)
511              {
512                BioMaterial bm = null;
513                try
514                {
515                  bm = item.getEvent().getBioMaterial();
516                }
517                catch (PermissionDeniedException ex)
518                {}
519                %>
520                <tbl:row>
521                  <tbl:cell column="name"><base:icon 
522                      image="deleted.gif" 
523                      tooltip="This item has been scheduled for deletion" 
524                      visible="<%=bm != null && bm.isRemoved()%>"
525                    /><%=Base.getLinkedName(ID, bm, bm == null, true)%></tbl:cell>
526                  <tbl:cell column="type"><%=bm != null ? bm.getType() : "" %></tbl:cell>
527                  <tbl:cell column="quantity"><%=Values.formatNumber(item.getUsedQuantity(), 2)%></tbl:cell>
528                  <tbl:cell column="description"><%=HTML.encodeTags(bm == null ? "" : bm.getDescription())%></tbl:cell>
529                </tbl:row>
530                <%
531              }
532              %>           
533              </tbl:rows>
534            </tbl:data>
535          </tbl:table>
536          <%
537        }
538        %>
539      </base:section>
540     
541      <jsp:include page="../../common/anytoany/list_anytoany.jsp">
542        <jsp:param name="ID" value="<%=ID%>" />
543        <jsp:param name="item_type" value="<%=itemType.name()%>" />
544        <jsp:param name="item_id" value="<%=itemId%>" />
545        <jsp:param name="title" value="Other items related to this sample" />
546      </jsp:include>
547     
548      <jsp:include page="../../common/share/list_share.jsp">
549        <jsp:param name="ID" value="<%=ID%>" />
550        <jsp:param name="item_type" value="<%=itemType.name()%>" />
551        <jsp:param name="item_id" value="<%=itemId%>" />
552        <jsp:param name="title" value="Shared to" />
553      </jsp:include>
554      </t:tab>
555     
556      <t:tab id="annotations" title="Annotations &amp; parameters" 
557        tooltip="View annotation values and protocol parameters" clazz="white">
558        <jsp:include page="../../common/annotations/list_annotations.jsp">
559          <jsp:param name="item_type" value="<%=itemType.name()%>" />
560          <jsp:param name="item_id" value="<%=itemId%>" />
561          <jsp:param name="ID" value="<%=ID%>" />
562        </jsp:include>
563      </t:tab>
564      <t:tab id="events" title="Events" />
565      <t:tab id="overview" title="Overview" 
566        tooltip="Display a tree overview of related items">
567        <%
568        if ("overview".equals(tab))
569        {
570          %>
571          <jsp:include page="../../common/overview/overview.jsp">
572            <jsp:param name="item_type" value="<%=itemType.name()%>" />
573            <jsp:param name="item_id" value="<%=itemId%>" />
574            <jsp:param name="ID" value="<%=ID%>" />
575          </jsp:include>
576          <%
577        }
578        %>
579      </t:tab>     
580      <t:tab id="history" title="Change history" 
581        tooltip="Displays a log of all modifications made to this item"
582        visible="<%=ChangeHistoryUtil.showChangeHistoryTab(sc)%>">
583        <%
584        if ("history".equals(tab))
585        {
586          %>
587          <jsp:include page="../../common/history/frameset.jsp">
588            <jsp:param name="source_type" value="<%=itemType.name()%>" />
589            <jsp:param name="source_id" value="<%=itemId%>" />
590            <jsp:param name="ID" value="<%=ID%>" />
591          </jsp:include>
592          <%
593        }
594        %>
595      </t:tab>     
596      </t:tabcontrol>
597
598  </base:body>
599  </base:page>
600  <%
601}
602finally
603{
604  if (dc != null) dc.close();
605}
606
607%>
Note: See TracBrowser for help on using the repository browser.