diff --git a/config/packages/rate_limiter.yaml b/config/packages/rate_limiter.yaml index 39bcbec..30f1e86 100644 --- a/config/packages/rate_limiter.yaml +++ b/config/packages/rate_limiter.yaml @@ -8,3 +8,15 @@ framework: policy: sliding_window limit: 5 interval: '1 minute' + +when@test: + framework: + rate_limiter: + mcp_auth: + policy: sliding_window + limit: 10000 + interval: '1 minute' + login: + policy: sliding_window + limit: 10000 + interval: '1 minute' diff --git a/docs/superpowers/session-2026-04-04-ux-overhaul.md b/docs/superpowers/session-2026-04-04-ux-overhaul.md new file mode 100644 index 0000000..edeb6c6 --- /dev/null +++ b/docs/superpowers/session-2026-04-04-ux-overhaul.md @@ -0,0 +1,148 @@ +# Session 04-05 avril 2026 — Refonte UX/UI complète Inventory + +## Contexte +L'utilisateur (gestionnaire) remonte que les utilisateurs novices se perdent dans l'app Inventory (gestion d'inventaire industriel : machines, composants, pièces, produits). Ils découvrent le domaine ET l'app en même temps, remplissent les machines depuis de la documentation papier/PDF. + +## Ce qui a été fait + +### 1. Analyse UX/UI complète +- Exploration en profondeur des 65+ composants, toutes les pages, composables et patterns +- Diagnostic : navigation top-down uniquement, pas de liens inverses, pas de breadcrumbs, navbar mélange tout, pages trop longues, mode lecture ressemble à un formulaire disabled +- Identification de 23 améliorations organisées en 4 phases + +### 2. Spec rédigée +**Fichier :** `docs/superpowers/specs/2026-04-04-ux-overhaul-design.md` + +23 sections couvrant : +- Réorganisation navbar par domaine métier +- Breadcrumbs contextuels +- Liaisons inverses "Utilisé dans" +- Liens cliquables dans la hiérarchie machine +- Système d'onglets partagé (machine + composant + pièce + produit) +- Pages catalogue unifiées (catalogue + catégories en onglets) +- Recherche globale (**retirée** à la demande de l'utilisateur) +- Raccourcis clavier (**retirés** à la demande) +- Mode lecture texte brut, empty states, toasts, responsive, etc. + +### 3. Phase 1 — Quick wins (9 améliorations, 0 backend) + +**Plan :** `docs/superpowers/plans/2026-04-04-ux-quick-wins.md` + +| Changement | Fichiers modifiés | +|-----------|-------------------| +| Liens cliquables dans hiérarchie machine | ComponentItem, PieceItem, MachineProductsCard | +| Site → machines (badge cliquable) | SiteCard, index.vue | +| Retour contextuel (NuxtLink au lieu de router.back) | DetailHeader | +| Confirmations sur toutes les suppressions | CommentSection, machine/[id].vue | +| Header sticky composants expanded | ComponentItem | +| DataTable fixedLayout opt-in + minWidth | DataTable.vue, dataTable.ts | +| Mode lecture texte brut (26 div-inputs → `

