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

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

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

Including scripts and stylesheets added by extensions.

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