source: trunk/www/my_base/user/preferences.jsp @ 7295

Last change on this file since 7295 was 7295, checked in by Nicklas Nordborg, 5 years ago

References #2043: Activating/deactivating roles on the fly in a login session

Added a "Inactive roles" tab in the "Preferences" dialog. This allows a user to set roles that should be inactive by default after logging in.

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