source: trunk/www/admin/diskusage/list_users.jsp @ 5950

Last change on this file since 5950 was 5950, checked in by Nicklas Nordborg, 11 years ago

References #1655: GUI improvements

Fixes the "Disk usage" pages.

File size: 19.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.User"
32  import="net.sf.basedb.core.Group"
33  import="net.sf.basedb.core.Role"
34  import="net.sf.basedb.core.Type"
35  import="net.sf.basedb.core.ItemQuery"
36  import="net.sf.basedb.core.Include"
37  import="net.sf.basedb.core.ItemResultIterator"
38  import="net.sf.basedb.core.ItemResultList"
39  import="net.sf.basedb.core.ItemContext"
40  import="net.sf.basedb.core.Permission"
41  import="net.sf.basedb.core.PluginDefinition"
42  import="net.sf.basedb.core.DiskUsage"
43  import="net.sf.basedb.core.DiskUsageStatistics"
44  import="net.sf.basedb.core.QuotaType"
45  import="net.sf.basedb.core.Location"
46  import="net.sf.basedb.core.query.Orders"
47  import="net.sf.basedb.core.query.Hql"
48  import="net.sf.basedb.core.query.Restrictions"
49  import="net.sf.basedb.core.query.Expressions"
50  import="net.sf.basedb.core.plugin.GuiContext"
51  import="net.sf.basedb.core.plugin.Plugin"
52  import="net.sf.basedb.util.Enumeration"
53  import="net.sf.basedb.clients.web.Base"
54  import="net.sf.basedb.clients.web.ModeInfo"
55  import="net.sf.basedb.clients.web.PermissionUtil"
56  import="net.sf.basedb.clients.web.util.HTML"
57  import="net.sf.basedb.clients.web.formatter.FormatterFactory"
58  import="net.sf.basedb.util.Values"
59  import="net.sf.basedb.clients.web.extensions.ExtensionsControl"
60  import="net.sf.basedb.clients.web.extensions.JspContext"
61  import="net.sf.basedb.clients.web.extensions.renderer.PrefixSuffixRenderer"
62  import="net.sf.basedb.clients.web.extensions.toolbar.ToolbarUtil"
63  import="net.sf.basedb.util.extensions.ExtensionsInvoker"
64  import="java.util.List"
65  import="java.util.Map"
66%>
67<%@ taglib prefix="base" uri="/WEB-INF/base.tld" %>
68<%@ taglib prefix="tbl" uri="/WEB-INF/table.tld" %>
69<%@ taglib prefix="t" uri="/WEB-INF/tab.tld" %>
70<%@ taglib prefix="ext" uri="/WEB-INF/extensions.tld" %>
71<%!
72  private static final Item itemType = Item.DISKUSAGE;
73  private static final String subContext = "perUser";
74  private static final GuiContext guiContext = new GuiContext(itemType, GuiContext.Type.LIST, subContext);
75%>
76<%
77final SessionControl sc = Base.getExistingSessionControl(pageContext, Permission.DENIED, itemType);
78final String ID = sc.getId();
79final ItemContext cc = Base.getAndSetCurrentContext(sc, itemType, subContext, null, null);
80final ModeInfo mode = ModeInfo.get(request.getParameter("mode"));
81final boolean impersonatePermission = sc.hasSystemPermission(Permission.ACT_AS_ANOTHER_USER);
82final boolean writePermission = sc.hasPermission(Permission.WRITE, Item.USER);
83final String showStatistics = Values.getString(cc.getSetting("showStatistics"), 
84  Application.hasSecondaryStorage() ? "full" : "quotaType");
85
86final boolean hasLocation = "location".equals(showStatistics) || "full".equals(showStatistics);
87final boolean hasQuotaType = "quotaType".equals(showStatistics) || "full".equals(showStatistics);
88
89final DbControl dc = sc.newDbControl();
90ItemResultIterator<User> users = null;
91try
92{
93  DiskUsageStatistics du = (DiskUsageStatistics)sc.getSessionSetting("diskUsageStatistics");
94  if (du == null)
95  {
96    du = DiskUsage.getStatistics(dc);
97    sc.setSessionSetting("diskUsageStatistics", du);
98  }
99  du.setDbControl(dc);
100  List<QuotaType> quotaTypes = du.getQuotaTypes();
101 
102  try
103  {
104    final ItemQuery<User> query = Base.getConfiguredQuery(dc, cc, true, User.getQuery(), mode);
105    query.include(Include.ALL);
106    users = 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 = 'users';
123    function editItem(itemId)
124    {
125      Main.viewOrEditItem('<%=ID%>', 'USER', itemId, true);
126    }
127    function viewItem(itemId)
128    {
129      Main.viewOrEditItem('<%=ID%>', 'USER', 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 impersonate(userId)
144    {
145      Main.openPopup('../../impersonate.jsp?ID=<%=ID%>&user_id='+userId, 'Impersonate', 480, 240);
146    }
147    function setShowStatistics()
148    {
149      document.forms[formId].submit();
150    }
151    function viewDiskUsageDetails(userId)
152    {
153      location.href = 'details/index.jsp?ID=<%=ID%>&cmd=ViewItem&item_id='+userId+'&item_type=USER';
154    }
155    function switchTab(tabControlId, tabId)
156    {
157      if (tabId == 'overview')
158      {
159        location.href = 'index.jsp?ID=<%=ID%>&cmd=Overview';
160      }
161      else if (tabId == 'groups')
162      {
163        location.href = 'index.jsp?ID=<%=ID%>&cmd=ListGroups';
164      }
165      else
166      {
167        TabControl.setActiveTab(tabControlId, tabId);
168      }
169    }   
170    </script>
171    <style>
172    table.special
173    {
174      border-collapse: collapse;
175    }
176    table.special td, table.special th
177    {
178      text-align: right;
179      border-right: 1px dotted #A0A0A0;
180      padding: 1px 2px 1px 2px;
181    }
182   
183    </style>
184  </base:head>
185 
186  <base:body>
187    <h1>Disk usage</h1>
188    <t:tabcontrol 
189      id="main" 
190      subclass="mastertabcontrol content" 
191      active="users" switch="switchTab">
192    <t:tab id="overview" title="Overview" />
193    <t:tab id="users" title="Per user">
194    <tbl:table 
195      id="users" 
196      columns="<%=cc.getSetting("columns")%>"
197      sortby="<%=cc.getSortProperty()%>" 
198      direction="<%=cc.getSortDirection()%>"
199      action="index.jsp"
200      sc="<%=sc%>"
201      item="<%=itemType%>"
202      subcontext="<%=subContext%>"
203      subclass="fulltable"
204      >
205      <tbl:hidden 
206        name="subcontext"
207        value="<%=subContext%>"
208      />
209      <tbl:columndef 
210        id="name"
211        property="name"
212        datatype="string"
213        title="Name"
214        sortable="true" 
215        filterable="true"
216        exportable="true"
217        show="always" 
218      />
219      <tbl:columndef 
220        id="id"
221        clazz="uniquecol"
222        property="id"
223        datatype="int"
224        title="ID"
225        sortable="true"
226        filterable="true"
227        exportable="true"
228      />
229      <tbl:columndef
230        id="diskUsage"
231        title="Disk usage summary"
232        show="always"
233      />
234      <tbl:columndef 
235        id="login"
236        clazz="uniquecol"
237        property="login"
238        datatype="string"
239        title="Login"
240        sortable="true" 
241        filterable="true"
242        exportable="true"
243      />
244      <tbl:columndef 
245        id="systemId"
246        clazz="uniquecol"
247        property="systemId"
248        datatype="string"
249        title="System ID"
250        sortable="true"
251        filterable="true"
252        exportable="true"
253      />
254      <tbl:columndef 
255        id="externalId"
256        clazz="uniquecol"
257        property="externalId"
258        datatype="string"
259        title="External ID"
260        sortable="true" 
261        filterable="true"
262        exportable="true"
263      />
264      <tbl:columndef 
265        id="expirationDate"
266        property="expirationDate"
267        datatype="date"
268        title="Expiration date"
269        sortable="true" 
270        filterable="true"
271        exportable="true"
272        formatter="<%=FormatterFactory.getDateFormatter(sc)%>"
273      />
274      <tbl:columndef 
275        id="disabled"
276        property="disabled"
277        datatype="boolean"
278        title="Disabled"
279        sortable="true" 
280        filterable="true"
281        exportable="true"
282      />
283      <tbl:columndef 
284        id="multiuserAccount"
285        property="multiuserAccount"
286        datatype="boolean"
287        title="Multi-user account"
288        sortable="true" 
289        filterable="true"
290        exportable="true"
291      />
292      <tbl:columndef 
293        id="organisation"
294        property="organisation"
295        datatype="string"
296        title="Organisation"
297        sortable="true" 
298        filterable="true"
299        exportable="true"
300      />
301      <tbl:columndef 
302        id="address"
303        property="address"
304        datatype="string"
305        title="Address"
306        sortable="true" 
307        filterable="true"
308        exportable="true"
309      />
310      <tbl:columndef 
311        id="email"
312        property="email"
313        datatype="string"
314        title="Email"
315        sortable="true" 
316        filterable="true"
317        exportable="true"
318      />
319      <tbl:columndef 
320        id="phone"
321        property="phone"
322        datatype="string"
323        title="Phone"
324        sortable="true" 
325        filterable="true"
326        exportable="true"
327      />
328      <tbl:columndef 
329        id="fax"
330        property="fax"
331        datatype="string"
332        title="Fax"
333        sortable="true" 
334        filterable="true"
335        exportable="true"
336      />
337      <tbl:columndef 
338        id="url"
339        property="url"
340        datatype="string"
341        title="Url"
342        sortable="true" 
343        filterable="true"
344        exportable="true"
345      />
346      <tbl:columndef 
347        id="quota"
348        property="quota.name"
349        datatype="string"
350        title="Quota"
351        sortable="true" 
352        filterable="true"
353        exportable="true"
354      />
355      <tbl:columndef 
356        id="quotagroup"
357        property="quotaGroup.name"
358        datatype="string"
359        title="Quota group"
360        sortable="true" 
361        filterable="true"
362        exportable="true"
363      />
364      <tbl:columndef 
365        id="description"
366        property="description"
367        datatype="string"
368        title="Description" 
369        sortable="true" 
370        filterable="true" 
371        exportable="true"
372      />
373      <div class="panelgroup bottomborder">
374        <tbl:toolbar
375          visible="<%=mode.hasToolbar()%>"
376          subclass="bottomborder"
377          >
378          <tbl:button 
379            image="columns.png" 
380            onclick="configureColumns()" 
381            title="Columns&hellip;" 
382            tooltip="Show, hide and re-order columns" 
383          />
384          <ext:render extensions="<%=invoker%>" context="<%=jspContext%>" 
385            wrapper="<%=new PrefixSuffixRenderer(jspContext, "<td>", "</td>") %>"/>
386        </tbl:toolbar>
387        <tbl:panel>
388          <tbl:presetselector 
389            onchange="presetOnChange()"
390          />
391          <tbl:navigator
392            page="<%=cc.getPage()%>" 
393            rowsperpage="<%=cc.getRowsPerPage()%>" 
394            totalrows="<%=users == null ? 0 : users.getTotalCount()%>" 
395          />
396          <b>Show summary</b>
397          <input type="radio" name="showStatistics" value="total"
398            <%="total".equals(showStatistics) ? "checked" : ""%>
399            onclick="setShowStatistics()"><a
400            href="javascript:document.forms[formId].showStatistics[0].click()">Total only</a>
401          <input type="radio" name="showStatistics" value="location"
402            <%="location".equals(showStatistics) ? "checked" : ""%>
403            onclick="setShowStatistics()"><a
404            href="javascript:document.forms[formId].showStatistics[1].click()">Per location</a>
405          <input type="radio" name="showStatistics" value="quotaType"
406            <%="quotaType".equals(showStatistics) ? "checked" : ""%>
407            onclick="setShowStatistics()"><a
408            href="javascript:document.forms[formId].showStatistics[2].click()">Per quota type</a>
409          <input type="radio" name="showStatistics" value="full"
410            <%="full".equals(showStatistics) ? "checked" : ""%>
411            onclick="setShowStatistics()"><a
412            href="javascript:document.forms[formId].showStatistics[3].click()">Full</a>
413        </tbl:panel>
414      </div>
415      <tbl:data>
416        <tbl:headers>
417          <tbl:headerrow>
418            <tbl:header colspan="3" />
419            <tbl:columnheaders />
420          </tbl:headerrow>
421          <tbl:headerrow>
422            <tbl:header subclass="index" />
423            <tbl:header 
424              subclass="check" 
425              visible="<%=mode.hasCheck()%>"
426              ><base:icon 
427                image="check_uncheck.png" 
428                tooltip="Check/uncheck all" 
429                onclick="Forms.checkUncheck(document.forms[formId])" 
430              /></tbl:header>
431            <tbl:header 
432              subclass="check" 
433              visible="<%=mode.hasRadio()%>"
434              />
435            <tbl:header 
436              subclass="icons" 
437              visible="<%=mode.hasIcons()%>"
438              />
439            <tbl:propertyfilter />
440          </tbl:headerrow>
441        </tbl:headers>
442        <tbl:rows>
443          <%
444          if (cc.getMessage() != null)
445          {
446            %>
447            <tbl:panel clazz="messagepanel">
448              <div class="messagecontainer error"><%=cc.getMessage()%></div>
449            </tbl:panel>
450            <%
451            cc.setMessage(null);
452          }
453          int index = cc.getPage()*cc.getRowsPerPage();
454          int selectedItemId = cc.getId();
455          if (users != null)
456          {           
457            while (users.hasNext())
458            {
459              User item = users.next();
460              int itemId = item.getId();
461              String name = HTML.encodeTags(item.getName());
462              String tooltip = mode.isSelectionMode() ? 
463                  "Select this item" : "View this item" + (writePermission ? " (use CTRL, ALT or SHIFT to edit)" : "");
464              index++;
465              numListed++;
466              %>
467              <tbl:row>
468                <tbl:header 
469                  clazz="index"
470                  ><%=index%></tbl:header>
471                <tbl:header 
472                  clazz="check" 
473                  visible="<%=mode.hasCheck()%>"
474                  ><input 
475                    type="checkbox" 
476                    name="<%=itemId%>" 
477                    value="<%=itemId%>" 
478                    title="<%=name%>" 
479                    <%=cc.getSelected().contains(itemId) ? "checked" : ""%> 
480                  ></tbl:header>
481                <tbl:header 
482                  clazz="check" 
483                  visible="<%=mode.hasRadio()%>"
484                  ><input 
485                    type="radio" 
486                    name="item_id" 
487                    value="<%=itemId%>" 
488                    title="<%=name%>" 
489                    <%=selectedItemId == itemId ? "checked" : ""%>
490                  ></tbl:header>
491                <tbl:header 
492                  clazz="icons" 
493                  visible="<%=mode.hasIcons()%>"
494                  ><base:icon 
495                    image="deleted.png" 
496                    tooltip="This item has been scheduled for deletion" 
497                    visible="<%=item.isRemoved()%>"
498                  /><base:icon
499                    image="login.png"
500                    tooltip="Login as this user"
501                    onclick="<%="impersonate(" + itemId + ")"%>"
502                    visible="<%=impersonatePermission%>"
503                  />&nbsp;</tbl:header>
504                <tbl:cell column="name"><div class="link" 
505                  onclick="itemOnClick(<%=writePermission ? "event" : null%>, <%=itemId%>)" 
506                  title="<%=tooltip%>"><%=name%></div></tbl:cell>
507                <tbl:cell column="id"><%=item.getId()%></tbl:cell>
508                <tbl:cell column="diskUsage" style="padding: 0px;">
509                  <%
510                  DiskUsageStatistics.Summary summary = du.getSummary(item);
511                  long total = summary.getTotal();
512                  if (total > 0 && (hasLocation || hasQuotaType))
513                  {
514                    %>
515                    <table class="special bottomborder">
516                    <%
517                    if (hasLocation)
518                    {
519                      %>
520                      <tr class="bottomborder">
521                        <%
522                        if (hasQuotaType)
523                        {
524                          %>
525                          <th>&nbsp;</th>
526                          <%
527                        }
528                        %>
529                        <th>Total</th>
530                        <td>Primary</td>
531                        <td>Secondary</td>
532                        <td>Offline</td>
533                        <td>External</td>
534                      </tr>
535                      <%
536                    }
537                    %> 
538                    <tr class="bottomborder" style="background: #D8D8D8;">
539                      <%
540                      if (hasQuotaType)
541                      {
542                        %>
543                        <th>Total</th>
544                        <%
545                      }
546                      %>
547                      <td><%=Values.formatBytes(total)%></td>
548                      <%
549                      if (hasLocation)
550                      {
551                        %>
552                        <td><%=Values.formatBytes(summary.getTotal(Location.PRIMARY))%></td>
553                        <td><%=Values.formatBytes(summary.getTotal(Location.SECONDARY))%></td>
554                        <td><%=Values.formatBytes(summary.getTotal(Location.OFFLINE))%></td>
555                        <td><%=Values.formatBytes(summary.getTotal(Location.EXTERNAL))%></td>
556                        <%
557                      }
558                      %>
559                    </tr>
560                    <%
561                    if (hasQuotaType && total > 0)
562                    {
563                      for (QuotaType qt : quotaTypes)
564                      {
565                        %>
566                        <tr>
567                          <td><%=HTML.encodeTags(qt.getName())%></td>
568                          <td><%=Values.formatBytes(summary.getTotal(qt))%></td>
569                          <%
570                          if (hasLocation)
571                          {
572                            %>
573                            <td><%=Values.formatBytes(summary.getTotal(qt, Location.PRIMARY))%></td>
574                            <td><%=qt.hasSecondaryLocation() ? Values.formatBytes(summary.getTotal(qt, Location.SECONDARY)) : "n/a"%></td>
575                            <td><%=qt.getSystemId().equals(QuotaType.FILE) ? Values.formatBytes(summary.getTotal(qt, Location.OFFLINE)) : "n/a"%></td>
576                            <td><%=qt.getSystemId().equals(QuotaType.FILE) ? Values.formatBytes(summary.getTotal(qt, Location.EXTERNAL)) : "n/a"%></td>
577                            <%
578                          }
579                          %>
580                        </tr>
581                        <%
582                      }
583                    }
584                    %>
585                    </table>
586                    <%
587                  }
588                  else
589                  {
590                    %>
591                    &nbsp;<%=Values.formatBytes(total)%>
592                    <%
593                  }
594                  if (total > 0)
595                  {
596                    %>
597                    <base:icon image="gonext.png" 
598                      onclick="<%="viewDiskUsageDetails(" + itemId + ")"%>">View details</base:icon>
599                    <%
600                  }
601                  %>
602                </tbl:cell>
603                <tbl:cell column="login"><%=HTML.encodeTags(item.getLogin())%></tbl:cell>
604                <tbl:cell column="systemId"><%=Values.getString(item.getSystemId())%></tbl:cell>
605                <tbl:cell column="externalId"><%=HTML.encodeTags(item.getExternalId())%></tbl:cell>
606                <tbl:cell column="expirationDate" value="<%=item.getExpirationDate()%>" />
607                <tbl:cell column="disabled"><%=item.isDisabled() ? "yes" : "no" %></tbl:cell>
608                <tbl:cell column="multiuserAccount"><%=item.isMultiuserAccount() ? "yes" : "no" %></tbl:cell>
609                <tbl:cell column="organisation"><%=HTML.encodeTags(item.getOrganisation())%></tbl:cell>
610                <tbl:cell column="address"><%=HTML.encodeTags(item.getAddress())%></tbl:cell>
611                <tbl:cell column="email"><%=HTML.encodeTags(item.getEmail())%></tbl:cell>
612                <tbl:cell column="phone"><%=HTML.encodeTags(item.getPhone())%></tbl:cell>
613                <tbl:cell column="fax"><%=HTML.encodeTags(item.getFax())%></tbl:cell>
614                <tbl:cell column="url"><%=HTML.encodeTags(item.getUrl())%></tbl:cell>
615                <tbl:cell column="quota"
616                  ><base:propertyvalue 
617                    item="<%=item%>" 
618                    property="quota"
619                    enableEditLink="<%=mode.hasEditLink()%>" 
620                    enablePropertyLink="<%=mode.hasPropertyLink()%>"
621                  /></tbl:cell>
622                <tbl:cell column="quotagroup"
623                  ><base:propertyvalue 
624                    item="<%=item%>" 
625                    property="quotaGroup"
626                    enableEditLink="<%=mode.hasEditLink()%>" 
627                    enablePropertyLink="<%=mode.hasPropertyLink()%>"
628                  /></tbl:cell>
629                <tbl:cell column="description"><%=HTML.encodeTags(item.getDescription())%></tbl:cell>
630              </tbl:row>
631              <%
632              }
633            }
634            if (numListed == 0)
635            {
636              %>
637              <tbl:panel clazz="messagepanel">
638                <div class="messagecontainer note">
639                <%=users == null || users.getTotalCount() == 0 ? "No users were found" : "No users on this page. Please select another page!" %>
640                </div>
641              </tbl:panel>
642              <%
643            }
644          %>
645        </tbl:rows>
646      </tbl:data>
647      </tbl:table>
648    </t:tab>
649    <t:tab id="groups" title="Per group" />
650    </t:tabcontrol>
651
652  </base:body>
653  </base:page>
654  <%
655}
656finally
657{
658  if (users != null) users.close();
659  if (dc != null) dc.close();
660}
661%>
Note: See TracBrowser for help on using the repository browser.