diff --git a/apps/admin/icons/siren-on-slash-solid.svg b/apps/admin/icons/siren-on-slash-solid.svg new file mode 100644 index 00000000..bd610360 --- /dev/null +++ b/apps/admin/icons/siren-on-slash-solid.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/apps/admin/src/foster-families/db.server.ts b/apps/admin/src/foster-families/db.server.ts index 6f2f122d..4cb41daf 100644 --- a/apps/admin/src/foster-families/db.server.ts +++ b/apps/admin/src/foster-families/db.server.ts @@ -20,6 +20,7 @@ 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 { FosterFamilyEmergencies } from "#i/foster-families/search-params.js" export class MissingSpeciesToHostError extends Error {} export class InvalidAvailabilityDateError extends Error {} @@ -267,6 +268,14 @@ export class FosterFamilyDbDelegate { }) } + if (searchParams.emergencies.size > 0) { + where.push({ + OR: Array.from(searchParams.emergencies).map( + (emergencies) => FOSTER_FAMILY_EMERGENCIES_WHERE[emergencies], + ), + }) + } + if (searchParams.garden.size > 0) { where.push({ garden: { in: Array.from(searchParams.garden) } }) } @@ -345,6 +354,7 @@ type DataCreate = { comments: string | null displayName: string email: string + emergencies?: boolean garden: FosterFamilyGarden housing: FosterFamilyHousing phone: string @@ -361,6 +371,7 @@ type DataUpdate = { comments?: string | null displayName?: string email?: string + emergencies?: boolean garden?: FosterFamilyGarden housing?: FosterFamilyHousing isBanned?: boolean @@ -369,3 +380,15 @@ type DataUpdate = { speciesToHost?: Species[] zipCode?: string } + +const FOSTER_FAMILY_EMERGENCIES_WHERE: Record< + FosterFamilyEmergencies, + Prisma.FosterFamilyWhereInput +> = { + [FosterFamilyEmergencies.YES]: { + emergencies: true, + }, + [FosterFamilyEmergencies.NO]: { + emergencies: false, + }, +} diff --git a/apps/admin/src/foster-families/filter-form.tsx b/apps/admin/src/foster-families/filter-form.tsx index 07f4c3cd..0e13b0fc 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 { + FosterFamilyEmergencies, + FosterFamilySearchParams, +} from "#i/foster-families/search-params.js" import { Icon } from "#i/generated/icon.js" export function FosterFamilyFilters({ @@ -121,6 +124,48 @@ export function FosterFamilyFilters({ + ( + + ), + )} + > + + } + checked={fosterFamilySearchParams.emergencies.has( + FosterFamilyEmergencies.YES, + )} + onChange={() => {}} + /> + + } + checked={fosterFamilySearchParams.emergencies.has( + FosterFamilyEmergencies.NO, + )} + onChange={() => {}} + /> + + + + + + + Espèces à accueillir{" "} @@ -570,3 +576,33 @@ function GardenField({ ) } + +function EmergenciesField({ + defaultFosterFamily, +}: { + defaultFosterFamily?: DefaultFosterFamily +}) { + return ( + + + Accepte les accueils court terme et d'urgence + + + + + + + + + ) +} diff --git a/apps/admin/src/foster-families/search-params.ts b/apps/admin/src/foster-families/search-params.ts index 37ea0c27..317f393d 100644 --- a/apps/admin/src/foster-families/search-params.ts +++ b/apps/admin/src/foster-families/search-params.ts @@ -7,9 +7,15 @@ import { import { SearchParamsIO } from "@animeaux/search-params-io" import { zu } from "@animeaux/zod-utils" +export enum FosterFamilyEmergencies { + YES = "Y", + NO = "N", +} + export const FosterFamilySearchParams = SearchParamsIO.create({ keys: { availability: "a", + emergencies: "e", displayName: "q", garden: "garden", housing: "housing", @@ -24,6 +30,7 @@ export const FosterFamilySearchParams = SearchParamsIO.create({ return Schema.parse({ availability: SearchParamsIO.getValues(searchParams, keys.availability), displayName: SearchParamsIO.getValue(searchParams, keys.displayName), + emergencies: SearchParamsIO.getValues(searchParams, keys.emergencies), garden: SearchParamsIO.getValues(searchParams, keys.garden), housing: SearchParamsIO.getValues(searchParams, keys.housing), cities: SearchParamsIO.getValues(searchParams, keys.cities), @@ -45,6 +52,8 @@ export const FosterFamilySearchParams = SearchParamsIO.create({ SearchParamsIO.setValue(searchParams, keys.displayName, data.displayName) + SearchParamsIO.setValues(searchParams, keys.emergencies, data.emergencies) + SearchParamsIO.setValues(searchParams, keys.garden, data.garden) SearchParamsIO.setValues(searchParams, keys.housing, data.housing) @@ -78,6 +87,9 @@ const Schema = zu.object({ zu.searchParams.nativeEnum(FosterFamilyAvailability), ), displayName: zu.searchParams.string(), + emergencies: zu.searchParams.set( + zu.searchParams.nativeEnum(FosterFamilyEmergencies), + ), garden: zu.searchParams.set(zu.searchParams.nativeEnum(FosterFamilyGarden)), housing: zu.searchParams.set(zu.searchParams.nativeEnum(FosterFamilyHousing)), cities: zu.searchParams.set(zu.searchParams.string()), diff --git a/apps/admin/src/routes/_layout.foster-families.$id._index/route.tsx b/apps/admin/src/routes/_layout.foster-families.$id._index/route.tsx index c3471f0e..ed832246 100644 --- a/apps/admin/src/routes/_layout.foster-families.$id._index/route.tsx +++ b/apps/admin/src/routes/_layout.foster-families.$id._index/route.tsx @@ -68,6 +68,7 @@ export async function loader({ request, params }: LoaderFunctionArgs) { fosterFamily: prisma.fosterFamily.findUnique({ where: { id: paramsResult.data.id }, select: { + emergencies: true, address: true, availability: true, availabilityExpirationDate: true, diff --git a/apps/admin/src/routes/_layout.foster-families.$id._index/situation-card.tsx b/apps/admin/src/routes/_layout.foster-families.$id._index/situation-card.tsx index 7c1015a1..bbca1eff 100644 --- a/apps/admin/src/routes/_layout.foster-families.$id._index/situation-card.tsx +++ b/apps/admin/src/routes/_layout.foster-families.$id._index/situation-card.tsx @@ -118,6 +118,24 @@ export function SituationCard() { ].join("")} + + + } + > + + {fosterFamily.emergencies + ? "Accueil court terme et urgence : **Oui**" + : "Accueil court terme et urgence : **Non**"} + + diff --git a/apps/admin/src/routes/_layout.foster-families.$id.edit/action.server.ts b/apps/admin/src/routes/_layout.foster-families.$id.edit/action.server.ts index 985e5920..5da6eb7c 100644 --- a/apps/admin/src/routes/_layout.foster-families.$id.edit/action.server.ts +++ b/apps/admin/src/routes/_layout.foster-families.$id.edit/action.server.ts @@ -45,6 +45,9 @@ export async function action({ request, params }: ActionFunctionArgs) { paramsResult.data.id, { address: formData.data.address, + emergencies: + formData.data.emergencies === + ActionFormDataForUpdate.schema.shape.emergencies.Enum.YES, availability: formData.data.availability, availabilityExpirationDate: formData.data.availabilityExpirationDate ?? null, diff --git a/apps/admin/src/routes/_layout.foster-families.$id.edit/loader.server.ts b/apps/admin/src/routes/_layout.foster-families.$id.edit/loader.server.ts index d2f0f9c7..78e0c0bc 100644 --- a/apps/admin/src/routes/_layout.foster-families.$id.edit/loader.server.ts +++ b/apps/admin/src/routes/_layout.foster-families.$id.edit/loader.server.ts @@ -29,6 +29,7 @@ export async function loader({ request, params }: LoaderFunctionArgs) { where: { id: paramsResult.data.id }, select: { address: true, + emergencies: true, availability: true, availabilityExpirationDate: true, city: true, diff --git a/apps/admin/src/routes/_layout.foster-families.new/action.server.ts b/apps/admin/src/routes/_layout.foster-families.new/action.server.ts index a26b2060..7a05afcb 100644 --- a/apps/admin/src/routes/_layout.foster-families.new/action.server.ts +++ b/apps/admin/src/routes/_layout.foster-families.new/action.server.ts @@ -44,6 +44,9 @@ export async function action({ request }: ActionFunctionArgs) { comments: formData.data.comments || null, displayName: formData.data.displayName, email: formData.data.email, + emergencies: + formData.data.emergencies === + ActionFormData.schema.shape.emergencies.Enum.YES, garden: formData.data.garden, housing: formData.data.housing, phone: formData.data.phone, diff --git a/libs/prisma/migrations/20260601123113_add_foster_family_emergencies/migration.sql b/libs/prisma/migrations/20260601123113_add_foster_family_emergencies/migration.sql new file mode 100644 index 00000000..ae91ea06 --- /dev/null +++ b/libs/prisma/migrations/20260601123113_add_foster_family_emergencies/migration.sql @@ -0,0 +1,2 @@ +-- AlterTable +ALTER TABLE "FosterFamily" ADD COLUMN "emergencies" BOOLEAN NOT NULL DEFAULT false; diff --git a/libs/prisma/schema.prisma b/libs/prisma/schema.prisma index 82388918..8aa957d6 100644 --- a/libs/prisma/schema.prisma +++ b/libs/prisma/schema.prisma @@ -83,6 +83,7 @@ model FosterFamily { updatedAt DateTime @updatedAt activities Activity[] + emergencies Boolean @default(false) availability FosterFamilyAvailability @default(UNKNOWN) availabilityExpirationDate DateTime? comments String?