From 22dd9796d0b1304ad138ab6b8f998ad6ba705f63 Mon Sep 17 00:00:00 2001 From: sbellavoine Date: Wed, 18 Feb 2026 11:30:34 +0100 Subject: [PATCH 1/2] =?UTF-8?q?=E2=9A=99=EF=B8=8F=20Migrate=20Prisma=20fro?= =?UTF-8?q?m=20`yarn`=20to=20`pnpm`?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- libs/prisma/package.json | 7 +++---- libs/prisma/scripts/seed-data.ts | 24 ++++++++++++------------ 2 files changed, 15 insertions(+), 16 deletions(-) diff --git a/libs/prisma/package.json b/libs/prisma/package.json index cb07e7e7..3e70291b 100644 --- a/libs/prisma/package.json +++ b/libs/prisma/package.json @@ -29,10 +29,9 @@ "download-all-data": "tsx -r dotenv-flow/config ./scripts/download-all-data.ts", "lint": "run-p --continue-on-error --print-label lint:*", "lint:types": "tsc --noEmit", - "migrate": "yarn prisma-env migrate dev", - "prisma-env": "node -r dotenv-flow/config ./node_modules/.bin/prisma", - "reset": "yarn prisma-env migrate reset -f", - "studio": "yarn prisma-env studio" + "migrate": "prisma migrate dev", + "reset": "prisma migrate reset -f", + "studio": "prisma studio" }, "prisma": { "seed": "tsx -r dotenv-flow/config ./scripts/seed-data.ts" diff --git a/libs/prisma/scripts/seed-data.ts b/libs/prisma/scripts/seed-data.ts index 4e8ae3ae..a5476233 100755 --- a/libs/prisma/scripts/seed-data.ts +++ b/libs/prisma/scripts/seed-data.ts @@ -32,6 +32,18 @@ import { DateTime } from "luxon"; const DEFAULT_PASSWORD = "NotASword1!"; +const ACTIVE_ANIMAL_STATUS: Status[] = [ + Status.OPEN_TO_ADOPTION, + Status.OPEN_TO_RESERVATION, + Status.RESERVED, + Status.RETIRED, + Status.UNAVAILABLE, +]; + +const NON_ACTIVE_ANIMAL_STATUS: Status[] = Object.values(Status).filter( + (status) => !ACTIVE_ANIMAL_STATUS.includes(status), +); + console.log("🌱 Seeding data..."); const prisma = new PrismaClient(); @@ -382,18 +394,6 @@ function createEventInput({ }; } -const ACTIVE_ANIMAL_STATUS: Status[] = [ - Status.OPEN_TO_ADOPTION, - Status.OPEN_TO_RESERVATION, - Status.RESERVED, - Status.RETIRED, - Status.UNAVAILABLE, -]; - -const NON_ACTIVE_ANIMAL_STATUS: Status[] = Object.values(Status).filter( - (status) => !ACTIVE_ANIMAL_STATUS.includes(status), -); - async function seedAnimals() { await Promise.all([ seeds.users, From a921277af49299af9838813f798862d50995989e Mon Sep 17 00:00:00 2001 From: sbellavoine Date: Sun, 19 Oct 2025 19:36:42 +0200 Subject: [PATCH 2/2] =?UTF-8?q?=E2=9C=A8=F0=9F=8F=A2=20Add=20foster=20fami?= =?UTF-8?q?lies=20emergencies?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/admin/src/foster-families/db.server.ts | 9 ++++ .../admin/src/foster-families/emergencies.tsx | 49 +++++++++++++++++++ .../admin/src/foster-families/filter-form.tsx | 36 ++++++++++++++ apps/admin/src/foster-families/form.tsx | 41 ++++++++++++++++ .../src/foster-families/search-params.ts | 8 +++ .../route.tsx | 1 + .../situation-card.tsx | 14 ++++++ .../action.server.ts | 1 + .../loader.server.ts | 1 + .../migration.sql | 5 ++ libs/prisma/schema.prisma | 7 +++ 11 files changed, 172 insertions(+) create mode 100644 apps/admin/src/foster-families/emergencies.tsx create mode 100644 libs/prisma/migrations/20260202113802_add_foster_family_emergencies/migration.sql diff --git a/apps/admin/src/foster-families/db.server.ts b/apps/admin/src/foster-families/db.server.ts index 4784a3dc..bade9b33 100644 --- a/apps/admin/src/foster-families/db.server.ts +++ b/apps/admin/src/foster-families/db.server.ts @@ -12,6 +12,7 @@ import { prisma } from "#i/core/prisma.server"; import type { FosterFamilySearchParams } from "#i/foster-families/search-params"; import type { FosterFamily, + FosterFamilyEmergencies, FosterFamilyGarden, FosterFamilyHousing, Species, @@ -266,6 +267,12 @@ export class FosterFamilyDbDelegate { }); } + if (searchParams.emergencies.size > 0) { + where.push({ + emergencies: { in: Array.from(searchParams.emergencies) }, + }); + } + if (searchParams.garden.size > 0) { where.push({ garden: { in: Array.from(searchParams.garden) } }); } @@ -338,6 +345,7 @@ export class FosterFamilyDbDelegate { type DataCreate = { address: string; + emergencies?: FosterFamilyEmergencies; availability: FosterFamilyAvailability; availabilityExpirationDate: Date | null; city: string; @@ -354,6 +362,7 @@ type DataCreate = { type DataUpdate = { address?: string; + emergencies?: FosterFamilyEmergencies; availability?: FosterFamilyAvailability; availabilityExpirationDate?: Date | null; city?: string; diff --git a/apps/admin/src/foster-families/emergencies.tsx b/apps/admin/src/foster-families/emergencies.tsx new file mode 100644 index 00000000..9fd5a913 --- /dev/null +++ b/apps/admin/src/foster-families/emergencies.tsx @@ -0,0 +1,49 @@ +import { Icon } from "#i/generated/icon"; +import { cn } from "@animeaux/core"; +import { FosterFamilyEmergencies } from "@animeaux/prisma"; +import type { Except } from "type-fest"; + +export const SORTED_EMERGENCIES = [ + FosterFamilyEmergencies.YES, + FosterFamilyEmergencies.NO, + FosterFamilyEmergencies.UNKNOWN, +]; + +export const EMERGENCIES_TRANSLATION: Record = + { + [FosterFamilyEmergencies.NO]: "Non", + [FosterFamilyEmergencies.YES]: "Oui", + [FosterFamilyEmergencies.UNKNOWN]: "Inconnu", + }; + +export const ICON_BY_EMERGENCIES: Record< + FosterFamilyEmergencies, + React.ReactNode +> = { + [FosterFamilyEmergencies.NO]: , + [FosterFamilyEmergencies.YES]: , + [FosterFamilyEmergencies.UNKNOWN]: , +}; + +export function EmergenciesIcon({ + emergencies, + className, + ...props +}: Except, "href"> & { + emergencies: FosterFamilyEmergencies; +}) { + return ( + + ); +} + +const ICON_CLASS_NAMES_BY_EMERGENCIES: Record = + { + [FosterFamilyEmergencies.YES]: cn("text-green-600"), + [FosterFamilyEmergencies.NO]: cn("text-red-500"), + [FosterFamilyEmergencies.UNKNOWN]: cn("text-gray-800"), + }; diff --git a/apps/admin/src/foster-families/filter-form.tsx b/apps/admin/src/foster-families/filter-form.tsx index 611cb19c..468921d5 100644 --- a/apps/admin/src/foster-families/filter-form.tsx +++ b/apps/admin/src/foster-families/filter-form.tsx @@ -17,6 +17,11 @@ import { AvailabilityIcon, SORTED_AVAILABILITIES, } from "#i/foster-families/availability"; +import { + EMERGENCIES_TRANSLATION, + EmergenciesIcon, + SORTED_EMERGENCIES, +} from "#i/foster-families/emergencies"; import { GARDEN_TRANSLATION, HOUSING_TRANSLATION, @@ -120,6 +125,37 @@ export function FosterFamilyFilters({ + ( + + ), + )} + > + + {SORTED_EMERGENCIES.map((emergencies) => ( + } + checked={fosterFamilySearchParams.emergencies.has(emergencies)} + onChange={() => {}} + /> + ))} + + + + + + + Commentaires privés @@ -569,3 +580,33 @@ function GardenField({ ); } + +function Emergencies({ + defaultFosterFamily, +}: { + defaultFosterFamily?: DefaultFosterFamily; +}) { + return ( + + + Accepte les accueils court terme et d'urgence + + + + {SORTED_EMERGENCIES.map((emergencies) => ( + + ))} + + + ); +} diff --git a/apps/admin/src/foster-families/search-params.ts b/apps/admin/src/foster-families/search-params.ts index d345bc64..c861634b 100644 --- a/apps/admin/src/foster-families/search-params.ts +++ b/apps/admin/src/foster-families/search-params.ts @@ -1,5 +1,6 @@ import { FosterFamilyAvailability, + FosterFamilyEmergencies, FosterFamilyGarden, FosterFamilyHousing, Species, @@ -10,6 +11,7 @@ import { zu } from "@animeaux/zod-utils"; export const FosterFamilySearchParams = SearchParamsIO.create({ keys: { availability: "a", + emergencies: "e", displayName: "q", garden: "garden", housing: "housing", @@ -24,6 +26,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), @@ -49,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); @@ -82,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 49905a3f..99d6817c 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 @@ -66,6 +66,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 60779afb..ba63620c 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 @@ -14,6 +14,7 @@ import { Icon } from "#i/generated/icon"; import { joinReactNodes } from "@animeaux/core"; import { FosterFamilyAvailability, + FosterFamilyEmergencies, FosterFamilyGarden, FosterFamilyHousing, } from "@animeaux/prisma"; @@ -113,6 +114,12 @@ export function SituationCard() { ].join("")} + + }> + + {[TEXT_BY_EMERGENCY[fosterFamily.emergencies]].join("")} + + @@ -131,3 +138,10 @@ const TEXT_BY_GARDEN: Record = { [FosterFamilyGarden.UNKNOWN]: "", [FosterFamilyGarden.YES]: ", avec **jardin**", }; + +const TEXT_BY_EMERGENCY: Record = { + [FosterFamilyEmergencies.NO]: "Accueil court terme et urgence : **Non**", + [FosterFamilyEmergencies.YES]: "Accueil court terme et urgence : **Oui**", + [FosterFamilyEmergencies.UNKNOWN]: + "Accueil court terme et urgence : **Inconnu**", +}; 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 972d1d0a..063cff6e 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 @@ -43,6 +43,7 @@ export async function action({ request, params }: ActionFunctionArgs) { paramsResult.data.id, { address: formData.data.address, + emergencies: formData.data.emergencies, 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 fc564180..ee564abe 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 @@ -27,6 +27,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/libs/prisma/migrations/20260202113802_add_foster_family_emergencies/migration.sql b/libs/prisma/migrations/20260202113802_add_foster_family_emergencies/migration.sql new file mode 100644 index 00000000..0a3fe278 --- /dev/null +++ b/libs/prisma/migrations/20260202113802_add_foster_family_emergencies/migration.sql @@ -0,0 +1,5 @@ +-- CreateEnum +CREATE TYPE "FosterFamilyEmergencies" AS ENUM ('NO', 'YES', 'UNKNOWN'); + +-- AlterTable +ALTER TABLE "FosterFamily" ADD COLUMN "emergencies" "FosterFamilyEmergencies" NOT NULL DEFAULT 'UNKNOWN'; diff --git a/libs/prisma/schema.prisma b/libs/prisma/schema.prisma index afc35df1..afec5c5c 100644 --- a/libs/prisma/schema.prisma +++ b/libs/prisma/schema.prisma @@ -84,6 +84,7 @@ model FosterFamily { updatedAt DateTime @updatedAt activities Activity[] + emergencies FosterFamilyEmergencies @default(UNKNOWN) availability FosterFamilyAvailability @default(UNKNOWN) availabilityExpirationDate DateTime? comments String? @@ -110,6 +111,12 @@ enum FosterFamilyAvailability { UNKNOWN } +enum FosterFamilyEmergencies { + NO + YES + UNKNOWN +} + enum FosterFamilyHousing { FLAT HOUSE