From e2fbf51e198bba76d67c56d5d72004e52cd2b718 Mon Sep 17 00:00:00 2001 From: matthieu Date: Wed, 22 Apr 2026 15:40:53 +0200 Subject: [PATCH] refactor(sidebar) : deplace Tableau de bord dans Mon compte + documente la convention admin - Dashboard ("/") sort de la section Administration et rejoint "Mon compte" (accessible a tout user authentifie, comme Deconnexion). - Cle i18n migree : sidebar.general.dashboard -> sidebar.account.dashboard. Le namespace "general" devenu vide est supprime. - Documentation inline dans config/sidebar.php : formalise la convention "etre admin = detenir au moins une permission admin-scoped (core.* ou equivalent sites.view)". Le gate implicite via filtrage d'items rend inutile un gate section-level tant que chaque item porte sa permission. Co-Authored-By: Claude Opus 4.7 (1M context) --- config/sidebar.php | 35 +++++++++++++++++++++++++---------- frontend/i18n/locales/fr.json | 4 +--- 2 files changed, 26 insertions(+), 13 deletions(-) diff --git a/config/sidebar.php b/config/sidebar.php index 9119b48..c160ef7 100644 --- a/config/sidebar.php +++ b/config/sidebar.php @@ -39,20 +39,29 @@ declare(strict_types=1); return [ // Section "Administration" : regroupe toutes les pages de configuration - // applicative (RBAC, users, sites, audit log). Gate implicite : si l'user - // n'a aucune des permissions item, la section se vide et disparait. - // Pour imposer un gate explicite (ex: "seuls les membres du groupe support - // voient l'administration"), ajouter ici : 'permission' => 'core.admin.access'. + // applicative (RBAC, users, sites, audit log). + // + // CONVENTION : "etre admin" = detenir au moins une permission admin-scoped. + // En pratique, le groupe `core.*` represente l'administration applicative + // (users, roles, audit_log) ; les autres permissions admin-scoped proviennent + // des modules qui exposent leur propre page d'admin dans cette section + // (ex: `sites.view`). Un user qui n'a AUCUNE de ces permissions n'a pas + // acces a l'administration. + // + // Gate implicite : tous les items de cette section declarent une `permission`. + // Sans aucune permission correspondante, tous les items sont filtres, la + // section devient vide et est automatiquement masquee par SidebarProvider + // (cf. la boucle de filtrage : section vide => `continue`). Inutile donc + // d'ajouter un gate explicite au niveau section tant que chaque item porte + // sa propre permission. + // + // Pour imposer un gate explicite supplementaire (ex: "seuls les membres du + // groupe support voient l'administration, meme s'ils ont des permissions + // individuelles"), ajouter : 'permission' => 'core.admin.access'. [ 'label' => 'sidebar.administration.section', 'icon' => 'mdi:cog-outline', 'items' => [ - [ - 'label' => 'sidebar.general.dashboard', - 'to' => '/', - 'icon' => 'mdi:view-dashboard-outline', - 'module' => 'core', - ], [ 'label' => 'sidebar.core.roles', 'to' => '/admin/roles', @@ -102,6 +111,12 @@ return [ 'label' => 'sidebar.account.section', 'icon' => 'mdi:account-circle-outline', 'items' => [ + [ + 'label' => 'sidebar.account.dashboard', + 'to' => '/', + 'icon' => 'mdi:view-dashboard-outline', + 'module' => 'core', + ], [ 'label' => 'sidebar.account.logout', 'to' => '/logout', diff --git a/frontend/i18n/locales/fr.json b/frontend/i18n/locales/fr.json index 6dbacb0..d562ed9 100644 --- a/frontend/i18n/locales/fr.json +++ b/frontend/i18n/locales/fr.json @@ -18,11 +18,9 @@ }, "account": { "section": "Mon compte", + "dashboard": "Tableau de bord", "logout": "Déconnexion" }, - "general": { - "dashboard": "Tableau de bord" - }, "commercial": { "section": "Commercial", "suppliers": "Répertoire fournisseurs"