From 71d45c26a88500e82a2da40f67cfb43da8eb3e45 Mon Sep 17 00:00:00 2001
From: "Barbara B. Frosik" <bfrosik@aps.anl.gov>
Date: Tue, 3 Feb 2015 17:58:53 +0000
Subject: [PATCH]

---
 .../controllers/ExperimentController.java     | 73 ++++++++++++++-----
 .../portal/controllers/LoginController.java   | 19 +++--
 .../aps/dm/portal/utilities/DoubleKeyMap.java | 58 +++++++++++++++
 .../common/commonListActionButtons.xhtml      |  2 +-
 .../experiment/experimentListDataTable.xhtml  |  4 +-
 .../experimentUsersEditDataTable.xhtml        | 22 +++---
 .../experimentTypeListDataTable.xhtml         |  4 +-
 .../web/views/roleType/create.xhtml           | 30 --------
 .../DmWebPortal/web/views/roleType/list.xhtml |  9 ++-
 .../roleType/roleTypeDestroyDialog.xhtml      | 13 ----
 .../roleType/roleTypeListDataTable.xhtml      | 17 ++---
 .../userInfo/userInfoListDataTable.xhtml      |  4 +-
 .../web/views/userSystemRole/list.xhtml       |  2 +-
 .../systemRoleListDataTable.xhtml             |  2 +-
 14 files changed, 157 insertions(+), 102 deletions(-)
 create mode 100644 src/java/DmWebPortal/src/java/gov/anl/aps/dm/portal/utilities/DoubleKeyMap.java
 delete mode 100644 src/java/DmWebPortal/web/views/roleType/create.xhtml
 delete mode 100644 src/java/DmWebPortal/web/views/roleType/roleTypeDestroyDialog.xhtml

diff --git a/src/java/DmWebPortal/src/java/gov/anl/aps/dm/portal/controllers/ExperimentController.java b/src/java/DmWebPortal/src/java/gov/anl/aps/dm/portal/controllers/ExperimentController.java
index 9cb7c6ae..d8861e22 100644
--- a/src/java/DmWebPortal/src/java/gov/anl/aps/dm/portal/controllers/ExperimentController.java
+++ b/src/java/DmWebPortal/src/java/gov/anl/aps/dm/portal/controllers/ExperimentController.java
@@ -15,6 +15,7 @@ import gov.anl.aps.dm.portal.model.entities.CloneableEntity;
 import gov.anl.aps.dm.portal.model.entities.RoleType;
 import gov.anl.aps.dm.portal.model.entities.UserExperimentRole;
 import gov.anl.aps.dm.portal.model.entities.UserInfo;
+import gov.anl.aps.dm.portal.utilities.DoubleKeyMap;
 import gov.anl.aps.dm.portal.utilities.SessionUtility;
 import java.util.ArrayList;
 import java.util.HashMap;
@@ -120,7 +121,7 @@ public class ExperimentController extends CrudEntityController<Experiment, Exper
                 }
             }
         }
