diff --git a/config/sidebar.php b/config/sidebar.php index 12d9a50..835e132 100644 --- a/config/sidebar.php +++ b/config/sidebar.php @@ -10,8 +10,11 @@ declare(strict_types=1); * - `permission` : section ou item masqué si la permission effective absente (RBAC fin — * `User::getEffectivePermissions()` ; ROLE_ADMIN bypasse via le voter, mais la * sidebar évalue les permissions effectives réelles — combiner avec `roles` au besoin). - * Les items contextuels (Kanban/Groupes/Archives), feature-flag (Documents, Mail) et user-flag + * Les items contextuels (Kanban/Groupes/Archives), feature-flag (Documents) et user-flag * (Mes absences) restent rendus côté layout, hors de cet endpoint. + * Mail est déclaré ici UNIQUEMENT pour le gating module (disabledRoutes si module inactif) ; + * son rendu visuel + badge non-lus reste géré côté layout, qui filtre `/mail` de translatedSections + * pour éviter le doublon. * Les labels sont des clés i18n (sidebar..). */ return [ @@ -23,6 +26,8 @@ return [ ['label' => 'sidebar.general.myTasks', 'to' => '/my-tasks', 'icon' => 'mdi:clipboard-check-outline', 'module' => 'project-management'], ['label' => 'sidebar.general.projects', 'to' => '/projects', 'icon' => 'mdi:folder-outline', 'module' => 'project-management'], ['label' => 'sidebar.general.timeTracking', 'to' => '/time-tracking', 'icon' => 'mdi:calendar-edit-outline', 'module' => 'time-tracking'], + // Gating module uniquement (cf. en-tête) : rendu visuel + badge gérés côté layout. + ['label' => 'sidebar.general.mail', 'to' => '/mail', 'icon' => 'mdi:email-outline', 'module' => 'mail'], ], ], [ diff --git a/frontend/app/layouts/default.vue b/frontend/app/layouts/default.vue index 7ae9da6..a7c1729 100644 --- a/frontend/app/layouts/default.vue +++ b/frontend/app/layouts/default.vue @@ -139,15 +139,20 @@ const route = useRoute() const { t } = useI18n() const { sections } = useSidebar() +// `/mail` est déclaré dans config/sidebar.php pour le gating module (disabledRoutes), +// mais son rendu visuel + badge non-lus est géré manuellement ci-dessous (feature-flag Mail). +// On le filtre des sections dynamiques pour éviter un doublon dans la nav. const translatedSections = computed(() => sections.value.map((section) => ({ label: t(section.label), icon: section.icon, - items: section.items.map((item) => ({ - label: t(item.label), - to: item.to, - icon: item.icon, - })), + items: section.items + .filter((item) => item.to !== '/mail') + .map((item) => ({ + label: t(item.label), + to: item.to, + icon: item.icon, + })), })), ) diff --git a/frontend/components/admin/AdminMailTab.vue b/frontend/components/admin/AdminMailTab.vue index 0d54a64..a6cecd5 100644 --- a/frontend/components/admin/AdminMailTab.vue +++ b/frontend/components/admin/AdminMailTab.vue @@ -140,7 +140,7 @@