source: trunk/www/views/items/list_items.jsp @ 7038

Last change on this file since 7038 was 7038, checked in by Nicklas Nordborg, 6 years ago

Fixes #1976: Improve filtering in "All items" list

  • Property svn:eol-style set to native
  • Property svn:keywords set to Date Id
File size: 13.0 KB
Line 
1<%-- $Id: list_items.jsp 7038 2015-12-04 12:00:05Z nicklas $
2  ------------------------------------------------------------------
3  Copyright (C) 2006 Nicklas Nordborg
4  Copyright (C) 2007 Johan Enell, Martin Svensson
5
6  This file is part of BASE - BioArray Software Environment.
7  Available at http://base.thep.lu.se/
8
9  BASE is free software; you can redistribute it and/or
10  modify it under the terms of the GNU General Public License
11  as published by the Free Software Foundation; either version 3
12  of the License, or (at your option) any later version.
13
14  BASE is distributed in the hope that it will be useful,
15  but WITHOUT ANY WARRANTY; without even the implied warranty of
16  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17  GNU General Public License for more details.
18
19  You should have received a copy of the GNU General Public License
20  along with BASE. If not, see <http://www.gnu.org/licenses/>.
21  ------------------------------------------------------------------
22
23  @author Nicklas
24  @version 2.0
25--%>
26<%@ page pageEncoding="UTF-8" session="false"
27  import="net.sf.basedb.core.SessionControl"
28  import="net.sf.basedb.core.DbControl"
29  import="net.sf.basedb.core.User"
30  import="net.sf.basedb.core.Item"
31  import="net.sf.basedb.core.ItemContext"
32  import="net.sf.basedb.core.Permission"
33  import="net.sf.basedb.core.BasicItem"
34  import="net.sf.basedb.core.Removable"
35  import="net.sf.basedb.core.Nameable"
36  import="net.sf.basedb.core.Ownable"
37  import="net.sf.basedb.core.Shareable"
38  import="net.sf.basedb.core.SharedItem"
39  import="net.sf.basedb.core.Subtypable"
40  import="net.sf.basedb.core.File"
41  import="net.sf.basedb.core.Directory"
42  import="net.sf.basedb.core.Metadata"
43  import="net.sf.basedb.core.PropertyFilter"
44  import="net.sf.basedb.core.query.ResultList"
45  import="net.sf.basedb.core.query.Restriction"
46  import="net.sf.basedb.core.query.Restrictions"
47  import="net.sf.basedb.core.query.ReturnClassFilter"
48  import="net.sf.basedb.util.Enumeration"
49  import="net.sf.basedb.util.ShareableUtil"
50  import="net.sf.basedb.clients.web.Base"
51  import="net.sf.basedb.clients.web.ModeInfo"
52  import="net.sf.basedb.clients.web.util.HTML"
53  import="net.sf.basedb.util.Values"
54  import="net.sf.basedb.clients.web.extensions.ExtensionsControl"
55  import="net.sf.basedb.clients.web.extensions.JspContext"
56  import="net.sf.basedb.clients.web.extensions.renderer.PrefixSuffixRenderer"
57  import="net.sf.basedb.clients.web.extensions.toolbar.ToolbarUtil"
58  import="net.sf.basedb.clients.web.extensions.list.ListColumnUtil"
59  import="net.sf.basedb.util.extensions.ExtensionsInvoker"
60  import="java.util.Set"
61  import="java.util.HashSet"
62  import="java.util.Iterator"
63%>
64<%@ taglib prefix="base" uri="/WEB-INF/base.tld" %>
65<%@ taglib prefix="tbl" uri="/WEB-INF/table.tld" %>
66<%@ taglib prefix="ext" uri="/WEB-INF/extensions.tld" %>
67<%!
68  private static final Item itemType = Item.SYSTEM;
69  private static final String subContext = "allitems";
70
71  private static final Enumeration<String, String> items = new Enumeration<String, String>();
72  static
73  {
74    for (Item item : Metadata.getOwnableItems())
75    {
76      items.add(item.name(), item.toString());
77    }
78  }
79%>
80<%
81final SessionControl sc = Base.getExistingSessionControl(pageContext, true);
82final String ID = sc.getId();
83final ItemContext cc = Base.getAndSetCurrentContext(sc, itemType, subContext, null, null);
84final ModeInfo mode = ModeInfo.get(request.getParameter("mode"));
85final DbControl dc = sc.newDbControl();
86ResultList<Ownable> allItems = null;
87try
88{
89  long totalCount = 0;
90  try
91  {
92    String filterItem = cc.getPropertyValue("type");
93    Set<Item> itemTypes = null;
94    if (filterItem != null)
95    {
96      itemTypes = new HashSet<Item>();
97      for (String name : filterItem.split("\\|"))
98      {
99        itemTypes.add(Item.valueOf(name));
100      }
101    }
102    Restriction id = cc.getFilterRestriction("id", dc, null);
103    Restriction sharedTo = Restrictions.conditionalRestriction(new ReturnClassFilter(Shareable.class),
104      cc.getFilterRestriction("!sharedTo.name", dc, null), null, true);
105    Restriction name = Restrictions.conditionalRestriction(new ReturnClassFilter(Nameable.class),
106      cc.getFilterRestriction("name", dc, null), null, true);
107    Restriction description = Restrictions.conditionalRestriction(new ReturnClassFilter(Nameable.class),
108      cc.getFilterRestriction("description", dc, null), null, true);
109    Restriction subtype = Restrictions.conditionalRestriction(new ReturnClassFilter(Subtypable.class),
110      cc.getFilterRestriction("itemSubtype.name", dc, null), null, true);
111    Restriction restriction = Restrictions.nullSafeAnd(sharedTo, name, description, id, subtype);
112
113    User loggedInUser = User.getById(dc, sc.getLoggedInUserId());
114    if (itemTypes == null || itemTypes.size() > 0)
115    {
116      allItems = loggedInUser.getItems(itemTypes, cc.getPage() * cc.getRowsPerPage(), 
117          cc.getRowsPerPage(), null, restriction);
118    }
119    totalCount = allItems.getTotalCount();
120  }
121  catch (Throwable t)
122  {
123    cc.setMessage(t.getMessage());
124  }
125  int numListed = 0;
126  JspContext jspContext = ExtensionsControl.createContext(dc, pageContext);
127  ExtensionsInvoker invoker = ExtensionsControl.useExtensions(jspContext, 
128      "net.sf.basedb.clients.web.toolbar.list.all", 
129      "net.sf.basedb.clients.web.toolbar.list.allitems");
130  ExtensionsInvoker columnsInvoker =  ExtensionsControl.useExtensions(jspContext, 
131      "net.sf.basedb.clients.web.listcolumn.allitems");
132  %>
133  <base:page title="All items" id="list-page">
134  <base:head scripts="table.js,~items.js" styles="table.css,toolbar.css">
135    <ext:scripts context="<%=jspContext%>" />
136    <ext:stylesheets context="<%=jspContext%>" />
137  </base:head>
138 
139  <base:body>
140    <h1>All items</h1>
141    <div class="content">
142    <tbl:table 
143      id="allItems" 
144      columns="<%=cc.getSetting("columns")%>"
145      action="index.jsp"
146      sc="<%=sc%>"
147      item="<%=itemType%>"
148      subcontext="<%=subContext%>"
149      subclass="fulltable"
150      >
151      <tbl:columndef
152        id="type"
153        property="type"
154        datatype="string"
155        title="Item type"
156        enumeration="<%=items%>"
157        filterable="true"
158        show="always"
159      />
160      <tbl:columndef 
161        id="name"
162        title="Name"
163        property="name"
164        filterable="true"
165        datatype="string"
166        show="always" 
167      />
168      <tbl:columndef 
169        id="id"
170        property="id"
171        datatype="int"
172        title="ID"
173        filterable="true"
174      />
175      <tbl:columndef
176        id="itemSubtype"
177        property="itemSubtype.name"
178        datatype="string"
179        title="Subtype"
180        filterable="true"
181      />
182      <tbl:columndef 
183        id="description"
184        title="Description"
185        property="description"
186        filterable="true"
187        datatype="string"
188      />
189      <tbl:columndef
190        id="sharedTo"
191        title="Shared to"
192        filterable="true"
193        filterproperty="!sharedTo.name"
194        datatype="string"
195      />
196      <tbl:columndef 
197        id="xt-columns" 
198        extensions="<%=columnsInvoker%>" 
199        jspcontext="<%=jspContext%>" 
200      />
201      <div class="panelgroup bg-filled-50 bottomborder">
202        <tbl:toolbar subclass="bottomborder">
203          <tbl:button 
204            id="btnDeleteItems"
205            image="delete.png"
206            title="Delete" 
207            tooltip="Mark the selected items for deletion" 
208            disabled="<%=totalCount <= 0%>"
209          />
210          <tbl:button 
211            id="btnRestoreItems"
212            image="restore.png"
213            title="Restore" 
214            tooltip="Restore the selected items"
215            disabled="<%=totalCount <= 0%>"
216          />
217          <tbl:button 
218            id="btnShareItems"
219            image="share.png"
220            title="Share&hellip;" 
221            tooltip="Share the selected items"
222            disabled="<%=totalCount <= 0%>"
223          />
224          <tbl:button 
225            id="btnSetOwner"
226            image="take_ownership.png"
227            title="Set owner&hellip;"
228            tooltip="Change owner of the selected items"
229          />
230          <tbl:button 
231            id="btnColumns"
232            image="columns.png" 
233            title="Columns&hellip;" 
234            tooltip="Show, hide and re-order columns" 
235          />
236          <ext:render extensions="<%=invoker%>" context="<%=jspContext%>" 
237            wrapper="<%=new PrefixSuffixRenderer(jspContext, "<td>", "</td>") %>"/>
238        </tbl:toolbar>
239        <tbl:panel>
240          <tbl:presetselector />
241          <tbl:navigator
242            page="<%=cc.getPage()%>" 
243            rowsperpage="<%=cc.getRowsPerPage()%>" 
244            totalrows="<%=allItems == null ? 0 : allItems.getTotalCount()%>"
245          />
246        </tbl:panel>
247      </div>
248      <tbl:data>
249        <tbl:headers>
250          <tbl:headerrow>
251            <tbl:header colspan="3" />
252            <tbl:columnheaders />
253          </tbl:headerrow>
254          <tbl:headerrow>
255            <tbl:header subclass="index" />
256            <tbl:header 
257              subclass="check" 
258              ><base:icon 
259                subclass="link table-check"
260                image="check_uncheck.png" 
261                tooltip="Toggle all (use CTRL, ALT or SHIFT to check/uncheck)" 
262                data-regexp="item:"
263              /></tbl:header>
264            <tbl:header 
265              subclass="check" 
266              visible="<%=mode.hasRadio()%>"
267              />
268            <tbl:header 
269              subclass="icons" 
270              />
271            <tbl:propertyfilter />
272          </tbl:headerrow>
273        </tbl:headers>
274        <tbl:rows>
275          <%
276          if (cc.getMessage() != null)
277          {
278            %>
279            <tbl:panel subclass="bg-filled-50">
280              <div class="messagecontainer error"><%=cc.getMessage()%></div>
281            </tbl:panel>
282            <%
283            cc.setMessage(null);
284          }
285          int index = cc.getPage()*cc.getRowsPerPage();
286          if (allItems != null)
287          {
288            for (Ownable item : allItems)
289            {
290              BasicItem basicItem = (BasicItem)item;
291              boolean isRemoved = false;
292              boolean isShared = false;
293              boolean sharePermission = item.hasPermission(Permission.SET_PERMISSION);
294              int itemId = item.getId();
295              boolean deletePermission = item.hasPermission(Permission.DELETE);
296              String name = "";
297              String description = "";
298              if (item instanceof File)
299              {
300                File file = (File)item;
301                name = file.getPath().toString();
302                description = file.getDescription();
303              }
304              else if (item instanceof Directory)
305              {
306                Directory dir = (Directory)item;
307                name = dir.getPath().toString();
308                description = dir.getDescription();
309              }
310              else if (item instanceof Nameable)
311              {
312                Nameable nameable = (Nameable)item;
313                name = nameable.getName();
314                description = nameable.getDescription();
315              }
316              else
317              {
318                name = item.toString();
319              }
320              if (item instanceof Removable)
321              {
322                isRemoved = ((Removable)item).isRemoved();
323              }
324              if (item instanceof Shareable)
325              {
326                isShared = ((Shareable)item).isShared();
327              }
328              String link = Base.getLink(ID, HTML.encodeTags(name), item.getType(), itemId, true);
329              index++;
330              numListed++;
331              %>
332              <tbl:row>
333                <tbl:header 
334                  clazz="index"
335                  ><%=index%></tbl:header>
336                <tbl:header 
337                  clazz="check" 
338                  ><input 
339                    type="checkbox" 
340                    name="item:<%=item.getType().name()%>" 
341                    value="<%=itemId%>"
342                  ></tbl:header>
343                <tbl:header 
344                  clazz="icons" 
345                  ><base:icon 
346                    image="deleted.png"
347                    id="<%="delete."+itemId %>"
348                    subclass="<%=deletePermission ? "table-delete-item" : null %>"
349                    data-item-type="<%=item.getType().name()%>"
350                    data-item-id="<%=itemId%>"
351                    tooltip="This item has been marked for deletion" 
352                    visible="<%=isRemoved%>"
353                  /><base:icon 
354                    image="shared.png" 
355                    id="<%="share."+itemId %>"
356                    subclass="<%=sharePermission ? "table-share-item" : null %>"
357                    data-item-type="<%=item.getType().name()%>"
358                    data-item-id="<%=itemId%>"
359                    tooltip="This item is shared to other users, groups and/or projects" 
360                    visible="<%=isShared%>"
361                  />&nbsp;</tbl:header>
362                <tbl:cell column="type"><%=item.getType()%></tbl:cell>
363                <tbl:cell column="name"><%=link%></tbl:cell>
364                <tbl:cell column="id"><%=item.getId()%></tbl:cell>
365                <tbl:cell column="itemSubtype"><%
366                if (item instanceof Subtypable)
367                {
368                  %><base:propertyvalue item="<%=item%>" property="itemSubtype" /><%
369                }
370                %></tbl:cell>
371                <tbl:cell column="description"><%=HTML.encodeTags(description)%></tbl:cell>
372                <tbl:cell column="sharedTo">
373                  <%
374                  if (item instanceof SharedItem)
375                  {
376                    Iterator<Nameable> sharees = ShareableUtil.getSharedTo(dc, (SharedItem)item).iterator();
377                    while(sharees.hasNext())
378                    {
379                      Nameable n = sharees.next();
380                      if (mode.hasPropertyLink())
381                      {
382                        out.write(Base.getLinkedName(ID, n, false, mode.hasEditLink()));
383                      }
384                      else
385                      {
386                        out.write(HTML.encodeTags(n.getName()));
387                      }
388                      out.write(sharees.hasNext() ? ", " : "");
389                    }
390                  }
391                  %>
392                </tbl:cell>
393                <tbl:xt-cells dc="<%=dc%>" item="<%=item%>">
394                  <tbl:cell column="xt-columns" />
395                </tbl:xt-cells>
396              </tbl:row>
397              <%
398              }
399            }
400          if (numListed == 0)
401          {
402            %>
403            <tbl:panel subclass="bg-filled-50">
404              <div class="messagecontainer note">
405              <%=allItems == null || allItems.size() == 0 ? "No items were found" : "No items on this page. Please select another page!" %>
406              </div>
407            </tbl:panel>
408            <%
409          }
410          %>
411        </tbl:rows>
412      </tbl:data>
413    </tbl:table>
414    </div>
415  </base:body>
416  </base:page>
417  <%
418}
419finally
420{
421  if (dc != null) dc.close();
422}
423%>
Note: See TracBrowser for help on using the repository browser.