{"version":3,"file":"form.vue2.mjs","sources":["../../../../../../packages/components/form/src/form.vue"],"sourcesContent":["<script lang=\"ts\">\n  import { computed, defineComponent, provide, reactive, toRefs, watch } from 'vue'\n  import { getComponentNamespace, getNamespace } from '../../../utils/global-config'\n  import type { Arrayable } from '../../../utils/types'\n  import { formContextKey } from './constants'\n\n  import { formProps } from './form'\n  import { filterFields } from './utils'\n\n  import type { FormItemProp } from './form-item'\n  import type {\n    FormContext,\n    FormItemContext,\n    FormValidateCallback,\n    FormValidateFailure,\n    FormValidationResult\n  } from './types'\n\n  export default defineComponent({\n    name: getComponentNamespace('Form'),\n    props: formProps,\n    emits: ['validate', 'submit'],\n    setup(props, { emit }) {\n      const ns = getNamespace('form')\n      const cls = computed(() => [\n        ns,\n        `${ns}--${props.labelPosition}`,\n        props.inline && `${ns}--inline`\n      ])\n\n      const fields: FormItemContext[] = []\n\n      // 将form-item组件挂载的验证对象保存到form中，方便通过ref直接调用验证器\n      const addField: FormContext['addField'] = (field) => {\n        fields.push(field)\n      }\n\n      // 移除校验对象 在form-item组件销毁时调用\n      const removeField: FormContext['removeField'] = (field) => {\n        if (field.prop) {\n          fields.splice(fields.indexOf(field), 1)\n        }\n      }\n\n      // 重制表单验证对象\n      const resetFields: FormContext['resetFields'] = (properties = []) => {\n        if (!props.model) {\n          console.error('请传入数据源，绑定到form上的model属性。')\n          return\n        }\n        filterFields(fields, properties).forEach((field) => field.resetField())\n      }\n\n      // 请空表单验证对象\n      const clearValidate: FormContext['clearValidate'] = (props = []) => {\n        filterFields(fields, props).forEach((field) => field.clearValidate())\n      }\n\n      const isValidatable = computed(() => {\n        const hasModel = !!props.model\n        if (!hasModel) {\n          console.log('请传入form上model数据')\n        }\n        return hasModel\n      })\n\n      // 通过props来筛选可以进行验证表单对象\n      const obtainValidateFields = (props: Arrayable<FormItemProp>) => {\n        if (fields.length === 0) return []\n        const filteredFields = filterFields(fields, props)\n        if (!filteredFields.length) {\n          console.error('请传入正确的校验属性，检查form上的rules对象和form-item上的prop属性')\n          return []\n        }\n        return filteredFields\n      }\n\n      const doValidateField = async (props: Arrayable<FormItemProp>): Promise<boolean> => {\n        if (!isValidatable.value) return false\n\n        const fields = obtainValidateFields(props)\n        // 没有验证规则 直接通过验证\n        if (fields.length === 0) return true\n\n        let validationErrors: any = {}\n        for (const field of fields) {\n          try {\n            // 全部都需要验证 不指定trigger类型\n            await field.validate('')\n          } catch (fields) {\n            // 合并所有的验证错误\n            validationErrors = {\n              ...validationErrors,\n              ...(fields as any)\n            }\n          }\n        }\n\n        if (Object.keys(validationErrors).length === 0) return true\n        return Promise.reject(validationErrors)\n      }\n\n      const validateField: FormContext['validateField'] = async (modelProps = [], callback) => {\n        try {\n          const result = await doValidateField(modelProps)\n          if (result === true) {\n            callback?.(result)\n          }\n          return result\n        } catch (e) {\n          // 验证失败\n          if (e instanceof Error) throw e\n          callback?.(false, e)\n          return false\n        }\n      }\n\n      // 验证器，可给外部提供这一方法，直接验证保存在fields中的验证对象\n      const validate = async (callback?: FormValidateCallback): FormValidationResult =>\n        validateField(undefined, callback)\n\n      watch(\n        () => props.rules,\n        () => {\n          if (props.validateOnRuleChange) {\n            validate().catch((error: FormValidateFailure) => {\n              console.log(error)\n            })\n          }\n        },\n        { deep: true }\n      )\n\n      const labelWidth = computed(() => {\n        const labelWidth = props.labelWidth\n        return labelWidth\n      })\n\n      // todo 待完善\n      const handleSubmit = (e: Event) => {\n        validate().then((res) => {\n          if (res) {\n            emit('submit', e)\n          }\n        })\n      }\n\n      provide(\n        formContextKey,\n        reactive({\n          ...toRefs(props),\n          emit,\n          resetFields,\n          clearValidate,\n          validateField,\n          addField,\n          removeField,\n\n          labelWidth\n        })\n      )\n\n      return {\n        cls,\n        validate,\n        resetFields,\n        validateField,\n        clearValidate,\n        handleSubmit\n      }\n    },\n    expose: ['validate', 'resetFields', 'validateField', 'clearValidate']\n  })\n</script>\n\n<template>\n  <form :class=\"cls\" @submit.prevent=\"handleSubmit\">\n    <slot></slot>\n  </form>\n</template>\n"],"names":["props","fields","labelWidth"],"mappings":"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"}