source: trunk/www/my_base/user/settings.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: 14.3 KB
Line 
1<%-- $Id: settings.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
5  Copyright (C) 2007 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  This page is used to display and modify the attributes of
25  the logged in user. It displays a tabbed dialogue:
26
27  @param page
28    The name active page of the tabbed dialog.
29    - contact: Contact information for the user, address, phone, email, etc.
30    - password: The password for the user
31    - other: Other information
32
33  Saving the form invokes the submit_user.jsp page with cmd=SaveSettings
34
35  @author Nicklas
36  @version 2.0
37--%>
38<%@ page pageEncoding="UTF-8" session="false"
39  import="net.sf.basedb.core.*"
40  import="net.sf.basedb.util.EmailUtil"
41  import="net.sf.basedb.clients.web.*"
42  import="net.sf.basedb.clients.web.util.HTML"
43  import="net.sf.basedb.util.formatter.Formatter" 
44  import="net.sf.basedb.clients.web.formatter.FormatterFactory"
45  import="net.sf.basedb.clients.web.formatter.FormatterSettings"
46  import="java.util.Date"
47  import="java.util.List"   
48%>
49<%@ taglib prefix="base" uri="/WEB-INF/base.tld" %>
50<%@ taglib prefix="t" uri="/WEB-INF/tab.tld" %>
51<%
52final SessionControl sc = Base.getExistingSessionControl(pageContext, true);
53final String ID = sc.getId();
54final String activePage = request.getParameter("page");
55final float scale = Base.getScale(sc);
56final DbControl dc = sc.newDbControl();
57final ItemContext cc = Base.getAndSetCurrentContext(sc, Item.USER, null, null);
58try
59{
60  final User user = User.getById(dc, sc.getLoggedInUserId());
61  final String title = "Information for " + HTML.encodeTags(user.getName());
62  final boolean writePermission = user.hasPermission(Permission.RESTRICTED_WRITE);
63  final String ifDisabled = writePermission ? "" : "disabled";
64  final String passwordDisabled = writePermission && Application.isUsingInternalAuthentication() ? 
65    "" : "disabled";
66  dc.detachItem(user);
67  sc.setSessionSetting("user", user);
68 
69  List<ExtendedProperty> extendedProperties = ExtendedProperties.getProperties("UserData");
70 
71  Formatter<Date> dateFormatter = FormatterFactory.getDateFormatter(sc);
72  String dateFormat = FormatterSettings.getDateFormat(sc);
73  String jsDateFormat = HTML.javaScriptEncode(dateFormat);
74  String htmlDateFormat = HTML.encodeTags(dateFormat);
75  Formatter<Date> dateTimeFormatter = FormatterFactory.getDateTimeFormatter(sc);
76  String dateTimeFormat = FormatterSettings.getDateTimeFormat(sc);
77  String jsDateTimeFormat = HTML.javaScriptEncode(dateTimeFormat);
78  String htmlDateTimeFormat = HTML.encodeTags(dateTimeFormat);
79  %>
80  <base:page type="popup" title="<%=title%>">
81  <base:head scripts="tabcontrol.js" styles="tabcontrol.css">
82    <script language="JavaScript">
83    // Validate the "Contact information" tab
84    function validateContact()
85    {
86      return true;
87    }
88    // Validate the "Password" tab - check that both passwords match
89    function validatePassword()
90    {
91      var frm = document.forms["user"];
92      if (frm.password.value != frm.retype_password.value)
93      {
94        frm.retype_password.focus();
95        alert("The two passwords do not match!");
96        return false;
97      }
98      return true;
99    }
100   
101    // Validate the "Extended properties" tab
102    function validateExtendedProperties()
103    {
104      var frm = document.forms['user'];
105      var field;
106      <%
107      if (extendedProperties != null)
108      {
109        for (ExtendedProperty ep : extendedProperties)
110        {
111          Type type = ep.getType();
112          String name = ep.getName();
113          %>
114          field = frm['<%=name%>'];
115          <%
116          if (type == Type.DATE)
117          {
118            %>
119            if (field.value != '' && !Dates.isDate(field.value, '<%=jsDateFormat%>'))
120            {
121              alert("'"+field.value+"' is not a valid date for '<%=HTML.javaScriptEncode(ep.getTitle())%>'");
122              field.focus();
123              return false;
124            }
125            <%
126          }
127          else if (type == Type.TIMESTAMP)
128          {
129            %>
130            if (field.value != '' && !Dates.isDate(field.value, '<%=jsDateTimeFormat%>'))
131            {
132              alert("'"+field.value+"' is not a valid timestamp for '<%=HTML.javaScriptEncode(ep.getTitle())%>'");
133              field.focus();
134              return false;
135            }
136            <%
137          }
138          if (!ep.isNullable())
139          {
140            if (type == Type.BOOLEAN)
141            {
142              %>
143              if (Forms.getCheckedRadio(field) == null)
144              {
145                alert("You must select a value for '<%=HTML.javaScriptEncode(ep.getTitle())%>'");
146                field.focus();
147                return false;
148              }
149              <%
150            }
151            else
152            {
153              %>
154              if (Main.trimString(field.value) == '')
155              {
156                alert("You must enter a value for '<%=HTML.javaScriptEncode(ep.getTitle())%>'.");
157                field.focus();
158                return false;
159              }
160              <%
161            }
162          }
163        }
164      }
165      %>
166      return true;
167    }
168   
169    // Submit the form
170    function saveSettings()
171    {
172      var frm = document.forms["user"];
173      if (TabControl.validateActiveTab('settings'))
174      {
175        frm.submit();
176      }
177    }
178    </script>
179  </base:head>
180  <base:body>
181    <h1><%=title%><base:help tabcontrol="settings" /></h1>
182 
183    <form action="submit_user.jsp?ID=<%=ID%>" method="post" name="user" onsubmit="return false;">
184    <input type=hidden name="cmd" value="SaveSettings">
185 
186    <t:tabcontrol 
187      subclass="content dialogtabcontrol"
188      active="<%=activePage%>" id="settings" 
189      position="bottom" remember="false">
190 
191      <t:tab id="contact" title="Contact information" validate="validateContact()" helpid="userpreferences.contact">
192        <table class="fullform input100">
193        <tr>
194          <th>Full name</th>
195          <td><%=HTML.encodeTags(user.getName())%></td>
196          <td></td>
197        </tr>
198        <tr>
199          <th>Email</th>
200          <td><input <%=ifDisabled%> type="text" name="email" value="<%=HTML.encodeTags(user.getEmail())%>" maxlength="<%=User.MAX_EMAIL_LENGTH%>"></td>
201          <td></td>
202        </tr>
203        <%
204        if (EmailUtil.isEnabled() && writePermission)
205        {
206          %>
207          <tr>
208            <th class="subprompt"></th>
209            <td>
210              <%
211              boolean sendMessagesAsEmail = user.getSendMessagesAsEmail();
212              %>
213              <input type="checkbox" name="sendMessagesAsEmail" id="sendMessagesAsEmail" value="1" <%=sendMessagesAsEmail ? "checked" : ""%>
214                ><label for="sendMessagesAsEmail">Send system messages as email</label>
215            </td>
216            <td></td>
217          </tr>
218          <%
219        }
220        %>
221        <tr>
222          <th>Organisation</th>
223          <td><input <%=ifDisabled%> type="text" name="organisation" value="<%=HTML.encodeTags(user.getOrganisation())%>" maxlength="<%=User.MAX_ORGANISATION_LENGTH%>"></td>
224          <td></td>
225        </tr>
226        <tr class="big">
227          <th>Address</th>
228          <td>
229            <textarea <%=ifDisabled%> rows="4" name="address"><%=HTML.encodeTags(user.getAddress())%></textarea>
230          </td>
231          <td style="width: 20px;">
232            <base:icon image="zoom.png" 
233              onclick="Main.zoom('Address', 'user', 'address')" 
234              visible="<%=writePermission%>"
235              tooltip="Edit in larger window" />
236          </td>
237        </tr>
238        <tr>
239          <th>Phone</th>
240          <td><input <%=ifDisabled%> type="text" name="phone" value="<%=HTML.encodeTags(user.getPhone())%>" maxlength="<%=User.MAX_PHONE_LENGTH%>"></td>
241          <td></td>
242        </tr>
243        <tr>
244          <th>Fax</th>
245          <td><input <%=ifDisabled%> type="text" name="fax" value="<%=HTML.encodeTags(user.getFax())%>" maxlength="<%=User.MAX_FAX_LENGTH%>"></td>
246          <td></td>
247        </tr>
248        <tr>
249          <th>Url</th>
250          <td><input <%=ifDisabled%> type="text" name="url" value="<%=HTML.encodeTags(user.getUrl())%>" maxlength="<%=User.MAX_URL_LENGTH%>"></td>
251          <td></td>
252        </tr>
253        <tr class="dynamic">
254          <th></th>
255          <td></td>
256          <td></td>
257        </tr>
258        </table>
259      </t:tab>
260     
261      <t:tab id="password" title="Password" validate="validatePassword()" helpid="userpreferences.password">
262        <% if (!Application.isUsingInternalAuthentication() && writePermission)
263        {
264          %>
265          <div class="error">Base is using external authentication. Password cannot be changed here.</div>
266          <%
267        }
268        %>
269        <table class="fullform input100">
270        <tr>
271          <th>Login</th>
272          <td><%=HTML.encodeTags(user.getLogin())%></td>
273        </tr>
274        <tr>
275          <th>New password</th>
276          <td><input <%=passwordDisabled%> type="password" name="password" value=""  maxlength="30"></td>
277        </tr>
278        <tr>
279          <th>Retype password</th>
280          <td><input <%=passwordDisabled%> type="password" name="retype_password" value="" maxlength="30"></td>
281        </tr>
282        <tr class="dynamic">
283          <th></th>
284          <td><i>- leave empty to not change the password</i></td>
285        </tr>
286        </table>
287      </t:tab>
288   
289      <t:tab id="other" title="Other information" 
290        validate="validateExtendedProperties()" helpid="userpreferences.other">
291        <table class="fullform input100">
292        <%
293        if (extendedProperties != null)
294        {
295          for (ExtendedProperty ep : ExtendedProperties.getProperties("UserData"))
296          {
297            String name = ep.getName();
298            Type type = ep.getType();
299            boolean required = !ep.isNullable();
300            Object value = user == null ? cc.getPropertyValue(name) : user.getExtended(name);
301            String isRequired = required ? "class=\"required\"" : "";
302            boolean addZoom = false;
303            %>
304            <tr>
305              <th><%=HTML.encodeTags(ep.getTitle())%></th>
306              <td>
307              <%
308              if (type == Type.INT || type == Type.LONG)
309              {
310                %>
311                <input <%=isRequired%> <%=ifDisabled %> type="text" name="<%=name%>" 
312                  value="<%=value == null ? "" : value%>" style="width: 15m;"
313                  maxlength="20" onkeypress="return Numbers.integerOnly(event)"
314                  >
315                <%
316              }
317              else if (type == Type.FLOAT || type == Type.DOUBLE)
318              {
319                %>
320                <input <%=isRequired%> <%=ifDisabled%> type="text" name="<%=name%>"
321                  value="<%=value == null ? "" : value%>" style="width: 15m;"
322                  maxlength="20" onkeypress="return Numbers.numberOnly(event)"
323                  >
324                <%
325              }
326              else if (type == Type.STRING)
327              {
328                %>
329                <input <%=isRequired%> <%=ifDisabled%> type="text" name="<%=name%>"
330                  value="<%=HTML.encodeTags((String)value)%>"
331                  maxlength="<%=ep.getLength()%>"
332                  >
333                <%
334              }
335              else if (type == Type.TEXT)
336              {
337                addZoom = true;
338                %>
339                <textarea <%=isRequired%> <%=ifDisabled%> name="<%=name%>" rows="6" 
340                  ><%=HTML.encodeTags((String)value)%></textarea>
341                <%
342              }
343              else if (type == Type.BOOLEAN)
344              {
345                Boolean b = (Boolean)value;
346                if (!required)
347                {
348                  %>
349                  <input type="radio" name="<%=name%>" id="<%=name%>.null" value=""
350                    <%=b == null ? "checked" : ""%> 
351                    ><label for="<%=name%>.null"><i>- not specified -</i></label><br>
352                  <%
353                }
354                %>
355                <input type="radio" name="<%=name%>" id="<%=name%>.true" value="true" 
356                  <%=b != null && b == true ? "checked" : ""%>
357                  ><label for="<%=name%>.true">true</label><br>
358                <input type="radio" name="<%=name%>" id="<%=name%>.false" value="false" 
359                  <%=b != null && b == false ? "checked" : ""%>
360                  ><label for="<%=name%>.false">false</label>
361                <%
362              }
363              else if (type == Type.DATE)
364              {
365                %>
366                <table>
367                <tr>
368                <td>
369                  <input <%=isRequired%> <%=ifDisabled%> type="text" name="<%=name%>" 
370                    value="<%=dateFormatter.format((Date)value)%>" style="width: 15em;"
371                    maxlength="20" title="Enter date in format: <%=htmlDateFormat%>"
372                    >
373                </td>
374                <td>
375                  <base:button 
376                    onclick="<%="Dates.selectDate('"+HTML.javaScriptEncode(ep.getTitle())+"', 'user', '"+name+"', null, '"+jsDateFormat +"')"%>" 
377                    image="calendar.png"
378                    title="Calendar&hellip;" 
379                    tooltip="Select a date from a calendar" 
380                    visible="<%=writePermission%>"
381                  />
382                </td>
383                </tr>
384                </table>
385                <%
386              }
387              else if (type == Type.TIMESTAMP)
388              {
389                %>
390                <table>
391                <tr>
392                <td>
393                  <input <%=isRequired%> <%=ifDisabled%> type="text" name="<%=name%>" 
394                    value="<%=dateTimeFormatter.format((Date)value)%>" style="width: 15em;"
395                    maxlength="20" title="Enter timestamp in format: <%=htmlDateTimeFormat%>"
396                    >
397                </td>
398                <td>
399                  <base:button 
400                    onclick="<%="Dates.selectDateTime('"+HTML.javaScriptEncode(ep.getTitle())+"', 'user', '"+name+"', null, '"+jsDateTimeFormat +"')"%>" 
401                    image="calendar.png"
402                    title="Calendar&hellip;" 
403                    tooltip="Select a timestamp from a calendar" 
404                    visible="<%=writePermission%>"
405                  />
406                </td>
407                </tr>
408                </table>
409                <%
410              }
411              %>
412              </td>
413              <td style="width: 20px;">
414                <%if (addZoom)
415                {
416                  %>
417                  <base:icon image="zoom.png" 
418                  onclick="<%="Main.zoom('" + HTML.javaScriptEncode(ep.getTitle()) + "', 'user', '" + name + "')"%>"
419                    tooltip="Edit in larger window"
420                    visible="<%=writePermission%>"
421                  />
422                  <%
423                }
424                %>
425              </td>
426            </tr>
427            <%
428          }
429        }
430        %>
431        <tr class="dynamic">
432          <th>Description</th>
433          <td>
434            <textarea <%=ifDisabled%> rows="5" name="description"><%=HTML.encodeTags(user.getDescription())%></textarea>
435          </td>
436          <td style="width: 20px;">
437            <base:icon image="zoom.png" 
438              onclick="Main.zoom('Description', 'user', 'description')"
439              tooltip="Edit in larger window"
440              visible="<%=writePermission%>"
441            />
442          </td>
443        </tr>
444        </table>
445      </t:tab>
446    </t:tabcontrol>
447    </form>
448 
449    <base:buttongroup subclass="dialogbuttons">
450      <base:button onclick="saveSettings();" title="Save" visible="<%=writePermission%>"/>
451      <base:button onclick="window.close();" title="Cancel" visible="<%=writePermission%>"/>
452      <base:button onclick="window.close();" title="Close" visible="<%=!writePermission%>"/>
453    </base:buttongroup>
454 
455  </base:body>
456  </base:page>
457  <%
458}
459finally
460{
461  if (dc != null) dc.close();
462}
463%>
Note: See TracBrowser for help on using the repository browser.