From d4d1370330d17c30b5083b5014d40909a72f1096 Mon Sep 17 00:00:00 2001
From: "Barbara B. Frosik" <bfrosik@aps.anl.gov>
Date: Wed, 4 Feb 2015 19:21:49 +0000
Subject: [PATCH]

---
 .../controllers/ExperimentController.java     |   7 +-
 .../controllers/UserInfoController.java       | 163 +++++++++++++++++-
 .../dm/portal/model/beans/RoleTypeFacade.java |  10 --
 .../dm/portal/model/beans/UserInfoFacade.java |  11 ++
 .../dm/portal/model/entities/RoleType.java    |   3 +-
 .../dm/portal/model/entities/UserInfo.java    |   3 +-
 .../web/views/experiment/view.xhtml           |   2 +-
 .../web/views/experimentType/view.xhtml       |   4 +-
 .../DmWebPortal/web/views/roleType/view.xhtml |  10 +-
 .../userExperimentsListDataTable.xhtml        |  49 ++++++
 .../DmWebPortal/web/views/userInfo/view.xhtml |  31 ++--
 11 files changed, 251 insertions(+), 42 deletions(-)
 create mode 100644 src/java/DmWebPortal/web/views/userInfo/userExperimentsListDataTable.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 d8861e22..881eb054 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
@@ -18,6 +18,7 @@ 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.Collection;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
@@ -59,7 +60,7 @@ public class ExperimentController extends CrudEntityController<Experiment, Exper
         private final boolean[] userRoles;
 
         public ExperimentUser(int experimentId, int userId) {
-            userRoles = new boolean[maxExperimentRoleTypeId];
+            userRoles = new boolean[maxExperimentRoleTypeId + 1];
             this.experimentId = experimentId;
             this.userId = userId;
         }
@@ -155,7 +156,8 @@ public class ExperimentController extends CrudEntityController<Experiment, Exper
                 initializeRoleTypes();
             }
             logger.debug("converting ExperimentUser ");
-            List<RoleType> roleTypes = roleTypeFacade.findByRoleSystemType(false);
+            Collection<RoleType> roleTypes;
+            roleTypes = experimentRoles.values();
             ExperimentUser experimentUser;
             for (UserInfo user : list) {
                 if ((experimentUser = experimentUsers.getByFirstKey(user)) == null) {
@@ -265,7 +267,6 @@ public class ExperimentController extends CrudEntityController<Experiment, Exper
                 }
             }
         }
-        maxExperimentRoleTypeId++;
         initialized = true;
     }
 
diff --git a/src/java/DmWebPortal/src/java/gov/anl/aps/dm/portal/controllers/UserInfoController.java b/src/java/DmWebPortal/src/java/gov/anl/aps/dm/portal/controllers/UserInfoController.java
index 809ae1f4..c1a4c8f5 100644
--- a/src/java/DmWebPortal/src/java/gov/anl/aps/dm/portal/controllers/UserInfoController.java
+++ b/src/java/DmWebPortal/src/java/gov/anl/aps/dm/portal/controllers/UserInfoController.java
@@ -1,13 +1,22 @@
 package gov.anl.aps.dm.portal.controllers;
 
+import gov.anl.aps.dm.portal.constants.RoleTypeName;
 import gov.anl.aps.dm.portal.exceptions.DmPortalException;
 import gov.anl.aps.dm.portal.exceptions.MissingProperty;
 import gov.anl.aps.dm.portal.exceptions.ObjectAlreadyExists;
+import gov.anl.aps.dm.portal.model.beans.RoleTypeFacade;
 import gov.anl.aps.dm.portal.model.entities.UserInfo;
 import gov.anl.aps.dm.portal.model.beans.UserInfoFacade;
+import gov.anl.aps.dm.portal.model.entities.CloneableEntity;
+import gov.anl.aps.dm.portal.model.entities.Experiment;
+import gov.anl.aps.dm.portal.model.entities.RoleType;
 import gov.anl.aps.dm.portal.utilities.SessionUtility;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.HashMap;
 
 import java.util.List;
+import java.util.Map;
 import javax.ejb.EJB;
 import javax.enterprise.context.SessionScoped;
 import javax.faces.component.UIComponent;
@@ -19,19 +28,161 @@ import org.apache.log4j.Logger;
 
 @Named("userInfoController")
 @SessionScoped
