{"version":3,"file":"form-view-data.mjs","sources":["../../../packages/powerful-form/src/form-view-data.ts"],"sourcesContent":["import { ElMessage, type FormInstance, type FormItemRule } from 'element-plus'\nimport type {\n  PowerfulTableExpose,\n  PowerfulTableHeader,\n} from 'el-plus-powerful-table'\nimport type { ComponentPublicInstance, ComputedRef, PropType, Ref } from 'vue'\nimport type {\n  FormEventType,\n  FormItem,\n  FormType,\n  PTHeadersProps,\n  PowerfulFormData,\n  PowerfulFormListApi,\n  PowerfulFormPTHeaders,\n  PowerfulFormProps,\n  SetDataType,\n} from '~/index'\nimport { LangKey, useLocale } from '~/locale/lang'\nimport {\n  FormTypeEnum,\n  clearSymbol,\n  deepClone,\n  isTypeProtect,\n  useAsyncGetRefs,\n  useGetRefs,\n  verifyFormItemRule,\n} from '~/index'\n\n/**\n * 定义初始数据对象，用于重置表单\n */\nconst DEFAULT_DATA: { [s: string]: any } = {}\n\n/**\n * form-view 组件 props\n */\nexport const formViewProps = {\n  // 表单配置数据\n  formItems: {\n    type: Array as PropType<PowerfulFormProps['formItems']>,\n    default: () => [],\n  },\n  extendTable: {\n    type: [Boolean, String] as PropType<PowerfulFormProps['extendTable']>,\n    default: false,\n  },\n\n  formDataDefault: {\n    type: Object as PropType<PowerfulFormProps['formDataDefault']>,\n    default: () => ({}),\n  },\n  disabled: {\n    type: Boolean as PropType<PowerfulFormProps['disabled']>,\n    default: false,\n  },\n  showType: {\n    type: String as PropType<PowerfulFormProps['showType']>,\n    default: undefined,\n  },\n  property: {\n    type: Object as PropType<PowerfulFormProps['property']>,\n    default: () => ({}),\n  },\n\n  apis: {\n    type: [Object, Function] as PropType<PowerfulFormProps['apis']>,\n    default: undefined,\n  },\n\n  showLabel: {\n    type: Boolean as PropType<PowerfulFormProps['showLabel']>,\n    default: true,\n  },\n}\n\n/**\n * components Props\n */\nexport const componentProps = () => ({\n  // 按钮组件配置数据\n  formItem: {\n    type: Object as PropType<FormItem>,\n    default: () => ({}),\n  },\n\n  formData: {\n    type: Object as PropType<PowerfulFormData['formData']>,\n    default: () => ({}),\n  },\n  index: {\n    type: Number as PropType<number>,\n  },\n  inline: {\n    type: Boolean as PropType<boolean>,\n    default: false,\n  },\n})\n\n// 对部分支持函数的 property 参数进行判断返回\nexport const isProperty = <T, R>(e: T, property?: R | ((e: T) => R)) => {\n  return isTypeProtect<typeof property, R>(\n    property,\n    (pet) => typeof (<R>pet) != 'function'\n  )\n    ? property\n    : property!(e)\n}\n\n/**\n * form-view 组件 数据\n */\nexport const useFormViewState = (props: PowerfulFormProps) => {\n  const proxy = getCurrentInstance()?.proxy!\n\n  const formViewData: PowerfulFormData = reactive({\n    formItems: [],\n    rules: {},\n    formData: {},\n    watchCache: [],\n  })\n  const elFormRef = ref<FormInstance | null>(null)\n  const { t } = useLocale()\n\n  onMounted(() => {\n    if (props.showType === 'query') {\n      setTimeout(() => {\n        const formEl = elFormRef.value?.$el\n        const parentEl = formEl?.parentNode\n\n        if (parentEl && formEl) {\n          parentEl.style.height = `${formEl.offsetHeight}px`\n        }\n      }, 100)\n    }\n  })\n\n  /**\n   * @description 写入 formItems 数据，在基于 formItems 数据写入 rules、formData\n   * @param {PowerfulTableHeader} PTHeader 表格header数据\n   * @param {PTHeadersProps} PTHeaderProps props 数据，基于表格 props 进行补充了部分属性\n   */\n  const setFormItems = (\n    PTHeader: PowerfulTableHeader,\n    PTHeaderProps: PTHeadersProps\n  ) => {\n    /**\n     * 判断 PTHeaderProps.type 类型是否可以表单组件接受, 可以接受那么这个值就在 FormType 中存在\n     */\n    const typeComparison = Object.values(FormTypeEnum).includes(\n      PTHeaderProps.type as any // 这里由于是继承了列表的type,但是表单也有type不好去断言，故此直接使用了 any\n    )\n\n    // 深拷贝数据\n    const formItem = deepClone<FormItem>({\n      text: PTHeaderProps.text || PTHeader.label,\n      prop: PTHeaderProps.formItem?.prop || PTHeaderProps.prop,\n      render: typeComparison ? PTHeaderProps.render : undefined,\n      type: typeComparison ? (PTHeaderProps.type as keyof FormType) : undefined,\n      slotName: PTHeaderProps.slotName,\n\n      ...(PTHeaderProps.formItem || {}),\n\n      data:\n        typeComparison && !PTHeaderProps.formItem?.data\n          ? PTHeaderProps.data || {}\n          : {\n              ...(typeComparison ? PTHeaderProps.data : {}),\n              ...PTHeaderProps.formItem?.data,\n            },\n    } as FormItem)\n\n    // 写入 formItems 对 el-form-item 循环\n    formViewData.formItems.push(formItem)\n\n    // 写入相应类型其他默认值\n    setDefaultData(\n      formItem as Required<FormItem>,\n      formViewData.formData,\n      PTHeaderProps\n    )\n\n    // 写入 rules (表单校验)\n    setRules(formItem as Required<FormItem>)\n  }\n\n  /**\n   * @description 写入 rules 数据\n   * @param {FormItem} formItem\n   */\n  const setRules = (formItem: FormItem) => {\n    // 如果 formItem.rule 直接是 FormItemRule[] 类型，则 return\n    if (\n      formItem.rule &&\n      isTypeProtect<typeof formItem.rule, FormItemRule[]>(\n        formItem.rule,\n        (rule) =>\n          Array.isArray(rule) &&\n          typeof rule[0] === 'object' &&\n          !Array.isArray(rule[0])\n      )\n    ) {\n      formViewData.rules[formItem.prop] = formItem.rule\n      return\n    }\n\n    const rules = []\n\n    // 判断是否存在\n    if (formItem.rule) {\n      rules.push({\n        required: true,\n        message: `${clearSymbol(formItem.text)} ${t(LangKey.VerifyEmpty)}`,\n        trigger: 'blur',\n      })\n\n      // rule 长度限制\n      if (Array.isArray(formItem.rule)) {\n        rules.push({\n          min: formItem.rule[0],\n          max: formItem.rule[1],\n          message: `${t(LangKey.VerifyLength)}${formItem.rule[0]} ~ ${\n            formItem.rule[1]\n          }`,\n          trigger: 'blur',\n        })\n      } else if (typeof formItem.rule === 'string') {\n        if (verifyFormItemRule[formItem.rule]) {\n          rules.push({\n            ...verifyFormItemRule[formItem.rule],\n            message: t(verifyFormItemRule[formItem.rule].message as LangKey),\n          })\n        } else {\n          console.warn(\n            `${\n              verifyFormItemRule[\n                formItem.rule as keyof typeof verifyFormItemRule\n              ]\n                ? '在 verifyFormItemRule 中存在'\n                : '在 verifyFormItemRule 中不存在'\n            } 支持 ${Object.keys(verifyFormItemRule).join('、')}`\n          )\n        }\n      }\n\n      formViewData.rules[formItem.prop] = rules\n    }\n  }\n\n  /**\n   * @description 更具类型写入数据\n   * @param {FormItem} formItem\n   * @param {PowerfulFormData['formData']} formData\n   * @param {PTHeadersProps} formItem\n   */\n  const setDefaultData = (\n    formItem: FormItem,\n    formData: PowerfulFormData['formData'],\n    PTHeaderProps?: PTHeadersProps\n  ) => {\n    // 写入 formData （表单数据）\n    Object.assign(formViewData.formData, props.formDataDefault || {})\n\n    formViewData.formData[formItem.prop!] =\n      props.formDataDefault?.[formItem.prop!] ?? formItem.defaultData ?? ''\n    DEFAULT_DATA[formItem.prop!] = formItem.defaultData ?? ''\n\n    switch (formItem.type) {\n      case FormTypeEnum.Select:\n      case FormTypeEnum.SelectV2:\n        // 给select类型添加默认值\n        if (PTHeaderProps) {\n          if (!formItem.data?.options && Array.isArray(PTHeaderProps.filters)) {\n            formItem.data!.options = PTHeaderProps.filters.map((f) => ({\n              ...f,\n              label: f.value,\n              value: f.key,\n            }))\n          }\n        }\n        /**\n         * 这是解决 select-v2 上 value = '' 时不会显示 placeholder\n         */\n        formData[formItem.prop] = formData[formItem.prop] || undefined\n        DEFAULT_DATA[formItem.prop!] = formItem.defaultData ?? ''\n\n        break\n      case FormTypeEnum.Rate:\n        formData[formItem.prop] = Number.isNaN(Number(formData[formItem.prop]))\n          ? 0\n          : Number(formData[formItem.prop])\n        break\n      case FormTypeEnum.Checkbox:\n        /**\n         * 由于是使用 checkboxGroup 实现，checkboxGroup v-model 接受数组形式，故此在此格式化数据\n         */\n        formData[formItem.prop] =\n          typeof formData[formItem.prop] === 'string'\n            ? formData[formItem.prop].split(',').filter((v: string) => v.length)\n            : Array.isArray(formData[formItem.prop])\n            ? formData[formItem.prop]\n            : []\n\n        DEFAULT_DATA[formItem.prop!] = formItem.defaultData || []\n        break\n    }\n  }\n\n  /**\n   * 转换数据\n   * @param { PowerfulFormPTHeaders[] } headerLists\n   */\n  const transformHeader = (headerLists: PowerfulFormPTHeaders[]) => {\n    /**\n     * 清除数据\n     */\n    formViewData.formItems = []\n    Object.keys(DEFAULT_DATA).forEach((k) => delete DEFAULT_DATA[k])\n\n    headerLists.forEach((item) => {\n      // item.props 是肯定存在的\n      if (Array.isArray(item.props)) {\n        // 过滤 prop 下不存在 formItem\n        item.props\n          .filter((prop) => prop.formItem)\n          .forEach((prop: PTHeadersProps) => {\n            setFormItems(item, prop)\n          })\n      } else {\n        if (item.props.formItem) setFormItems(item, item.props)\n      }\n    })\n  }\n\n  /**\n   * @description 打平 PowerfulTable 组件 header。修改初始数据\n   */\n  formViewData.watchCache.push(\n    ...[\n      /**\n       * 监听 extendTable 数据变化\n       */\n      watch(\n        () => props.extendTable,\n        (val) => {\n          if (val) {\n            let headerLists = []\n            useAsyncGetRefs<PowerfulTableExpose>(\n              typeof val === 'boolean' ? 'PTable' : val,\n              proxy\n            ).then((res) => {\n              headerLists = res?.props.header as PowerfulFormPTHeaders[]\n\n              transformHeader(headerLists)\n            })\n          }\n        },\n        {\n          immediate: true,\n        }\n      ),\n      watch(\n        () => props.formDataDefault,\n        (val) => {\n          // 写入 formData （表单数据）\n          Object.assign(formViewData.formData, val || {})\n        },\n        {\n          immediate: true,\n          deep: true,\n        }\n      ),\n      watch(\n        () => props.formItems,\n        (val) => {\n          if (val && props.extendTable === false) {\n            /**\n             * 清除数据\n             */\n            formViewData.formItems = val\n            Object.keys(DEFAULT_DATA).forEach((k) => delete DEFAULT_DATA[k])\n\n            formViewData.formItems.forEach((item) => {\n              setRules(item)\n\n              setDefaultData(item, formViewData.formData)\n            })\n          }\n        },\n        {\n          immediate: true,\n          deep: true,\n        }\n      ),\n    ]\n  )\n\n  /**\n   * 更具显示类型过滤\n   */\n  const formRenderItems: ComputedRef<FormItem[]> = computed(() =>\n    formViewData.formItems.filter((item) =>\n      typeof item.visible === 'undefined'\n        ? (Array.isArray(item.showType)\n            ? item.showType.includes(props.showType || '')\n            : item.showType === props.showType) ||\n          !props.showType ||\n          !item.showType\n        : item.visible(formViewData.formData, props.showType)\n    )\n  )\n\n  onBeforeUnmount(() => {\n    // 清除监听事件\n    formViewData.watchCache.forEach((item) => item())\n  })\n\n  return {\n    formViewData,\n    formRenderItems,\n    elFormRef,\n    transformHeader,\n  }\n}\n\nexport const useFunction = (\n  props: PowerfulFormProps,\n  formData: PowerfulFormData['formData'],\n  elFormRef: Ref<FormInstance | null>,\n  transformHeader: (headerLists: PowerfulFormPTHeaders[]) => void\n) => {\n  const { proxy: _proxy_ } = getCurrentInstance()!\n\n  let visible = true\n  /**\n   * @param {object} [params = {}] apis 请求的格外参数\n   */\n  const submitForm = (\n    params: object = {},\n    options?: {\n      successMessage?: string\n      errorMessage?: string\n      cb: (type: 'success' | 'error', res?: any) => void\n    }\n  ) => {\n    elFormRef\n      .value!.validate()\n      .then(() => {\n        if (props.apis) {\n          // 是否存在 apis\n          // 自定义类型保护判断\n          if (\n            isTypeProtect<\n              typeof props.apis,\n              { [key: string]: PowerfulFormListApi }\n            >(props.apis, (apis) => !!Object.keys(apis!).length)\n          ) {\n            // 通过自定义类型保护后，在判断 props.showType 是否存在，props.showType 作为 apis 键值，props.showType 不存在就报错\n            if (props.showType) {\n              if (props.apis?.[props.showType]) {\n                props.apis?.[props.showType]({\n                  ...params,\n                  ...formData.value,\n                })\n                  .then((res) => {\n                    if (options) {\n                      ElMessage.success(options.successMessage || '提交成功！')\n                    }\n                    options?.cb('success', res)\n                  })\n                  .catch((err) => {\n                    if (options) {\n                      ElMessage.error(options.errorMessage || '提交失败！')\n                    }\n                    options?.cb('error', err)\n                  })\n              } else console.error(`apis.${props.showType} 不存在`)\n            } else\n              console.error(\n                `showType 为空，但是 apis 为对象时需要 showType 作为键值。或者 apis 传递一个 Promise`\n              )\n          } else {\n            props\n              .apis?.({ ...params, ...formData.value })\n              .then((res) => {\n                if (options) {\n                  ElMessage.success(options.successMessage || '提交成功！')\n                }\n                options?.cb('success', res)\n              })\n              .catch((err) => {\n                if (options) {\n                  ElMessage.error(options.errorMessage || '提交失败！')\n                }\n                options?.cb('error', err)\n              })\n          }\n        }\n      })\n      .catch(() => {\n        return false\n      })\n\n    return elFormRef.value!.validate()\n  }\n\n  const resetForm = () => {\n    formData.value = deepClone(DEFAULT_DATA)\n  }\n\n  /**\n   * 刷新从表格继承数据\n   * @param {string} [refName = 'PTable'] PowerfulTable 组件 refName\n   */\n  const refreshRender = (\n    refName: string = typeof props.extendTable === 'boolean'\n      ? 'PTable'\n      : props.extendTable!,\n    proxy?: ComponentPublicInstance\n  ) => {\n    const _proxy = proxy ? proxy : _proxy_!\n    const PTExpose = useGetRefs<PowerfulTableExpose>(refName, _proxy)\n\n    if (PTExpose.value?.props.header) {\n      transformHeader(PTExpose.value?.props.header as PowerfulFormPTHeaders[])\n    }\n  }\n\n  const visibleFormTrigger = () => {\n    const formEl = elFormRef.value?.$el\n    const parentEl = formEl?.parentNode\n\n    if (parentEl && formEl) {\n      visible = !visible\n      const height = formEl.offsetHeight\n      parentEl.style.height = visible ? `${height}px` : '0px'\n    }\n\n    return visible\n  }\n\n  return {\n    submitForm,\n    resetForm,\n    refreshRender,\n    visibleFormTrigger,\n    bindAttr(\n      formItem: FormItem,\n      formData: PowerfulFormData['formData'],\n      index: number\n    ): {\n      formItem: FormItem\n      formData: PowerfulFormData['formData']\n      index: number\n      inline: boolean\n    } {\n      return {\n        formItem,\n        formData,\n        index,\n        inline: props.property?.inline || false,\n      }\n    },\n  }\n}\n\n/**\n * 对 components文件夹下组件内部事件处理\n * @param {{ formData: PowerfulFormData['formData']; index: number; formItem: FormItem<T> }} props 事件携带的一个参数数据\n */\nexport const useEvent = <T extends FormEventType>(props: {\n  formData: PowerfulFormData['formData']\n  formItem: FormItem\n  index: number\n}) => {\n  const event = (\n    eventType: keyof NonNullable<SetDataType<T>['on']>,\n    ...arg: any\n  ) => {\n    if (\n      isTypeProtect<SetDataType<FormEventType>, SetDataType<FormEventType>>(\n        props.formItem.data!,\n        (data) => typeof data?.on != undefined\n      )\n    ) {\n      ;(props.formItem.data?.on as { [key: string]: any })?.[\n        eventType as string\n      ]?.({ ...props }, ...arg)\n    }\n  }\n\n  return {\n    event,\n  }\n}\n"],"names":["DEFAULT_DATA","formViewProps","componentProps","isProperty","e","property","isTypeProtect","pet","useFormViewState","props","proxy","_a","getCurrentInstance","formViewData","reactive","elFormRef","ref","t","useLocale","onMounted","formEl","parentEl","setFormItems","PTHeader","PTHeaderProps","typeComparison","FormTypeEnum","formItem","deepClone","_b","_c","setDefaultData","setRules","rule","rules","clearSymbol","LangKey","verifyFormItemRule","formData","f","v","transformHeader","headerLists","k","item","prop","watch","val","useAsyncGetRefs","res","formRenderItems","computed","onBeforeUnmount","useFunction","_proxy_","visible","params","options","apis","ElMessage","err","refName","PTExpose","useGetRefs","height","index","useEvent","eventType","arg","data"],"mappings":"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"}