source: branches/3.16-stable/www/views/itemlists/view_list.jsp @ 7789

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

Fixes some compilation warnings.

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