-public class UserInfoController extends CrudEntityController<UserInfo, UserInfoFacade>
-{
+public class UserInfoController extends CrudEntityController<UserInfo, UserInfoFacade> {
 
     private static final Logger logger = Logger.getLogger(UserInfoController.class.getName());
 
     @EJB
     private UserInfoFacade userInfoFacade;
 
+    @EJB
+    private RoleTypeFacade roleTypeFacade;
+
     private String passwordEntry = null;
-    
+
+    public class ExperimentUser extends CloneableEntity {
+
+        String experimentName;
+        String description;
+        int userId;
+        int experimentId;
+        private final boolean[] userRoles;
+
+        public ExperimentUser(int experimentId, int userId) {
+            userRoles = new boolean[maxExperimentRoleTypeId + 1];
+            this.experimentId = experimentId;
+            this.userId = userId;
+        }
+
+        void setExperimentName(String experimentName) {
+            this.experimentName = experimentName;
+        }
+
+        void setDescription(String description) {
+            this.description = description;
+        }
+
+        public String getExperimentName() {
+            return experimentName;
+        }
+
+        public String getDescription() {
+            return description;
+        }
+
+        public boolean isIsManager() {
+            return userRoles[experimentRoles.get(RoleTypeName.MANAGER).getId()];
+        }
+
+        public boolean isIsPI() {
+            return userRoles[experimentRoles.get(RoleTypeName.PI).getId()];
+        }
+
+        public boolean isIsUser() {
+            return userRoles[experimentRoles.get(RoleTypeName.USER).getId()];
+        }
+
+        public void setIsInRole(RoleType role, boolean isInRole) {
+            userRoles[role.getId()] = isInRole;
+        }
+
+        public boolean[] getRoles() {
+            return userRoles;
+        }
+
+        @Override
+        public int hashCode() {
+            return userId + experimentId * 100;
+        }
+
+        @Override
+        public boolean equals(Object object) {
+            // TODO: Warning - this method won't work in the case the id fields are not set
+            if (!(object instanceof ExperimentUser)) {
+                return false;
+            }
+            return ((userId == ((ExperimentUser) object).userId) && (experimentId == ((ExperimentUser) object).experimentId));
+        }
+    }
+
+    class UserExperimentsTable extends DataTableController<ExperimentUser> {
+
+        @Override
+        public String getClassName() {
+            return "UserExperiments";
+        }
+
+        @Override
+        public List<ExperimentUser> findAll() {
+            List<Experiment> list = userInfoFacade.findExperimentsInUser(getCurrent().getId());
+            return convertUserExperiments(list);
+        }
+
+        List<ExperimentUser> convertUserExperiments(List<Experiment> list) {
+            if (!initialized) {
+                initializeRoleTypes();
+            }
+            logger.debug("converting UserExperiments ");
+            Collection<RoleType> roleTypes;
+            roleTypes = experimentRoles.values();
+            ExperimentUser experimentUser;
+            for (Experiment experiment : list) {
+                if ((experimentUser = userExperiments.get(experiment.getId())) == null) {
+                    experimentUser = new ExperimentUser(experiment.getId(), getCurrent().getId());
+                    experimentUser.setExperimentName(experiment.getName());
+                    experimentUser.setDescription(experiment.getDescription());
+                    userExperiments.put(experiment.getId(), experimentUser);
+                }
+                for (RoleType roleType : roleTypes) {
+                    boolean inRole = getCurrent().inRole(roleType.getId(), experiment.getId());
+                    experimentUser.setIsInRole(roleType, inRole);
+                }
+            }
+            return new ArrayList<>(userExperiments.values());
+        }
+
+        @Override
+        public String getTableName() {
+            return "UserExperimentsTable";
+        }
+    }
+
+    private UserInfoController.UserExperimentsTable userExperimentsListTable = new UserInfoController.UserExperimentsTable();
+
+    private final Map<Integer, ExperimentUser> userExperiments = new HashMap<>();
+    private final Map<String, RoleType> experimentRoles = new HashMap<>();
+    int maxExperimentRoleTypeId;
+    boolean initialized = false;
+
     public UserInfoController() {
     }
 
+    private void initializeRoleTypes() {
+        List<RoleType> roleTypesList = roleTypeFacade.findAll();
+        for (RoleType roleType : roleTypesList) {
+            if (!roleType.isIsSystemRole()) {
+                experimentRoles.put(roleType.getName(), roleType);
+                if (roleType.getId() > maxExperimentRoleTypeId) {
+                    maxExperimentRoleTypeId = roleType.getId();
+                }
+            }
+        }
+        initialized = true;
+    }
+    
+    public void clear() {
+        userExperimentsListTable.resetList();
+        userExperimentsListTable.resetFilterList();
+    }
+
+    public UserExperimentsTable getUserExperimentsListTable() {
+        return userExperimentsListTable;
+    }
+
+    public void setUserExperimentsListTable(UserExperimentsTable userExperimentsListTable) {
+        this.userExperimentsListTable = userExperimentsListTable;
+    }
+    
     @Override
     protected UserInfoFacade getFacade() {
         return userInfoFacade;
@@ -75,6 +226,12 @@ public class UserInfoController extends CrudEntityController<UserInfo, UserInfoF
         }
         logger.debug("Inserting new user " + user.getUsername());
     }
+    
+    @Override
+    public String update() {
+        clear();
+        return super.update();
+    }
 
     private void verifyMandatoryParam(UserInfo user) throws MissingProperty {
         int missing = 0;
diff --git a/src/java/DmWebPortal/src/java/gov/anl/aps/dm/portal/model/beans/RoleTypeFacade.java b/src/java/DmWebPortal/src/java/gov/anl/aps/dm/portal/model/beans/RoleTypeFacade.java
index f51b1bf6..1ccb9885 100644
--- a/src/java/DmWebPortal/src/java/gov/anl/aps/dm/portal/model/beans/RoleTypeFacade.java
+++ b/src/java/DmWebPortal/src/java/gov/anl/aps/dm/portal/model/beans/RoleTypeFacade.java
@@ -56,14 +56,4 @@ public class RoleTypeFacade extends AbstractFacade<RoleType>
         return findByName(name) != null;
     }
 
-    public List<RoleType> findByRoleSystemType(boolean systemType) {
-        try {
-            return (List<RoleType>) em.createNamedQuery("RoleType.findByRoleSystemType")
-                    .setParameter("systemType", systemType)
-                    .getResultList();
-        } catch (NoResultException ex) {
-        }
-        return null;
-    }
-
 }
