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

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

References #2246: Sticky table headers

Implemented for all items in the "View" menu.

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