From a6c7189d2c892be961f4955cb138d99dd19f3165 Mon Sep 17 00:00:00 2001 From: Davide Di Pumpo Date: Wed, 22 Oct 2025 16:43:52 +0200 Subject: [PATCH 1/5] fup --- .../src/components/OmegaForm/blockDialog.ts | 7 +- .../stories/OmegaForm.stories.ts | 8 ++ .../OmegaForm/DialogBlockingExamples.vue | 73 +++++++++++++++++++ 3 files changed, 87 insertions(+), 1 deletion(-) create mode 100644 packages/vue-components/stories/OmegaForm/DialogBlockingExamples.vue diff --git a/packages/vue-components/src/components/OmegaForm/blockDialog.ts b/packages/vue-components/src/components/OmegaForm/blockDialog.ts index 9454a268d3..ca1e65076f 100644 --- a/packages/vue-components/src/components/OmegaForm/blockDialog.ts +++ b/packages/vue-components/src/components/OmegaForm/blockDialog.ts @@ -35,7 +35,12 @@ export const usePreventClose = (mkIsDirty: () => Ref) => { } export const useOnClose = (close: () => void) => { - const bus = provideBus() + // Use existing bus if available, otherwise provide a new one + let bus = injectBus() + if (!bus) { + bus = provideBus() + } + const onClose = () => { const evt: DialogClosing = {} bus.emit("dialog-closing", evt) diff --git a/packages/vue-components/stories/OmegaForm.stories.ts b/packages/vue-components/stories/OmegaForm.stories.ts index 0c99c1e77c..ee7ac06757 100644 --- a/packages/vue-components/stories/OmegaForm.stories.ts +++ b/packages/vue-components/stories/OmegaForm.stories.ts @@ -10,6 +10,7 @@ import ClearableComponent from "./OmegaForm/Clearable.vue" import ComplexFormComponent from "./OmegaForm/ComplexForm.vue" import CreateUseFormWithCustomInputComponent from "./OmegaForm/CreateUseFormWithCustomInput.vue" import DateComponent from "./OmegaForm/Date.vue" +import DialogBlockingExamplesComponent from "./OmegaForm/DialogBlockingExamples.vue" import EmailFormComponent from "./OmegaForm/EmailForm.vue" import FormInputComponent from "./OmegaForm/form.Input.vue" import IntersectionExampleComponent from "./OmegaForm/IntersectionExample.vue" @@ -199,3 +200,10 @@ export const SetErrorOnSubmit: Story = { template: "" }) } + +export const DialogBlockingExamples: Story = { + render: () => ({ + components: { DialogBlockingExamplesComponent }, + template: "" + }) +} diff --git a/packages/vue-components/stories/OmegaForm/DialogBlockingExamples.vue b/packages/vue-components/stories/OmegaForm/DialogBlockingExamples.vue new file mode 100644 index 0000000000..2427569c7d --- /dev/null +++ b/packages/vue-components/stories/OmegaForm/DialogBlockingExamples.vue @@ -0,0 +1,73 @@ + + + From dfdb4768df9e0c2bbeb66fd9ac4f730185d7f02d Mon Sep 17 00:00:00 2001 From: Davide Di Pumpo Date: Wed, 22 Oct 2025 17:15:26 +0200 Subject: [PATCH 2/5] feat: Add support for preventing dialog close events in OmegaForm Wrapper --- .../src/components/OmegaForm/OmegaWrapper.vue | 10 ++++++++++ .../src/components/OmegaForm/useOmegaForm.ts | 6 ++---- .../stories/OmegaForm/DialogBlockingExamples.vue | 3 --- 3 files changed, 12 insertions(+), 7 deletions(-) diff --git a/packages/vue-components/src/components/OmegaForm/OmegaWrapper.vue b/packages/vue-components/src/components/OmegaForm/OmegaWrapper.vue index bfc9306b3a..2d1faafef5 100644 --- a/packages/vue-components/src/components/OmegaForm/OmegaWrapper.vue +++ b/packages/vue-components/src/components/OmegaForm/OmegaWrapper.vue @@ -30,6 +30,7 @@ */ /* eslint-disable @typescript-eslint/no-explicit-any */ import { useStore } from "@tanstack/vue-form" +import { usePreventClose } from "./blockDialog" import { getOmegaStore } from "./getOmegaStore" import { type DefaultTypeProps, type OmegaFormApi, type OmegaFormState } from "./OmegaFormStuff" import { type OmegaFormReturn } from "./useOmegaForm" @@ -52,6 +53,15 @@ const subscribedValues = getOmegaStore( props.subscribe ) +if (!props.form.ignorePreventCloseEvents) { + console.log(props.form.ignorePreventCloseEvents) + usePreventClose(() => { + const v = props.form.useStore((state) => state.isDirty) + console.log(123, v) + return v + }) +} + defineSlots<{ default(props: { subscribedValues: typeof subscribedValues.value }): void }>() diff --git a/packages/vue-components/src/components/OmegaForm/useOmegaForm.ts b/packages/vue-components/src/components/OmegaForm/useOmegaForm.ts index 2128aa41f7..91d42f261c 100644 --- a/packages/vue-components/src/components/OmegaForm/useOmegaForm.ts +++ b/packages/vue-components/src/components/OmegaForm/useOmegaForm.ts @@ -129,6 +129,7 @@ export interface OF extends OmegaFormApi { meta: MetaRecord clear: () => void i18nNamespace?: string + ignorePreventCloseEvents?: boolean registerField: ( field: ComputedRef<{ name: string @@ -870,6 +871,7 @@ export const useOmegaForm = < const formWithExtras: OF = Object.assign(form, { i18nNamespace: omegaConfig?.i18nNamespace, + ignorePreventCloseEvents: omegaConfig?.ignorePreventCloseEvents, meta, clear, handleSubmit: (meta?: Record) => { @@ -886,10 +888,6 @@ export const useOmegaForm = < const errorContext = { form: formWithExtras, fieldMap } - if (!omegaConfig?.ignorePreventCloseEvents) { - usePreventClose(() => formWithExtras.useStore((state) => state.isDirty)) - } - return Object.assign(formWithExtras, { errorContext, Form: fHoc(formWithExtras)(OmegaForm as any) as any, diff --git a/packages/vue-components/stories/OmegaForm/DialogBlockingExamples.vue b/packages/vue-components/stories/OmegaForm/DialogBlockingExamples.vue index 2427569c7d..4f49330479 100644 --- a/packages/vue-components/stories/OmegaForm/DialogBlockingExamples.vue +++ b/packages/vue-components/stories/OmegaForm/DialogBlockingExamples.vue @@ -60,11 +60,8 @@ import { S } from "effect-app" import { ref } from "vue" import Dialog from "../../src/components/Dialog.vue" -import { provideBus } from "../../src/components/OmegaForm/blockDialog" import { useOmegaForm } from "../../src/components/OmegaForm/useOmegaForm" -provideBus() - const open = ref(false) const form = useOmegaForm( S.Struct({ name: S.String, email: S.String }), From 0a0876ba0658842787fe326fa780b82d3398940e Mon Sep 17 00:00:00 2001 From: Davide Di Pumpo Date: Wed, 22 Oct 2025 18:26:45 +0200 Subject: [PATCH 3/5] feat: Refactor Dialog and OmegaWrapper components for improved slot handling and prevent close functionality --- .../vue-components/src/components/Dialog.vue | 13 +++++++-- .../src/components/OmegaForm/OmegaWrapper.vue | 5 ++-- .../src/components/OmegaForm/useOmegaForm.ts | 1 - .../OmegaForm/DialogBlockingExamples.vue | 28 +++++++++++-------- 4 files changed, 30 insertions(+), 17 deletions(-) diff --git a/packages/vue-components/src/components/Dialog.vue b/packages/vue-components/src/components/Dialog.vue index 019dd47837..e39a6211dd 100644 --- a/packages/vue-components/src/components/Dialog.vue +++ b/packages/vue-components/src/components/Dialog.vue @@ -14,7 +14,7 @@