Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -74,45 +74,27 @@
<script setup lang="ts">
import { mdiLink } from "@mdi/js"
import type { StandardSchemaV1Issue } from "@tanstack/vue-form"
import { Array as Array$, Option } from "effect-app"
import { computed, getCurrentInstance } from "vue"
import { useIntl } from "../../utils"
import { type OmegaError, type OmegaFormApi } from "./OmegaFormStuff"
import { type OmegaError } from "./OmegaFormStuff"

const instance = getCurrentInstance()
const vuetified = instance?.appContext.components["VAlert"]

const props = defineProps<
{
form: OmegaFormApi<any, any>
fieldMap: Map<string, { id: string; label: string }>
generalErrors: (Record<string, StandardSchemaV1Issue[]> | undefined)[]
errors: OmegaError[]
}
>()

const generalErrors = props.form.useStore((state) => state.errors)
const fieldMeta = props.form.useStore((state) => state.fieldMeta)
const errors = computed(() =>
Array$.filterMap(
Object
.entries(fieldMeta.value),
([key, m]): Option.Option<OmegaError> =>
((m as any).errors ?? []).length && props.fieldMap.get(key)?.id
? Option.some({
label: props.fieldMap.get(key)!.label,
inputId: props.fieldMap.get(key)!.id,
errors: ((m as any).errors ?? []).map((e: any) => e.message).filter(Boolean)
})
: Option.none()
)
)

const { trans } = useIntl()

const showedGeneralErrors = computed(() => {
if (!generalErrors.value) return []
if (!props.generalErrors) return []

return generalErrors
.value
return props
.generalErrors
.filter((record): record is Record<string, StandardSchemaV1Issue[]> => Boolean(record))
.flatMap((errorRecord) =>
Object
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,8 +7,6 @@ import { getTransformationFrom, useIntl } from "../../utils"
import { type OmegaFieldInternalApi } from "./InputProps"
import { type OF, type OmegaFormReturn } from "./useOmegaForm"

export type ShowErrorsOn = "onChange" | "onBlur" | "onSubmit"

export type BaseProps<From, TName extends DeepKeys<From>> = {
/** Will fallback to i18n when not specified */
label?: string
Expand Down
35 changes: 24 additions & 11 deletions packages/vue-components/src/components/OmegaForm/useOmegaForm.ts
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ import { MergedInputProps } from "./InputProps"
import OmegaArray from "./OmegaArray.vue"
import OmegaAutoGen from "./OmegaAutoGen.vue"
import OmegaErrorsInternal from "./OmegaErrorsInternal.vue"
import { BaseProps, DefaultTypeProps, type FormProps, generateMetaFromSchema, type MetaRecord, type NestedKeyOf, OmegaAutoGenMeta, OmegaError, type OmegaFormApi, OmegaFormState, OmegaInputProps, ShowErrorsOn } from "./OmegaFormStuff"
import { BaseProps, DefaultTypeProps, type FormProps, generateMetaFromSchema, type MetaRecord, type NestedKeyOf, OmegaAutoGenMeta, OmegaError, type OmegaFormApi, OmegaFormState, OmegaInputProps } from "./OmegaFormStuff"
import OmegaInput from "./OmegaInput.vue"
import OmegaForm from "./OmegaWrapper.vue"

Expand Down Expand Up @@ -73,14 +73,33 @@ const eHoc = (errorProps: {
): ConcreteComponent<P> {
return {
setup() {
const { fieldMap, form } = errorProps
const generalErrors = form.useStore((state) => state.errors)
const fieldMeta = form.useStore((state) => state.fieldMeta)
const errors = computed(() =>
Array.filterMap(
Object
.entries(fieldMeta.value),
([key, m]): Option.Option<OmegaError> =>
((m as any).errors ?? []).length && fieldMap.value.get(key)?.id
? Option.some({
label: fieldMap.value.get(key)!.label,
inputId: fieldMap.value.get(key)!.id,
errors: ((m as any).errors ?? []).map((e: any) => e.message).filter(Boolean)
})
: Option.none()
)
)

return {
...errorProps
generalErrors,
errors
}
},
render({ fieldMap, form }: any) {
render({ errors, generalErrors }: any) {
return h(WrappedComponent, {
form,
fieldMap,
errors,
generalErrors,
...this.$attrs
} as any, this.$slots)
}
Expand All @@ -90,7 +109,6 @@ const eHoc = (errorProps: {

export type OmegaConfig<T> = {
i18nNamespace?: string
showErrorsOn?: ShowErrorsOn

persistency?: {
/** Order of importance:
Expand Down Expand Up @@ -188,11 +206,6 @@ export interface OmegaFormReturn<
>,
never
>
// & {
// errors: readonly OmegaError[]
// generalErrors: (Record<string, StandardSchemaV1Issue[]> | undefined)[] | undefined
// showErrors: boolean
// }
& Partial<{}>
>
& import("vue").PublicProps
Expand Down
Loading