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

Last change on this file since 6770 was 6770, checked in by Nicklas Nordborg, 8 years ago

References #1325: Lists of items

Re-factored the syn with filter implementation. Each item list can now have multiple "Synchronization filters". This is now it's own item (Item.SYNCFILTER) which is a child item to item an item list.

Each filter have settings for the relation to the type of items it filters on (eg. parent or child items).

The ListableChildItems and ListableParentItems annotations was added to make it possible to annotate a class which parent and child item types it can navigate to.

The GUI has been updated to make it possible to create and specify filters for a list, but all synchonrization code has been temporarily removed since it no longer works.

File size: 16.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.ToolbarUtil"
61  import="net.sf.basedb.util.extensions.ExtensionsInvoker"
62  import="java.util.Collections"
63  import="java.util.Map"
64  import="java.util.Set"
65  import="java.util.List"
66  import="java.util.Date"
67%>
68<%@ taglib prefix="base" uri="/WEB-INF/base.tld" %>
69<%@ taglib prefix="tbl" uri="/WEB-INF/table.tld" %>
70<%@ taglib prefix="t" uri="/WEB-INF/tab.tld" %>
71<%@ taglib prefix="p" uri="/WEB-INF/path.tld" %>
72<%@ taglib prefix="ext" uri="/WEB-INF/extensions.tld" %>
73<%!
74  private static final Item itemType = Item.ITEMLIST;
75  private static final GuiContext guiContext = new GuiContext(itemType, GuiContext.Type.ITEM);
76%>
77<%
78final SessionControl sc = Base.getExistingSessionControl(pageContext, true);
79final String ID = sc.getId();
80final ItemContext cc = Base.getAndSetCurrentContext(sc, itemType, null, null);
81final int itemId = cc.getId();
82final String tab = Values.getStringOrNull(request.getParameter("tab"));
83final float scale = Base.getScale(sc);
84final DbControl dc = sc.newDbControl();
85try
86{
87  Map<Plugin.MainType, Integer> pluginCount = PluginDefinition.countPlugins(dc, guiContext);
88
89  String title = null;
90  ItemList list = ItemList.getById(dc, itemId);
91 
92  final boolean writePermission = list.hasPermission(Permission.WRITE);
93  final boolean deletePermission = list.hasPermission(Permission.DELETE);
94  final boolean sharePermission = list.hasPermission(Permission.SET_PERMISSION);
95  final boolean usePermission = list.hasPermission(Permission.USE);
96  final boolean setOwnerPermission = list.hasPermission(Permission.SET_OWNER);
97  final boolean isRemoved = list.isRemoved();
98  final boolean isUsed = isRemoved && list.isUsed();
99  final boolean deletePermanentlyPermission = deletePermission && !isUsed;
100  final boolean isOwner = list.isOwner();
101  Formatter<Date> timeFormatter = FormatterFactory.getDateTimeFormatter(sc);
102  Formatter<Date> dateFormatter = FormatterFactory.getDateFormatter(sc);
103  JspContext jspContext = ExtensionsControl.createContext(dc, pageContext, guiContext, list);
104  ExtensionsInvoker invoker = ToolbarUtil.useExtensions(jspContext);
105 
106  ItemQuery<SyncFilter> sfQuery = list.getSyncFilters();
107  sfQuery.order(Orders.asc(Hql.property("sourceItemTransform")));
108  sfQuery.order(Orders.asc(Hql.property("sourceItemType")));
109  sfQuery.order(Orders.asc(Hql.property("name")));
110  List<SyncFilter> syncFilters = sfQuery.list(dc);
111  %>
112  <base:page title="<%=title%>" id="view-page">
113  <base:head scripts="table.js,tabcontrol-2.js,~lists.js" styles="table.css,toolbar.css,headertabcontrol.css,path.css">
114    <ext:scripts context="<%=jspContext%>" />
115    <ext:stylesheets context="<%=jspContext%>" />
116  </base:head>
117  <base:body>
118    <p:path><p:pathelement 
119      title="Item lists" href="<%="index.jsp?ID="+ID%>" 
120      /><p:pathelement title="<%=HTML.encodeTags(list.getName())%>"
121      /></p:path>
122    <div id="page-data" data-item-id="<%=itemId%>"></div>
123   
124    <t:tabcontrol 
125      id="main" 
126      subclass="content mastertabcontrol"
127      active="<%=tab%>">
128    <t:tab id="properties" title="Properties">
129      <div>
130      <table class="fullform bottomborder">
131      <tr>
132        <th class="itemstatus">
133          <base:icon 
134            image="shared.png" 
135            visible="<%=list.isShared()%>"
136            tooltip="This item is shared to other users, groups and/or projects"
137          />
138          <base:icon 
139            id="btnDeletePermanently"
140            image="deleted.png"
141            tooltip="This item has been flagged for deletion. Click to delete it now."
142            enabled="<%=deletePermanentlyPermission %>"
143            visible="<%=isRemoved%>" 
144          />
145          <base:icon 
146            id="btnUsingItems"
147            image="used.png" 
148            tooltip="This item is used by other items and can't be permanently deleted. Show the items that are using this one"
149            visible="<%=isRemoved && isUsed%>" />
150        </th>
151        <td style="padding: 0px;">
152          <tbl:toolbar subclass="bottomborder bg-filled-50">
153            <tbl:button 
154              id="btnEdit"
155              disabled="<%=!writePermission%>" 
156              image="edit.png" 
157              title="Edit&hellip;" 
158              tooltip="<%=writePermission ? "Edit this list" : "You do not have permission to edit this list"%>" 
159            />
160            <tbl:button 
161              id="btnDelete"
162              disabled="<%=!deletePermission%>" 
163              image="delete.png" 
164              title="Delete"
165              visible="<%=!list.isRemoved()%>"
166              tooltip="<%=deletePermission ? "Delete this list" : "You do not have permission to delete this list"%>" 
167            />
168            <tbl:button 
169              id="btnRestore"
170              disabled="<%=!writePermission%>" 
171              image="restore.png" 
172              title="Restore"
173              visible="<%=list.isRemoved()%>"
174              tooltip="<%=writePermission ? "Restore this list" : "You do not have permission to restore this list"%>" 
175            />
176            <tbl:button 
177              id="btnShare"
178              disabled="<%=!sharePermission%>"
179              image="share.png"
180              title="Share&hellip;" 
181              tooltip="<%=sharePermission ? "Share this list to other user, groups and projects" : "You do not have permission to share this list"%>"
182            />
183            <tbl:button 
184              id="btnSetOwner"
185              disabled="<%=!setOwnerPermission%>"
186              image="take_ownership.png"
187              title="Set owner&hellip;"
188              tooltip="<%=setOwnerPermission ? "Change owner of this item" : "You do not have permission to change ownership of this item"%>"
189            />
190            <tbl:button
191              id="btnMergeUnion"
192              data-merge-type="union"
193              visible="<%=writePermission%>"
194              image="set_operations/union_small.png"
195              title="Union&hellip;"
196              tooltip="Add items from other lists to this list"
197            />
198            <tbl:button
199              id="btnMergeIntersection"
200              data-merge-type="intersection"
201              visible="<%=writePermission%>"
202              image="set_operations/intersection_small.png"
203              title="Intersection&hellip;"
204              tooltip="Keep only items that are present in other lists"
205            />
206            <tbl:button
207              id="btnMergeComplement"
208              data-merge-type="complement"
209              visible="<%=writePermission%>"
210              image="set_operations/complement_small.png"
211              title="Complement&hellip;"
212              tooltip="Remove items found in other lists from this list"
213            />
214            <tbl:button 
215              id="btnImport"
216              image="import.png" 
217              data-plugin-type="IMPORT" 
218              title="Import&hellip;" 
219              tooltip="Import data" 
220              visible="<%=pluginCount.containsKey(Plugin.MainType.IMPORT)%>"
221            />
222            <tbl:button 
223              id="btnExport"
224              image="export.png"
225              data-plugin-type="EXPORT" 
226              title="Export&hellip;" 
227              tooltip="Export data" 
228              visible="<%=pluginCount.containsKey(Plugin.MainType.EXPORT)%>"
229            />
230            <tbl:button 
231              id="btnRunPlugin"
232              image="runplugin.png" 
233              data-plugin-type="OTHER" 
234              title="Run plugin&hellip;" 
235              tooltip="Run a plugin" 
236              visible="<%=pluginCount.containsKey(Plugin.MainType.OTHER)%>"
237            />
238            <ext:render extensions="<%=invoker%>" context="<%=jspContext%>" 
239              wrapper="<%=new PrefixSuffixRenderer(jspContext, "<td>", "</td>") %>"/>
240            <tbl:button
241              image="help.png"
242              subclass="auto-init"
243              data-auto-init="help"
244              data-help-id="itemlist.view.properties"
245              title="Help&hellip;"
246              tooltip="Get help about this page"
247            /> 
248          </tbl:toolbar>
249        </td>
250      </tr>
251      <tr>
252        <th>Name</th>
253        <td><%=HTML.encodeTags(list.getName())%></td>
254      </tr>
255      <tr>
256        <th>Member type</th>
257        <td><%=list.getMemberType()%>
258          <%
259          if (list.getMemberType() != Item.RAWBIOASSAY)
260          {
261            %>
262            (<base:propertyvalue item="<%=list%>" property="itemSubtype" nulltext="<i>any</i>"/>)
263            <%
264          }
265          else
266          {
267            RawDataType rdt = list.getRawDataType();
268            %>
269            (<%=rdt != null ? HTML.encodeTags(rdt.getName()) : "<i>any</i>"%>)
270            <%
271          }
272          %>
273        </td>
274      </tr>
275      <tr>
276        <th>Size</th>
277        <td><%=list.getSize()%></td>
278      </tr>
279      <tr>
280        <th>External ID</th>
281        <td><%=HTML.encodeTags(list.getExternalId())%></td>
282      </tr>
283      <tr>
284        <th>Owner</th>
285        <td><base:propertyvalue item="<%=list%>" property="owner"/></td>
286      </tr>
287      <tr>
288        <th>Permissions</th>
289        <td><%=PermissionUtil.getFullPermissionNames(list)%></td>
290      </tr>
291      <tr>
292        <th>Description</th>
293        <td><%=HTML.niceFormat(list.getDescription())%></td>
294      </tr>
295      </table>
296      </div>
297     
298      <base:section 
299        id="syncFilters" 
300        title="<%="Synchronization filters (" + syncFilters.size() +")"%>"
301        context="<%=cc%>"
302        >
303        <tbl:table
304          id="tbl.syncFilters"
305          columns="all"
306          item="SYNCFILTER"
307          action="syncfilter/index.jsp"
308          >
309          <tbl:hidden name="list_id" value="<%=Integer.toString(itemId) %>" />
310          <tbl:columndef 
311            id="name"
312            title="Name"
313          />
314          <tbl:columndef 
315            id="sourceItems"
316            title="List members"
317          />
318          <tbl:columndef 
319            id="filter"
320            title="Filter"
321          />
322          <tbl:columndef 
323            id="matching"
324            title="Matching items"
325          />
326          <tbl:columndef 
327            id="description"
328            title="Description"
329          />
330          <tbl:toolbar subclass="topborder leftborder rightborder bg-filled-50">
331            <tbl:button 
332              id="btnAddSyncFilter"
333              image="add.png" 
334              disabled="<%=!writePermission%>"
335              tooltip="<%=writePermission ? "Add new filter" : "You do not have permission to modify the filters"%>" 
336              data-extra-url="<%="&list_id="+itemId%>"
337              data-item-type="SYNCFILTER"
338              title="Add filter&hellip;"
339            />
340            <tbl:button
341              id="btnRemoveSyncFilter"
342              image="delete_permanently.png"
343              disabled="<%=!writePermission%>"
344              tooltip="<%=writePermission ? "Remove the selected filters" : "You do not have permission to modify the filters"%>" 
345              title="Remove&hellip;"
346            />
347          </tbl:toolbar>
348          <tbl:data>
349            <tbl:headers>
350              <tbl:headerrow>
351              <tbl:header subclass="index" />
352              <tbl:header 
353                subclass="check"
354                ><base:icon 
355                  id="check.uncheck"
356                  image="check_uncheck.png" 
357                  tooltip="Check/uncheck all" 
358                /></tbl:header>
359                <tbl:columnheaders />
360              </tbl:headerrow>
361            </tbl:headers>
362            <tbl:rows>
363            <%
364            int index = 0;
365            Formatter<PropertyFilter> filterFormatter = new PropertyFilterFormatter(dc, dateFormatter);
366            for (SyncFilter sf : syncFilters)
367            {
368              index++;
369              String name = HTML.encodeTags(sf.getName());
370              int filterId = sf.getId();
371              SourceItemTransform transform = sf.getSourceItemTransformation();
372               
373              StringBuilder sb = new StringBuilder();
374              for (int filterRow = 0; filterRow < sf.getFilterRows(); filterRow++)
375              {
376                sb.append(filterRow > 0 ? "\nOR " : "");
377                sb.append(Values.getString(sf.getPropertyFilters(filterRow), "\n   AND ", true, filterFormatter));
378              }
379              %>
380              <tbl:row>
381                <tbl:header 
382                  clazz="index"
383                  ><%=index%></tbl:header>
384                <tbl:header 
385                  clazz="check" 
386                  ><input 
387                    type="checkbox" 
388                    name="<%=filterId%>" 
389                    value="<%=filterId%>" 
390                    title="<%=name%>"
391                  ></tbl:header>
392                <tbl:cell column="name"><div
393                  class="link table-item"
394                  data-item-id="<%=filterId%>"
395                  data-no-edit="<%=writePermission ? 0 : 1 %>" 
396                  data-extra-url="&list_id=<%=itemId%>"
397                  tabindex="0"
398                  title=""><%=name%></div></tbl:cell>
399                <tbl:cell column="sourceItems">
400                  <%
401                  if (transform == SourceItemTransform.NONE)
402                  {
403                    %>
404                    Must match filter
405                    <%
406                  }
407                  else
408                  {
409                    %>
410                    <%=transform == SourceItemTransform.PARENT_TO_CHILD ? "Parent" : "Child" %>
411                    item of type <i><%=sf.getSourceItemType().toString() %></i> must match filter
412                    <%
413                  }
414                  %>
415                </tbl:cell>
416                <tbl:cell column="filter"><pre><%=HTML.encodeTags(sb.toString())%></pre></tbl:cell>
417                <tbl:cell column="matching"><%=sf.getMatchingItems()%></tbl:cell>
418                <tbl:cell column="description"><%=HTML.niceFormat(sf.getDescription())%></tbl:cell>
419              </tbl:row>
420              <%
421            }
422            if (index == 0)
423            {
424              %>
425              <tbl:panel>
426                There are no synchronization filters for this list.
427              </tbl:panel>
428              <%
429            }
430            %>
431            </tbl:rows>
432          </tbl:data>
433        </tbl:table>
434     
435      </base:section>
436
437      <jsp:include page="../../common/anytoany/list_anytoany.jsp">
438        <jsp:param name="ID" value="<%=ID%>" />
439        <jsp:param name="item_type" value="<%=itemType.name()%>" />
440        <jsp:param name="item_id" value="<%=itemId%>" />
441        <jsp:param name="title" value="Other items related to this list" />
442      </jsp:include>
443      <jsp:include page="../../common/share/list_share.jsp">
444        <jsp:param name="ID" value="<%=ID%>" />
445        <jsp:param name="item_type" value="<%=itemType.name()%>" />
446        <jsp:param name="item_id" value="<%=itemId%>" />
447        <jsp:param name="title" value="Shared to" />
448      </jsp:include>
449    </t:tab>
450    <t:tab id="annotations" title="Annotations" 
451      tooltip="View annotation values" clazz="white">
452      <jsp:include page="../../common/annotations/list_frameset.jsp">
453        <jsp:param name="item_type" value="<%=itemType.name()%>" />
454        <jsp:param name="item_id" value="<%=itemId%>" />
455        <jsp:param name="ID" value="<%=ID%>" />
456      </jsp:include>
457    </t:tab>
458    <t:tab id="members" title="Members" />
459    <t:tab id="overview" title="Overview" 
460      tooltip="Display a tree overview of related items"
461      visible="<%=list.getMemberType() != Item.FILE%>">
462      <jsp:include page="../../common/overview/overview.jsp">
463        <jsp:param name="item_type" value="<%=itemType.name()%>" />
464        <jsp:param name="item_id" value="<%=itemId%>" />
465        <jsp:param name="ID" value="<%=ID%>" />
466      </jsp:include>
467    </t:tab>     
468    <t:tab id="history" title="Change history" 
469      tooltip="Displays a log of all modifications made to this item"
470      visible="<%=ChangeHistoryUtil.showChangeHistoryTab(sc)%>">
471      <jsp:include page="../../common/history/frameset.jsp">
472        <jsp:param name="item_type" value="<%=itemType.name()%>" />
473        <jsp:param name="item_id" value="<%=itemId%>" />
474        <jsp:param name="ID" value="<%=ID%>" />
475      </jsp:include>
476    </t:tab>     
477    </t:tabcontrol>
478
479  </base:body>
480  </base:page>
481  <%
482}
483finally
484{
485  if (dc != null) dc.close();
486}
487
488%>
Note: See TracBrowser for help on using the repository browser.