source: trunk/www/views/items/list_items.jsp @ 5952

Last change on this file since 5952 was 5952, checked in by Nicklas Nordborg, 10 years ago

References #1655: GUI improvements

List page in the View menu

  • Property svn:eol-style set to native
  • Property svn:keywords set to Date Id
File size: 13.8 KB
Line 
1<%-- $Id: list_items.jsp 5952 2012-02-10 12:27:27Z 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.File"
40  import="net.sf.basedb.core.Directory"
41  import="net.sf.basedb.core.Metadata"
42  import="net.sf.basedb.core.PropertyFilter"
43  import="net.sf.basedb.core.query.ResultList"
44  import="net.sf.basedb.core.query.Restriction"
45  import="net.sf.basedb.core.query.Restrictions"
46  import="net.sf.basedb.util.Enumeration"
47  import="net.sf.basedb.util.ShareableUtil"
48  import="net.sf.basedb.clients.web.Base"
49  import="net.sf.basedb.clients.web.ModeInfo"
50  import="net.sf.basedb.clients.web.util.HTML"
51  import="net.sf.basedb.util.Values"
52  import="net.sf.basedb.clients.web.extensions.ExtensionsControl"
53  import="net.sf.basedb.clients.web.extensions.JspContext"
54  import="net.sf.basedb.clients.web.extensions.renderer.PrefixSuffixRenderer"
55  import="net.sf.basedb.clients.web.extensions.toolbar.ToolbarUtil"
56  import="net.sf.basedb.util.extensions.ExtensionsInvoker"
57  import="java.util.Set"
58  import="java.util.HashSet"
59  import="java.util.Iterator"
60%>
61<%@ taglib prefix="base" uri="/WEB-INF/base.tld" %>
62<%@ taglib prefix="tbl" uri="/WEB-INF/table.tld" %>
63<%@ taglib prefix="ext" uri="/WEB-INF/extensions.tld" %>
64<%!
65  private static final Item itemType = Item.SYSTEM;
66  private static final String subContext = "allitems";
67
68  private static final Enumeration<String, String> items = new Enumeration<String, String>();
69  static
70  {
71    for (Item item : Metadata.getOwnableItems())
72    {
73      items.add(item.name(), item.toString());
74    }
75  }
76%>
77<%
78final SessionControl sc = Base.getExistingSessionControl(pageContext, true);
79final String ID = sc.getId();
80final ItemContext cc = Base.getAndSetCurrentContext(sc, itemType, subContext, null, null);
81final ModeInfo mode = ModeInfo.get(request.getParameter("mode"));
82final DbControl dc = sc.newDbControl();
83ResultList<Ownable> allItems = null;
84try
85{
86  long totalCount = 0;
87  try
88  {
89    String filterItem = cc.getPropertyValue("type");
90    Set<Item> itemTypes = null;
91    if (filterItem != null)
92    {
93      itemTypes = new HashSet<Item>();
94      for (String name : filterItem.split("\\|"))
95      {
96        itemTypes.add(Item.valueOf(name));
97      }
98    }
99    Restriction sharedTo = cc.getFilterRestriction("!sharedTo.name", dc, null);
100    Restriction name = cc.getFilterRestriction("name", dc, null);
101    Restriction description = cc.getFilterRestriction("description", dc, null);
102    Restriction id = cc.getFilterRestriction("id", dc, null);
103    Restriction restriction = Restrictions.nullSafeAnd(sharedTo, name, description, id);
104    if (sharedTo != null) 
105    {
106      // If we filter on "Shared to" we must make sure to only
107      // include Shareable items in the query
108      if (itemTypes != null)
109      {
110        itemTypes.retainAll(Metadata.getShareableItems());
111      }
112      else
113      {
114        itemTypes = Metadata.getShareableItems();
115      }
116    }
117    User loggedInUser = User.getById(dc, sc.getLoggedInUserId());
118    if (itemTypes == null || itemTypes.size() > 0)
119    {
120      allItems = loggedInUser.getItems(itemTypes, cc.getPage() * cc.getRowsPerPage(), 
121          cc.getRowsPerPage(), null, restriction);
122    }
123    totalCount = allItems.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 invoker = ExtensionsControl.useExtensions(jspContext, 
132      "net.sf.basedb.clients.web.toolbar.list.all", 
133      "net.sf.basedb.clients.web.toolbar.list.allitems");
134  %>
135  <base:page title="All items">
136  <base:head scripts="menu.js,table.js" styles="menu.css,table.css,toolbar.css">
137    <ext:scripts context="<%=jspContext%>" />
138    <ext:stylesheets context="<%=jspContext%>" />
139    <script language="JavaScript">
140    var submitPage = 'index.jsp';
141    var formId = 'allItems';
142    function itemOnClick(evt, itemId)
143    {
144      viewItem(itemId);
145    }
146    function deleteAllItems()
147    {
148      if (!confirm('You are about to PERMANENTLY DELETE all item.\n This can\'t be undone. Continue?'))
149      {
150        return;
151      }
152      var frm = document.forms[formId];
153      frm.action = submitPage;
154      frm.cmd.value = 'DeleteAllPermanently';
155      frm.submit();
156    }
157    function deleteItems()
158    {
159      var frm = document.forms[formId];
160      var numChecked = Forms.numChecked(frm, /item:/);
161      if (numChecked == 0)
162      {
163        alert('Please select at least one item in the list');
164        return;
165      }
166      frm.action = submitPage;
167      frm.cmd.value = 'DeleteItems';
168      frm.submit();
169    }
170    function restoreItems()
171    {
172      var frm = document.forms[formId];
173      if (Forms.numChecked(frm, /item:/) == 0)
174      {
175        alert('Please select at least one item in the list');
176        return;
177      }
178      frm.action = submitPage;
179      frm.cmd.value = 'RestoreItems';
180      frm.submit();
181    }
182    function deleteItemPermanently(itemType, itemId)
183    {
184      Main.deleteItemPermanently('<%=ID%>', true, itemType, itemId);
185    }
186    function shareItem(itemType, itemId)
187    {
188      Main.openPopup('index.jsp?ID=<%=ID%>&cmd=ShareItem&&item_type='+itemType+'&item_id='+itemId, 'ShareItem', 600, 400);
189    }
190    function shareItems()
191    {
192      Table.shareItems(submitPage, '<%=ID%>', formId, '<%=itemType.name()%>', 'ShareItems', /item:/);
193    }
194    function setOwner()
195    {
196      Table.setOwnerOfItems(submitPage, '<%=ID%>', formId, '<%=itemType.name()%>', 'SetOwnerOfItems', /item:/);
197    }
198    function configureColumns()
199    {
200      Table.configureColumns('<%=ID%>', formId, '<%=itemType.name()%>', '<%=(String)cc.getObject("defaultColumns")%>', '<%=subContext%>');
201    }
202    function presetOnChange()
203    {
204      Table.presetOnChange('<%=ID%>', formId, '<%=itemType.name()%>', '<%=(String)cc.getObject("defaultColumns")%>', '<%=subContext%>');
205    }
206    </script>
207  </base:head>
208 
209  <base:body>
210    <h1>All items</h1>
211    <div class="content">
212    <tbl:table 
213      id="allItems" 
214      columns="<%=cc.getSetting("columns")%>"
215      action="index.jsp"
216      sc="<%=sc%>"
217      item="<%=itemType%>"
218      subcontext="<%=subContext%>"
219      subclass="fulltable"
220      >
221      <tbl:columndef
222        id="type"
223        property="type"
224        datatype="string"
225        title="Item type"
226        enumeration="<%=items%>"
227        filterable="true"
228        show="always"
229      />
230      <tbl:columndef 
231        id="name"
232        title="Name"
233        property="name"
234        filterable="true"
235        datatype="string"
236        show="always" 
237      />
238      <tbl:columndef 
239        id="id"
240        property="id"
241        datatype="int"
242        title="ID"
243        filterable="true"
244      />
245      <tbl:columndef 
246        id="description"
247        title="Description"
248        property="description"
249        filterable="true"
250        datatype="string"
251      />
252      <tbl:columndef
253        id="sharedTo"
254        title="Shared to"
255        filterable="true"
256        filterproperty="!sharedTo.name"
257        datatype="string"
258      />
259      <div class="panelgroup bottomborder">
260        <tbl:toolbar subclass="bottomborder">
261          <tbl:button 
262            image="delete.png"
263            onclick="deleteItems()" 
264            title="Delete" 
265            tooltip="Mark the selected items for deletion" 
266            disabled="<%=totalCount <= 0%>"
267          />
268          <tbl:button 
269            image="restore.png"
270            onclick="restoreItems()" 
271            title="Restore" 
272            tooltip="Restore the selected items"
273            disabled="<%=totalCount <= 0%>"
274          />
275          <tbl:button 
276            image="share.png"
277            onclick="shareItems()" 
278            title="Share&hellip;" 
279            tooltip="Share the selected items"
280            disabled="<%=totalCount <= 0%>"
281          />
282          <tbl:button 
283            image="take_ownership.png"
284            onclick="setOwner()" 
285            title="Set owner&hellip;"
286            tooltip="Change owner of the selected items"
287          />
288          <tbl:button 
289            image="columns.png" 
290            onclick="configureColumns()" 
291            title="Columns&hellip;" 
292            tooltip="Show, hide and re-order columns" 
293          />
294          <ext:render extensions="<%=invoker%>" context="<%=jspContext%>" 
295            wrapper="<%=new PrefixSuffixRenderer(jspContext, "<td>", "</td>") %>"/>
296        </tbl:toolbar>
297        <tbl:panel>
298          <tbl:presetselector 
299            onchange="presetOnChange()"
300          />
301          <tbl:navigator
302            page="<%=cc.getPage()%>" 
303            rowsperpage="<%=cc.getRowsPerPage()%>" 
304            totalrows="<%=allItems == null ? 0 : allItems.getTotalCount()%>"
305          />
306        </tbl:panel>
307      </div>
308      <tbl:data>
309        <tbl:headers>
310          <tbl:headerrow>
311            <tbl:header colspan="3" />
312            <tbl:columnheaders />
313          </tbl:headerrow>
314          <tbl:headerrow>
315            <tbl:header subclass="index" />
316            <tbl:header 
317              subclass="check" 
318              ><base:icon 
319                image="check_uncheck.png" 
320                tooltip="Check/uncheck all" 
321                onclick="Forms.checkUncheck(document.forms[formId])" 
322              /></tbl:header>
323            <tbl:header 
324              subclass="check" 
325              visible="<%=mode.hasRadio()%>"
326              />
327            <tbl:header 
328              subclass="icons" 
329              />
330            <tbl:propertyfilter />
331          </tbl:headerrow>
332        </tbl:headers>
333        <tbl:rows>
334          <%
335          if (cc.getMessage() != null)
336          {
337            %>
338            <tbl:panel clazz="messagepanel">
339              <div class="messagecontainer error"><%=cc.getMessage()%></div>
340            </tbl:panel>
341            <%
342            cc.setMessage(null);
343          }
344          int index = cc.getPage()*cc.getRowsPerPage();
345          if (allItems != null)
346          {
347            for (Ownable item : allItems)
348            {
349              BasicItem basicItem = (BasicItem)item;
350              boolean isRemoved = false;
351              boolean isShared = false;
352              boolean sharePermission = item.hasPermission(Permission.SET_PERMISSION);
353              int itemId = item.getId();
354              String openSharePopup = "shareItem('" + item.getType().name() + "', "+itemId+")";
355              String deletePermanently = "deleteItemPermanently('" + item.getType().name() + "', "+itemId+")";
356              boolean deletePermission = item.hasPermission(Permission.DELETE);
357              String name = "";
358              String description = "";
359              if (item instanceof File)
360              {
361                File file = (File)item;
362                name = file.getPath().toString();
363                description = file.getDescription();
364              }
365              else if (item instanceof Directory)
366              {
367                Directory dir = (Directory)item;
368                name = dir.getPath().toString();
369                description = dir.getDescription();
370              }
371              else if (item instanceof Nameable)
372              {
373                Nameable nameable = (Nameable)item;
374                name = nameable.getName();
375                description = nameable.getDescription();
376              }
377              else
378              {
379                name = item.toString();
380              }
381              if (item instanceof Removable)
382              {
383                isRemoved = ((Removable)item).isRemoved();
384              }
385              if (item instanceof Shareable)
386              {
387                isShared = ((Shareable)item).isShared();
388              }
389              String link = Base.getLink(ID, HTML.encodeTags(name), item.getType(), itemId, true);
390              index++;
391              numListed++;
392              %>
393              <tbl:row>
394                <tbl:header 
395                  clazz="index"
396                  ><%=index%></tbl:header>
397                <tbl:header 
398                  clazz="check" 
399                  ><input 
400                    type="checkbox" 
401                    name="item:<%=item.getType().name()%>" 
402                    value="<%=itemId%>"
403                  ></tbl:header>
404                <tbl:header 
405                  clazz="icons" 
406                  ><base:icon 
407                    image="deleted.png"
408                    onclick="<%=deletePermission ? deletePermanently : null%>"
409                    tooltip="This item has been marked for deletion" 
410                    visible="<%=isRemoved%>"
411                  /><base:icon 
412                    image="shared.png" 
413                    onclick="<%=sharePermission ? openSharePopup : null%>"
414                    tooltip="This item is shared to other users, groups and/or projects" 
415                    visible="<%=isShared%>"
416                  />&nbsp;</tbl:header>
417                <tbl:cell column="type"><%=item.getType()%></tbl:cell>
418                <tbl:cell column="name"><%=link%></tbl:cell>
419                <tbl:cell column="id"><%=item.getId()%></tbl:cell>
420                <tbl:cell column="description"><%=HTML.encodeTags(description)%></tbl:cell>
421                <tbl:cell column="sharedTo">
422                  <%
423                  if (item instanceof SharedItem)
424                  {
425                    Iterator<Nameable> sharees = ShareableUtil.getSharedTo(dc, (SharedItem)item).iterator();
426                    while(sharees.hasNext())
427                    {
428                      Nameable n = sharees.next();
429                      if (mode.hasPropertyLink())
430                      {
431                        out.write(Base.getLinkedName(ID, n, false, mode.hasEditLink()));
432                      }
433                      else
434                      {
435                        out.write(HTML.encodeTags(n.getName()));
436                      }
437                      out.write(sharees.hasNext() ? ", " : "");
438                    }
439                  }
440                  %>
441                </tbl:cell>
442              </tbl:row>
443              <%
444              }
445            }
446          if (numListed == 0)
447          {
448            %>
449            <tbl:panel clazz="messagepanel">
450              <div class="messagecontainer note">
451              <%=allItems == null || allItems.size() == 0 ? "No items were found" : "No items on this page. Please select another page!" %>
452              </div>
453            </tbl:panel>
454            <%
455          }
456          %>
457        </tbl:rows>
458      </tbl:data>
459    </tbl:table>
460    </div>
461  </base:body>
462  </base:page>
463  <%
464}
465finally
466{
467  if (dc != null) dc.close();
468}
469%>
Note: See TracBrowser for help on using the repository browser.