UNPKG

element-plus

Version:

A Component Library for Vue 3

1 lines 12.4 kB
{"version":3,"file":"form.vue2.mjs","sources":["../../../../../../packages/components/form/src/form.vue"],"sourcesContent":["<template>\n <form ref=\"formRef\" :class=\"formClasses\">\n <slot />\n </form>\n</template>\n\n<script lang=\"ts\" setup>\nimport { computed, provide, reactive, ref, toRefs, watch } from 'vue'\nimport { has } from 'lodash-unified'\nimport { debugWarn, getProp, isFunction } from '@element-plus/utils'\nimport { useNamespace } from '@element-plus/hooks'\nimport { useFormSize } from './hooks'\nimport { formContextKey } from './constants'\nimport { formEmits } from './form'\nimport { filterFields, useFormLabelWidth } from './utils'\n\nimport type { ValidateFieldsError } from 'async-validator'\nimport type { Arrayable } from '@element-plus/utils'\nimport type { FormProps } from './form'\nimport type {\n FormContext,\n FormItemContext,\n FormValidateCallback,\n FormValidationResult,\n} from './types'\nimport type { FormItemProp } from './form-item'\n\nconst COMPONENT_NAME = 'ElForm'\ndefineOptions({\n name: COMPONENT_NAME,\n})\nconst props = withDefaults(defineProps<FormProps>(), {\n labelPosition: 'right',\n requireAsteriskPosition: 'left',\n labelWidth: '',\n labelSuffix: '',\n showMessage: true,\n validateOnRuleChange: true,\n scrollIntoViewOptions: true,\n})\nconst emit = defineEmits(formEmits)\n\nconst formRef = ref<HTMLElement>()\nconst fields = reactive<FormItemContext[]>([])\n\nconst formSize = useFormSize()\nconst ns = useNamespace('form')\nconst formClasses = computed(() => {\n const { labelPosition, inline } = props\n return [\n ns.b(),\n ns.m(formSize.value || 'default'),\n {\n [ns.m(`label-${labelPosition}`)]: labelPosition,\n [ns.m('inline')]: inline,\n },\n ]\n})\n\nconst getField: FormContext['getField'] = (prop) => {\n return filterFields(fields, [prop])[0]\n}\n\nconst addField: FormContext['addField'] = (field) => {\n fields.push(field)\n}\n\nconst removeField: FormContext['removeField'] = (field) => {\n if (field.prop) {\n fields.splice(fields.indexOf(field), 1)\n }\n}\n\nconst setInitialValues: FormContext['setInitialValues'] = (\n initModel: Partial<typeof props.model>\n) => {\n if (!props.model) {\n debugWarn(COMPONENT_NAME, 'model is required for setInitialValues to work.')\n return\n }\n if (!initModel) {\n debugWarn(\n COMPONENT_NAME,\n 'initModel is required for setInitialValues to work.'\n )\n return\n }\n fields.forEach((field) => {\n if (field.prop) {\n // Check if the property path actually exists in initModel\n // This allows setting undefined/null values while skipping non-existent properties\n if (has(initModel, field.prop)) {\n const initValue = getProp(initModel, field.prop).value\n field.setInitialValue(initValue)\n }\n }\n })\n}\n\nconst resetFields: FormContext['resetFields'] = (properties = []) => {\n if (!props.model) {\n debugWarn(COMPONENT_NAME, 'model is required for resetFields to work.')\n return\n }\n filterFields(fields, properties).forEach((field) => field.resetField())\n}\n\nconst clearValidate: FormContext['clearValidate'] = (props = []) => {\n filterFields(fields, props).forEach((field) => field.clearValidate())\n}\n\nconst isValidatable = computed(() => {\n const hasModel = !!props.model\n if (!hasModel) {\n debugWarn(COMPONENT_NAME, 'model is required for validate to work.')\n }\n return hasModel\n})\n\nconst obtainValidateFields = (props: Arrayable<FormItemProp>) => {\n if (fields.length === 0) return []\n\n const filteredFields = filterFields(fields, props)\n if (!filteredFields.length) {\n debugWarn(COMPONENT_NAME, 'please pass correct props!')\n return []\n }\n return filteredFields\n}\n\nconst validate = async (\n callback?: FormValidateCallback\n): FormValidationResult => validateField(undefined, callback)\n\nconst doValidateField = async (\n props: Arrayable<FormItemProp> = []\n): Promise<boolean> => {\n if (!isValidatable.value) return false\n\n const fields = obtainValidateFields(props)\n if (fields.length === 0) return true\n\n let validationErrors: ValidateFieldsError = {}\n for (const field of fields) {\n try {\n await field.validate('')\n if (field.validateState === 'error' && !field.error) field.resetField()\n } catch (fields) {\n validationErrors = {\n ...validationErrors,\n ...(fields as ValidateFieldsError),\n }\n }\n }\n\n if (Object.keys(validationErrors).length === 0) return true\n return Promise.reject(validationErrors)\n}\n\nconst validateField: FormContext['validateField'] = async (\n modelProps = [],\n callback\n) => {\n let result = false\n const shouldThrow = !isFunction(callback)\n try {\n result = await doValidateField(modelProps)\n // When result is false meaning that the fields are not validatable\n if (result === true) {\n await callback?.(result)\n }\n return result\n } catch (e) {\n if (e instanceof Error) throw e\n\n const invalidFields = e as ValidateFieldsError\n\n if (props.scrollToError) {\n // form-item may be dynamically rendered based on the judgment conditions, and the order in invalidFields is uncertain.\n // Therefore, the first form field with an error is determined by directly looking for the rendered element.\n if (formRef.value) {\n const formItem = formRef.value.querySelector(`.${ns.b()}-item.is-error`)\n formItem?.scrollIntoView(props.scrollIntoViewOptions)\n }\n }\n !result && (await callback?.(false, invalidFields))\n return shouldThrow && Promise.reject(invalidFields)\n }\n}\n\nconst scrollToField = (prop: FormItemProp) => {\n const field = getField(prop)\n if (field) {\n field.$el?.scrollIntoView(props.scrollIntoViewOptions)\n }\n}\n\nwatch(\n () => props.rules,\n () => {\n if (props.validateOnRuleChange) {\n validate().catch((err) => debugWarn(err))\n }\n },\n { deep: true, flush: 'post' }\n)\n\nprovide(\n formContextKey,\n reactive({\n ...toRefs(props),\n emit,\n\n resetFields,\n clearValidate,\n validateField,\n getField,\n addField,\n removeField,\n setInitialValues,\n\n ...useFormLabelWidth(),\n })\n)\n\ndefineExpose({\n /**\n * @description Validate the whole form. Receives a callback or returns `Promise`.\n */\n validate,\n /**\n * @description Validate specified fields.\n */\n validateField,\n /**\n * @description Reset specified fields and remove validation result.\n */\n resetFields,\n /**\n * @description Clear validation message for specified fields.\n */\n clearValidate,\n /**\n * @description Scroll to the specified fields.\n */\n scrollToField,\n /**\n * @description Get a field context.\n */\n getField,\n /**\n * @description All fields context.\n */\n fields,\n /**\n * @description Set initial values for form fields. When `resetFields` is called, fields will reset to these values. Only fields present in `initModel` will be updated.\n */\n setInitialValues,\n})\n</script>\n"],"names":["props","fields","_createElementBlock","_renderSlot"],"mappings":"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"}