diff --git a/src/java/DmWebPortal/src/java/gov/anl/aps/dm/portal/model/beans/UserInfoFacade.java b/src/java/DmWebPortal/src/java/gov/anl/aps/dm/portal/model/beans/UserInfoFacade.java
index 91f0a1f4..57ec1bcb 100644
--- a/src/java/DmWebPortal/src/java/gov/anl/aps/dm/portal/model/beans/UserInfoFacade.java
+++ b/src/java/DmWebPortal/src/java/gov/anl/aps/dm/portal/model/beans/UserInfoFacade.java
@@ -5,6 +5,7 @@
  */
 package gov.anl.aps.dm.portal.model.beans;
 
+import gov.anl.aps.dm.portal.model.entities.Experiment;
 import gov.anl.aps.dm.portal.model.entities.UserInfo;
 import java.util.List;
 import javax.ejb.Stateless;
@@ -89,4 +90,14 @@ public class UserInfoFacade extends AbstractFacade<UserInfo>
         return null;
     }
 
+    public List<Experiment> findExperimentsInUser(int userId) {
+        try {
+            return (List<Experiment>) em.createNamedQuery("UserInfo.findExperimentsInUser")
+                    .setParameter("userId", userId)
+                    .getResultList();
+        } catch (NoResultException ex) {
+        }
+        return null;
+    }
+
 }
diff --git a/src/java/DmWebPortal/src/java/gov/anl/aps/dm/portal/model/entities/RoleType.java b/src/java/DmWebPortal/src/java/gov/anl/aps/dm/portal/model/entities/RoleType.java
index 37ff5fdd..c0fed6b2 100644
--- a/src/java/DmWebPortal/src/java/gov/anl/aps/dm/portal/model/entities/RoleType.java
+++ b/src/java/DmWebPortal/src/java/gov/anl/aps/dm/portal/model/entities/RoleType.java
@@ -38,8 +38,7 @@ import javax.xml.bind.annotation.XmlTransient;
     @NamedQuery(name = "RoleType.findAll", query = "SELECT r FROM RoleType r"),
     @NamedQuery(name = "RoleType.findById", query = "SELECT r FROM RoleType r WHERE r.id = :id"),
     @NamedQuery(name = "RoleType.findByName", query = "SELECT r FROM RoleType r WHERE r.name = :name"),
