From 5343d0bd9dc1c46d6b34726ef1b9b102af7ece9b Mon Sep 17 00:00:00 2001 From: dswbx Date: Thu, 16 Jan 2025 10:30:28 +0100 Subject: [PATCH] allow bypassing entity data validation for unknown keys in useEntityForm --- app/src/data/entities/Entity.ts | 31 +++++++++++++------ .../ui/modules/data/hooks/useEntityForm.tsx | 6 +++- 2 files changed, 26 insertions(+), 11 deletions(-) diff --git a/app/src/data/entities/Entity.ts b/app/src/data/entities/Entity.ts index 4665322..a0bdb29 100644 --- a/app/src/data/entities/Entity.ts +++ b/app/src/data/entities/Entity.ts @@ -193,29 +193,40 @@ export class Entity< } // @todo: add tests - isValidData(data: EntityData, context: TActionContext, explain?: boolean): boolean { + isValidData( + data: EntityData, + context: TActionContext, + options?: { + explain?: boolean; + ignoreUnknown?: boolean; + } + ): boolean { if (typeof data !== "object") { - if (explain) { + if (options?.explain) { throw new Error(`Entity "${this.name}" data must be an object`); } } const fields = this.getFillableFields(context, false); - const field_names = fields.map((f) => f.name); - const given_keys = Object.keys(data); - if (given_keys.some((key) => !field_names.includes(key))) { - if (explain) { - throw new Error( - `Entity "${this.name}" data must only contain known keys, got: "${given_keys}"` - ); + if (options?.ignoreUnknown !== true) { + const field_names = fields.map((f) => f.name); + const given_keys = Object.keys(data); + const unknown_keys = given_keys.filter((key) => !field_names.includes(key)); + + if (unknown_keys.length > 0) { + if (options?.explain) { + throw new Error( + `Entity "${this.name}" data must only contain known keys, unknown: "${unknown_keys}"` + ); + } } } for (const field of fields) { if (!field.isValid(data[field.name], context)) { console.log("Entity.isValidData:invalid", context, field.name, data[field.name]); - if (explain) { + if (options?.explain) { throw new Error(`Field "${field.name}" has invalid data: "${data[field.name]}"`); } diff --git a/app/src/ui/modules/data/hooks/useEntityForm.tsx b/app/src/ui/modules/data/hooks/useEntityForm.tsx index 45432d7..ebef8c7 100644 --- a/app/src/ui/modules/data/hooks/useEntityForm.tsx +++ b/app/src/ui/modules/data/hooks/useEntityForm.tsx @@ -29,7 +29,11 @@ export function useEntityForm({ onSubmitAsync: async ({ value }): Promise => { try { //console.log("validating", value, entity.isValidData(value, action)); - entity.isValidData(value, action, true); + entity.isValidData(value, action, { + explain: true, + // unknown will later be removed in getChangeSet + ignoreUnknown: true + }); return undefined; } catch (e) { //console.log("---validation error", e);