source: branches/3.18-stable/www/views/items/list_items.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.2 KB
Line 
1<%-- $Id: list_items.jsp 7932 2021-04-28 07:16:56Z 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.ButtonAction" 
58  import="net.sf.basedb.clients.web.extensions.toolbar.ToolbarUtil"
59  import="net.sf.basedb.clients.web.extensions.list.ListColumnAction"
60  import="net.sf.basedb.clients.web.extensions.list.ListColumnUtil"
61  import="net.sf.basedb.util.extensions.ExtensionsInvoker"
62  import="java.util.Set"
63  import="java.util.HashSet"
64  import="java.util.Iterator"
65%>
66<%@ taglib prefix="base" uri="/WEB-INF/base.tld" %>
67<%@ taglib prefix="tbl" uri="/WEB-INF/table.tld" %>
68<%@ taglib prefix="ext" uri="/WEB-INF/extensions.tld" %>
69<%!
70  private static final Item itemType = Item.SYSTEM;
71  private static final String subContext = "allitems";
72
73  private static final Enumeration<String, String> items = new Enumeration<String, String>();
74  static
75  {
76    for (Item item : Metadata.getOwnableItems())
77    {
78      items.add(item.name(), item.toString());
79    }
80  }
81%>
82<%
83final SessionControl sc = Base.getExistingSessionControl(pageContext, true);
84final String ID = sc.getId();
85final ItemContext cc = Base.getAndSetCurrentContext(sc, itemType, subContext, null, null);
86final ModeInfo mode = ModeInfo.get(request.getParameter("mode"));
87final DbControl dc = sc.newDbControl();
88ResultList<Ownable> allItems = null;
89try
90{
91  long totalCount = 0;
92  try
93  {
94    String filterItem = cc.getPropertyValue("type");
95    Set<Item> itemTypes = null;
96    if (filterItem != null)
97    {
98      itemTypes = new HashSet<Item>();
99      for (String name : filterItem.split("\\|"))
100      {
101        itemTypes.add(Item.valueOf(name));
102      }
103    }
104    Restriction id = cc.getFilterRestriction("id", dc, null);
105    Restriction sharedTo = Restrictions.conditionalRestriction(new ReturnClassFilter(Shareable.class),
106      cc.getFilterRestriction("!sharedTo.name", dc, null), null, true);
107    Restriction name = Restrictions.conditionalRestriction(new ReturnClassFilter(Nameable.class),
108      cc.getFilterRestriction("name", dc, null), null, true);
109    Restriction description = Restrictions.conditionalRestriction(new ReturnClassFilter(Nameable.class),
110      cc.getFilterRestriction("description", dc, null), null, true);
111    Restriction subtype = Restrictions.conditionalRestriction(new ReturnClassFilter(Subtypable.class),
112      cc.getFilterRestriction("itemSubtype.name", dc, null), null, true);
113    Restriction restriction = Restrictions.nullSafeAnd(sharedTo, name, description, id, subtype);
114
115    User loggedInUser = User.getById(dc, sc.getLoggedInUserId());
116    if (itemTypes == null || itemTypes.size() > 0)
117    {
118      allItems = loggedInUser.getItems(itemTypes, cc.getPage() * cc.getRowsPerPage(), 
119          cc.getRowsPerPage(), null, restriction);
120    }
121    totalCount = allItems.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.allitems");
132  ExtensionsInvoker<ListColumnAction<BasicItem,?>> columnsInvoker =  ExtensionsControl.useExtensions(jspContext, 
133      "net.sf.basedb.clients.web.listcolumn.allitems");
134  %>
135  <base:page title="All items" id="list-page">
136  <base:head scripts="table.js,~items.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>All items</h1>
143    <div class="content">
144    <tbl:table 
145      id="allItems" 
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        property="name"
167        filterable="true"
168        datatype="string"
169        show="always" 
170      />
171      <tbl:columndef 
172        id="id"
173        property="id"
174        datatype="int"
175        title="ID"
176        filterable="true"
177      />
178      <tbl:columndef
179        id="itemSubtype"
180        property="itemSubtype.name"
181        datatype="string"
182        title="Subtype"
183        filterable="true"
184      />
185      <tbl:columndef 
186        id="description"
187        title="Description"
188        property="description"
189        filterable="true"
190        datatype="string"
191      />
192      <tbl:columndef
193        id="sharedTo"
194        title="Shared to"
195        filterable="true"
196        filterproperty="!sharedTo.name"
197        datatype="string"
198      />
199      <tbl:columndef 
200        id="xt-columns" 
201        extensions="<%=columnsInvoker%>" 
202        jspcontext="<%=jspContext%>" 
203      />
204      <div class="panelgroup bg-filled-50 bottomborder">
205        <tbl:toolbar subclass="bottomborder">
206          <tbl:button 
207            id="btnDeleteItems"
208            image="delete.png"
209            title="Delete" 
210            tooltip="Mark the selected items for deletion" 
211            disabled="<%=totalCount <= 0%>"
212          />
213          <tbl:button 
214            id="btnRestoreItems"
215            image="restore.png"
216            title="Restore" 
217            tooltip="Restore the selected items"
218            disabled="<%=totalCount <= 0%>"
219          />
220          <tbl:button 
221            id="btnShareItems"
222            image="share.png"
223            title="Share&hellip;" 
224            tooltip="Share the selected items"
225            disabled="<%=totalCount <= 0%>"
226          />
227          <tbl:button 
228            id="btnSetOwner"
229            image="take_ownership.png"
230            title="Set owner&hellip;"
231            tooltip="Change owner of the selected items"
232          />
233          <tbl:button 
234            id="btnColumns"
235            image="columns.png" 
236            title="Columns&hellip;" 
237            tooltip="Show, hide and re-order columns" 
238          />
239          <ext:render extensions="<%=invoker%>" context="<%=jspContext%>" 
240            wrapper="<%=new PrefixSuffixRenderer<ButtonAction>(jspContext, "<td>", "</td>") %>"/>
241        </tbl:toolbar>
242        <tbl:panel>
243          <tbl:presetselector />
244          <tbl:navigator
245            page="<%=cc.getPage()%>" 
246            rowsperpage="<%=cc.getRowsPerPage()%>" 
247            totalrows="<%=allItems == null ? 0 : allItems.getTotalCount()%>"
248          />
249        </tbl:panel>
250      </div>
251      <tbl:data>
252        <tbl:headers>
253          <tbl:headerrow>
254            <tbl:header colspan="3" />
255            <tbl:columnheaders />
256          </tbl:headerrow>
257          <tbl:headerrow>
258            <tbl:header subclass="index" />
259            <tbl:header 
260              subclass="check" 
261              ><base:icon 
262                subclass="link table-check"
263                image="check_uncheck.png" 
264                tooltip="Toggle all (use CTRL, ALT or SHIFT to check/uncheck)" 
265                data-regexp="item:"
266              /></tbl:header>
267            <tbl:header 
268              subclass="check" 
269              visible="<%=mode.hasRadio()%>"
270              />
271            <tbl:header 
272              subclass="icons" 
273              />
274            <tbl:propertyfilter />
275          </tbl:headerrow>
276          <tbl:columnsubtitles />
277        </tbl:headers>
278        <tbl:rows>
279          <%
280          if (cc.getMessage() != null)
281          {
282            %>
283            <tbl:panel subclass="bg-filled-50">
284              <div class="messagecontainer error"><%=cc.getMessage()%></div>
285            </tbl:panel>
286            <%
287            cc.setMessage(null);
288          }
289          int index = cc.getPage()*cc.getRowsPerPage();
290          if (allItems != null)
291          {
292            for (Ownable item : allItems)
293            {
294              BasicItem basicItem = (BasicItem)item;
295              boolean isRemoved = false;
296              boolean isShared = false;
297              boolean sharePermission = item.hasPermission(Permission.SET_PERMISSION);
298              int itemId = item.getId();
299              boolean deletePermission = item.hasPermission(Permission.DELETE);
300              String name = "";
301              String description = "";
302              if (item instanceof File)
303              {
304                File file = (File)item;
305                name = file.getPath().toString();
306                description = file.getDescription();
307              }
308              else if (item instanceof Directory)
309              {
310                Directory dir = (Directory)item;
311                name = dir.getPath().toString();
312                description = dir.getDescription();
313              }
314              else if (item instanceof Nameable)
315              {
316                Nameable nameable = (Nameable)item;
317                name = nameable.getName();
318                description = nameable.getDescription();
319              }
320              else
321              {
322                name = item.toString();
323              }
324              if (item instanceof Removable)
325              {
326                isRemoved = ((Removable)item).isRemoved();
327              }
328              if (item instanceof Shareable)
329              {
330                isShared = ((Shareable)item).isShared();
331              }
332              String link = Base.getLink(ID, HTML.encodeTags(name), item.getType(), itemId, true);
333              index++;
334              numListed++;
335              %>
336              <tbl:row>
337                <tbl:header 
338                  clazz="index"
339                  ><%=index%></tbl:header>
340                <tbl:header 
341                  clazz="check" 
342                  ><input 
343                    type="checkbox" 
344                    name="item:<%=item.getType().name()%>" 
345                    value="<%=itemId%>"
346                  ></tbl:header>
347                <tbl:header 
348                  clazz="icons" 
349                  ><base:icon 
350                    image="deleted.png"
351                    id="<%="delete."+itemId %>"
352                    subclass="<%=deletePermission ? "table-delete-item" : "disabled" %>"
353                    data-item-type="<%=item.getType().name()%>"
354                    data-item-id="<%=itemId%>"
355                    tooltip="This item has been marked for deletion" 
356                    visible="<%=isRemoved%>"
357                  /><base:icon 
358                    image="shared.png" 
359                    id="<%="share."+itemId %>"
360                    subclass="<%=sharePermission ? "table-share-item" : "disabled" %>"
361                    data-item-type="<%=item.getType().name()%>"
362                    data-item-id="<%=itemId%>"
363                    tooltip="This item is shared to other users, groups and/or projects" 
364                    visible="<%=isShared%>"
365                  />&nbsp;</tbl:header>
366                <tbl:cell column="type"><%=item.getType()%></tbl:cell>
367                <tbl:cell column="name"><%=link%></tbl:cell>
368                <tbl:cell column="id"><%=item.getId()%></tbl:cell>
369                <tbl:cell column="itemSubtype"><%
370                if (item instanceof Subtypable)
371                {
372                  %><base:propertyvalue item="<%=item%>" property="itemSubtype" /><%
373                }
374                %></tbl:cell>
375                <tbl:cell column="description"><%=HTML.encodeTags(description)%></tbl:cell>
376                <tbl:cell column="sharedTo">
377                  <%
378                  if (item instanceof SharedItem)
379                  {
380                    Iterator<Nameable> sharees = ShareableUtil.getSharedTo(dc, (SharedItem)item).iterator();
381                    while(sharees.hasNext())
382                    {
383                      Nameable n = sharees.next();
384                      if (mode.hasPropertyLink())
385                      {
386                        out.write(Base.getLinkedName(ID, n, false, mode.hasEditLink()));
387                      }
388                      else
389                      {
390                        out.write(HTML.encodeTags(n.getName()));
391                      }
392                      out.write(sharees.hasNext() ? ", " : "");
393                    }
394                  }
395                  %>
396                </tbl:cell>
397                <tbl:xt-cells dc="<%=dc%>" item="<%=item%>">
398                  <tbl:cell column="xt-columns" />
399                </tbl:xt-cells>
400              </tbl:row>
401              <%
402              }
403            }
404          if (numListed == 0)
405          {
406            %>
407            <tbl:panel subclass="bg-filled-50">
408              <div class="messagecontainer note">
409              <%=allItems == null || allItems.size() == 0 ? "No items were found" : "No items on this page. Please select another page!" %>
410              </div>
411            </tbl:panel>
412            <%
413          }
414          %>
415        </tbl:rows>
416      </tbl:data>
417    </tbl:table>
418    </div>
419  </base:body>
420  </base:page>
421  <%
422}
423finally
424{
425  if (dc != null) dc.close();
426}
427%>
Note: See TracBrowser for help on using the repository browser.