{"version":3,"file":"use-form-dialog.mjs","sources":["../../../../../packages/components/form-dialog/src/use-form-dialog.ts"],"sourcesContent":["import { deepExtend } from '@element-ultra/utils'\nimport { nextTick, watch, shallowReactive } from 'vue'\n\ntype Dialog<Type, Data, Ctx> = {\n  visible: boolean\n  type: Type\n  title: string\n  data: Data\n  ctx: Ctx | null\n}\n\ntype OpenOptions<T, C> = {\n  /** 标题 */\n  title?: string\n  /** 表单编辑或查看时回显的数据 */\n  data?: null | T\n  /** 自定义上下文数据 */\n  ctx?: C\n  /** 指定当传入回显数据时是否自动合并, 默认为true即自动合并 */\n  merge?: boolean\n}\n\ntype Open<T, F, C> = (type: T, options?: OpenOptions<F, C>) => void\n\n/**\n * 表单弹框的通用函数, 返回一个可响应式的弹框对象和一个打开弹框的方法\n * @param formData 可响应式的表单数据对象\n * @returns\n */\nexport default function useFormDialog<\n  Type extends string = 'create' | 'update',\n  Ctx extends any = any,\n  F extends Record<string, any> | Record<string, any>[] = any\n>(formData: F) {\n  type Data = (F & Record<string, any>) | null\n\n  // 弹框对象\n  const dialog = shallowReactive<Dialog<Type, Data, Ctx>>({\n    visible: false,\n    type: '' as unknown as Type,\n    title: '',\n    data: null,\n    ctx: null\n  })\n\n  watch(\n    () => dialog.visible,\n    v => {\n      if (!v) {\n        dialog.data = null\n        dialog.ctx = null\n        dialog.title = ''\n        dialog.type = '' as unknown as Type\n      }\n    }\n  )\n\n  const open: Open<\n    Type,\n    F extends any[] ? Partial<F[number]>[] : Partial<F>,\n    Ctx\n  > = (type, options) => {\n    dialog.visible = true\n    dialog.type = type\n\n    if (!options) return\n\n    Object.keys(dialog).forEach(k => {\n      let v = options[k as keyof OpenOptions<F, Ctx>]\n      if (v !== undefined) {\n        ;(dialog as any)[k] = v\n      }\n    })\n\n    // 合并值\n    if (options.merge !== false && dialog.data) {\n      nextTick(() => {\n        // 数组\n        if (Array.isArray(formData)) {\n          return formData.forEach((item, i) => {\n            deepExtend(item, dialog.data![i])\n          })\n        }\n        deepExtend(formData, dialog.data!)\n      })\n    }\n  }\n\n  return [dialog, open] as const\n}\n"],"names":[],"mappings":";;;;AA6BA,SAAwB,cAItB,QAAa,EAAA;AAIb,EAAA,MAAM,SAAS,eAAyC,CAAA;AAAA,IACtD,OAAS,EAAA,KAAA;AAAA,IACT,IAAM,EAAA,EAAA;AAAA,IACN,KAAO,EAAA,EAAA;AAAA,IACP,IAAM,EAAA,IAAA;AAAA,IACN,GAAK,EAAA,IAAA;AAAA,GACN,CAAA,CAAA;AAED,EAAA,KAAA;AAAA,IACE,MAAM,MAAO,CAAA,OAAA;AAAA,IACb,CAAK,CAAA,KAAA;AACH,MAAA,IAAI,CAAC,CAAG,EAAA;AACN,QAAA,MAAA,CAAO,IAAO,GAAA,IAAA,CAAA;AACd,QAAA,MAAA,CAAO,GAAM,GAAA,IAAA,CAAA;AACb,QAAA,MAAA,CAAO,KAAQ,GAAA,EAAA,CAAA;AACf,QAAA,MAAA,CAAO,IAAO,GAAA,EAAA,CAAA;AAAA,OAChB;AAAA,KACF;AAAA,GACF,CAAA;AAEA,EAAM,MAAA,IAAA,GAIF,CAAC,IAAA,EAAM,OAAY,KAAA;AACrB,IAAA,MAAA,CAAO,OAAU,GAAA,IAAA,CAAA;AACjB,IAAA,MAAA,CAAO,IAAO,GAAA,IAAA,CAAA;AAEd,IAAA,IAAI,CAAC,OAAA;AAAS,MAAA,OAAA;AAEd,IAAA,MAAA,CAAO,IAAK,CAAA,MAAM,CAAE,CAAA,OAAA,CAAQ,CAAK,CAAA,KAAA;AAC/B,MAAI,IAAA,CAAA,GAAI,QAAQ,CAA8B,CAAA,CAAA;AAC9C,MAAA,IAAI,MAAM,KAAW,CAAA,EAAA;AACnB,QAAA,CAAA;AAAC,QAAC,MAAA,CAAe,CAAC,CAAI,GAAA,CAAA,CAAA;AAAA,OACxB;AAAA,KACD,CAAA,CAAA;AAGD,IAAA,IAAI,OAAQ,CAAA,KAAA,KAAU,KAAS,IAAA,MAAA,CAAO,IAAM,EAAA;AAC1C,MAAA,QAAA,CAAS,MAAM;AAEb,QAAI,IAAA,KAAA,CAAM,OAAQ,CAAA,QAAQ,CAAG,EAAA;AAC3B,UAAA,OAAO,QAAS,CAAA,OAAA,CAAQ,CAAC,IAAA,EAAM,CAAM,KAAA;AACnC,YAAA,UAAA,CAAW,IAAM,EAAA,MAAA,CAAO,IAAM,CAAA,CAAC,CAAC,CAAA,CAAA;AAAA,WACjC,CAAA,CAAA;AAAA,SACH;AACA,QAAW,UAAA,CAAA,QAAA,EAAU,OAAO,IAAK,CAAA,CAAA;AAAA,OAClC,CAAA,CAAA;AAAA,KACH;AAAA,GACF,CAAA;AAEA,EAAO,OAAA,CAAC,QAAQ,IAAI,CAAA,CAAA;AACtB;;;;"}