feat(commercial) : filtres répertoire clients via drawer (recherche, catégories, sites, archivés)
Front : - Bouton « Filtres » (à droite d'Ajouter) ouvrant un drawer accordion (façon audit-log) : Recherche, Catégories (multi), Sites (multi), Statut (archivés). État brouillon → appliqué, 100 % local. Compteur de filtres actifs sur le bouton. - Suppression du toggle « Voir les archivés » (remplacé par le bool du drawer). - Export et liste partagent les mêmes filtres. - useClientsRepository redevient un simple wrapper de usePaginatedList. Back (contrat liste partagé liste + export) : - createListQueryBuilder : categoryCodes[] (OR), siteIds[] (clients ayant ≥1 adresse sur le site), archivedOnly (archives seules, prioritaire sur includeArchived). search inchangé. - ClientProvider + ClientExportController lisent les nouveaux params (valeur unique ou liste ?key[]=). Tests fonctionnels (catégories multi, site, archivés).
This commit is contained in:
@@ -1,4 +1,3 @@
|
||||
import { ref } from 'vue'
|
||||
import { usePaginatedList } from '~/shared/composables/usePaginatedList'
|
||||
|
||||
/**
|
||||
@@ -41,11 +40,8 @@ export interface Client {
|
||||
* sur la ressource `/clients` (RG-13 : pagination serveur obligatoire ; jamais
|
||||
* de chargement integral en memoire).
|
||||
*
|
||||
* N'ajoute qu'un seul comportement metier : le toggle « Voir les archivés ».
|
||||
* Desactive par defaut (la liste n'expose que les clients actifs — RG-1.24).
|
||||
* Active, il pousse le filtre serveur `?includeArchived=true` (consomme par le
|
||||
* ClientProvider, RG-1.25) et — garantie de `usePaginatedList` — retombe en
|
||||
* page 1.
|
||||
* Les filtres (recherche, categories, sites, archives) sont pilotes par la page
|
||||
* via `setFilters` du composable partage — la remise en page 1 est garantie.
|
||||
*
|
||||
* Volontairement PAR INSTANCE (pas de singleton module-level) : l'etat tableau
|
||||
* est propre a l'ecran Repertoire et meurt avec lui, comme tout consommateur de
|
||||
@@ -53,28 +49,5 @@ export interface Client {
|
||||
* gerer.
|
||||
*/
|
||||
export function useClientsRepository() {
|
||||
// Etat local du toggle « Voir les archivés » — JAMAIS reflete dans l'URL
|
||||
// (regle ABSOLUE n°6).
|
||||
const includeArchived = ref(false)
|
||||
|
||||
const list = usePaginatedList<Client>({ url: '/clients' })
|
||||
|
||||
/**
|
||||
* Bascule l'inclusion des clients archives et relance la liste. La remise
|
||||
* en page 1 est assuree par `setFilters` (usePaginatedList). Quand le toggle
|
||||
* repasse a false, on RETIRE le filtre (valeur `undefined`) plutot que
|
||||
* d'envoyer `includeArchived=false`, pour une query propre.
|
||||
*/
|
||||
async function setIncludeArchived(value: boolean): Promise<void> {
|
||||
includeArchived.value = value
|
||||
await list.setFilters(
|
||||
value ? { includeArchived: true } : { includeArchived: undefined },
|
||||
)
|
||||
}
|
||||
|
||||
return {
|
||||
...list,
|
||||
includeArchived,
|
||||
setIncludeArchived,
|
||||
}
|
||||
return usePaginatedList<Client>({ url: '/clients' })
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user