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

Last change on this file since 7499 was 7499, checked in by Nicklas Nordborg, 4 years ago

Fixes #2126: Add extension points to the Preferences and Contact information dialogs

The dialogs should now have TabAction extension points with id:

  • net.sf.basedb.clients.web.tabcontrol.edit.user-preferences
  • net.sf.basedb.clients.web.tabcontrol.edit.user-information


and OnSaveAction extension points with id:

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