-    @NamedQuery(name = "RoleType.findByDescription", query = "SELECT r FROM RoleType r WHERE r.description = :description"),
-    @NamedQuery(name = "RoleType.findByRoleSystemType", query = "SELECT r FROM RoleType r WHERE r.isSystemRole = :systemType")})
+    @NamedQuery(name = "RoleType.findByDescription", query = "SELECT r FROM RoleType r WHERE r.description = :description")})
 
 public class RoleType extends CloneableEntity
 {
diff --git a/src/java/DmWebPortal/src/java/gov/anl/aps/dm/portal/model/entities/UserInfo.java b/src/java/DmWebPortal/src/java/gov/anl/aps/dm/portal/model/entities/UserInfo.java
index 5f315316..8c7ea57e 100644
--- a/src/java/DmWebPortal/src/java/gov/anl/aps/dm/portal/model/entities/UserInfo.java
+++ b/src/java/DmWebPortal/src/java/gov/anl/aps/dm/portal/model/entities/UserInfo.java
@@ -44,7 +44,8 @@ import javax.xml.bind.annotation.XmlTransient;
     @NamedQuery(name = "UserInfo.findNonAdmins", query = "SELECT u FROM UserInfo u WHERE u.id NOT IN (SELECT u2.id from UserInfo u2 JOIN u2.roleTypeList rt WHERE rt.id = :roleTypeId)"),
     @NamedQuery(name = "UserInfo.findUsersInRole", query = "SELECT u FROM UserInfo u WHERE u.id IN (SELECT u2.id from UserInfo u2 JOIN u2.roleTypeList rt WHERE rt.id = :roleTypeId)"),
     @NamedQuery(name = "UserInfo.findUsersInExperiment", query = "SELECT DISTINCT u FROM UserInfo u WHERE u.id IN (SELECT u2.id from UserInfo u2 JOIN u2.userExperimentRoleList r WHERE r.experiment.id = :experimentId)"),
-    @NamedQuery(name = "UserInfo.findNoUsersInExperiment", query = "SELECT u FROM UserInfo u WHERE u.id NOT IN (SELECT u2.id from UserInfo u2 JOIN u2.userExperimentRoleList r WHERE r.experiment.id = :experimentId)")})
+    @NamedQuery(name = "UserInfo.findNoUsersInExperiment", query = "SELECT u FROM UserInfo u WHERE u.id NOT IN (SELECT u2.id from UserInfo u2 JOIN u2.userExperimentRoleList r WHERE r.experiment.id = :experimentId)"),
+    @NamedQuery(name = "UserInfo.findExperimentsInUser", query = "SELECT DISTINCT e FROM Experiment e WHERE e.id IN (SELECT e2.id from Experiment e2 JOIN e2.userExperimentRoleList r WHERE r.userInfo.id = :userId)")})
 
 public class UserInfo extends CloneableEntity
 {
diff --git a/src/java/DmWebPortal/web/views/experiment/view.xhtml b/src/java/DmWebPortal/web/views/experiment/view.xhtml
index 43b5d3b6..e8582377 100644
--- a/src/java/DmWebPortal/web/views/experiment/view.xhtml
+++ b/src/java/DmWebPortal/web/views/experiment/view.xhtml
@@ -30,7 +30,7 @@
             <p/>
 
             <div class="actionButton">
-                <p:commandButton action="#{experimentController.prepareEdit(experimentObject)}" rendered="#{loginController.loggedIn}" value="Edit" alt="Edit" icon="ui-icon-pencil"/>
+                <p:commandButton action="#{experimentController.prepareEdit(experimentObject)}" rendered="#{loginController.admin or experimentController.canEditExperiment(loginController.userId, experimentObject.id)}" value="Edit" alt="Edit" icon="ui-icon-pencil"/>
                 <p:commandButton action="#{experimentController.prepareList()}" value="Return" alt="Return" icon="ui-icon-arrowreturnthick-1-w"/>
             </div>
 
diff --git a/src/java/DmWebPortal/web/views/experimentType/view.xhtml b/src/java/DmWebPortal/web/views/experimentType/view.xhtml
index 97c2745f..afe75501 100644
--- a/src/java/DmWebPortal/web/views/experimentType/view.xhtml
+++ b/src/java/DmWebPortal/web/views/experimentType/view.xhtml
@@ -21,8 +21,8 @@
                 <p/>
                 <ui:param name="experimentTypeObject" value="#{experimentTypeController.selected}"/>
                 <div class="actionButton">
-                    <p:commandButton action="#{experimentTypeController.prepareEdit(experimentTypeObject)}" rendered="#{loginController.loggedIn}" value="Edit" alt="Edit" icon="ui-icon-pencil"/>
-                    <p:commandButton onclick="PF('experimentTypeDestroyDialogWidget').show();" rendered="#{loginController.loggedIn}" value="Delete" alt="Delete" icon="ui-icon-trash">
+                    <p:commandButton action="#{experimentTypeController.prepareEdit(experimentTypeObject)}" rendered="#{loginController.admin}" value="Edit" alt="Edit" icon="ui-icon-pencil"/>
+                    <p:commandButton onclick="PF('experimentTypeDestroyDialogWidget').show();" rendered="#{loginController.admin}" value="Delete" alt="Delete" icon="ui-icon-trash">
                         <f:setPropertyActionListener value="#{experimentTypeObject}" target="#{experimentTypeController.current}"/>
                     </p:commandButton>  
                     <p:commandButton action="#{experimentTypeController.prepareList()}" value="Return" alt="Return" icon="ui-icon-arrowreturnthick-1-w"/>
diff --git a/src/java/DmWebPortal/web/views/roleType/view.xhtml b/src/java/DmWebPortal/web/views/roleType/view.xhtml
index 417c6ea1..e3b1491e 100644
--- a/src/java/DmWebPortal/web/views/roleType/view.xhtml
+++ b/src/java/DmWebPortal/web/views/roleType/view.xhtml
@@ -22,15 +22,9 @@
                 <ui:param name="roleTypeObject" value="#{roleTypeController.selected}"/>
                 <ui:param name="isEntityWriteable" value="#{loginController.loggedIn}"/>
                 <div class="actionButton">
-                    <p:commandButton action="#{roleTypeController.prepareEdit(roleTypeObject)}" rendered="#{isEntityWriteable}" value="Edit" alt="Edit" icon="ui-icon-pencil"/>
-                    <p:commandButton onclick="PF('roleTypeDestroyDialogWidget').show();" rendered="#{loginController.loggedIn}" value="Delete" alt="Delete" icon="ui-icon-trash">
-                        <f:setPropertyActionListener value="#{roleTypeObject}" target="#{roleTypeController.current}"/>
-                    </p:commandButton>  
+                    <p:commandButton action="#{roleTypeController.prepareEdit(roleTypeObject)}" rendered="#{loginController.admin}" value="Edit" alt="Edit" icon="ui-icon-pencil"/>
                     <p:commandButton action="#{roleTypeController.prepareList()}" value="Return" alt="Return" icon="ui-icon-arrowreturnthick-1-w"/>
-                </div>
-
-                <ui:include src="roleTypeDestroyDialog.xhtml"/>
-                
+                </div>          
             </div>
 
         </h:form>
diff --git a/src/java/DmWebPortal/web/views/userInfo/userExperimentsListDataTable.xhtml b/src/java/DmWebPortal/web/views/userInfo/userExperimentsListDataTable.xhtml
new file mode 100644
index 00000000..2df53a70
--- /dev/null
+++ b/src/java/DmWebPortal/web/views/userInfo/userExperimentsListDataTable.xhtml
@@ -0,0 +1,49 @@
+<?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:ui="http://xmlns.jcp.org/jsf/facelets">
+
+    <p:commandButton id="ResetFiltersButton" action="#{userInfoController.userExperimentsListTable.resetList()}" alt="Clear Filters" icon="ui-icon-refresh" styleClass="actionButtonRight" oncomplete="PF('userExperimentsListWidget').clearFilters()" update="userExperimentsListDataTable">
+        <p:tooltip for="ResetFiltersButton" value="Reset filters."/>
+    </p:commandButton>
+
+    <p:dataTable id="userExperimentsListDataTable"                              
+                 var="userExperimentObject" 
+                 value="#{userInfoController.userExperimentsListTable.listDataModel}" 
+                 filteredValue="#{userInfoController.userExperimentsListTable.filteredObjectList}"
+                 paginator="true" 
+                 paginatorAlwaysVisible="false" 
+                 rows="25"
+                 binding="#{userInfoController.userExperimentsListTable.listDataTable}"
+                 widgetVar="userExperimentsListWidget" 
+                 emptyMessage="No users found.">
+
+        <p:column sortBy="#{userExperimentObject.experimentName}" headerText="Experiment Name"
+                  filterBy="#{userExperimentObject.experimentName}" filterMatchMode="contains" >
+            <h:outputText value="#{userExperimentObject.experimentName}"/>
+        </p:column>
+
+        <p:column sortBy="#{userExperimentObject.description}" headerText="Description" 
+                  filterBy="#{userExperimentObject.description}" filterMatchMode="contains" >
+            <h:outputText value="#{userExperimentObject.description}"/>
+        </p:column>                  
+
+
+        <p:column headerText="Manager">
+            <h:outputText value="" styleClass="ui-icon ui-icon-check" rendered="#{userExperimentObject.isManager}" /> 
+        </p:column>
+
+        <p:column headerText="Principal Investigator">
+            <h:outputText value="" styleClass="ui-icon ui-icon-check" rendered="#{userExperimentObject.isPI}" />  
+        </p:column>
+
+        <p:column headerText="User">
+            <h:outputText value="" styleClass="ui-icon ui-icon-check" rendered="#{userExperimentObject.isUser}" />   
+        </p:column>
+
+
+    </p:dataTable>
+
+</ui:composition>
diff --git a/src/java/DmWebPortal/web/views/userInfo/view.xhtml b/src/java/DmWebPortal/web/views/userInfo/view.xhtml
index aefe56d1..50f39a1e 100644
--- a/src/java/DmWebPortal/web/views/userInfo/view.xhtml
+++ b/src/java/DmWebPortal/web/views/userInfo/view.xhtml
@@ -10,19 +10,28 @@
 
     <ui:define name="middleCenter">
         <h:form id="viewUserInfoForm">
+            <div class="pageTitle">
+                <h1>User Details</h1>
+            </div>
 
-            <div class="middleCenterLeftContent">
-                <div class="pageTitle">
-                    <h1>User Details</h1>
-                </div>
+            <ui:param name="userInfoObject" value="#{userInfoController.current}"/>
+            <p:accordionPanel multiple="true" activeIndex="0,1" >
+                <p:tab title="User Properties">
+                    <div class="middleCenterLeftContent">
+                        <ui:include src="userInfoViewPanelGrid.xhtml"/>
+                    </div>
+                </p:tab>
 
-                <ui:include src="userInfoViewPanelGrid.xhtml"/>
+                <p:tab title="User Experiments">                
+                    <ui:include src="userExperimentsListDataTable.xhtml"/>
+                </p:tab>
+            </p:accordionPanel>
+
+            <p/>
 
-                <p/>
-                <ui:param name="userInfoObject" value="#{userInfoController.selected}"/>
                 <div class="actionButton">
-                    <p:commandButton action="#{userInfoController.prepareEdit(userInfoObject)}" rendered="#{loginController.isUserWriteable(userInfoObject)}" value="Edit" alt="Edit" icon="ui-icon-pencil"/>
-                    <p:commandButton onclick="PF('userInfoDestroyDialogWidget').show();" rendered="#{loginController.loggedIn}" value="Delete" alt="Delete" icon="ui-icon-trash">
+                    <p:commandButton action="#{userInfoController.prepareEdit(userInfoObject)}" rendered="#{loginController.admin}" value="Edit" alt="Edit" icon="ui-icon-pencil"/>
+                    <p:commandButton onclick="PF('userInfoDestroyDialogWidget').show();" rendered="#{loginController.admin}" value="Delete" alt="Delete" icon="ui-icon-trash">
                         <f:setPropertyActionListener value="#{userInfoObject}" target="#{userInfoController.current}"/>
                     </p:commandButton>  
                     <p:commandButton action="#{userInfoController.prepareList()}" value="Return" alt="Return" icon="ui-icon-arrowreturnthick-1-w"/>
@@ -30,12 +39,10 @@
 
                 <ui:include src="userInfoDestroyDialog.xhtml"/>
 
-            </div>
-
         </h:form>
-
     </ui:define>
 
+
 </ui:composition>
 
 
-- 
GitLab