From 7257b721596d0331112b08110e3d614cb5c16de0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bj=C3=B6rn=20Fromme?= Date: Fri, 19 Apr 2024 15:58:58 +0200 Subject: [PATCH] feat: list administrative users for admins --- .../Admin/System/User/IndexController.php | 26 +++++++ src/Entity/User.php | 21 +++++ src/Menu/AdminMenuBuilder.php | 6 ++ src/Repository/UserRepository.php | 21 +++++ templates/admin/system/user/index.html.twig | 77 +++++++++++++++++++ 5 files changed, 151 insertions(+) create mode 100644 src/Controller/Admin/System/User/IndexController.php create mode 100644 templates/admin/system/user/index.html.twig diff --git a/src/Controller/Admin/System/User/IndexController.php b/src/Controller/Admin/System/User/IndexController.php new file mode 100644 index 0000000..5ab0f39 --- /dev/null +++ b/src/Controller/Admin/System/User/IndexController.php @@ -0,0 +1,26 @@ +userRepository->getAdministrativeUsers(); + + return $this->render('admin/system/user/index.html.twig', [ + 'users' => $users, + ]); + } +} diff --git a/src/Entity/User.php b/src/Entity/User.php index 9553520..ad13988 100644 --- a/src/Entity/User.php +++ b/src/Entity/User.php @@ -147,9 +147,30 @@ class User implements UserInterface, TimestampableEntityInterface { $roles = ['ROLE_USER', ...$this->roles]; + if (true === $this->isSuperAdmin()) { + $roles[] = 'ROLE_SUPER_ADMIN'; + } + return array_unique($roles); } + public function getRolesLabels(): array + { + $labels = []; + + foreach ($this->roles as $role) { + $labels[] = match($role) { + 'ROLE_ADMIN' => 'Admin', + 'ROLE_MANAGER' => 'Reisemanager', + 'ROLE_HOUSE_MANAGER' => 'Hausleitung', + 'ROLE_TEAMER' => 'Teamer', + default => $role, + }; + } + + return $labels; + } + public function setRoles(array $roles): static { $this->roles = $roles; diff --git a/src/Menu/AdminMenuBuilder.php b/src/Menu/AdminMenuBuilder.php index 07c43fa..692a05a 100644 --- a/src/Menu/AdminMenuBuilder.php +++ b/src/Menu/AdminMenuBuilder.php @@ -170,6 +170,12 @@ class AdminMenuBuilder extends AbstractMenuBuilder ], ], ]); + $settingsMenu->addChild('Administrative Benutzer', [ + 'route' => 'app_admin_system_user_index', + 'linkAttributes' => [ + 'title' => 'Administrative Benutzer', + ], + ]); $menu->addChild('Logs', [ 'route' => 'app_admin_log_index', diff --git a/src/Repository/UserRepository.php b/src/Repository/UserRepository.php index 2112130..4c651b9 100644 --- a/src/Repository/UserRepository.php +++ b/src/Repository/UserRepository.php @@ -21,6 +21,27 @@ class UserRepository extends ServiceEntityRepository parent::__construct($registry, User::class); } + public function getAdministrativeUsers(): array + { + $qb = $this->createQueryBuilder('u'); + + return $qb + ->where($qb->expr()->orX( + $qb->expr()->like('u.roles', ':role_admin'), + $qb->expr()->like('u.roles', ':role_manager'), + $qb->expr()->like('u.roles', ':role_house_manager') + )) + ->orderBy('u.lastName', 'ASC') + ->setParameters([ + 'role_admin' => '%"ROLE_ADMIN"%', + 'role_manager' => '%"ROLE_MANAGER"%', + 'role_house_manager' => '%"ROLE_HOUSE_MANAGER"%', + ]) + ->getQuery() + ->getResult() + ; + } + public function getUsersByRoleAndHotelCode(string $role, string $hotelCode): array { $hotelCodeBase = substr($hotelCode, 0, 3); diff --git a/templates/admin/system/user/index.html.twig b/templates/admin/system/user/index.html.twig new file mode 100644 index 0000000..9939c6f --- /dev/null +++ b/templates/admin/system/user/index.html.twig @@ -0,0 +1,77 @@ +{% extends 'admin/layout.html.twig' %} + +{% block title %}Administrative Benutzer{% endblock %} + +{% block content %} +

+ Administrative Benutzer +

+
+
+ + + + + + + + + + + + + + {% for user in users %} + + + + + + + + + + {% else %} + + + + {% endfor %} + +
+ Name + + Vorname + + E-Mail + + Rolle(n) + + Superadmin + + Letzter Login +
+ {{ user.lastName }} + + {{ user.firstName }} + + {{ user.email }} + + {{ user.rolesLabels|join(', ') }} + + {% if user.superAdmin %} + {{ icon('check', 'w-4 h-4 inline-block') }} + {% endif %} + + {{ user.lastLoginAt ? user.lastLoginAt|date('d.m.Y, H:i') : '-' }} + + {% if is_granted('CAN_IMPERSONATE', user) %} + + {{ icon('mask', 'w-4 h-4') }} + + {% endif %} +
+ Keine Daten... +
+
+
+{% endblock %} \ No newline at end of file