useSync.hook.ts 4.8 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. for (const key in projectData) {
  66. // 组件
  67. if (key === ChartEditStoreEnum.COMPONENT_LIST) {
  68. for (const comItem of projectData[key]) {
  69. // 重新创建是为了处理类种方法消失的问题
  70. const create = async (
  71. _componentInstance: CreateComponentType,
  72. callBack?: (componentInstance: CreateComponentType) => void
  73. ) => {
  74. // 补充 class 上的方法
  75. let newComponent: CreateComponentType = await createComponent(_componentInstance.chartConfig)
  76. newComponent.option = _componentInstance?.option
  77. if (callBack) {
  78. if (changeId) {
  79. callBack(componentMerge(newComponent, { ..._componentInstance, id: getUUID() }))
  80. } else {
  81. callBack(componentMerge(newComponent, _componentInstance))
  82. }
  83. } else {
  84. if (changeId) {
  85. chartEditStore.addComponentList(
  86. componentMerge(newComponent, { ..._componentInstance, id: getUUID() }),
  87. false,
  88. true
  89. )
  90. } else {
  91. chartEditStore.addComponentList(componentMerge(newComponent, _componentInstance), false, true)
  92. }
  93. }
  94. }
  95. if (comItem.isGroup) {
  96. // 创建分组
  97. let groupClass = new PublicGroupConfigClass()
  98. if (changeId) {
  99. groupClass = componentMerge(groupClass, { ...comItem, id: getUUID() })
  100. } else {
  101. groupClass = componentMerge(groupClass, comItem)
  102. }
  103. // 注册子应用
  104. const targetList: CreateComponentType[] = []
  105. ;(comItem as CreateComponentGroupType).groupList.forEach(groupItem => {
  106. create(groupItem, e => {
  107. targetList.push(e)
  108. })
  109. })
  110. groupClass.groupList = targetList
  111. // 分组插入到列表
  112. chartEditStore.addComponentList(groupClass, false, true)
  113. } else {
  114. create(comItem as CreateComponentType)
  115. }
  116. }
  117. } else {
  118. // 非组件(顺便排除脏数据)
  119. if (key !== 'editCanvasConfig' && key !== 'requestGlobalConfig') return
  120. componentMerge(chartEditStore[key], projectData[key], true)
  121. }
  122. }
  123. }
  124. return {
  125. updateComponent
  126. }
  127. }