From 43c3220873c56f79175f20e996507913694e8992 Mon Sep 17 00:00:00 2001 From: tristan Date: Fri, 29 May 2026 16:40:00 +0200 Subject: [PATCH] feat(front) : add usePaginatedList composable + paginate all admin lists via MalioDataTable MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - frontend/shared/composables/usePaginatedList.ts : composable generique de liste paginee serveur (Hydra), branche directement sur MalioDataTable - 22 tests Vitest (navigation, bornes, parse Hydra, hors-borne, reset, filtres, tri, swallow erreur) - Migration des pages admin existantes : sites, users, roles, categories - Refactor de useCategoriesAdmin pour ne porter que le referentiel CategoryType (charge en une fois via ?pagination=false) - Etat page/tri/filtre 100% local dans le composable (respect regle ABSOLUE n°6 — pas de persistance URL) - Section dediee dans .claude/rules/frontend.md documentant le pattern obligatoire pour toute nouvelle liste ERP-73 — volet front de la pagination, depend du back ERP-72 deja merge. --- .claude/rules/frontend.md | 47 +++ .../__tests__/useCategoriesAdmin.spec.ts | 153 ++----- .../catalog/composables/useCategoriesAdmin.ts | 103 ++--- .../catalog/pages/admin/categories.vue | 39 +- frontend/modules/core/pages/admin/roles.vue | 41 +- frontend/modules/core/pages/admin/users.vue | 41 +- frontend/modules/sites/pages/admin/sites.vue | 43 +- .../__tests__/usePaginatedList.test.ts | 377 ++++++++++++++++++ .../shared/composables/usePaginatedList.ts | 327 +++++++++++++++ 9 files changed, 899 insertions(+), 272 deletions(-) create mode 100644 frontend/shared/composables/__tests__/usePaginatedList.test.ts create mode 100644 frontend/shared/composables/usePaginatedList.ts diff --git a/.claude/rules/frontend.md b/.claude/rules/frontend.md index 6c34164..fec9242 100644 --- a/.claude/rules/frontend.md +++ b/.claude/rules/frontend.md @@ -53,6 +53,53 @@ Tout affichage LISTE tabulaire (donnees metier paginees, CRUD admin) doit passer **Exception** : tableaux purement presentationnels non paginables (diff field/old/new, grille de comparaison, matrice RBAC d'admin, etc.) peuvent rester en `` HTML brut. +## Listes paginees (standard) — usePaginatedList obligatoire + +**Toute liste qui consomme une `GetCollection` API doit passer par `usePaginatedList`** (`frontend/shared/composables/usePaginatedList.ts`). Le composable est le pendant front de la regle ABSOLUE n°13 (« toute collection est paginee cote back ») : il consomme l'envelope Hydra (`member` / `totalItems` / `view`) et expose un etat reactif a brancher directement sur `MalioDataTable`. + +Pattern de reference : + +```ts +const { + items, + totalItems, + currentPage, + itemsPerPage, + itemsPerPageOptions, + fetch: loadList, + goToPage, + setItemsPerPage, +} = usePaginatedList({ url: '/my-resources' }) + +onMounted(loadList) +``` + +```vue + +``` + +Garanties offertes par le composable : +- Force `Accept: application/ld+json` → API Platform 4 renvoie bien `member` / `totalItems` (sans Accept, retour tableau plat sans pagination). +- Defaut 10 items/page, choix client 10 / 25 / 50, aligne sur le defaut serveur. +- Mutation `setFilters` / `setSort` / `setItemsPerPage` → retombe systematiquement en page 1. +- Cas limite « page hors borne apres filtre » : retombe automatiquement sur la derniere page valide (`tests/usePaginatedList.test.ts`). +- Etat 100 % local (refs internes a l'instance) — **jamais reflete dans l'URL**, conformement a la regle « Etat des tableaux — pas de persistance URL » ci-dessous. + +A NE PAS faire : +- Charger une collection complete via `?itemsPerPage=999` pour bypasser la pagination. Le seul cas legitime de retour complet est l'alimentation d'un `