source: trunk/www/admin/diskusage/list_users.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: 19.8 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  </base:head>
172 
173  <base:body>
174 
175    <t:tabcontrol id="main" active="users" switch="switchTab">
176    <t:tab id="overview" title="Overview" />
177   
178    <t:tab id="users" title="Per user">
179 
180    <%
181    if (cc.getMessage() != null)
182    {
183      %>
184      <div class="error"><%=cc.getMessage()%></div>
185      <%
186      cc.setMessage(null);
187    }
188    %>
189    <tbl:table 
190      id="users" 
191       
192      columns="<%=cc.getSetting("columns")%>"
193      sortby="<%=cc.getSortProperty()%>" 
194      direction="<%=cc.getSortDirection()%>"
195      action="index.jsp"
196      sc="<%=sc%>"
197      item="<%=itemType%>"
198      subcontext="<%=subContext%>"
199      >
200      <tbl:hidden 
201        name="subcontext"
202        value="<%=subContext%>"
203      />
204      <tbl:columndef 
205        id="name"
206        property="name"
207        datatype="string"
208        title="Name"
209        sortable="true" 
210        filterable="true"
211        exportable="true"
212        show="always" 
213      />
214      <tbl:columndef 
215        id="id"
216        clazz="uniquecol"
217        property="id"
218        datatype="int"
219        title="ID"
220        sortable="true"
221        filterable="true"
222        exportable="true"
223      />
224      <tbl:columndef
225        id="diskUsage"
226        title="Disk usage summary"
227        show="always"
228      />
229      <tbl:columndef 
230        id="login"
231        clazz="uniquecol"
232        property="login"
233        datatype="string"
234        title="Login"
235        sortable="true" 
236        filterable="true"
237        exportable="true"
238      />
239      <tbl:columndef 
240        id="systemId"
241        clazz="uniquecol"
242        property="systemId"
243        datatype="string"
244        title="System ID"
245        sortable="true"
246        filterable="true"
247        exportable="true"
248      />
249      <tbl:columndef 
250        id="externalId"
251        clazz="uniquecol"
252        property="externalId"
253        datatype="string"
254        title="External ID"
255        sortable="true" 
256        filterable="true"
257        exportable="true"
258      />
259      <tbl:columndef 
260        id="expirationDate"
261        property="expirationDate"
262        datatype="date"
263        title="Expiration date"
264        sortable="true" 
265        filterable="true"
266        exportable="true"
267        formatter="<%=FormatterFactory.getDateFormatter(sc)%>"
268      />
269      <tbl:columndef 
270        id="disabled"
271        property="disabled"
272        datatype="boolean"
273        title="Disabled"
274        sortable="true" 
275        filterable="true"
276        exportable="true"
277      />
278      <tbl:columndef 
279        id="multiuserAccount"
280        property="multiuserAccount"
281        datatype="boolean"
282        title="Multi-user account"
283        sortable="true" 
284        filterable="true"
285        exportable="true"
286      />
287      <tbl:columndef 
288        id="organisation"
289        property="organisation"
290        datatype="string"
291        title="Organisation"
292        sortable="true" 
293        filterable="true"
294        exportable="true"
295      />
296      <tbl:columndef 
297        id="address"
298        property="address"
299        datatype="string"
300        title="Address"
301        sortable="true" 
302        filterable="true"
303        exportable="true"
304      />
305      <tbl:columndef 
306        id="email"
307        property="email"
308        datatype="string"
309        title="Email"
310        sortable="true" 
311        filterable="true"
312        exportable="true"
313      />
314      <tbl:columndef 
315        id="phone"
316        property="phone"
317        datatype="string"
318        title="Phone"
319        sortable="true" 
320        filterable="true"
321        exportable="true"
322      />
323      <tbl:columndef 
324        id="fax"
325        property="fax"
326        datatype="string"
327        title="Fax"
328        sortable="true" 
329        filterable="true"
330        exportable="true"
331      />
332      <tbl:columndef 
333        id="url"
334        property="url"
335        datatype="string"
336        title="Url"
337        sortable="true" 
338        filterable="true"
339        exportable="true"
340      />
341      <tbl:columndef 
342        id="quota"
343        property="quota.name"
344        datatype="string"
345        title="Quota"
346        sortable="true" 
347        filterable="true"
348        exportable="true"
349      />
350      <tbl:columndef 
351        id="quotagroup"
352        property="quotaGroup.name"
353        datatype="string"
354        title="Quota group"
355        sortable="true" 
356        filterable="true"
357        exportable="true"
358      />
359      <tbl:columndef 
360        id="description"
361        property="description"
362        datatype="string"
363        title="Description" 
364        sortable="true" 
365        filterable="true" 
366        exportable="true"
367      />
368      <tbl:toolbar
369        visible="<%=mode.hasToolbar()%>"
370        >
371        <tbl:button 
372          image="columns.png" 
373          onclick="configureColumns()" 
374          title="Columns&hellip;" 
375          tooltip="Show, hide and re-order columns" 
376        />
377        <ext:render extensions="<%=invoker%>" context="<%=jspContext%>" 
378          wrapper="<%=new PrefixSuffixRenderer(jspContext, "<td>", "</td>") %>"/>
379      </tbl:toolbar>
380      <tbl:panel>
381        <b>Show summary</b>
382        <input type="radio" name="showStatistics" value="total"
383          <%="total".equals(showStatistics) ? "checked" : ""%>
384          onclick="setShowStatistics()"><a
385          href="javascript:document.forms[formId].showStatistics[0].click()">Total only</a>
386        <input type="radio" name="showStatistics" value="location"
387          <%="location".equals(showStatistics) ? "checked" : ""%>
388          onclick="setShowStatistics()"><a
389          href="javascript:document.forms[formId].showStatistics[1].click()">Per location</a>
390        <input type="radio" name="showStatistics" value="quotaType"
391          <%="quotaType".equals(showStatistics) ? "checked" : ""%>
392          onclick="setShowStatistics()"><a
393          href="javascript:document.forms[formId].showStatistics[2].click()">Per quota type</a>
394        <input type="radio" name="showStatistics" value="full"
395          <%="full".equals(showStatistics) ? "checked" : ""%>
396          onclick="setShowStatistics()"><a
397          href="javascript:document.forms[formId].showStatistics[3].click()">Full</a>
398      </tbl:panel>
399      <tbl:navigator
400        page="<%=cc.getPage()%>" 
401        rowsperpage="<%=cc.getRowsPerPage()%>" 
402        totalrows="<%=users == null ? 0 : users.getTotalCount()%>" 
403      />
404      <tbl:data>
405        <tbl:headers>
406          <tbl:headerrow>
407            <tbl:header colspan="3" />
408            <tbl:columnheaders />
409          </tbl:headerrow>
410          <tbl:headerrow>
411            <tbl:header subclass="index" />
412            <tbl:header 
413              subclass="check" 
414              visible="<%=mode.hasCheck()%>"
415              ><base:icon 
416                image="check_uncheck.png" 
417                tooltip="Check/uncheck all" 
418                onclick="Forms.checkUncheck(document.forms[formId])" 
419              /></tbl:header>
420            <tbl:header 
421              subclass="check" 
422              visible="<%=mode.hasRadio()%>"
423              />
424            <tbl:header 
425              subclass="icons" 
426              visible="<%=mode.hasIcons()%>"
427              />
428            <tbl:propertyfilter />
429          </tbl:headerrow>
430        </tbl:headers>
431        <tbl:rows>
432          <%
433          int index = cc.getPage()*cc.getRowsPerPage();
434          int selectedItemId = cc.getId();
435          if (users != null)
436          {           
437            while (users.hasNext())
438            {
439              User item = users.next();
440              int itemId = item.getId();
441              String name = HTML.encodeTags(item.getName());
442              String tooltip = mode.isSelectionMode() ? 
443                  "Select this item" : "View this item" + (writePermission ? " (use CTRL, ALT or SHIFT to edit)" : "");
444              index++;
445              numListed++;
446              %>
447              <tbl:row>
448                <tbl:header 
449                  clazz="index"
450                  ><%=index%></tbl:header>
451                <tbl:header 
452                  clazz="check" 
453                  visible="<%=mode.hasCheck()%>"
454                  ><input 
455                    type="checkbox" 
456                    name="<%=itemId%>" 
457                    value="<%=itemId%>" 
458                    title="<%=name%>" 
459                    <%=cc.getSelected().contains(itemId) ? "checked" : ""%> 
460                  ></tbl:header>
461                <tbl:header 
462                  clazz="check" 
463                  visible="<%=mode.hasRadio()%>"
464                  ><input 
465                    type="radio" 
466                    name="item_id" 
467                    value="<%=itemId%>" 
468                    title="<%=name%>" 
469                    <%=selectedItemId == itemId ? "checked" : ""%>
470                  ></tbl:header>
471                <tbl:header 
472                  clazz="icons" 
473                  visible="<%=mode.hasIcons()%>"
474                  ><base:icon 
475                    image="deleted.png" 
476                    tooltip="This item has been scheduled for deletion" 
477                    visible="<%=item.isRemoved()%>"
478                  /><base:icon
479                    image="login.png"
480                    tooltip="Login as this user"
481                    onclick="<%="impersonate(" + itemId + ")"%>"
482                    visible="<%=impersonatePermission%>"
483                  />&nbsp;</tbl:header>
484                <tbl:cell column="name"><div class="link" 
485                  onclick="itemOnClick(<%=writePermission ? "event" : null%>, <%=itemId%>)" 
486                  title="<%=tooltip%>"><%=name%></div></tbl:cell>
487                <tbl:cell column="id"><%=item.getId()%></tbl:cell>
488                <tbl:cell column="diskUsage">
489                  <%
490                  DiskUsageStatistics.Summary summary = du.getSummary(item);
491                  long total = summary.getTotal();
492                  if (total > 0 && (hasLocation || hasQuotaType))
493                  {
494                    %>
495                    <table border="0" cellspacing="0" cellpadding="2">
496                    <%
497                    if (hasLocation)
498                    {
499                      %>
500                      <tr>
501                        <%
502                        if (hasQuotaType)
503                        {
504                          %>
505                          <th>&nbsp;</th>
506                          <%
507                        }
508                        %>
509                        <th style="text-align: right;">Total</th>
510                        <td style="text-align: right;">&nbsp;&nbsp;Primary</td>
511                        <td style="text-align: right;">&nbsp;&nbsp;Secondary</td>
512                        <td style="text-align: right;">&nbsp;&nbsp;Offline</td>
513                        <td style="text-align: right;">&nbsp;&nbsp;External</td>
514                      </tr>
515                      <%
516                    }
517                    %>
518                    <tr>
519                      <td colspan="6" style="border-bottom: 1px dotted #999999"></td>
520                    </tr>   
521                    <tr style="background: #E0E0E0;">
522                      <%
523                      if (hasQuotaType)
524                      {
525                        %>
526                        <th>Total</th>
527                        <%
528                      }
529                      %>
530                      <td style="text-align: right;"><%=Values.formatBytes(total)%></td>
531                      <%
532                      if (hasLocation)
533                      {
534                        %>
535                        <td style="text-align: right;"><%=Values.formatBytes(summary.getTotal(Location.PRIMARY))%></td>
536                        <td style="text-align: right;"><%=Values.formatBytes(summary.getTotal(Location.SECONDARY))%></td>
537                        <td style="text-align: right;"><%=Values.formatBytes(summary.getTotal(Location.OFFLINE))%></td>
538                        <td style="text-align: right;"><%=Values.formatBytes(summary.getTotal(Location.EXTERNAL))%></td>
539                        <%
540                      }
541                      %>
542                    </tr>
543                    <tr>
544                      <td colspan="6" style="border-top: 1px dotted #999999"></td>
545                    </tr>   
546                    <%
547                    if (hasQuotaType && total > 0)
548                    {
549                      for (QuotaType qt : quotaTypes)
550                      {
551                        %>
552                        <tr>
553                          <td><%=HTML.encodeTags(qt.getName())%></td>
554                          <td style="text-align: right;"><%=Values.formatBytes(summary.getTotal(qt))%></td>
555                          <%
556                          if (hasLocation)
557                          {
558                            %>
559                            <td style="text-align: right;"><%=Values.formatBytes(summary.getTotal(qt, Location.PRIMARY))%></td>
560                            <td style="text-align: right;"><%=qt.hasSecondaryLocation() ? Values.formatBytes(summary.getTotal(qt, Location.SECONDARY)) : "n/a"%></td>
561                            <td style="text-align: right;"><%=qt.getSystemId().equals(QuotaType.FILE) ? Values.formatBytes(summary.getTotal(qt, Location.OFFLINE)) : "n/a"%></td>
562                            <td style="text-align: right;"><%=qt.getSystemId().equals(QuotaType.FILE) ? Values.formatBytes(summary.getTotal(qt, Location.EXTERNAL)) : "n/a"%></td>
563                            <%
564                          }
565                          %>
566                        </tr>
567                        <%
568                      }
569                    }
570                    %>
571                    </table>
572                    <%
573                  }
574                  else
575                  {
576                    %>
577                    <%=Values.formatBytes(total)%>
578                    <%
579                  }
580                  if (total > 0)
581                  {
582                    %>
583                    <base:icon image="bullet.png" />
584                    <a href="javascript:viewDiskUsageDetails(<%=itemId%>)">View details</a>
585                    <%
586                  }
587                  %>
588                </tbl:cell>
589                <tbl:cell column="login"><%=HTML.encodeTags(item.getLogin())%></tbl:cell>
590                <tbl:cell column="systemId"><%=Values.getString(item.getSystemId())%></tbl:cell>
591                <tbl:cell column="externalId"><%=HTML.encodeTags(item.getExternalId())%></tbl:cell>
592                <tbl:cell column="expirationDate" value="<%=item.getExpirationDate()%>" />
593                <tbl:cell column="disabled"><%=item.isDisabled() ? "yes" : "no" %></tbl:cell>
594                <tbl:cell column="multiuserAccount"><%=item.isMultiuserAccount() ? "yes" : "no" %></tbl:cell>
595                <tbl:cell column="organisation"><%=HTML.encodeTags(item.getOrganisation())%></tbl:cell>
596                <tbl:cell column="address"><%=HTML.encodeTags(item.getAddress())%></tbl:cell>
597                <tbl:cell column="email"><%=HTML.encodeTags(item.getEmail())%></tbl:cell>
598                <tbl:cell column="phone"><%=HTML.encodeTags(item.getPhone())%></tbl:cell>
599                <tbl:cell column="fax"><%=HTML.encodeTags(item.getFax())%></tbl:cell>
600                <tbl:cell column="url"><%=HTML.encodeTags(item.getUrl())%></tbl:cell>
601                <tbl:cell column="quota"
602                  ><base:propertyvalue 
603                    item="<%=item%>" 
604                    property="quota"
605                    enableEditLink="<%=mode.hasEditLink()%>" 
606                    enablePropertyLink="<%=mode.hasPropertyLink()%>"
607                  /></tbl:cell>
608                <tbl:cell column="quotagroup"
609                  ><base:propertyvalue 
610                    item="<%=item%>" 
611                    property="quotaGroup"
612                    enableEditLink="<%=mode.hasEditLink()%>" 
613                    enablePropertyLink="<%=mode.hasPropertyLink()%>"
614                  /></tbl:cell>
615                <tbl:cell column="description"><%=HTML.encodeTags(item.getDescription())%></tbl:cell>
616              </tbl:row>
617              <%
618              }
619            }
620          %>
621          </tbl:rows>
622      </tbl:data>
623      <%
624      if (numListed == 0)
625      {
626        %>
627        <tbl:panel><%=users == null || users.getTotalCount() == 0 ? "No users were found" : "No users on this page. Please select another page!" %></tbl:panel>
628        <%
629      }
630      else
631      {
632        %>
633        <tbl:navigator
634          page="<%=cc.getPage()%>" 
635          rowsperpage="<%=cc.getRowsPerPage()%>" 
636          totalrows="<%=users == null ? 0 : users.getTotalCount()%>" 
637          visible="<%=mode.hasNavigator()%>"
638          locked="true"
639        />
640        <%
641      }
642      %>
643    </tbl:table>
644   
645    </t:tab>
646    <t:tab id="groups" title="Per group" />
647    </t:tabcontrol>
648
649  </base:body>
650  </base:page>
651  <%
652}
653finally
654{
655  if (users != null) users.close();
656  if (dc != null) dc.close();
657}
658%>
Note: See TracBrowser for help on using the repository browser.