diff --git a/src/lib/components/dictionary/test/config/test-form-config.js b/src/lib/components/dictionary/test/config/test-form-config.js index 49a9aae..ba8db75 100644 --- a/src/lib/components/dictionary/test/config/test-form-config.js +++ b/src/lib/components/dictionary/test/config/test-form-config.js @@ -73,8 +73,32 @@ export const testCalSchema = z } }); -export const testGroupSchema = z.object({ - Members: z.string().optional() +export const testGroupSchema = z + .object({ + Members: z + .array( + z.object({ + id: z.number(), + value: z.string(), + }) + ) + .optional() + }) + .superRefine((data, ctx) => { + if (!data.Members) return; + + const values = data.Members.map(m => m.value).filter(Boolean); + const duplicates = values.filter((v, i) => values.indexOf(v) !== i); + + if (duplicates.length) { + const uniqueDuplicates = [...new Set(duplicates)]; + + ctx.addIssue({ + code: z.ZodIssueCode.custom, + message: `Duplicate member : ${uniqueDuplicates.join(", ")}`, + path: ["Members"] + }); + } }); export const refNumSchema = z @@ -284,7 +308,7 @@ export const testCalDefaultErrors = { }; export const testGroupDefaultErrors = { - Members: 'fdsa', + Members: null, } export const refNumDefaultErrors = { @@ -618,7 +642,7 @@ export const testGroupFormFields = [ type: 'row', columns: [ { - key: 'Member', + key: 'Members', label: 'Member Test', required: false, type: 'members', diff --git a/src/lib/components/dictionary/test/page/tabs/group.svelte b/src/lib/components/dictionary/test/page/tabs/group.svelte index 9dd05a5..dcea5bb 100644 --- a/src/lib/components/dictionary/test/page/tabs/group.svelte +++ b/src/lib/components/dictionary/test/page/tabs/group.svelte @@ -17,10 +17,10 @@ // function removeMember(id) { // members = members.filter((m) => m.id !== id); // } -// $inspect(props.groupFormState.form) +// $inspect(props.groupFormState.form.Members) function removeMember(id) { - props.groupFormState.form.Members = - props.groupFormState.form.Members.filter((m) => m.id !== id); + props.groupFormState.form.Members = props.groupFormState.form.Members.filter((m) => m.id !== id); + props.groupFormState.validateField?.("Members", props.groupFormState.form.Members, false); } diff --git a/src/lib/components/reusable/form/dictionary-form-renderer.svelte b/src/lib/components/reusable/form/dictionary-form-renderer.svelte index 13dcc3d..2739bbc 100644 --- a/src/lib/components/reusable/form/dictionary-form-renderer.svelte +++ b/src/lib/components/reusable/form/dictionary-form-renderer.svelte @@ -654,6 +654,12 @@ ); } }} + onValueChange={() => { + console.log(key); + if (validateOn?.includes('input')) { + formState.validateField?.(key, formState.form[key], false); + } + }} > {selectedLabel} @@ -704,7 +710,7 @@ placeholder="Custom field type: {type}" /> {/if} -
+
{#if key !== 'FormulaCode' && (formState.errors[key] || formState.errors[txtKey])} {@const errorMessage = formState.errors[key] ?? formState.errors[txtKey]}