{"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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"}