-
+        
         @Override
         public int hashCode() {
             return userId + experimentId * 100;
@@ -150,15 +151,18 @@ public class ExperimentController extends CrudEntityController<Experiment, Exper
         }
         
         List<ExperimentUser> convertExperimentUsers(List<UserInfo> list) {
+            if (!initialized) {
+                initializeRoleTypes();
+            }
             logger.debug("converting ExperimentUser ");
             List<RoleType> roleTypes = roleTypeFacade.findByRoleSystemType(false);
             ExperimentUser experimentUser;
             for (UserInfo user : list) {
-                if ((experimentUser = experimentUsers.get(user)) == null) {
+                if ((experimentUser = experimentUsers.getByFirstKey(user)) == null) {
                     experimentUser = new ExperimentUser(getCurrent().getId(), user.getId());
                     experimentUser.setUsername(user.getUsername());
                     experimentUser.setName(user.getLastName() + ", " + user.getFirstName());
-                    experimentUsers.put(user, experimentUser);
+                    experimentUsers.put(user, user.getId(), experimentUser);
                 }
                 for (RoleType roleType : roleTypes) {
                     boolean inRole = user.inRole(roleType.getId(), getCurrent().getId());
@@ -196,9 +200,11 @@ public class ExperimentController extends CrudEntityController<Experiment, Exper
     private ExperimentController.ExperimentUsersTable experimentUsersListTable = new ExperimentController.ExperimentUsersTable();
     private ExperimentController.ExperimentUsersTable experimentUsersEditTable = new ExperimentController.ExperimentUsersTable();
     private ExperimentController.NoExperimentUsersTypeTable noExperimentUsersTypeTable = new ExperimentController.NoExperimentUsersTypeTable();
-    final private Map<UserInfo, ExperimentUser> experimentUsers = new HashMap<>();
+    final private DoubleKeyMap<UserInfo, Integer, ExperimentUser> experimentUsers = new DoubleKeyMap<>();
     final private Map<String, RoleType> experimentRoles = new HashMap<>();
     int maxExperimentRoleTypeId = 0;
+    boolean initialized = false;
+    private UserInfo loggedUser = null;
 
     public ExperimentController() {
         this.experimentUsersListTable = new ExperimentController.ExperimentUsersTable();
@@ -237,8 +243,8 @@ public class ExperimentController extends CrudEntityController<Experiment, Exper
     @Override
     public String prepareEdit(Experiment experiment) {
         clear();
-        if (maxExperimentRoleTypeId == 0) {
-            setMaxExperimentRoleTypeId();
+        if (!initialized) {
+            initializeRoleTypes();
         }
         return super.prepareEdit(experiment);
     }
@@ -246,13 +252,10 @@ public class ExperimentController extends CrudEntityController<Experiment, Exper
     @Override
     public String prepareView(Experiment experiment) {
         clear();
-        if (maxExperimentRoleTypeId == 0) {
-            setMaxExperimentRoleTypeId();
-        }
         return super.prepareView(experiment);
     }
 
-    private void setMaxExperimentRoleTypeId() {
+    private void initializeRoleTypes() {
         List<RoleType> roleTypesList = roleTypeFacade.findAll();
         for (RoleType roleType : roleTypesList) {
             if (!roleType.isIsSystemRole()) {
@@ -263,6 +266,7 @@ public class ExperimentController extends CrudEntityController<Experiment, Exper
             }
         }
         maxExperimentRoleTypeId++;
+        initialized = true;
     }
 
     @Override
@@ -341,8 +345,8 @@ public class ExperimentController extends CrudEntityController<Experiment, Exper
         
     public void updateRemovedExperimentRoles() {
         UserExperimentRole userExperimentRole;
-        for (UserInfo user : experimentUsers.keySet()) {
-            ExperimentUser experimentUser = experimentUsers.get(user);
+        for (UserInfo user : experimentUsers.firstKeySet()) {
+            ExperimentUser experimentUser = experimentUsers.getByFirstKey(user);
             for (RoleType roleType : experimentRoles.values()) {
                 int roleId = roleType.getId();
                 if ((!experimentUser.userRoles[roleId]) && (user.inRole(roleId, experimentUser.experimentId))) {
@@ -358,9 +362,9 @@ public class ExperimentController extends CrudEntityController<Experiment, Exper
     @Override
     public String update() {
         boolean updated;
-        for (UserInfo user : experimentUsers.keySet()) {
+        for (UserInfo user : experimentUsers.firstKeySet()) {
             updated = false;
-            ExperimentUser experimentUser = experimentUsers.get(user);
+            ExperimentUser experimentUser = experimentUsers.getByFirstKey(user);
             for (RoleType roleType : experimentRoles.values()) {
                 if (!roleType.isIsSystemRole()) {
                     int roleId = roleType.getId();
@@ -416,8 +420,8 @@ public class ExperimentController extends CrudEntityController<Experiment, Exper
     }
     
     private UserInfo findUserInExperiment(ExperimentUser experimentUser) {
-        for (UserInfo user : experimentUsers.keySet()) {
-            if (experimentUsers.get(user).equals(experimentUser)) {
+        for (UserInfo user : experimentUsers.firstKeySet()) {
+            if (experimentUsers.getByFirstKey(user).equals(experimentUser)) {
                 return user;
             }
         }
@@ -448,7 +452,42 @@ public class ExperimentController extends CrudEntityController<Experiment, Exper
             }
         }
     }
-
+    
+    public boolean canEditExperiment(int userId, int experimentId) {
+        if (!initialized) {
+            initializeRoleTypes();
+        }
+        // user that is Manager or PI can edit experiment
+        int managerRoleId = experimentRoles.get(RoleTypeName.MANAGER).getId();
+        int piRoleId = experimentRoles.get(RoleTypeName.PI).getId();
+        return ((userExperimentRoleFacade.findByUserExperimentRole(userId, experimentId, managerRoleId) != null) ||
+              (userExperimentRoleFacade.findByUserExperimentRole(userId, experimentId, piRoleId) != null));      
+    }
+    
+    public boolean canDeleteExperiment(int userId, int experimentId) {
+        if (!initialized) {
+            initializeRoleTypes();
+        }
+        // user that is Manager can delete experiment
+        return (userExperimentRoleFacade.findByUserExperimentRole(userId, experimentId, experimentRoles.get(RoleTypeName.MANAGER).getId()) != null);      
+    }
+    
+    public boolean canAddManager(int userId) {
+        ExperimentUser logged = experimentUsers.getBySecondKey(userId);
+        if (logged == null) {
+            return false;
+        }
+        return logged.isIsManager();
+    }
+    
+    public boolean canAddPiAndUser(int userId) {
+        ExperimentUser logged = experimentUsers.getBySecondKey(userId);
+        if (logged == null) {
+            return false;
+        }
+        return logged.isIsManager() || logged.isIsPI();
+    }
+    
     @FacesConverter(forClass = Experiment.class)
     public static class ExperimentControllerConverter implements Converter {
 
diff --git a/src/java/DmWebPortal/src/java/gov/anl/aps/dm/portal/controllers/LoginController.java b/src/java/DmWebPortal/src/java/gov/anl/aps/dm/portal/controllers/LoginController.java
index 9c3d6182..3852c260 100644
--- a/src/java/DmWebPortal/src/java/gov/anl/aps/dm/portal/controllers/LoginController.java
+++ b/src/java/DmWebPortal/src/java/gov/anl/aps/dm/portal/controllers/LoginController.java
@@ -5,6 +5,7 @@
  */
 package gov.anl.aps.dm.portal.controllers;
 
+import gov.anl.aps.dm.portal.constants.RoleTypeName;
 import gov.anl.aps.dm.portal.model.beans.RoleTypeFacade;
 import gov.anl.aps.dm.portal.model.beans.UserInfoFacade;
 import gov.anl.aps.dm.portal.model.entities.RoleType;
@@ -34,10 +35,11 @@ public class LoginController implements Serializable
     private RoleTypeFacade roleTypeFacade;
     
     private String username = null;
+    private int id;
     private String password = null;
     private boolean loggedIn = false;
     private UserInfo user = null;
-    int ADMIN_ROLE_ID = 1;
+    private boolean isAdmin;
 
     private static final Logger logger = Logger.getLogger(LoginController.class.getName());
 
@@ -83,6 +85,10 @@ public class LoginController implements Serializable
         this.username = username;
     }
 
+    public int getUserId() {
+        return id;
+    }
+
     /**
      * Check if user is logged in.
      *
@@ -129,6 +135,8 @@ public class LoginController implements Serializable
 
             loggedIn = true;
             SessionUtility.addInfoMessage("Successful Login", "User " + username + " is logged in.");
+            isAdmin = roleTypeFacade.findByName(RoleTypeName.ADMIN).isAdmin(username);
+            id = user.getId();
             return getLandingPage();
         }
         else {
@@ -178,13 +186,8 @@ public class LoginController implements Serializable
         return "/views/login?faces-redirect=true";
     }
 
-        public boolean hasSystemRole() {
-        RoleType adminRoleType;
-        adminRoleType = roleTypeFacade.findById(ADMIN_ROLE_ID);
-        if (adminRoleType == null) {
-            return false;
-        }
-        return adminRoleType.isAdmin(username);
+        public boolean isAdmin() {
+            return isAdmin;
     }
 
 
diff --git a/src/java/DmWebPortal/src/java/gov/anl/aps/dm/portal/utilities/DoubleKeyMap.java b/src/java/DmWebPortal/src/java/gov/anl/aps/dm/portal/utilities/DoubleKeyMap.java
new file mode 100644
index 00000000..fe225e14
--- /dev/null
+++ b/src/java/DmWebPortal/src/java/gov/anl/aps/dm/portal/utilities/DoubleKeyMap.java
@@ -0,0 +1,58 @@
+/*
+ * To change this license header, choose License Headers in Project Properties.
+ * To change this template file, choose Tools | Templates
+ * and open the template in the editor.
+ */
+
+package gov.anl.aps.dm.portal.utilities;
+
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ *
+ * @author bfrosik
+ * @param <K1>
+ * @param <K2>
+ * @param <E>
+ */
+public class DoubleKeyMap <K1, K2, E> {
+    private final Map<K1, E> map1 = new HashMap<>();
+    private final Map<K2, E> map2 = new HashMap<>();
+    
+    public void put(K1 key1, K2 key2, E value) {
+        map1.put(key1, value);
+        map2.put(key2, value);
+    }
+    
+    public E getByFirstKey(K1 key1) {
+        return map1.get(key1);
+    }
+
+    public E getBySecondKey(K2 key2) {
+        return map2.get(key2);
+    }
+    
+    public void remove(K1 key1, K2 key2) {
+        map1.remove(key1);
+        map2.remove(key2);
+    }
+    
+    public Collection<E> values() {
+        return map1.values();
+    }
+
+    public Collection<K1> firstKeySet() {
+        return map1.keySet();
+    }
+
+    public Collection<K2> secondKeySet() {
+        return map2.keySet();
+    }
+    
+    public void clear() {
+        map1.clear();
+        map2.clear();
+    }
+}
diff --git a/src/java/DmWebPortal/web/views/common/commonListActionButtons.xhtml b/src/java/DmWebPortal/web/views/common/commonListActionButtons.xhtml
index d0e66f9b..3c3cc596 100644
--- a/src/java/DmWebPortal/web/views/common/commonListActionButtons.xhtml
+++ b/src/java/DmWebPortal/web/views/common/commonListActionButtons.xhtml
@@ -10,7 +10,7 @@
     <ui:param name="entityTypeName" value="#{entityController.entityTypeName}"/>
 
     <div class="actionButton">
-        <p:commandButton id="#{entityTypeName}AddButton" action="#{entityController.prepareCreate()}" rendered="#{loginController.loggedIn}" value="Add" alt="Add new #{entityTypeName}" icon="ui-icon-plus">
+        <p:commandButton id="#{entityTypeName}AddButton" action="#{entityController.prepareCreate()}" rendered="#{loginController.admin}" value="Add" alt="Add new #{entityTypeName}" icon="ui-icon-plus">
             <p:tooltip for="#{entityTypeName}AddButton" value="Create new #{entityController.displayEntityTypeName}."/>
         </p:commandButton>
         
diff --git a/src/java/DmWebPortal/web/views/experiment/experimentListDataTable.xhtml b/src/java/DmWebPortal/web/views/experiment/experimentListDataTable.xhtml
index 4893d7d5..30264fa0 100644
--- a/src/java/DmWebPortal/web/views/experiment/experimentListDataTable.xhtml
+++ b/src/java/DmWebPortal/web/views/experiment/experimentListDataTable.xhtml
@@ -58,10 +58,10 @@
                 <p:commandLink action="#{experimentController.prepareView(experimentObject)}" styleClass="ui-icon ui-icon-info" title="View">
 
                 </p:commandLink>
-                <p:commandLink action="#{experimentController.prepareEdit(experimentObject)}" rendered="#{loginController.loggedIn}" styleClass="ui-icon ui-icon-pencil" title="Edit">
+                <p:commandLink action="#{experimentController.prepareEdit(experimentObject)}" rendered="#{loginController.admin or experimentController.canEditExperiment(loginController.userId, experimentObject.id)}" styleClass="ui-icon ui-icon-pencil" title="Edit">
 
                 </p:commandLink>
-                <p:commandLink oncomplete="PF('experimentDestroyDialogWidget').show()" rendered="#{loginController.loggedIn}" styleClass="ui-icon ui-icon-trash" title="Delete" update="@form">
+                <p:commandLink oncomplete="PF('experimentDestroyDialogWidget').show()" rendered="#{loginController.admin or experimentController.canDeleteExperiment(loginController.userId, experimentObject.id)}" styleClass="ui-icon ui-icon-trash" title="Delete" update="@form">
                     <f:setPropertyActionListener value="#{experimentObject}" target="#{experimentController.current}"/>
                 </p:commandLink>
             </div>
diff --git a/src/java/DmWebPortal/web/views/experiment/experimentUsersEditDataTable.xhtml b/src/java/DmWebPortal/web/views/experiment/experimentUsersEditDataTable.xhtml
index 6407d75a..cd6a59f3 100644
--- a/src/java/DmWebPortal/web/views/experiment/experimentUsersEditDataTable.xhtml
+++ b/src/java/DmWebPortal/web/views/experiment/experimentUsersEditDataTable.xhtml
@@ -10,7 +10,9 @@
 
     <ui:include src="experimentUserAddDialog.xhtml" />
 
-    <p:commandButton id="experimentUserAddButton" value="Add" onclick="PF('experimentUserAddDialogWidget').show();" rendered="#{loginController.hasSystemRole()}" icon="ui-icon-plus" >
+    <ui:param name="isAdmin" value="#{loginController.admin}" />
+
+    <p:commandButton id="experimentUserAddButton" value="Add" onclick="PF('experimentUserAddDialogWidget').show();" rendered="true" icon="ui-icon-plus" >
         <p:tooltip for="experimentUserAddButton" value="Add new users." />
     </p:commandButton>
 
@@ -29,7 +31,8 @@
                  widgetVar="experimentUsersEditWidget" 
                  emptyMessage="No users found.">
 
-        <ui:param name="experimentRoles" value="#{experimentUserObject.roles}" />
+        <ui:param name="isManager" value="#{experimentController.canAddManager(loginController.userId)}" />
+        <ui:param name="isPi" value="#{experimentController.canAddPiAndUser(loginController.userId)}" />
 
         <p:column sortBy="#{experimentUserObject.username}" headerText="Username"
                   filterBy="#{experimentUserObject.username}" filterMatchMode="contains" >
@@ -41,24 +44,23 @@
             <h:outputText value="#{experimentUserObject.name}"/>
         </p:column>                  
 
-        <ui:param name="isAdmin" value="#{loginController.hasSystemRole()}" />
         <p:column headerText="Manager">
-            <h:outputText value="" styleClass="ui-icon ui-icon-check" rendered="#{experimentUserObject.isManager} AND #{!isAdmin}" /> 
-            <p:selectBooleanCheckbox value="#{experimentUserObject.isManager}" rendered="#{isAdmin}" immediate="true" />  
+            <h:outputText value="" styleClass="ui-icon ui-icon-check" rendered="#{experimentUserObject.isManager and !isAdmin and !isManager}" /> 
+            <p:selectBooleanCheckbox value="#{experimentUserObject.isManager}" rendered="#{isAdmin or isManager}" immediate="true" />  
         </p:column>
 
         <p:column headerText="Principal Investigator">
-            <h:outputText value="" styleClass="ui-icon ui-icon-check" rendered="#{experimentUserObject.isPI} AND #{!isAdmin}" /> 
-            <p:selectBooleanCheckbox value="#{experimentUserObject.isPI}" rendered="#{isAdmin}" />  
+            <h:outputText value="" styleClass="ui-icon ui-icon-check" rendered="#{experimentUserObject.isPI and !isAdmin and !isPi}" /> 
+            <p:selectBooleanCheckbox value="#{experimentUserObject.isPI}" rendered="#{isAdmin or isPi}" />  
         </p:column>
 
         <p:column headerText="User">
-            <h:outputText value="" styleClass="ui-icon ui-icon-check" rendered="#{experimentUserObject.isUser} AND #{!isAdmin}" /> 
-            <p:selectBooleanCheckbox value="#{experimentUserObject.isUser}" rendered="#{isAdmin}" />  
+            <h:outputText value="" styleClass="ui-icon ui-icon-check" rendered="#{experimentUserObject.isUser and !isAdmin and !isPi}" /> 
+            <p:selectBooleanCheckbox value="#{experimentUserObject.isUser}" rendered="#{isAdmin or isPi}" />  
         </p:column>
 
 
-        <p:column headerText="Actions" rendered="#{isAdmin}">
+        <p:column headerText="Actions" rendered="#{isAdmin or isManager}">
             <div class="actionLink" >
                 <p:commandLink oncomplete="PF('experimentUserRemoveDialogWidget').show()" rendered="true" styleClass="ui-icon ui-icon-trash" title="Remove"  update="@form">
                     <f:setPropertyActionListener value="#{experimentUserObject}" target="#{experimentController.experimentUsersEditTable.currentObject}" />
diff --git a/src/java/DmWebPortal/web/views/experimentType/experimentTypeListDataTable.xhtml b/src/java/DmWebPortal/web/views/experimentType/experimentTypeListDataTable.xhtml
index 48d053aa..626869df 100644
--- a/src/java/DmWebPortal/web/views/experimentType/experimentTypeListDataTable.xhtml
+++ b/src/java/DmWebPortal/web/views/experimentType/experimentTypeListDataTable.xhtml
@@ -40,8 +40,8 @@
         <p:column headerText="Actions" >
             <div class="actionLink">
                 <p:commandLink action="#{experimentTypeController.prepareView(experimentTypeObject)}" styleClass="ui-icon ui-icon-info" title="View"/>
-                <p:commandLink action="#{experimentTypeController.prepareEdit(experimentTypeObject)}" rendered="#{loginController.loggedIn}" styleClass="ui-icon ui-icon-pencil" title="Edit"/>
-                <p:commandLink oncomplete="PF('experimentTypeDestroyDialogWidget').show()" rendered="#{loginController.loggedIn}" styleClass="ui-icon ui-icon-trash" title="Delete" update="@form">
+                <p:commandLink action="#{experimentTypeController.prepareEdit(experimentTypeObject)}" rendered="#{loginController.admin}" styleClass="ui-icon ui-icon-pencil" title="Edit"/>
+                <p:commandLink oncomplete="PF('experimentTypeDestroyDialogWidget').show()" rendered="#{loginController.admin}" styleClass="ui-icon ui-icon-trash" title="Delete" update="@form">
                     <f:setPropertyActionListener value="#{experimentTypeObject}" target="#{experimentTypeController.current}"/>
                 </p:commandLink>
             </div>
diff --git a/src/java/DmWebPortal/web/views/roleType/create.xhtml b/src/java/DmWebPortal/web/views/roleType/create.xhtml
deleted file mode 100644
index 5a30bfce..00000000
--- a/src/java/DmWebPortal/web/views/roleType/create.xhtml
+++ /dev/null
@@ -1,30 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" ?>
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<ui:composition xmlns="http://www.w3.org/1999/xhtml"
-                xmlns:h="http://java.sun.com/jsf/html"
-                xmlns:p="http://primefaces.org/ui"
-                xmlns:f="http://java.sun.com/jsf/core"
-                xmlns:ui="http://xmlns.jcp.org/jsf/facelets"
-                xmlns:c="http://xmlns.jcp.org/jsp/jstl/core"
-                template="../../templates/contentViewTemplate4x3.xhtml">
-
-    <ui:define name="middleCenter">
-        <div class="pageTitle">
-            <h1>Add Role</h1>
-        </div>
-
-        <h:form id="addRoleTypeForm">
-
-            <ui:include src="roleTypeCreatePanelGrid.xhtml"/>
-
-            <p/>
-            <div class="actionButton">
-                <p:commandButton action="#{roleTypeController.create()}" value="Save" alt="Save" icon="ui-icon-check" update="@form"/>
-                <p:commandButton action="#{roleTypeController.prepareList()}" immediate="true" value="Cancel" alt="Cancel" icon="ui-icon-cancel"/>
-            </div>
-        </h:form>
-
-    </ui:define>
-</ui:composition>
-
-
diff --git a/src/java/DmWebPortal/web/views/roleType/list.xhtml b/src/java/DmWebPortal/web/views/roleType/list.xhtml
index 21e32813..73dcee27 100644
--- a/src/java/DmWebPortal/web/views/roleType/list.xhtml
+++ b/src/java/DmWebPortal/web/views/roleType/list.xhtml
@@ -15,14 +15,17 @@
 
         <h:form id="viewRoleTypeListForm">
             <ui:param name="entityController" value="#{roleTypeController}"/>
-            <ui:include src="../common/commonListActionButtons.xhtml"/>
+
+            <div class="actionButton">
+                <p:commandButton id="#{entityTypeName}ResetFiltersButton" action="#{entityController.resetList()}" alt="Clear Filters" icon="ui-icon-refresh" styleClass="actionButtonRight">
+                    <p:tooltip for="#{entityTypeName}ResetFiltersButton" value="Reset list filters."/>
+                </p:commandButton>
+            </div>
 
             <h:panelGroup>  
                 <ui:include src="roleTypeListDataTable.xhtml"/>
             </h:panelGroup>
 
-            <ui:include src="roleTypeDestroyDialog.xhtml"/>
-
         </h:form>
 
     </ui:define>
diff --git a/src/java/DmWebPortal/web/views/roleType/roleTypeDestroyDialog.xhtml b/src/java/DmWebPortal/web/views/roleType/roleTypeDestroyDialog.xhtml
deleted file mode 100644
index 9bb96e2b..00000000
--- a/src/java/DmWebPortal/web/views/roleType/roleTypeDestroyDialog.xhtml
+++ /dev/null
@@ -1,13 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" ?>
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<ui:composition xmlns="http://www.w3.org/1999/xhtml"
-                xmlns:p="http://primefaces.org/ui"
-                xmlns:ui="http://xmlns.jcp.org/jsf/facelets">
-
-    <p:confirmDialog id="roleTypeDestroyDialog" message="Delete role #{roleTypeController.getCurrentEntityInstanceName()}?"
-                     header="Delete RoleType" severity="alert" widgetVar="roleTypeDestroyDialogWidget"
-                     styleClass="dialog">
-        <p:commandButton value="Yes" oncomplete="roleTypeDestroyDialogWidget.hide()" action="#{roleTypeController.destroy()}"/>
-        <p:commandButton value="No" onclick="PF('roleTypeDestroyDialogWidget').hide()" type="button" />
-    </p:confirmDialog>  
-</ui:composition>
diff --git a/src/java/DmWebPortal/web/views/roleType/roleTypeListDataTable.xhtml b/src/java/DmWebPortal/web/views/roleType/roleTypeListDataTable.xhtml
index d4172394..317b4027 100644
--- a/src/java/DmWebPortal/web/views/roleType/roleTypeListDataTable.xhtml
+++ b/src/java/DmWebPortal/web/views/roleType/roleTypeListDataTable.xhtml
@@ -32,23 +32,16 @@
                   filterBy="#{roleTypeObject.description}" filterMatchMode="contains">
             <h:outputText value="#{roleTypeObject.description}"/>
         </p:column>
-        
-        <c:set var="isEntityWriteable" value="#{loginController.loggedIn}"/>
-
 
         <p:column headerText="Actions" >
             <div class="actionLink">
                 <p:commandLink action="#{roleTypeController.prepareView(roleTypeObject)}" styleClass="ui-icon ui-icon-info" title="View"/>
-                <p:commandLink action="#{roleTypeController.prepareEdit(roleTypeObject)}" rendered="#{isEntityWriteable}" styleClass="ui-icon ui-icon-pencil" title="Edit"/>
-                <p:commandLink oncomplete="PF('roleTypeDestroyDialogWidget').show()" rendered="#{loginController.loggedIn}" styleClass="ui-icon ui-icon-trash" title="Delete" update="@form">
-                     <f:setPropertyActionListener value="#{roleTypeObject}" target="#{roleTypeController.current}"/>
-                </p:commandLink>
-
-         <p:commandLink action="#{userSystemRoleController.prepareSystemRoleView()}" rendered="#{roleTypeController.isRoleSystemType(roleTypeObject)}"  styleClass="ui-icon ui-icon-person" title="List All" >
-                   <f:setPropertyActionListener value="#{roleTypeObject}" target="#{userSystemRoleController.systemRole}"/>
+                <p:commandLink action="#{roleTypeController.prepareEdit(roleTypeObject)}" rendered="#{loginController.admin}" styleClass="ui-icon ui-icon-pencil" title="Edit"/>
+                <p:commandLink action="#{userSystemRoleController.prepareSystemRoleView()}" rendered="#{roleTypeController.isRoleSystemType(roleTypeObject)}"  styleClass="ui-icon ui-icon-person" title="List All" >
+                    <f:setPropertyActionListener value="#{roleTypeObject}" target="#{userSystemRoleController.systemRole}"/>
                 </p:commandLink>
-          </div>
+            </div>
         </p:column>
     </p:dataTable>
-    
+
 </ui:composition>
diff --git a/src/java/DmWebPortal/web/views/userInfo/userInfoListDataTable.xhtml b/src/java/DmWebPortal/web/views/userInfo/userInfoListDataTable.xhtml
index 93bb73de..b75e01aa 100644
--- a/src/java/DmWebPortal/web/views/userInfo/userInfoListDataTable.xhtml
+++ b/src/java/DmWebPortal/web/views/userInfo/userInfoListDataTable.xhtml
@@ -55,8 +55,8 @@
         <p:column headerText="Actions" >
             <div class="actionLink">
                 <p:commandLink action="#{userInfoController.prepareView(userInfoObject)}" styleClass="ui-icon ui-icon-info" title="View"/>
-                <p:commandLink action="#{userInfoController.prepareEdit(userInfoObject)}" rendered="#{loginController.isUserWriteable(userInfoObject)}" styleClass="ui-icon ui-icon-pencil" title="Edit"/>
-                <p:commandLink oncomplete="PF('userInfoDestroyDialogWidget').show()" rendered="#{loginController.loggedIn}" styleClass="ui-icon ui-icon-trash" title="Delete" update="@form">
+                <p:commandLink action="#{userInfoController.prepareEdit(userInfoObject)}" rendered="#{loginController.admin}" styleClass="ui-icon ui-icon-pencil" title="Edit"/>
+                <p:commandLink oncomplete="PF('userInfoDestroyDialogWidget').show()" rendered="#{loginController.admin}" styleClass="ui-icon ui-icon-trash" title="Delete" update="@form">
                     <f:setPropertyActionListener value="#{userInfoObject}" target="#{userInfoController.current}"/>
                 </p:commandLink>
             </div>
diff --git a/src/java/DmWebPortal/web/views/userSystemRole/list.xhtml b/src/java/DmWebPortal/web/views/userSystemRole/list.xhtml
index 24c87376..f23059ab 100644
--- a/src/java/DmWebPortal/web/views/userSystemRole/list.xhtml
+++ b/src/java/DmWebPortal/web/views/userSystemRole/list.xhtml
@@ -16,7 +16,7 @@
         <h:form id="adminListForm">
             <div class="actionButton">
 
-                <p:commandButton id="systemRoleAddButton" value="Add" onclick="PF('systemRoleAddDialogWidget').show();" rendered="#{loginController.hasSystemRole()}" icon="ui-icon-plus" >
+                <p:commandButton id="systemRoleAddButton" value="Add" onclick="PF('systemRoleAddDialogWidget').show();" rendered="#{loginController.admin}" icon="ui-icon-plus" >
                     <p:tooltip for="systemRoleAddButton" value="Add new Administrators."/>
                 </p:commandButton>
                 
diff --git a/src/java/DmWebPortal/web/views/userSystemRole/systemRoleListDataTable.xhtml b/src/java/DmWebPortal/web/views/userSystemRole/systemRoleListDataTable.xhtml
index 9dc1610a..1312040b 100644
--- a/src/java/DmWebPortal/web/views/userSystemRole/systemRoleListDataTable.xhtml
+++ b/src/java/DmWebPortal/web/views/userSystemRole/systemRoleListDataTable.xhtml
@@ -46,7 +46,7 @@
 
         <p:column headerText="Actions" >
             <div class="actionLink" >
-            <p:commandLink oncomplete="PF('systemRoleRemoveDialogWidget').show()" rendered="#{loginController.hasSystemRole() and (loginController.username != systemUserObject.username)}" styleClass="ui-icon ui-icon-trash" title="Remove" update="@form" >
+            <p:commandLink oncomplete="PF('systemRoleRemoveDialogWidget').show()" rendered="#{loginController.admin and (loginController.username != systemUserObject.username)}" styleClass="ui-icon ui-icon-trash" title="Remove" update="@form" >
                     <f:setPropertyActionListener value="#{systemUserObject}" target="#{userSystemRoleController.systemRoleTable.currentObject}" />
             </p:commandLink>
             </div>
-- 
GitLab