source: trunk/www/my_base/user/preferences.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: 19.7 KB
Line 
1<%-- $Id: preferences.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, Martin Svensson
5  Copyright (C) 2007 Johan Enell, 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  This page is used to display and modify the preferences for
25  the logged in user. It displays a tabbed dialogue:
26
27  @param page
28    The name active page of the tabbed dialog.
29    - appearance: Font sizes, scale factor, etc.
30
31  Saving the form invokes the submit_user.jsp page with cmd=SavePreferences
32
33  @author Nicklas
34  @version 2.0
35--%>
36<%@ page pageEncoding="UTF-8" session="false"
37  import="net.sf.basedb.core.SessionControl"
38  import="net.sf.basedb.core.Item"
39  import="net.sf.basedb.core.DbControl"
40  import="net.sf.basedb.core.User"
41  import="net.sf.basedb.core.Role"
42  import="net.sf.basedb.core.Type"
43  import="net.sf.basedb.core.Metadata"
44  import="net.sf.basedb.core.ItemContext"
45  import="net.sf.basedb.core.ItemQuery"
46  import="net.sf.basedb.core.Permission"
47  import="net.sf.basedb.core.query.Hql"
48  import="net.sf.basedb.core.query.Restrictions"
49  import="net.sf.basedb.core.query.Expressions"
50  import="net.sf.basedb.core.query.Orders"
51  import="net.sf.basedb.util.ToStringComparator"
52  import="net.sf.basedb.clients.web.Base"
53  import="net.sf.basedb.clients.web.util.HTML"
54  import="net.sf.basedb.clients.web.formatter.FormatterSettings"
55  import="net.sf.basedb.util.extensions.ExtensionsInvoker"
56  import="net.sf.basedb.clients.web.extensions.ExtensionsControl"
57  import="net.sf.basedb.clients.web.extensions.JspContext"
58  import="net.sf.basedb.clients.web.extensions.startpage.StartPageAction"
59  import="net.sf.basedb.clients.web.extensions.edit.EditUtil"
60  import="net.sf.basedb.clients.web.extensions.tabcontrol.TabAction"
61  import="net.sf.basedb.util.Values"
62  import="java.util.Collections"
63  import="java.util.List"
64  import="java.util.Set"
65  import="java.util.TreeSet"
66  import="java.util.HashSet"
67  import="java.util.Arrays"
68  import="java.util.Iterator"
69%>
70<%@ taglib prefix="base" uri="/WEB-INF/base.tld" %>
71<%@ taglib prefix="t" uri="/WEB-INF/tab.tld" %>
72<%
73final SessionControl sc = Base.getExistingSessionControl(pageContext, true);
74final String ID = sc.getId();
75final float scale = Base.getScale(sc);
76final String activePage = Values.getStringOrNull(request.getParameter("page"));
77final DbControl dc = sc.newDbControl();
78try
79{
80  final User user = User.getById(dc, sc.getLoggedInUserId());
81 
82  final String longTexts = Values.getString(sc.getUserClientSetting("text.long"), "display");
83 
84  final boolean hasImages = Values.getBoolean(sc.getUserClientSetting("toolbar.images"), true);
85  final boolean hasText = Values.getBoolean(sc.getUserClientSetting("toolbar.text"), true);
86 
87  final String minColor = Values.getString(sc.getUserClientSetting("ratiocolor.min"), "0000FF");
88  final String midColor = Values.getString(sc.getUserClientSetting("ratiocolor.mid"), "FFFFFF");
89  final String maxColor = Values.getString(sc.getUserClientSetting("ratiocolor.max"), "FFFF00");
90 
91  final boolean rememberDialogPositions = Values.getBoolean(sc.getUserClientSetting("dialogs.remember-positions"), true);
92  final String startPageId = sc.getUserClientSetting("start-page-id");
93 
94  ItemContext cc = sc.getCurrentContext(Item.USERCLIENTSETTING);
95  List<String> recentColors = cc.getRecent("colors");
96  List<String> recentDateFormats = cc.getRecent("dateFormats");
97  List<String> recentDateTimeFormats = cc.getRecent("dateTimeFormats");
98 
99  // Load sticky items
100  String mostRecent = Values.getString(sc.getUserClientSetting("menu.mostRecent"),
101      "EXPERIMENT:BIOASSAYSET:TRANSFORMATION");
102  Set<String> stickyItems = new HashSet<String>(Arrays.asList(mostRecent.split(":")));
103  Set<Item> allItems = new TreeSet<Item>(new ToStringComparator<Item>(false));
104  allItems.addAll(Metadata.getOwnableItems());
105  allItems.add(Item.BIOASSAYSET);
106 
107  // Load roles
108  List<Role> roles = null;
109  Set<Integer> roleIds = sc.getAllRoles();
110  Set<Integer> defaultInactive = Collections.emptySet();
111  if (roleIds != null && roleIds.size() > 0)
112  {
113    ItemQuery<Role> roleQuery = Role.getQuery();
114    roleQuery.restrict(Restrictions.in(Hql.property("id"), Expressions.parameter("roles")));
115    roleQuery.setParameter("roles", roleIds, Type.INT);
116    roleQuery.order(Orders.asc(Hql.property("name")));
117    roles = roleQuery.list(dc);
118   
119    String tmp = Values.getStringOrNull(sc.getUserClientSetting("inactiveRoles"));
120    if (tmp != null)
121    {
122      defaultInactive = new HashSet<Integer>(Arrays.asList(Values.getInt(tmp.split(":"))));
123    }
124  }
125
126  JspContext context = ExtensionsControl.createContext(dc, pageContext, null, user);
127  ExtensionsInvoker<StartPageAction> invoker = (ExtensionsInvoker<StartPageAction>)ExtensionsControl.useExtensions(context, "net.sf.basedb.clients.web.start-page");
128  ExtensionsInvoker<TabAction> tabsInvoker = (ExtensionsInvoker<TabAction>)ExtensionsControl.useExtensions(context, EditUtil.EP_PREFIX_EDIT+"user-preferences");
129  %>
130  <base:page type="popup" title="<%="Preferences for "+HTML.encodeTags(user.getName())%>" id="preferences">
131  <base:head scripts="tabcontrol-2.js,~preferences.js" styles="tabcontrol.css">
132    <style>
133    .colorbox
134    {
135      margin: 2px;
136    }
137    </style>   
138  </base:head>
139  <base:body>
140    <h1>Preferences for <%=HTML.encodeTags(user.getName())%> <base:help tabcontrol="settings" /></h1>
141    <form action="submit_user.jsp?ID=<%=ID%>" method="post" name="preferences">
142    <input type=hidden name="cmd" value="SavePreferences">
143    <input type="hidden" name="mincolor" id="mincolor" value="<%=minColor%>">
144    <input type="hidden" name="midcolor" id="midcolor" value="<%=midColor%>">
145    <input type="hidden" name="maxcolor" id="maxcolor" value="<%=maxColor%>">
146
147    <t:tabcontrol 
148      id="settings"
149      subclass="content dialogtabcontrol"
150      active="<%=activePage%>" remember="<%=activePage == null%>" 
151      extensions="<%=tabsInvoker%>"
152      position="bottom">
153      <t:tab 
154        id="appearance" 
155        title="Appearance" 
156        helpid="userpreferences.appearance"
157        >
158        <table class="fullform">
159        <tr>
160          <th>Font size</th>
161          <td>
162            <%
163            String fontsize = Values.getString(sc.getUserClientSetting("appearance.fontsize"), "size_m.css");
164            %>
165            <input type="radio" name="fontsize" id="fontsizeXS" value="size_xs.css" 
166              <%="size_xs.css".equals(fontsize) ? "checked" : ""%>
167              data-scale="80"
168              ><label for="fontsizeXS">XS</label>
169            <input type="radio" name="fontsize" id="fontsizeS" value="size_s.css" 
170              <%="size_s.css".equals(fontsize) ? "checked" : ""%>
171              data-scale="90"
172              ><label for="fontsizeS">S</label>
173            <input type="radio" name="fontsize" id="fontsizeM" value="size_m.css" 
174              <%="size_m.css".equals(fontsize) ? "checked" : ""%>
175              data-scale="100"
176              ><label for="fontsizeM">M</label>
177            <input type="radio" name="fontsize" id="fontsizeL" value="size_l.css" 
178              <%="size_l.css".equals(fontsize) ? "checked" : ""%>
179              data-scale="115"
180              ><label for="fontsizeL">L</label>
181            <input type="radio" name="fontsize" id="fontsizeXL" value="size_xl.css" 
182              <%="size_xl.css".equals(fontsize) ? "checked" : ""%>
183              data-scale="130"
184              ><label for="fontsizeXL">XL</label>
185          </td>
186        </tr>
187        <tr>
188          <th>Scale factor</th>
189          <td>
190            <input class="text required" type="text" name="scale" id="scale"
191            value="<%=Values.getInt(sc.getUserClientSetting("appearance.scale"), 100)%>" 
192            size="4" maxlength="3">%
193            (50 - 200)
194          </td>
195        </tr>
196        <tr>
197          <th>Display long texts</th>
198          <td>
199            <input type="radio" name="longTexts" id="longTextsAlways" value="display" 
200              <%="display".equals(longTexts) ? "checked" : "" %>
201              ><label for="longTextsAlways">Always</label>
202            <input type="radio" name="longTexts" id="longTextsHover" value="hover" 
203              <%="hover".equals(longTexts) ? "checked" : "" %>
204              ><label for="longTextsHover">On hover</label>
205            <input type="radio" name="longTexts" id="longTextsClick" value="click" 
206              <%="click".equals(longTexts) ? "checked" : "" %>
207              ><label for="longTextsClick">On click</label>
208          </td>
209        </tr>   
210        <tr>
211          <th>Toolbar</th>
212          <td>
213            <input type="radio" name="toolbar" id="toolbarBoth" value="both" 
214              <%=hasImages && hasText ? "checked" : "" %>
215              ><label for="toolbarBoth">Images and text</label>
216            <input type="radio" name="toolbar" id="toolbarImages" value="images" 
217              <%=hasImages && !hasText ? "checked" : "" %>
218              ><label for="toolbarImages">Images only</label>
219            <input type="radio" name="toolbar" id="toolbarText" value="text" 
220              <%=!hasImages && hasText ? "checked" : "" %>
221              ><label for="toolbarText">Text only</label>
222          </td>
223        </tr>   
224        <tr>
225          <th>Ratio color range</th>
226          <td>
227            <span id="btnMinColor" tabindex="0" class="link" data-dialog-title="Color for min value" data-color-box="mincolor"
228              ><span id="mincolor.visual" style="background: #<%=minColor%>; display: inline-block;" class="colorbox large">&nbsp;</span>Min</span>
229           
230            <span id="btnMidColor" tabindex="0" class="link" data-dialog-title="Color for midpoint value" data-color-box="midcolor"
231              ><span id="midcolor.visual" style="background: #<%=midColor%>; display: inline-block;" class="colorbox large">&nbsp;</span>Mid</span>
232           
233            <span id="btnMaxColor" tabindex="0" class="link" data-dialog-title="Color for max value" data-color-box="maxcolor"
234              ><span id="maxcolor.visual" style="background: #<%=maxColor%>; display: inline-block;" class="colorbox large">&nbsp;</span>Max</span>
235         
236
237              <select name="presets" id="colorPresets" class="selectionlist">
238              <option value="">- presets -
239              <option value="FF0000,FFFF00,00FF00">Red - Yellow - Green
240              <option value="0000FF,FFFFFF,FFFF00">Blue - White - Yellow
241              <option value="000000,999999,FFFFFF">Black - Grey - White
242              <%
243              if (recentColors != null && recentColors.size() > 0)
244              {
245                %>
246                <option value="" class="recentheader" disabled>- recently used -
247                <%
248                for (int i = 0; i < recentColors.size(); ++i)
249                {
250                  String color = recentColors.get(i);
251                  %>
252                  <option value="<%=color%>" class="recent"><%=color%>
253                  <%
254                }
255              }
256              %>
257              </select>
258          </td>
259        </tr>
260        <tr>
261          <th>Date format</th>
262          <td>
263            <input class="text" type="text" name="date_format" 
264            value="<%=HTML.encodeTags(FormatterSettings.getDateFormat(sc))%>" 
265            size="20">
266            <select name="datePresets" id="datePresets" class="selectionlist">
267              <option value="">- presets -
268              <option value="yyyy-MM-dd">yyyy-MM-dd
269              <option value="d/M/yyyy">d/M/yyyy
270              <option value="M/d/yyyy">M/d/yyyy
271              <%
272              if (recentDateFormats != null && recentDateFormats.size() > 0)
273              {
274                %>
275                <option value="" class="recentheader" disabled>- recently used -
276                <%
277                for (int i = 0; i < recentDateFormats.size(); ++i)
278                {
279                  String format = HTML.encodeTags(recentDateFormats.get(i));
280                  %>
281                  <option value="<%=format%>" class="recent"><%=format%>
282                  <%
283                }
284              }
285              %>
286            </select>
287          </td>
288        </tr>
289       
290        <tr>
291          <th>Date-time format</th>
292          <td>
293            <input class="text" type="text" name="datetime_format" 
294            value="<%=HTML.encodeTags(FormatterSettings.getDateTimeFormat(sc))%>" 
295            size="20">
296            <select name="dateTimePresets" id="dateTimePresets" class="selectionlist">
297              <option value="">- presets -
298              <option value="yyyy-MM-dd HH:mm:ss">yyyy-MM-dd HH:mm:ss
299              <option value="d/M/yyyy HH:mm:ss">d/M/yyyy HH:mm:ss
300              <option value="M/d/yyyy HH:mm:ss">M/d/yyyy HH:mm:ss
301              <%
302              if (recentDateTimeFormats != null && recentDateTimeFormats.size() > 0)
303              {
304                %>
305                <option value="" class="recentheader" disabled>- recently used -
306                <%
307                for (int i = 0; i < recentDateTimeFormats.size(); ++i)
308                {
309                  String format = HTML.encodeTags(recentDateTimeFormats.get(i));
310                  %>
311                  <option value="<%=format%>" class="recent"><%=format%>
312                  <%
313                }
314              }
315              %>
316            </select>
317          </td>
318        </tr>
319        <%
320        int numDecimals = FormatterSettings.getNumDecimals(sc);
321        %>
322        <tr>
323          <th>Decimals</th>
324          <td>
325            <select name="decimals" style="width: 4em;">
326            <%
327            for (int i = 0; i < 8; i++)
328            {
329              %>
330              <option value="<%=i%>" <%=numDecimals == i ? "selected" : ""%>><%=i%>
331              <%
332            }
333            %>
334            <option value="-1" <%=numDecimals < 0 ? "selected" : ""%>>all
335            </select>
336          </td>
337        </tr>
338        <tr>
339          <th>Dialogs</th>
340          <td>
341            <label id="rememberPositions"><input type="checkbox" name="remember_positions" value="1" 
342              <%=rememberDialogPositions ? "checked" : "" %>
343              >Remember positions</label>
344          </td>
345        </tr>   
346        <tr>
347          <th>Start page</th>
348          <td>
349            <select name="start_page" class="selectionlist">
350              <option value="" title="The BASE › Home page">BASE › Home
351              <%
352              Iterator<StartPageAction> it = invoker.iterator();
353              while (it.hasNext())
354              {
355                try
356                {
357                  StartPageAction action = it.next();
358                  %>
359                  <option value="<%=action.getId()%>" 
360                    title="<%=HTML.encodeTags(action.getDescription())%>"
361                    <%=action.getId().equals(startPageId) ? "selected": ""%>
362                    ><%=HTML.encodeTags(action.getName())%>
363                  <%
364                }
365                catch (RuntimeException ex)
366                {} // Ignore exceptions thrown inside extensions
367              }
368              %>
369            </select>
370          </td>
371        </tr>   
372        <tr class="dynamic">
373          <th></th>
374          <td></td>
375        </tr>
376        </table>
377      </t:tab>
378     
379      <t:tab
380        id="plugins" 
381        title="Plugins" 
382        helpid="userpreferences.plugins"
383        >
384        <table class="fullform">
385        <tr>
386          <th>Messages</th>
387          <td>
388            <%
389            boolean sendMessage = Values.getBoolean(sc.getUserClientSetting("plugins.sendmessage"), true);
390            %>
391            <input type="checkbox" name="sendmessage" id="sendMessage" value="1" <%=sendMessage ? "checked" : ""%>
392              ><label for="sendMessage">Send message when plugin completes</label>
393          </td>
394        </tr>
395        <tr>
396          <th>Remove jobs</th>     
397          <td>
398            <%
399            boolean removeJobWhenFinished = Values.getBoolean(sc.getUserClientSetting("plugins.removejob"), false);
400            %>
401            <input type="checkbox" name="removejob" id="removeJob" value="1" <%=removeJobWhenFinished ? "checked" : "" %>
402              ><label for="removeJob">Remove import and export jobs when they are finished.</label>
403          </td>
404        </tr>
405        <tr>
406          <th>Show warnings</th>     
407          <td>
408            <%
409            boolean showWarnings = Values.getBoolean(sc.getUserClientSetting("plugins.showWarnings"), false);
410            %>
411            <input type="checkbox" name="show_warnings" id="showWarnings" value="1" <%=showWarnings ? "checked" : "" %>
412              ><label for="showWarnings">Show plug-in warning messages when starting a new job.</label>
413          </td>
414        </tr>
415        <tr class="dynamic">
416          <th></th>
417          <td></td>
418        </tr>
419        </table>
420      </t:tab>
421     
422      <t:tab
423        id="mostRecent"
424        title="Recent items"
425        helpid="userpreferences.mostrecent"
426        tooltip="Specify how many items to remember in lists of 'most recent items'"
427        >
428        <%
429        boolean loadNames = Values.getBoolean(sc.getUserClientSetting("menu.mostRecent.loadNames"), true);
430        %>
431        <table class="fullform">
432        <tr >
433          <th>Recently viewed items</th>
434          <td>
435            <input class="text required" type="text" name="maxViewed" id="maxViewed"
436              value="<%=Values.getInt(sc.getUserClientSetting("menu.mostRecent.maxViewed"), 6)%>" 
437              size="4" maxlength="2">
438            (0 - 10)
439          </td>
440        </tr>
441        <tr>
442          <th>Recently used items</th>
443          <td>
444            <input class="text required" type="text" name="maxUsed" id="maxUsed"
445              value="<%=Values.getInt(sc.getUserClientSetting("appearance.recent"), 4)%>" 
446              size="4" maxlength="2">
447            (0 - 10)
448          </td>
449        </tr>
450        <tr>
451          <th>Load item names</th>
452          <td>
453            <input type="checkbox" name="loadNames" id="loadNames" value="1" <%=loadNames ? "checked" : ""%>>
454            <label for="loadNames">Load the names of all items</label>
455          </td>
456        </tr>
457        <tr class="dynamic">
458          <th></th>
459          <td>
460        <table>
461        <tr>
462          <td>
463            <base:buttongroup
464              vertical="true">
465              <base:button
466                id="moveUp"
467                image="move_up.png"
468                tooltip="Move up" 
469                subclass="square"
470                data-down="0"
471              />
472              <base:button 
473                id="moveDown"
474                image="move_down.png"
475                tooltip="Move down" 
476                subclass="square"
477                data-down="1"
478              />
479            </base:buttongroup>
480          </td>
481          <td>
482            <b>Sticky items</b><br>
483            <select name="sticky_items" id="stickyItems" multiple size="12" style="width: 12em;">
484              <%
485              Iterator<Item> it = allItems.iterator();
486              while (it.hasNext())
487              {
488                Item item = it.next();
489                if (stickyItems.contains(item.name()))
490                {
491                  it.remove();
492                  %>
493                  <option value="<%=item.name()%>"><%=item.toString() %>
494                  <%
495                }
496              }
497              %>
498            </select>
499          </td>
500          <td>
501            <base:buttongroup
502              vertical="true"
503              >
504              <base:button
505                id="moveLeft"
506                image="move_left.png" 
507                tooltip="Show this item in the 'Most recent' menu" 
508                subclass="square"
509              />
510              <base:button 
511                id="moveRight"
512                image="move_right.png" 
513                tooltip="Don't show this item in the 'Most recent' menu" 
514                subclass="square"
515              />
516            </base:buttongroup>
517          </td>
518          <td>
519            <b>All items</b><br>
520            <select name="all_items" id="allItems" multiple size="12" style="width: 12em;">
521              <%
522              for (Item item : allItems)
523              {
524                %>
525                <option value="<%=item.name()%>"><%=item.toString() %>
526                <%
527              }
528              %>
529            </select>
530          </td>
531        </tr>
532        </table>
533         
534          </td>
535        </tr>
536        </table>
537      </t:tab>
538      <t:tab
539        id="inactiveRoles"
540        title="Inactive roles"
541        helpid="userpreferences.inactiveroles"
542        tooltip="Select if any roles should be inactive by default after logging in"
543        visible="<%=roles != null && roles.size() > 0%>"
544        >
545        <table class="fullform">
546        <tr class="dynamic">
547          <th>Default roles</th>
548          <td>
549            <b>Inactive at login</b><br>
550            <%
551            for (Role r : roles)
552            {
553              boolean inactive = defaultInactive.contains(r.getId());
554              %>
555              <label><input type="checkbox" id="role.<%=r.getId()%>"
556                name="inactiveRoles" value="<%=r.getId()%>"
557                <%=inactive ? "checked" : "" %>
558                ><%=HTML.encodeTags(r.getName())%></label><br>
559              <%
560            }
561            %>
562            <div class="messagecontainer note" style="margin-top: 1em;">
563            Select all roles that should be inactive by default
564            after logging in. Note! This setting only applies when
565            logging in via the web interface.
566            </div>
567          </td>
568        </tr>
569        </table>
570       
571      </t:tab>
572    </t:tabcontrol>
573    </form>
574
575    <div class="legend">
576      <base:icon image="required.png" />= required information
577    </div>
578
579    <base:buttongroup subclass="dialogbuttons">
580      <base:button id="btnSave" title="Save" />
581      <base:button id="close" title="Cancel" />
582    </base:buttongroup>
583  </base:body>
584  </base:page>
585  <%
586}
587finally
588{
589  if (dc != null) dc.close();
590}
591%>
Note: See TracBrowser for help on using the repository browser.