source: trunk/www/my_base/user/settings.jsp @ 6175

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

References #1734: Replace alert() messages in form validation with something better-looking

Implemented a function for this: Forms.showNotification which should replace all calls to alert(). The function will automatically focus and select the specified form field if possible. The notification automatically disappears when the user starts typing or when the field loses focus.

The setting dialogs in the "BASE" menu and the calendar popup has been used for testing.

  • Property svn:eol-style set to native
  • Property svn:keywords set to Id
File size: 12.4 KB
Line 
1<%-- $Id: settings.jsp 6175 2012-10-19 07:06:41Z 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.util.json.JsonUtil"
45  import="net.sf.basedb.util.json.JsonConverter"
46  import="net.sf.basedb.clients.web.formatter.FormatterFactory"
47  import="net.sf.basedb.clients.web.formatter.FormatterSettings"
48  import="org.json.simple.JSONObject"
49  import="org.json.simple.JSONArray"
50  import="java.util.Date"
51  import="java.util.List"
52%>
53<%@ taglib prefix="base" uri="/WEB-INF/base.tld" %>
54<%@ taglib prefix="t" uri="/WEB-INF/tab.tld" %>
55<%
56final SessionControl sc = Base.getExistingSessionControl(pageContext, true);
57final String ID = sc.getId();
58final String activePage = request.getParameter("page");
59final float scale = Base.getScale(sc);
60final DbControl dc = sc.newDbControl();
61final ItemContext cc = Base.getAndSetCurrentContext(sc, Item.USER, null, null);
62try
63{
64  final User user = User.getById(dc, sc.getLoggedInUserId());
65  final String title = "Information for " + HTML.encodeTags(user.getName());
66  final boolean writePermission = user.hasPermission(Permission.RESTRICTED_WRITE);
67  final String ifDisabled = writePermission ? "" : "disabled";
68  final String passwordDisabled = writePermission && Application.isUsingInternalAuthentication() ? 
69    "" : "disabled";
70  dc.detachItem(user);
71  sc.setSessionSetting("user", user);
72 
73  List<ExtendedProperty> extendedProperties = ExtendedProperties.getProperties("UserData");
74  JSONArray jsonExtendedProperties = JsonUtil.toArray(extendedProperties, new JsonConverter<ExtendedProperty>()
75    {
76      public Object convert(ExtendedProperty ep)
77      {
78        JSONObject json = new JSONObject();
79        json.put("name", ep.getName());
80        json.put("valueType", ep.getType().name());
81        json.put("title", ep.getTitle());
82        json.put("nullable", ep.isNullable());
83        return json;
84      }
85    });
86 
87  Formatter<Date> dateFormatter = FormatterFactory.getDateFormatter(sc);
88  String dateFormat = FormatterSettings.getDateFormat(sc);
89  String jsDateFormat = HTML.javaScriptEncode(dateFormat);
90  String htmlDateFormat = HTML.encodeTags(dateFormat);
91  Formatter<Date> dateTimeFormatter = FormatterFactory.getDateTimeFormatter(sc);
92  String dateTimeFormat = FormatterSettings.getDateTimeFormat(sc);
93  String jsDateTimeFormat = HTML.javaScriptEncode(dateTimeFormat);
94  String htmlDateTimeFormat = HTML.encodeTags(dateTimeFormat);
95%>
96  <base:page type="popup" title="<%=title%>">
97  <base:head scripts="tabcontrol-2.js,~settings.js" styles="tabcontrol.css" />
98  <base:body>
99    <h1><%=title%><base:help tabcontrol="settings" /></h1>
100 
101    <div id="page-data" class="datacontainer"
102      data-date-format="<%=htmlDateFormat%>"
103      data-datetime-format="<%=htmlDateTimeFormat%>"
104      data-extended-properties="<%=HTML.encodeTags(jsonExtendedProperties.toJSONString())%>"
105    ></div>
106 
107    <form action="submit_user.jsp?ID=<%=ID%>" method="post" name="user">
108    <input type=hidden name="cmd" value="SaveSettings">
109 
110    <t:tabcontrol 
111      subclass="content dialogtabcontrol"
112      active="<%=activePage%>" id="settings" 
113      position="bottom" remember="false">
114 
115      <t:tab id="contact" title="Contact information" helpid="userpreferences.contact">
116        <table class="fullform input100">
117        <tr>
118          <th>Full name</th>
119          <td><%=HTML.encodeTags(user.getName())%></td>
120          <td></td>
121        </tr>
122        <tr>
123          <th>Email</th>
124          <td><input <%=ifDisabled%> type="text" name="email" value="<%=HTML.encodeTags(user.getEmail())%>" maxlength="<%=User.MAX_EMAIL_LENGTH%>"></td>
125          <td></td>
126        </tr>
127        <%
128        if (EmailUtil.isEnabled() && writePermission)
129        {
130          %>
131          <tr>
132            <th class="subprompt"></th>
133            <td>
134              <%
135              boolean sendMessagesAsEmail = user.getSendMessagesAsEmail();
136              %>
137              <input type="checkbox" name="sendMessagesAsEmail" id="sendMessagesAsEmail" value="1" <%=sendMessagesAsEmail ? "checked" : ""%>
138                ><label for="sendMessagesAsEmail">Send system messages as email</label>
139            </td>
140            <td></td>
141          </tr>
142          <%
143        }
144        %>
145        <tr>
146          <th>Organisation</th>
147          <td><input <%=ifDisabled%> type="text" name="organisation" value="<%=HTML.encodeTags(user.getOrganisation())%>" maxlength="<%=User.MAX_ORGANISATION_LENGTH%>"></td>
148          <td></td>
149        </tr>
150        <tr class="big">
151          <th>Address</th>
152          <td>
153            <textarea <%=ifDisabled%> rows="4" name="address" id="address"><%=HTML.encodeTags(user.getAddress())%></textarea>
154          </td>
155          <td style="width: 20px;">
156            <base:zoom textarea="address" title="Address" />
157          </td>
158        </tr>
159        <tr>
160          <th>Phone</th>
161          <td><input <%=ifDisabled%> type="text" name="phone" value="<%=HTML.encodeTags(user.getPhone())%>" maxlength="<%=User.MAX_PHONE_LENGTH%>"></td>
162          <td></td>
163        </tr>
164        <tr>
165          <th>Fax</th>
166          <td><input <%=ifDisabled%> type="text" name="fax" value="<%=HTML.encodeTags(user.getFax())%>" maxlength="<%=User.MAX_FAX_LENGTH%>"></td>
167          <td></td>
168        </tr>
169        <tr>
170          <th>Url</th>
171          <td><input <%=ifDisabled%> type="text" name="url" value="<%=HTML.encodeTags(user.getUrl())%>" maxlength="<%=User.MAX_URL_LENGTH%>"></td>
172          <td></td>
173        </tr>
174        <tr class="dynamic">
175          <th></th>
176          <td></td>
177          <td></td>
178        </tr>
179        </table>
180      </t:tab>
181     
182      <t:tab id="password" title="Password" helpid="userpreferences.password">
183        <table class="fullform input100">
184        <% if (!Application.isUsingInternalAuthentication() && writePermission)
185        {
186          %>
187          <tr>
188            <td colspan="2">
189            <div class="messagecontainer error">Base is using external authentication. Password cannot be changed here.</div>
190            </td>
191          </tr>
192          <%
193        }
194        %>
195        <tr>
196          <th>Login</th>
197          <td><%=HTML.encodeTags(user.getLogin())%></td>
198        </tr>
199        <tr>
200          <th>New password</th>
201          <td><input <%=passwordDisabled%> type="password" name="password" value=""  maxlength="30"></td>
202        </tr>
203        <tr>
204          <th>Retype password</th>
205          <td><input <%=passwordDisabled%> type="password" name="retype_password" value="" maxlength="30"></td>
206        </tr>
207        <tr class="dynamic">
208          <th></th>
209          <td><i>- leave empty to not change the password</i></td>
210        </tr>
211        </table>
212      </t:tab>
213   
214      <t:tab id="other" title="Other information" 
215        helpid="userpreferences.other">
216        <table class="fullform input100">
217        <%
218        if (extendedProperties != null)
219        {
220          for (ExtendedProperty ep : extendedProperties)
221          {
222            String name = ep.getName();
223            String fieldName = "ep."+name;
224            Type type = ep.getType();
225            boolean required = !ep.isNullable();
226            Object value = user == null ? cc.getPropertyValue(name) : user.getExtended(name);
227            String isRequired = required ? "class=\"required\"" : "";
228            boolean addZoom = false;
229            %>
230            <tr>
231              <th><%=HTML.encodeTags(ep.getTitle())%></th>
232              <td>
233              <%
234              if (type == Type.INT || type == Type.LONG)
235              {
236                %>
237                <input <%=isRequired%> <%=ifDisabled %> type="text" name="<%=fieldName%>" id="<%=fieldName%>"
238                  value="<%=value == null ? "" : value%>" style="width: 15em;" maxlength="20">
239                <%
240              }
241              else if (type == Type.FLOAT || type == Type.DOUBLE)
242              {
243                %>
244                <input <%=isRequired%> <%=ifDisabled%> type="text" name="<%=fieldName%>" id="<%=fieldName%>"
245                  value="<%=value == null ? "" : value%>" style="width: 15em;" maxlength="20">
246                <%
247              }
248              else if (type == Type.STRING)
249              {
250                %>
251                <input <%=isRequired%> <%=ifDisabled%> type="text" name="<%=fieldName%>"
252                  value="<%=HTML.encodeTags((String)value)%>"
253                  maxlength="<%=ep.getLength()%>">
254                <%
255              }
256              else if (type == Type.TEXT)
257              {
258                addZoom = true;
259                %>
260                <textarea <%=isRequired%> <%=ifDisabled%> name="<%=fieldName%>" id="<%=fieldName%>" rows="6" 
261                  ><%=HTML.encodeTags((String)value)%></textarea>
262                <%
263              }
264              else if (type == Type.BOOLEAN)
265              {
266                Boolean b = (Boolean)value;
267                if (!required)
268                {
269                  %>
270                  <input type="radio" name="<%=fieldName%>" id="<%=fieldName%>.null" value=""
271                    <%=b == null ? "checked" : ""%> 
272                    ><label for="<%=fieldName%>.null"><i>- not specified -</i></label><br>
273                  <%
274                }
275                %>
276                <input type="radio" name="<%=fieldName%>" id="<%=fieldName%>.true" value="true" 
277                  <%=b != null && b == true ? "checked" : ""%>
278                  ><label for="<%=fieldName%>.true">true</label>
279                <input type="radio" name="<%=fieldName%>" id="<%=fieldName%>.false" value="false" 
280                  <%=b != null && b == false ? "checked" : ""%>
281                  ><label for="<%=fieldName%>.false">false</label>
282                <%
283              }
284              else if (type == Type.DATE)
285              {
286                %>
287                <table>
288                <tr>
289                <td>
290                  <input <%=isRequired%> <%=ifDisabled%> type="text" name="<%=fieldName%>" id="<%=fieldName%>"
291                    value="<%=dateFormatter.format((Date)value)%>" style="width: 15em;"
292                    maxlength="20" title="Enter date in format: <%=dateFormat%>"
293                    >
294                </td>
295                <td>
296                  <base:button 
297                    id="<%="btn."+fieldName%>"
298                    data-extended-property="<%=name%>"
299                    image="calendar.png"
300                    title="Calendar&hellip;" 
301                    tooltip="Select a date from a calendar" 
302                    visible="<%=writePermission%>"
303                  />
304                </td>
305                </tr>
306                </table>
307                <%
308              }
309              else if (type == Type.TIMESTAMP)
310              {
311                %>
312                <table>
313                <tr>
314                <td>
315                  <input <%=isRequired%> <%=ifDisabled%> type="text" name="<%=fieldName%>" id="<%=fieldName%>"
316                    value="<%=dateTimeFormatter.format((Date)value)%>" style="width: 15em;"
317                    maxlength="20" title="Enter timestamp in format: <%=dateTimeFormat%>"
318                    >
319                </td>
320                <td>
321                  <base:button 
322                    id="<%="btn."+fieldName%>"
323                    data-extended-property="<%=name%>"
324                    image="calendar.png"
325                    title="Calendar&hellip;" 
326                    tooltip="Select a timestamp from a calendar" 
327                    visible="<%=writePermission%>"
328                  />
329                </td>
330                </tr>
331                </table>
332                <%
333              }
334              %>
335              </td>
336              <td style="width: 20px;">
337                <%
338                if (addZoom)
339                {
340                  %>
341                  <base:zoom textarea="<%=fieldName%>" title="<%=HTML.encodeTags(ep.getTitle()) %>" />
342                  <%
343                }
344                %>
345              </td>
346            </tr>
347            <%
348          }
349        }
350        %>
351        <tr class="dynamic">
352          <th>Description</th>
353          <td>
354            <textarea <%=ifDisabled%> rows="5" name="description" id="description"><%=HTML.encodeTags(user.getDescription())%></textarea>
355          </td>
356          <td style="width: 20px;">
357            <base:zoom textarea="description" title="Description" />
358          </td>
359        </tr>
360        </table>
361      </t:tab>
362    </t:tabcontrol>
363    </form>
364 
365    <base:buttongroup subclass="dialogbuttons">
366      <base:button id="btnSave" title="Save" visible="<%=writePermission%>"/>
367      <base:button id="close" title="Cancel" visible="<%=writePermission%>"/>
368      <base:button id="close" title="Close" visible="<%=!writePermission%>"/>
369    </base:buttongroup>
370 
371  </base:body>
372  </base:page>
373  <%
374}
375finally
376{
377  if (dc != null) dc.close();
378}
379%>
Note: See TracBrowser for help on using the repository browser.