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:
@@ -29,11 +29,10 @@ describe('useClientsRepository', () => {
|
||||
mockGet.mockResolvedValue(makeHydra(25))
|
||||
})
|
||||
|
||||
it('charge /clients sans includeArchived par defaut (clients actifs)', async () => {
|
||||
it('cible la ressource /clients en page 1 par defaut', async () => {
|
||||
const repo = useClientsRepository()
|
||||
await repo.fetch()
|
||||
|
||||
expect(repo.includeArchived.value).toBe(false)
|
||||
expect(mockGet).toHaveBeenLastCalledWith(
|
||||
'/clients',
|
||||
{ page: 1, itemsPerPage: 10 },
|
||||
@@ -41,35 +40,42 @@ describe('useClientsRepository', () => {
|
||||
)
|
||||
})
|
||||
|
||||
it('pousse le filtre serveur includeArchived=true quand le toggle est actif', async () => {
|
||||
const repo = useClientsRepository()
|
||||
await repo.fetch()
|
||||
await repo.setIncludeArchived(true)
|
||||
|
||||
expect(repo.includeArchived.value).toBe(true)
|
||||
expect(mockGet).toHaveBeenLastCalledWith(
|
||||
'/clients',
|
||||
{ includeArchived: true, page: 1, itemsPerPage: 10 },
|
||||
expect.objectContaining({ toast: false }),
|
||||
)
|
||||
})
|
||||
|
||||
it('retombe en page 1 lorsqu on bascule le toggle archives', async () => {
|
||||
it('pousse les filtres du drawer (categories multi, sites, archives) et retombe en page 1', async () => {
|
||||
const repo = useClientsRepository()
|
||||
await repo.fetch()
|
||||
await repo.goToPage(2)
|
||||
expect(repo.currentPage.value).toBe(2)
|
||||
|
||||
await repo.setIncludeArchived(true)
|
||||
await repo.setFilters(
|
||||
{
|
||||
search: 'acme',
|
||||
'categoryCode[]': ['DISTRIBUTEUR', 'COURTIER'],
|
||||
'siteId[]': ['1', '2'],
|
||||
archivedOnly: true,
|
||||
},
|
||||
{ replace: true },
|
||||
)
|
||||
|
||||
expect(repo.currentPage.value).toBe(1)
|
||||
expect(mockGet).toHaveBeenLastCalledWith(
|
||||
'/clients',
|
||||
{
|
||||
search: 'acme',
|
||||
'categoryCode[]': ['DISTRIBUTEUR', 'COURTIER'],
|
||||
'siteId[]': ['1', '2'],
|
||||
archivedOnly: true,
|
||||
page: 1,
|
||||
itemsPerPage: 10,
|
||||
},
|
||||
expect.objectContaining({ toast: false }),
|
||||
)
|
||||
})
|
||||
|
||||
it('retire le filtre (query propre) quand le toggle repasse a false', async () => {
|
||||
it('repasse a une query propre apres reinitialisation des filtres', async () => {
|
||||
const repo = useClientsRepository()
|
||||
await repo.setIncludeArchived(true)
|
||||
await repo.setIncludeArchived(false)
|
||||
await repo.setFilters({ search: 'acme', archivedOnly: true }, { replace: true })
|
||||
await repo.setFilters({}, { replace: true })
|
||||
|
||||
expect(repo.includeArchived.value).toBe(false)
|
||||
expect(mockGet).toHaveBeenLastCalledWith(
|
||||
'/clients',
|
||||
{ page: 1, itemsPerPage: 10 },
|
||||
|
||||
Reference in New Issue
Block a user