From cb6d2d72ec675a6e9e3e23f4e7c9101386081bdf Mon Sep 17 00:00:00 2001 From: tristan Date: Mon, 20 Apr 2026 17:00:34 +0200 Subject: [PATCH] feat(admin) : filtres + pagination serveur sur /admin/users/sites/roles MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Ajoute le filtrage par colonne et la pagination negociee via query params sur les 3 DataTables admin existantes. Tout est cote serveur (API Platform SearchFilter + BooleanFilter) pour scaler naturellement. Backend : - api_platform.yaml : scan du mapping Sites + pagination_client_items_per_page (avec borne max 100 pour proteger contre les payloads exagerement grands). - User : SearchFilter username (partial), rbacRoles.code (exact), sites.name (exact) + BooleanFilter isAdmin. - Site : SearchFilter name/city/postalCode (partial). - Role : SearchFilter label/code (partial), permissions.code (exact). (BooleanFilter isSystem deja present.) Frontend : - Composable useDataTableServerState (shared) : singleton de page/perPage/ filters avec debounce 300ms sur les filters, fetch immediat sur page/ perPage, reset page=1 au changement filter, token anti-race-condition. - Pages admin : chaque filtre dans un slot #header-{key} (input text avec debounce, select mono-selection pour les relations). Font-size 20px sur les inputs de filtre. - /admin/users : colonne Sites + filtre Sites conditionnes par useModules().isModuleActive('sites') — preserve l'invariant "module desactivable sans casse". Tests : 215/215 PHPUnit (14 nouveaux filtres/pagination) + 48/48 Vitest (8 nouveaux useDataTableServerState). Co-Authored-By: Claude Opus 4.7 (1M context) --- config/packages/api_platform.yaml | 18 +- frontend/modules/core/pages/admin/roles.vue | 122 ++++++++--- frontend/modules/core/pages/admin/users.vue | 164 +++++++++++--- frontend/modules/sites/pages/admin/sites.vue | 71 ++++-- .../__tests__/useDataTableServerState.test.ts | 203 +++++++++++++++++ .../composables/useDataTableServerState.ts | 149 +++++++++++++ src/Module/Core/Domain/Entity/Role.php | 8 + src/Module/Core/Domain/Entity/User.php | 14 ++ src/Module/Sites/Domain/Entity/Site.php | 9 + tests/Module/Core/Api/AdminFiltersApiTest.php | 205 ++++++++++++++++++ 10 files changed, 875 insertions(+), 88 deletions(-) create mode 100644 frontend/shared/composables/__tests__/useDataTableServerState.test.ts create mode 100644 frontend/shared/composables/useDataTableServerState.ts create mode 100644 tests/Module/Core/Api/AdminFiltersApiTest.php diff --git a/config/packages/api_platform.yaml b/config/packages/api_platform.yaml index fc3d6a9..4b14bfc 100644 --- a/config/packages/api_platform.yaml +++ b/config/packages/api_platform.yaml @@ -1,14 +1,15 @@ api_platform: title: Coltura API version: 1.0.0 - # Scan du module Core pour decouvrir les classes ApiResource et ApiFilter. - # Ajouter un chemin par module lors de l'ajout d'entites ApiResource dans d'autres modules. - # Sans ces paths, le compile pass d'API Platform ne declare pas les - # services de filtres annotes (les filtres etaient silencieusement - # ignores sur Permission — cf. ticket #344). + # Scan des modules pour decouvrir les classes ApiResource et ApiFilter. + # Ajouter un chemin par module lors de l'ajout d'entites ApiResource + # dans d'autres modules. Sans ces paths, le compile pass d'API Platform + # ne declare pas les services de filtres annotes (les filtres etaient + # silencieusement ignores sur Permission — cf. ticket #344). mapping: paths: - '%kernel.project_dir%/src/Module/Core/Domain/Entity' + - '%kernel.project_dir%/src/Module/Sites/Domain/Entity' formats: jsonld: ['application/ld+json'] json: ['application/json'] @@ -18,3 +19,10 @@ api_platform: stateless: true cache_headers: vary: ['Content-Type', 'Authorization', 'Origin'] + # Active la negociation client de la pagination via ?itemsPerPage=X + # (necessaire pour le dropdown perPage des DataTable admin). Borne + # haute a 100 pour eviter qu'un client abuse en demandant 10000 + # items d'un coup — les UIs admin n'ont jamais besoin de plus de 50 + # en pratique. + pagination_client_items_per_page: true + pagination_maximum_items_per_page: 100 diff --git a/frontend/modules/core/pages/admin/roles.vue b/frontend/modules/core/pages/admin/roles.vue index ec1beff..da8c7ab 100644 --- a/frontend/modules/core/pages/admin/roles.vue +++ b/frontend/modules/core/pages/admin/roles.vue @@ -14,16 +14,68 @@ /> - + + + + + + @@ -59,7 +111,7 @@ diff --git a/frontend/modules/core/pages/admin/users.vue b/frontend/modules/core/pages/admin/users.vue index bd61e56..d2ec3b9 100644 --- a/frontend/modules/core/pages/admin/users.vue +++ b/frontend/modules/core/pages/admin/users.vue @@ -7,16 +7,77 @@ - + + + + + +