`) | MachineInfoCard, 3 pages détail | +| Compteurs titres sections machine | MachineComponentsCard, MachinePiecesCard, MachineDocumentsCard | +| Cohérence fiches (liens catégorie + EntityVersionList) | 3 pages détail entité | + +**Review Phase 1 :** a détecté 4 issues corrigées : +- `component.entityId` → `component.composantId` (property n'existait pas) +- `piece.entityId` → `piece.pieceId` +- `table-fixed` global → opt-in via prop `fixedLayout` +- NuxtLinks sans `?from=machine&machineId=xxx` → ajouté + +### 4. Phase 2 — Refactoring structurel (7 améliorations) + +**Plan :** `docs/superpowers/plans/2026-04-04-ux-phase2-structural.md` + +| Changement | Fichiers créés/modifiés | +|-----------|------------------------| +| EntityTabs composant partagé | `components/common/EntityTabs.vue` (nouveau) | +| Onglets page machine + header compact | machine/[id].vue, MachineDetailHeader.vue | +| Onglets composant/pièce/produit | 3 pages détail | +| Pages catalogue unifiées /catalogues/* | 3 nouvelles pages + ManagementView modifié | +| Navbar réorganisée (Catalogues + Administration) | AppNavbar.vue | +| Breadcrumbs contextuels | `components/layout/AppBreadcrumb.vue` (nouveau), app.vue | +| Redirections legacy URLs | `middleware/legacy-redirects.global.ts` (nouveau) | +| Guard modifications non sauvegardées | `composables/useUnsavedGuard.ts` (nouveau) | + +### 5. Phase 3 — Harmonisation visuelle (3 améliorations) + +| Changement | Fichiers | +|-----------|----------| +| EmptyState composant partagé | `components/common/EmptyState.vue` (nouveau), 3 pages | +| Toasts erreur persistent + barre progression | useToast.ts, ToastContainer.vue | +| Responsive mobile (breadcrumbs tronqués, tabs scroll) | AppBreadcrumb, EntityTabs, vérification grids | + +### 6. Phase 4 — Backend + reverse links (6 améliorations) + +| Changement | Fichiers | +|-----------|----------| +| Endpoint `/api/{entity}/{id}/used-in` | `src/Controller/UsedInController.php` (nouveau) | +| UsedInSection frontend | `composables/useUsedIn.ts` + `components/common/UsedInSection.vue` (nouveaux), 3 pages détail | +| Endpoint `/api/constructeurs/stats` | `src/Controller/ConstructeurStatsController.php` (nouveau) | +| Page fournisseurs enrichie (compteurs cliquables) | constructeurs.vue | +| Endpoint `/api/model_types/{id}/related-items` | `src/Controller/ModelTypeRelatedItemsController.php` (nouveau) | +| Modal catégorie enrichie (machine count + liens) | RelatedItemsModal.vue | + +## Bugs découverts et corrigés en cours de route + +| Bug | Cause | Fix | +|-----|-------|-----| +| ` diff --git a/frontend/app/components/PieceItem.vue b/frontend/app/components/PieceItem.vue index 1bb461d..9dd391f 100644 --- a/frontend/app/components/PieceItem.vue +++ b/frontend/app/components/PieceItem.vue @@ -29,7 +29,17 @@

- {{ pieceData.name }} + + {{ pieceData.name }} + + — manquant + - - + type="button" + class="btn btn-ghost btn-sm md:btn-md" + title="Imprimer" + @click="$emit('open-print')" + > +

@@ -43,11 +49,16 @@ import IconLucideSquarePen from '~icons/lucide/square-pen' import IconLucideEye from '~icons/lucide/eye' import IconLucidePrinter from '~icons/lucide/printer' +import IconLucideArrowLeft from '~icons/lucide/arrow-left' -const router = useRouter() +const { canEdit } = usePermissions() -defineProps<{ +const props = defineProps<{ title: string + description?: string + siteName?: string + siteColor?: string + reference?: string isEditMode: boolean }>() @@ -56,12 +67,12 @@ defineEmits<{ 'open-print': [] }>() -function goBack() { - if (window.history.length > 1) { - router.back() +const siteStyle = computed(() => { + if (!props.siteColor) return {} + return { + borderColor: props.siteColor + '60', + backgroundColor: props.siteColor + '25', + color: props.siteColor, } - else { - navigateTo('/machines') - } -} +}) diff --git a/frontend/app/components/machine/MachineDocumentsCard.vue b/frontend/app/components/machine/MachineDocumentsCard.vue index 4986cb2..c62fb87 100644 --- a/frontend/app/components/machine/MachineDocumentsCard.vue +++ b/frontend/app/components/machine/MachineDocumentsCard.vue @@ -3,7 +3,10 @@
-

Documents de la machine

+

+ Documents de la machine + {{ documents.length }} +

Ajoutez ou consultez les documents liés à cette machine.

diff --git a/frontend/app/components/machine/MachineInfoCard.vue b/frontend/app/components/machine/MachineInfoCard.vue index 7f86f0c..f35938d 100644 --- a/frontend/app/components/machine/MachineInfoCard.vue +++ b/frontend/app/components/machine/MachineInfoCard.vue @@ -15,9 +15,9 @@ class="input input-bordered" @input="$emit('update:machine-name', ($event.target as HTMLInputElement).value)" /> -
+

{{ machineName }} -

+

@@ -152,9 +152,9 @@ diff --git a/frontend/app/components/machine/MachinePiecesCard.vue b/frontend/app/components/machine/MachinePiecesCard.vue index 68b157b..6f068f9 100644 --- a/frontend/app/components/machine/MachinePiecesCard.vue +++ b/frontend/app/components/machine/MachinePiecesCard.vue @@ -2,7 +2,10 @@
-

Pièces de la machine

+

+ Pièces de la machine + {{ pieces.length }} +