source: trunk/www/views/itemlists/view_list.jsp @ 7889

Last change on this file since 7889 was 7889, checked in by Nicklas Nordborg, 12 months ago

Merge 3.17-dev-1 to the trunk

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