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