diff --git a/assets/styles/app.css b/assets/styles/app.css index bde65b2..c819b28 100644 --- a/assets/styles/app.css +++ b/assets/styles/app.css @@ -4,10 +4,14 @@ --primary-blue-dark : #094754; --black-font: #1D1E1C; --delete : #E42E31; + --delete-dark : #aa1618; --disable : #A3A3A3; - --check : #80F20E; + --check : #5cae09; + --check-dark: #3a6e05; --secondary : #cc664c; --secondary-dark : #a5543d; + --warning : #d2b200; + --warning-dark: #c4a600; } html { @@ -103,12 +107,41 @@ body { border: var(--primary-blue-light); } +.btn-success{ + background: var(--check); + color : #FFFFFF; + border: var(--check-dark); + border-radius: 1rem; +} +.btn-success:hover{ + background: var(--check-dark); + color : #FFFFFF; + border: var(--check); +} + +.btn-warning{ + background: var(--warning); + color : #FFFFFF; + border: var(--warning-dark); + border-radius: 1rem; +} +.btn-warning:hover{ + background: var(--warning-dark); + color : #FFFFFF; + border: var(--warning); +} + .btn-danger{ background: var(--delete); color : #FFFFFF; - border: var(--delete); + border: var(--delete-dark); border-radius: 1rem; } +.btn-danger:hover{ + background: var(--delete-dark); + color : #FFFFFF; + border: var(--delete); +} .color-primary{ color: var(--primary-blue-light) !important; diff --git a/src/Controller/OrganizationController.php b/src/Controller/OrganizationController.php index ae7f6fc..9873ed4 100644 --- a/src/Controller/OrganizationController.php +++ b/src/Controller/OrganizationController.php @@ -194,7 +194,7 @@ class OrganizationController extends AbstractController return $this->redirectToRoute('organization_index'); } //check if the user is admin of the organization - if (!$this->userService->isAdminOfOrganization($organization) && !$this->isGranted("ROLE_SUPER_ADMIN")) { + if (!$this->userService->isAdminOfOrganization($organization) && !$this->isGranted("ROLE_ADMIN")) { $this->loggerService->logAccessDenied($actingUser->getId()); $this->addFlash('error', 'Erreur, accès refusé.'); throw new AccessDeniedHttpException('Access denied'); diff --git a/src/Controller/UserController.php b/src/Controller/UserController.php index 9434546..f07567c 100644 --- a/src/Controller/UserController.php +++ b/src/Controller/UserController.php @@ -62,6 +62,15 @@ class UserController extends AbstractController { } + #[Route(path: '/', name: 'index', methods: ['GET'])] + public function index(): Response + { + $this->denyAccessUnlessGranted('ROLE_ADMIN'); + $totalUsers = $this->userRepository->count(['isDeleted' => false, 'isActive' => true]); + return $this->render('user/index.html.twig', [ + 'users' => $totalUsers + ]); + } #[Route('/view/{id}', name: 'show', methods: ['GET'])] public function view(int $id, Request $request): Response @@ -72,109 +81,27 @@ class UserController extends AbstractController // Utilisateur courant (acting user) via UserService $actingUser = $this->userService->getUserByIdentifier($this->getUser()->getUserIdentifier()); - // Vérification des droits d'accès supplémentaires - - // Chargement de l'utilisateur cible à afficher $user = $this->userRepository->find($id); if (!$user) { $this->loggerService->logEntityNotFound('User', ['id' => $id], $actingUser->getId()); - $this->addFlash('error', "L'utilisateur demandé n'existe pas."); + $this->addFlash('danger', "L'utilisateur demandé n'existe pas."); throw $this->createNotFoundException(self::NOT_FOUND); } + //if hasAccessTo is false, turn to true and denie access if (!$this->userService->hasAccessTo($user)) { $this->loggerService->logAccessDenied($actingUser->getId()); - $this->addFlash('error', "L'utilisateur demandé n'existe pas."); + $this->addFlash('danger', "Vous n'avez pas accès à cette information."); throw new AccessDeniedHttpException (self::ACCESS_DENIED); } try { // Paramètre optionnel de contexte organisationnel $orgId = $request->query->get('organizationId'); - - // Liste de toutes les applications (pour créer des groupes même si vides) - $apps = $this->appsRepository->findAll(); - - // Initialisations pour la résolution des UsersOrganizations (UO) - $singleUo = null; - $uoActive = null; - - // get uo or uoS based on orgId if ($orgId) { - // Contexte organisation précis : récupérer l'organisation et les liens UO - $organization = $this->organizationRepository->findBy(['id' => $orgId]); - $uoList = $this->uoRepository->findBy([ - 'users' => $user, - 'organization' => $organization, - 'isActive' => true, - ]); - - if (!$uoList) { - $this->loggerService->logEntityNotFound('UsersOrganization', [ - 'user_id' => $user->getId(), - 'organization_id' => $orgId], - $actingUser->getId()); - $this->addFlash('error', "L'utilisateur n'est pas actif dans cette organisation."); - throw $this->createNotFoundException(self::NOT_FOUND); - } - - // Si contexte org donné, on retient la première UO (singleUo) - $singleUo = $uoList[0]; - $data["singleUo"] = $singleUo; - $uoActive = $singleUo->isActive(); +// TODO: afficher les projets de l'organisation } else { - // Pas de contexte org : récupérer toutes les UO actives de l'utilisateur - $uoList = $this->uoRepository->findBy([ - 'users' => $user, - 'isActive' => true, - ]); - if (!$uoList) { - $data['rolesArray'] = $this->userService->getRolesArrayForUser($actingUser, true); - return $this->render('user/show.html.twig', [ - 'user' => $user, - 'organizationId' => $orgId ?? null, - 'uoActive' => $uoActive ?? null, - 'apps' => $apps ?? [], - 'data' => $data ?? [], - 'canEdit' => false, - ]); - } + // Afficher tous les projets de l'utilisateur } - // Charger les liens UserOrganizationApp (UOA) actifs pour les UO trouvées - // Load user-organization-app roles (can be empty) - $uoa = $this->entityManager - ->getRepository(UserOrganizatonApp::class) - ->findBy([ - 'userOrganization' => $uoList, - 'isActive' => true, - ]); - // Group UOA by app and ensure every app has a group - $data['uoas'] = $this->userOrganizationAppService - ->groupUserOrganizationAppsByApplication( - $uoa, - $apps, - $singleUo ? $singleUo->getId() : null - ); - - //Build roles based on user permissions. - //Admin can't see or edit a super admin user - if ($this->isGranted('ROLE_SUPER_ADMIN')) { - $data['rolesArray'] = $this->rolesRepository->findAll(); - } elseif (!$orgId) { - $data['rolesArray'] = $this->userService->getRolesArrayForUser($actingUser, true); - } else { - $data['rolesArray'] = $this->userService->getRolesArrayForUser($actingUser); - } - - // ------------------------------------------------------------------- - - // Calcul du flag de modification : utilisateur admin ET exactement 1 UO - if (empty($uoa) || !$orgId){ - $canEdit = false; - }else{ - $canEdit = $this->userService->canEditRolesCheck($actingUser, $user, $this->isGranted('ROLE_ADMIN'), $singleUo, $organization); - } - - } catch (\Exception $e) { $this->loggerService->logError('error while loading user information', [ 'target_user_id' => $id, @@ -188,10 +115,6 @@ class UserController extends AbstractController return $this->render('user/show.html.twig', [ 'user' => $user, 'organizationId' => $orgId ?? null, - 'uoActive' => $uoActive ?? null, - 'apps' => $apps ?? [], - 'data' => $data ?? [], - 'canEdit' => $canEdit ?? false, ]); } @@ -404,7 +327,10 @@ class UserController extends AbstractController } } - + /** + * Endpoint to activate/deactivate a user (soft delete) + * If deactivating, also deactivate all org links and revoke tokens + */ #[Route('/activeStatus/{id}', name: 'active_status', methods: ['GET', 'POST'])] public function activeStatus(int $id, Request $request): JsonResponse { @@ -762,23 +688,6 @@ class UserController extends AbstractController ]); } - #[Route(path: '/', name: 'index', methods: ['GET'])] - public function index(): Response - { - $this->isGranted('ROLE_SUPER_ADMIN'); - $actingUser = $this->userService->getUserByIdentifier($this->getUser()->getUserIdentifier()); - if ($this->userService->hasAccessTo($actingUser, true) && $this->isGranted("ROLE_ADMIN")) { - $totalUsers = $this->userRepository->count(['isDeleted' => false, 'isActive' => true]); - return $this->render('user/index.html.twig', [ - 'users' => $totalUsers - ]); - } - - //shouldn't be reached normally - $this->loggerService->logAccessDenied($actingUser->getId()); - throw $this->createAccessDeniedException(self::ACCESS_DENIED); - } - /* * AJAX endpoint for new users listing * Get the 5 most recently created users for an organization diff --git a/templates/elements/menu.html.twig b/templates/elements/menu.html.twig index fecb6f2..7e01b6f 100644 --- a/templates/elements/menu.html.twig +++ b/templates/elements/menu.html.twig @@ -3,7 +3,7 @@ {% set current_route = app.request.attributes.get('_route') %}