source: trunk/www/include/menu.jsp @ 7294

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

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

Implemented support for setting a role as inactive in the core. New public methods are in the SessionControl class.

The getRoles() method has been deprecated and replaced with other methods (since this method return ALL roles including inactive). Code that uses this method for permission checking may experience PermissionDeniedExceptions if a users has de-activated a role.

The "User" menu to the far right has been updated to include a section with roles where the user can toggle the active/inactive status.

The settings are not (yet) remebered between sessions. All roles start out in the active state after logging in.

  • Property svn:eol-style set to native
  • Property svn:keywords set to Id
File size: 48.6 KB
Line 
1<%-- $Id: menu.jsp 7294 2017-02-17 10:15:35Z nicklas $
2  ------------------------------------------------------------------
3  Copyright (C) 2005 Nicklas Nordborg, Gregory Vincic
4  Copyright (C) 2006 Jari Häkkinen, Nicklas Nordborg, Martin Svensson, Gregory Vincic
5  Copyright (C) 2007 Nicklas Nordborg
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 included from the <base:page> taglib to display the
25  meny.
26
27  @param name
28    The name of the menu to display:
29    - standard: The standard menu for a logged in user
30    - login: The menu used on pages where no user is logged in
31    - exception: Used on error pages, does not display a menu at all
32    - auto: Will display either the "standard" or "login" menu
33
34  @author Nicklas
35  @version 2.0
36--%>
37<%@ page pageEncoding="UTF-8" session="false"
38  import="net.sf.basedb.core.Application"
39  import="net.sf.basedb.core.SessionControl"
40  import="net.sf.basedb.core.DbControl"
41  import="net.sf.basedb.core.BasicItem"
42  import="net.sf.basedb.core.Nameable"
43  import="net.sf.basedb.core.Permission"
44  import="net.sf.basedb.core.Item"
45  import="net.sf.basedb.core.ItemContext"
46  import="net.sf.basedb.core.User"
47  import="net.sf.basedb.core.Project"
48  import="net.sf.basedb.core.BioAssaySet"
49  import="net.sf.basedb.core.Client"
50  import="net.sf.basedb.core.StringUtil"
51  import="net.sf.basedb.core.ItemQuery"
52  import="net.sf.basedb.core.Include"
53  import="net.sf.basedb.core.ItemResultList"
54  import="net.sf.basedb.core.Type"
55  import="net.sf.basedb.core.Role"
56  import="net.sf.basedb.core.query.Orders"
57  import="net.sf.basedb.core.query.Order"
58  import="net.sf.basedb.core.query.Hql"
59  import="net.sf.basedb.core.query.Restrictions"
60  import="net.sf.basedb.core.query.Expressions"
61  import="net.sf.basedb.clients.web.Base"
62  import="net.sf.basedb.clients.web.util.HTML"
63  import="net.sf.basedb.clients.web.resources.Bundle"
64  import="net.sf.basedb.util.Values"
65  import="net.sf.basedb.util.resources.ResourceBundleWrapper"
66  import="net.sf.basedb.util.resources.ResourceBundleFactory"
67  import="net.sf.basedb.clients.web.extensions.ExtensionsControl"
68  import="net.sf.basedb.clients.web.extensions.JspContext"
69  import="net.sf.basedb.clients.web.extensions.menu.MenuItemAction"
70  import="net.sf.basedb.util.extensions.Extension"
71  import="net.sf.basedb.util.extensions.ExtensionsInvoker"
72  import="net.sf.basedb.util.extensions.ActionIterator"
73  import="net.sf.basedb.clients.web.extensions.DynamicActionAttributes"
74  import="net.sf.basedb.clients.web.extensions.DynamicActionAttribute"
75  import="java.util.HashMap"
76  import="java.util.Map"
77  import="java.util.ArrayList"
78  import="java.util.LinkedList"
79  import="java.util.List"
80  import="java.util.Arrays"
81  import="java.util.Iterator"
82  import="java.util.Set"
83  import="java.util.HashSet"
84%>
85<%@ taglib prefix="m" uri="/WEB-INF/menu.tld" %>
86<%@ taglib prefix="ext" uri="/WEB-INF/extensions.tld" %>
87<%
88SessionControl sc = null;
89try
90{
91  sc = Application.isRunning() ? Base.getSessionControl(pageContext, false) : null;
92}
93catch (RuntimeException ex)
94{}
95final String ID = sc == null ? "" : sc.getId();
96String name = Values.getString(request.getParameter("name"), "login");
97final String root = request.getContextPath()+"/";
98if ("exception".equals(name) && sc != null && sc.isLoggedIn()) name = "standard";
99
100final ResourceBundleWrapper common = ResourceBundleFactory.getResourceBundle(Bundle.COMMON, sc);
101final ResourceBundleWrapper menu = ResourceBundleFactory.getResourceBundle(Bundle.MENU, sc);
102
103if ("login".equals(name))
104{
105}
106else if ("projects".equals(name) && sc != null && sc.isLoggedIn())
107{
108  // Projects menu
109  int activeProjectId = sc.getActiveProjectId();
110  %>
111  <m:menu 
112    id="menu.projects"
113    style="display: none"
114    >
115    <%
116    final DbControl dc = sc.newDbControl();
117    boolean menuSeparatorBeforeDeactivate = true;
118    try
119    {
120      List<Project> projects = new ArrayList<Project>();
121      int lastRecentActiveIndex = 0;
122      // 1. Load the most recently active projects
123      String tmp = sc.getUserClientSetting("projects.recentActive");
124      Set<Integer> recentProjects = new HashSet<Integer>();
125      if (tmp != null)
126      {
127        for (String id : tmp.split(":"))
128        {
129          try
130          {
131            Project p = Project.getById(dc, Values.getInt(id));
132            if (!p.isRemoved())
133            {
134              recentProjects.add(p.getId());
135              projects.add(p);
136              lastRecentActiveIndex++;
137            }
138          }
139          catch (RuntimeException ex)
140          {}
141        }
142      }
143     
144      // 2. Load more projects
145      final ItemContext projectCC = sc.getCurrentContext(Item.PROJECT);
146      final ItemQuery<Project> projectQuery = Project.getQuery();
147      projectQuery.include(Include.MINE, Include.SHARED);
148      projectQuery.restrict(Restrictions.not(Restrictions.in(Hql.property("id"), Expressions.parameter("projects"))));
149      projectQuery.setParameter("projects", recentProjects, Type.INT);
150      Order projectSortOrder = projectCC.getSortOrder();
151      if (projectSortOrder != null) projectQuery.order(projectSortOrder);
152      projectQuery.order(Orders.asc(Hql.property("name")));
153      projectQuery.setCacheResult(true);
154      projects.addAll(projectQuery.list(dc));
155      boolean breakAt15 = projects.size() > 16;
156      int index = 0;
157      String thisIsTheActiveProject = menu.getString("activeproject.tooltip");
158      String thisIsNotTheActiveProject = menu.getString("inactiveproject.tooltip");
159      if (lastRecentActiveIndex > 0)
160      {
161        %>
162        <m:menuitem 
163          title="<%=menu.getString("recentprojects.title")%>" 
164          subclass="menusection"
165          enabled="false" 
166        />
167        <m:menuseparator />
168        <%
169      }
170      Set<Integer> shownProjects = new HashSet<Integer>();
171      for (Project p : projects)
172      {
173        if (index == 15 && breakAt15) break;
174        index++;
175        int projectId = p.getId();
176        boolean active = activeProjectId == projectId;
177        String prefix = index <= lastRecentActiveIndex ? index + ". " : "";
178        shownProjects.add(p.getId());
179        String url = active ? 
180          root+"my_base/projects/index.jsp?ID="+ID+"&amp;cmd=ViewItem&amp;item_id=" + projectId : 
181          root+"my_base/projects/set_active.jsp?ID="+ID+"&amp;project_id="+p.getId();
182        %>
183        <m:menuitem
184          title="<%=prefix + HTML.encodeTags(p.getName())%>"
185          subclass="active"
186          url="<%=url%>"
187          data-popup="<%=active ? "" : "ActivateProject, 300, 200"%>"
188          icon="<%=active ? "checkedmenu.png" : null%>"
189          tooltip="<%=active ? thisIsTheActiveProject : thisIsNotTheActiveProject%>"
190        />
191        <%
192        if (index == lastRecentActiveIndex)
193        {
194          %>
195          <m:menuseparator />
196          <%
197          menuSeparatorBeforeDeactivate = false;
198        }
199        else
200        {
201          menuSeparatorBeforeDeactivate = true;
202        }
203      }
204      if (breakAt15)
205      {
206        int more = projects.size() - 15;
207        %>
208        <m:menuitem 
209          title="<%="…" + menu.getString("moreprojects.title", Integer.toString(more))%>"
210          url="<%=root+"my_base/projects/index.jsp?ID="+ID+"&amp;cmd=UpdateContext&amp;tmpfilter:INT:id=<>"+Values.getString(shownProjects, "|", true)%>"
211          tooltip="<%=menu.getString("moreprojects.tooltip")%>"
212        />
213        <%
214      }
215    }
216    catch (Throwable t)
217    {
218      t.printStackTrace();
219      menuSeparatorBeforeDeactivate = false;
220      %>
221      <m:menuseparator />
222      <m:menuitem 
223        title="<%=menu.getString("projects.error.title")%>" 
224        tooltip="<%=menu.getString("projects.error.tooltip", t.getMessage())%>"
225        enabled="false"
226        icon="error.png"
227      />
228      <%
229    }
230    finally
231    {
232      if (dc != null) dc.close();
233    }
234    if (menuSeparatorBeforeDeactivate)
235    {
236      %>
237      <m:menuseparator />
238      <%
239    }
240    %>
241    <m:menuitem
242      title="<%="<i>- " + menu.getString("noactiveproject.title") + " -</i>"%>"
243      url="<%=root+"my_base/projects/set_active.jsp?ID="+ID%>"
244      data-popup="ActivateProject, 300, 200"
245      icon="<%=activeProjectId == 0 ? "checkedmenu.png" : null%>"
246      enabled="<%=activeProjectId != 0%>"
247      tooltip="<%=menu.getString("noactiveproject.tooltip", activeProjectId == 0)%>"
248    />
249  </m:menu>
250  <%
251}
252else if ("recentItems".equals(name) && sc != null && sc.isLoggedIn())
253{
254  // Recently used items menu
255  String stickyItems = Values.getString(sc.getUserClientSetting("menu.mostRecent"), 
256    "EXPERIMENT:BIOASSAYSET:TRANSFORMATION");
257  boolean loadNames = Values.getBoolean(sc.getUserClientSetting("menu.mostRecent.loadNames"), 
258    true);
259  String recentItems = sc.getUserClientSetting("menu.mostRecent.viewed");
260  DbControl dc = loadNames ? sc.newDbControl() : null;
261  try
262  {
263    %>
264    <m:menu
265      id="menu.mostRecent"
266      style="display: none;"
267      >
268      <%
269      int numItems = 0;
270      // Recently viewed items
271      List<String> recentlyViewed = recentItems == null ? 
272        new ArrayList<String>() : Arrays.asList(recentItems.split(":"));
273      if (recentlyViewed.size() > 0)
274      {
275        %>
276        <m:menuitem 
277          title="<%=menu.getString("recentitems.title")%>" 
278          subclass="menusection"
279          enabled="false" 
280        />
281        <m:menuseparator />
282        <%
283        for (String recent : recentlyViewed)
284        {
285          try
286          {
287            String[] tmp = recent.split("=");
288            Item itemType = Item.valueOf(tmp[0]);
289            String itemTextKey = "item." + itemType.name().toLowerCase();
290            String itemText = common.getString(itemTextKey);
291            if (itemText == itemTextKey) itemText = itemType.toString();
292            int itemId = Values.getInt(tmp[1], 0);
293            if (itemId != 0)
294            {
295              String shortName = "";
296              String fullName = "";
297              int noEdit = 1;
298              if (loadNames)
299              {
300                try
301                {
302                  BasicItem item = itemType.getById(dc, itemId);
303                  fullName = ((Nameable)item).getName();
304                  shortName = HTML.encodeTags(StringUtil.trimString(fullName, 35));
305                  noEdit = item.hasPermission(Permission.WRITE) ? 0 : 1;
306                }
307                catch (Throwable t)
308                {
309                  continue;
310                }
311              }
312              else
313              {
314                fullName = itemText + "; id=" + itemId;
315                shortName = itemText + " (id=" + itemId + ")";
316              }
317              numItems++;
318              %>
319              <m:menuitem
320                title="<%=numItems + ". " + shortName%>"
321                subclass="auto-init"
322                data-auto-init="item-link"
323                data-item-type="<%=itemType.name() %>"
324                data-item-id="<%=itemId %>"
325                data-no-edit="<%=noEdit %>"
326                tooltip="<%=menu.getString("gotorecentitem.tooltip", fullName, itemText)%>"
327              />
328              <%
329            }
330          }
331          catch (Throwable t)
332          {}
333        }
334      }
335      if (stickyItems != null && stickyItems.length() > 0)
336      {
337        int numSticky = 0;
338        if (numItems > 0)
339        {
340          %>
341          <m:menuseparator />
342          <%
343        }
344        %>
345        <m:menuitem 
346          title="<%=menu.getString("stickyitems.title")%>" 
347          subclass="menusection"
348          enabled="false" 
349        />
350        <m:menuseparator />
351        <%
352        // Sticky items
353        for (String recentItem : stickyItems.split(":"))
354        {
355          try
356          {
357            BasicItem item = null;
358            Item itemType = Item.valueOf(recentItem);
359            ItemContext cc = sc.getCurrentContext(itemType);
360            String itemTextKey = "item." + itemType.name().toLowerCase();
361            String itemText = common.getString(itemTextKey);
362            if (itemText == itemTextKey) itemText = itemType.toString();
363            if (cc.getId() != 0)
364            {
365              String shortName = "";
366              String fullName = "";
367              int noEdit = 1;
368              if (loadNames)
369              {
370                try
371                {
372                  item = itemType.getById(dc, cc.getId());
373                  fullName = ((Nameable)item).getName();
374                  shortName = ": " + HTML.encodeTags(StringUtil.trimString(fullName, 30));
375                  noEdit = item.hasPermission(Permission.WRITE) ? 0 : 1;
376                }
377                catch (Throwable t)
378                {
379                  continue;
380                }
381              }
382              else
383              {
384                fullName = itemText + "; id=" + cc.getId();
385                shortName = " (id=" + cc.getId() + ")";
386              }
387              numItems++;
388              numSticky++;
389              %>
390              <m:menuitem
391                title="<%=itemText + shortName%>"
392                subclass="auto-init"
393                data-auto-init="item-link"
394                data-item-type="<%=itemType.name() %>"
395                data-item-id="<%=cc.getId() %>"
396                data-no-edit="<%=noEdit %>"
397                tooltip="<%=menu.getString("gotorecentitem.tooltip", fullName, itemText)%>"
398              />
399              <%
400              if (itemType == Item.BIOASSAYSET)
401              {
402                // Add menu for Experiment explorer as well
403                %>
404                <m:menuitem
405                  title="<%=menu.getString("experimentexplorer.title", shortName)%>"
406                  url="<%=root+"views/experiments/explorer/view/index.jsp?ID=" + ID + "&amp;bioassayset_id="+cc.getId()%>"
407                  tooltip="<%=menu.getString("experimentexplorer.tooltip")%>"
408                  visible="<%=item == null || ((BioAssaySet)item).getNumSpots() > 0 %>"
409                />
410                <%
411              }
412            }
413          }
414          catch (Throwable t)
415          {}
416        }
417        if (numSticky == 0)
418        {
419          %>
420          <m:menuitem 
421            title="<%="<i>- " + menu.getString("nostickyitems.title") + " -</i>"%>"
422            enabled="false"
423          />
424          <%
425        }
426      }
427      %>
428      <m:menuseparator />
429      <m:menuitem 
430        title="<%=menu.getString("recentoptions.title") + "…"%>" 
431        url="<%=root+"my_base/user/preferences.jsp?ID="+ID+"&amp;page=mostRecent"%>"
432        data-popup="Preferences, 600, 400"
433        tooltip="<%=menu.getString("recentoptions.tooltip")%>" 
434      />
435    </m:menu>
436    <%
437  }
438  finally
439  {
440    if (dc != null) dc.close();
441  }
442}
443else if ("standard".equals(name))
444{
445  final DbControl dc = sc.newDbControl();
446  StringBuilder fillText = new StringBuilder();
447  try
448  {
449    Project activeProject = sc.getActiveProjectId() == 0 ? null : Project.getById(dc, sc.getActiveProjectId());
450    if (activeProject == null)
451    {
452      fillText.append("<img src=\""+root+"images/no_active_project.png\" alt=\"\">&nbsp;");
453      fillText.append("<span style=\"color:#FF0000;\" title=\"" + menu.getString("menu.projects.tooltip.0") + "\"");
454    }
455    else
456    {
457      fillText.append("<img src=\""+root+"images/project.png\" alt=\"\">&nbsp;");
458      fillText.append("<span title=\"" + menu.getString("menu.projects.tooltip.1") + "\"");
459    }
460   
461    fillText.append(" class=\"link auto-init\" data-auto-init=\"menu-anchor\" data-menu-id=\"menu.projects\" data-align-right=\"1\">");
462    fillText.append(activeProject == null ? "<i>" + menu.getString("noactiveproject.title") + "</i>" : HTML.encodeTags(activeProject.getName()));
463    fillText.append("<img src=\""+root+"images/sort_asc.png\" alt=\"▼\"></span><span class=\"menuseparator\"></span>");
464   
465    fillText.append("<span id=\"page-reload\" class=\"link\" title=\"" + menu.getString("menu.refresh.tooltip") + "\">");
466    fillText.append("<img src=\""+root+"images/refresh.png\" alt=\"Reload\"></span>");
467    fillText.append("<span class=\"menuseparator\"></span>");
468   
469    fillText.append("<span class=\"link auto-init\" title=\"").append(menu.getString("menu.recentitems.tooltip")).append("\"");
470    fillText.append(" data-auto-init=\"menu-anchor\" data-menu-id=\"menu.mostRecent\" data-align-right=\"1\">");
471    fillText.append("<img src=\""+root+"images/recent.png\" alt=\"Recent\"><img src=\""+root+"images/sort_asc.png\" alt=\"▼\"></span>");
472    fillText.append("<span class=\"menuseparator\"></span>");
473   
474    User user = User.getById(dc, sc.getLoggedInUserId());
475    fillText.append("<img src=\""+root+"images/take_ownership.png\" alt=\"\">&nbsp;");
476    fillText.append("<span class=\"link auto-init\" title=\"").append(menu.getString("menu.user.tooltip")).append("\"");
477    fillText.append(" data-auto-init=\"menu-anchor\" data-menu-id=\"menu.switchuser\" data-align-right=\"1\">");
478    fillText.append(HTML.encodeTags(user.getLogin()));
479    fillText.append(" (").append(user.getName()).append(")<img src=\""+root+"images/sort_asc.png\" alt=\"▼\"></span>");
480
481    // Permission settings
482    final boolean hasItemLists          = !sc.hasPermission(Permission.DENIED, Item.ITEMLIST);
483    final boolean hasFiles              = !sc.hasPermission(Permission.DENIED, Item.FILE);
484    final boolean createFiles           =  sc.hasPermission(Permission.CREATE, Item.FILE);
485    final boolean hasFileServers        = !sc.hasPermission(Permission.DENIED, Item.FILESERVER);
486
487    final boolean hasProjects           = !sc.hasPermission(Permission.DENIED, Item.PROJECT); 
488    final boolean createProjects        =  sc.hasPermission(Permission.CREATE, Item.PROJECT); 
489    final boolean hasPermissionTemplates = !sc.hasPermission(Permission.DENIED, Item.PERMISSIONTEMPLATE); 
490
491    final boolean hasMessages           = !sc.hasPermission(Permission.DENIED, Item.MESSAGE); 
492    final boolean createMessages        =  sc.hasPermission(Permission.CREATE, Item.MESSAGE); 
493
494    final boolean hasPhysicalBioAssays  = !sc.hasPermission(Permission.DENIED, Item.PHYSICALBIOASSAY); 
495    final boolean hasDerivedBioAssays   = !sc.hasPermission(Permission.DENIED, Item.DERIVEDBIOASSAY); 
496
497    final boolean hasRawBioAssays       = !sc.hasPermission(Permission.DENIED, Item.RAWBIOASSAY); 
498    final boolean createRawBioAssays    =  sc.hasPermission(Permission.CREATE, Item.RAWBIOASSAY); 
499    final boolean hasExperiments        = !sc.hasPermission(Permission.DENIED, Item.EXPERIMENT); 
500    final boolean createExperiments     =  sc.hasPermission(Permission.CREATE, Item.EXPERIMENT); 
501    final boolean hasFormulas           = !sc.hasPermission(Permission.DENIED, Item.FORMULA); 
502    final boolean createFormulas        =  sc.hasPermission(Permission.CREATE, Item.FORMULA); 
503   
504    final boolean hasReporters          = !sc.hasPermission(Permission.DENIED, Item.REPORTER); 
505    final boolean hasReporterLists      = !sc.hasPermission(Permission.DENIED, Item.REPORTERLIST); 
506    final boolean createReporters       =  sc.hasPermission(Permission.CREATE, Item.REPORTER); 
507    final boolean hasJobs               = !sc.hasPermission(Permission.DENIED, Item.JOB); 
508    final boolean hasSessions           = !sc.hasPermission(Permission.DENIED, Item.SESSION); 
509    %>
510    <m:menu
511      id="menu.view"
512      style="display: none"
513      >
514      <m:menuitem
515        title="<%=menu.getString("home.title")%>"
516        tooltip="<%=menu.getString("home.tooltip")%>" 
517        url="<%=root+"my_base/index.jsp?ID="+ID%>"
518      />
519      <m:menuitem
520        title="<%=menu.getString("allitems.title")%>"
521        tooltip="<%=menu.getString("allitems.tooltip")%>"
522        url="<%=root+"views/items/index.jsp?ID="+ID%>"
523      />
524      <m:menuitem
525        title="<%=menu.getString("itemlists.title")%>"
526        tooltip="<%=menu.getString("itemlists.tooltip", hasItemLists)%>"
527        url="<%=root+"views/itemlists/index.jsp?ID="+ID%>"
528        enabled="<%=hasItemLists%>"
529      />
530      <m:menuitem
531        title="<%=menu.getString("trashcan.title")%>"
532        tooltip="<%=menu.getString("trashcan.tooltip")%>"
533        url="<%=root+"views/trashcan/index.jsp?ID="+ID%>"
534      />
535      <m:menuseparator />
536      <m:menuitem 
537        title="<%=common.getString("item.file+")%>" 
538        url="<%=root+"filemanager/index.jsp?ID="+ID%>"
539        tooltip="<%=menu.getString("files.tooltip", hasFiles)%>" 
540        enabled="<%=hasFiles%>"
541      />
542      <m:menuitem 
543        title="<%=common.getString("item.fileserver+")%>" 
544        url="<%=root+"filemanager/fileservers/index.jsp?ID="+ID%>"
545        tooltip="<%=menu.getString("fileservers.tooltip", hasFileServers)%>" 
546        enabled="<%=hasFileServers%>"
547      />
548      <m:menuitem
549        title="<%=common.getString("item.project+")%>"
550        url="<%=root+"my_base/projects/index.jsp?ID="+ID%>"
551        tooltip="<%=menu.getString("projects.tooltip", hasProjects)%>"
552        enabled="<%=hasProjects%>"
553      />
554      <m:menuitem
555        title="<%=common.getString("item.permissiontemplate+")%>"
556        url="<%=root+"views/permissiontemplates/index.jsp?ID="+ID%>"
557        tooltip="<%=menu.getString("permissiontemplates.tooltip", hasPermissionTemplates)%>"
558        enabled="<%=hasPermissionTemplates%>"
559      />
560      <m:menuitem 
561        title="<%=common.getString("item.message+")%>" 
562        url="<%=root+"my_base/messages/index.jsp?ID="+ID%>"
563        tooltip="<%=menu.getString("messages.tooltip", hasMessages)%>"
564        enabled="<%=hasMessages%>"
565      />
566      <m:menuitem 
567        title="<%=common.getString("item.job+")%>" 
568        url="<%=root+"views/jobs/index.jsp?ID="+ID%>"
569        tooltip="<%=menu.getString("jobs.tooltip", hasJobs)%>"
570        enabled="<%=hasJobs%>"
571      />
572      <m:menuitem 
573        title="<%=common.getString("item.session+")%>" 
574        url="<%=root+"views/sessions/index.jsp?ID="+ID%>"
575        tooltip="<%=menu.getString("sessions.tooltip", hasSessions)%>"
576        enabled="<%=hasSessions%>"
577      />
578      <m:menuseparator />
579      <m:menuitem
580        title="<%=common.getString("item.physicalbioassay+")%>"
581        url="<%=root+"views/physicalbioassays/index.jsp?ID="+ID%>"
582        tooltip="<%=menu.getString("physicalbioassays.tooltip", hasPhysicalBioAssays)%>"
583        enabled="<%=hasPhysicalBioAssays%>"
584      />
585      <m:menuitem
586        title="<%=common.getString("item.derivedbioassay+")%>"
587        url="<%=root+"views/derivedbioassays/index.jsp?ID="+ID%>"
588        tooltip="<%=menu.getString("derivedbioassays.tooltip", hasDerivedBioAssays)%>"
589        enabled="<%=hasDerivedBioAssays%>"
590      />
591      <m:menuitem
592        title="<%=common.getString("item.rawbioassay+")%>"
593        url="<%=root+"views/rawbioassays/index.jsp?ID="+ID%>"
594        tooltip="<%=menu.getString("rawbioassays.tooltip", hasRawBioAssays)%>"
595        enabled="<%=hasRawBioAssays%>"
596      />
597      <m:menuitem
598        title="<%=common.getString("item.experiment+")%>"
599        url="<%=root+"views/experiments/index.jsp?ID="+ID%>"
600        tooltip="<%=menu.getString("experiments.tooltip", hasExperiments)%>"
601        enabled="<%=hasExperiments%>"
602      />
603      <m:menuitem
604        title="<%=common.getString("item.formula+")%>"
605        url="<%=root+"views/formulas/index.jsp?ID="+ID%>"
606        tooltip="<%=menu.getString("formulas.tooltip", hasFormulas)%>"
607        enabled="<%=hasFormulas%>"
608      />
609      <m:menuseparator />
610      <m:menuitem
611        title="<%=common.getString("item.reporter+")%>"
612        url="<%=root+"views/reporters/index.jsp?ID="+ID%>"
613        tooltip="<%=menu.getString("reporters.tooltip", hasReporters)%>"
614        enabled="<%=hasReporters%>"
615      />
616      <m:menuitem
617        title="<%=common.getString("item.reporterlist+")%>"
618        url="<%=root+"views/reporterlists/index.jsp?ID="+ID%>"
619        tooltip="<%=menu.getString("reporterlists.tooltip", hasReporterLists)%>"
620        enabled="<%=hasReporterLists%>"
621      />
622    </m:menu>
623
624    <m:menu 
625      id="menu.base" 
626      style="display: none"
627      >
628      <m:submenu 
629        subid="menu.projects" 
630        title="<%=menu.getString("menu.projects")%>"
631        tooltip="<%=menu.getString("menu.projects.tooltip", activeProject != null)%>"
632        enabled="<%=hasProjects%>"
633      />
634      <m:menuseparator />
635      <m:menuitem 
636        title="<%=menu.getString("contactinfo.title") + "…"%>" 
637        url="<%=root+"my_base/user/settings.jsp?ID="+ID+"&amp;page=contact"%>" 
638        data-popup="Settings, 600, 400" 
639        tooltip="<%=menu.getString("contactinfo.tooltip")%>" 
640      />
641      <m:menuitem 
642        title="<%=menu.getString("password.title") + "…"%>" 
643        url="<%=root+"my_base/user/settings.jsp?ID="+ID+"&amp;page=password"%>" 
644        data-popup="Settings, 600, 400" 
645        tooltip="<%=menu.getString("password.tooltip")%>" 
646      />
647      <m:menuitem 
648        title="<%=menu.getString("other.title") + "…"%>" 
649        url="<%=root+"my_base/user/settings.jsp?ID="+ID+"&amp;page=other"%>"
650        data-popup="Settings, 600, 400" 
651        tooltip="<%=menu.getString("other.tooltip")%>" 
652      />
653      <m:menuseparator />
654      <m:menuitem 
655        title="<%=menu.getString("preferences.title") + "…"%>" 
656        url="<%=root+"my_base/user/preferences.jsp?ID="+ID%>"
657        data-popup="Preferences, 600, 400" 
658        tooltip="<%=menu.getString("preferences.tooltip")%>" 
659      />
660      <m:menuitem 
661        title="<%=menu.getString("reloadpermissions.title") + "…"%>" 
662        url="<%=root+"my_base/user/submit_user.jsp?ID="+ID+"&amp;cmd=ReloadPermissions"%>"
663        data-popup="ReloadPermissions, 300, 200" 
664        tooltip="<%=menu.getString("reloadpermissions.tooltip")%>" 
665      />
666      <m:menuitem 
667        title="<%=menu.getString("resetlistsettings.title") + "…"%>" 
668        url="<%=root+"my_base/user/reset_filters.jsp?ID="+ID%>"
669        data-popup="ResetFilter, 450, 300" 
670        tooltip="<%=menu.getString("resetlistsettings.tooltip")%>" 
671      />
672      <m:menuseparator />
673      <m:menuitem 
674        title="<%=menu.getString("logout.title") + "…"%>" 
675        url="<%=root+"logout.jsp?ID="+ID%>"
676        data-popup="Logout, 300, 200"
677        tooltip="<%=menu.getString("logout.tooltip")%>" 
678      />
679    </m:menu>
680    <%
681    // BioLIMS - menu
682    final boolean hasTags             = !sc.hasPermission(Permission.DENIED, Item.TAG); 
683    final boolean createTags          =  sc.hasPermission(Permission.CREATE, Item.TAG); 
684
685    final boolean hasBioSources         = !sc.hasPermission(Permission.DENIED, Item.BIOSOURCE); 
686    final boolean createBioSources      =  sc.hasPermission(Permission.CREATE, Item.BIOSOURCE); 
687
688    final boolean hasSamples            = !sc.hasPermission(Permission.DENIED, Item.SAMPLE); 
689    final boolean createSamples         =  sc.hasPermission(Permission.CREATE, Item.SAMPLE);
690
691    final boolean hasExtracts           = !sc.hasPermission(Permission.DENIED, Item.EXTRACT); 
692    final boolean createExtracts        =  sc.hasPermission(Permission.CREATE, Item.EXTRACT); 
693   
694    final boolean hasBioPlates      = !sc.hasPermission(Permission.DENIED, Item.BIOPLATE);
695    final boolean createBioPlates   =  sc.hasPermission(Permission.CREATE, Item.BIOPLATE);
696    final boolean hasBioPlateTypes  = !sc.hasPermission(Permission.DENIED, Item.BIOPLATETYPE);
697    final boolean hasBioPlateEventTypes = !sc.hasPermission(Permission.DENIED, Item.BIOPLATEEVENTTYPE);
698   
699    final boolean hasKits = !sc.hasPermission(Permission.DENIED, Item.KIT);
700
701    final boolean hasBioLims      =  hasTags || hasBioSources || hasSamples || hasExtracts || 
702                      hasBioPlates || hasBioPlateTypes || hasBioPlateEventTypes ||
703                      hasKits;
704   
705    if (hasBioLims)
706    {
707    %>
708      <m:menu 
709        id="menu.biolims"
710        style="display: none"
711        >
712        <m:menuitem
713          title="<%=common.getString("item.biosource+")%>"
714          url="<%=root+"biomaterials/biosources/index.jsp?ID="+ID%>"
715          tooltip="<%=menu.getString("biosources.tooltip", hasBioSources)%>"
716          enabled="<%=hasBioSources%>"
717        />
718        <m:menuitem
719          title="<%=common.getString("item.sample+")%>"
720          url="<%=root+"biomaterials/samples/index.jsp?ID="+ID%>"
721          tooltip="<%=menu.getString("samples.tooltip", hasSamples)%>"
722          enabled="<%=hasSamples%>"
723        />
724        <m:menuitem
725          title="<%=common.getString("item.extract+")%>"
726          url="<%=root+"biomaterials/extracts/index.jsp?ID="+ID%>"
727          tooltip="<%=menu.getString("extracts.tooltip", hasExtracts)%>"
728          enabled="<%=hasExtracts%>"
729        />
730        <m:menuseparator />
731        <m:menuitem
732          title="<%=common.getString("item.tag+")%>"
733          url="<%=root+"biomaterials/tags/index.jsp?ID="+ID%>"
734          tooltip="<%=menu.getString("tags.tooltip", hasTags)%>"
735          enabled="<%=hasTags%>"
736        />
737        <m:menuitem
738          title="<%=common.getString("item.kit+")%>"
739          url="<%=root+"biomaterials/kits/index.jsp?ID="+ID%>"
740          tooltip="<%=menu.getString("kits.tooltip", hasKits)%>"
741          enabled="<%=hasKits%>"
742        />
743        <m:menuseparator />
744        <m:menuitem
745          title="<%=common.getString("item.bioplate+")%>"
746          url="<%=root+"biomaterials/bioplates/index.jsp?ID="+ID%>"
747          tooltip="<%=menu.getString("bioplates.tooltip", hasBioPlates)%>"
748          enabled="<%=hasBioPlates%>"
749        />
750        <m:menuitem
751          title="<%=common.getString("item.bioplatetype+")%>"
752          url="<%=root+"biomaterials/bioplatetypes/index.jsp?ID="+ID%>"
753          tooltip="<%=menu.getString("bioplatetypes.tooltip", hasBioPlateTypes)%>"
754          enabled="<%=hasBioPlateTypes%>"
755        />
756        <m:menuitem
757          title="<%=common.getString("item.bioplateeventtype+")%>"
758          url="<%=root+"biomaterials/bioplateeventtypes/index.jsp?ID="+ID%>"
759          tooltip="<%=menu.getString("bioplateeventtypes.tooltip", hasBioPlateEventTypes)%>"
760          enabled="<%=hasBioPlateEventTypes%>"
761        />
762      </m:menu>
763    <%
764    }
765   
766    // Array LIMS - menu
767    final boolean hasPlateGeometries = sc.hasPermission(Permission.READ, Item.PLATEGEOMETRY);
768    final boolean hasPlateTypes = !sc.hasPermission(Permission.DENIED, Item.PLATETYPE);
769    final boolean hasPlates = !sc.hasPermission(Permission.DENIED, Item.PLATE);
770    final boolean hasPlateMappings = !sc.hasPermission(Permission.DENIED, Item.PLATEMAPPING);
771    final boolean hasArraySlides = !sc.hasPermission(Permission.DENIED, Item.ARRAYSLIDE);
772    final boolean hasArrayBatches = !sc.hasPermission(Permission.DENIED, Item.ARRAYBATCH);
773    final boolean hasArrayDesigns = !sc.hasPermission(Permission.DENIED, Item.ARRAYDESIGN);
774    final boolean hasLims = hasPlateGeometries || hasPlateTypes || hasPlates || hasPlateMappings || 
775      hasArraySlides || hasArrayBatches || hasArrayDesigns;
776    if (hasLims)
777    {
778      %>
779      <m:menu 
780        id="menu.lims" 
781        style="display: none"
782        >
783        <m:menuitem 
784          title="<%=common.getString("item.plategeometry+")%>" 
785          url="<%=root+"lims/geometries/index.jsp?ID="+ID%>" 
786          tooltip="<%=menu.getString("plategeometries.tooltip", hasPlateGeometries)%>" 
787          enabled="<%=hasPlateGeometries%>"
788        />
789        <m:menuitem 
790          title="<%=common.getString("item.platetype+")%>" 
791          url="<%=root+"lims/platetypes/index.jsp?ID="+ID%>" 
792          tooltip="<%=menu.getString("platetypes.tooltip", hasPlateTypes)%>" 
793          enabled="<%=hasPlateTypes%>"
794        />
795        <m:menuitem 
796          title="<%=common.getString("item.plate+")%>" 
797          url="<%=root+"lims/plates/index.jsp?ID="+ID%>" 
798          tooltip="<%=menu.getString("plates.tooltip", hasPlates)%>" 
799          enabled="<%=hasPlates%>"
800        />
801        <m:menuitem 
802          title="<%=common.getString("item.platemapping+")%>" 
803          url="<%=root+"lims/platemappings/index.jsp?ID="+ID%>" 
804          tooltip="<%=menu.getString("platetypes.tooltip", hasPlateTypes)%>" 
805          enabled="<%=hasPlateTypes%>"
806        />
807        <m:menuseparator />
808        <m:menuitem 
809          title="<%=common.getString("item.arraydesign+")%>" 
810          url="<%=root+"lims/arraydesigns/index.jsp?ID="+ID%>" 
811          tooltip="<%=menu.getString("arraydesigns.tooltip", hasArrayDesigns)%>" 
812          enabled="<%=hasArrayDesigns%>"
813        />
814        <m:menuitem 
815          title="<%=common.getString("item.arraybatch+")%>" 
816          url="<%=root+"lims/arraybatches/index.jsp?ID="+ID%>" 
817          tooltip="<%=menu.getString("arraybatches.tooltip", hasArrayBatches)%>" 
818          enabled="<%=hasArrayBatches%>"
819        />
820        <m:menuitem 
821          title="<%=common.getString("item.arrayslide+")%>" 
822          url="<%=root+"lims/arrayslides/index.jsp?ID="+ID%>" 
823          tooltip="<%=menu.getString("arrayslides.tooltip", hasArraySlides)%>" 
824          enabled="<%=hasArraySlides%>"
825        />
826      </m:menu>
827      <%
828    }
829    // Administrate -> Types menu
830    final boolean hasQuotaTypes = sc.hasPermission(Permission.READ, Item.QUOTATYPE);
831    final boolean hasMimeTypes = sc.hasPermission(Permission.READ, Item.MIMETYPE);
832    final boolean hasAnnotationTypeCategories = !sc.hasPermission(Permission.DENIED, Item.ANNOTATIONTYPECATEGORY);   
833    final boolean hasAnnotationTypes = !sc.hasPermission(Permission.DENIED, Item.ANNOTATIONTYPE);
834    final boolean hasReporterTypes = !sc.hasPermission(Permission.DENIED, Item.REPORTERTYPE);
835    final boolean hasExtraValueTypes = !sc.hasPermission(Permission.DENIED, Item.EXTRAVALUETYPE);
836    final boolean hasQuantities = !sc.hasPermission(Permission.DENIED, Item.QUANTITY);
837    final boolean hasItemSubtypes = sc.hasPermission(Permission.READ, Item.ITEMSUBTYPE);
838    final boolean hasTypes = hasMimeTypes || hasQuotaTypes || 
839      hasAnnotationTypeCategories || hasAnnotationTypes || 
840      hasReporterTypes || hasExtraValueTypes || hasQuantities || hasItemSubtypes;
841    if (hasTypes)
842    {
843      %>
844      <m:menu 
845        id="menu.types" 
846        style="display: none"
847        >
848        <m:menuitem 
849          title="<%=common.getString("item.itemsubtype+")%>" 
850          url="<%=root+"admin/itemsubtypes/index.jsp?ID="+ID%>" 
851          tooltip="<%=menu.getString("itemsubtypes.tooltip", hasItemSubtypes)%>" 
852          enabled="<%=hasItemSubtypes%>"
853        />
854        <m:menuseparator />
855        <m:menuitem 
856          title="<%=common.getString("item.annotationtype+")%>" 
857          url="<%=root+"admin/annotationtypes/index.jsp?ID="+ID%>" 
858          tooltip="<%=menu.getString("annotationtypes.tooltip", hasAnnotationTypes)%>" 
859          enabled="<%=hasAnnotationTypes%>"
860        />
861        <m:menuitem 
862          title="<%=common.getString("item.annotationtypecategory+")%>" 
863          url="<%=root+"admin/annotationtypecategories/index.jsp?ID="+ID%>" 
864          tooltip="<%=menu.getString("annotationtypecategories.tooltip", hasAnnotationTypeCategories)%>" 
865          enabled="<%=hasAnnotationTypeCategories%>"
866        />
867        <m:menuseparator />
868        <m:menuitem 
869          title="<%=common.getString("item.mimetype+")%>" 
870          url="<%=root+"admin/mimetypes/index.jsp?ID="+ID%>" 
871          tooltip="<%=menu.getString("mimetypes.tooltip", hasMimeTypes)%>" 
872          enabled="<%=hasMimeTypes%>"
873        />
874        <m:menuitem 
875          title="<%=common.getString("item.quotatype+")%>" 
876          url="<%=root+"admin/quotatypes/index.jsp?ID="+ID%>" 
877          tooltip="<%=menu.getString("quotatypes.tooltip", hasQuotaTypes)%>" 
878          enabled="<%=hasQuotaTypes%>"
879        />
880        <m:menuitem 
881          title="<%=common.getString("item.reportertype+")%>" 
882          url="<%=root+"admin/reportertypes/index.jsp?ID="+ID%>" 
883          tooltip="<%=menu.getString("reportertypes.tooltip", hasReporterTypes)%>" 
884          enabled="<%=hasReporterTypes%>"
885        />
886        <m:menuitem 
887          title="<%=common.getString("item.extravaluetype+")%>" 
888          url="<%=root+"admin/extravaluetypes/index.jsp?ID="+ID%>" 
889          tooltip="<%=menu.getString("extravaluetypes.tooltip", hasExtraValueTypes)%>" 
890          enabled="<%=hasExtraValueTypes%>"
891        />
892        <m:menuseparator />
893        <m:menuitem 
894          title="<%=menu.getString("units+quantities.title")%>" 
895          url="<%=root+"admin/quantities/index.jsp?ID="+ID%>" 
896          tooltip="<%=menu.getString("units+quantities.tooltip", hasQuantities)%>" 
897          enabled="<%=hasQuantities%>"
898        />
899      </m:menu>
900      <%
901    }
902    // Administrate -> Platforms menu
903    final boolean hasPlatforms = sc.hasPermission(Permission.READ, Item.PLATFORM);
904    final boolean hasFileSetMemberTypes = sc.hasPermission(Permission.READ, Item.DATAFILETYPE);
905    final boolean hasTopPlatforms = hasPlatforms || hasFileSetMemberTypes;
906    if (hasTopPlatforms)
907    {
908      %>
909      <m:menu 
910        id="menu.platforms"
911        style="display: none"
912        >
913        <m:menuitem 
914          title="<%=common.getString("item.platform+")%>"
915          url="<%=root+"admin/platforms/index.jsp?ID="+ID%>" 
916          tooltip="<%=menu.getString("platforms.tooltip", hasPlatforms)%>"
917          enabled="<%=hasPlatforms%>"
918        />
919        <m:menuitem 
920          title="<%=common.getString("item.datafiletype+")%>"
921          url="<%=root+"admin/datafiletypes/index.jsp?ID="+ID%>" 
922          tooltip="<%=menu.getString("datafiletypes.tooltip", hasFileSetMemberTypes)%>"
923          enabled="<%=hasFileSetMemberTypes%>"
924        />
925      </m:menu>
926      <%
927    }
928    // Plugins menu
929    final boolean hasPluginTypes = !sc.hasPermission(Permission.DENIED, Item.PLUGINTYPE);
930    final boolean hasPluginDefinitions = !sc.hasPermission(Permission.DENIED, Item.PLUGINDEFINITION);
931    final boolean hasPluginConfigurations = !sc.hasPermission(Permission.DENIED, Item.PLUGINCONFIGURATION);
932    final boolean hasJobAgents = sc.hasPermission(Permission.READ, Item.JOBAGENT);
933    final boolean hasPlugins = hasPluginTypes || hasPluginDefinitions || 
934      hasPluginConfigurations || hasJobAgents;
935   
936    if (hasPlugins)
937    {
938      %>
939      <m:menu 
940        id="menu.plugins" 
941        style="display: none"
942        >
943        <m:menuitem
944          title="<%=menu.getString("installedextensions.title")%>"
945          url="<%=root+"admin/extensions/index.jsp?ID="+ID%>"
946          tooltip="<%=menu.getString("installedextensions.tooltip")%>"
947        />
948        <m:menuseparator />
949        <m:menuitem 
950          title="<%=menu.getString("plugintypes.title")%>" 
951          url="<%=root+"admin/plugintypes/index.jsp?ID="+ID%>" 
952          tooltip="<%=menu.getString("plugintypes.tooltip", hasPluginTypes)%>"
953          enabled="<%=hasPluginTypes%>"
954        />
955        <m:menuitem 
956          title="<%=menu.getString("plugindefinitions.title")%>" 
957          url="<%=root+"admin/plugindefinitions/index.jsp?ID="+ID%>" 
958          tooltip="<%=menu.getString("plugindefinitions.tooltip", hasPluginDefinitions)%>"
959          enabled="<%=hasPluginDefinitions%>"
960        />
961        <m:menuitem 
962          title="<%=menu.getString("pluginconfigurations.title")%>" 
963          url="<%=root+"admin/pluginconfigurations/index.jsp?ID="+ID%>" 
964          tooltip="<%=menu.getString("pluginconfigurations.tooltip", hasPluginConfigurations)%>"
965          enabled="<%=hasPluginConfigurations%>"
966        />
967        <m:menuseparator />
968        <m:menuitem 
969          title="<%=common.getString("item.jobagent+")%>" 
970          url="<%=root+"admin/jobagents/index.jsp?ID="+ID%>" 
971          tooltip="<%=menu.getString("jobagents.tooltip", hasJobAgents)%>"
972          enabled="<%=hasJobAgents%>"
973        />
974      </m:menu>
975      <%
976    }
977    // Administrate menu
978    final boolean hasUsers = !sc.hasPermission(Permission.DENIED, Item.USER);
979    final boolean hasGroups = !sc.hasPermission(Permission.DENIED, Item.GROUP);
980    final boolean hasRoles = sc.hasPermission(Permission.READ, Item.ROLE);
981    final boolean hasQuota = sc.hasPermission(Permission.READ, Item.QUOTA);
982    final boolean hasSoftware = !sc.hasPermission(Permission.DENIED, Item.SOFTWARE);
983    final boolean hasHardware = !sc.hasPermission(Permission.DENIED, Item.HARDWARE);
984    final boolean hasProtocols = !sc.hasPermission(Permission.DENIED, Item.PROTOCOL);
985    final boolean hasClients = sc.hasPermission(Permission.READ, Item.CLIENT);
986    final boolean hasNews = sc.hasPermission(Permission.READ, Item.NEWS);
987    final boolean hasReporterCloneTemplates = !sc.hasPermission(Permission.DENIED, Item.REPORTERCLONETEMPLATE);
988    final boolean hasDiskUsage = sc.hasPermission(Permission.READ, Item.DISKUSAGE);
989    final Client currentClient = Client.getById(dc, sc.getClientId());
990    final boolean hasServer = currentClient.hasPermission(Permission.WRITE);
991
992    final boolean hasAdministrate = 
993      hasUsers || hasGroups || hasRoles || hasQuota || hasTypes || hasPlugins ||
994      hasSoftware || hasHardware || hasProtocols || hasClients || hasNews || hasReporterCloneTemplates || 
995      hasDiskUsage || hasServer || hasTopPlatforms;
996
997    if (hasAdministrate)
998    {
999      %>
1000      <m:menu 
1001        id="menu.administrate" 
1002        style="display: none"
1003        >
1004        <m:menuitem 
1005          title="<%=common.getString("item.user+")%>" 
1006          url="<%=root+"admin/users/index.jsp?ID="+ID%>" 
1007          tooltip="<%=menu.getString("users.tooltip", hasUsers)%>"
1008          enabled="<%=hasUsers%>"
1009        />
1010        <m:menuitem 
1011          title="<%=common.getString("item.group+")%>" 
1012          url="<%=root+"admin/groups/index.jsp?ID="+ID%>" 
1013          tooltip="<%=menu.getString("groups.tooltip", hasGroups)%>" 
1014          enabled="<%=hasGroups%>"
1015        />
1016        <m:menuitem 
1017          title="<%=common.getString("item.role+")%>" 
1018          url="<%=root+"admin/roles/index.jsp?ID="+ID%>" 
1019          tooltip="<%=menu.getString("roles.tooltip", hasRoles)%>" 
1020          enabled="<%=hasRoles%>"
1021        />
1022        <m:menuseparator />
1023        <m:submenu 
1024          subid="menu.plugins" 
1025          title="<%=menu.getString("menu.plugins")%>"
1026          tooltip="<%=menu.getString("menu.plugins.tooltip")%>"
1027          enabled="<%=hasPlugins%>"
1028        />
1029        <m:menuseparator />
1030        <m:menuitem 
1031          title="<%=common.getString("item.quota+")%>" 
1032          url="<%=root+"admin/quota/index.jsp?ID="+ID%>" 
1033          tooltip="<%=menu.getString("quota.tooltip", hasQuota)%>" 
1034          enabled="<%=hasQuota%>"
1035        />
1036        <m:menuitem 
1037          title="<%=common.getString("item.software+")%>" 
1038          url="<%=root+"admin/software/index.jsp?ID="+ID%>" 
1039          tooltip="<%=menu.getString("software.tooltip", hasSoftware)%>" 
1040          enabled="<%=hasSoftware%>"
1041        />
1042        <m:menuitem 
1043          title="<%=common.getString("item.hardware+")%>" 
1044          url="<%=root+"admin/hardware/index.jsp?ID="+ID%>" 
1045          tooltip="<%=menu.getString("hardware.tooltip", hasHardware)%>" 
1046          enabled="<%=hasHardware%>"
1047        />
1048        <m:menuitem 
1049          title="<%=common.getString("item.protocol+")%>" 
1050          url="<%=root+"admin/protocols/index.jsp?ID="+ID%>" 
1051          tooltip="<%=menu.getString("protocols.tooltip", hasProtocols)%>" 
1052          enabled="<%=hasProtocols%>"
1053        />
1054        <m:menuitem 
1055          title="<%=common.getString("item.client+")%>" 
1056          url="<%=root+"admin/clients/index.jsp?ID="+ID%>" 
1057          tooltip="<%=menu.getString("clients.tooltip", hasClients)%>" 
1058          enabled="<%=hasClients%>"
1059        />
1060        <m:menuitem 
1061          title="<%=common.getString("item.news+")%>" 
1062          url="<%=root+"admin/news/index.jsp?ID="+ID%>" 
1063          tooltip="<%=menu.getString("news.tooltip", hasNews)%>" 
1064          enabled="<%=hasNews%>"
1065        />
1066        <m:menuitem 
1067          title="<%=common.getString("item.reporterclonetemplate+")%>" 
1068          url="<%=root+"admin/reporterclonetemplates/index.jsp?ID="+ID%>" 
1069          tooltip="<%=menu.getString("reporterclonetemplates.tooltip", hasReporterCloneTemplates)%>" 
1070          enabled="<%=hasReporterCloneTemplates%>"
1071        />
1072        <m:menuseparator />
1073        <m:submenu 
1074          subid="menu.platforms" 
1075          title="<%=menu.getString("menu.platforms")%>"
1076          tooltip="<%=menu.getString("menu.platforms.tooltip")%>"
1077          enabled="<%=hasTopPlatforms%>"
1078        />
1079        <m:submenu 
1080          subid="menu.types" 
1081          title="<%=menu.getString("menu.types")%>"
1082          tooltip="<%=menu.getString("menu.types.tooltip")%>"
1083          enabled="<%=hasTypes%>"
1084        />
1085        <m:menuseparator />
1086        <m:menuitem 
1087          title="<%=common.getString("item.diskusage+")%>" 
1088          url="<%=root+"admin/diskusage/index.jsp?ID="+ID%>" 
1089          tooltip="<%=menu.getString("diskusage.tooltip", hasDiskUsage)%>" 
1090          enabled="<%=hasDiskUsage%>"
1091        />
1092        <m:menuitem 
1093          title="<%=menu.getString("serversettings.title")+"…"%>"
1094          url="<%=root+"admin/server/configure.jsp?ID="+ID%>"
1095          data-popup="ServerSettings, 600, 400"
1096          tooltip="<%=menu.getString("serversettings.tooltip", hasServer)%>"
1097          enabled="<%=hasServer%>"
1098        />
1099        <m:menuitem 
1100          title="<%=menu.getString("broadcast.title")+"…"%>"
1101          url="<%=root+"admin/server/broadcast.jsp?ID="+ID%>"
1102          data-popup="BroadcastMessage, 600, 400"
1103          tooltip="<%=menu.getString("broadcast.tooltip", hasServer)%>"
1104          enabled="<%=hasServer%>"
1105        />
1106        <m:menuitem
1107          title="<%=menu.getString("services.title")%>"
1108          tooltip="<%=menu.getString("services.tooltip", hasServer)%>"
1109          url="<%=root+"admin/services/index.jsp?ID="+ID%>"
1110          enabled="<%=hasServer%>"
1111        />
1112      </m:menu>
1113      <%
1114    }
1115    // Help menu
1116    final String helplink = Values.getStringOrNull(sc.getClientDefaultSetting("server.links.help"));
1117    final String faqlink = Values.getStringOrNull(sc.getClientDefaultSetting("server.links.faq"));
1118    final String reportbuglink = Values.getStringOrNull(sc.getClientDefaultSetting("server.links.reportbug"));
1119    %>
1120    <m:menu id="menu.help" style="display: none">
1121      <m:menuitem
1122        visible="<%=HTML.isValidUrl(helplink)%>"
1123        title="<%=menu.getString("menu.help") + "…"%>"
1124        url="<%=helplink%>"
1125        data-target="Help"
1126      />
1127      <m:menuitem
1128        visible="<%=HTML.isValidUrl(faqlink)%>"
1129        title="<%=menu.getString("faq.title") + "…"%>"
1130        url="<%=faqlink%>"
1131        data-target="FAQ"
1132        tooltip="<%=menu.getString("faq.tooltip") %>"
1133      />
1134      <m:menuseparator />
1135
1136      <m:menuitem
1137        title="<%=menu.getString("about.title") + "…"%>"
1138        url="<%=root+"info/about.jsp?ID="+ID+"&amp;page=about"%>"
1139        data-popup="About, 600, 400"
1140      />
1141      <m:menuitem
1142        title="<%=menu.getString("license.title") + "…"%>"
1143        url="<%=root+"info/about.jsp?ID="+ID+"&amp;page=license"%>"
1144        data-popup="About, 600, 400"
1145      />
1146      <m:menuitem
1147        visible="<%=HTML.isValidUrl(reportbuglink)%>"
1148        title="<%=menu.getString("bugreport.title") + "…"%>"
1149        url="<%=reportbuglink%>"
1150        data-target="ReportBug"
1151        tooltip="<%=menu.getString("bugreport.tooltip")%>"
1152      />
1153      <m:menuseparator />
1154      <m:menuitem
1155        title="<%=menu.getString("basesite.title") + "…"%>" 
1156        url="http://base.thep.lu.se"
1157        data-target="basesite"
1158        tooltip="<%=menu.getString("basesite.tooltip")%>"
1159      />
1160    </m:menu>
1161    <%
1162    //Switch user/logout menu
1163    final boolean hasImpersonate = 
1164      !sc.isImpersonated() && sc.hasSystemPermission(Permission.ACT_AS_ANOTHER_USER);
1165   
1166    List<Role> roles = null;
1167    Set<Integer> roleIds = sc.getAllRoles();
1168    if (roleIds != null && roleIds.size() > 0)
1169    {
1170      ItemQuery<Role> roleQuery = Role.getQuery();
1171      roleQuery.restrict(Restrictions.in(Hql.property("id"), Expressions.parameter("roles")));
1172      roleQuery.setParameter("roles", roleIds, Type.INT);
1173      roleQuery.order(Orders.asc(Hql.property("name")));
1174      roles = roleQuery.list(dc);
1175    }
1176    %>
1177    <m:menu
1178      id="menu.switchuser"
1179      style="display: none;"
1180      >
1181      <m:menuitem 
1182        title="<%=menu.getString("switchuser.title") + "…"%>" 
1183        url="<%=root+"switch.jsp?ID="+ID%>"
1184        data-popup="Switch, 480, 320"
1185        tooltip="<%=menu.getString("switchuser.tooltip")%>" 
1186      />
1187      <m:menuitem 
1188        title="<%=menu.getString("impersonate.title") + "…"%>" 
1189        url="<%=root+"impersonate.jsp?ID="+ID%>"
1190        data-popup="Impersonate, 480, 320"
1191        tooltip="<%=menu.getString("impersonate.tooltip")%>" 
1192        visible="<%=hasImpersonate%>"
1193      />
1194      <m:menuitem 
1195        title="<%=menu.getString("logout.title") + "…"%>" 
1196        url="<%=root+"logout.jsp?ID="+ID%>"
1197        data-popup="Logout, 360, 240"
1198        tooltip="<%=menu.getString("logout.tooltip")%>" 
1199      />
1200      <%
1201      if (roles != null && roles.size() > 0)
1202      {
1203        %>
1204        <m:menuseparator />
1205        <m:menuitem 
1206          title="<%=menu.getString("myroles.title")%>"
1207          subclass="menusection"
1208          enabled="false" 
1209        />
1210        <m:menuseparator />
1211        <%
1212        for (Role r : roles)
1213        {
1214          boolean isInactive = sc.isRoleInactive(r.getId());
1215          %>
1216          <m:menuitem 
1217            title="<%=r.getName() %>"
1218            tooltip="<%=menu.getString("myroles.tooltip", isInactive)%>"
1219            icon="<%=isInactive ? "option_unselected.png" : "option_selected.png"%>"
1220            url="<%=root+"my_base/toggle_active_role.jsp?ID="+ID+"&role_id="+r.getId()%>"
1221            data-popup="ActivateRole, 300, 200"
1222          />
1223          <%
1224        }
1225      }
1226      %>
1227    </m:menu>
1228    <%
1229    // Extensions menu
1230    JspContext jspContext = ExtensionsControl.createContext(dc, pageContext);
1231    ExtensionsInvoker<MenuItemAction> invoker = 
1232      (ExtensionsInvoker<MenuItemAction>)ExtensionsControl.useExtensions(jspContext, 
1233        "net.sf.basedb.clients.web.menu.extensions");
1234    ExtensionsControl ec = ExtensionsControl.get(dc);
1235    ActionIterator<MenuItemAction> it = invoker.iterate();
1236    Map<String, List<MenuItemAction>> menus = new HashMap<String, List<MenuItemAction>>();
1237    menus.put("extensions", new LinkedList<MenuItemAction>());
1238    int numExtensionMenues = 0;
1239    while (it.hasNext())
1240    {
1241      MenuItemAction action = it.next();
1242      String menuId = action.getMenuId();
1243      menuId = menuId == null ? "extensions" : "extensions." + menuId;
1244      List<MenuItemAction> actions = menus.get(menuId);
1245      if (actions == null)
1246      {
1247        actions = new LinkedList<MenuItemAction>();
1248        menus.put(menuId, actions);
1249      }
1250      actions.add(action);
1251    }
1252    for (Map.Entry<String, List<MenuItemAction>> entry : menus.entrySet())
1253    {
1254      String menuId = entry.getKey();
1255      List<MenuItemAction> actions = entry.getValue();
1256      if (actions.size() == 0) continue;
1257      %>
1258      <m:menu id="<%="menu."+menuId%>" style="display: none;">
1259      <%
1260      for (MenuItemAction action : actions)
1261      {
1262        numExtensionMenues++;
1263        Iterator<DynamicActionAttribute> dynamicAttributes = 
1264          action instanceof DynamicActionAttributes ?
1265            ((DynamicActionAttributes)action).getDynamicActionAttributes() : null;
1266        if (action.getType() == MenuItemAction.MenuType.SEPARATOR)
1267        {
1268          %>
1269          <m:menuseparator 
1270            id="<%=action.getId() %>"
1271            subclass="<%=action.getClazz() %>"
1272            style="<%=action.getStyle()%>" 
1273            visible="<%=action.isVisible()%>" 
1274            dynamic="<%=dynamicAttributes%>"
1275          />
1276          <%
1277        }
1278        else if (action.getType() == MenuItemAction.MenuType.MENUITEM)
1279        {
1280          %>
1281          <m:menuitem 
1282            id="<%=action.getId() %>"
1283            subclass="<%=action.getClazz() %>"
1284            style="<%=action.getStyle()%>"
1285            title="<%=action.getTitle()%>"
1286            icon="<%=action.getIcon()%>"
1287            tooltip="<%=action.getTooltip()%>"
1288            enabled="<%=action.isEnabled()%>"
1289            visible="<%=action.isVisible()%>"
1290            dynamic="<%=dynamicAttributes%>"
1291          />
1292          <%
1293        }
1294        else if (action.getType() == MenuItemAction.MenuType.SUBMENU)
1295        {
1296          %>
1297          <m:submenu 
1298            id="<%=action.getId() %>"
1299            subclass="<%=action.getClazz() %>"
1300            subid="<%="menu.extensions." + action.getSubmenuId()%>"
1301            style="<%=action.getStyle()%>"
1302            title="<%=action.getTitle()%>"
1303            icon="<%=action.getIcon()%>"
1304            tooltip="<%=action.getTooltip()%>"
1305            enabled="<%=action.isEnabled()%>"
1306            visible="<%=action.isVisible()%>"
1307            dynamic="<%=dynamicAttributes%>"
1308          />
1309          <%
1310        }
1311      }
1312      %>
1313      </m:menu>
1314      <%
1315    }
1316    // Main menu
1317    %>
1318    <ext:scripts context="<%=jspContext%>" />
1319    <ext:stylesheets context="<%=jspContext%>" />
1320    <m:menu
1321      type="horizontal"
1322      id="menubar"
1323      style="top: 0px; left: 0px; right: 0px;"
1324      open="click"
1325      filltext="<%=fillText.toString()%>"
1326      >
1327      <m:submenu
1328        subid="menu.base"
1329        title="<%=menu.getString("menu.base")%>"
1330      />
1331      <m:submenu
1332        subid="menu.view"
1333        title="<%=menu.getString("menu.view")%>"
1334      />
1335      <m:submenu 
1336        subid="menu.biolims"
1337        title="<%=menu.getString("menu.biolims")%>"
1338      />
1339      <m:submenu
1340        subid="menu.lims"
1341        title="<%=menu.getString("menu.arraylims")%>"
1342      />
1343      <m:submenu
1344        subid="menu.administrate"
1345        title="<%=menu.getString("menu.administrate")%>"
1346        visible="<%=hasAdministrate%>"
1347      />
1348      <m:submenu
1349        subid="menu.extensions"
1350        title="<%=menu.getString("menu.extensions")%>"
1351        visible="<%=numExtensionMenues > 0 %>"
1352      />
1353      <m:submenu
1354        subid="menu.help"
1355        title="<%=menu.getString("menu.help")%>"
1356      />
1357    </m:menu>
1358    <%
1359  }
1360  finally
1361  {
1362    if (dc != null) dc.close();
1363  }
1364
1365}
1366%>
1367
1368
Note: See TracBrowser for help on using the repository browser.