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

Last change on this file since 7937 was 7937, checked in by Nicklas Nordborg, 14 months ago

References #2246: Sticky table headers

Implemented for some more list pages.

  • Property svn:eol-style set to native
  • Property svn:keywords set to Date Id
File size: 14.3 KB
Line 
1<%-- $Id: list_items.jsp 7937 2021-04-30 10:57:18Z 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"
165      data-no-linkeditem-columns="1"
166      stickyheaders="name"
167      >
168      <tbl:hidden
169        name="project_id"
170        value="<%=Integer.toString(projectId)%>"
171      />
172      <tbl:columndef
173        id="type"
174        property="type"
175        datatype="string"
176        title="Item type"
177        enumeration="<%=itemTypes%>"
178        filterable="true"
179        show="always"
180      />
181      <tbl:columndef 
182        id="name"
183        title="Name"
184        show="always" 
185        filterable="true"
186        filterproperty="name"
187        datatype="string"
188      />
189      <tbl:columndef
190        id="itemSubtype"
191        property="itemSubtype.name"
192        datatype="string"
193        title="Subtype"
194        filterable="true"
195      />
196      <tbl:columndef 
197        id="id"
198        property="id"
199        datatype="int"
200        title="ID"
201        filterable="true"
202      />
203      <tbl:columndef 
204        id="owner"
205        title="Owner"
206        property="owner.name"
207        datatype="string"
208        filterable="true"
209      />
210      <tbl:columndef 
211        id="description"
212        title="Description"
213        property="description"
214        filterable="true"
215        datatype="string"
216      />
217      <tbl:columndef
218        id="permission"
219        title="Permission"
220      />
221      <tbl:columndef
222        id="sharedTo"
223        title="Shared to"
224        filterable="true"
225        filterproperty="!sharedTo.name"
226        datatype="string"
227      />
228      <tbl:columndef 
229        id="xt-columns" 
230        extensions="<%=columnsInvoker%>" 
231        jspcontext="<%=jspContext%>" 
232      />
233      <div class="panelgroup bg-filled-50 bottomborder">
234        <tbl:toolbar subclass="bottomborder">
235          <tbl:button 
236            id="btnDeleteItems"
237            image="delete.png"
238            title="Delete" 
239            tooltip="Delete the selected items" 
240          />
241          <tbl:button 
242            id="btnRestoreItems"
243            image="restore.png"
244            title="Restore" 
245            tooltip="Restore the selected items"
246          />
247          <tbl:button 
248            id="btnShareItems"
249            image="share.png"
250            title="Share&hellip;" 
251            tooltip="Share the selected items"
252          />
253          <tbl:button 
254            id="btnSetOwner"
255            image="take_ownership.png"
256            title="Set owner&hellip;"
257            tooltip="Change owner of the selected items"
258          />
259          <tbl:button 
260            id="btnColumns"
261            image="columns.png" 
262            title="Columns&hellip;" 
263            tooltip="Show, hide and re-order columns" 
264          />
265          <ext:render extensions="<%=invoker%>" context="<%=jspContext%>" 
266            wrapper="<%=new PrefixSuffixRenderer<ButtonAction>(jspContext, "<td>", "</td>") %>"/>
267        </tbl:toolbar>
268        <tbl:panel>
269          <tbl:presetselector 
270            disablesharedto="true"
271            disableothers="<%=projectId != activeProjectId%>"
272          />
273          <tbl:navigator
274            page="<%=cc.getPage()%>" 
275            rowsperpage="<%=cc.getRowsPerPage()%>" 
276            totalrows="<%=items == null ? 0 : items.getTotalCount()%>"
277          />
278        </tbl:panel>
279      </div>
280      <tbl:data>
281        <tbl:headers>
282          <tbl:headerrow>
283            <tbl:header clazz="row-index bg-filled-100" />
284            <tbl:columnheaders />
285          </tbl:headerrow>
286          <tbl:headerrow>
287            <tbl:header subclass="row-index bg-filled-100">
288              <div class="index-<%=mode.getName()%>">
289                <div class="index"></div>
290                <div class="check">
291                  <base:icon 
292                    subclass="link table-check"
293                    image="check_uncheck.png" 
294                    tooltip="Toggle all (use CTRL, ALT or SHIFT to check/uncheck)" 
295                  />
296                </div>
297                <div class="icons">
298                </div>
299              </div>
300            </tbl:header>
301            <tbl:propertyfilter />
302          </tbl:headerrow>
303          <tbl:columnsubtitles />
304        </tbl:headers>
305        <tbl:rows>
306          <%
307          if (projectId != activeProjectId)
308          {
309            %>
310            <tbl:panel subclass="bg-filled-50">
311              <div class="messagecontainer error" style="cursor: pointer;"
312                title="Click to make this project the active project">
313              This project is not the active project. The list can't display items
314              that are owned by other members of the project.
315              </div>
316            </tbl:panel>
317            <%
318          }
319          if (cc.getMessage() != null)
320          {
321            %>
322            <tbl:panel subclass="bg-filled-50">
323              <div class="messagecontainer error"><%=cc.getMessage()%></div>
324            </tbl:panel>
325            <%
326            cc.setMessage(null);
327          }
328          int index = cc.getPage()*cc.getRowsPerPage();
329          if (items != null)
330          {
331            for (Shareable item : items)
332            {
333              BasicItem basicItem = (BasicItem)item;
334              int itemId = item.getId();
335              boolean removed = item instanceof Removable && ((Removable)item).isRemoved();
336              boolean deletePermission = item.hasPermission(Permission.DELETE);
337              String name = "";
338              String description = "";
339              if (item instanceof File)
340              {
341                File file = (File)item;
342                name = file.getPath().toString();
343                description = file.getDescription();
344              }
345              else if (item instanceof Directory)
346              {
347                Directory dir = (Directory)item;
348                name = dir.getPath().toString();
349                description = dir.getDescription();
350              }
351              else if (item instanceof Nameable)
352              {
353                Nameable nameable = (Nameable)item;
354                name = nameable.getName();
355                description = nameable.getDescription();
356              }
357              else
358              {
359                name = item.toString();
360              }
361              String link = Base.getLink(ID, HTML.encodeTags(name), item.getType(), itemId, true);
362              index++;
363              numListed++;
364              %>
365              <tbl:row>
366                <tbl:header clazz="row-index bg-filled-100">
367                  <div class="index-<%=mode.getName()%>">
368                    <div class="index <%=index>999?"index-smaller":""%>"><%=index%></div>
369                    <div class="check">
370                      <base:input
371                        type="checkbox" 
372                        name="<%="item:"+item.getType().name()%>" 
373                        value="<%=itemId%>" 
374                        title="<%=name%>" 
375                      />
376                    </div>
377                    <div class="icons">
378                      <base:icon 
379                        image="deleted.png"
380                        id="<%="delete."+itemId %>"
381                        subclass="<%=deletePermission ? "table-delete-item" : "disabled" %>"
382                        data-item-type="<%=item.getType().name() %>"
383                        data-item-id="<%=itemId%>"
384                        tooltip="This item has been scheduled for deletion" 
385                        visible="<%=removed%>"
386                      />
387                    </div>
388                  </div>
389                </tbl:header>
390                <tbl:cell column="type"><%=item.getType()%></tbl:cell>
391                <tbl:cell column="name"><%=link%></tbl:cell>
392                <tbl:cell column="id"><%=item.getId()%></tbl:cell>
393                <tbl:cell column="owner"><base:propertyvalue item="<%=item%>" property="owner" /></tbl:cell>
394                <tbl:cell column="description"><%=HTML.encodeTags(description)%></tbl:cell>
395                <tbl:cell column="permission"><%=PermissionUtil.getShortPermissions(item)%></tbl:cell>
396                <tbl:cell column="itemSubtype"><%
397                if (item instanceof Subtypable)
398                {
399                  %><base:propertyvalue item="<%=item%>" property="itemSubtype" /><%
400                }
401                %></tbl:cell>
402                <tbl:cell column="sharedTo">
403                  <%
404                  if (item instanceof SharedItem)
405                  {
406                    Iterator<Nameable> sharees = ShareableUtil.getSharedTo(dc, (SharedItem)item).iterator();
407                    while(sharees.hasNext())
408                    {
409                      Nameable n = sharees.next();
410                      if (mode.hasPropertyLink())
411                      {
412                        out.write(Base.getLinkedName(ID, n, false, mode.hasEditLink()));
413                      }
414                      else
415                      {
416                        out.write(HTML.encodeTags(n.getName()));
417                      }
418                      out.write(sharees.hasNext() ? ", " : "");
419                    }
420                  }
421                  %>
422                </tbl:cell>
423                <tbl:xt-cells dc="<%=dc%>" item="<%=item%>">
424                  <tbl:cell column="xt-columns" />
425                </tbl:xt-cells>
426              </tbl:row>
427              <%
428              }
429            }
430          if (numListed == 0)
431          {
432            %>
433            <tbl:panel subclass="bg-filled-50">
434              <div class="messagecontainer note">
435              <%=items == null || items.size() == 0 ? "No items were found" : "No items on this page. Please select another page!" %>
436              </div>
437            </tbl:panel>
438            <%
439          }
440          %>
441        </tbl:rows>
442      </tbl:data>
443    </tbl:table>
444    </t:tab>
445    </t:tabcontrol>
446  </base:body>
447  </base:page>
448  <%
449}
450finally
451{
452  if (dc != null) dc.close();
453}
454%>
Note: See TracBrowser for help on using the repository browser.