From defc184de577f6f4ae2bd4615741b216c87589fb Mon Sep 17 00:00:00 2001 From: Jens Pelzetter Date: Wed, 23 Sep 2020 20:41:00 +0200 Subject: [PATCH] Table of users --- .gitignore | 1 + .../libreccm/ui/admin/AdminPagesModel.java | 30 ++++- .../admin/usersgroupsroles/OverviewModel.java | 90 ++++++++++++++ .../UsersGroupsRolesController.java | 42 ++++++- .../usersgroupsroles/UsersTableModel.java | 66 +++++++++++ .../ui/admin/users-groups-roles.xhtml | 45 +++++-- .../ui/admin/users-groups-roles/groups.xhtml | 26 +++++ .../admin/users-groups-roles/overview.xhtml | 24 ++++ .../ui/admin/users-groups-roles/roles.xhtml | 26 +++++ .../ui/admin/users-groups-roles/users.xhtml | 110 ++++++++++++++++++ .../org/libreccm/ui/AdminBundle.properties | 21 ++++ .../org/libreccm/ui/AdminBundle_de.properties | 21 ++++ 12 files changed, 482 insertions(+), 20 deletions(-) create mode 100644 ccm-core/src/main/java/org/libreccm/ui/admin/usersgroupsroles/OverviewModel.java create mode 100644 ccm-core/src/main/java/org/libreccm/ui/admin/usersgroupsroles/UsersTableModel.java create mode 100644 ccm-core/src/main/resources/WEB-INF/views/org/libreccm/ui/admin/users-groups-roles/groups.xhtml create mode 100644 ccm-core/src/main/resources/WEB-INF/views/org/libreccm/ui/admin/users-groups-roles/overview.xhtml create mode 100644 ccm-core/src/main/resources/WEB-INF/views/org/libreccm/ui/admin/users-groups-roles/roles.xhtml create mode 100644 ccm-core/src/main/resources/WEB-INF/views/org/libreccm/ui/admin/users-groups-roles/users.xhtml diff --git a/.gitignore b/.gitignore index 56e4e14b7..144b13113 100644 --- a/.gitignore +++ b/.gitignore @@ -11,3 +11,4 @@ target .settings .tscache *.vscode +/ccm-core/nbproject/ diff --git a/ccm-core/src/main/java/org/libreccm/ui/admin/AdminPagesModel.java b/ccm-core/src/main/java/org/libreccm/ui/admin/AdminPagesModel.java index 0335d7b32..72f07e4df 100644 --- a/ccm-core/src/main/java/org/libreccm/ui/admin/AdminPagesModel.java +++ b/ccm-core/src/main/java/org/libreccm/ui/admin/AdminPagesModel.java @@ -20,7 +20,9 @@ package org.libreccm.ui.admin; import org.libreccm.l10n.GlobalizationHelper; +import java.util.HashMap; import java.util.List; +import java.util.Map; import java.util.ResourceBundle; import java.util.stream.Collectors; @@ -43,6 +45,11 @@ public class AdminPagesModel { @Inject private GlobalizationHelper globalizationHelper; + /** + * Cache for bundles + */ + private final Map bundles = new HashMap<>(); + public List getAdminPages() { return adminPages .stream() @@ -56,13 +63,11 @@ public class AdminPagesModel { } private AdminPageModel buildAdminPageModel(final AdminPage fromAdminPage) { - final ResourceBundle labelBundle = ResourceBundle.getBundle( - fromAdminPage.getLabelBundle(), - globalizationHelper.getNegotiatedLocale() + final ResourceBundle labelBundle = getBundle( + fromAdminPage.getLabelBundle() ); - final ResourceBundle descriptionBundle = ResourceBundle.getBundle( - fromAdminPage.getDescriptionBundle(), - globalizationHelper.getNegotiatedLocale() + final ResourceBundle descriptionBundle = getBundle( + fromAdminPage.getDescriptionBundle() ); final AdminPageModel model = new AdminPageModel(); @@ -77,4 +82,17 @@ public class AdminPagesModel { return model; } + private ResourceBundle getBundle(final String bundleName) { + if (bundles.containsKey(bundleName)) { + return bundles.get(bundleName); + } else { + final ResourceBundle bundle = ResourceBundle.getBundle( + bundleName, + globalizationHelper.getNegotiatedLocale() + ); + bundles.put(bundleName, bundle); + return bundle; + } + } + } diff --git a/ccm-core/src/main/java/org/libreccm/ui/admin/usersgroupsroles/OverviewModel.java b/ccm-core/src/main/java/org/libreccm/ui/admin/usersgroupsroles/OverviewModel.java new file mode 100644 index 000000000..52d958648 --- /dev/null +++ b/ccm-core/src/main/java/org/libreccm/ui/admin/usersgroupsroles/OverviewModel.java @@ -0,0 +1,90 @@ +/* + * Copyright (C) 2020 LibreCCM Foundation. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, + * MA 02110-1301 USA + */ +package org.libreccm.ui.admin.usersgroupsroles; + +import org.libreccm.core.CoreConstants; +import org.libreccm.security.AuthorizationRequired; +import org.libreccm.security.GroupRepository; +import org.libreccm.security.RequiresPrivilege; +import org.libreccm.security.RoleRepository; +import org.libreccm.security.UserRepository; + +import javax.enterprise.context.RequestScoped; +import javax.inject.Inject; +import javax.inject.Named; +import javax.transaction.Transactional; + +/** + * + * @author Jens Pelzetter + */ +@RequestScoped +@Named("UsersGroupsRolesOverviewModel") +public class OverviewModel { + + @Inject + private GroupRepository groupRepository; + + @Inject + private RoleRepository roleRepository; + + @Inject + private UserRepository userRepository; + + @AuthorizationRequired + @RequiresPrivilege(CoreConstants.PRIVILEGE_ADMIN) + @Transactional + public long getActiveUsersCount() { + return userRepository + .findAll() + .stream() + .filter(user -> !user.isBanned()) + .count(); + } + + @AuthorizationRequired + @RequiresPrivilege(CoreConstants.PRIVILEGE_ADMIN) + @Transactional + public long getDisabledUsersCount() { + return userRepository + .findAll() + .stream() + .filter(user -> user.isBanned()) + .count(); + } + + @AuthorizationRequired + @RequiresPrivilege(CoreConstants.PRIVILEGE_ADMIN) + @Transactional + public long getGroupsCount() { + return groupRepository + .findAll() + .size(); + } + + @AuthorizationRequired + @RequiresPrivilege(CoreConstants.PRIVILEGE_ADMIN) + @Transactional + public long getRolesCount() { + return roleRepository + .findAll() + .size(); + } + +} diff --git a/ccm-core/src/main/java/org/libreccm/ui/admin/usersgroupsroles/UsersGroupsRolesController.java b/ccm-core/src/main/java/org/libreccm/ui/admin/usersgroupsroles/UsersGroupsRolesController.java index 6cfe77e65..69dd1d61e 100644 --- a/ccm-core/src/main/java/org/libreccm/ui/admin/usersgroupsroles/UsersGroupsRolesController.java +++ b/ccm-core/src/main/java/org/libreccm/ui/admin/usersgroupsroles/UsersGroupsRolesController.java @@ -23,9 +23,14 @@ import org.libreccm.security.AuthorizationRequired; import org.libreccm.security.RequiresPrivilege; import javax.enterprise.context.RequestScoped; +import javax.inject.Inject; import javax.mvc.Controller; +import javax.ws.rs.DefaultValue; +import javax.ws.rs.FormParam; import javax.ws.rs.GET; +import javax.ws.rs.POST; import javax.ws.rs.Path; +import javax.ws.rs.QueryParam; /** * @@ -35,12 +40,43 @@ import javax.ws.rs.Path; @Controller @Path("/users-groups-roles") public class UsersGroupsRolesController { - + + @Inject + private UsersTableModel usersTableModel; + @GET @Path("/") @AuthorizationRequired @RequiresPrivilege(CoreConstants.PRIVILEGE_ADMIN) - public String getPlaceholder() { - return "org/libreccm/ui/admin/users-groups-roles.xhtml"; + public String getOverview() { + return "org/libreccm/ui/admin/users-groups-roles/overview.xhtml"; } + + @GET + @Path("/groups") + @AuthorizationRequired + @RequiresPrivilege(CoreConstants.PRIVILEGE_ADMIN) + public String getGroups() { + return "org/libreccm/ui/admin/users-groups-roles/groups.xhtml"; + } + + @GET + @Path("/roles") + @AuthorizationRequired + @RequiresPrivilege(CoreConstants.PRIVILEGE_ADMIN) + public String getRoles() { + return "org/libreccm/ui/admin/users-groups-roles/roles.xhtml"; + } + + @GET + @Path("/users") + @AuthorizationRequired + @RequiresPrivilege(CoreConstants.PRIVILEGE_ADMIN) + public String getUsers( + @QueryParam("filterterm") @DefaultValue("") final String filterTerm + ) { + usersTableModel.setFilterTerm(filterTerm); + return "org/libreccm/ui/admin/users-groups-roles/users.xhtml"; + } + } diff --git a/ccm-core/src/main/java/org/libreccm/ui/admin/usersgroupsroles/UsersTableModel.java b/ccm-core/src/main/java/org/libreccm/ui/admin/usersgroupsroles/UsersTableModel.java new file mode 100644 index 000000000..e6a0b9c82 --- /dev/null +++ b/ccm-core/src/main/java/org/libreccm/ui/admin/usersgroupsroles/UsersTableModel.java @@ -0,0 +1,66 @@ +/* + * Copyright (C) 2020 LibreCCM Foundation. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, + * MA 02110-1301 USA + */ +package org.libreccm.ui.admin.usersgroupsroles; + +import org.libreccm.core.CoreConstants; +import org.libreccm.security.AuthorizationRequired; +import org.libreccm.security.RequiresPrivilege; +import org.libreccm.security.User; +import org.libreccm.security.UserRepository; + +import java.util.List; + +import javax.enterprise.context.RequestScoped; +import javax.inject.Inject; +import javax.inject.Named; +import javax.transaction.Transactional; + +/** + * + * @author Jens Pelzetter + */ +@RequestScoped +@Named("UsersTableModel") +public class UsersTableModel { + + @Inject + private UserRepository userRepository; + + private String filterTerm; + + public String getFilterTerm() { + return filterTerm; + } + + protected void setFilterTerm(final String filterTerm) { + this.filterTerm = filterTerm; + } + + @AuthorizationRequired + @RequiresPrivilege(CoreConstants.PRIVILEGE_ADMIN) + @Transactional + public List getUsers() { + if (filterTerm == null || filterTerm.isEmpty()) { + return userRepository.findAllOrderdByUsername(); + } else { + return userRepository.filtered(filterTerm); + } + } + +} diff --git a/ccm-core/src/main/resources/WEB-INF/views/org/libreccm/ui/admin/users-groups-roles.xhtml b/ccm-core/src/main/resources/WEB-INF/views/org/libreccm/ui/admin/users-groups-roles.xhtml index 426afd3b2..2ddb572ad 100644 --- a/ccm-core/src/main/resources/WEB-INF/views/org/libreccm/ui/admin/users-groups-roles.xhtml +++ b/ccm-core/src/main/resources/WEB-INF/views/org/libreccm/ui/admin/users-groups-roles.xhtml @@ -5,19 +5,42 @@ xmlns:ui="http://xmlns.jcp.org/jsf/facelets"> - - - - - - + -
-

#{AdminMessages['usersgroupsroles.label']}

-

Placeholder

+ diff --git a/ccm-core/src/main/resources/WEB-INF/views/org/libreccm/ui/admin/users-groups-roles/groups.xhtml b/ccm-core/src/main/resources/WEB-INF/views/org/libreccm/ui/admin/users-groups-roles/groups.xhtml new file mode 100644 index 000000000..8029a7ff7 --- /dev/null +++ b/ccm-core/src/main/resources/WEB-INF/views/org/libreccm/ui/admin/users-groups-roles/groups.xhtml @@ -0,0 +1,26 @@ + + + + + + + + + + + + + +

Groups placeholder

+
+
+ + diff --git a/ccm-core/src/main/resources/WEB-INF/views/org/libreccm/ui/admin/users-groups-roles/overview.xhtml b/ccm-core/src/main/resources/WEB-INF/views/org/libreccm/ui/admin/users-groups-roles/overview.xhtml new file mode 100644 index 000000000..1a3df4cff --- /dev/null +++ b/ccm-core/src/main/resources/WEB-INF/views/org/libreccm/ui/admin/users-groups-roles/overview.xhtml @@ -0,0 +1,24 @@ + + + + + + + + + + + + +

#{UsersGroupsRolesOverviewModel.activeUsersCount} #{AdminMessages['usersgroupsroles.active_users_count.label']}

+

#{UsersGroupsRolesOverviewModel.disabledUsersCount} #{AdminMessages['usersgroupsroles.disabled_users_count.label']}

+

#{UsersGroupsRolesOverviewModel.groupsCount} #{AdminMessages['usersgroupsroles.groups_count.label']}

+

#{UsersGroupsRolesOverviewModel.rolesCount} #{AdminMessages['usersgroupsroles.roles_count.label']}

+
+
+ diff --git a/ccm-core/src/main/resources/WEB-INF/views/org/libreccm/ui/admin/users-groups-roles/roles.xhtml b/ccm-core/src/main/resources/WEB-INF/views/org/libreccm/ui/admin/users-groups-roles/roles.xhtml new file mode 100644 index 000000000..26bdf61c6 --- /dev/null +++ b/ccm-core/src/main/resources/WEB-INF/views/org/libreccm/ui/admin/users-groups-roles/roles.xhtml @@ -0,0 +1,26 @@ + + + + + + + + + + + + + +

Roles placeholder

+
+
+ + diff --git a/ccm-core/src/main/resources/WEB-INF/views/org/libreccm/ui/admin/users-groups-roles/users.xhtml b/ccm-core/src/main/resources/WEB-INF/views/org/libreccm/ui/admin/users-groups-roles/users.xhtml new file mode 100644 index 000000000..58222e0e4 --- /dev/null +++ b/ccm-core/src/main/resources/WEB-INF/views/org/libreccm/ui/admin/users-groups-roles/users.xhtml @@ -0,0 +1,110 @@ + + + + + + + + + + + + + +
+
+
+
+ + +
+ +
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + +
#{AdminMessages['usersgroupsroles.users.table.headers.username']}#{AdminMessages['usersgroupsroles.users.table.headers.givenname']}#{AdminMessages['usersgroupsroles.users.table.headers.familyname']}#{AdminMessages['usersgroupsroles.users.table.headers.email']}#{AdminMessages['usersgroupsroles.users.table.headers.disabled']}#{AdminMessages['usersgroupsroles.users.table.headers.actions']}
#{user.name}#{user.givenName}#{user.familyName} + #{user.primaryEmailAddress.address} + + #{user.banned ? AdminMessages['usersgroupsroles.users.table.headers.disabled.true'] : AdminMessages['usersgroupsroles.users.table.headers.disabled.false']} + + + + + + #{AdminMessages['usersgroupsroles.users.detailslink.label']} + + + + +
+
+
+ + diff --git a/ccm-core/src/main/resources/org/libreccm/ui/AdminBundle.properties b/ccm-core/src/main/resources/org/libreccm/ui/AdminBundle.properties index 8edd74f1b..d7384ddd0 100644 --- a/ccm-core/src/main/resources/org/libreccm/ui/AdminBundle.properties +++ b/ccm-core/src/main/resources/org/libreccm/ui/AdminBundle.properties @@ -17,3 +17,24 @@ usersgroupsroles.description=Manage users, groups and roles systeminformation.tabs.libreccm.label=LibreCCM System Information systeminformation.tabs.java.label=Java System Properties breadcrumbs.start=LibreCCM Admin +usersgroupsroles.users.label=Users +usersgroupsroles.groups.label=Groups +usersgroupsroles.roles.label=Roles +usersgroupsroles.overview.label=Overview +usersgroupsroles.active_users_count.label=active users +usersgroupsroles.disabled_users_count.label=disabled users +usersgroupsroles.groups_count.label=groups +usersgroupsroles.roles_count.label=roles +usersgroupsroles.users.table.headers.username=User Name +usersgroupsroles.users.table.headers.givenname=Given Name +usersgroupsroles.users.table.headers.familyname=Family Name +usersgroupsroles.users.table.headers.email=Email +usersgroupsroles.users.table.headers.disabled=Disabled? +usersgroupsroles.users.table.headers.actions=Actions +usersgroupsroles.users.table.headers.disabled.true=Yes +usersgroupsroles.users.table.headers.disabled.false=No +usersgroupsroles.users.detailslink.label=Details +usersgroupsroles.users.disablebutton.label=Disable +usersgroupsroles.users.add=Add user +usersgroupsroles.users.filter.label=Filter users +usersgroupsroles.users.filter.submit=Submit diff --git a/ccm-core/src/main/resources/org/libreccm/ui/AdminBundle_de.properties b/ccm-core/src/main/resources/org/libreccm/ui/AdminBundle_de.properties index 7f68a543e..f8baca984 100644 --- a/ccm-core/src/main/resources/org/libreccm/ui/AdminBundle_de.properties +++ b/ccm-core/src/main/resources/org/libreccm/ui/AdminBundle_de.properties @@ -17,3 +17,24 @@ usersgroupsroles.description=Verwaltungen von Benutzer*innen, Gruppen und Rollen systeminformation.tabs.libreccm.label=LibreCCM System Informationen systeminformation.tabs.java.label=Java System Properties breadcrumbs.start=LibreCCM Admin +usersgroupsroles.users.label=Benutzer*innen +usersgroupsroles.groups.label=Gruppen +usersgroupsroles.roles.label=Rollen +usersgroupsroles.overview.label=\u00dcberblick +usersgroupsroles.active_users_count.label=aktive Benutzer*innen +usersgroupsroles.disabled_users_count.label=inaktive Benutzer*innen +usersgroupsroles.groups_count.label=Gruppen +usersgroupsroles.roles_count.label=Rollen +usersgroupsroles.users.table.headers.username=Benutzername +usersgroupsroles.users.table.headers.givenname=Vorname +usersgroupsroles.users.table.headers.familyname=Familienname +usersgroupsroles.users.table.headers.email=E-Mail +usersgroupsroles.users.table.headers.disabled=Inaktiv? +usersgroupsroles.users.table.headers.actions=Aktionen +usersgroupsroles.users.table.headers.disabled.true=Ja +usersgroupsroles.users.table.headers.disabled.false=Nein +usersgroupsroles.users.detailslink.label=Details +usersgroupsroles.users.disablebutton.label=Sperren +usersgroupsroles.users.add=Benutzer*in hinzuf\u00fcgen +usersgroupsroles.users.filter.label=Benutzer*innen filtern +usersgroupsroles.users.filter.submit=Anwenden