source: trunk/www/admin/diskusage/details/view_details.jsp @ 5948

Last change on this file since 5948 was 5948, checked in by Nicklas Nordborg, 11 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: 17.0 KB
Line 
1<%-- $Id: view_details.jsp 5948 2012-02-08 13:16:27Z nicklas $
2  ------------------------------------------------------------------
3  Copyright (C) 2006 Nicklas Nordborg
4  Copyright (C) 2007 Johan Enell
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.SystemItems"
30  import="net.sf.basedb.core.BasicItem"
31  import="net.sf.basedb.core.Item"
32  import="net.sf.basedb.core.Location"
33  import="net.sf.basedb.core.ItemContext"
34  import="net.sf.basedb.core.Permission"
35  import="net.sf.basedb.core.DiskUsage"
36  import="net.sf.basedb.core.DiskUsageStatistics"
37  import="net.sf.basedb.core.DiskConsumable"
38  import="net.sf.basedb.core.Quota"
39  import="net.sf.basedb.core.User"
40  import="net.sf.basedb.core.Group"
41  import="net.sf.basedb.core.Nameable"
42  import="net.sf.basedb.core.Removable"
43  import="net.sf.basedb.core.File"
44  import="net.sf.basedb.core.QuotaType"
45  import="net.sf.basedb.core.Metadata"
46  import="net.sf.basedb.core.PermissionDeniedException"
47  import="net.sf.basedb.core.PluginDefinition"
48  import="net.sf.basedb.core.ItemQuery"
49  import="net.sf.basedb.core.ItemResultIterator"
50  import="net.sf.basedb.core.Include"
51  import="net.sf.basedb.core.Quantity"
52  import="net.sf.basedb.core.Unit"
53  import="net.sf.basedb.util.Enumeration"
54  import="net.sf.basedb.core.query.Orders"
55  import="net.sf.basedb.core.query.Hql"
56  import="net.sf.basedb.core.plugin.GuiContext"
57  import="net.sf.basedb.core.plugin.Plugin"
58  import="net.sf.basedb.util.units.UnitUtil"
59  import="net.sf.basedb.clients.web.Base"
60  import="net.sf.basedb.clients.web.PermissionUtil"
61  import="net.sf.basedb.clients.web.util.HTML"
62  import="net.sf.basedb.util.Values"
63  import="net.sf.basedb.clients.web.extensions.ExtensionsControl"
64  import="net.sf.basedb.clients.web.extensions.JspContext"
65  import="net.sf.basedb.clients.web.extensions.renderer.PrefixSuffixRenderer"
66  import="net.sf.basedb.clients.web.extensions.toolbar.ToolbarUtil"
67  import="net.sf.basedb.util.extensions.ExtensionsInvoker"
68  import="java.util.Map"
69  import="java.util.List"
70%>
71<%@ taglib prefix="base" uri="/WEB-INF/base.tld" %>
72<%@ taglib prefix="tbl" uri="/WEB-INF/table.tld" %>
73<%@ taglib prefix="t" uri="/WEB-INF/tab.tld" %>
74<%@ taglib prefix="p" uri="/WEB-INF/path.tld" %>
75<%@ taglib prefix="ext" uri="/WEB-INF/extensions.tld" %>
76<%!
77  private static final String subContext = "diskUsage";
78  private static final Enumeration<String, String> itemTypes = new Enumeration<String, String>();
79  static
80  {
81    for (Item item : Metadata.getDiskConsumableItems())
82    {
83      itemTypes.add(String.valueOf(item.getValue()), item.toString());
84    }
85  }
86  private static final Enumeration<String, String> locations = new Enumeration<String, String>();
87  static
88  {
89    for (Location l : Location.values())
90    {
91      locations.add(String.valueOf(l.getValue()), l.toString());
92    }
93  }
94%>
95<%
96final SessionControl sc = Base.getExistingSessionControl(pageContext, true);
97final String ID = sc.getId();
98final Item itemType = Item.valueOf(request.getParameter("item_type"));
99final ItemContext cc = Base.getAndSetCurrentContext(sc, itemType, subContext, null, null);
100final int itemId = cc.getId();
101final float scale = Base.getScale(sc);
102final DbControl dc = sc.newDbControl();
103ItemResultIterator<DiskUsage> diskUsage = null;
104try
105{
106  Unit bytes = UnitUtil.getUnit(dc, Quantity.STORAGE_SIZE, "B");
107  String title = null;
108  User user = null;
109  Group group = null;
110  boolean writePermission = false;
111  final boolean hasDiskUsagePermission = sc.hasPermission(Permission.READ, Item.DISKUSAGE);
112  DiskUsageStatistics statistics = (DiskUsageStatistics)sc.getSessionSetting("diskUsageStatistics");
113  String returnCmd = null;
114  if (statistics == null)
115  {
116    statistics = DiskUsage.getStatistics(dc);
117    sc.setSessionSetting("diskUsageStatistics", statistics);
118  }
119  statistics.setDbControl(dc);
120  List<QuotaType> quotaTypes = statistics.getQuotaTypes();
121  DiskUsageStatistics.Summary summary = null;
122  if (itemType == Item.USER)
123  {
124    user = User.getById(dc, itemId);
125    title = user.getName() + " (user)";
126    writePermission = user.hasPermission(Permission.WRITE);
127    summary = statistics.getSummary(user);
128    returnCmd = "ListUsers";
129  }
130  else
131  {
132    group = Group.getById(dc, itemId);
133    title = group.getName() + " (group)";
134    writePermission = group.hasPermission(Permission.WRITE);
135    summary = statistics.getSummary(group);
136    returnCmd = "ListGroups";
137  }
138  long totalCount = 0;
139  int numListed = 0;
140  try
141  {
142    final ItemQuery<DiskUsage> query = Base.getConfiguredQuery(dc, cc, true, DiskUsage.getQuery(user, group), null);
143    diskUsage = query.iterate(dc);
144    totalCount = diskUsage.getTotalCount();
145  }
146  catch (Throwable t)
147  {
148    cc.setMessage(t.getMessage());
149  }
150  JspContext jspContext = ExtensionsControl.createContext(dc, pageContext, 
151      GuiContext.list(Item.DISKUSAGE), user == null ? group : user);
152  ExtensionsInvoker invoker = ToolbarUtil.useExtensions(jspContext);
153  %>
154  <base:page >
155  <base:head scripts="table.js,tabcontrol.js" styles="toolbar.css,table.css,headertabcontrol.css,path.css">
156    <ext:scripts context="<%=jspContext%>" />
157    <ext:stylesheets context="<%=jspContext%>" />
158    <script language="JavaScript">
159    var formId = 'items';
160    var submitPage = 'index.jsp';
161    function editItem()
162    {
163      Main.viewOrEditItem('<%=ID%>', '<%=itemType.name()%>', <%=itemId%>, true);
164    }
165    function configureColumns()
166    {
167      Table.configureColumns('<%=ID%>', formId, '<%=itemType.name()%>', '<%=(String)cc.getObject("defaultColumns")%>', '<%=subContext%>');
168    }
169    function presetOnChange()
170    {
171      Table.presetOnChange('<%=ID%>', formId, '<%=itemType.name()%>', '<%=(String)cc.getObject("defaultColumns")%>', '<%=subContext%>');
172    }
173    function deleteItems()
174    {
175      var frm = document.forms[formId];
176      if (Forms.numChecked(frm, /item:/) == 0)
177      {
178        alert('Please select at least one item in the list');
179        return;
180      }
181      frm.action = submitPage;
182      frm.cmd.value = 'DeleteItems';
183      frm.submit();
184    }
185    function restoreItems()
186    {
187      var frm = document.forms[formId];
188      if (Forms.numChecked(frm, /item:/) == 0)
189      {
190        alert('Please select at least one item in the list');
191        return;
192      }
193      frm.action = submitPage;
194      frm.cmd.value = 'RestoreItems';
195      frm.submit();
196    }
197    function shareItems()
198    {
199      Table.shareItems(submitPage, '<%=ID%>', formId, '<%=itemType.name()%>', 'ShareItems', /item:/);
200    }
201    </script>
202  </base:head>
203  <base:body>
204    <p>
205    <p:path>
206      <p:pathelement title="Disk usage" enabled="<%=hasDiskUsagePermission%>"
207        href="<%="../index.jsp?ID="+ID+"&cmd="+returnCmd%>" />
208      <p:pathelement title="<%=HTML.encodeTags(title)%>" />
209    </p:path>
210   
211    <t:tabcontrol id="main">
212    <t:tab id="details" title="Details">
213   
214    <tbl:toolbar
215      >
216      <tbl:button 
217        disabled="<%=!writePermission%>" 
218        image="edit.png" 
219        onclick="editItem()" 
220        title="Edit&hellip;" 
221        tooltip="<%=writePermission ? "Edit this item" : "You do not have permission to edit this item"%>" 
222      />
223      <ext:render extensions="<%=invoker%>" context="<%=jspContext%>" 
224        wrapper="<%=new PrefixSuffixRenderer(jspContext, "<td>", "</td>") %>"/>
225      <tbl:button
226        image="help.png"
227        onclick="<%="Main.openHelp('" + ID +"', 'diskusage.details')"%>"
228        title="Help&hellip;"
229        tooltip="Get help about this page"
230      />
231      </tbl:toolbar>
232    <div class="boxedbottom">
233
234    <table>
235    <tr >
236    <td width="50%">
237      <%
238      if (user != null)
239      {
240        %>
241        <table class="form" cellspacing=0>
242        <tr >
243          <td class="prompt" width="10%">Name</td>
244          <td width="40%"><%=Base.getLinkedName(ID, user, false, true)%></td>
245        </tr>
246        <tr >
247          <td class="prompt">Quota</td>
248          <td><base:propertyvalue item="<%=user%>" property="quota" /></td>
249        </tr>
250        <tr >
251          <td class="prompt">Quota group</td>
252          <td><base:propertyvalue item="<%=user%>" property="quotaGroup" /></td>
253        </tr>
254        <tr >
255          <td class="prompt">Description</td>
256          <td><%=HTML.niceFormat(user.getDescription())%></td>
257        </tr>
258        </table>
259        <%
260      }
261      else if (group != null)
262      {
263        %>
264        <table class="form" cellspacing=0>
265        <tr >
266          <td class="prompt" width="10%">Name</td>
267          <td width="40%"><%=Base.getLinkedName(ID, group, false, true)%></td>
268        </tr>
269        <tr >
270          <td class="prompt">Quota</td>
271          <td><base:propertyvalue item="<%=group%>" property="quota" /></td>
272        </tr>
273        <tr >
274          <td class="prompt">Description</td>
275          <td><%=HTML.niceFormat(group.getDescription())%></td>
276        </tr>
277        </table>
278        <%
279      }
280      %>
281    </td>
282    <td width="50%">
283      <%
284      long total = summary.getTotal();
285      %>
286      <table border="0" cellspacing="0" cellpadding="2">
287      <tr>
288        <th>&nbsp;</th>
289        <th style="text-align: right;">Total</th>
290        <th style="text-align: right;">&nbsp;&nbsp;Primary</th>
291        <th style="text-align: right;">&nbsp;&nbsp;Secondary</th>
292        <th style="text-align: right;">&nbsp;&nbsp;Offline</th>
293        <th style="text-align: right;">&nbsp;&nbsp;External</th>
294      </tr>
295      <tr>
296        <td colspan="6" style="border-bottom: 1px dotted #999999"></td>
297      </tr>   
298      <tr style="background: #E0E0E0;">
299        <th>Total</th>
300        <td style="text-align: right;"><%=Values.formatBytes(total)%></td>
301        <td style="text-align: right;"><%=Values.formatBytes(summary.getTotal(Location.PRIMARY))%></td>
302        <td style="text-align: right;"><%=Values.formatBytes(summary.getTotal(Location.SECONDARY))%></td>
303        <td style="text-align: right;"><%=Values.formatBytes(summary.getTotal(Location.OFFLINE))%></td>
304        <td style="text-align: right;"><%=Values.formatBytes(summary.getTotal(Location.EXTERNAL))%></td>
305      </tr>
306      <tr>
307        <td colspan="6" style="border-top: 1px dotted #999999"></td>
308      </tr>   
309      <%
310      for (QuotaType qt : quotaTypes)
311      {
312        %>
313        <tr>
314          <th><%=HTML.encodeTags(qt.getName())%></th>
315          <td style="text-align: right;"><%=Values.formatBytes(summary.getTotal(qt))%></td>
316          <td style="text-align: right;"><%=Values.formatBytes(summary.getTotal(qt, Location.PRIMARY))%></td>
317          <td style="text-align: right;"><%=qt.hasSecondaryLocation() ? Values.formatBytes(summary.getTotal(qt, Location.SECONDARY)) : "n/a"%></td>
318          <td style="text-align: right;"><%=Values.formatBytes(summary.getTotal(qt, Location.OFFLINE))%></td>         
319          <td style="text-align: right;"><%=Values.formatBytes(summary.getTotal(qt, Location.EXTERNAL))%></td>         
320        </tr>
321        <%
322      }
323      %>
324      </table>
325    </td>
326    </tr>
327    </table>
328
329      <h4 class="docked">Disk consuming items</h4>
330      <%
331      if (cc.getMessage() != null)
332      {
333        %>
334        <div class="error"><%=HTML.encodeTags(cc.getMessage())%></div>
335        <%
336        cc.setMessage(null);
337      }
338      %>
339      <tbl:table 
340        id="items" 
341         
342        columns="<%=cc.getSetting("columns")%>"
343        sortby="<%=cc.getSortProperty()%>" 
344        direction="<%=cc.getSortDirection()%>"
345        action="index.jsp"
346        sc="<%=sc%>"
347        item="<%=itemType%>"
348        subcontext="<%=subContext%>"
349        >
350        <tbl:hidden
351          name="item_type"
352          value="<%=itemType.name()%>"
353        />
354        <tbl:columndef
355          id="type"
356          property="itemType"
357          datatype="int"
358          title="Item type"
359          enumeration="<%=itemTypes%>"
360          filterable="true"
361          sortable="true"
362          show="always"
363        />
364        <tbl:columndef 
365          id="name"
366          title="Name"
367          show="always" 
368        />
369        <tbl:columndef 
370          id="bytes"
371          property="bytes"
372          datatype="long"
373          title="Bytes"
374          sortable="true"
375          filterable="true"
376          exportable="true"
377          unit="<%=bytes%>"
378        />
379        <tbl:columndef 
380          id="location"
381          property="location"
382          datatype="int"
383          title="Location"
384          enumeration="<%=locations%>"
385          filterable="true"
386          sortable="true"
387        />
388        <tbl:columndef 
389          id="owner"
390          property="user.name"
391          datatype="string"
392          title="Owner"
393          sortable="true" 
394          filterable="true"
395          exportable="true"
396        />
397        <tbl:columndef 
398          id="group"
399          property="group.name"
400          datatype="string"
401          title="Group"
402          sortable="true" 
403          filterable="true"
404          exportable="true"
405        />
406        <tbl:columndef 
407          id="description"
408          title="Description"
409        />
410        <tbl:toolbar>
411          <tbl:button 
412            image="delete.png"
413            onclick="deleteItems()" 
414            title="Delete" 
415            tooltip="Mark the selected items for deletion" 
416            disabled="<%=totalCount <= 0%>"
417          />
418          <tbl:button 
419            image="restore.png"
420            onclick="restoreItems()" 
421            title="Restore" 
422            tooltip="Restore the selected items"
423            disabled="<%=totalCount <= 0%>"
424          />
425          <tbl:button 
426            image="share.png"
427            onclick="shareItems()" 
428            title="Share&hellip;" 
429            tooltip="Share the selected items"
430            disabled="<%=totalCount <= 0%>"
431          />
432          <tbl:button 
433            image="columns.png" 
434            onclick="configureColumns()" 
435            title="Columns&hellip;" 
436            tooltip="Show, hide and re-order columns" 
437          />
438        </tbl:toolbar>
439            <tbl:presetselector 
440              clazz="columnheader"
441              onchange="presetOnChange()"
442              disableremoved="true"
443            />
444        <tbl:navigator
445          page="<%=cc.getPage()%>" 
446          rowsperpage="<%=cc.getRowsPerPage()%>" 
447          totalrows="<%=totalCount%>"
448        />     
449        <tbl:data>
450          <tbl:headers>
451            <tbl:headerrow>
452              <tbl:header subclass="index" />
453              <tbl:header 
454                subclass="check"
455                ><base:icon 
456                image="check_uncheck.png" 
457                  tooltip="Check/uncheck all" 
458                  onclick="Forms.checkUncheck(document.forms[formId])" 
459                /></tbl:header>
460              <tbl:header 
461                subclass="icons" 
462                />
463              <tbl:propertyfilter />
464            </tbl:headerrow>
465          </tbl:headers>
466          <tbl:rows>
467          <%
468          int index = cc.getPage()*cc.getRowsPerPage();
469          if (diskUsage != null)
470          {
471            while (diskUsage.hasNext())
472            {
473              DiskUsage du = diskUsage.next();
474              DiskConsumable item = null;
475              boolean hasReadPermission = true;
476              boolean hasWritePermission = false;
477              boolean isRemoved = false;
478              int consumableId = 0;
479              try
480              {
481                item = du.getItem();
482                consumableId = item.getId();
483                hasWritePermission = item.hasPermission(Permission.WRITE);
484              }
485              catch (PermissionDeniedException ex)
486              {
487                hasReadPermission = false;
488              }
489              String name = "";
490              String description = "";
491              if (item instanceof File)
492              {
493                File file = (File)item;
494                name = file.getPath().toString();
495                description = file.getDescription();
496              }
497              else if (item instanceof Nameable)
498              {
499                Nameable nameable = (Nameable)item;
500                name = nameable.getName();
501                description = nameable.getDescription();
502              }
503              else if (item != null)
504              {
505                name = item.toString();
506              }
507              if (item instanceof Removable)
508              {
509                isRemoved = ((Removable)item).isRemoved();
510              }
511              String link = hasReadPermission ? 
512                Base.getLink(ID, HTML.encodeTags(name), du.getItemType(), 
513                consumableId, hasWritePermission) : "<i>- denied -</i>";
514              index++;
515              numListed++;
516              %>
517              <tbl:row>
518                <tbl:header 
519                  clazz="index"
520                  ><%=index%></tbl:header>
521                <tbl:header 
522                  clazz="check" 
523                  ><input 
524                    type="checkbox" 
525                    name="item:<%=du.getItemType().name()%>" 
526                    value="<%=consumableId%>"
527                  ></tbl:header>
528                <tbl:header 
529                  clazz="icons" 
530                  ><base:icon 
531                    image="deleted.png" 
532                    tooltip="This item has been marked for deletion" 
533                    visible="<%=isRemoved%>"
534                  />&nbsp;</tbl:header>
535                <tbl:cell column="type"><%=du.getItemType()%></tbl:cell>
536                <tbl:cell column="name"><%=link%></tbl:cell>
537                <tbl:cell column="bytes"><%=Values.formatBytes(du.getBytes())%></tbl:cell>
538                <tbl:cell column="location"><%=du.getLocation()%></tbl:cell>
539                <tbl:cell column="owner"><base:propertyvalue item="<%=du%>" property="user" /></tbl:cell>
540                <tbl:cell column="group"><base:propertyvalue item="<%=du%>" property="group" /></tbl:cell>
541                <tbl:cell column="description"><%=HTML.encodeTags(description)%></tbl:cell>
542              </tbl:row>
543              <%
544              }
545            }
546          %>
547          </tbl:rows>
548        </tbl:data>
549        <%
550        if (numListed == 0)
551        {
552          %>
553          <tbl:panel><%=totalCount == 0 ? "No items were found" : "No items on this page. Please select another page!" %></tbl:panel>
554          <%
555        }
556        else
557        {
558          %>
559          <tbl:navigator
560            page="<%=cc.getPage()%>" 
561            rowsperpage="<%=cc.getRowsPerPage()%>" 
562            totalrows="<%=totalCount%>" 
563            locked="true"
564          />
565          <%
566        }
567        %>     
568      </tbl:table>
569    </div>
570    </t:tab>
571    </t:tabcontrol>
572
573  </base:body>
574  </base:page>
575  <%
576}
577finally
578{
579  if (dc != null) dc.close();
580}
581
582%>
Note: See TracBrowser for help on using the repository browser.