hongluan-ui
Version:
Hongluan Component Library for Vue 3
1 lines • 7.19 kB
Source Map (JSON)
{"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;;;;;;;"}