{"version":3,"file":"form.mjs","sources":["../../../../../../../packages/components/form/src/form.tsx"],"sourcesContent":["import { type ExtractPropTypes, type PropType, defineComponent } from 'vue'\n\n// Utils\nimport {\n  createNamespace,\n  numericProp,\n  preventDefault,\n  truthProp,\n} from '@xzx-design/utils'\n\nimport { useChildren, useExpose } from '@xzx-design/hooks'\n\n// Types\nimport { FORM_KEY } from './types'\nimport type {\n  FieldTextAlign,\n  FieldValidateError,\n  FieldValidateTrigger,\n  FieldValidationStatus,\n} from '../../field'\n\nimport type { FormExpose } from './types'\n\nconst [name, bem] = createNamespace('form')\n\nexport const formProps = {\n  colon: Boolean,\n  disabled: Boolean,\n  readonly: Boolean,\n  required: [Boolean, String] as PropType<boolean | 'auto'>,\n  showError: Boolean,\n  labelWidth: numericProp,\n  labelAlign: String as PropType<FieldTextAlign>,\n  inputAlign: String as PropType<FieldTextAlign>,\n  scrollToError: Boolean,\n  scrollToErrorPosition: String as PropType<ScrollLogicalPosition>,\n  validateFirst: Boolean,\n  submitOnEnter: truthProp,\n  showErrorMessage: truthProp,\n  errorMessageAlign: String as PropType<FieldTextAlign>,\n  validateTrigger: {\n    type: [String, Array] as PropType<\n      FieldValidateTrigger | FieldValidateTrigger[]\n    >,\n    default: 'onBlur',\n  },\n}\n\nexport type FormProps = ExtractPropTypes<typeof formProps>\n\nexport default defineComponent({\n  name,\n\n  props: formProps,\n\n  emits: ['submit', 'failed'],\n\n  setup(props, { emit, slots }) {\n    const { children, linkChildren } = useChildren(FORM_KEY)\n\n    const getFieldsByNames = (names?: string[]) => {\n      if (names) {\n        return children.filter((field) => names.includes(field.name))\n      }\n      return children\n    }\n\n    const validateSeq = (names?: string[]) =>\n      new Promise<void>((resolve, reject) => {\n        const errors: FieldValidateError[] = []\n        const fields = getFieldsByNames(names)\n\n        fields\n          .reduce(\n            (promise, field) =>\n              promise.then(() => {\n                if (!errors.length) {\n                  return field.validate().then((error?: FieldValidateError) => {\n                    if (error) {\n                      errors.push(error)\n                    }\n                  })\n                }\n              }),\n            Promise.resolve()\n          )\n          .then(() => {\n            if (errors.length) {\n              reject(errors)\n            } else {\n              resolve()\n            }\n          })\n      })\n\n    const validateAll = (names?: string[]) =>\n      new Promise<void>((resolve, reject) => {\n        const fields = getFieldsByNames(names)\n        Promise.all(fields.map((item) => item.validate())).then((errors) => {\n          errors = errors.filter(Boolean)\n\n          if (errors.length) {\n            reject(errors)\n          } else {\n            resolve()\n          }\n        })\n      })\n\n    const validateField = (name: string) => {\n      const matched = children.find((item) => item.name === name)\n\n      if (matched) {\n        return new Promise<void>((resolve, reject) => {\n          matched.validate().then((error?: FieldValidateError) => {\n            if (error) {\n              reject(error)\n            } else {\n              resolve()\n            }\n          })\n        })\n      }\n\n      return Promise.reject()\n    }\n\n    const validate = (name?: string | string[]) => {\n      if (typeof name === 'string') {\n        return validateField(name)\n      }\n      return props.validateFirst ? validateSeq(name) : validateAll(name)\n    }\n\n    const resetValidation = (name?: string | string[]) => {\n      if (typeof name === 'string') {\n        name = [name]\n      }\n\n      const fields = getFieldsByNames(name)\n      fields.forEach((item) => {\n        item.resetValidation()\n      })\n    }\n\n    const getValidationStatus = () =>\n      children.reduce<Record<string, FieldValidationStatus>>((form, field) => {\n        form[field.name] = field.getValidationStatus()\n        return form\n      }, {})\n\n    const scrollToField = (\n      name: string,\n      options?: boolean | ScrollIntoViewOptions\n    ) => {\n      children.some((item) => {\n        if (item.name === name) {\n          item.$el.scrollIntoView(options)\n          return true\n        }\n        return false\n      })\n    }\n\n    const getValues = () =>\n      children.reduce<Record<string, unknown>>((form, field) => {\n        if (field.name !== undefined) {\n          form[field.name] = field.formValue.value\n        }\n        return form\n      }, {})\n\n    const submit = () => {\n      const values = getValues()\n\n      validate()\n        .then(() => emit('submit', values))\n        .catch((errors: FieldValidateError[]) => {\n          emit('failed', { values, errors })\n          const { scrollToError, scrollToErrorPosition } = props\n\n          if (scrollToError && errors[0].name) {\n            scrollToField(\n              errors[0].name,\n              scrollToErrorPosition\n                ? {\n                    block: scrollToErrorPosition,\n                  }\n                : undefined\n            )\n          }\n        })\n    }\n\n    const onSubmit = (event: Event) => {\n      preventDefault(event)\n      submit()\n    }\n\n    linkChildren({ props })\n    useExpose<FormExpose>({\n      submit,\n      validate,\n      getValues,\n      scrollToField,\n      resetValidation,\n      getValidationStatus,\n    })\n\n    return () => (\n      <form class={bem()} onSubmit={onSubmit}>\n        {slots.default?.()}\n      </form>\n    )\n  },\n})\n"],"names":["name","bem","createNamespace","formProps","colon","Boolean","disabled","readonly","required","String","showError","labelWidth","numericProp","labelAlign","inputAlign","scrollToError","scrollToErrorPosition","validateFirst","submitOnEnter","truthProp","showErrorMessage","errorMessageAlign","validateTrigger","type","Array","default","defineComponent","props","emits","setup","emit","slots","children","linkChildren","useChildren","FORM_KEY","getFieldsByNames","names","filter","field","includes","validateSeq","Promise","resolve","reject","errors","fields","reduce","promise","then","length","validate","error","push","validateAll","all","map","item","validateField","matched","find","resetValidation","forEach","getValidationStatus","form","scrollToField","options","some","$el","scrollIntoView","getValues","undefined","formValue","value","submit","values","catch","block","onSubmit","event","preventDefault","useExpose","_createVNode"],"mappings":"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"}