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