source: branches/3.18-stable/www/views/trashcan/list_trash.jsp @ 7932

Last change on this file since 7932 was 7932, checked in by Nicklas Nordborg, 3 months ago

References #2246: Sticky table headers

Implemented for all item list pages and a few other places:

  • Extensions installation dialog
  • Administrate / Services list page
  • Batch inherit annotations
  • Manage list presets
  • List of changed item in view job dialog


  • Property svn:eol-style set to native
  • Property svn:keywords set to Date Id
File size: 13.3 KB
Line 
1<%-- $Id: list_trash.jsp 7932 2021-04-28 07:16:56Z nicklas $
2  ------------------------------------------------------------------
3  Copyright (C) 2006 Jari Häkkinen, Nicklas Nordborg, Martin Svensson
4  Copyright (C) 2007 Johan Enell, Nicklas Nordborg, 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.Trashcan"
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.File"
40  import="net.sf.basedb.core.Directory"
41  import="net.sf.basedb.core.User"
42  import="net.sf.basedb.core.Metadata"
43  import="net.sf.basedb.core.ItemNotFoundException"
44  import="net.sf.basedb.core.PermissionDeniedException"
45  import="net.sf.basedb.core.ItemQuery"
46  import="net.sf.basedb.core.query.EntityQuery"
47  import="net.sf.basedb.core.query.ResultList"
48  import="net.sf.basedb.core.query.Restriction"
49  import="net.sf.basedb.core.query.Restrictions"
50  import="net.sf.basedb.core.query.ReturnClassFilter"
51  import="net.sf.basedb.util.Enumeration"
52  import="net.sf.basedb.util.ShareableUtil"
53  import="net.sf.basedb.util.filter.Filter"
54  import="net.sf.basedb.clients.web.Base"
55  import="net.sf.basedb.clients.web.util.HTML"
56  import="net.sf.basedb.util.Values"
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.clients.web.extensions.list.ListColumnAction"
63  import="net.sf.basedb.clients.web.extensions.list.ListColumnUtil"
64  import="net.sf.basedb.util.extensions.ExtensionsInvoker"
65  import="java.util.Iterator"
66  import="java.util.Set"
67  import="java.util.HashSet"
68%>
69<%@ taglib prefix="base" uri="/WEB-INF/base.tld" %>
70<%@ taglib prefix="tbl" uri="/WEB-INF/table.tld" %>
71<%@ taglib prefix="ext" uri="/WEB-INF/extensions.tld" %>
72<%!
73  private static final Item itemType = Item.SYSTEM;
74  private static final String subContext = "trashcan";
75
76  private static final Enumeration<String, String> items = new Enumeration<String, String>();
77  static
78  {
79    for (Item item : Metadata.getRemovableItems())
80    {
81      items.add(item.name(), item.toString());
82    }
83  }
84%>
85<%
86final SessionControl sc = Base.getExistingSessionControl(pageContext, true);
87final String ID = sc.getId();
88final ItemContext cc = Base.getAndSetCurrentContext(sc, itemType, subContext, null, null);
89
90final DbControl dc = sc.newDbControl();
91ResultList<Removable> trash = null;
92try
93{
94  long totalCount = 0;
95  final ItemQuery<User> userQuery = User.getQuery();
96  try
97  {
98    String filterItem = cc.getPropertyValue("type");
99    Set<Item> itemTypes = null; 
100    if (filterItem != null)
101    {
102      itemTypes = new HashSet<Item>();
103      for (String name : filterItem.split("\\|"))
104      {
105        itemTypes.add(Item.valueOf(name));
106      }
107    }
108    Restriction id = cc.getFilterRestriction("id", dc, null);
109    Restriction removedBy = cc.getFilterRestriction("removedBy", dc, null);
110    Restriction name = Restrictions.conditionalRestriction(new ReturnClassFilter(Nameable.class), 
111        cc.getFilterRestriction("name", dc, null), null, true);
112    Restriction description = Restrictions.conditionalRestriction(new ReturnClassFilter(Nameable.class),
113        cc.getFilterRestriction("description", dc, null), null, true);
114    Restriction owner = Restrictions.conditionalRestriction(new ReturnClassFilter(Ownable.class),
115        cc.getFilterRestriction("owner", dc, null), null, true);
116    Restriction sharedTo = Restrictions.conditionalRestriction(new ReturnClassFilter(Shareable.class),
117        cc.getFilterRestriction("!sharedTo.name", dc, null), null, true);
118    Restriction restriction = Restrictions.nullSafeAnd(id, removedBy, name, description, owner, sharedTo);
119
120    trash = Trashcan.getItems(dc, itemTypes, cc.getPage() * cc.getRowsPerPage(), cc.getRowsPerPage(), restriction);
121    totalCount = trash.getTotalCount();
122  }
123  catch (Throwable t)
124  {
125    cc.setMessage(t.getMessage());
126  }
127  int numListed = 0;
128  JspContext jspContext = ExtensionsControl.createContext(dc, pageContext);
129  ExtensionsInvoker<ButtonAction> invoker = ExtensionsControl.useExtensions(jspContext, 
130      "net.sf.basedb.clients.web.toolbar.list.all", 
131      "net.sf.basedb.clients.web.toolbar.list.trashcan");
132  ExtensionsInvoker<ListColumnAction<BasicItem,?>> columnsInvoker =  ExtensionsControl.useExtensions(jspContext, 
133      "net.sf.basedb.clients.web.listcolumn.trashcan");
134  %>
135  <base:page title="Trashcan" id="list-page">
136  <base:head scripts="table.js,~trash.js" styles="table.css,toolbar.css">
137    <ext:scripts context="<%=jspContext%>" />
138    <ext:stylesheets context="<%=jspContext%>" />
139  </base:head>
140 
141  <base:body>
142    <h1>Trashcan</h1>
143    <div class="content">
144    <tbl:table 
145      id="trashcan" 
146      columns="<%=cc.getSetting("columns")%>"
147      action="index.jsp"
148      sc="<%=sc%>"
149      item="<%=itemType%>"
150      subcontext="<%=subContext%>"
151      subclass="fulltable sticky-headers"
152      data-no-linkeditem-columns="1"
153      >
154      <tbl:columndef
155        id="type"
156        property="type"
157        datatype="string"
158        title="Item type"
159        enumeration="<%=items%>"
160        filterable="true"
161        show="always"
162      />
163      <tbl:columndef 
164        id="name"
165        title="Name"
166        show="always" 
167        filterable="true"
168        filterproperty="name"
169        datatype="string"
170      />
171      <tbl:columndef
172        id="id"
173        property="id"
174        datatype="int"
175        title="ID"
176        exportable="true"
177        filterable="true"
178      />
179      <%
180      Enumeration<String, String> users = new Enumeration<String, String>();
181      for (User u : userQuery.list(dc))
182      {
183        users.add(Integer.toString(u.getId()), HTML.encodeTags(u.getName()));
184      }
185      %>
186      <tbl:columndef 
187        id="owner"
188        title="Owner"
189        property="owner"
190        datatype="int"
191        filterable="true"
192        enumeration="<%=users%>"
193      />
194      <tbl:columndef 
195        id="removedBy"
196        title="Removed by"
197        property="removedBy"
198        datatype="int"
199        filterable="true"
200        enumeration="<%=users%>"
201      />
202      <tbl:columndef 
203        id="description"
204        title="Description"
205        property="description"
206        filterable="true"
207        datatype="string"
208      />
209      <tbl:columndef
210        id="sharedTo"
211        title="Shared to"
212        filterable="true"
213        filterproperty="!sharedTo.name"
214        datatype="string"
215      />
216      <tbl:columndef 
217        id="xt-columns" 
218        extensions="<%=columnsInvoker%>" 
219        jspcontext="<%=jspContext%>" 
220      />
221      <div class="panelgroup bg-filled-50 bottomborder">
222        <tbl:toolbar subclass="bottomborder">
223          <tbl:button
224            id="btnDeleteAllItems"
225            image="deleteall.png"
226            title="Empty trash&hellip;"
227            tooltip="Delete all items from the trashcan"
228            disabled="<%=totalCount <= 0%>"
229          />
230          <tbl:button 
231            id="btnDeleteItems"
232            image="delete_permanently.png"
233            title="Delete permanently&hellip;" 
234            tooltip="Delete the selected items permanently" 
235            disabled="<%=totalCount <= 0%>"
236          />
237          <tbl:button 
238            id="btnRestoreItems"
239            image="restore.png"
240            title="Restore" 
241            tooltip="Restore the selected items"
242            disabled="<%=totalCount <= 0%>"
243          />
244          <tbl:button 
245            id="btnColumns"
246            image="columns.png" 
247            title="Columns&hellip;" 
248            tooltip="Show, hide and re-order columns" 
249          />
250          <ext:render extensions="<%=invoker%>" context="<%=jspContext%>" 
251            wrapper="<%=new PrefixSuffixRenderer<ButtonAction>(jspContext, "<td>", "</td>") %>"/>
252        </tbl:toolbar>
253        <tbl:panel>
254          <tbl:presetselector />
255          <tbl:navigator
256            page="<%=cc.getPage()%>" 
257            rowsperpage="<%=cc.getRowsPerPage()%>" 
258            totalrows="<%=trash == null ? 0 : trash.getTotalCount()%>"
259          />
260        </tbl:panel>
261      </div>
262      <tbl:data>
263        <tbl:headers>
264          <tbl:headerrow>
265            <tbl:header colspan="3" />
266            <tbl:columnheaders />
267          </tbl:headerrow>
268          <tbl:headerrow>
269            <tbl:header subclass="index" />
270            <tbl:header 
271              subclass="check" 
272              ><base:icon 
273                subclass="link table-check"
274                image="check_uncheck.png" 
275                tooltip="Toggle all (use CTRL, ALT or SHIFT to check/uncheck)" 
276                data-regexp="item:"
277              /></tbl:header>
278            <tbl:header 
279              subclass="icons" 
280              />
281            <tbl:propertyfilter />
282          </tbl:headerrow>
283          <tbl:columnsubtitles />
284        </tbl:headers>
285        <tbl:rows>
286          <%
287          if (cc.getMessage() != null)
288          {
289            %>
290            <tbl:panel subclass="bg-filled-50">
291              <div class="messagecontainer error"><%=cc.getMessage()%></div>
292            </tbl:panel>
293            <%
294            cc.setMessage(null);
295          }
296          int index = cc.getPage()*cc.getRowsPerPage();
297          if (trash != null)
298          {
299            for (Removable item : trash)
300            {
301              BasicItem basicItem = (BasicItem)item;
302              boolean isUsed = basicItem.isUsed();
303              int itemId = item.getId();
304              String name = "";
305              String description = "";
306              if (item instanceof File)
307              {
308                File file = (File)item;
309                name = file.getPath().toString();
310                description = file.getDescription();
311              }
312              else if (item instanceof Directory)
313              {
314                Directory dir = (Directory)item;
315                name = dir.getPath().toString();
316                description = dir.getDescription();
317              }
318              else if (item instanceof Nameable)
319              {
320                Nameable nameable = (Nameable)item;
321                name = nameable.getName();
322                description = nameable.getDescription();
323              }
324              else
325              {
326                name = item.toString();
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                    subclass="link auto-init"
347                    data-auto-init="show-using-items"
348                    data-item-type="<%=item.getType().name() %>"
349                    data-item-id="<%=itemId %>"
350                    image="used.png"
351                    tooltip="This item is used by other items and cannot be deleted"
352                    visible="<%=isUsed%>"
353                  />&nbsp;</tbl:header>
354                <tbl:cell column="type"><%=item.getType()%></tbl:cell>
355                <tbl:cell column="name"><%=link%></tbl:cell>
356                <tbl:cell column="id"><%=item.getId()%></tbl:cell>
357                <tbl:cell column="removedBy"><%
358                    User removedBy = null;
359                    boolean deniedRemovedBy = false;
360                    try
361                    {
362                      removedBy = item.getRemovedBy();
363                    }
364                    catch (PermissionDeniedException ex)
365                    {
366                      deniedRemovedBy = true;
367                    }
368                    catch (ItemNotFoundException ex)
369                    {}
370                    out.write(Base.getLinkedName(ID, removedBy, deniedRemovedBy, true));
371                  %></tbl:cell>
372                <tbl:cell column="owner"><%
373                  if (item instanceof Ownable)
374                  {
375                    User owner = null;
376                    boolean deniedOwner = false;
377                    try
378                    {
379                      owner = ((Ownable)item).getOwner();
380                    }
381                    catch (PermissionDeniedException ex)
382                    {
383                      deniedOwner = true;
384                    }
385                    out.write(Base.getLinkedName(ID, owner, deniedOwner, true));
386                  }
387                  %></tbl:cell>
388                <tbl:cell column="sharedTo"><%
389                  if (item instanceof SharedItem)
390                  {
391                    Iterator<Nameable> sharees = ShareableUtil.getSharedTo(dc, (SharedItem)item).iterator();
392                    while(sharees.hasNext())
393                    {
394                      Nameable n = sharees.next();
395                      out.write(Base.getLinkedName(ID, n, false, true));
396                      out.write(sharees.hasNext() ? ", " : "");
397                    }
398                  }
399                  %></tbl:cell>
400                <tbl:cell column="description"><%=HTML.encodeTags(description)%></tbl:cell>
401                <tbl:xt-cells dc="<%=dc%>" item="<%=item%>">
402                  <tbl:cell column="xt-columns" />
403                </tbl:xt-cells>
404              </tbl:row>
405              <%
406              }
407            }
408          if (numListed == 0)
409          {
410            %>
411            <tbl:panel subclass="bg-filled-50">
412              <div class="messagecontainer note">
413              <%=trash == null || trash.size() == 0 ? "No items were found" : "No items on this page. Please select another page!" %>
414              </div>
415            </tbl:panel>
416            <%
417          }
418          %>
419        </tbl:rows>
420      </tbl:data>
421    </tbl:table>
422    </div>
423   
424  </base:body>
425  </base:page>
426  <%
427}
428finally
429{
430  if (dc != null) dc.close();
431}
432%>
Note: See TracBrowser for help on using the repository browser.