source: branches/3.18-stable/www/admin/users/list_users.jsp @ 7939

Last change on this file since 7939 was 7939, checked in by Nicklas Nordborg, 6 months ago

References #2246: Sticky table headers

It should now be implemented on all list pages.

  • Property svn:eol-style set to native
  • Property svn:keywords set to Date Id
File size: 22.1 KB
Line 
1<%-- $Id: list_users.jsp 7939 2021-05-04 07:30:31Z nicklas $
2  ------------------------------------------------------------------
3  Copyright (C) 2006 Jari Häkkinen, Nicklas Nordborg, Martin Svensson
4  Copyright (C) 2007 Johan Enell, Nicklas Nordborg, Martin Svensson
5
6  This file is part of BASE - BioArray Software Environment.
7  Available at http://base.thep.lu.se/
8
9  BASE is free software; you can redistribute it and/or
10  modify it under the terms of the GNU General Public License
11  as published by the Free Software Foundation; either version 3
12  of the License, or (at your option) any later version.
13
14  BASE is distributed in the hope that it will be useful,
15  but WITHOUT ANY WARRANTY; without even the implied warranty of
16  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17  GNU General Public License for more details.
18
19  You should have received a copy of the GNU General Public License
20  along with BASE. If not, see <http://www.gnu.org/licenses/>.
21  ------------------------------------------------------------------
22
23  @author Nicklas
24  @version 2.0
25--%>
26<%@ page pageEncoding="UTF-8" session="false"
27  import="net.sf.basedb.core.SessionControl"
28  import="net.sf.basedb.core.DbControl"
29  import="net.sf.basedb.core.ExtendedProperty"
30  import="net.sf.basedb.core.ExtendedProperties" 
31  import="net.sf.basedb.core.Item"
32  import="net.sf.basedb.core.User"
33  import="net.sf.basedb.core.Group"
34  import="net.sf.basedb.core.Role"
35  import="net.sf.basedb.core.Type"
36  import="net.sf.basedb.core.ItemQuery"
37  import="net.sf.basedb.core.Include"
38  import="net.sf.basedb.core.ItemResultIterator"
39  import="net.sf.basedb.core.ItemResultList"
40  import="net.sf.basedb.core.ItemContext"
41  import="net.sf.basedb.core.Permission"
42  import="net.sf.basedb.core.PluginDefinition"
43  import="net.sf.basedb.core.query.Orders"
44  import="net.sf.basedb.core.query.Hql"
45  import="net.sf.basedb.core.query.Restrictions"
46  import="net.sf.basedb.core.query.Expressions"
47  import="net.sf.basedb.core.plugin.GuiContext"
48  import="net.sf.basedb.core.plugin.Plugin"
49  import="net.sf.basedb.util.Enumeration"
50  import="net.sf.basedb.clients.web.Base"
51  import="net.sf.basedb.clients.web.ModeInfo"
52  import="net.sf.basedb.clients.web.PermissionUtil"
53  import="net.sf.basedb.clients.web.util.HTML"
54  import="net.sf.basedb.util.Values"
55  import="net.sf.basedb.util.formatter.Formatter"
56  import="net.sf.basedb.clients.web.formatter.FormatterFactory"
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.ButtonAction" 
61  import="net.sf.basedb.clients.web.extensions.toolbar.ToolbarUtil"
62  import="net.sf.basedb.clients.web.extensions.list.ListColumnAction"
63  import="net.sf.basedb.clients.web.extensions.list.ListColumnUtil"
64  import="net.sf.basedb.util.extensions.ExtensionsInvoker"
65  import="java.util.List"
66  import="java.util.Map"
67  import="java.util.Date"
68%>
69<%@ taglib prefix="base" uri="/WEB-INF/base.tld" %>
70<%@ taglib prefix="tbl" uri="/WEB-INF/table.tld" %>
71<%@ taglib prefix="ext" uri="/WEB-INF/extensions.tld" %>
72<%!
73  private static final Item itemType = Item.USER;
74  private static final GuiContext guiContext = new GuiContext(itemType, GuiContext.Type.LIST);
75%>
76<%
77final SessionControl sc = Base.getExistingSessionControl(pageContext, Permission.DENIED, itemType);
78final String ID = sc.getId();
79final boolean createPermission = sc.hasPermission(Permission.CREATE, itemType);
80final boolean writePermission = sc.hasPermission(Permission.WRITE, itemType);
81final boolean deletePermission = sc.hasPermission(Permission.DELETE, itemType);
82final boolean impersonatePermission = sc.hasSystemPermission(Permission.ACT_AS_ANOTHER_USER);
83final ItemContext cc = Base.getAndSetCurrentContext(sc, itemType, null, null);
84
85final ModeInfo mode = ModeInfo.get(request.getParameter("mode"));
86final String callback = request.getParameter("callback");
87final String title = mode.generateTitle("user", "users");
88final DbControl dc = sc.newDbControl();
89ItemResultIterator<User> users = null;
90try
91{
92  Formatter<Date> dateFormatter = FormatterFactory.getDateFormatter(sc);
93
94  // Query for groups relatated to the current user
95  final ItemQuery<Group> groupQuery = Group.getQuery();
96  groupQuery.include(cc.getInclude());
97  groupQuery.join(Hql.innerJoin("users", "usr"));
98  groupQuery.restrict(Restrictions.eq(Hql.alias("usr"), Expressions.parameter("user")));
99  groupQuery.order(Orders.asc(Hql.property("name"))); 
100
101  // Query for roles relatated to the current user
102  final ItemQuery<Role> roleQuery = Role.getQuery();
103  roleQuery.include(cc.getInclude());
104  roleQuery.join(Hql.innerJoin("users", "usr"));
105  roleQuery.restrict(Restrictions.eq(Hql.alias("usr"), Expressions.parameter("user")));
106  roleQuery.order(Orders.asc(Hql.property("name"))); 
107 
108  List<ExtendedProperty> extendedProperties = ExtendedProperties.getProperties("UserData");
109 
110  Map<Plugin.MainType, Integer> pluginCount = PluginDefinition.countPlugins(dc, guiContext);
111  JspContext jspContext = ExtensionsControl.createContext(dc, pageContext, guiContext, null);
112  try
113  {
114    final ItemQuery<User> query = Base.getConfiguredQuery(dc, cc, jspContext, true, User.getQuery(), mode);
115    users = query.iterate(dc);
116  }
117  catch (Throwable t)
118  {
119    cc.setMessage(t.getMessage());
120  }
121  int numListed = 0;
122  ExtensionsInvoker<ButtonAction> invoker = ToolbarUtil.useExtensions(jspContext);
123  ExtensionsInvoker<ListColumnAction<User,?>> columnsInvoker = ListColumnUtil.useExtensions(jspContext);
124  %>
125  <base:page title="<%=title==null ? "Users" : title%>" type="<%=mode.getPageType()%>" id="list-page">
126  <base:head scripts="table.js,~users.js" styles="table.css,toolbar.css">
127    <ext:scripts context="<%=jspContext%>" />
128    <ext:stylesheets context="<%=jspContext%>" />
129    <style>
130    .row-index
131    {
132      width: 8.5em !important;
133    }
134    .row-index > div
135    {
136      grid-template-columns: 1fr 20px 52px !important;
137    }
138    </style>
139  </base:head>
140 
141  <base:body>
142    <h1><%=title==null ? "Users" : title%></h1>
143    <div class="content">
144    <tbl:table 
145      id="users" 
146      columns="<%=cc.getSetting("columns")%>"
147      sortby="<%=cc.getSortProperty()%>" 
148      direction="<%=cc.getSortDirection()%>"
149      action="index.jsp"
150      sc="<%=sc%>"
151      item="<%=itemType%>"
152      filterrows="<%=cc.getFilterRows()%>"
153      subclass="fulltable"
154      stickyheaders="name"
155      >
156      <tbl:hidden 
157        name="mode" 
158        value="<%=mode.getName()%>" 
159      />
160      <tbl:hidden 
161        name="callback" 
162        value="<%=callback%>" 
163        skip="<%=callback == null%>" 
164      />
165      <tbl:columndef 
166        id="name"
167        property="name"
168        datatype="string"
169        title="Name"
170        sortable="true" 
171        filterable="true"
172        exportable="true"
173        show="always" 
174      />
175      <tbl:columndef 
176        id="id"
177        clazz="uniquecol"
178        property="id"
179        datatype="int"
180        title="ID"
181        sortable="true"
182        filterable="true"
183        exportable="true"
184      />
185      <tbl:columndef 
186        id="entryDate"
187        property="entryDate"
188        datatype="date"
189        title="Registered"
190        sortable="true" 
191        filterable="true"
192        exportable="true"
193        formatter="<%=dateFormatter%>"
194      />
195      <tbl:columndef 
196        id="login"
197        clazz="uniquecol"
198        property="login"
199        datatype="string"
200        title="Login"
201        sortable="true" 
202        filterable="true"
203        exportable="true"
204      />
205      <tbl:columndef 
206        id="systemId"
207        clazz="uniquecol"
208        property="systemId"
209        datatype="string"
210        title="System ID"
211        sortable="true"
212        filterable="true"
213        exportable="true"
214      />
215      <tbl:columndef 
216        id="externalId"
217        clazz="uniquecol"
218        property="externalId"
219        datatype="string"
220        title="External ID"
221        sortable="true" 
222        filterable="true"
223        exportable="true"
224      />
225      <tbl:columndef 
226        id="expirationDate"
227        property="expirationDate"
228        datatype="date"
229        title="Expiration date"
230        sortable="true" 
231        filterable="true"
232        exportable="true"
233        formatter="<%=dateFormatter%>"
234      />
235      <tbl:columndef 
236        id="disabled"
237        property="disabled"
238        datatype="boolean"
239        title="Disabled"
240        sortable="true" 
241        filterable="true"
242        exportable="true"
243      />
244      <tbl:columndef 
245        id="multiuserAccount"
246        property="multiuserAccount"
247        datatype="boolean"
248        title="Multi-user account"
249        sortable="true" 
250        filterable="true"
251        exportable="true"
252      />
253      <tbl:columndef 
254        id="useDeviceVerification"
255        property="useDeviceVerification"
256        datatype="boolean"
257        title="2-factor login"
258        sortable="true" 
259        filterable="true"
260        exportable="true"
261      />
262      <tbl:columndef 
263        id="groups"
264        title="Groups"
265        property="&groups(name)"
266        datatype="string"
267        filterable="true"
268        exportable="true"
269      />
270      <tbl:columndef
271        id="roles"
272        title="Roles"
273        property="&roles(name)"
274        datatype="string"
275        filterable="true"
276        exportable="true"
277      />
278      <tbl:columndef 
279        id="organisation"
280        property="organisation"
281        datatype="string"
282        title="Organisation"
283        sortable="true" 
284        filterable="true"
285        exportable="true"
286      />
287      <tbl:columndef 
288        id="address"
289        property="address"
290        datatype="string"
291        title="Address"
292        sortable="true" 
293        filterable="true"
294        exportable="true"
295      />
296      <tbl:columndef 
297        id="email"
298        property="email"
299        datatype="string"
300        title="Email"
301        sortable="true" 
302        filterable="true"
303        exportable="true"
304      />
305      <tbl:columndef 
306        id="phone"
307        property="phone"
308        datatype="string"
309        title="Phone"
310        sortable="true" 
311        filterable="true"
312        exportable="true"
313      />
314      <tbl:columndef 
315        id="fax"
316        property="fax"
317        datatype="string"
318        title="Fax"
319        sortable="true" 
320        filterable="true"
321        exportable="true"
322      />
323      <tbl:columndef 
324        id="url"
325        property="url"
326        datatype="string"
327        title="Url"
328        sortable="true" 
329        filterable="true"
330        exportable="true"
331      />
332      <%
333      if (extendedProperties != null)
334      {
335        for (ExtendedProperty ep : extendedProperties)
336        {
337          String name = ep.getName();
338          %>
339          <tbl:columndef
340            id="<%=name%>"
341            property="<%=name%>"
342            datatype="<%=ep.getType().getStringValue()%>"
343            title="<%=HTML.encodeTags(ep.getTitle())%>"
344            sortable="true"
345            filterable="true"
346            exportable="true"
347            formatter="<%=FormatterFactory.getExtendedPropertyFormatter(sc, ep)%>"
348          />
349          <%
350        }
351      }
352      %>
353      <tbl:columndef 
354        id="quota"
355        property="quota.name"
356        datatype="string"
357        title="Quota"
358        sortable="true" 
359        filterable="true"
360        exportable="true"
361      />
362      <tbl:columndef 
363        id="quotagroup"
364        property="quotaGroup.name"
365        datatype="string"
366        title="Quota group"
367        sortable="true" 
368        filterable="true"
369        exportable="true"
370      />
371      <tbl:columndef 
372        id="description"
373        property="description"
374        datatype="string"
375        title="Description" 
376        sortable="true" 
377        filterable="true" 
378        exportable="true"
379      />
380      <tbl:columndef 
381        id="xt-columns" 
382        extensions="<%=columnsInvoker%>" 
383        jspcontext="<%=jspContext%>" 
384      />
385      <div class="panelgroup bg-filled-50 bottomborder">
386        <tbl:toolbar
387          subclass="bottomborder"
388          visible="<%=mode.hasToolbar()%>"
389          >
390          <tbl:button 
391            id="btnNewItem"
392            disabled="<%=!createPermission%>" 
393            image="new.png" 
394            title="New&hellip;" 
395            tooltip="<%=createPermission ? "Create new user" : "You do not have permission to create users"%>" 
396          />
397          <tbl:button 
398            id="btnDeleteItems"
399            disabled="<%=!deletePermission%>" 
400            image="delete.png" 
401            title="Delete" 
402            tooltip="<%=deletePermission ? "Delete the selected items" : "You do not have permission to delete users" %>" 
403          />
404          <tbl:button 
405            id="btnRestoreItems"
406            disabled="<%=!writePermission%>" 
407            image="restore.png" 
408            title="Restore" 
409            tooltip="<%=writePermission ? "Restore the selected (deleted) items" : "You do not have permission to edit users" %>" 
410          />
411          <tbl:button 
412            id="btnColumns"
413            image="columns.png" 
414            title="Columns&hellip;" 
415            tooltip="Show, hide and re-order columns" 
416          />
417          <tbl:button
418            id="btnDefaultMembership"
419            image="membership.png"
420            title="Default membership&hellip;"
421            tooltip="Specify groups and roles that are automtically assigned to new users"
422          />
423          <tbl:button
424            id="btnNewGroup"
425            image="add.png"
426            title="New group&hellip;"
427            tooltip="Create a new group with the selected users as members"
428            visible="<%=sc.hasPermission(Permission.CREATE, Item.GROUP)%>"
429          />
430          <tbl:button 
431            id="btnImport"
432            data-plugin-type="IMPORT"
433            image="import.png" 
434            title="Import&hellip;" 
435            tooltip="Import data" 
436            visible="<%=pluginCount.containsKey(Plugin.MainType.IMPORT)%>"
437          />
438          <tbl:button 
439            id="btnExport"
440            data-plugin-type="EXPORT"
441            image="export.png" 
442            title="Export&hellip;" 
443            tooltip="Export data" 
444            visible="<%=pluginCount.containsKey(Plugin.MainType.EXPORT)%>"
445          />
446          <tbl:button 
447            id="btnRunPlugin"
448            data-plugin-type="OTHER"
449            image="runplugin.png" 
450            title="Run plugin&hellip;" 
451            tooltip="Run a plugin" 
452            visible="<%=pluginCount.containsKey(Plugin.MainType.OTHER)%>"
453          />
454          <ext:render extensions="<%=invoker%>" context="<%=jspContext%>" 
455            wrapper="<%=new PrefixSuffixRenderer<ButtonAction>(jspContext, "<td>", "</td>") %>"/>
456        </tbl:toolbar>
457        <tbl:panel>
458          <tbl:presetselector />
459          <tbl:navigator
460            page="<%=cc.getPage()%>" 
461            rowsperpage="<%=cc.getRowsPerPage()%>" 
462            totalrows="<%=users == null ? 0 : users.getTotalCount()%>" 
463            visible="<%=mode.hasNavigator()%>"
464          />
465        </tbl:panel>
466      </div>
467      <tbl:data>
468        <tbl:headers>
469          <tbl:headerrow>
470            <tbl:header clazz="row-index bg-filled-100" />
471            <tbl:columnheaders />
472          </tbl:headerrow>
473          <%
474          int numFilters = cc.getNumPropertyFilters();
475          int numRows = cc.getFilterRows();
476          for (int filterNo = 0; filterNo < numRows; filterNo++)
477          {
478            boolean lastRow = filterNo == numRows-1;
479            %>
480            <tbl:headerrow>
481              <tbl:header subclass="row-index bg-filled-100">
482                <div class="index-<%=mode.getName()%>">
483                  <div class="index"></div>
484                  <div class="check">
485                    <base:icon 
486                      subclass="link table-check"
487                      image="check_uncheck.png" 
488                      tooltip="Toggle all (use CTRL, ALT or SHIFT to check/uncheck)" 
489                      visible="<%=lastRow && mode.hasCheck()%>"
490                    />
491                  </div>
492                  <div class="icons">
493                    <base:icon
494                      subclass="link table-filter-row-action"
495                      image="add.png"
496                      tooltip="Add extra filter row"
497                      visible="<%=lastRow%>"
498                    /><base:icon
499                      subclass="link table-filter-row-action"
500                      image="remove.png"
501                      tooltip="Remove this filter row"
502                      visible="<%=numRows > 1 || numFilters > 0 %>"
503                      data-remove-row="<%=filterNo%>"
504                    />
505                  </div>
506                </div>
507              </tbl:header>
508              <tbl:propertyfilter row="<%=filterNo%>" />
509            </tbl:headerrow>
510            <%
511          }
512          %>
513          <tbl:columnsubtitles />
514        </tbl:headers>
515        <tbl:rows>
516          <%
517          if (cc.getMessage() != null)
518          {
519            %>
520            <tbl:panel subclass="bg-filled-50">
521              <div class="messagecontainer error"><%=cc.getMessage()%></div>
522            </tbl:panel>
523            <%
524            cc.setMessage(null);
525          }
526          int index = cc.getPage()*cc.getRowsPerPage();
527          int selectedItemId = cc.getId();
528          if (users != null)
529          {           
530            while (users.hasNext())
531            {
532              User item = users.next();
533              int itemId = item.getId();
534              String name = HTML.encodeTags(item.getName());
535              String tooltip = mode.isSelectionMode() ? 
536                  "Select this item" : "View this item" + (writePermission ? " (use CTRL, ALT or SHIFT to edit)" : "");
537             
538              index++;
539              numListed++;
540              %>
541              <tbl:row>
542                <tbl:header clazz="row-index bg-filled-100">
543                  <div class="index-<%=mode.getName()%>">
544                    <div class="index <%=index>999?"index-smaller":""%>"><%=index%></div>
545                    <div class="check">
546                      <base:input
547                        type="checkbox" 
548                        name="<%=itemId%>" 
549                        value="<%=itemId%>" 
550                        title="<%=name%>" 
551                        checked="<%=cc.getSelected().contains(itemId)%>"
552                        visible="<%=mode.hasCheck()%>"
553                      />
554                      <base:input 
555                        type="radio" 
556                        name="item_id" 
557                        value="<%=itemId%>" 
558                        title="<%=name%>" 
559                        checked="<%=selectedItemId == itemId%>"
560                        visible="<%=mode.hasRadio()%>"
561                      />
562                    </div>
563                    <div class="icons">
564                      <base:icon 
565                        image="deleted.png"
566                        id="<%="delete."+itemId %>"
567                        subclass="<%=deletePermission ? "table-delete-item" : "disabled" %>"
568                        data-item-id="<%=itemId%>"
569                        tooltip="This item has been scheduled for deletion" 
570                        visible="<%=item.isRemoved()%>"
571                      /><base:icon
572                        image="systemitem.png"
573                        tooltip="This item is a system item"
574                        visible="<%=item.isSystemItem()%>" 
575                      /><base:icon
576                        image="login.png"
577                        id="<%="impersonate."+itemId %>"
578                        tooltip="Login as this user"
579                        subclass="auto-init"
580                        data-auto-init="impersonate"
581                        data-item-id="<%=itemId %>"
582                        visible="<%=impersonatePermission%>"
583                      /><base:icon
584                        image="copy.png"
585                        id="<%="clone."+itemId %>"
586                        tooltip="Create a new user using settings from this user as a template"
587                        subclass="auto-init"
588                        data-auto-init="clone"
589                        data-item-id="<%=itemId %>"
590                        visible="<%=createPermission%>"
591                      />
592                    </div>
593                  </div>
594                </tbl:header>
595                <tbl:cell column="name"><div 
596                  class="link table-item"
597                  data-item-id="<%=itemId%>"
598                  data-no-edit="<%=writePermission ? 0 : 1 %>" 
599                  tabindex="0"
600                  title="<%=tooltip%>"><%=name%></div></tbl:cell>
601                <tbl:cell column="id"><%=item.getId()%></tbl:cell>
602                <tbl:cell column="entryDate" value="<%=item.getEntryDate()%>" />
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="useDeviceVerification"><%=item.getUseDeviceVerification() ? "yes" : "no" %></tbl:cell>
610                <tbl:cell column="groups">
611                  <%
612                  groupQuery.setParameter("user", itemId, Type.INT);
613                  try
614                  {
615                    String separator = "";
616                    for (Group g : groupQuery.list(dc))
617                    {
618                      out.write(separator);
619                      if (mode.hasPropertyLink())
620                      {
621                        out.write(Base.getLinkedName(ID, g, false, mode.hasEditLink()));
622                      }
623                      else
624                      {
625                        out.write(HTML.encodeTags(g.getName()));
626                      }
627                      separator = ", ";
628                    }
629                  }
630                  catch (Throwable t)
631                  {
632                    %>
633                    <div class="error"><%=t.getMessage()%></div>
634                    <%
635                  }
636                  %>
637                </tbl:cell>
638                <tbl:cell column="roles">
639                  <%
640                  roleQuery.setParameter("user", itemId, Type.INT);
641                  try
642                  {
643                    String separator = "";
644                    for (Role r : roleQuery.list(dc))
645                    {
646                      out.write(separator);
647                      if (mode.hasPropertyLink())
648                      {
649                        out.write(Base.getLinkedName(ID, r, false, mode.hasEditLink()));
650                      }
651                      else
652                      {
653                        out.write(HTML.encodeTags(r.getName()));
654                      }
655                      separator = ", ";
656                    }
657                  }
658                  catch (Throwable t)
659                  {
660                    %>
661                    <div class="error"><%=t.getMessage()%></div>
662                    <%
663                  }
664                  %>
665                </tbl:cell>
666                <tbl:cell column="organisation"><%=HTML.encodeTags(item.getOrganisation())%></tbl:cell>
667                <tbl:cell column="address"><%=HTML.encodeTags(item.getAddress())%></tbl:cell>
668                <tbl:cell column="email"><%=HTML.encodeTags(item.getEmail())%></tbl:cell>
669                <tbl:cell column="phone"><%=HTML.encodeTags(item.getPhone())%></tbl:cell>
670                <tbl:cell column="fax"><%=HTML.encodeTags(item.getFax())%></tbl:cell>
671                <tbl:cell column="url"><%=HTML.encodeTags(item.getUrl())%></tbl:cell><%
672                if (extendedProperties != null)
673                {
674                  for (ExtendedProperty ep : extendedProperties)
675                  {
676                    name = ep.getName();
677                    %>
678                    <tbl:cell column="<%=name%>"><tbl:cellvalue value="<%=item.getExtended(name)%>" /></tbl:cell>
679                    <%
680                  }
681                }
682                %>
683                <tbl:cell column="quota"
684                  ><base:propertyvalue 
685                    item="<%=item%>" 
686                    property="quota"
687                    enableEditLink="<%=mode.hasEditLink()%>" 
688                    enablePropertyLink="<%=mode.hasPropertyLink()%>"
689                  /></tbl:cell>
690                <tbl:cell column="quotagroup"
691                  ><base:propertyvalue 
692                    item="<%=item%>" 
693                    property="quotaGroup"
694                    enableEditLink="<%=mode.hasEditLink()%>" 
695                    enablePropertyLink="<%=mode.hasPropertyLink()%>"
696                  /></tbl:cell>
697                <tbl:cell column="description"><%=HTML.encodeTags(item.getDescription())%></tbl:cell>
698                <tbl:xt-cells dc="<%=dc%>" item="<%=item%>">
699                  <tbl:cell column="xt-columns" />
700                </tbl:xt-cells>
701              </tbl:row>
702              <%
703              }
704            }
705          if (numListed == 0)
706          {
707            %>
708            <tbl:panel subclass="bg-filled-50">
709              <div class="messagecontainer note">
710              <%=users == null || users.getTotalCount() == 0 ? "No users were found" : "No users on this page. Please select another page!" %>
711              </div>
712            </tbl:panel>
713            <%
714          }
715          %>
716        </tbl:rows>
717      </tbl:data>
718    </tbl:table>
719    </div>
720   
721    <base:buttongroup subclass="dialogbuttons">
722      <base:button id="btnOk" title="Ok" visible="<%=mode.hasOkButton()%>" />
723      <base:button id="close" title="Cancel" visible="<%=mode.hasCancelButton()%>" />
724      <base:button id="close" title="Close" visible="<%=mode.hasCloseButton()%>" />
725    </base:buttongroup>
726   
727  </base:body>
728  </base:page>
729  <%
730}
731finally
732{
733  if (users != null) users.close();
734  if (dc != null) dc.close();
735}
736%>
Note: See TracBrowser for help on using the repository browser.