source: trunk/www/admin/users/edit_user.jsp @ 5921

Last change on this file since 5921 was 5921, checked in by Nicklas Nordborg, 10 years ago

References #1655: GUI improvements

Edit dialogs for all items in the first level under the Administrate menu.

  • Property svn:eol-style set to native
  • Property svn:keywords set to Id
File size: 27.7 KB
Line 
1<%-- $Id: edit_user.jsp 5921 2012-01-10 12:30:57Z nicklas $
2  ------------------------------------------------------------------
3  Copyright (C) 2005 Nicklas Nordborg
4  Copyright (C) 2006 Jari Häkkinen, Nicklas Nordborg, Martin Svensson
5  Copyright (C) 2007 Nicklas Nordborg, Martin Svensson
6
7  This file is part of BASE - BioArray Software Environment.
8  Available at http://base.thep.lu.se/
9
10  BASE is free software; you can redistribute it and/or
11  modify it under the terms of the GNU General Public License
12  as published by the Free Software Foundation; either version 3
13  of the License, or (at your option) any later version.
14
15  BASE is distributed in the hope that it will be useful,
16  but WITHOUT ANY WARRANTY; without even the implied warranty of
17  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18  GNU General Public License for more details.
19
20  You should have received a copy of the GNU General Public License
21  along with BASE. If not, see <http://www.gnu.org/licenses/>.
22  ------------------------------------------------------------------
23
24
25  @author Nicklas
26  @version 2.0
27--%>
28<%@ page pageEncoding="UTF-8" session="false"
29  import="net.sf.basedb.core.SessionControl"
30  import="net.sf.basedb.core.DbControl"
31  import="net.sf.basedb.core.SystemItems"
32  import="net.sf.basedb.core.Item"
33  import="net.sf.basedb.core.Type"
34  import="net.sf.basedb.core.ItemContext"
35  import="net.sf.basedb.core.Permission"
36  import="net.sf.basedb.core.Group"
37  import="net.sf.basedb.core.User"
38  import="net.sf.basedb.core.Quota"
39  import="net.sf.basedb.core.Role"
40  import="net.sf.basedb.core.Directory"
41  import="net.sf.basedb.core.ExtendedProperties"
42  import="net.sf.basedb.core.ExtendedProperty" 
43  import="net.sf.basedb.core.QuotaType"
44  import="net.sf.basedb.core.Location"
45  import="net.sf.basedb.core.Include"
46  import="net.sf.basedb.core.ItemQuery"
47  import="net.sf.basedb.core.ItemResultList"
48  import="net.sf.basedb.core.PermissionDeniedException"
49  import="net.sf.basedb.core.query.Orders"
50  import="net.sf.basedb.core.query.Hql"
51  import="net.sf.basedb.core.query.Restrictions"
52  import="net.sf.basedb.core.query.Expressions"
53  import="net.sf.basedb.clients.web.Base"
54  import="net.sf.basedb.clients.web.util.HTML"
55  import="net.sf.basedb.util.Values"
56  import="net.sf.basedb.util.formatter.Formatter"
57  import="net.sf.basedb.clients.web.formatter.FormatterFactory"
58  import="net.sf.basedb.clients.web.formatter.FormatterSettings"
59  import="net.sf.basedb.core.plugin.GuiContext"
60  import="net.sf.basedb.clients.web.extensions.ExtensionsControl"
61  import="net.sf.basedb.clients.web.extensions.JspContext"
62  import="net.sf.basedb.clients.web.extensions.edit.EditUtil"
63  import="net.sf.basedb.util.extensions.ExtensionsInvoker"
64  import="java.util.Date"
65  import="java.util.List" 
66%>
67<%@ taglib prefix="base" uri="/WEB-INF/base.tld" %>
68<%@ taglib prefix="t" uri="/WEB-INF/tab.tld" %>
69<%
70final Item itemType = Item.USER;
71final SessionControl sc = Base.getExistingSessionControl(pageContext, true);
72final ItemContext cc = Base.getAndSetCurrentContext(sc, itemType, null, null);
73final int itemId = cc.getId();
74final String ID = sc.getId();
75final float scale = Base.getScale(sc);
76final DbControl dc = sc.newDbControl();
77try
78{
79  String title = null;
80  User user = null;
81 
82  List<ExtendedProperty> extendedProperties = ExtendedProperties.getProperties("UserData");
83
84  final QuotaType total = QuotaType.getById(dc, SystemItems.getId(QuotaType.TOTAL));
85  Quota currentQuota = null;
86  Group currentQuotaGroup = null;
87  Directory homeDirectory = null;
88
89  // Query to retrieve group membership
90  ItemQuery<Group> groupQuery = null;
91  // Query to retrieve role membership
92  ItemQuery<Role> roleQuery = null;
93
94  if (itemId == 0)
95  {
96    title = "Create user";
97    cc.removeObject("item");
98    if (cc.getPropertyFilter("quota.name") != null)
99    {
100      currentQuota = Base.getFirstMatching(dc, Quota.getQuery(), "name", cc.getPropertyFilter("quota.name"));
101    }
102    else
103    {
104      currentQuota = Quota.getById(dc, SystemItems.getId(Quota.DEFAULT));
105    } 
106    if (cc.getPropertyFilter("quotaGroup.name") != null)
107    {
108      currentQuotaGroup = Base.getFirstMatching(dc, Group.getQuery(), "name", cc.getPropertyFilter("quotaGroup.name"));
109    }
110   
111    groupQuery = Group.getQuery();
112    groupQuery.restrict(
113      Restrictions.eq(
114        Hql.property("default"), 
115        Expressions.parameter("isDefault", true, Type.BOOLEAN)
116      )
117    );
118    groupQuery.order(Orders.asc(Hql.property("name")));
119    roleQuery = Role.getQuery();
120    roleQuery.restrict(
121      Restrictions.eq(
122        Hql.property("default"), 
123        Expressions.parameter("isDefault", true, Type.BOOLEAN)
124      )
125    );
126    roleQuery.order(Orders.asc(Hql.property("name")));
127   
128  }
129  else
130  {
131    user = User.getById(dc, itemId);
132    cc.setObject("item", user);
133    title = "Edit user -- " + HTML.encodeTags(user.getName());
134
135    try
136    {
137      currentQuota = user.getQuota();
138    }
139    catch (PermissionDeniedException ex)
140    {}
141    try
142    {
143      currentQuotaGroup = user.getQuotaGroup();
144    }
145    catch (PermissionDeniedException ex)
146    {}
147    try
148    {
149      homeDirectory = user.getHomeDirectory();
150    }
151    catch (PermissionDeniedException ex)
152    {}
153
154    groupQuery = user.getGroups();
155    groupQuery.include(Include.ALL);
156    groupQuery.order(Orders.asc(Hql.property("name")));
157    roleQuery = user.getRoles();
158    roleQuery.include(Include.ALL);
159    roleQuery.order(Orders.asc(Hql.property("name")));
160  }
161  if (user != null && !user.hasPermission(Permission.WRITE))
162  {
163    throw new PermissionDeniedException(Permission.WRITE, itemType.toString());
164  }
165 
166  final boolean readQuota = sc.hasPermission(Permission.READ, Item.QUOTA);
167  final boolean useQuota = sc.hasPermission(Permission.USE, Item.QUOTA);
168  final boolean createDirectories = sc.hasPermission(Permission.CREATE, Item.DIRECTORY);
169  final boolean readDirectories = sc.hasPermission(Permission.READ, Item.DIRECTORY);
170  final boolean readGroups = sc.hasPermission(Permission.READ, Item.GROUP);
171  final boolean useGroups = sc.hasPermission(Permission.USE, Item.GROUP);
172  final boolean writeGroups = sc.hasPermission(Permission.WRITE, Item.GROUP);
173  final boolean writeRoles = sc.hasPermission(Permission.WRITE, Item.ROLE);
174  final boolean writeMembership = writeGroups && writeRoles;
175 
176  // Query to retrieve quota
177  final ItemQuery<Quota> quotaQuery = Quota.getQuery();
178  quotaQuery.include(Include.ALL);
179  quotaQuery.order(Orders.asc(Hql.property("name")));
180  quotaQuery.setCacheResult(true);
181
182  // Query to retrieve quota groups
183  final ItemQuery<Group> quotaGroupQuery = Group.getQuery();
184  quotaGroupQuery.include(Include.ALL);
185  quotaGroupQuery.order(Orders.asc(Hql.property("name")));
186  quotaGroupQuery.restrict(Restrictions.neq(Hql.property("quota"), null));
187  quotaGroupQuery.setCacheResult(true);
188
189  // Query to retrieve home directories
190  final ItemQuery<Directory> directoryQuery = Directory.getQuery();
191  directoryQuery.include(Include.ALL);
192  directoryQuery.order(Orders.asc(Hql.property("name")));
193  directoryQuery.restrict(
194    Restrictions.eq(
195      Hql.property("parent"),
196      Expressions.integer(SystemItems.getId(Directory.HOME))
197    )
198  );
199  directoryQuery.setCacheResult(true);
200
201  final String clazz = "class=\"text\"";
202  final String requiredClazz = "class=\"text required\"";
203  Formatter<Date> dateFormatter = FormatterFactory.getDateFormatter(sc);
204  String dateFormat = FormatterSettings.getDateFormat(sc);
205  String jsDateFormat = HTML.javaScriptEncode(dateFormat);
206  String htmlDateFormat = HTML.encodeTags(dateFormat);
207  Formatter<Date> dateTimeFormatter = FormatterFactory.getDateTimeFormatter(sc);
208  String dateTimeFormat = FormatterSettings.getDateTimeFormat(sc);
209  String jsDateTimeFormat = HTML.javaScriptEncode(dateTimeFormat);
210  String htmlDateTimeFormat = HTML.encodeTags(dateTimeFormat);
211  JspContext jspContext = ExtensionsControl.createContext(dc, pageContext, GuiContext.item(itemType), user);
212  ExtensionsInvoker invoker = EditUtil.useEditExtensions(jspContext);
213  %>
214  <base:page type="popup" title="<%=title%>">
215  <base:head scripts="tabcontrol.js,linkitems.js" styles="tabcontrol.css">
216    <ext:scripts context="<%=jspContext%>" />
217    <ext:stylesheets context="<%=jspContext%>" />
218    <script language="JavaScript">
219    // Validate the "User" tab
220    function validateUser()
221    {
222      var frm = document.forms['user'];
223      if (Main.trimString(frm.name.value) == '')
224      {
225        alert('You must enter a name for the user.');
226        frm.name.focus();
227        return false;
228      }
229      else if (Main.trimString(frm.login.value) == '')
230      {
231        alert('You must enter a login for the user.');
232        frm.login.focus();
233        return false;
234      }
235      else if (frm.new_password.value != frm.retype_password.value)
236      {
237        frm.retype_password.focus();
238        alert('The two passwords do not match!');
239        return false;
240      }
241      <%
242      if (itemId == 0)
243      {
244        %>
245        else if (Main.trimString(frm.new_password.value) == '')
246        {
247          alert('You must enter a password for the user.');
248          frm.new_password.focus();
249          return false;
250        }
251        <%
252      }
253      %>     
254      return true;
255    }
256   
257    // Validate the "Extended properties" tab
258    function validateExtendedProperties()
259    {
260      var frm = document.forms['user'];
261      var field;
262      <%
263      if (extendedProperties != null)
264      {
265        for (ExtendedProperty ep : extendedProperties)
266        {
267          Type type = ep.getType();
268          String name = ep.getName();
269          %>
270          field = frm['<%=name%>'];
271          <%
272          if (type == Type.DATE)
273          {
274            %>
275            if (field.value != '' && !Dates.isDate(field.value, '<%=jsDateFormat%>'))
276            {
277              alert("'"+field.value+"' is not a valid date for '<%=HTML.javaScriptEncode(ep.getTitle())%>'");
278              field.focus();
279              return false;
280            }
281            <%
282          }
283          else if (type == Type.TIMESTAMP)
284          {
285            %>
286            if (field.value != '' && !Dates.isDate(field.value, '<%=jsDateTimeFormat%>'))
287            {
288              alert("'"+field.value+"' is not a valid timestamp for '<%=HTML.javaScriptEncode(ep.getTitle())%>'");
289              field.focus();
290              return false;
291            }
292            <%
293          }
294          if (!ep.isNullable())
295          {
296            if (type == Type.BOOLEAN)
297            {
298              %>
299              if (Forms.getCheckedRadio(field) == null)
300              {
301                alert("You must select a value for '<%=HTML.javaScriptEncode(ep.getTitle())%>'");
302                field.focus();
303                return false;
304              }
305              <%
306            }
307            else
308            {
309              %>
310              if (Main.trimString(field.value) == '')
311              {
312                alert("You must enter a value for '<%=HTML.javaScriptEncode(ep.getTitle())%>'.");
313                field.focus();
314                return false;
315              }
316              <%
317            }
318          }
319        }
320      }
321      %>
322      return true;
323    }
324   
325    // Validate the "Contact information" tab
326    function validateContact()
327    {
328      return true;
329    }
330   
331    // Validate the "Membership" tab
332    function validateMembership()
333    {
334      return true;
335    }
336
337    // Submit the form
338    function saveSettings()
339    {
340      var frm = document.forms['user'];
341      if (TabControl.validateActiveTab('settings'))
342      {
343        frm.addRoles.value = Link.getActionIds(1, 'R').join(',');
344        frm.removeRoles.value = Link.getActionIds(-1, 'R').join(',');
345        frm.addGroups.value = Link.getActionIds(1, 'G').join(',');
346        frm.removeGroups.value = Link.getActionIds(-1, 'G').join(',');
347        frm.submit();
348      }
349    }
350   
351    function init()
352    {
353      <%
354      if (user == null)
355      {
356        %>
357        var frm = document.forms['user'];
358        frm.name.focus();
359        frm.name.select();
360        <%
361      }
362      %>
363      initMembership();
364    }
365    function initMembership()
366    {
367      var members = document.forms['user'].membership;
368      Link.addNewSection(members, new Section('G', 'Groups'));
369      <%
370      if (groupQuery != null)
371      {
372        ItemResultList<Group> groups = groupQuery.list(dc);
373        for (Group group : groups)
374        {
375          %>
376          Link.addNewItem(members, new Item('G', <%=group.getId()%>, '<%=HTML.javaScriptEncode(group.getName())%>'));
377          <%
378        }
379      }
380      %>
381      Link.addNewSection(members, new Section('R', 'Roles'));
382      <%
383      if (roleQuery != null)
384      {
385        ItemResultList<Role> roles = roleQuery.list(dc);
386        for (Role role : roles)
387        {
388          %>
389          Link.addNewItem(members, new Item('R', <%=role.getId()%>, '<%=HTML.javaScriptEncode(role.getName())%>'));
390          <%
391        }
392      }
393      %>
394    }
395    function addRolesOnClick()
396    {
397      var roles = Link.getListIds(document.forms['user'].membership, 'R');
398      var url = '../roles/index.jsp?ID=<%=ID%>&cmd=UpdateContext&mode=selectmultiple&callback=addRoleCallback';
399      url += '&exclude='+roles.join(',');
400      Main.openPopup(url, 'AddRoles', 1000, 700);
401    }
402    function addRoleCallback(roleId, name)
403    {
404      var item = Link.getItem('R', roleId);
405      if (!item) item = new Item('R', roleId, name);
406      Link.addItem(document.forms['user'].membership, item);
407    }
408    function addGroupsOnClick()
409    {
410      var groups = Link.getListIds(document.forms['user'].membership, 'G');
411      var url = '../groups/index.jsp?ID=<%=ID%>&cmd=UpdateContext&mode=selectmultiple&callback=addGroupCallback';
412      url += '&exclude='+groups.join(',');
413      Main.openPopup(url, 'AddGroups', 1000, 700);
414    }
415    function addGroupCallback(groupId, name)
416    {
417      var item = Link.getItem('G', groupId);
418      if (!item) item = new Item('G', groupId, name);
419      Link.addItem(document.forms['user'].membership, item);
420    }
421    function removeOnClick()
422    {
423      Link.removeSelected(document.forms['user'].membership);
424    }
425 
426    </script>
427  </base:head>
428  <base:body onload="init()">
429    <h1><%=title%> <base:help tabcontrol="settings" /></h1>
430    <form action="index.jsp?ID=<%=ID%>" method="post" name="user" onsubmit="return false;">
431    <input type="hidden" name="cmd" value="UpdateItem">
432
433    <t:tabcontrol id="settings"
434      subclass="content dialogtabcontrol"
435      position="bottom" remember="<%=user != null%>"
436      extensions="<%=invoker%>">
437    <t:tab id="info" title="User" validate="validateUser()" helpid="user.edit">
438      <table class="fullform input100">
439      <tr>
440        <th>Name</th>
441        <td><input <%=requiredClazz%> type="text" name="name" 
442          value="<%=HTML.encodeTags(user == null ? Values.getString(cc.getPropertyValue("name"), "New user") : user.getName())%>" 
443          size="40" maxlength="<%=User.MAX_NAME_LENGTH%>"></td>
444        <td></td>
445      </tr>
446      <tr>
447        <th>Login</th>
448        <td><input <%=requiredClazz%> type="text" name="login" 
449          value="<%=HTML.encodeTags(user == null ? cc.getPropertyValue("login") : user.getLogin())%>" 
450          maxlength="<%=User.MAX_LOGIN_LENGTH%>"></td>
451        <td></td>
452      </tr>
453      <tr>
454        <th>External ID</th>
455        <td><input <%=clazz%> type="text" name="external_id" 
456          value="<%=HTML.encodeTags(user == null ? cc.getPropertyValue("externalId") : user.getExternalId())%>" 
457          maxlength="<%=User.MAX_EXTERNAL_ID_LENGTH%>"></td>
458        <td></td>
459      </tr>
460      <tr>
461        <th>New password</th>
462        <td><input <%=itemId == 0 ? requiredClazz : clazz%> type="password" name="new_password" value="" maxlength="30" style="max-width: 20em;"
463          <%=itemId == 0 ? "" : "placeholder=\"leave empty to keep the password\"" %>
464          ></td>
465        <td></td>
466      </tr>
467      <tr>
468        <th class="subprompt">Retype password</th>
469        <td><input <%=itemId == 0 ? requiredClazz : clazz%> type="password" name="retype_password" value="" maxlength="30" style="max-width: 20em;"></td>
470        <td></td>
471      </tr>
472      <tr>
473        <th>Quota</th>
474        <td>
475          <select name="quota_id" <%=!useQuota ? "disabled readonly class=\"disabled\"" : "class=\"required selectionlist\""%>>
476          <%
477          if (!readQuota)
478          {
479            %>
480            <option value="-1">- denied -
481            <%
482          }
483          ItemResultList<Quota> quotas = quotaQuery.list(dc);
484          for (Quota quota : quotas)
485          {
486            boolean current = quota.equals(currentQuota);
487            if (!current && quota.isRemoved()) continue;
488            int id = quota.getId();
489            long totalBytes = quota.getQuotaValue(total, Location.PRIMARY);
490            String fTotal = totalBytes == Quota.UNLIMITED ? "unlimited" : Values.formatBytes(totalBytes);
491            %>
492            <option 
493              value="<%=current && user != null ? -id : id%>" 
494              <%=current ? "selected" : ""%>
495              ><%=HTML.encodeTags(quota.getName())%> (<%=fTotal%> total)
496            <%
497          }
498          %>
499        </td>
500        <td></td>
501      </tr>
502      <tr>
503        <th>Quota group</th>
504        <td>
505          <select name="quotagroup_id" <%=!useGroups ? "disabled readonly class=\"disabled\"" : "class=\"selectionlist\""%>>
506          <%
507          if (!readGroups)
508          {
509            %>
510            <option value="-1">- denied -
511            <%
512          }
513          else
514          {
515            %>
516            <option value="0">- none -
517            <%
518            ItemResultList<Group> quotaGroups = quotaGroupQuery.list(dc);
519            for (Group quotaGroup : quotaGroups)
520            {
521              boolean current = quotaGroup.equals(currentQuotaGroup);
522              if (!current && quotaGroup.isRemoved()) continue;
523              int id = quotaGroup.getId();
524              Quota quota = quotaGroup.getQuota();
525              long totalBytes = quota.getQuotaValue(total, Location.PRIMARY);
526              String fTotal = totalBytes == Quota.UNLIMITED ? "unlimited" : Values.formatBytes(totalBytes);
527              %>
528              <option 
529                value="<%=current && user != null ? -id : id %>"
530                <%=current ? "selected" : ""%>
531                ><%=HTML.encodeTags(quotaGroup.getName())%> (<%=fTotal%> total)
532              <%
533            }
534          }
535          %>
536        </td>
537        <td></td>
538      </tr>
539      <tr>
540        <th>Home directory</th>
541        <td>
542          <select name="homedirectory_id" <%=!readDirectories ? "disabled readonly class=\"disabled\"" : "class=\"selectionlist\""%>>
543          <%
544          if (!readDirectories)
545          {
546            %>
547            <option value="-1">- denied -
548            <%
549          }
550          else
551          {
552            %>
553            <option value="0">- none -
554            <%
555            if (createDirectories && user == null)
556            {
557              %>
558              <option value="new">- create new (empty) -
559              <option value="template" selected>- create new from template -
560              <%
561            }
562            ItemResultList<Directory> directories = directoryQuery.list(dc);
563            for (Directory d : directories)
564            {
565              int id = d.getId();
566              boolean current = d.equals(homeDirectory);
567              if (!current && d.isRemoved()) continue;
568              %>
569              <option 
570                value="<%=current && user != null ? -id : id%>" 
571                <%=current ? "selected" : ""%>
572                ><%=HTML.encodeTags(d.getName())%>
573              <%
574            }
575          }
576          %>
577        </td>
578        <td></td>
579      </tr>
580      <tr>
581        <th>Expiration date</th>
582        <td>
583          <table>
584          <tr>
585            <td>
586            <input <%=clazz%> type="text" name="expiration_date" style="width: 15em;"
587              value="<%=HTML.encodeTags(dateFormatter.format(
588                  user == null ? (Date)cc.getPropertyObject("expirationDate") : user.getExpirationDate())
589                )%>"
590              maxlength="20" title="Enter date in format: <%=htmlDateFormat%>">
591            </td>
592            <td>
593              <base:button 
594                onclick="<%="Dates.selectDate('Expiration date', 'user', 'expiration_date', null, '"+jsDateFormat + "')"%>" 
595                image="calendar.png"
596                title="Calendar&hellip;" 
597                tooltip="Select a date from a calendar"
598              />
599            </td>
600          </tr>
601          </table>
602        </td>
603        <td></td>
604      </tr>
605      <tr>
606        <th><label for="multiuser_account">Multi-user account</label></th>
607        <td><input type="checkbox" name="multiuser_account" id="multiuser_account" value="1" 
608          <%=(user != null && user.isMultiuserAccount()) || 
609            (user == null && Values.getBoolean(cc.getPropertyValue("multiuserAccount"))) ? "checked" : ""%>></td>
610        <td></td>
611      </tr>
612      <tr>
613        <th><label for="disabled">Disabled</label></th>
614        <td><input type="checkbox" name="disabled" id="disabled" value="1" 
615          <%=(user != null && user.isDisabled()) || 
616            (user == null && Values.getBoolean(cc.getPropertyValue("disabled"))) ? "checked" : ""%>></td>
617        <td></td>
618      </tr>
619      <tr class="dynamic">
620        <th>Description</th>
621        <td>
622          <textarea <%=clazz%> rows="6" name="description" 
623            ><%=HTML.encodeTags(user == null ? cc.getPropertyValue("description") : user.getDescription())%></textarea>
624        </td>
625        <td style="width: 20px;">
626          <base:icon image="zoom.png" 
627            onclick="Main.zoom('Description', 'user', 'description')"
628            tooltip="Edit in larger window"
629          />
630        </td>
631      </tr>
632      </table>
633    </t:tab>
634   
635    <t:tab id="contact" title="Contact information" 
636      tooltip="Email, adress, organisation, etc." validate="validateContact()" helpid="user.edit.contact">
637      <table class="fullform input100">
638      <tr>
639        <th>Email</th>
640        <td><input <%=clazz%> type="text" name="email" 
641          value="<%=HTML.encodeTags(user == null ? cc.getPropertyValue("email") : user.getEmail())%>" 
642          maxlength="<%=User.MAX_EMAIL_LENGTH%>"></td>
643        <td></td>
644      </tr>
645      <tr>
646        <th>Organisation</th>
647        <td><input <%=clazz%> type="text" name="organisation" 
648          value="<%=HTML.encodeTags(user == null ? cc.getPropertyValue("organisation") : user.getOrganisation())%>" 
649          maxlength="<%=User.MAX_ORGANISATION_LENGTH%>"></td>
650        <td></td>
651      </tr>
652      <tr class="big">
653        <th>Address</th>
654        <td>
655          <textarea <%=clazz%> rows="6" name="address" 
656            wrap="off"><%=HTML.encodeTags(user == null ? cc.getPropertyValue("address") : user.getAddress())%></textarea>
657        </td>
658        <td style="width: 20px;">
659          <base:icon image="zoom.png" 
660            onclick="Main.zoom('Address', 'user', 'address')"
661            tooltip="Edit in larger window"
662          />
663        </td>
664      </tr>
665      <tr>
666        <th>Phone</th>
667        <td><input <%=clazz%> type="text" name="phone" 
668          value="<%=HTML.encodeTags(user == null ? cc.getPropertyValue("phone") : user.getPhone())%>" 
669          maxlength="<%=User.MAX_PHONE_LENGTH%>"></td>
670        <td></td>
671      </tr>
672      <tr>
673        <th>Fax</th>
674        <td><input <%=clazz%> type="text" name="fax" 
675          value="<%=HTML.encodeTags(user == null ? cc.getPropertyValue("fax") : user.getFax())%>" 
676          maxlength="<%=User.MAX_FAX_LENGTH%>"></td>
677        <td></td>
678      </tr>
679      <tr>
680        <th>Url</th>
681        <td><input <%=clazz%> type="text" name="url" 
682          value="<%=HTML.encodeTags(user == null ? cc.getPropertyValue("url") : user.getUrl())%>" 
683          maxlength="<%=User.MAX_URL_LENGTH%>"></td>
684        <td></td>
685      </tr>
686      <tr class="dynamic">
687        <th></th>
688        <td colspan="2"></td>
689      </tr>
690      </table>
691    </t:tab>
692    <%
693    if (extendedProperties != null)
694    {
695      %>
696      <t:tab id="extended" title="Additional info" 
697        validate="validateExtendedProperties()" helpid="user.edit.additional">
698        <table class="fullform input100">
699          <%
700            for (ExtendedProperty ep : ExtendedProperties.getProperties("UserData"))
701            {
702              String name = ep.getName();
703              Type type = ep.getType();
704              boolean required = !ep.isNullable();
705              Object value = user == null ? cc.getPropertyValue(name) : user.getExtended(name);
706              String theClazz = required ? requiredClazz : clazz;
707              boolean addZoom = false;
708              %>
709              <tr>
710                <th><%=HTML.encodeTags(ep.getTitle())%></th>
711                <td>
712                <%
713                if (type == Type.INT || type == Type.LONG)
714                {
715                  %>
716                  <input <%=theClazz%> type="text" name="<%=name%>" style="width: 15m;"
717                    value="<%=value == null ? "" : value%>"
718                    maxlength="20" onkeypress="return Numbers.integerOnly(event)"
719                    >
720                  <%
721                }
722                else if (type == Type.FLOAT || type == Type.DOUBLE)
723                {
724                  %>
725                  <input <%=theClazz%> type="text" name="<%=name%>"
726                    value="<%=value == null ? "" : value%>" style="width: 15m;"
727                    maxlength="20" onkeypress="return Numbers.numberOnly(event)"
728                    >
729                  <%
730                }
731                else if (type == Type.STRING)
732                {
733                  %>
734                  <input <%=theClazz%> type="text" name="<%=name%>"
735                    value="<%=HTML.encodeTags((String)value)%>"
736                    maxlength="<%=ep.getLength()%>"
737                    >
738                  <%
739                }
740                else if (type == Type.TEXT)
741                {
742                  addZoom = true;
743                  %>
744                  <textarea <%=theClazz%> name="<%=name%>" rows="6" 
745                    ><%=HTML.encodeTags((String)value)%></textarea>
746                  <%
747                }
748                else if (type == Type.BOOLEAN)
749                {
750                  Boolean b = (Boolean)value;
751                  if (!required)
752                  {
753                    %>
754                    <input type="radio" name="<%=name%>" id="<%=name%>.null" value=""
755                      <%=b == null ? "checked" : ""%> 
756                      ><label for="<%=name%>.null"><i>- not specified -</i></label><br>
757                    <%
758                  }
759                  %>
760                  <input type="radio" name="<%=name%>" id="<%=name%>.true" value="true" 
761                    <%=b != null && b == true ? "checked" : ""%>
762                    ><label for="<%=name%>.true">true</label><br>
763                  <input type="radio" name="<%=name%>" id="<%=name%>.false" value="false" 
764                    <%=b != null && b == false ? "checked" : ""%>
765                    ><label for="<%=name%>.false">false</label>
766                  <%
767                }
768                else if (type == Type.DATE)
769                {
770                  %>
771                  <table>
772                  <tr>
773                  <td>
774                    <input <%=theClazz%> type="text" name="<%=name%>" 
775                      value="<%=dateFormatter.format((Date)value)%>" style="width: 15em;"
776                      maxlength="20" title="Enter date in format: <%=htmlDateFormat%>"
777                      >
778                  </td>
779                  <td>
780                    <base:button 
781                      onclick="<%="Dates.selectDate('"+HTML.javaScriptEncode(ep.getTitle())+"', 'user', '"+name+"', null, '"+jsDateFormat +"')"%>" 
782                      image="calendar.png"
783                      title="Calendar&hellip;" 
784                      tooltip="Select a date from a calendar" 
785                    />
786                  </td>
787                  </tr>
788                  </table>
789                  <%
790                }
791                else if (type == Type.TIMESTAMP)
792                {
793                  %>
794                  <table>
795                  <tr>
796                  <td>
797                    <input <%=theClazz%> type="text" name="<%=name%>" 
798                      value="<%=dateTimeFormatter.format((Date)value)%>"  style="width: 15em;"
799                      maxlength="20" title="Enter timestamp in format: <%=htmlDateTimeFormat%>"
800                      >
801                  </td>
802                  <td>
803                    <base:button 
804                      onclick="<%="Dates.selectDateTime('"+HTML.javaScriptEncode(ep.getTitle())+"', 'user', '"+name+"', null, '"+jsDateTimeFormat +"')"%>" 
805                      image="calendar.png"
806                      title="Calendar&hellip;" 
807                      tooltip="Select a timestamp from a calendar" 
808                    />
809                  </td>
810                  </tr>
811                  </table>
812                  <%
813                }
814                %>
815                </td>
816                <td style="width: 20px;">
817                  <%if (addZoom)
818                  {
819                    %>
820                    <base:icon image="zoom.png" 
821                      onclick="<%="Main.zoom('" + HTML.javaScriptEncode(ep.getTitle()) + "', 'user', '" + name + "')"%>"
822                      tooltip="Edit in larger window"
823                    />
824                    <%
825                  }
826                  %>
827                </td>
828              </tr>
829              <%
830            }
831          %>
832          <tr class="dynamic">
833            <th></th>
834            <td colspan="2"></td>
835          </tr>
836        </table>
837      </t:tab>
838    <%
839    }
840    %>   
841    <t:tab id="members" title="Membership"  tooltip="Manage group and role membership" 
842      validate="validateMembership()" helpid="user.edit.membership">
843      <table class="fullform">
844      <tr class="dynamic">
845        <th>Member in</th>
846        <td>
847          <div class="selectionlist">
848            <table>
849            <tr>
850              <td>
851                <select name="membership" size="15" multiple <%=!writeMembership ? "disabled readonly class=\"disabled\"" : ""%>>
852                </select>
853                <input type="hidden" name="removeGroups" value="">
854                <input type="hidden" name="addGroups" value="">
855                <input type="hidden" name="removeRoles" value="">
856                <input type="hidden" name="addRoles" value="">
857              </td>
858              <td style="vertical-align: top;">
859                <base:buttongroup vertical="true">
860                  <base:button 
861                    subclass="leftaligned"
862                    onclick="addGroupsOnClick()" 
863                    title="Add&nbsp;groups&hellip;" 
864                    tooltip="Add groups to this user"
865                    disabled="<%=!writeMembership %>" 
866                  />
867                  <base:button 
868                    subclass="leftaligned"
869                    onclick="addRolesOnClick()" 
870                    title="Add&nbsp;roles&hellip;" 
871                    tooltip="Add roles to this user"
872                    disabled="<%=!writeMembership %>" 
873                  />
874                  <base:button 
875                    subclass="leftaligned"
876                    onclick="removeOnClick()" 
877                    title="Remove" 
878                    tooltip="Remove the user from the selected items"
879                    disabled="<%=!writeMembership%>" 
880                  />
881                </base:buttongroup>
882              </td>
883            </tr>
884            </table>
885          </div>
886        </td>
887      </tr>
888      </table>
889
890    </t:tab>
891    </t:tabcontrol>
892    </form>
893   
894    <div class="legend">
895      <base:icon image="required.gif" /> = required information
896    </div>
897
898    <base:buttongroup subclass="dialogbuttons">
899      <base:button onclick="saveSettings()" title="Save" />
900      <base:button onclick="window.close()" title="Cancel" />
901    </base:buttongroup>
902  </base:body>
903  </base:page>
904  <%
905}
906finally
907{
908  if (dc != null) dc.close();
909}
910%>
Note: See TracBrowser for help on using the repository browser.