From e9b79f40b0e6ff501ff76a18d88a7961228f632c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mert=20Bora=20=C4=B0nevi?= Date: Wed, 4 Mar 2026 13:29:49 +0100 Subject: [PATCH 1/2] Fix inconsistencies between client and server validation of blank strings --- fdm-app/app/components/blocks/auth/auth-formschema.tsx | 3 ++- fdm-app/app/components/blocks/cultivation/schema.ts | 2 +- .../blocks/fertilizer-applications/formschema.tsx | 2 +- fdm-app/app/components/blocks/fertilizer/formschema.tsx | 1 + fdm-app/app/components/blocks/field/schema.tsx | 1 + fdm-app/app/components/blocks/fields-new/schema.tsx | 7 ++++--- fdm-app/app/components/blocks/organization/schema.ts | 2 ++ fdm-app/app/lib/schemas/access.schema.ts | 2 +- .../farm.$b_id_farm.$calendar.field.$b_id.overview.tsx | 2 +- fdm-app/app/routes/farm.$b_id_farm.settings.properties.tsx | 3 ++- fdm-app/app/routes/farm.create._index.tsx | 2 ++ fdm-app/app/routes/welcome.tsx | 2 ++ 12 files changed, 20 insertions(+), 9 deletions(-) diff --git a/fdm-app/app/components/blocks/auth/auth-formschema.tsx b/fdm-app/app/components/blocks/auth/auth-formschema.tsx index 20f477af2..0aadb52e2 100644 --- a/fdm-app/app/components/blocks/auth/auth-formschema.tsx +++ b/fdm-app/app/components/blocks/auth/auth-formschema.tsx @@ -3,8 +3,9 @@ import z from "zod" export const FormSchema = z.object({ code: z .string({ - required_error: "Vul de verificatiecode in", + error: "Vul de verificatiecode in", }) + .trim() .min(8, { message: "De code moet uit 8 tekens bestaan", }) diff --git a/fdm-app/app/components/blocks/cultivation/schema.ts b/fdm-app/app/components/blocks/cultivation/schema.ts index d3212f173..19437b4c6 100644 --- a/fdm-app/app/components/blocks/cultivation/schema.ts +++ b/fdm-app/app/components/blocks/cultivation/schema.ts @@ -52,7 +52,7 @@ export type CultivationDetailsFormSchemaType = z.infer< > export const CultivationAddFormSchema = z.object({ - b_lu_catalogue: z.string().min(1, "Gewas is verplicht."), + b_lu_catalogue: z.string().trim().min(1, "Gewas is verplicht."), b_lu_start: z.preprocess( (val) => (typeof val === "string" ? new Date(val) : val), z.date({ diff --git a/fdm-app/app/components/blocks/fertilizer-applications/formschema.tsx b/fdm-app/app/components/blocks/fertilizer-applications/formschema.tsx index b4e573794..5b0337fbd 100644 --- a/fdm-app/app/components/blocks/fertilizer-applications/formschema.tsx +++ b/fdm-app/app/components/blocks/fertilizer-applications/formschema.tsx @@ -14,7 +14,7 @@ const fields = { error: "Hoeveelheid moet positief zijn", }), ), - p_app_method: z.string().min(1, "Toepassingsmethode is verplicht"), + p_app_method: z.string().trim().min(1, "Toepassingsmethode is verplicht"), p_app_date: z.preprocess( (val) => (typeof val === "string" ? new Date(val) : val), z.date({ diff --git a/fdm-app/app/components/blocks/fertilizer/formschema.tsx b/fdm-app/app/components/blocks/fertilizer/formschema.tsx index e950f640a..3b99803fa 100644 --- a/fdm-app/app/components/blocks/fertilizer/formschema.tsx +++ b/fdm-app/app/components/blocks/fertilizer/formschema.tsx @@ -9,6 +9,7 @@ export const FormSchema = z ? "Naam is verplicht" : "Ongeldige waarde", }) + .trim() .min(1, { error: "Geef een naam op voor deze meststof", }), diff --git a/fdm-app/app/components/blocks/field/schema.tsx b/fdm-app/app/components/blocks/field/schema.tsx index 714e62fb2..fb524a180 100644 --- a/fdm-app/app/components/blocks/field/schema.tsx +++ b/fdm-app/app/components/blocks/field/schema.tsx @@ -8,6 +8,7 @@ const FormSchema = z.object({ ? "Naam van perceel is verplicht" : undefined, }) + .trim() .min(3, { error: "Naam van perceel moet minimaal 3 karakters bevatten", }), diff --git a/fdm-app/app/components/blocks/fields-new/schema.tsx b/fdm-app/app/components/blocks/fields-new/schema.tsx index ddc804a85..534761483 100644 --- a/fdm-app/app/components/blocks/fields-new/schema.tsx +++ b/fdm-app/app/components/blocks/fields-new/schema.tsx @@ -3,18 +3,19 @@ import z from "zod" export const FormSchema = z.object({ b_name: z .string({ - required_error: "Naam van perceel is verplicht", + error: "Naam van perceel is verplicht", }) + .trim() .min(3, { message: "Naam van perceel moet minimaal 3 karakters bevatten", }), b_area: z.coerce .number({ - required_error: "Oppervlakte van perceel is verplicht", + error: "Oppervlakte van perceel is verplicht", }) .optional(), b_lu_catalogue: z.string({ - required_error: "Hoofdgewas is verplicht", + error: "Hoofdgewas is verplicht", }), b_bufferstrip: z.boolean().optional(), }) diff --git a/fdm-app/app/components/blocks/organization/schema.ts b/fdm-app/app/components/blocks/organization/schema.ts index 1ab701375..bb6f26222 100644 --- a/fdm-app/app/components/blocks/organization/schema.ts +++ b/fdm-app/app/components/blocks/organization/schema.ts @@ -24,6 +24,7 @@ export const FormSchema = z.object({ ? "Naam van de organisatie is verplicht" : undefined, }) + .trim() .min(3, { error: "Naam van de organisatie moet minimaal 3 karakters bevatten", }), @@ -34,6 +35,7 @@ export const FormSchema = z.object({ ? "ID van de organisatie is verplicht" : undefined, }) + .trim() .refine(isValidSlug, { error: "ID moet minimaal 3 karakters bevatten, enkel kleine letters, cijfers of '-'", }), diff --git a/fdm-app/app/lib/schemas/access.schema.ts b/fdm-app/app/lib/schemas/access.schema.ts index aa8ad4a0f..e26ea1530 100644 --- a/fdm-app/app/lib/schemas/access.schema.ts +++ b/fdm-app/app/lib/schemas/access.schema.ts @@ -4,7 +4,7 @@ export const AccessFormSchema = z.object({ email: z.email().optional(), username: z.string().optional(), role: z.enum(["owner", "advisor", "researcher"]).optional(), - invitation_id: z.string().min(1).optional(), + invitation_id: z.string().trim().min(1).optional(), intent: z.enum([ "invite_user", "update_role", diff --git a/fdm-app/app/routes/farm.$b_id_farm.$calendar.field.$b_id.overview.tsx b/fdm-app/app/routes/farm.$b_id_farm.$calendar.field.$b_id.overview.tsx index d1263e3cf..5db63e6f3 100644 --- a/fdm-app/app/routes/farm.$b_id_farm.$calendar.field.$b_id.overview.tsx +++ b/fdm-app/app/routes/farm.$b_id_farm.$calendar.field.$b_id.overview.tsx @@ -346,7 +346,7 @@ export async function action({ request, params }: ActionFunctionArgs) { // Form Schema const FormSchema = z .object({ - b_name: z.string().min(2, { + b_name: z.string().trim().min(2, { error: "Naam van perceel moet minimaal 2 karakters bevatten", }), b_acquiring_method: z.string({ diff --git a/fdm-app/app/routes/farm.$b_id_farm.settings.properties.tsx b/fdm-app/app/routes/farm.$b_id_farm.settings.properties.tsx index 4a0ca8f57..1633b7e76 100644 --- a/fdm-app/app/routes/farm.$b_id_farm.settings.properties.tsx +++ b/fdm-app/app/routes/farm.$b_id_farm.settings.properties.tsx @@ -326,13 +326,14 @@ export async function action({ request, params }: ActionFunctionArgs) { // Form Schema const FormSchema = z.object({ - b_name_farm: z.string().min(3, { + b_name_farm: z.string().trim().min(3, { error: "Naam van bedrijf moet minimaal 3 karakters bevatten", }), b_businessid_farm: z.string().optional(), b_address_farm: z.string().optional(), b_postalcode_farm: z .string() + .trim() .optional() .refine((value) => !value || isPostalCode(value, "NL"), { error: "Ongeldige postcode", diff --git a/fdm-app/app/routes/farm.create._index.tsx b/fdm-app/app/routes/farm.create._index.tsx index 4ac645807..d644645d9 100644 --- a/fdm-app/app/routes/farm.create._index.tsx +++ b/fdm-app/app/routes/farm.create._index.tsx @@ -76,6 +76,7 @@ const FormSchema = z ? "Naam van bedrijf is verplicht" : undefined, }) + .trim() .min(3, { error: "Naam van bedrijf moet minimaal 3 karakters bevatten", }), @@ -87,6 +88,7 @@ const FormSchema = z }), b_businessid_farm: z .string() + .trim() .regex(/^\d{8}$/, "KvK-nummer moet uit 8 cijfers bestaan") .optional() .or(z.literal("")), diff --git a/fdm-app/app/routes/welcome.tsx b/fdm-app/app/routes/welcome.tsx index 9c40fe082..026e45003 100644 --- a/fdm-app/app/routes/welcome.tsx +++ b/fdm-app/app/routes/welcome.tsx @@ -52,6 +52,7 @@ const FormSchema = z.object({ error: (issue) => issue.input === undefined ? "Vul je voornaam in" : undefined, }) + .trim() .min(1, { error: "Vul je voornaam in", }), @@ -60,6 +61,7 @@ const FormSchema = z.object({ error: (issue) => issue.input === undefined ? "Vul je achternaam in" : undefined, }) + .trim() .min(1, { error: "Vul je achternaam in", }), From 473156157610e623baa74813d8fdd7583cf76aa3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mert=20Bora=20=C4=B0nevi?= Date: Wed, 4 Mar 2026 13:49:56 +0100 Subject: [PATCH 2/2] Accept blank KVK number --- fdm-app/app/routes/farm.create._index.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/fdm-app/app/routes/farm.create._index.tsx b/fdm-app/app/routes/farm.create._index.tsx index d644645d9..be1af8168 100644 --- a/fdm-app/app/routes/farm.create._index.tsx +++ b/fdm-app/app/routes/farm.create._index.tsx @@ -91,7 +91,7 @@ const FormSchema = z .trim() .regex(/^\d{8}$/, "KvK-nummer moet uit 8 cijfers bestaan") .optional() - .or(z.literal("")), + .or(z.string().trim().length(0)), has_derogation: z.coerce.boolean().default(false), derogation_start_year: z.preprocess( (val) => (val === "" ? undefined : val),