From 9bc0140b9ad59243076d279b6375a06819bc8dcd Mon Sep 17 00:00:00 2001 From: Corentin JOGUET Date: Thu, 18 Jun 2026 15:00:54 +0200 Subject: [PATCH] feat(admin): ecran Roles humanise (#53) --- src/app/Views/admin/roles/form.php | 152 ++++++++++++++++++++------ src/app/Views/admin/roles/index.php | 37 +++++-- src/public/admin/assets/css/admin.css | 45 ++++++++ 3 files changed, 189 insertions(+), 45 deletions(-) diff --git a/src/app/Views/admin/roles/form.php b/src/app/Views/admin/roles/form.php index a8eb864..d06b82b 100644 --- a/src/app/Views/admin/roles/form.php +++ b/src/app/Views/admin/roles/form.php @@ -9,6 +9,10 @@ declare(strict_types=1); * donc pas de `name[]` ni de JS. Toute soumission exige le PIN equipier (RG-T13). * Le `code` est editable a la creation, fige a l'edition (immuable). * + * Presentation humanisee (option a) : les permissions sont regroupees par domaine + * et libellees en francais ICI (la base reste la source des codes) ; canal et page + * d'accueil sont des listes deroulantes. Les NOMS de champs postes sont inchanges. + * * @var int $roleId * @var bool $isAdminRole * @var array> $permissions catalogue {id, code, label} @@ -41,11 +45,79 @@ $val = static fn (string $k): string => htmlspecialchars((string) ($vals[$k] ?? $err = static fn (string $k): string => isset($errs[$k]) && is_string($errs[$k]) ? htmlspecialchars($errs[$k], ENT_QUOTES, 'UTF-8') : ''; $selectedSource = (string) ($vals['order_source'] ?? ''); $active = (bool) ($vals['is_active'] ?? true); + +// --- Correspondances humaines (presentation seule) --- +// Canal de commande : enum technique -> libelle parlant. +$canalLabels = ['kiosk' => 'Borne', 'counter' => 'Comptoir', 'drive' => 'Drive']; +$canalLabel = static fn (string $enum): string => $canalLabels[$enum] ?? $enum; + +// Pages proposees comme page d'accueil (liste deroulante) : chemin -> libelle. +$routeOptions = [ + '/admin/dashboard' => 'Tableau de bord', + '/admin/stats' => 'Statistiques', + '/admin/products' => 'Produits', + '/admin/menus' => 'Menus', + '/admin/ingredients' => 'Stock', + '/admin/categories' => 'Categories', + '/admin/users' => 'Comptes', + '/admin/roles' => 'Roles', +]; +$currentRoute = (string) ($vals['default_route'] ?? ''); +// Toujours pouvoir reselectionner la valeur courante meme si hors liste (ex. seed). +if ($currentRoute !== '' && !isset($routeOptions[$currentRoute])) { + $routeOptions[$currentRoute] = $currentRoute; +} + +// Permissions : code technique -> [groupe, action]. La base reste la source des codes. +$permMap = [ + 'product.read' => ['Produits', 'Voir'], + 'product.create' => ['Produits', 'Creer'], + 'product.update' => ['Produits', 'Modifier'], + 'product.delete' => ['Produits', 'Supprimer'], + 'menu.read' => ['Menus', 'Voir'], + 'menu.create' => ['Menus', 'Creer'], + 'menu.update' => ['Menus', 'Modifier'], + 'menu.delete' => ['Menus', 'Supprimer'], + 'category.manage' => ['Catalogue & recettes', 'Gerer les categories'], + 'ingredient.manage' => ['Catalogue & recettes', 'Gerer les ingredients et recettes'], + 'stock.read' => ['Stock', 'Voir'], + 'stock.count' => ['Stock', "Faire l'inventaire"], + 'stock.manage' => ['Stock', 'Reapprovisionner'], + 'order.read' => ['Commandes', 'Voir'], + 'order.create' => ['Commandes', 'Creer'], + 'order.deliver' => ['Commandes', 'Livrer'], + 'order.cancel' => ['Commandes', 'Annuler'], + 'user.read' => ['Comptes', 'Voir'], + 'user.create' => ['Comptes', 'Creer'], + 'user.update' => ['Comptes', 'Modifier'], + 'user.deactivate' => ['Comptes', 'Desactiver'], + 'role.manage' => ['Roles & statistiques', 'Gerer les roles'], + 'stats.read' => ['Roles & statistiques', 'Voir les statistiques'], +]; +$groupOrder = ['Produits', 'Menus', 'Catalogue & recettes', 'Stock', 'Commandes', 'Comptes', 'Roles & statistiques', 'Autres']; + +// Regroupe le catalogue recu par domaine humain. +$grouped = []; +foreach ($perms as $p) { + $code = (string) ($p['code'] ?? ''); + $map = $permMap[$code] ?? ['Autres', (string) ($p['label'] ?? $code)]; + $grouped[$map[0]][] = [ + 'id' => (int) ($p['id'] ?? 0), + 'action' => $map[1], + 'checked' => in_array((int) ($p['id'] ?? 0), $selPerms, true), + ]; +} ?> @@ -53,20 +125,21 @@ $active = (bool) ($vals['is_active'] ?? true);
- - - -

- - -

Le code est immuable apres creation.

- + + +

- - -

+ + + +

Identifiant technique (sans espace), non modifiable apres creation.

+

+ + +

Identifiant technique, non modifiable apres creation.

+
@@ -75,60 +148,69 @@ $active = (bool) ($vals['is_active'] ?? true);
- - + + +

L'ecran affiche a cette personne quand elle se connecte.

- + +

Les commandes prises par ce role sont rattachees a ce canal.

- +
- Permissions + Droits d'acces +

Cochez ce que ce role est autorise a faire.

-
- - - +
+ + +
+

+ + + +
- Sources de tableau de bord visibles + Canaux visibles sur le tableau de bord -
- Re-autorisation (PIN equipier) + Confirmation par PIN
- +
diff --git a/src/app/Views/admin/roles/index.php b/src/app/Views/admin/roles/index.php index cdc65e3..3580e63 100644 --- a/src/app/Views/admin/roles/index.php +++ b/src/app/Views/admin/roles/index.php @@ -4,6 +4,8 @@ declare(strict_types=1); /** * Liste des roles (RBAC, role.manage), injectee dans admin/layout.php. Texte echappe. + * Presentation humanisee : page d'accueil et canal affiches en clair (la base garde + * les chemins / enums techniques). * * @var array> $roles */ @@ -11,11 +13,25 @@ declare(strict_types=1); /** @var array> $rows */ $rows = isset($roles) && is_array($roles) ? $roles : []; $esc = static fn (mixed $v): string => htmlspecialchars((string) $v, ENT_QUOTES, 'UTF-8'); + +$routeLabels = [ + '/admin/dashboard' => 'Tableau de bord', + '/admin/stats' => 'Statistiques', + '/admin/products' => 'Produits', + '/admin/menus' => 'Menus', + '/admin/ingredients' => 'Stock', + '/admin/categories' => 'Categories', + '/admin/users' => 'Comptes', + '/admin/roles' => 'Roles', +]; +$canalLabels = ['kiosk' => 'Borne', 'counter' => 'Comptoir', 'drive' => 'Drive']; +$routeHuman = static fn (string $r): string => $r === '' ? '—' : ($routeLabels[$r] ?? $r); +$canalHuman = static fn (?string $s): string => ($s === null || $s === '') ? '—' : ($canalLabels[$s] ?? $s); ?>