diff --git a/Kieker.WebGUI/src/main/java/kieker/webgui/beans/view/CurrentUserManagementBean.java b/Kieker.WebGUI/src/main/java/kieker/webgui/beans/view/CurrentUserManagementBean.java index debcf5897634b10cf767819168f97d463767271d..fa2beaf1b00644dc2de34ddabe39880893f3bf5f 100644 --- a/Kieker.WebGUI/src/main/java/kieker/webgui/beans/view/CurrentUserManagementBean.java +++ b/Kieker.WebGUI/src/main/java/kieker/webgui/beans/view/CurrentUserManagementBean.java @@ -24,21 +24,6 @@ import org.springframework.beans.factory.annotation.Autowired; import kieker.webgui.common.IUserManagerFacade; import kieker.webgui.common.Role; import kieker.webgui.common.User; -/*************************************************************************** - * Copyright 2012 Kieker Project (http://kieker-monitoring.net) - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - ***************************************************************************/ /** * @author Nils Christian Ehmke @@ -65,6 +50,8 @@ public final class CurrentUserManagementBean { public void addUser(final String username, final String password, final List<Role> roles) { this.userManagerFacade.addUser(username, password, roles); + // TODO Check that the op was successful before adding the user to our list + this.users.add(new User(username, roles, true)); } public void removeUser(final String username) { diff --git a/Kieker.WebGUI/src/main/java/kieker/webgui/common/User.java b/Kieker.WebGUI/src/main/java/kieker/webgui/common/User.java index 0b98752e66f31c779910f38ac42b2e0421841b17..784eaf26d3a0c875e8a42af2952ad7b6305c571f 100644 --- a/Kieker.WebGUI/src/main/java/kieker/webgui/common/User.java +++ b/Kieker.WebGUI/src/main/java/kieker/webgui/common/User.java @@ -22,10 +22,12 @@ public class User { private final String name; private final List<Role> roles; + private final boolean enabled; - public User(final String name, final List<Role> roles) { + public User(final String name, final List<Role> roles, final boolean enabled) { this.name = name; this.roles = roles; + this.enabled = enabled; } public String getName() { @@ -36,4 +38,9 @@ public class User { return this.roles; } + public boolean isEnabled() { + return enabled; + } + + } diff --git a/Kieker.WebGUI/src/main/java/kieker/webgui/common/impl/UserManagerFacadeImpl.java b/Kieker.WebGUI/src/main/java/kieker/webgui/common/impl/UserManagerFacadeImpl.java index 34c3d71ebb03e51ab45140dec1d27dcc705978b1..7e744a2235c3cfa4da4d1b05f8bc7665325bd017 100644 --- a/Kieker.WebGUI/src/main/java/kieker/webgui/common/impl/UserManagerFacadeImpl.java +++ b/Kieker.WebGUI/src/main/java/kieker/webgui/common/impl/UserManagerFacadeImpl.java @@ -103,6 +103,7 @@ public class UserManagerFacadeImpl implements IUserManagerFacade { @Override @PreAuthorize("hasRole('ROLE_ADMIN')") public List<User> getUsers() { + // FIXME Users without roles final List<User> result = new ArrayList<User>(); ResultSet queryResult = null; @@ -110,7 +111,7 @@ public class UserManagerFacadeImpl implements IUserManagerFacade { final Map<String, User> tempMap = new TreeMap<String, User>(); final PreparedStatement getQuery = this.connection - .prepareStatement("select u.name, ur.role from KIEKERUser u, Userroles ur where u.name=ur.name"); + .prepareStatement("select u.name, ur.role, u.enabled from KIEKERUser u, Userroles ur where u.name=ur.name"); // Run through all results queryResult = getQuery.executeQuery(); @@ -119,6 +120,7 @@ public class UserManagerFacadeImpl implements IUserManagerFacade { final String username = queryResult.getString(1); final int roleID = queryResult.getInt(2); final Role role = Role.fromID(roleID); + final boolean enabled = queryResult.getBoolean(3); // If the user doesn't exist in our map yet, add him. // In each case we add the role to the user @@ -127,7 +129,7 @@ public class UserManagerFacadeImpl implements IUserManagerFacade { } else { final List<Role> roles = new ArrayList<Role>(); roles.add(role); - tempMap.put(username, new User(username, roles)); + tempMap.put(username, new User(username, roles, enabled)); } } diff --git a/Kieker.WebGUI/src/main/resources/lang/UserManagementPage_de.properties b/Kieker.WebGUI/src/main/resources/lang/UserManagementPage_de.properties new file mode 100644 index 0000000000000000000000000000000000000000..f5aadf0cfd9875f716c087addc7eaa2e9844c1a2 --- /dev/null +++ b/Kieker.WebGUI/src/main/resources/lang/UserManagementPage_de.properties @@ -0,0 +1,19 @@ +#------------------------------------------------------------------------------ +# +# Diese Datei beinhaltet sämtliche Nachrichten, Buttonbeschriftungen etc., +# welche innerhalb der Benutzerverwaltungsseite benutzt werden. +# +#------------------------------------------------------------------------------ + +newUser = Neuer Benutzer + +updateUserList = Benutzerliste Aktualisieren + +editUser = Benutzer Bearbeiten +disableUser = Benutzer Deaktivieren +enableUser = Benutzer Aktivieren +deleteUser = Benutzer Löschen + +username = Benutzername +userroles = Benutzerrollen +enabled = Aktiviert \ No newline at end of file diff --git a/Kieker.WebGUI/src/main/resources/lang/UserManagementPage_en.properties b/Kieker.WebGUI/src/main/resources/lang/UserManagementPage_en.properties new file mode 100644 index 0000000000000000000000000000000000000000..fcca366ae9570d14a04c2cbabeffd28470e6f1ae --- /dev/null +++ b/Kieker.WebGUI/src/main/resources/lang/UserManagementPage_en.properties @@ -0,0 +1,19 @@ +#------------------------------------------------------------------------------ +# +# This file contains all messages, button captions etc. which are used within +# the user management page. +# +#------------------------------------------------------------------------------ + +newUser = New User + +updateUserList = Update Userlist + +editUser = Edit User +disableUser = Disable User +enableUser = Enable User +deleteUser = Delete User + +username = Username +userroles = Userroles +enabled = Enabled \ No newline at end of file diff --git a/Kieker.WebGUI/src/main/webapp/WEB-INF/faces-config.xml b/Kieker.WebGUI/src/main/webapp/WEB-INF/faces-config.xml index 66f1e72dc50479f1827450823126ecba73ae00fe..5807c106867cf976de6c422ddb9b74047bc5db04 100644 --- a/Kieker.WebGUI/src/main/webapp/WEB-INF/faces-config.xml +++ b/Kieker.WebGUI/src/main/webapp/WEB-INF/faces-config.xml @@ -72,7 +72,7 @@ <navigation-rule> <navigation-case> <from-outcome>userManagement</from-outcome> - <to-view-id>/pages/admin/UserManagement.xhtml</to-view-id> + <to-view-id>/pages/admin/UserManagementPage.xhtml</to-view-id> </navigation-case> </navigation-rule> </faces-config> \ No newline at end of file diff --git a/Kieker.WebGUI/src/main/webapp/WEB-INF/pretty-config.xml b/Kieker.WebGUI/src/main/webapp/WEB-INF/pretty-config.xml index 1e63db8a1948d1c190b0e03363f97f8f97bb62e8..1301bdbdcb57c9f8f8b1a50510e53baee5669c00 100644 --- a/Kieker.WebGUI/src/main/webapp/WEB-INF/pretty-config.xml +++ b/Kieker.WebGUI/src/main/webapp/WEB-INF/pretty-config.xml @@ -51,6 +51,6 @@ <url-mapping id="userManagement"> <pattern value="/pages/admin/userManagement" /> - <view-id value="/faces/pages/admin/UserManagement.xhtml" /> + <view-id value="/faces/pages/admin/UserManagementPage.xhtml" /> </url-mapping> </pretty-config> \ No newline at end of file diff --git a/Kieker.WebGUI/src/main/webapp/css/Icons.css b/Kieker.WebGUI/src/main/webapp/css/Icons.css index b0df1ce040088f5c77c114ec30b72d1689541d78..88818fe721d047fccd248ffd3153b0956902ecd4 100644 --- a/Kieker.WebGUI/src/main/webapp/css/Icons.css +++ b/Kieker.WebGUI/src/main/webapp/css/Icons.css @@ -42,6 +42,13 @@ width:32px; } +.ui-icon-userEnableDisable { + background: url('../img/icons/SnapEnabledSmall.png') no-repeat !important; + height:16px; + width:16px; +} + + .ui-icon-snapDisabled { background: url('../img/icons/SnapDisabled.png') no-repeat !important; height:32px; diff --git a/Kieker.WebGUI/src/main/webapp/dialogs/ProjectOverviewPageDialogs.xhtml b/Kieker.WebGUI/src/main/webapp/dialogs/ProjectOverviewPageDialogs.xhtml index 374fbde018e6b55419162d5b00e291b12481c091..3970abaa82b5c1742d36358ce9ed178828e0180a 100644 --- a/Kieker.WebGUI/src/main/webapp/dialogs/ProjectOverviewPageDialogs.xhtml +++ b/Kieker.WebGUI/src/main/webapp/dialogs/ProjectOverviewPageDialogs.xhtml @@ -19,8 +19,6 @@ <hr/> <div style="text-align: right"> <p:commandButton value="#{localizedMessages.ok}" action="#{projectsBean.addProject(stringBean.string, currentProjectOverviewBean)}" update=":projectsListForm :messages" oncomplete="newProjectDialog.hide()" /> - <p:spacer width="10px" height="10" /> - <p:commandButton value="#{localizedMessages.cancel}" onclick="newProjectDialog.hide()" /> </div> </h:form> </p:dialog> @@ -39,8 +37,6 @@ <hr/> <div style="text-align: right"> <p:commandButton value="#{localizedMessages.ok}" action="#{projectsBean.renameProject(currentProjectOverviewBean.projectName, stringBean.string)}" update=":projectsListForm :messages" oncomplete="renameProjectDialog.hide()" /> - <p:spacer width="10px" height="10" /> - <p:commandButton value="#{localizedMessages.cancel}" onclick="renameProjectDialog.hide()" /> </div> </h:form> </p:dialog> @@ -55,8 +51,6 @@ <hr/> <div style="text-align: right"> <p:commandButton value="#{localizedMessages.ok}" action="#{projectsBean.deleteProject(currentProjectOverviewBean.projectName)}" update=":projectsListForm :messages" oncomplete="deleteProjectDialog.hide()" /> - <p:spacer width="10px" height="10" /> - <p:commandButton value="#{localizedMessages.cancel}" onclick="deleteProjectDialog.hide()" /> </div> </h:form> </p:dialog> @@ -74,8 +68,6 @@ <hr/> <div style="text-align: right"> <p:commandButton value="#{localizedMessages.ok}" action="#{projectsBean.copyProject(currentProjectOverviewBean.projectName, stringBean.string, currentProjectOverviewBean)}" update=":projectsListForm :messages" oncomplete="copyProjectDialog.hide()" /> - <p:spacer width="10px" height="10" /> - <p:commandButton value="#{localizedMessages.cancel}" onclick="copyProjectDialog.hide()" /> </div> </h:form> </p:dialog> diff --git a/Kieker.WebGUI/src/main/webapp/dialogs/UserManagementDialogs.xhtml b/Kieker.WebGUI/src/main/webapp/dialogs/UserManagementDialogs.xhtml index 364bedb1d181742323dbf5b41a40b1bbcf92a559..2106604ad4feab461ae37820e2955e652920eee0 100644 --- a/Kieker.WebGUI/src/main/webapp/dialogs/UserManagementDialogs.xhtml +++ b/Kieker.WebGUI/src/main/webapp/dialogs/UserManagementDialogs.xhtml @@ -6,8 +6,9 @@ xmlns:p="http://primefaces.org/ui"> <p:dialog id="newUserDialog" header="Neuer Benutzer" resizable="false" modal="true" widgetVar="newUserDlg"> - <h:form> - + <!-- Make sure that closing of the dialog also clears the input field. --> + <p:ajax event="close" update=":newUserDialogForm" /> + <h:form id="newUserDialogForm"> <h:panelGrid columnClasses="col1 , col2" columns="2" cellpadding="5"> <h:outputText value="Benutzername: " /> <p:inputText value="#{newUserBean.username}" style="width: 100%" /> @@ -15,7 +16,7 @@ <h:outputText value="Passwort: " /> <p:inputText value="#{newUserBean.password}" style="width: 100%" /> - + <h:outputText value="Benutzerrollen: " /> <p:selectManyCheckbox value="#{newUserBean.roles}" layout="pageDirection" converter="roleStringConverter"> <f:selectItem itemLabel="Benutzer" itemValue="#{ROLE_USER}" /> @@ -25,7 +26,7 @@ <hr/> <div style="text-align: right"> - <p:commandButton value="#{localizedMessages.ok}" action="#{currentUserManagementBean.addUser(newUserBean.username, newUserBean.password, rolesBean.roles)}" oncomplete="newUserDlg.hide()"/> + <p:commandButton value="#{localizedMessages.ok}" action="#{currentUserManagementBean.addUser(newUserBean.username, newUserBean.password, newUserBean.roles)}" oncomplete="newUserDlg.hide()" update=":usersListForm"/> </div> </h:form> </p:dialog> diff --git a/Kieker.WebGUI/src/main/webapp/pages/admin/UserManagement.xhtml b/Kieker.WebGUI/src/main/webapp/pages/admin/UserManagementPage.xhtml similarity index 50% rename from Kieker.WebGUI/src/main/webapp/pages/admin/UserManagement.xhtml rename to Kieker.WebGUI/src/main/webapp/pages/admin/UserManagementPage.xhtml index 495714c4243ab5b33f0c9b3a7aa5b1aefaf34ac5..1ed4f9115a65a5bf1fa701af8c48f92a4a5ea367 100644 --- a/Kieker.WebGUI/src/main/webapp/pages/admin/UserManagement.xhtml +++ b/Kieker.WebGUI/src/main/webapp/pages/admin/UserManagementPage.xhtml @@ -16,40 +16,51 @@ <ui:param name="showProjectName" value="false"/> <ui:define name="bundleIncludes"> - + <f:loadBundle var="localizedUserManagementMessages" basename="lang.UserManagementPage"/> </ui:define> <ui:define name="cssIncludes"> - <link rel="stylesheet" type="text/css" href="/css/UserManagement.css" /> + <link rel="stylesheet" type="text/css" href="/css/UserManagement.css" /> </ui:define> <!-- Those are the menu bar entries left from the help-submenu. --> <ui:define name="furtherMenuBarEntries"> <p:submenu label="#{localizedMessages.file}"> - <p:menuitem styleClass="element-with-whitespace" icon="ui-icon-newProject" value=" Neuer Benutzer" onclick="newUserDlg.show()" ajax="true"/> + <p:menuitem styleClass="element-with-whitespace" icon="ui-icon-newProject" value=" #{localizedUserManagementMessages.newUser}" onclick="newUserDlg.show()" ajax="true"/> <p:separator/> - <p:menuitem styleClass="element-with-whitespace" icon="ui-icon-reload" value=" Benutzerliste Aktualisieren" update=":usersListForm" action="#{currentUserManagementBean.updateList()}" ajax="true"/> + <p:menuitem styleClass="element-with-whitespace" icon="ui-icon-reload" value=" #{localizedUserManagementMessages.updateUserList}" update=":usersListForm" action="#{currentUserManagementBean.updateList()}" ajax="true"/> <p:separator/> - <p:menuitem styleClass="element-with-whitespace" icon="ui-icon-settings" value=" Einstellungen" onclick="settingsDlg.show()" ajax="true"/> + <p:menuitem styleClass="element-with-whitespace" icon="ui-icon-settings" value=" #{localizedMessages.settings}" onclick="settingsDlg.show()" ajax="true"/> </p:submenu> </ui:define> <ui:define name="centerContent"> <h:form id="usersListForm"> <p:dataTable value="#{currentUserManagementBean.users}" var="user" emptyMessage="#{localizedMessages.noRecordsFound}" rows="15" paginator="true" paginatorPosition="both" rowsPerPageTemplate="5,10,15,25,50" paginatorTemplate="{CurrentPageReport} {FirstPageLink} {PreviousPageLink} {PageLinks} {NextPageLink} {LastPageLink} {RowsPerPageDropdown}"> - <p:column headerText="Benutzername"> - #{user.name} + <p:column headerText="#{localizedUserManagementMessages.username}" sortBy="#{user.name}"> + <p:commandLink id="dynaButton" value="#{user.name}"/> + + <p:menu overlay="true" trigger="dynaButton" my="left top" at="left bottom" style="width:210px"> + <p:menuitem icon="ui-icon-edit" styleClass="element-with-whitespace" value=" #{localizedUserManagementMessages.editUser}"/> + <p:menuitem icon="ui-icon-userEnableDisable" styleClass="element-with-whitespace" value=" #{user.enabled ? localizedUserManagementMessages.disableUser : localizedUserManagementMessages.enableUser}"/> + <p:separator/> + <p:menuitem icon="ui-icon-delete" styleClass="element-with-whitespace" value=" #{localizedUserManagementMessages.deleteUser}"/> + </p:menu> </p:column> - - <p:column headerText="Benutzerrollen"> + + <p:column headerText="#{localizedUserManagementMessages.userroles}" sortBy="#{user.roles}"> #{user.roles} </p:column> + + <p:column headerText="#{localizedUserManagementMessages.enabled}" sortBy="#{user.enabled}" style="text-align: center"> + #{user.enabled ? localizedMessages.yes : localizedMessages.no} + </p:column> </p:dataTable> </h:form> </ui:define> <ui:define name="furtherDialogIncludes"> - <ui:include src="../../dialogs/UserManagementDialogs.xhtml" /> + <ui:include src="../../dialogs/UserManagementDialogs.xhtml" /> </ui:define> </ui:composition>