source: branches/3.2-stable/www/biomaterials/events/list_events.jsp @ 6251

Last change on this file since 6251 was 6251, checked in by Nicklas Nordborg, 9 years ago

Fixes #1746: The original and remaining quantity values are always displayed with 2 decimals

Needed to fix in a lot more places than I thought. Hope I have found all of them...

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