From a59b4c615908d4bfd9ca7467407ce4f39aa66ee8 Mon Sep 17 00:00:00 2001 From: Davide Di Pumpo Date: Fri, 31 Oct 2025 16:19:33 +0100 Subject: [PATCH 1/2] Fixes empty string validation --- .../src/components/OmegaForm/OmegaFormStuff.ts | 11 ++++++++--- .../vue-components/stories/OmegaForm/SimpleForm.vue | 2 +- 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/packages/vue-components/src/components/OmegaForm/OmegaFormStuff.ts b/packages/vue-components/src/components/OmegaForm/OmegaFormStuff.ts index 855c480c7f..3ca5ab3c7d 100644 --- a/packages/vue-components/src/components/OmegaForm/OmegaFormStuff.ts +++ b/packages/vue-components/src/components/OmegaForm/OmegaFormStuff.ts @@ -761,9 +761,14 @@ export const generateInputStandardSchemaFromFieldMeta = ( } if (meta.required) { - schema.annotations({ - message: () => trans("validation.empty") - }) + schema = schema + .annotations({ + message: () => trans("validation.empty") + }) + .pipe(S.minLength(1)) + .annotations({ + message: () => trans("validation.empty") + }) } if (meta.maxLength) { diff --git a/packages/vue-components/stories/OmegaForm/SimpleForm.vue b/packages/vue-components/stories/OmegaForm/SimpleForm.vue index 5d9d179c3f..b13dd84b24 100644 --- a/packages/vue-components/stories/OmegaForm/SimpleForm.vue +++ b/packages/vue-components/stories/OmegaForm/SimpleForm.vue @@ -31,7 +31,7 @@ import { useOmegaForm } from "../../src/components/OmegaForm" const schema = S.Struct({ asder2: S.Struct({ - value: S.String + value: S.NonEmptyString100 }) }) const form = useOmegaForm(schema, { From 5b35fa1554d86d6903b2798c7afc9286e2b1826d Mon Sep 17 00:00:00 2001 From: Davide Di Pumpo Date: Fri, 31 Oct 2025 16:19:40 +0100 Subject: [PATCH 2/2] tests --- .changeset/ripe-rooms-cough.md | 5 ++ .../OmegaForm/EmptyStringValidation.test.ts | 76 +++++++++++++++++++ 2 files changed, 81 insertions(+) create mode 100644 .changeset/ripe-rooms-cough.md create mode 100644 packages/vue-components/__tests__/OmegaForm/EmptyStringValidation.test.ts diff --git a/.changeset/ripe-rooms-cough.md b/.changeset/ripe-rooms-cough.md new file mode 100644 index 0000000000..3f4430602d --- /dev/null +++ b/.changeset/ripe-rooms-cough.md @@ -0,0 +1,5 @@ +--- +"@effect-app/vue-components": patch +--- + +Fixes empty string validation diff --git a/packages/vue-components/__tests__/OmegaForm/EmptyStringValidation.test.ts b/packages/vue-components/__tests__/OmegaForm/EmptyStringValidation.test.ts new file mode 100644 index 0000000000..a0dc1d1c23 --- /dev/null +++ b/packages/vue-components/__tests__/OmegaForm/EmptyStringValidation.test.ts @@ -0,0 +1,76 @@ +import { mount } from "@vue/test-utils" +import { S } from "effect-app" +import { describe, it } from "vitest" +import { useOmegaForm } from "../../src/components/OmegaForm" +import OmegaIntlProvider from "../OmegaIntlProvider.vue" + +describe("Empty string validation for nested NonEmptyString fields", () => { + it("demonstrates current empty string behavior", async () => { + const schema = S.Struct({ + asder2: S.Struct({ + value: S.NonEmptyString100 + }) + }) + + const wrapper = mount({ + components: { + OmegaIntlProvider + }, + template: ` + + + + + + `, + setup() { + const form = useOmegaForm(schema, { + defaultValues: { + asder2: { + value: "" + } + }, + onSubmit: async ({ value }) => { + console.log("Form submitted with:", value) + } + }) + return { form } + } + }) + + await wrapper.vm.$nextTick() + + // Click submit with empty string + await wrapper.find("[data-testid='submit']").trigger("click") + await wrapper.vm.$nextTick() + + // Check for validation error + expect(wrapper.text()).toContain("validation.empty") + }) +})