{"version":3,"file":"form2.mjs","sources":["../../../../../../packages/components/form/src/form.vue"],"sourcesContent":["<template>\n  <form\n    :class=\"{\n      [namespace]: true,\n      'inline': inline,\n    }\"\n    :style=\"[\n      gap ? `--form-gap:${gap}` : '',\n    ]\"\n  >\n    <slot></slot>\n  </form>\n</template>\n\n<script lang=\"ts\">\nimport { defineComponent, provide, watch, reactive, toRefs, computed } from 'vue'\nimport { useNamespace } from '@hongluan-ui/hooks'\nimport { debugWarn, isFunction } from '@hongluan-ui/utils'\nimport { formContextKey } from '@hongluan-ui/tokens'\nimport { formProps } from './form'\nimport { filterFields } from './utils'\n\nimport type { ValidateFieldsError } from 'async-validator'\nimport type { FormItemContext as FormItemCtx, FormContext, FormValidateCallback, FormValidationResult } from '@hongluan-ui/tokens'\nimport type { Arrayable } from '@hongluan-ui/utils'\nimport type { FormItemProp } from './form-item'\n\nexport interface Callback {\n  (isValid?: boolean, invalidFields?: ValidateFieldsError): void\n}\nconst COMPONENT_NAME = 'Form'\nexport default defineComponent({\n  name: COMPONENT_NAME,\n  props: formProps,\n  emits: ['validate'],\n  setup(props, { emit }) {\n    const fields: FormItemCtx[] = []\n\n    const getField: FormContext['getField'] = prop => {\n      return fields.find(field => field.prop === prop)\n    }\n\n    const addField: FormContext['addField'] = field => {\n      fields.push(field)\n    }\n\n    const removeField: FormContext['removeField'] = field => {\n      if (field.prop) {\n        fields.splice(fields.indexOf(field), 1)\n      }\n    }\n\n    const 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\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        debugWarn(COMPONENT_NAME, 'model is required for validate to work.')\n      }\n      return hasModel\n    })\n\n    const 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\n    const validate = async (\n      callback?: FormValidateCallback,\n    ): FormValidationResult => validateField(undefined, callback)\n\n    const 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        } 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\n    const validateField: FormContext['validateField'] = async (\n      modelProps = [],\n      callback,\n    ) => {\n      const shouldThrow = !isFunction(callback)\n\n      try {\n        const 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          scrollToField(Object.keys(invalidFields)[0])\n        }\n        await callback?.(false, invalidFields)\n        return shouldThrow && Promise.reject(invalidFields)\n      }\n    }\n\n    const scrollToField = (prop: string) => {\n      const field = filterFields(fields, prop)[0]\n      if (field) {\n        field.$el?.$el?.scrollIntoView(props.scrollIntoViewOptions)\n      }\n    }\n\n    watch(\n      () => props.rules,\n      () => {\n        if (props.validateOnRuleChange) {\n          validate().catch(err => debugWarn(err))\n        }\n      },\n      { deep: true },\n    )\n\n    const formContext = reactive({\n      ...toRefs(props),\n      emit,\n\n      resetFields,\n      clearValidate,\n      validateField,\n      getField,\n      addField,\n      removeField,\n    })\n\n    provide(formContextKey, formContext)\n\n    const { namespace } = useNamespace('form')\n\n    return {\n      namespace,\n      validate, // export\n      resetFields,\n      clearValidate,\n      validateField,\n      scrollToField,\n      fields,\n    }\n  },\n})\n</script>\n"],"names":[],"mappings":";;;;;;;;;;;;AA8BA,MAAM,iBAAiB;AACvB,MAAK,YAAa,gBAAa;AAAA,EAC7B,MAAM;AAAA,EACN,OAAO;AAAA,EACP,OAAO,CAAC,UAAU;AAAA,EAClB,MAAM,OAAO,EAAE,QAAQ;AACrB,UAAM,SAAwB;AAE9B,UAAM,WAAoC,UAAQ;AAChD,aAAO,OAAO,KAAK,WAAS,MAAM,SAAS,IAAI;AAAA;AAGjD,UAAM,WAAoC,WAAS;AACjD,aAAO,KAAK,KAAK;AAAA;AAGnB,UAAM,cAA0C,WAAS;AACvD,UAAI,MAAM,MAAM;AACd,eAAO,OAAO,OAAO,QAAQ,KAAK,GAAG,CAAC;AAAA;AACxC;AAGF,UAAM,cAA0C,CAAC,aAAa,OAAO;AACnE,UAAI,CAAC,MAAM,OAAO;AAChB,kBAAU,gBAAgB,4CAA4C;AACtE;AAAA;AAEF,mBAAa,QAAQ,UAAU,EAAE,QAAQ,WAAS,MAAM,YAAY;AAAA;AAGtE,UAAM,gBAA8C,CAAC,SAAQ,OAAO;AAClE,mBAAa,QAAQ,MAAK,EAAE,QAAQ,WAAS,MAAM,eAAe;AAAA;AAGpE,UAAM,gBAAgB,SAAS,MAAM;AACnC,YAAM,WAAW,CAAC,CAAC,MAAM;AACzB,UAAI,CAAC,UAAU;AACb,kBAAU,gBAAgB,yCAAyC;AAAA;AAErE,aAAO;AAAA,KACR;AAED,UAAM,uBAAuB,CAAC,WAAmC;AAC/D,UAAI,OAAO,WAAW;AAAG,eAAO;AAEhC,YAAM,iBAAiB,aAAa,QAAQ,MAAK;AACjD,UAAI,CAAC,eAAe,QAAQ;AAC1B,kBAAU,gBAAgB,4BAA4B;AACtD,eAAO;AAAC;AAEV,aAAO;AAAA;AAGT,UAAM,WAAW,OACf,aACyB,cAAc,QAAW,QAAQ;AAE5D,UAAM,kBAAkB,OACtB,SAAiC,OACZ;AACrB,UAAI,CAAC,cAAc;AAAO,eAAO;AAEjC,YAAM,UAAS,qBAAqB,MAAK;AACzC,UAAI,QAAO,WAAW;AAAG,eAAO;AAEhC,UAAI,mBAAwC;AAC5C,iBAAW,SAAS,SAAQ;AAC1B,YAAI;AACF,gBAAM,MAAM,SAAS,EAAE;AAAA,iBAChB,SAAP;AACA,6BAAmB;AAAA,eACd;AAAA,eACC;AAAA;AACN;AACF;AAGF,UAAI,OAAO,KAAK,gBAAgB,EAAE,WAAW;AAAG,eAAO;AACvD,aAAO,QAAQ,OAAO,gBAAgB;AAAA;AAGxC,UAAM,gBAA8C,OAClD,aAAa,IACb,aACG;AACH,YAAM,cAAc,CAAC,WAAW,QAAQ;AAExC,UAAI;AACF,cAAM,SAAS,MAAM,gBAAgB,UAAU;AAE/C,YAAI,WAAW,MAAM;AACnB,iCAAuB;AAAA;AAEzB,eAAO;AAAA,eACA,GAAP;AACA,YAAI,aAAa;AAAO,gBAAM;AAE9B,cAAM,gBAAgB;AAEtB,YAAI,MAAM,eAAe;AACvB,wBAAc,OAAO,KAAK,aAAa,EAAE,EAAE;AAAA;AAE7C;AACA,eAAO,eAAe,QAAQ,OAAO,aAAa;AAAA;AACpD;AAGF,UAAM,gBAAgB,CAAC,SAAiB;AACtC,YAAM;AACN,iBAAW;AACT;AAA0D;AAC5D;AAGF;AAGI,UAAI,MAAM;AACR;AAAsC;AACxC,OAEF;AAGF;AAA6B,qBACZ;AAAA,MACf;AAAA,MAEA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA;AAGF;AAEA,YAAQ,cAAc,aAAa;AAEnC;AAAO;AACL,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA;AACF;AAEJ;;2CAzKS;AAAA;AATC;AAAoB;AAAyB;;AAI7C;AAAiC;;;AAI1B;;;;;;;"}