UNPKG

mealcomes

Version:

MealComes 用于学习前端的组件库

1 lines 26.8 kB
{"version":3,"file":"form-C5wtqKmX.mjs","sources":["../../../../packages/components/form/src/form.ts","../../../../packages/components/form/src/form.vue","../../../../packages/components/form/src/form-item.ts","../../../../packages/components/form/src/utils.ts","../../../../packages/components/form/src/form-item.vue","../../../../packages/components/form/src/form-items/form-item-input.ts","../../../../packages/components/form/src/form-items/form-item-input.vue","../../../../packages/components/form/index.ts"],"sourcesContent":["import type { ExtractPropTypes, InjectionKey, PropType } from 'vue';\nimport type { Arrayable, FormItemContext, FormItemRule } from './form-item';\n\n/**\n * form 组件 props\n */\nexport const formProps = {\n /**\n * 数据源\n */\n model: Object,\n /**\n * 表单校验规则\n */\n rules: {\n type: Object as PropType<Record<string, Arrayable<FormItemRule>>>\n },\n /**\n * 表单是否展示错误信息\n */\n showMessage: {\n type: Boolean,\n default: true\n }\n} as const;\n\n/**\n * form 组件 props 类型\n */\nexport type FormProps = Partial<ExtractPropTypes<typeof formProps>>;\n\n/**\n * form 组件上下文\n */\nexport interface FormContext extends FormProps {\n addField: (field: FormItemContext) => void\n};\n\n/**\n * form 组件上下文 key\n */\nexport const formContextKey: InjectionKey<FormContext> = Symbol('_fc_k');\n\n// export const \n","<template>\n <form :class=\"[bem.b()]\">\n <slot></slot>\n </form>\n</template>\n\n<script setup lang=\"ts\">\nimport { createNamespace } from '@mealcomes/utils';\nimport { formContextKey, formProps } from './form';\nimport type { FormContext } from './form';\nimport { provide } from 'vue';\nimport type { FormItemContext } from './form-item';\nimport type { ValidateFieldsError } from 'async-validator';\n\ndefineOptions({\n name: 'mc-form'\n});\n\nconst bem = createNamespace('form');\nconst props = defineProps(formProps);\n\n// form 收集 form-item 的 context\nconst fields: FormItemContext[] = [];\nconst addField: FormContext['addField'] = context => {\n fields.push(context);\n};\nconst context = {\n ...props,\n addField\n};\nprovide(formContextKey, context);\n\nconst validate = async (\n callback?: (valid: boolean, fields?: ValidateFieldsError) => void\n) => {\n let errors: ValidateFieldsError = {};\n // 对内部 form-item 组件依次进行表单项校验\n for (let field of fields) {\n try {\n await field.validate('');\n } catch (err) {\n errors = {\n ...errors,\n ...(err as ValidateFieldsError)\n };\n }\n }\n if (Object.keys(errors).length === 0) {\n // 内部 form-item 校验全部通过\n return callback?.(true);\n } else {\n // 内部 form-item 校验存在错误\n if (callback) {\n return callback?.(false, errors);\n } else {\n return Promise.reject(errors);\n }\n }\n};\n\ndefineExpose({\n validate\n});\n</script>\n","import type { ExtractPropTypes, InjectionKey, PropType } from 'vue';\nimport type { RuleItem, ValidateFieldsError } from 'async-validator';\nimport type { ComponentSize } from '@mealcomes/constants';\n\nexport type Arrayable<T> = T | T[];\n\n/**\n * 表单项校验规则\n */\nexport interface FormItemRule extends RuleItem {\n trigger?: string | string[];\n}\n\n/**\n * 表单校验状态\n */\nexport const formItemValidateState = [\n 'success',\n 'error',\n 'validating',\n ''\n] as const;\n\n/**\n * 表单校验状态类型\n */\nexport type FormItemValidateState = (typeof formItemValidateState)[number];\n\n/**\n * 表单项尺寸\n */\nexport const formItemSize = ['default', 'small', 'large'] as const;\n\n/**\n * 表单项尺寸类型\n */\nexport type FormItemSize = (typeof formItemSize)[number];\n\n/**\n * form-item 组件 props\n */\nexport const formItemProps = {\n /**\n * 表单域 model 字段\n */\n prop: {\n type: String,\n default: ''\n },\n /**\n * 表单 label\n */\n label: {\n type: String,\n default: ''\n },\n /**\n * label 宽度\n */\n labelWidth: {\n type: [String, Number] as PropType<string | number>,\n default: ''\n },\n /**\n * 表单校验规则\n */\n rules: {\n type: [Object, Array] as PropType<Arrayable<FormItemRule>>,\n default: () => []\n },\n /**\n * 是否显示校验错误信息\n */\n showMessage: {\n type: Boolean,\n default: true\n },\n size: {\n type: String as PropType<ComponentSize>,\n default: 'default'\n }\n} as const;\n\n/**\n * form-item 组件 props 类型\n */\nexport type FormItemProps = Partial<ExtractPropTypes<typeof formItemProps>>;\n\n/**\n * form-item 组件上下文\n */\nexport interface FormItemContext extends FormItemProps {\n /**\n * 表单校验函数\n */\n validate: (\n trigger: string,\n callback?: (\n idValid: boolean,\n invalidFields?: ValidateFieldsError\n ) => void\n ) => Promise<boolean>;\n}\n\n/**\n * form-item 组件上下文 key\n */\nexport const formItemContextKey: InjectionKey<FormItemContext> =\n Symbol('_fic_k');\n","import type { Arrayable } from './form-item';\n\nexport function convertArray<T>(rules: Arrayable<T>) {\n return rules ? (Array.isArray(rules) ? rules : [rules]) : [];\n}\n","<template>\n <div\n :class=\"[\n bem.b(),\n bem.is('error', validateState === 'error'),\n bem.is('validating', validateState === 'validating'),\n bem.is('success', validateState === 'success'),\n bem.m(size)\n ]\"\n >\n <div :class=\"[bem.e('label-wrap')]\" v-if=\"hasLabel\">\n <label :class=\"[bem.e('label')]\" :style=\"labelStyle\">\n <slot name=\"label\">\n {{ label }}\n </slot>\n </label>\n </div>\n <div :class=\"[bem.e('content')]\" :style=\"contentStyle\">\n <slot></slot>\n <slot v-if=\"shouldShowError\" name=\"error\" :error=\"validateMessage\">\n <div :class=\"[bem.e('error')]\">\n {{ validateMessage }}\n </div>\n </slot>\n </div>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { addUnit, createNamespace } from '@mealcomes/utils';\nimport {\n computed,\n inject,\n onMounted,\n provide,\n ref,\n useSlots\n} from 'vue';\nimport type { CSSProperties } from 'vue';\nimport {\n formItemContextKey,\n formItemProps,\n} from './form-item';\nimport type {\n FormItemContext,\n FormItemRule,\n FormItemValidateState\n} from './form-item';\nimport { formContextKey } from './form';\nimport { convertArray } from './utils';\nimport AsyncValidator from 'async-validator';\nimport type { FormValidateFailure } from './error';\n\nconst bem = createNamespace('form-item');\ndefineOptions({\n name: 'mc-form-item'\n});\nconst props = defineProps(formItemProps);\nconst formContext = inject(formContextKey);\nconst slots = useSlots();\n\nconst validateState = ref<FormItemValidateState>('error');\nconst validateMessage = ref('');\nconst shouldShowError = computed(\n () =>\n validateState.value === 'error' && // 表单项校验通过时不展示错误信息\n props.showMessage\n);\nconst _rules = computed(() => {\n const thisRules: FormItemRule[] = convertArray(props.rules);\n // 合并上级的 form 组件传入的 rules\n const formRules = formContext?.rules;\n if (formRules && props.prop) {\n const formRule = formRules[props.prop];\n if (formRule) {\n thisRules.push(...convertArray(formRule));\n }\n }\n return thisRules;\n});\nconst labelStyle = computed<CSSProperties>(() => {\n const labelWidth = addUnit(props.labelWidth || '');\n\n if (labelWidth) return { width: labelWidth };\n return {};\n});\nconst contentStyle = computed<CSSProperties>(() => {\n if (!props.label && !props.labelWidth) {\n return {};\n }\n const labelWidth = addUnit(props.labelWidth || '');\n if (!props.label && !slots.label) {\n return { marginLeft: labelWidth };\n }\n return {};\n});\nconst hasLabel = computed<boolean>(() => {\n return !!(props.label || slots.label);\n});\n\n/**\n * 获取包含指定 trigger 的规则\n */\nfunction getRuleFiltered(trigger: string) {\n const rules = _rules.value;\n return rules.filter(rule => {\n if (!rule.trigger || !trigger) return true;\n if (Array.isArray(rule.trigger)) {\n return rule.trigger.includes(trigger);\n } else {\n return rule.trigger === trigger;\n }\n });\n}\n\nfunction setValidationState(state: FormItemValidateState) {\n validateState.value = state;\n}\n\nfunction onValidationSucceeded() {\n setValidationState('success');\n}\n\nfunction onValidationFailed(error: FormValidateFailure) {\n const { errors, fields } = error;\n if (!errors || !fields) {\n console.error(error);\n }\n setValidationState('error');\n\n validateMessage.value = errors\n ? errors?.[0]?.message ?? `${props.prop} is required`\n : '';\n}\n\n/**\n * 表单项校验函数\n */\nconst doValidate = async (rules: FormItemRule[]) => {\n const modelName = props.prop;\n const validator = new AsyncValidator({\n [modelName]: rules\n });\n const model = formContext?.model || {};\n\n /*\n 这里一定要返回啊!!!\n 不然返回的就是 new Promise.resolve(undefined) 了\n 那后续就没有 catch 了\n */\n return validator\n .validate({\n [modelName]: model[modelName]\n })\n .then(() => {\n onValidationSucceeded();\n return true as const;\n })\n .catch((err: FormValidateFailure) => {\n onValidationFailed(err);\n return Promise.reject(err);\n });\n};\n\nconst validate: FormItemContext['validate'] = async (trigger, callback?) => {\n const hasCallback = typeof callback === 'function';\n\n const rules = getRuleFiltered(trigger);\n if (rules.length === 0) {\n callback?.(true);\n return true;\n }\n\n setValidationState('validating');\n\n return doValidate(rules)\n .then(() => {\n callback?.(true);\n return true as const;\n })\n .catch((err: FormValidateFailure) => {\n const { fields } = err;\n callback?.(false, fields);\n return hasCallback ? false : Promise.reject(fields);\n });\n};\n\nconst context: FormItemContext = {\n ...props,\n validate\n};\n\n// 给内部组件提供自己的上下文\n// 例如: 内部的 input 组件可以拿到该上下文,\n// 并在 blur 或 change 的时候调用上下文中的 validate 函数\nprovide(formItemContextKey, context);\n\nonMounted(() => {\n // 将自己的 context 传递给上层 form 组件\n formContext?.addField(context);\n});\n</script>\n","import type { ExtractPropTypes, PropType } from 'vue';\nimport { inputEmits, inputProps } from '../../../input/src/input';\nimport { formItemProps } from '../form-item';\nimport { omit } from '@mealcomes/utils/object';\n\n/**\n * form-item-input 组件 props\n */\nexport const formItemInputProps = {\n ...omit(inputProps, 'size'),\n ...omit(formItemProps, ['label', 'labelWidth']),\n /**\n * placeholder 为 label 时的宽度\n */\n labelWidth: {\n type: [String, Number] as PropType<string | number>,\n default: ''\n }\n};\n\n/**\n * form-item-input 组件 props\n */\nexport type FormItemInputProps = ExtractPropTypes<typeof formItemInputProps>;\n\n/**\n * form-item-input 组件 emits\n */\nexport const formItemInputEmits = {\n ...inputEmits\n};\n\n/**\n * form-item-input 组件 emits 类型\n */\nexport type FormItemInputEmits = typeof formItemInputEmits;\n","<template>\n <div :class=\"[bem.b()]\">\n <mc-form-item\n :prop=\"prop\"\n :label-width=\"labelWidth\"\n :rules=\"rules\"\n :show-message=\"showMessage\"\n :size=\"size\"\n >\n <mc-input\n :type=\"type\"\n :model-value=\"modelValue\"\n :clearable=\"clearable\"\n :show-password=\"showPassword\"\n :disabled=\"disabled\"\n :readonly=\"readonly\"\n :aria-label=\"ariaLabel\"\n :autocomplete=\"autocomplete\"\n @input=\"handleInput\"\n @change=\"handleChange\"\n @blur=\"handleBlur\"\n @focus=\"handleFocus\"\n @keydown=\"handleKeyDown\"\n >\n <template v-if=\"$slots.prefix\" #prefix>\n <slot name=\"prefix\"></slot>\n </template>\n <template v-if=\"$slots.suffix\" #suffix>\n <slot name=\"suffix\"></slot>\n </template>\n <template v-if=\"$slots.prepend\" #prepend>\n <slot name=\"prepend\"></slot>\n </template>\n <template v-if=\"$slots.append\" #append>\n <slot name=\"append\"></slot>\n </template>\n </mc-input>\n <span ref=\"labelRef\" :class=\"bem.e('form-label')\">{{\n placeholder\n }}</span>\n </mc-form-item>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { formItemInputEmits, formItemInputProps } from './form-item-input';\nimport McFormItem from '../form-item.vue';\nimport McInput from '@mealcomes/components/input';\nimport { createNamespace } from '@mealcomes/utils';\nimport { computed, onMounted, ref, watch } from 'vue';\n\ndefineOptions({\n name: 'mc-form-item-input'\n});\nconst props = defineProps(formItemInputProps);\nconst emits = defineEmits(formItemInputEmits);\nconst bem = createNamespace('form-item-input');\n\nconst isInputFocus = ref(false);\n\nconst labelRef = ref<HTMLSpanElement>();\nconst labelWidth = ref<number | string>(0);\nlet labelActiveWidth: number | string;\nconst isLabelActive = computed(() => {\n return props.modelValue !== '';\n});\n\nconst handleInput = (value: string) => {\n emits('input', value);\n emits('update:modelValue', value);\n};\n\nconst handleChange = (value: string) => {\n emits('change', value);\n};\n\nconst handleFocus = (event: FocusEvent) => {\n isInputFocus.value = true;\n emits('focus', event);\n};\n\nconst handleBlur = (event: FocusEvent) => {\n isInputFocus.value = false;\n emits('blur', event);\n};\n\nconst handleKeyDown = (event: KeyboardEvent) => {\n emits('keydown', event);\n};\n\nfunction setLabelRefStatus(isActive: boolean) {\n const add = isActive ? 'active' : 'inactive';\n const remove = !isActive ? 'active' : 'inactive';\n labelRef.value!.classList.add(add);\n labelRef.value!.classList.remove(remove);\n\n const width = isActive ? labelActiveWidth : '0';\n\n labelWidth.value = width;\n}\n\nfunction getLabelWidth(targetClass: string): Promise<number> {\n return new Promise(res => {\n const clone = labelRef.value!.cloneNode(true) as HTMLElement;\n\n clone.style.visibility = 'hidden';\n clone.style.pointerEvents = 'none';\n clone.style.zIndex = '-999';\n\n labelRef.value?.parentElement?.appendChild(clone);\n\n requestAnimationFrame(() => {\n clone.classList.add(targetClass);\n clone.addEventListener(\n 'transitionend',\n () => {\n const width = clone.getBoundingClientRect().width;\n\n labelRef.value?.parentElement?.removeChild(clone);\n res(width);\n },\n { once: true }\n );\n });\n });\n}\n\nonMounted(async () => {\n if (props.labelWidth) {\n labelActiveWidth = props.labelWidth;\n } else {\n labelActiveWidth = await getLabelWidth('active');\n labelActiveWidth = `${labelActiveWidth + 10}px`;\n }\n watch(\n () => isLabelActive.value || isInputFocus.value,\n (newVal: boolean) => {\n setLabelRefStatus(newVal || isInputFocus.value);\n },\n {\n immediate: true\n }\n );\n});\n</script>\n","import { withInstall } from '@mealcomes/utils';\nimport _Form from './src/form.vue';\nimport _FormItem from './src/form-item.vue';\nimport _FormItemInput from './src/form-items/form-item-input.vue';\n\nexport const McForm = withInstall(_Form);\nexport const McFormItem = withInstall(_FormItem);\nexport const McFormItemInput = withInstall(_FormItemInput);\n\nexport type * from './src/form';\nexport * from './src/form';\nexport type * from './src/form-item';\nexport * from './src/form-item';\nexport type * from './src/form-items/form-item-input';\nexport * from './src/form-items/form-item-input';\n\n// 导出表单实例类型\nexport type FormInstance = InstanceType<typeof McForm>;\n\ndeclare module 'vue' {\n export interface GlobalComponents {\n McForm: typeof McForm;\n McFormItem: typeof McFormItem;\n McFormItemInput: typeof McFormItemInput;\n }\n}\n"],"names":["formProps","formContextKey","bem","createNamespace","props","__props","fields","context","provide","__expose","callback","errors","field","err","_createElementBlock","_normalizeClass","_unref","_renderSlot","_ctx","formItemValidateState","formItemSize","formItemProps","formItemContextKey","convertArray","rules","formContext","inject","slots","useSlots","validateState","ref","validateMessage","shouldShowError","computed","_rules","thisRules","formRules","formRule","labelStyle","labelWidth","addUnit","contentStyle","hasLabel","getRuleFiltered","trigger","rule","setValidationState","state","onValidationSucceeded","onValidationFailed","error","_a","doValidate","modelName","validator","AsyncValidator","model","hasCallback","onMounted","size","_createElementVNode","label","formItemInputProps","omit","inputProps","formItemInputEmits","inputEmits","emits","__emit","isInputFocus","labelRef","labelActiveWidth","isLabelActive","handleInput","value","handleChange","handleFocus","event","handleBlur","handleKeyDown","setLabelRefStatus","isActive","add","remove","width","getLabelWidth","targetClass","res","clone","_b","watch","newVal","_createVNode","McFormItem","prop","showMessage","McInput","type","modelValue","clearable","showPassword","disabled","readonly","ariaLabel","autocomplete","$slots","placeholder","McForm","withInstall","_Form","_FormItem","McFormItemInput","_FormItemInput"],"mappings":"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"}