vexip-ui
Version:
A Vue 3 UI library, Highly customizability, full TypeScript, performance pretty good
1 lines • 7.97 kB
Source Map (JSON)
{"version":3,"file":"helper.cjs","sources":["../../../components/form/helper.ts"],"sourcesContent":["import { computed, getCurrentInstance, inject, onBeforeUnmount, provide } from 'vue'\n\nimport { isNull, noop, toFalse } from '@vexip-ui/utils'\nimport { FIELD_OPTIONS } from './symbol'\n\nimport type { Ref } from 'vue'\nimport type { ComponentSize, ComponentState } from '@vexip-ui/config'\n\n/**\n * 根据路径读取对象中的值 (实现 ?. 的逻辑)\n *\n * @param obj 需要被读取的对象\n * @param path 读取的路径\n * @param strict 是否开启严格模式 (非法路径报错)\n */\nexport function getValueByPath<T = unknown>(\n obj: Record<string, any>,\n path: string | string[],\n strict = false,\n): T | null {\n if (!obj || !path) return null\n\n if (typeof path === 'string') {\n if (path in obj) return obj[path]\n\n path = path.split('.')\n }\n\n if (Array.isArray(path) && path.length) {\n const lastKey = path.pop()\n\n if (!lastKey) return null\n\n for (let i = 0, len = path.length; i < len; ++i) {\n const key = String(path[i])\n\n if (!key) break\n\n obj = obj[key]\n\n if (isNull(obj)) {\n if (strict) {\n throw new Error('[vexip-ui:Form] Get value by an invalid path')\n }\n\n return obj\n }\n }\n\n if (strict && isNull(obj[lastKey])) {\n throw new Error('[vexip-ui:Form] Get value by an invalid path')\n }\n\n return obj[lastKey]\n }\n\n return null\n}\n\n/**\n * 根据路径设置对象中的值\n *\n * @param obj 需要被设置的对象\n * @param path 设置的路径\n * @param value 需要设置的值\n * @param strict 是否开启严格模式 (非法路径报错)\n */\nexport function setValueByPath(\n obj: Record<string, any>,\n path: string | string[],\n value: unknown,\n strict = false,\n): boolean {\n if (!obj || !path) return false\n\n if (typeof path === 'string') {\n if (path in obj) {\n obj[path] = value\n\n return true\n }\n\n path = path.split('.')\n }\n\n if (Array.isArray(path) && path.length) {\n const lastKey = path.pop()\n\n if (!lastKey) return false\n\n for (let i = 0, len = path.length; i < len; ++i) {\n const key = String(path[i])\n\n if (!key) {\n return false\n }\n\n if (typeof obj[key] !== 'object') {\n if (strict) {\n throw new Error('[vexip-ui:Form] Set value by an invalid path')\n }\n\n obj[key] = {}\n }\n\n obj = obj[key]\n }\n\n if (strict && typeof obj !== 'object') {\n throw new Error('[vexip-ui:Form] Set value by an invalid path')\n }\n\n obj[lastKey] = value\n\n return true\n }\n\n return false\n}\n\nexport interface FormFieldStore<V = unknown> {\n isField: boolean,\n idFor: Ref<string | undefined>,\n labelId: Ref<string | undefined>,\n state: Ref<ComponentState>,\n disabled: Ref<boolean>,\n loading: Ref<boolean>,\n size: Ref<ComponentSize>,\n validateField: () => Promise<string[] | null>,\n clearField: (defaultValue?: V) => void,\n resetField: () => boolean,\n getFieldValue: (defaultValue?: V) => V,\n setFieldValue: (value: V, strict?: boolean) => void,\n}\n\nconst defaultId = computed(() => undefined as string | undefined)\nconst defaultState = computed(() => 'default' as ComponentState)\nconst defaultFalse = computed(() => false)\nconst defaultSize = computed(() => 'default' as ComponentSize)\n\nfunction getEmptyActions<V>() {\n return {\n isField: false,\n idFor: defaultId,\n labelId: defaultId,\n state: defaultState,\n disabled: defaultFalse,\n loading: defaultFalse,\n size: defaultSize,\n validateField: noop,\n clearField: noop,\n resetField: toFalse,\n getFieldValue: v => v,\n setFieldValue: noop,\n } as FormFieldStore<V>\n}\n\n/**\n * Create a field store, provide field states and control methods\n *\n * @param onFocus a focus method for focusing when label is clicked\n */\nexport function useFieldStore<V = unknown>(onFocus?: () => void): FormFieldStore<V> {\n const instance = getCurrentInstance()\n\n if (!instance) return getEmptyActions<V>()\n\n const fieldOptions = inject(FIELD_OPTIONS, null)\n\n if (!fieldOptions) {\n return getEmptyActions<V>()\n }\n\n // Block the provided if there are dependencies between control components.\n // e.g. AutoComplete -> Select, ColorPicker -> Input\n provide(FIELD_OPTIONS, null)\n fieldOptions.sync(instance)\n onFocus && fieldOptions.emitter.on('focus', onFocus)\n\n onBeforeUnmount(() => {\n fieldOptions.unSync(instance)\n onFocus && fieldOptions.emitter.off('focus', onFocus)\n })\n\n function clearField(defaultValue?: V) {\n if (!fieldOptions) return\n\n fieldOptions.setValue(defaultValue)\n fieldOptions.clearError()\n }\n\n return {\n isField: true,\n idFor: fieldOptions.idFor,\n labelId: fieldOptions.labelId,\n state: fieldOptions.state,\n disabled: fieldOptions.disabled,\n loading: fieldOptions.loading,\n size: fieldOptions.size,\n validateField: fieldOptions.validate,\n clearField,\n resetField: fieldOptions.reset,\n getFieldValue: fieldOptions.getValue as (defaultValue?: V) => V,\n setFieldValue: fieldOptions.setValue as (value: V, strict?: boolean) => void,\n }\n}\n"],"names":["getValueByPath","obj","path","strict","lastKey","i","len","key","isNull","setValueByPath","value","defaultId","computed","defaultState","defaultFalse","defaultSize","getEmptyActions","noop","toFalse","v","useFieldStore","onFocus","instance","getCurrentInstance","fieldOptions","inject","FIELD_OPTIONS","provide","onBeforeUnmount","clearField","defaultValue"],"mappings":"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"}