source: trunk/www/admin/diskusage/list_groups.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.

File size: 15.6 KB
Line 
1<%-- $Id$
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.Application"
30  import="net.sf.basedb.core.Item"
31  import="net.sf.basedb.core.Group"
32  import="net.sf.basedb.core.Role"
33  import="net.sf.basedb.core.Type"
34  import="net.sf.basedb.core.ItemQuery"
35  import="net.sf.basedb.core.Include"
36  import="net.sf.basedb.core.ItemResultIterator"
37  import="net.sf.basedb.core.ItemResultList"
38  import="net.sf.basedb.core.ItemContext"
39  import="net.sf.basedb.core.Permission"
40  import="net.sf.basedb.core.PluginDefinition"
41  import="net.sf.basedb.core.DiskUsage"
42  import="net.sf.basedb.core.DiskUsageStatistics"
43  import="net.sf.basedb.core.QuotaType"
44  import="net.sf.basedb.core.Location"
45  import="net.sf.basedb.core.query.Orders"
46  import="net.sf.basedb.core.query.Hql"
47  import="net.sf.basedb.core.query.Restrictions"
48  import="net.sf.basedb.core.query.Expressions"
49  import="net.sf.basedb.core.plugin.GuiContext"
50  import="net.sf.basedb.core.plugin.Plugin"
51  import="net.sf.basedb.util.Enumeration"
52  import="net.sf.basedb.clients.web.Base"
53  import="net.sf.basedb.clients.web.ModeInfo"
54  import="net.sf.basedb.clients.web.PermissionUtil"
55  import="net.sf.basedb.clients.web.util.HTML"
56  import="net.sf.basedb.util.Values"
57  import="net.sf.basedb.clients.web.extensions.ExtensionsControl"
58  import="net.sf.basedb.clients.web.extensions.JspContext"
59  import="net.sf.basedb.clients.web.extensions.renderer.PrefixSuffixRenderer"
60  import="net.sf.basedb.clients.web.extensions.toolbar.ToolbarUtil"
61  import="net.sf.basedb.util.extensions.ExtensionsInvoker"
62  import="java.util.List"
63  import="java.util.Map"
64%>
65<%@ taglib prefix="base" uri="/WEB-INF/base.tld" %>
66<%@ taglib prefix="tbl" uri="/WEB-INF/table.tld" %>
67<%@ taglib prefix="t" uri="/WEB-INF/tab.tld" %>
68<%@ taglib prefix="ext" uri="/WEB-INF/extensions.tld" %>
69<%!
70  private static final Item itemType = Item.DISKUSAGE;
71  private static final String subContext = "perGroup";
72  private static final GuiContext guiContext = new GuiContext(itemType, GuiContext.Type.LIST, subContext);
73%>
74<%
75final SessionControl sc = Base.getExistingSessionControl(pageContext, Permission.DENIED, itemType);
76final String ID = sc.getId();
77final ItemContext cc = Base.getAndSetCurrentContext(sc, itemType, subContext, null, null);
78final ModeInfo mode = ModeInfo.get(request.getParameter("mode"));
79final boolean writePermission = sc.hasPermission(Permission.WRITE, Item.GROUP);
80final String showStatistics = Values.getString(cc.getSetting("showStatistics"), 
81  Application.hasSecondaryStorage() ? "full" : "quotaType");
82
83final boolean hasLocation = "location".equals(showStatistics) || "full".equals(showStatistics);
84final boolean hasQuotaType = "quotaType".equals(showStatistics) || "full".equals(showStatistics);
85
86final DbControl dc = sc.newDbControl();
87ItemResultIterator<Group> groups = null;
88try
89{
90  DiskUsageStatistics du = (DiskUsageStatistics)sc.getSessionSetting("diskUsageStatistics");
91  if (du == null)
92  {
93    du = DiskUsage.getStatistics(dc);
94    sc.setSessionSetting("diskUsageStatistics", du);
95  }
96  du.setDbControl(dc);
97  List<QuotaType> quotaTypes = du.getQuotaTypes();
98 
99  try
100  {
101    final ItemQuery<Group> query = Base.getConfiguredQuery(dc, cc, true, Group.getQuery(), mode);
102    query.include(Include.ALL);
103    query.restrict(
104        Restrictions.neq(
105          Hql.property("quota"), null));
106    groups = query.iterate(dc);
107  }
108  catch (Throwable t)
109  {
110    cc.setMessage(t.getMessage());
111  }
112  int numListed = 0;
113  JspContext jspContext = ExtensionsControl.createContext(dc, pageContext, guiContext, null);
114  ExtensionsInvoker invoker = ToolbarUtil.useExtensions(jspContext);
115  %>
116  <base:page title="Disk usage">
117  <base:head scripts="table.js,tabcontrol.js" styles="table.css,toolbar.css,headertabcontrol.css">
118    <ext:scripts context="<%=jspContext%>" />
119    <ext:stylesheets context="<%=jspContext%>" />
120    <script language="JavaScript">
121    var submitPage = 'index.jsp';
122    var formId = 'groups';
123    function editItem(itemId)
124    {
125      Main.viewOrEditItem('<%=ID%>', 'GROUP', itemId, true);
126    }
127    function viewItem(itemId)
128    {
129      Main.viewOrEditItem('<%=ID%>', 'GROUP', itemId, false);
130    }
131    function itemOnClick(evt, itemId)
132    {
133      Table.itemOnClick(formId, evt, itemId, '<%=mode.getName()%>', viewItem, editItem);
134    }
135    function configureColumns()
136    {
137      Table.configureColumns('<%=ID%>', formId, '<%=itemType.name()%>', '<%=(String)cc.getObject("defaultColumns")%>', '<%=subContext%>');
138    }
139    function presetOnChange()
140    {
141      Table.presetOnChange('<%=ID%>', formId, '<%=itemType.name()%>', '<%=(String)cc.getObject("defaultColumns")%>', '<%=subContext%>');
142    }
143    function setShowStatistics()
144    {
145      document.forms[formId].submit();
146    }
147    function viewDiskUsageDetails(groupId)
148    {
149      location.href = 'details/index.jsp?ID=<%=ID%>&cmd=ViewItem&item_id='+groupId+'&item_type=GROUP';
150    }
151    function switchTab(tabControlId, tabId)
152    {
153      if (tabId == 'overview')
154      {
155        location.href = 'index.jsp?ID=<%=ID%>&cmd=Overview';
156      }
157      else if (tabId == 'users')
158      {
159        location.href = 'index.jsp?ID=<%=ID%>&cmd=ListUsers';
160      }
161      else
162      {
163        TabControl.setActiveTab(tabControlId, tabId);
164      }
165    }   
166    </script>
167  </base:head>
168 
169  <base:body>
170 
171    <t:tabcontrol id="main" active="groups" switch="switchTab">
172    <t:tab id="overview" title="Overview" />
173   
174    <t:tab id="users" title="Per user" />
175   
176    <t:tab id="groups" title="Per group">
177 
178    <%
179    if (cc.getMessage() != null)
180    {
181      %>
182      <div class="error"><%=cc.getMessage()%></div>
183      <%
184      cc.setMessage(null);
185    }
186    %>
187    <tbl:table 
188      id="groups" 
189       
190      columns="<%=cc.getSetting("columns")%>"
191      sortby="<%=cc.getSortProperty()%>" 
192      direction="<%=cc.getSortDirection()%>"
193      action="index.jsp"
194      sc="<%=sc%>"
195      item="<%=itemType%>"
196      subcontext="<%=subContext%>"
197      >
198      <tbl:hidden 
199        name="subcontext"
200        value="<%=subContext%>"
201      />
202      <tbl:columndef 
203        id="name"
204        property="name"
205        datatype="string"
206        title="Name"
207        sortable="true" 
208        filterable="true"
209        exportable="true"
210        show="always" 
211      />
212      <tbl:columndef 
213        id="id"
214        clazz="uniquecol"
215        property="id"
216        datatype="int"
217        title="ID"
218        sortable="true"
219        filterable="true"
220        exportable="true"
221      />
222      <tbl:columndef
223        id="diskUsage"
224        title="Disk usage summary"
225        show="always"
226      />
227      <tbl:columndef 
228        id="quota"
229        property="quota.name"
230        datatype="string"
231        title="Quota"
232        sortable="true" 
233        filterable="true"
234        exportable="true"
235      />
236      <tbl:toolbar
237        visible="<%=mode.hasToolbar()%>"
238        >
239        <tbl:button 
240          image="columns.png" 
241          onclick="configureColumns()" 
242          title="Columns&hellip;" 
243          tooltip="Show, hide and re-order columns" 
244        />
245        <ext:render extensions="<%=invoker%>" context="<%=jspContext%>" 
246          wrapper="<%=new PrefixSuffixRenderer(jspContext, "<td>", "</td>") %>"/>
247      </tbl:toolbar>
248      <tbl:panel>
249        <b>Show summary</b>
250        <input type="radio" name="showStatistics" value="total"
251          <%="total".equals(showStatistics) ? "checked" : ""%>
252          onclick="setShowStatistics()"><a
253          href="javascript:document.forms[formId].showStatistics[0].click()">Total only</a>
254        <input type="radio" name="showStatistics" value="location"
255          <%="location".equals(showStatistics) ? "checked" : ""%>
256          onclick="setShowStatistics()"><a
257          href="javascript:document.forms[formId].showStatistics[1].click()">Per location</a>
258        <input type="radio" name="showStatistics" value="quotaType"
259          <%="quotaType".equals(showStatistics) ? "checked" : ""%>
260          onclick="setShowStatistics()"><a
261          href="javascript:document.forms[formId].showStatistics[2].click()">Per quota type</a>
262        <input type="radio" name="showStatistics" value="full"
263          <%="full".equals(showStatistics) ? "checked" : ""%>
264          onclick="setShowStatistics()"><a
265          href="javascript:document.forms[formId].showStatistics[3].click()">Full</a>
266      </tbl:panel>
267      <tbl:navigator
268        page="<%=cc.getPage()%>" 
269        rowsperpage="<%=cc.getRowsPerPage()%>" 
270        totalrows="<%=groups == null ? 0 : groups.getTotalCount()%>" 
271      />
272      <tbl:data>
273        <tbl:headers>
274          <tbl:headerrow>
275            <tbl:header colspan="3" />
276            <tbl:columnheaders />
277          </tbl:headerrow>
278          <tbl:headerrow>
279            <tbl:header subclass="index" />
280            <tbl:header 
281              subclass="check" 
282              visible="<%=mode.hasCheck()%>"
283              ><base:icon 
284                image="check_uncheck.png" 
285                tooltip="Check/uncheck all" 
286                onclick="Forms.checkUncheck(document.forms[formId])" 
287              /></tbl:header>
288            <tbl:header 
289              subclass="check" 
290              visible="<%=mode.hasRadio()%>"
291              />
292            <tbl:header 
293              subclass="icons" 
294              visible="<%=mode.hasIcons()%>"
295              />
296            <tbl:propertyfilter />
297          </tbl:headerrow>
298        </tbl:headers>
299        <tbl:rows>
300          <%
301          int index = cc.getPage()*cc.getRowsPerPage();
302          int selectedItemId = cc.getId();
303          if (groups != null)
304          {           
305            while (groups.hasNext())
306            {
307              Group item = groups.next();
308              int itemId = item.getId();
309              String name = HTML.encodeTags(item.getName());
310              String tooltip = mode.isSelectionMode() ? 
311                  "Select this item" : "View this item" + (writePermission ? " (use CTRL, ALT or SHIFT to edit)" : "");
312              index++;
313              numListed++;
314              %>
315              <tbl:row>
316                <tbl:header 
317                  clazz="index"
318                  ><%=index%></tbl:header>
319                <tbl:header 
320                  clazz="check" 
321                  visible="<%=mode.hasCheck()%>"
322                  ><input 
323                    type="checkbox" 
324                    name="<%=itemId%>" 
325                    value="<%=itemId%>" 
326                    title="<%=name%>" 
327                    <%=cc.getSelected().contains(itemId) ? "checked" : ""%> 
328                  ></tbl:header>
329                <tbl:header 
330                  clazz="check" 
331                  visible="<%=mode.hasRadio()%>"
332                  ><input 
333                    type="radio" 
334                    name="item_id" 
335                    value="<%=itemId%>" 
336                    title="<%=name%>" 
337                    <%=selectedItemId == itemId ? "checked" : ""%>
338                  ></tbl:header>
339                <tbl:header 
340                  clazz="icons" 
341                  visible="<%=mode.hasIcons()%>"
342                  ><base:icon 
343                    image="deleted.png" 
344                    tooltip="This item has been scheduled for deletion" 
345                    visible="<%=item.isRemoved()%>"
346                  />&nbsp;</tbl:header>
347                <tbl:cell column="name"><div class="link" 
348                  onclick="itemOnClick(<%=writePermission ? "event" : null%>, <%=itemId%>)" 
349                  title="<%=tooltip%>"><%=name%></div></tbl:cell>
350                <tbl:cell column="id"><%=item.getId()%></tbl:cell>
351                <tbl:cell column="diskUsage">
352                  <%
353                  DiskUsageStatistics.Summary summary = du.getSummary(item);
354                  long total = summary.getTotal();
355                  if (total > 0 && (hasLocation || hasQuotaType))
356                  {
357                    %>
358                    <table border="0" cellspacing="0" cellpadding="2">
359                    <%
360                    if (hasLocation)
361                    {
362                      %>
363                      <tr>
364                        <%
365                        if (hasQuotaType)
366                        {
367                          %>
368                          <th>&nbsp;</th>
369                          <%
370                        }
371                        %>
372                        <th style="text-align: right;">Total</th>
373                        <td style="text-align: right;">&nbsp;&nbsp;Primary</td>
374                        <td style="text-align: right;">&nbsp;&nbsp;Secondary</td>
375                        <td style="text-align: right;">&nbsp;&nbsp;Offline</td>
376                        <td style="text-align: right;">&nbsp;&nbsp;External</td>
377                      </tr>
378                      <%
379                    }
380                    %>
381                    <tr>
382                      <td colspan="6" style="border-bottom: 1px dotted #999999"></td>
383                    </tr>   
384                    <tr style="background: #E0E0E0;">
385                      <%
386                      if (hasQuotaType)
387                      {
388                        %>
389                        <th>Total</th>
390                        <%
391                      }
392                      %>
393                      <td style="text-align: right;"><%=Values.formatBytes(total)%></td>
394                      <%
395                      if (hasLocation)
396                      {
397                        %>
398                        <td style="text-align: right;"><%=Values.formatBytes(summary.getTotal(Location.PRIMARY))%></td>
399                        <td style="text-align: right;"><%=Values.formatBytes(summary.getTotal(Location.SECONDARY))%></td>
400                        <td style="text-align: right;"><%=Values.formatBytes(summary.getTotal(Location.OFFLINE))%></td>
401                        <td style="text-align: right;"><%=Values.formatBytes(summary.getTotal(Location.EXTERNAL))%></td>
402                        <%
403                      }
404                      %>
405                    </tr>
406                    <tr>
407                      <td colspan="6" style="border-top: 1px dotted #999999"></td>
408                    </tr>   
409                    <%
410                    if (hasQuotaType && total > 0)
411                    {
412                      for (QuotaType qt : quotaTypes)
413                      {
414                        %>
415                        <tr>
416                          <td><%=HTML.encodeTags(qt.getName())%></td>
417                          <td style="text-align: right;"><%=Values.formatBytes(summary.getTotal(qt))%></td>
418                          <%
419                          if (hasLocation)
420                          {
421                            %>
422                            <td style="text-align: right;"><%=Values.formatBytes(summary.getTotal(qt, Location.PRIMARY))%></td>
423                            <td style="text-align: right;"><%=qt.hasSecondaryLocation() ? Values.formatBytes(summary.getTotal(qt, Location.SECONDARY)) : "n/a"%></td>
424                            <td style="text-align: right;"><%=qt.getSystemId().equals(QuotaType.FILE) ? Values.formatBytes(summary.getTotal(qt, Location.OFFLINE)) : "n/a"%></td>
425                            <td style="text-align: right;"><%=qt.getSystemId().equals(QuotaType.FILE) ? Values.formatBytes(summary.getTotal(qt, Location.EXTERNAL)) : "n/a"%></td>
426                            <%
427                          }
428                          %>
429                        </tr>
430                        <%
431                      }
432                    }
433                    %>
434                    </table>
435                    <%
436                  }
437                  else
438                  {
439                    %>
440                    <%=Values.formatBytes(total)%>
441                    <%
442                  }
443                  if (total > 0)
444                  {
445                    %>
446                    <base:icon image="bullet.png" />
447                    <a href="javascript:viewDiskUsageDetails(<%=itemId%>)">View details</a>
448                    <%
449                  }
450                  %>
451                </tbl:cell>
452                <tbl:cell column="quota"
453                  ><base:propertyvalue 
454                    item="<%=item%>" 
455                    property="quota"
456                    enableEditLink="<%=mode.hasEditLink()%>" 
457                    enablePropertyLink="<%=mode.hasPropertyLink()%>"
458                  /></tbl:cell>
459                <tbl:cell column="description"><%=HTML.encodeTags(item.getDescription())%></tbl:cell>
460              </tbl:row>
461              <%
462              }
463            }
464          %>
465          </tbl:rows>
466      </tbl:data>
467      <%
468      if (numListed == 0)
469      {
470        %>
471        <tbl:panel><%=groups == null || groups.getTotalCount() == 0 ? "No groups were found" : "No groups on this page. Please select another page!" %></tbl:panel>
472        <%
473      }
474      else
475      {
476        %>
477        <tbl:navigator
478          page="<%=cc.getPage()%>" 
479          rowsperpage="<%=cc.getRowsPerPage()%>" 
480          totalrows="<%=groups == null ? 0 : groups.getTotalCount()%>" 
481          visible="<%=mode.hasNavigator()%>"
482          locked="true"
483        />
484        <%
485      }
486      %>
487    </tbl:table>
488    </t:tab>
489    </t:tabcontrol>
490
491  </base:body>
492  </base:page>
493  <%
494}
495finally
496{
497  if (groups != null) groups.close();
498  if (dc != null) dc.close();
499}
500%>
Note: See TracBrowser for help on using the repository browser.