source: branches/3.18-stable/www/my_base/projects/items/list_items.jsp @ 7932

Last change on this file since 7932 was 7932, checked in by Nicklas Nordborg, 14 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: 14.0 KB
Line 
1<%-- $Id: list_items.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, 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.Project"
34  import="net.sf.basedb.core.BasicItem"
35  import="net.sf.basedb.core.Shareable"
36  import="net.sf.basedb.core.SharedItem"
37  import="net.sf.basedb.core.Nameable"
38  import="net.sf.basedb.core.Removable"
39  import="net.sf.basedb.core.File"
40  import="net.sf.basedb.core.Directory"
41  import="net.sf.basedb.core.Metadata"
42  import="net.sf.basedb.core.Subtypable"
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.PermissionUtil"
53  import="net.sf.basedb.clients.web.util.HTML"
54  import="net.sf.basedb.util.Values"
55  import="net.sf.basedb.clients.web.extensions.ExtensionsControl"
56  import="net.sf.basedb.clients.web.extensions.JspContext"
57  import="net.sf.basedb.clients.web.extensions.renderer.PrefixSuffixRenderer"
58  import="net.sf.basedb.clients.web.extensions.toolbar.ButtonAction" 
59  import="net.sf.basedb.clients.web.extensions.toolbar.ToolbarUtil"
60  import="net.sf.basedb.clients.web.extensions.list.ListColumnAction"
61  import="net.sf.basedb.clients.web.extensions.list.ListColumnUtil"
62  import="net.sf.basedb.util.extensions.ExtensionsInvoker"
63  import="java.util.Set"
64  import="java.util.HashSet"
65  import="java.util.Iterator"
66%>
67<%@ taglib prefix="base" uri="/WEB-INF/base.tld" %>
68<%@ taglib prefix="tbl" uri="/WEB-INF/table.tld" %>
69<%@ taglib prefix="t" uri="/WEB-INF/tab.tld" %>
70<%@ taglib prefix="p" uri="/WEB-INF/path.tld" %>
71<%@ taglib prefix="ext" uri="/WEB-INF/extensions.tld" %>
72<%!
73  private static final Item itemType = Item.PROJECT;
74  private static final String subContext = "items";
75
76  private static final Enumeration<String, String> itemTypes = new Enumeration<String, String>();
77  static
78  {
79    for (Item item : Metadata.getShareableItems())
80    {
81      itemTypes.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);
89final int projectId = Values.getInt(request.getParameter("project_id"));
90final int activeProjectId = sc.getActiveProjectId();
91final DbControl dc = sc.newDbControl();
92final ModeInfo mode = ModeInfo.get(request.getParameter("mode"));
93ResultList<Shareable> items = null;
94try
95{
96  String filterItem = cc.getPropertyValue("type");
97  Project project = Project.getById(dc, projectId);
98  try
99  {
100    Set<Item> itemTypes = null; 
101    if (filterItem != null)
102    {
103      itemTypes = new HashSet<Item>();
104      for (String name : filterItem.split("\\|"))
105      {
106        itemTypes.add(Item.valueOf(name));
107      }
108    }
109   
110    Restriction id = cc.getFilterRestriction("id", dc, null);
111    Restriction sharedTo = cc.getFilterRestriction("!sharedTo.name", dc, null);
112    Restriction owner = cc.getFilterRestriction("owner.name", dc, null);
113    Restriction name = Restrictions.conditionalRestriction(new ReturnClassFilter(Nameable.class),
114      cc.getFilterRestriction("name", dc, null), null, true);
115    Restriction description = Restrictions.conditionalRestriction(new ReturnClassFilter(Nameable.class),
116      cc.getFilterRestriction("description", dc, null), null, true);
117    Restriction subtype = Restrictions.conditionalRestriction(new ReturnClassFilter(Subtypable.class),
118      cc.getFilterRestriction("itemSubtype.name", dc, null), null, true);
119   
120    Restriction restriction = Restrictions.nullSafeAnd(sharedTo, owner, name, description, subtype, id);
121    items = project.getItems(itemTypes, 
122      cc.getPage() * cc.getRowsPerPage(), cc.getRowsPerPage(), cc.getItemPermission(),
123      cc.getInclude(), restriction);
124  }
125  catch (Throwable t)
126  {
127    cc.setMessage(t.getMessage());
128  }
129  int numListed = 0;
130  JspContext jspContext = ExtensionsControl.createContext(dc, pageContext, null, project);
131  ExtensionsInvoker<ButtonAction> invoker = ExtensionsControl.useExtensions(jspContext, 
132      "net.sf.basedb.clients.web.toolbar.list.all", 
133      "net.sf.basedb.clients.web.toolbar.list.projectitems");
134  ExtensionsInvoker<ListColumnAction<BasicItem, ?>> columnsInvoker = ExtensionsControl.useExtensions(jspContext, 
135      "net.sf.basedb.clients.web.listcolumn.projectitems");
136  %>
137  <base:page id="list-page">
138  <base:head scripts="table.js,tabcontrol-2.js,~items.js" styles="table.css,toolbar.css,headertabcontrol.css,path.css">
139    <ext:scripts context="<%=jspContext%>" />
140    <ext:stylesheets context="<%=jspContext%>" />
141  </base:head>
142 
143  <base:body>
144    <p:path><p:pathelement 
145      title="Projects" href="<%="../index.jsp?ID="+ID%>" 
146      /><p:pathelement title="<%=HTML.encodeTags(project.getName())%>" 
147      /></p:path>
148    <div id="page-data" data-project-id="<%=projectId%>"></div>
149
150    <t:tabcontrol 
151      id="main" 
152      subclass="mastertabcontrol content"
153      active="items">
154    <t:tab id="properties" title="Properties" />
155   
156    <t:tab id="items" title="Items">
157    <tbl:table 
158      id="items" 
159      columns="<%=cc.getSetting("columns")%>"
160      action="index.jsp"
161      sc="<%=sc%>"
162      item="<%=itemType%>"
163      subcontext="<%=subContext%>"
164      subclass="fulltable sticky-headers"
165      data-no-linkeditem-columns="1"
166      >
167      <tbl:hidden
168        name="project_id"
169        value="<%=Integer.toString(projectId)%>"
170      />
171      <tbl:columndef
172        id="type"
173        property="type"
174        datatype="string"
175        title="Item type"
176        enumeration="<%=itemTypes%>"
177        filterable="true"
178        show="always"
179      />
180      <tbl:columndef 
181        id="name"
182        title="Name"
183        show="always" 
184        filterable="true"
185        filterproperty="name"
186        datatype="string"
187      />
188      <tbl:columndef
189        id="itemSubtype"
190        property="itemSubtype.name"
191        datatype="string"
192        title="Subtype"
193        filterable="true"
194      />
195      <tbl:columndef 
196        id="id"
197        property="id"
198        datatype="int"
199        title="ID"
200        filterable="true"
201      />
202      <tbl:columndef 
203        id="owner"
204        title="Owner"
205        property="owner.name"
206        datatype="string"
207        filterable="true"
208      />
209      <tbl:columndef 
210        id="description"
211        title="Description"
212        property="description"
213        filterable="true"
214        datatype="string"
215      />
216      <tbl:columndef
217        id="permission"
218        title="Permission"
219      />
220      <tbl:columndef
221        id="sharedTo"
222        title="Shared to"
223        filterable="true"
224        filterproperty="!sharedTo.name"
225        datatype="string"
226      />
227      <tbl:columndef 
228        id="xt-columns" 
229        extensions="<%=columnsInvoker%>" 
230        jspcontext="<%=jspContext%>" 
231      />
232      <div class="panelgroup bg-filled-50 bottomborder">
233        <tbl:toolbar subclass="bottomborder">
234          <tbl:button 
235            id="btnDeleteItems"
236            image="delete.png"
237            title="Delete" 
238            tooltip="Delete the selected items" 
239          />
240          <tbl:button 
241            id="btnRestoreItems"
242            image="restore.png"
243            title="Restore" 
244            tooltip="Restore the selected items"
245          />
246          <tbl:button 
247            id="btnShareItems"
248            image="share.png"
249            title="Share&hellip;" 
250            tooltip="Share the selected items"
251          />
252          <tbl:button 
253            id="btnSetOwner"
254            image="take_ownership.png"
255            title="Set owner&hellip;"
256            tooltip="Change owner of the selected items"
257          />
258          <tbl:button 
259            id="btnColumns"
260            image="columns.png" 
261            title="Columns&hellip;" 
262            tooltip="Show, hide and re-order columns" 
263          />
264          <ext:render extensions="<%=invoker%>" context="<%=jspContext%>" 
265            wrapper="<%=new PrefixSuffixRenderer<ButtonAction>(jspContext, "<td>", "</td>") %>"/>
266        </tbl:toolbar>
267        <tbl:panel>
268          <tbl:presetselector 
269            disablesharedto="true"
270            disableothers="<%=projectId != activeProjectId%>"
271          />
272          <tbl:navigator
273            page="<%=cc.getPage()%>" 
274            rowsperpage="<%=cc.getRowsPerPage()%>" 
275            totalrows="<%=items == null ? 0 : items.getTotalCount()%>"
276          />
277        </tbl:panel>
278      </div>
279      <tbl:data>
280        <tbl:headers>
281          <tbl:headerrow>
282            <tbl:header colspan="3" />
283            <tbl:columnheaders />
284          </tbl:headerrow>
285          <tbl:headerrow>
286            <tbl:header subclass="index" />
287            <tbl:header 
288              subclass="check" 
289              ><base:icon 
290                subclass="link table-check"
291                image="check_uncheck.png" 
292                tooltip="Toggle all (use CTRL, ALT or SHIFT to check/uncheck)" 
293                data-regexp="item:"
294              /></tbl:header>
295            <tbl:header 
296              subclass="icons"
297              />
298            <tbl:propertyfilter />
299          </tbl:headerrow>
300          <tbl:columnsubtitles />
301        </tbl:headers>
302        <tbl:rows>
303          <%
304          if (projectId != activeProjectId)
305          {
306            %>
307            <tbl:panel subclass="bg-filled-50">
308              <div class="messagecontainer error" style="cursor: pointer;"
309                title="Click to make this project the active project">
310              This project is not the active project. The list can't display items
311              that are owned by other members of the project.
312              </div>
313            </tbl:panel>
314            <%
315          }
316          if (cc.getMessage() != null)
317          {
318            %>
319            <tbl:panel subclass="bg-filled-50">
320              <div class="messagecontainer error"><%=cc.getMessage()%></div>
321            </tbl:panel>
322            <%
323            cc.setMessage(null);
324          }
325          int index = cc.getPage()*cc.getRowsPerPage();
326          if (items != null)
327          {
328            for (Shareable item : items)
329            {
330              BasicItem basicItem = (BasicItem)item;
331              int itemId = item.getId();
332              boolean removed = item instanceof Removable && ((Removable)item).isRemoved();
333              boolean deletePermission = item.hasPermission(Permission.DELETE);
334              String name = "";
335              String description = "";
336              if (item instanceof File)
337              {
338                File file = (File)item;
339                name = file.getPath().toString();
340                description = file.getDescription();
341              }
342              else if (item instanceof Directory)
343              {
344                Directory dir = (Directory)item;
345                name = dir.getPath().toString();
346                description = dir.getDescription();
347              }
348              else if (item instanceof Nameable)
349              {
350                Nameable nameable = (Nameable)item;
351                name = nameable.getName();
352                description = nameable.getDescription();
353              }
354              else
355              {
356                name = item.toString();
357              }
358              String link = Base.getLink(ID, HTML.encodeTags(name), item.getType(), itemId, true);
359              index++;
360              numListed++;
361              %>
362              <tbl:row>
363                <tbl:header 
364                  clazz="index"
365                  ><%=index%></tbl:header>
366                <tbl:header 
367                  clazz="check" 
368                  ><input 
369                    type="checkbox" 
370                    name="item:<%=item.getType().name()%>" 
371                    value="<%=itemId%>"
372                  ></tbl:header>
373                <tbl:header 
374                  clazz="icons" 
375                  ><base:icon 
376                    image="deleted.png"
377                    id="<%="delete."+itemId %>"
378                    subclass="<%=deletePermission ? "table-delete-item" : "disabled" %>"
379                    data-item-type="<%=item.getType().name() %>"
380                    data-item-id="<%=itemId%>"
381                    tooltip="This item has been scheduled for deletion" 
382                    visible="<%=removed%>"
383                    />&nbsp;</tbl:header>
384                <tbl:cell column="type"><%=item.getType()%></tbl:cell>
385                <tbl:cell column="name"><%=link%></tbl:cell>
386                <tbl:cell column="id"><%=item.getId()%></tbl:cell>
387                <tbl:cell column="owner"><base:propertyvalue item="<%=item%>" property="owner" /></tbl:cell>
388                <tbl:cell column="description"><%=HTML.encodeTags(description)%></tbl:cell>
389                <tbl:cell column="permission"><%=PermissionUtil.getShortPermissions(item)%></tbl:cell>
390                <tbl:cell column="itemSubtype"><%
391                if (item instanceof Subtypable)
392                {
393                  %><base:propertyvalue item="<%=item%>" property="itemSubtype" /><%
394                }
395                %></tbl:cell>
396                <tbl:cell column="sharedTo">
397                  <%
398                  if (item instanceof SharedItem)
399                  {
400                    Iterator<Nameable> sharees = ShareableUtil.getSharedTo(dc, (SharedItem)item).iterator();
401                    while(sharees.hasNext())
402                    {
403                      Nameable n = sharees.next();
404                      if (mode.hasPropertyLink())
405                      {
406                        out.write(Base.getLinkedName(ID, n, false, mode.hasEditLink()));
407                      }
408                      else
409                      {
410                        out.write(HTML.encodeTags(n.getName()));
411                      }
412                      out.write(sharees.hasNext() ? ", " : "");
413                    }
414                  }
415                  %>
416                </tbl:cell>
417                <tbl:xt-cells dc="<%=dc%>" item="<%=item%>">
418                  <tbl:cell column="xt-columns" />
419                </tbl:xt-cells>
420              </tbl:row>
421              <%
422              }
423            }
424          if (numListed == 0)
425          {
426            %>
427            <tbl:panel subclass="bg-filled-50">
428              <div class="messagecontainer note">
429              <%=items == null || items.size() == 0 ? "No items were found" : "No items on this page. Please select another page!" %>
430              </div>
431            </tbl:panel>
432            <%
433          }
434          %>
435        </tbl:rows>
436      </tbl:data>
437    </tbl:table>
438    </t:tab>
439    </t:tabcontrol>
440  </base:body>
441  </base:page>
442  <%
443}
444finally
445{
446  if (dc != null) dc.close();
447}
448%>
Note: See TracBrowser for help on using the repository browser.