From b075f82162c27636c6c716695df17f4c35089aed Mon Sep 17 00:00:00 2001 From: sbellavoine Date: Mon, 3 Aug 2026 14:35:40 +0200 Subject: [PATCH] =?UTF-8?q?=E2=9C=A8=F0=9F=8F=A2=20Filter=20foster=20famil?= =?UTF-8?q?ies=20by=20ban=20status?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/admin/src/foster-families/db.server.ts | 17 +++ .../admin/src/foster-families/filter-form.tsx | 109 +++++++++++++----- .../src/foster-families/search-params.ts | 10 ++ 3 files changed, 108 insertions(+), 28 deletions(-) diff --git a/apps/admin/src/foster-families/db.server.ts b/apps/admin/src/foster-families/db.server.ts index 6f2f122d..f75dee50 100644 --- a/apps/admin/src/foster-families/db.server.ts +++ b/apps/admin/src/foster-families/db.server.ts @@ -20,10 +20,19 @@ import { import { orderByRank } from "#i/core/order-by-rank.js" import { prisma } from "#i/core/prisma.server.js" import type { FosterFamilySearchParams } from "#i/foster-families/search-params.js" +import { FosterFamilyBan } from "#i/foster-families/search-params.js" export class MissingSpeciesToHostError extends Error {} export class InvalidAvailabilityDateError extends Error {} +const FOSTER_FAMILY_BAN_WHERE: Record< + FosterFamilyBan, + Prisma.FosterFamilyWhereInput +> = { + [FosterFamilyBan.NO]: { isBanned: false }, + [FosterFamilyBan.YES]: { isBanned: true }, +} + export class FosterFamilyDbDelegate { async fuzzySearch( displayName: undefined | string, @@ -277,6 +286,14 @@ export class FosterFamilyDbDelegate { }) } + if (searchParams.ban.size > 0) { + where.push({ + OR: Array.from(searchParams.ban).map( + (ban) => FOSTER_FAMILY_BAN_WHERE[ban], + ), + }) + } + if (searchParams.speciesToHost != null) { where.push({ speciesToHost: { has: searchParams.speciesToHost }, diff --git a/apps/admin/src/foster-families/filter-form.tsx b/apps/admin/src/foster-families/filter-form.tsx index 07f4c3cd..2a5bb191 100644 --- a/apps/admin/src/foster-families/filter-form.tsx +++ b/apps/admin/src/foster-families/filter-form.tsx @@ -27,7 +27,10 @@ import { SORTED_GARDEN, SORTED_HOUSING, } from "#i/foster-families/housing.js" -import { FosterFamilySearchParams } from "#i/foster-families/search-params.js" +import { + FosterFamilyBan, + FosterFamilySearchParams, +} from "#i/foster-families/search-params.js" import { Icon } from "#i/generated/icon.js" export function FosterFamilyFilters({ @@ -91,34 +94,84 @@ export function FosterFamilyFilters({ ( - - ), - )} + count={ + fosterFamilySearchParams.availability.size + + fosterFamilySearchParams.ban.size + } + hiddenContent={ + <> + {Array.from(fosterFamilySearchParams.availability).map( + (availability) => ( + + ), + )} + + {Array.from(fosterFamilySearchParams.ban).map((ban) => ( + + ))} + + } > - - {SORTED_AVAILABILITIES.map((availability) => ( - } - checked={fosterFamilySearchParams.availability.has( - availability, - )} - onChange={() => {}} - /> - ))} - + + + Statut + + + {SORTED_AVAILABILITIES.map((availability) => ( + } + checked={fosterFamilySearchParams.availability.has( + availability, + )} + onChange={() => {}} + /> + ))} + + + + + Bannissement + + + } + checked={fosterFamilySearchParams.ban.has( + FosterFamilyBan.YES, + )} + onChange={() => {}} + /> + + } + checked={fosterFamilySearchParams.ban.has(FosterFamilyBan.NO)} + onChange={() => {}} + /> + + + { return Schema.parse({ availability: SearchParamsIO.getValues(searchParams, keys.availability), + ban: SearchParamsIO.getValues(searchParams, keys.ban), displayName: SearchParamsIO.getValue(searchParams, keys.displayName), garden: SearchParamsIO.getValues(searchParams, keys.garden), housing: SearchParamsIO.getValues(searchParams, keys.housing), @@ -70,6 +77,8 @@ export const FosterFamilySearchParams = SearchParamsIO.create({ ) SearchParamsIO.setValue(searchParams, keys.zipCode, data.zipCode) + + SearchParamsIO.setValues(searchParams, keys.ban, data.ban) }, }) @@ -77,6 +86,7 @@ const Schema = zu.object({ availability: zu.searchParams.set( zu.searchParams.nativeEnum(FosterFamilyAvailability), ), + ban: zu.searchParams.set(zu.searchParams.nativeEnum(FosterFamilyBan)), displayName: zu.searchParams.string(), garden: zu.searchParams.set(zu.searchParams.nativeEnum(FosterFamilyGarden)), housing: zu.searchParams.set(zu.searchParams.nativeEnum(FosterFamilyHousing)),