Files
Starseed/config/sidebar.php
T
tristan 090ea5eb49
Auto Tag Develop / tag (push) Successful in 9s
feat(front) : page repertoire prestataires (ERP-140) (#102)
Page d'entree du pole Technique : repertoire prestataires (route /providers).

## Perimetre (ERP-140)
- Page `modules/technique/pages/providers/index.vue` (route /providers, titre i18n technique.providers.title).
- `MalioDataTable` branche sur `usePaginatedList<Provider>({ url: '/providers' })` : colonnes Nom / Categories / Site (badges) / Derniere activite (updatedAt, format JJ-MM-AAAA).
- Clic ligne -> /providers/{id} ; bouton + Ajouter -> /providers/new (gate technique.providers.manage).
- Drawer Filtres : recherche, categorie (type PRESTATAIRE), site, inclure archives. Etat 100% local (jamais dans l'URL).
- Bouton Exporter -> /api/providers/export.xlsx (memes filtres).
- Pagination standard 10/25/50.
- Composable `useProvidersRepository` + cles i18n `technique.providers.*`.

## Garde-fous
- `useApi()` uniquement, composants `Malio*`, pas de `<table>` brut, aucun texte FR en dur.
- Cloisonnement par site laisse au back.

## Tests
- `make nuxt-test` : 393/393 verts (dont 3 nouveaux sur useProvidersRepository : ciblage /providers, enveloppe Hydra, exclusion archives par defaut).
- ESLint clean.
- Note : `nuxi typecheck` non concluant dans l'env (develop produit deja ~303 erreurs d'auto-imports non resolus, independamment de cette branche). La page et le composable sont type-clean.

Reviewed-on: #102
Co-authored-by: tristan <tristan@yuno.malio.fr>
Co-committed-by: tristan <tristan@yuno.malio.fr>
2026-06-15 08:51:19 +00:00

164 lines
6.9 KiB
PHP

<?php
declare(strict_types=1);
/*
* Sidebar configuration.
*
* This file defines the sidebar sections displayed in the frontend.
*
* Each SECTION may declare :
* - `label` (required) : i18n key resolved by the frontend
* - `icon` (required) : MDI icon name
* - `items` (required) : list of items (see below)
* - `permission` (opt.) : RBAC permission code ; when set, the whole
* section (and every one of its items) is hidden
* from users who do not hold that permission.
* Use this for "umbrella" sections like
* Administration where you want to gate the
* entire group behind one coarse permission.
*
* Each ITEM may declare :
* - `label` (required) : i18n key
* - `to` (required) : Nuxt route
* - `icon` (required) : MDI icon name
* - `module` (required) : owner module ID ; item is hidden if the
* module is not listed in config/modules.php
* - `permission` (opt.) : RBAC permission code ; finer-grained gate
* applied in addition to the section-level one
*
* Precedence : section-level `permission` is evaluated first. If it fails,
* the whole section is skipped and every item's `to` is added to the
* `disabledRoutes` payload of /api/sidebar (so the front middleware can
* redirect any direct navigation). Individual items without their own
* permission are implicitly protected by the section-level one.
*
* This config is decoupled from the modules themselves: you can freely
* move an item from one section to another without touching the module code.
*/
return [
// Section "Commerciale" : pole metier principal, remontee en tete de sidebar (ERP-71).
// L'ordre interne des onglets et les permissions restent inchanges (simple deplacement
// du bloc, aucun gate touche).
[
'label' => 'sidebar.commercial.section',
'icon' => 'mdi:account-arrow-left-outline',
'items' => [
[
'label' => 'sidebar.commercial.suppliers',
'to' => '/suppliers',
'icon' => 'mdi:account-arrow-left-outline',
'module' => 'commercial',
'permission' => 'commercial.suppliers.view',
],
[
'label' => 'sidebar.commercial.clients',
'to' => '/clients',
'icon' => 'mdi:account-group-outline',
'module' => 'commercial',
'permission' => 'commercial.clients.view',
],
],
],
// Section "Technique" (M3, ERP-138) : pole distinct du Commercial, porte le
// repertoire prestataires. L'item est gate par `technique.providers.view` ;
// la section disparait automatiquement (SidebarProvider) si le module
// `technique` est desactive ou si l'user n'a pas la permission.
[
'label' => 'sidebar.technique.section',
'icon' => 'mdi:account-convert-outline',
'items' => [
[
'label' => 'sidebar.technique.providers',
'to' => '/providers',
'icon' => 'mdi:account-wrench-outline',
'module' => 'technique',
'permission' => 'technique.providers.view',
],
],
],
// Section "Administration" : regroupe toutes les pages de configuration
// 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.core.roles',
'to' => '/admin/roles',
'icon' => 'mdi:shield-account-outline',
'module' => 'core',
'permission' => 'core.roles.view',
],
[
'label' => 'sidebar.core.users',
'to' => '/admin/users',
'icon' => 'mdi:account-group-outline',
'module' => 'core',
'permission' => 'core.users.view',
],
[
'label' => 'sidebar.sites.admin',
'to' => '/admin/sites',
'icon' => 'mdi:domain',
'module' => 'sites',
'permission' => 'sites.view',
],
[
'label' => 'sidebar.catalog.categories',
'to' => '/admin/categories',
'icon' => 'mdi:tag-multiple-outline',
'module' => 'catalog',
'permission' => 'catalog.categories.view',
],
[
'label' => 'sidebar.core.audit_log',
'to' => '/admin/audit-log',
'icon' => 'mdi:clipboard-text-clock',
'module' => 'core',
'permission' => 'core.audit_log.view',
],
],
],
// Section "Mon compte" : espace personnel. Accessible a tout user authentifie
// (aucune permission RBAC requise, tous les items restent dans `core` pour
// rester toujours presents meme quand les modules metier sont desactives).
[
'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',
'icon' => 'mdi:logout',
'module' => 'core',
],
],
],
];