source: trunk/www/my_base/projects/items/list_items.jsp @ 5948

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

References #1655: GUI improvements

Started with the list pages. So far the reporters and the biosurce, sample and extract list pages have been done. The other pages have just been modified to not cause any compilation problems and to display almost ok.

  • Property svn:eol-style set to native
  • Property svn:keywords set to Date Id
File size: 14.1 KB
Line 
1<%-- $Id: list_items.jsp 5948 2012-02-08 13:16: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, 140);
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>
200    <p:path>
201      <p:pathelement title="Projects" href="<%="../index.jsp?ID="+ID%>" />
202      <p:pathelement title="<%=HTML.encodeTags(project.getName())%>" />
203    </p:path>
204
205    <t:tabcontrol id="main" active="items" switch="switchTab">
206    <t:tab id="properties" title="Properties" />
207   
208    <t:tab id="items" title="Items">
209
210    <%
211    if (cc.getMessage() != null)
212    {
213      %>
214      <div class="error"><%=cc.getMessage()%></div>
215      <%
216      cc.setMessage(null);
217    }
218    %>
219    <tbl:table 
220      id="items" 
221       
222      columns="<%=cc.getSetting("columns")%>"
223      action="index.jsp"
224      sc="<%=sc%>"
225      item="<%=itemType%>"
226      subcontext="<%=subContext%>"
227      >
228      <tbl:hidden
229        name="project_id"
230        value="<%=Integer.toString(projectId)%>"
231      />
232      <tbl:columndef
233        id="type"
234        property="type"
235        datatype="string"
236        title="Item type"
237        enumeration="<%=itemTypes%>"
238        filterable="true"
239        show="always"
240      />
241      <tbl:columndef 
242        id="name"
243        title="Name"
244        show="always" 
245        filterable="true"
246        filterproperty="name"
247        datatype="string"
248      />
249      <tbl:columndef 
250        id="id"
251        property="id"
252        datatype="int"
253        title="ID"
254        filterable="true"
255      />
256      <tbl:columndef 
257        id="owner"
258        title="Owner"
259        property="owner.name"
260        datatype="string"
261        filterable="true"
262      />
263      <tbl:columndef 
264        id="description"
265        title="Description"
266        property="description"
267        filterable="true"
268        datatype="string"
269      />
270      <tbl:columndef
271        id="permission"
272        title="Permission"
273      />
274      <tbl:columndef
275        id="sharedTo"
276        title="Shared to"
277        filterable="true"
278        filterproperty="!sharedTo.name"
279        datatype="string"
280      />
281      <tbl:toolbar>
282        <tbl:button 
283          image="delete.png"
284          onclick="deleteItems()" 
285          title="Delete" 
286          tooltip="Delete the selected items" 
287        />
288        <tbl:button 
289          image="restore.png"
290          onclick="restoreItems()" 
291          title="Restore" 
292          tooltip="Restore the selected items"
293        />
294        <tbl:button 
295          image="share.png"
296          onclick="shareItems()" 
297          title="Share&hellip;" 
298          tooltip="Share the selected items"
299        />
300        <tbl:button 
301          image="take_ownership.png"
302          onclick="setOwner()" 
303          title="Set owner&hellip;"
304          tooltip="Change owner of the selected items"
305        />
306        <tbl:button 
307          image="columns.png" 
308          onclick="configureColumns()" 
309          title="Columns&hellip;" 
310          tooltip="Show, hide and re-order columns" 
311        />
312        <ext:render extensions="<%=invoker%>" context="<%=jspContext%>" 
313          wrapper="<%=new PrefixSuffixRenderer(jspContext, "<td>", "</td>") %>"/>
314      </tbl:toolbar>
315      <%
316      if (projectId != activeProjectId)
317      {
318        %>
319        <tbl:panel>
320          <div class="error" onclick="setToActive()" style="cursor: pointer;"
321            title="Click to make this project the active project">
322          This project is not the active project. The list can't display items
323          that are owned by other members of the project.
324          </div>
325        </tbl:panel>
326        <%
327      }
328      %>
329      <tbl:presetselector 
330        onchange="presetOnChange()"
331        disablesharedto="true"
332        disableothers="<%=projectId != activeProjectId%>"
333      />
334      <tbl:navigator
335        page="<%=cc.getPage()%>" 
336        rowsperpage="<%=cc.getRowsPerPage()%>" 
337        totalrows="<%=items == null ? 0 : items.getTotalCount()%>"
338      />
339      <tbl:data>
340        <tbl:headers>
341          <tbl:headerrow>
342            <tbl:header colspan="3" />
343            <tbl:columnheaders />
344          </tbl:headerrow>
345          <tbl:headerrow>
346            <tbl:header subclass="index" />
347            <tbl:header 
348              subclass="check" 
349              ><base:icon 
350                image="check_uncheck.png" 
351                tooltip="Check/uncheck all" 
352                onclick="Forms.checkUncheck(document.forms[formId])" 
353              /></tbl:header>
354            <tbl:header 
355              subclass="icons"
356              />
357            <tbl:propertyfilter />
358          </tbl:headerrow>
359        </tbl:headers>
360        <tbl:rows>
361          <%
362          int index = cc.getPage()*cc.getRowsPerPage();
363          if (items != null)
364          {
365            for (Shareable item : items)
366            {
367              BasicItem basicItem = (BasicItem)item;
368              int itemId = item.getId();
369              boolean removed = item instanceof Removable && ((Removable)item).isRemoved();
370              String deletePermanently = "deleteItemPermanently('" + item.getType().name() + "', "+itemId+")";
371              boolean deletePermission = item.hasPermission(Permission.DELETE);
372              String name = "";
373              String description = "";
374              if (item instanceof File)
375              {
376                File file = (File)item;
377                name = file.getPath().toString();
378                description = file.getDescription();
379              }
380              else if (item instanceof Directory)
381              {
382                Directory dir = (Directory)item;
383                name = dir.getPath().toString();
384                description = dir.getDescription();
385              }
386              else if (item instanceof Nameable)
387              {
388                Nameable nameable = (Nameable)item;
389                name = nameable.getName();
390                description = nameable.getDescription();
391              }
392              else
393              {
394                name = item.toString();
395              }
396              String link = Base.getLink(ID, HTML.encodeTags(name), item.getType(), itemId, true);
397              index++;
398              numListed++;
399              %>
400              <tbl:row>
401                <tbl:header 
402                  clazz="index"
403                  ><%=index%></tbl:header>
404                <tbl:header 
405                  clazz="check" 
406                  ><input 
407                    type="checkbox" 
408                    name="item:<%=item.getType().name()%>" 
409                    value="<%=itemId%>"
410                  ></tbl:header>
411                <tbl:header 
412                  clazz="icons" 
413                  ><base:icon 
414                    image="deleted.png"
415                    onclick="<%=deletePermission ? deletePermanently : null%>"
416                    tooltip="This item has been scheduled for deletion" 
417                    visible="<%=removed%>"
418                    />&nbsp;</tbl:header>
419                <tbl:cell column="type"><%=item.getType()%></tbl:cell>
420                <tbl:cell column="name"><%=link%></tbl:cell>
421                <tbl:cell column="id"><%=item.getId()%></tbl:cell>
422                <tbl:cell column="owner"><base:propertyvalue item="<%=item%>" property="owner" /></tbl:cell>
423                <tbl:cell column="description"><%=HTML.encodeTags(description)%></tbl:cell>
424                <tbl:cell column="permission"><%=PermissionUtil.getShortPermissions(item)%></tbl:cell>
425                <tbl:cell column="sharedTo">
426                  <%
427                  if (item instanceof SharedItem)
428                  {
429                    Iterator<Nameable> sharees = ShareableUtil.getSharedTo(dc, (SharedItem)item).iterator();
430                    while(sharees.hasNext())
431                    {
432                      Nameable n = sharees.next();
433                      if (mode.hasPropertyLink())
434                      {
435                        out.write(Base.getLinkedName(ID, n, false, mode.hasEditLink()));
436                      }
437                      else
438                      {
439                        out.write(HTML.encodeTags(n.getName()));
440                      }
441                      out.write(sharees.hasNext() ? ", " : "");
442                    }
443                  }
444                  %>
445                </tbl:cell>
446              </tbl:row>
447              <%
448              }
449            }
450          %>
451          </tbl:rows>
452      </tbl:data>
453      <%
454      if (numListed == 0)
455      {
456        %>
457        <tbl:panel><%=items == null || items.size() == 0 ? "No items were found" : "No items on this page. Please select another page!" %></tbl:panel>
458        <%
459      }
460      else
461      {
462        %>
463        <tbl:navigator
464          page="<%=cc.getPage()%>" 
465          rowsperpage="<%=cc.getRowsPerPage()%>" 
466          totalrows="<%=items == null ? 0 : items.getTotalCount()%>" 
467          locked="true"
468        />
469        <%
470      }
471      %>
472    </tbl:table>
473
474    </t:tab>
475    </t:tabcontrol>
476
477  </base:body>
478  </base:page>
479  <%
480}
481finally
482{
483  if (dc != null) dc.close();
484}
485%>
Note: See TracBrowser for help on using the repository browser.