{"version":3,"file":"rockForm.obs.js","sources":["../../../Framework/Controls/rockForm.obs"],"sourcesContent":["<!-- Copyright by the Spark Development Network; Licensed under the Rock Community License -->\n<template>\n    <form @submit.prevent.stop=\"onInternalSubmit()\">\n        <RockValidation v-if=\"!hideErrors\" :errors=\"visibleErrors\" />\n        <slot />\n    </form>\n</template>\n\n<script setup lang=\"ts\">\n    import { PropType, reactive, ref, watch } from \"vue\";\n    import { FormError, FormState, provideFormState } from \"@Obsidian/Utility/form\";\n    import { updateRefValue } from \"@Obsidian/Utility/component\";\n    import RockValidation from \"./rockValidation.obs\";\n    import { isPromise } from \"@Obsidian/Utility/promiseUtils\";\n\n    const props = defineProps({\n        /** True if the form should attempt to submit. */\n        submit: {\n            type: Boolean as PropType<boolean>,\n            default: false\n        },\n\n        /** True if the validation errors should not be displayed. */\n        hideErrors: {\n            type: Boolean as PropType<boolean>,\n            default: false\n        },\n\n        /**\n         * This value can be used to reset the form to it's initial state.\n         * Any time this value changes the submission count and error list\n         * will be reset. This does not effect the values in the form controls.\n         */\n        formResetKey: {\n            type: String as PropType<string>,\n            default: \"\"\n        },\n\n        onSubmit: {\n            type: Function as PropType<(() => void | PromiseLike<void>)>,\n            required: false\n        },\n    });\n\n    const emit = defineEmits<{\n        // This contains all active errors even if the UI is not in sync.\n        (e: \"validationChanged\", errors: FormError[]): void;\n        // This contains just the errors that should be currently displayed in the UI.\n        (e: \"visibleValidationChanged\", errors: FormError[]): void;\n        (e: \"update:submit\", value: boolean): void;\n    }>();\n\n    const visibleErrors = ref<FormError[]>([]);\n    const errorValues = ref<FormError[]>([]);\n    const errors = ref<Record<string, FormError>>({});\n    const submit = ref(props.submit);\n\n    const onInternalSubmit = (): void => {\n        submit.value = true;\n    };\n\n    // Construct the form state.\n    const formState = reactive<FormState>({\n        submitCount: 0,\n        setError: (id: string, name: string, error: string): void => {\n            const newErrors = {\n                ...errors.value\n            };\n\n            // If this identifier has an error, then set the error.\n            // Otherwise clear the error.\n            if (error) {\n                newErrors[id] = {\n                    name,\n                    text: error\n                };\n            }\n            else {\n                delete newErrors[id];\n            }\n\n            updateRefValue(errors, newErrors);\n        }\n    });\n\n    provideFormState(formState);\n\n    // Watch for requests to submit from the parent component.\n    watch(() => props.submit, () => {\n        if (submit.value !== props.submit) {\n            submit.value = props.submit;\n        }\n    });\n\n    // Watch for any submit actions and check the validation.\n    watch(submit, async () => {\n        if (submit.value) {\n            formState.submitCount++;\n\n            // Update the visible errors.\n            visibleErrors.value = errorValues.value;\n            emit(\"visibleValidationChanged\", visibleErrors.value);\n\n            try {\n                if (Object.keys(errors.value).length === 0) {\n                    const submitHandler = props.onSubmit;\n\n                    if (submitHandler) {\n                        const result = submitHandler();\n\n                        if (isPromise(result)) {\n                            await result;\n                        }\n                    }\n                }\n            }\n            finally {\n                submit.value = false;\n            }\n        }\n\n        emit(\"update:submit\", submit.value);\n    });\n\n    // If any errors change then update the list of errors.\n    watch(errors, () => {\n        const values: FormError[] = [];\n\n        for (const key in errors.value) {\n            values.push(errors.value[key]);\n        }\n\n        errorValues.value = values;\n        emit(\"validationChanged\", errorValues.value);\n    });\n\n    watch(() => props.formResetKey, () => {\n        formState.submitCount = 0;\n        updateRefValue(errors, {});\n        updateRefValue(visibleErrors, []);\n        emit(\"visibleValidationChanged\", visibleErrors.value);\n    });\n</script>\n"],"names":["props","__props","emit","__emit","visibleErrors","ref","errorValues","errors","submit","onInternalSubmit","value","formState","reactive","submitCount","setError","id","name","error","newErrors","_objectSpread","text","updateRefValue","provideFormState","watch","_asyncToGenerator","Object","keys","length","submitHandler","onSubmit","result","isPromise","values","key","push","formResetKey"],"mappings":"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"}