source: branches/3.13-stable/www/views/itemlists/view_list.jsp @ 7546

Last change on this file since 7546 was 7546, checked in by Nicklas Nordborg, 3 years ago

Fixes #2133: Formatting of sync filter

File size: 22.2 KB
Line 
1<%-- $Id$
2  ------------------------------------------------------------------
3  Copyright (C) 2015 Nicklas Nordborg
4
5  This file is part of BASE - BioArray Software Environment.
6  Available at http://base.thep.lu.se/
7
8  BASE is free software; you can redistribute it and/or
9  modify it under the terms of the GNU General Public License
10  as published by the Free Software Foundation; either version 3
11  of the License, or (at your option) any later version.
12
13  BASE is distributed in the hope that it will be useful,
14  but WITHOUT ANY WARRANTY; without even the implied warranty of
15  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16  GNU General Public License for more details.
17
18  You should have received a copy of the GNU General Public License
19  along with BASE. If not, see <http://www.gnu.org/licenses/>.
20  ------------------------------------------------------------------
21
22  @author Nicklas
23--%>
24<%@ page pageEncoding="UTF-8" session="false"
25  import="net.sf.basedb.core.SessionControl"
26  import="net.sf.basedb.core.DbControl"
27  import="net.sf.basedb.core.SystemItems"
28  import="net.sf.basedb.core.Group"
29  import="net.sf.basedb.core.Include"
30  import="net.sf.basedb.core.Item"
31  import="net.sf.basedb.core.ItemContext"
32  import="net.sf.basedb.core.RawDataType"
33  import="net.sf.basedb.core.ItemQuery"
34  import="net.sf.basedb.core.ItemResultList"
35  import="net.sf.basedb.core.Permission"
36  import="net.sf.basedb.core.ItemList"
37  import="net.sf.basedb.core.SyncFilter"
38  import="net.sf.basedb.core.SyncFilter.SourceItemTransform"
39  import="net.sf.basedb.core.PropertyFilter"
40  import="net.sf.basedb.core.MultiPermissions"
41  import="net.sf.basedb.core.User"
42  import="net.sf.basedb.core.PermissionDeniedException"
43  import="net.sf.basedb.core.PluginDefinition"
44  import="net.sf.basedb.core.plugin.GuiContext"
45  import="net.sf.basedb.core.plugin.Plugin"
46  import="net.sf.basedb.core.Project"
47  import="net.sf.basedb.core.query.Orders"
48  import="net.sf.basedb.core.query.Hql"
49  import="net.sf.basedb.clients.web.Base"
50  import="net.sf.basedb.clients.web.ChangeHistoryUtil"
51  import="net.sf.basedb.clients.web.PermissionUtil"
52  import="net.sf.basedb.clients.web.util.HTML"
53  import="net.sf.basedb.util.Values"
54  import="net.sf.basedb.util.formatter.Formatter"
55  import="net.sf.basedb.util.formatter.PropertyFilterFormatter"
56  import="net.sf.basedb.clients.web.formatter.FormatterFactory"
57  import="net.sf.basedb.clients.web.extensions.ExtensionsControl"
58  import="net.sf.basedb.clients.web.extensions.JspContext"
59  import="net.sf.basedb.clients.web.extensions.renderer.PrefixSuffixRenderer"
60  import="net.sf.basedb.clients.web.extensions.toolbar.ToolbarUtil"
61  import="net.sf.basedb.util.extensions.ExtensionsInvoker"
62  import="java.util.Collections"
63  import="java.util.Collection"
64  import="java.util.Map"
65  import="java.util.Set"
66  import="java.util.List"
67  import="java.util.ArrayList"
68  import="java.util.Date"
69%>
70<%@ taglib prefix="base" uri="/WEB-INF/base.tld" %>
71<%@ taglib prefix="tbl" uri="/WEB-INF/table.tld" %>
72<%@ taglib prefix="t" uri="/WEB-INF/tab.tld" %>
73<%@ taglib prefix="p" uri="/WEB-INF/path.tld" %>
74<%@ taglib prefix="ext" uri="/WEB-INF/extensions.tld" %>
75<%!
76  private static final Item itemType = Item.ITEMLIST;
77  private static final GuiContext guiContext = new GuiContext(itemType, GuiContext.Type.ITEM);
78%>
79<%
80final SessionControl sc = Base.getExistingSessionControl(pageContext, true);
81final String ID = sc.getId();
82final ItemContext cc = Base.getAndSetCurrentContext(sc, itemType, null, null);
83final int itemId = cc.getId();
84final String tab = Values.getStringOrNull(request.getParameter("tab"));
85final float scale = Base.getScale(sc);
86final DbControl dc = sc.newDbControl();
87try
88{
89  Map<Plugin.MainType, Integer> pluginCount = PluginDefinition.countPlugins(dc, guiContext);
90
91  String title = null;
92  ItemList list = ItemList.getById(dc, itemId);
93  boolean listIsInSync = true;
94 
95  final boolean createPermission = sc.hasPermission(Permission.CREATE, itemType);
96  final boolean writePermission = list.hasPermission(Permission.WRITE);
97  final boolean deletePermission = list.hasPermission(Permission.DELETE);
98  final boolean sharePermission = list.hasPermission(Permission.SET_PERMISSION);
99  final boolean usePermission = list.hasPermission(Permission.USE);
100  final boolean setOwnerPermission = list.hasPermission(Permission.SET_OWNER);
101  final boolean isRemoved = list.isRemoved();
102  final boolean isUsed = isRemoved && list.isUsed();
103  final boolean deletePermanentlyPermission = deletePermission && !isUsed;
104  final boolean isOwner = list.isOwner();
105  Formatter<Date> timeFormatter = FormatterFactory.getDateTimeFormatter(sc);
106  Formatter<Date> dateFormatter = FormatterFactory.getDateFormatter(sc);
107  JspContext jspContext = ExtensionsControl.createContext(dc, pageContext, guiContext, list);
108  ExtensionsInvoker invoker = ToolbarUtil.useExtensions(jspContext);
109 
110  ItemQuery<SyncFilter> sfQuery = list.getSyncFilters();
111  List<SyncFilter> syncFilters = new ArrayList<SyncFilter>(sfQuery.list(dc));
112  Collections.sort(syncFilters, SyncFilter.compareByChainOrder());
113  %>
114  <base:page title="<%=title%>" id="view-page">
115  <base:head scripts="table.js,tabcontrol-2.js,~lists.js" styles="table.css,toolbar.css,headertabcontrol.css,path.css,~syncfilter/filtertext.css">
116    <ext:scripts context="<%=jspContext%>" />
117    <ext:stylesheets context="<%=jspContext%>" />
118    <style>
119    .not-in-sync
120    {
121      text-decoration: line-through;
122      display: inline-block;
123    }
124    </style>
125  </base:head>
126  <base:body>
127    <p:path><p:pathelement 
128      title="Item lists" href="<%="index.jsp?ID="+ID%>" 
129      /><p:pathelement title="<%=HTML.encodeTags(list.getName())%>"
130      /></p:path>
131    <div id="page-data" data-item-id="<%=itemId%>"></div>
132   
133    <t:tabcontrol 
134      id="main" 
135      subclass="content mastertabcontrol"
136      active="<%=tab%>">
137    <t:tab id="properties" title="Properties">
138      <div>
139      <table class="fullform bottomborder">
140      <tr>
141        <th class="itemstatus">
142          <base:icon 
143            image="shared.png" 
144            visible="<%=list.isShared()%>"
145            tooltip="This item is shared to other users, groups and/or projects"
146          />
147          <base:icon 
148            id="btnDeletePermanently"
149            image="deleted.png"
150            tooltip="This item has been flagged for deletion. Click to delete it now."
151            enabled="<%=deletePermanentlyPermission %>"
152            visible="<%=isRemoved%>" 
153          />
154          <base:icon 
155            id="btnUsingItems"
156            image="used.png" 
157            tooltip="This item is used by other items and can't be permanently deleted. Show the items that are using this one"
158            visible="<%=isRemoved && isUsed%>" />
159        </th>
160        <td style="padding: 0px;">
161          <tbl:toolbar subclass="bottomborder bg-filled-50">
162            <tbl:button 
163              id="btnEdit"
164              disabled="<%=!writePermission%>" 
165              image="edit.png" 
166              title="Edit&hellip;" 
167              tooltip="<%=writePermission ? "Edit this list" : "You do not have permission to edit this list"%>" 
168            />
169            <tbl:button 
170              id="btnDelete"
171              disabled="<%=!deletePermission%>" 
172              image="delete.png" 
173              title="Delete"
174              visible="<%=!list.isRemoved()%>"
175              tooltip="<%=deletePermission ? "Delete this list" : "You do not have permission to delete this list"%>" 
176            />
177            <tbl:button 
178              id="btnRestore"
179              disabled="<%=!writePermission%>" 
180              image="restore.png" 
181              title="Restore"
182              visible="<%=list.isRemoved()%>"
183              tooltip="<%=writePermission ? "Restore this list" : "You do not have permission to restore this list"%>" 
184            />
185            <tbl:button 
186              id="btnShare"
187              disabled="<%=!sharePermission%>"
188              image="share.png"
189              title="Share&hellip;" 
190              tooltip="<%=sharePermission ? "Share this list to other user, groups and projects" : "You do not have permission to share this list"%>"
191            />
192            <tbl:button 
193              id="btnSetOwner"
194              disabled="<%=!setOwnerPermission%>"
195              image="take_ownership.png"
196              title="Set owner&hellip;"
197              tooltip="<%=setOwnerPermission ? "Change owner of this item" : "You do not have permission to change ownership of this item"%>"
198            />
199            <tbl:button
200              id="btnCopy"
201              image="copy.png"
202              tooltip="Create a new list using this as a template"
203              subclass="auto-init"
204              data-auto-init="clone"
205              data-item-id="<%=itemId %>"
206              visible="<%=createPermission%>"
207              title="Copy&hellip;"
208            />
209            <tbl:button
210              id="btnMergeUnion"
211              data-merge-type="union"
212              visible="<%=writePermission && !list.getDisableManualMembers()%>"
213              image="set_operations/union_small.png"
214              title="Union&hellip;"
215              tooltip="Add items from other lists to this list"
216            />
217            <tbl:button
218              id="btnMergeIntersection"
219              data-merge-type="intersection"
220              visible="<%=writePermission && !list.getDisableManualMembers()%>"
221              image="set_operations/intersection_small.png"
222              title="Intersection&hellip;"
223              tooltip="Keep only items that are present in other lists"
224            />
225            <tbl:button
226              id="btnMergeComplement"
227              data-merge-type="complement"
228              visible="<%=writePermission && !list.getDisableManualMembers()%>"
229              image="set_operations/complement_small.png"
230              title="Complement&hellip;"
231              tooltip="Remove items found in other lists from this list"
232            />
233            <tbl:button 
234              id="btnImport"
235              image="import.png" 
236              data-plugin-type="IMPORT" 
237              title="Import&hellip;" 
238              tooltip="Import data" 
239              visible="<%=pluginCount.containsKey(Plugin.MainType.IMPORT)%>"
240            />
241            <tbl:button 
242              id="btnExport"
243              image="export.png"
244              data-plugin-type="EXPORT" 
245              title="Export&hellip;" 
246              tooltip="Export data" 
247              visible="<%=pluginCount.containsKey(Plugin.MainType.EXPORT)%>"
248            />
249            <tbl:button 
250              id="btnRunPlugin"
251              image="runplugin.png" 
252              data-plugin-type="OTHER" 
253              title="Run plugin&hellip;" 
254              tooltip="Run a plugin" 
255              visible="<%=pluginCount.containsKey(Plugin.MainType.OTHER)%>"
256            />
257            <ext:render extensions="<%=invoker%>" context="<%=jspContext%>" 
258              wrapper="<%=new PrefixSuffixRenderer(jspContext, "<td>", "</td>") %>"/>
259            <tbl:button
260              image="help.png"
261              subclass="auto-init"
262              data-auto-init="help"
263              data-help-id="itemlist.view.properties"
264              title="Help&hellip;"
265              tooltip="Get help about this page"
266            /> 
267          </tbl:toolbar>
268        </td>
269      </tr>
270      <tr>
271        <th>Name</th>
272        <td><%=HTML.encodeTags(list.getName())%></td>
273      </tr>
274      <tr>
275        <th>Member type</th>
276        <td><%=list.getMemberType()%>
277          <%
278          if (list.getMemberType() != Item.RAWBIOASSAY)
279          {
280            %>
281            (<base:propertyvalue item="<%=list%>" property="itemSubtype" nulltext="<i>any</i>"/>)
282            <%
283          }
284          else
285          {
286            RawDataType rdt = list.getRawDataType();
287            %>
288            (<%=rdt != null ? HTML.encodeTags(rdt.getName()) : "<i>any</i>"%>)
289            <%
290          }
291          %>
292        </td>
293      </tr>
294      <tr>
295        <th>Size</th>
296        <td><%=list.getSize()%></td>
297      </tr>
298      <tr>
299        <th>Modify members</th>
300        <td></td>
301      </tr>
302      <tr>
303        <th class="subprompt">Manual</th>
304        <td><%=list.getDisableManualMembers() ? "Disabled" : "Allowed" %></td>
305      </tr>
306      <tr>
307        <th class="subprompt">Sync filters</th>
308        <td><%=list.getDisableSyncFilters() ? "Disabled" : "Allowed" %></td>
309      </tr>
310      <tr>
311        <th>Last sync</th>
312        <td>
313          <%=list.getSyncDate() == null ? "<i>never</i>" : timeFormatter.format(list.getSyncDate())%>
314          <span id="not-insync-warning" style="display: none;">
315            <i><base:icon image="warning.png" /> List appears to be out of sync with filters</i>
316          </span>
317          <span id="insync-info" style="display: none;">
318            <i><base:icon image="ok.png" /> List appears to be in sync with filters</i>
319          </span>
320        </td>
321      </tr>
322      <tr>
323        <th>External ID</th>
324        <td><%=HTML.encodeTags(list.getExternalId())%></td>
325      </tr>
326      <tr>
327        <th>Owner</th>
328        <td><base:propertyvalue item="<%=list%>" property="owner"/></td>
329      </tr>
330      <tr>
331        <th>Permissions</th>
332        <td><%=PermissionUtil.getFullPermissionNames(list)%></td>
333      </tr>
334      <tr>
335        <th>Description</th>
336        <td><%=HTML.niceFormat(list.getDescription())%></td>
337      </tr>
338      </table>
339      </div>
340     
341      <base:section 
342        id="syncFilters" 
343        title="<%="Synchronization filters (" + syncFilters.size() +")"%>"
344        context="<%=cc%>"
345        >
346        <tbl:table
347          id="tbl.syncFilters"
348          columns="all"
349          item="SYNCFILTER"
350          action="syncfilter/index.jsp"
351          >
352          <tbl:hidden name="list_id" value="<%=Integer.toString(itemId) %>" />
353          <tbl:columndef 
354            id="name"
355            title="Name"
356          />
357          <tbl:columndef
358            id="inSync"
359            title="In sync/enabled"
360          />
361          <tbl:columndef 
362            id="sourceItems"
363            title="List members"
364          />
365          <tbl:columndef 
366            id="filter"
367            title="Filter"
368          />
369          <tbl:columndef 
370            id="matching"
371            title="Matching items"
372          />
373          <tbl:columndef 
374            id="description"
375            title="Description"
376          />
377          <tbl:toolbar subclass="topborder leftborder rightborder bg-filled-50">
378            <tbl:button
379              id="btnResync"
380              image="resync.png"
381              disabled="<%=!writePermission || syncFilters.size() == 0 || list.getDisableSyncFilters() %>"
382              tooltip="Re-sync the list with all enabled filters" 
383              title="Re-sync&hellip;"
384            />
385            <tbl:button 
386              id="btnAddSyncFilter"
387              image="add.png" 
388              disabled="<%=!writePermission%>"
389              tooltip="<%=writePermission ? "Add new filter" : "You do not have permission to modify the filters"%>" 
390              data-extra-url="<%="&list_id="+itemId%>"
391              data-item-type="SYNCFILTER"
392              title="Add filter&hellip;"
393            />
394            <tbl:button
395              id="btnRemoveSyncFilter"
396              image="delete_permanently.png"
397              disabled="<%=!writePermission%>"
398              tooltip="<%=writePermission ? "Remove the selected filters" : "You do not have permission to modify the filters"%>" 
399              title="Remove&hellip;"
400            />
401            <tbl:button
402              id="btnEnable"
403              image="start.png"
404              disabled="<%=!writePermission%>"
405              tooltip="<%=writePermission ? "Enable the selected filters" : "You do not have permission to modify the filters"%>" 
406              title="Enable"
407            />
408            <tbl:button
409              id="btnDisable"
410              image="pause.png"
411              disabled="<%=!writePermission%>"
412              tooltip="<%=writePermission ? "Disable the selected filters" : "You do not have permission to modify the filters"%>" 
413              title="Disable"
414            />
415          </tbl:toolbar>
416          <tbl:data>
417            <tbl:headers style="<%=syncFilters.size() == 0 ? "display: none;" : "" %>">
418              <tbl:headerrow>
419              <tbl:header subclass="index" />
420              <tbl:header 
421                subclass="check"
422                ><base:icon 
423                  subclass="link table-check"
424                  image="check_uncheck.png" 
425                  tooltip="Toggle all (use CTRL, ALT or SHIFT to check/uncheck)" 
426                /></tbl:header>
427                <tbl:columnheaders />
428              </tbl:headerrow>
429            </tbl:headers>
430            <tbl:rows>
431            <%
432            int index = 0;
433            Formatter<PropertyFilter> filterFormatter = new PropertyFilterFormatter(dc, dateFormatter, true);
434            for (SyncFilter sf : syncFilters)
435            {
436              index++;
437              String name = HTML.encodeTags(sf.getName());
438              int filterId = sf.getId();
439              SourceItemTransform transform = sf.getSourceItemTransformation();
440             
441              StringBuilder sb = new StringBuilder();
442              for (int filterRow = 0; filterRow < sf.getFilterRows(); filterRow++)
443              {
444                sb.append(filterRow > 0 ? "\n<operator>OR</operator> " : "");
445                List<String> filters = SyncFilter.getFormattedAndSortedFilters(sf.getPropertyFilters(filterRow), filterFormatter);
446                sb.append(Values.getString(filters, "\n   <operator>AND</operator> ", true));
447              }
448              boolean disabled = sf.isDisabled();
449              boolean inSync = !disabled && sf.isInSync(dc);
450              if (!disabled) listIsInSync &= inSync;
451              int lastSyncMatchingSource = sf.getLastSyncMatchingSource();
452              int lastSyncMatchingTransformed = sf.getLastSyncMatchingTransformed();
453              %>
454              <tbl:row>
455                <tbl:header 
456                  clazz="index"
457                  ><%=index%></tbl:header>
458                <tbl:header 
459                  clazz="check" 
460                  ><input 
461                    type="checkbox" 
462                    name="<%=filterId%>" 
463                    value="<%=filterId%>" 
464                    title="<%=name%>"
465                  ></tbl:header>
466                <tbl:cell column="name"><div
467                  class="<%=writePermission ? "link table-item" : ""%>"
468                  data-item-id="<%=filterId%>"
469                  data-no-edit="<%=writePermission ? 0 : 1 %>" 
470                  data-extra-url="&list_id=<%=itemId%>"
471                  tabindex="0"
472                  title=""><%=name%></div></tbl:cell>
473                <tbl:cell column="sourceItems">
474                  <%
475                  if (transform == SourceItemTransform.NONE)
476                  {
477                    %>
478                    <i><%=sf.getSourceItemType().toString() %></i> must match filter
479                    <%
480                  }
481                  else
482                  {
483                    %>
484                    <%=transform == SourceItemTransform.PARENT_TO_CHILD ? "Parent" : "Child" %>
485                    <i><%=sf.getSourceItemType().toString() %></i>
486                    that matches filter
487                    <i><%=sf.getSourceItemMustExist() ? "must exist" : "must not exist" %></i>
488                    <%
489                  }
490                  %>
491                </tbl:cell>
492                <tbl:cell column="filter">
493                  <base:icon 
494                      subclass="link auto-init"
495                      data-auto-init="sync-filter-view"
496                      data-syncfilter-id="<%=filterId%>" 
497                      data-source-item-type="<%=sf.getSourceItemType().name()%>"
498                      image="table_go.png" 
499                      tooltip="Go to list view with this filter enabled" 
500                      style="float: right; margin-left: 4px;"
501                    />
502                  <%
503                  if (writePermission)
504                  {
505                    %>
506                    <base:icon 
507                      subclass="link auto-init"
508                      data-auto-init="sync-filter-edit"
509                      data-syncfilter-id="<%=filterId%>" 
510                      data-source-item-type="<%=sf.getSourceItemType().name()%>"
511                      image="edit.png" 
512                      tooltip="Modify this filter" 
513                      style="float: right;"
514                    />
515                    <%
516                  }
517                  %>
518                  <pre class="filtertext" id="syncfilter.<%=filterId%>"><%=HTML.encodeTags(sb.toString(), "value|name|operator|function")%></pre></tbl:cell>
519                <tbl:cell column="inSync">
520                  <base:icon 
521                    image="<%=disabled ? "pause.png" : (inSync ? "ok.png" : "warning.png")%>" style="padding-right: 4px;"
522                    subclass="<%=disabled ? "interactable disabled" : "" %>"
523                  /><%=disabled ? "Disabled" : (inSync ? (transform == SourceItemTransform.NONE ? "Yes" : "Yes¹") : "No")%>
524                </tbl:cell>
525                <tbl:cell column="matching">
526                  <span class="<%=!inSync ? "not-in-sync" : "" %>">
527                    <%=lastSyncMatchingSource == -1 ? "?" : lastSyncMatchingSource%>
528                    <span class="itemsubtype">(<%=sf.getSourceItemType() %>)</span>
529                    <%
530                    if (transform != SourceItemTransform.NONE)
531                    {
532                      %>
533                      › <%=lastSyncMatchingTransformed == -1 ? "?" : lastSyncMatchingTransformed%>
534                      <span class="itemsubtype">(<%=list.getMemberType() %>)</span>
535                      <%
536                    }
537                    %>
538                  </span>
539                  <%
540                  if (!inSync && !disabled)
541                  {
542                    %>
543                    (<%=sf.getCurrentMatchingSource(dc)%> › ?)
544                    <%
545                  }
546                  %>
547                </tbl:cell>
548                <tbl:cell column="description"><%=HTML.niceFormat(sf.getDescription())%></tbl:cell>
549              </tbl:row>
550              <%
551            }
552            if (index == 0)
553            {
554              %>
555              <tbl:panel>
556                There are no synchronization filters for this list.
557              </tbl:panel>
558              <%
559            }
560            %>
561            </tbl:rows>
562          </tbl:data>
563        </tbl:table>
564        <%
565        if (syncFilters.size() > 0)
566        {
567          %>
568          ¹ Changes in parent/child relationship are not checked!
569          <%
570        }
571        %>
572        <div id="sync-data" class="datacontainer"
573          data-is-in-sync="<%=listIsInSync ?  1 : 0%>"
574          data-sync-disabled="<%=list.getDisableSyncFilters() ? 1 : 0 %>"
575          data-num-syncfilters="<%=syncFilters.size()%>"
576        ></div>
577      </base:section>
578
579      <jsp:include page="../../common/anytoany/list_anytoany.jsp">
580        <jsp:param name="ID" value="<%=ID%>" />
581        <jsp:param name="item_type" value="<%=itemType.name()%>" />
582        <jsp:param name="item_id" value="<%=itemId%>" />
583        <jsp:param name="title" value="Other items related to this list" />
584      </jsp:include>
585      <jsp:include page="../../common/share/list_share.jsp">
586        <jsp:param name="ID" value="<%=ID%>" />
587        <jsp:param name="item_type" value="<%=itemType.name()%>" />
588        <jsp:param name="item_id" value="<%=itemId%>" />
589        <jsp:param name="title" value="Shared to" />
590      </jsp:include>
591    </t:tab>
592    <t:tab id="annotations" title="Annotations" 
593      tooltip="View annotation values" clazz="white">
594      <jsp:include page="../../common/annotations/list_frameset.jsp">
595        <jsp:param name="item_type" value="<%=itemType.name()%>" />
596        <jsp:param name="item_id" value="<%=itemId%>" />
597        <jsp:param name="ID" value="<%=ID%>" />
598      </jsp:include>
599    </t:tab>
600    <t:tab id="members" title="Members" />
601    <t:tab id="overview" title="Overview" 
602      tooltip="Display a tree overview of related items"
603      visible="<%=list.getMemberType() != Item.FILE%>">
604      <jsp:include page="../../common/overview/overview.jsp">
605        <jsp:param name="item_type" value="<%=itemType.name()%>" />
606        <jsp:param name="item_id" value="<%=itemId%>" />
607        <jsp:param name="ID" value="<%=ID%>" />
608      </jsp:include>
609    </t:tab>     
610    <t:tab id="history" title="History"
611      tooltip="Displays a log with the history of this item"
612      visible="<%=ChangeHistoryUtil.showChangeHistoryTab(sc)%>">
613      <jsp:include page="../../common/history/frameset.jsp">
614        <jsp:param name="item_type" value="<%=itemType.name()%>" />
615        <jsp:param name="item_id" value="<%=itemId%>" />
616        <jsp:param name="ID" value="<%=ID%>" />
617      </jsp:include>
618    </t:tab>     
619    </t:tabcontrol>
620
621  </base:body>
622  </base:page>
623  <%
624}
625finally
626{
627  if (dc != null) dc.close();
628}
629
630%>
Note: See TracBrowser for help on using the repository browser.