useSync.hook.ts 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136
  1. import { getUUID } from '@/utils'
  2. import { useChartEditStore } from '@/store/modules/chartEditStore/chartEditStore'
  3. import { ChartEditStoreEnum, ChartEditStorage } from '@/store/modules/chartEditStore/chartEditStore.d'
  4. import { useChartHistoryStore } from '@/store/modules/chartHistoryStore/chartHistoryStore'
  5. import { fetchChartComponent, fetchConfigComponent, createComponent } from '@/packages/index'
  6. import { CreateComponentType, CreateComponentGroupType, ConfigType } from '@/packages/index.d'
  7. import { PublicGroupConfigClass } from '@/packages/public/publicConfig'
  8. import merge from 'lodash/merge'
  9. /**
  10. * 合并处理
  11. * @param object 模板数据
  12. * @param sources 新拿到的数据
  13. * @returns object
  14. */
  15. const componentMerge = (object: any, sources: any, notComponent = false) => {
  16. // 非组件不处理
  17. if (notComponent) return merge(object, sources)
  18. // 组件排除 options
  19. const option = sources.option
  20. if (!option) return merge(object, sources)
  21. // 为 undefined 的 sources 来源对象属性将被跳过详见 https://www.lodashjs.com/docs/lodash.merge
  22. sources.option = undefined
  23. if (option) {
  24. return {
  25. ...merge(object, sources),
  26. option: option
  27. }
  28. }
  29. }
  30. // 请求处理
  31. export const useSync = () => {
  32. const chartEditStore = useChartEditStore()
  33. const chartHistoryStore = useChartHistoryStore()
  34. /**
  35. * * 组件动态注册
  36. * @param projectData 项目数据
  37. * @param isReplace 是否替换数据
  38. * @returns
  39. */
  40. const updateComponent = async (projectData: ChartEditStorage, isReplace = false, changeId = false) => {
  41. if (isReplace) {
  42. // 清除列表
  43. chartEditStore.componentList = []
  44. // 清除历史记录
  45. chartHistoryStore.clearBackStack()
  46. chartHistoryStore.clearForwardStack()
  47. }
  48. // 列表组件注册
  49. projectData.componentList.forEach(async (e: CreateComponentType | CreateComponentGroupType) => {
  50. const intComponent = (target: CreateComponentType) => {
  51. if (!window['$vue'].component(target.chartConfig.chartKey)) {
  52. window['$vue'].component(target.chartConfig.chartKey, fetchChartComponent(target.chartConfig))
  53. window['$vue'].component(target.chartConfig.conKey, fetchConfigComponent(target.chartConfig))
  54. }
  55. }
  56. if (e.isGroup) {
  57. (e as CreateComponentGroupType).groupList.forEach(groupItem => {
  58. intComponent(groupItem)
  59. })
  60. } else {
  61. intComponent(e as CreateComponentType)
  62. }
  63. })
  64. // 创建函数-重新创建是为了处理类种方法消失的问题
  65. const create = async (
  66. _componentInstance: CreateComponentType,
  67. callBack?: (componentInstance: CreateComponentType) => void
  68. ) => {
  69. // 补充 class 上的方法
  70. let newComponent: CreateComponentType = await createComponent(_componentInstance.chartConfig)
  71. if (callBack) {
  72. if (changeId) {
  73. callBack(componentMerge(newComponent, { ..._componentInstance, id: getUUID() }))
  74. } else {
  75. callBack(componentMerge(newComponent, _componentInstance))
  76. }
  77. } else {
  78. if (changeId) {
  79. chartEditStore.addComponentList(
  80. componentMerge(newComponent, { ..._componentInstance, id: getUUID() }),
  81. false,
  82. true
  83. )
  84. } else {
  85. chartEditStore.addComponentList(componentMerge(newComponent, _componentInstance), false, true)
  86. }
  87. }
  88. }
  89. // 数据赋值
  90. for (const key in projectData) {
  91. // 组件
  92. if (key === ChartEditStoreEnum.COMPONENT_LIST) {
  93. for (const comItem of projectData[key]) {
  94. if (comItem.isGroup) {
  95. // 创建分组
  96. let groupClass = new PublicGroupConfigClass()
  97. if (changeId) {
  98. groupClass = componentMerge(groupClass, { ...comItem, id: getUUID() })
  99. } else {
  100. groupClass = componentMerge(groupClass, comItem)
  101. }
  102. // 异步注册子应用
  103. const targetList: CreateComponentType[] = []
  104. for (const groupItem of (comItem as CreateComponentGroupType).groupList) {
  105. await create(groupItem, e => {
  106. targetList.push(e)
  107. })
  108. }
  109. groupClass.groupList = targetList
  110. // 分组插入到列表
  111. chartEditStore.addComponentList(groupClass, false, true)
  112. } else {
  113. await create(comItem as CreateComponentType)
  114. }
  115. }
  116. } else {
  117. // 非组件(顺便排除脏数据)
  118. if (key !== 'editCanvasConfig' && key !== 'requestGlobalConfig') return
  119. componentMerge(chartEditStore[key], projectData[key], true)
  120. }
  121. }
  122. }
  123. return {
  124. updateComponent
  125. }
  126. }