useSync.hook.ts 6.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190
  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 { BaseEvent, EventLife, CreateComponentType, CreateComponentGroupType } from '@/packages/index.d'
  7. import { PublicGroupConfigClass } from '@/packages/public/publicConfig'
  8. import merge from 'lodash/merge'
  9. /**
  10. * * 画布-版本升级对旧数据无法兼容的补丁
  11. * @param object
  12. */
  13. const canvasVersionUpdatePolyfill = (object: any) => {
  14. return object
  15. }
  16. /**
  17. * * 组件-版本升级对旧数据无法兼容的补丁
  18. * @param newObject
  19. * @param sources
  20. */
  21. const componentVersionUpdatePolyfill = (newObject: any, sources: any) => {
  22. try {
  23. // 判断是否是组件
  24. if (sources.id) {
  25. // 处理事件补丁
  26. const hasVnodeBeforeMount = 'vnodeBeforeMount' in sources.events
  27. const hasVnodeMounted = 'vnodeMounted' in sources.events
  28. if (hasVnodeBeforeMount) {
  29. newObject.events.advancedEvents.vnodeBeforeMount = sources?.events.vnodeBeforeMount
  30. }
  31. if (hasVnodeMounted) {
  32. newObject.events.advancedEvents.vnodeMounted = sources?.events.vnodeMounted
  33. }
  34. if (hasVnodeBeforeMount || hasVnodeMounted) {
  35. sources.events = {
  36. baseEvent: {
  37. [BaseEvent.ON_CLICK]: undefined,
  38. [BaseEvent.ON_DBL_CLICK]: undefined,
  39. [BaseEvent.ON_MOUSE_ENTER]: undefined,
  40. [BaseEvent.ON_MOUSE_LEAVE]: undefined
  41. },
  42. advancedEvents: {
  43. [EventLife.VNODE_MOUNTED]: undefined,
  44. [EventLife.VNODE_BEFORE_MOUNT]: undefined
  45. }
  46. }
  47. }
  48. return newObject
  49. }
  50. } catch (error) {
  51. return newObject
  52. }
  53. }
  54. /**
  55. * * 合并处理
  56. * @param newObject 新的模板数据
  57. * @param sources 新拿到的数据
  58. * @returns object
  59. */
  60. const componentMerge = (newObject: any, sources: any, notComponent = false) => {
  61. // 处理组件补丁
  62. componentVersionUpdatePolyfill(newObject, sources)
  63. // 非组件不处理
  64. if (notComponent) return merge(newObject, sources)
  65. // 组件排除 newObject
  66. const option = sources.option
  67. if (!option) return merge(newObject, sources)
  68. // 为 undefined 的 sources 来源对象属性将被跳过详见 https://www.lodashjs.com/docs/lodash.merge
  69. sources.option = undefined
  70. if (option) {
  71. return {
  72. ...merge(newObject, sources),
  73. option: option
  74. }
  75. }
  76. }
  77. // 请求处理
  78. export const useSync = () => {
  79. const chartEditStore = useChartEditStore()
  80. const chartHistoryStore = useChartHistoryStore()
  81. /**
  82. * * 组件动态注册
  83. * @param projectData 项目数据
  84. * @param isReplace 是否替换数据
  85. * @returns
  86. */
  87. const updateComponent = async (projectData: ChartEditStorage, isReplace = false, changeId = false) => {
  88. if (isReplace) {
  89. // 清除列表
  90. chartEditStore.componentList = []
  91. // 清除历史记录
  92. chartHistoryStore.clearBackStack()
  93. chartHistoryStore.clearForwardStack()
  94. }
  95. // 画布补丁处理
  96. projectData.editCanvasConfig = canvasVersionUpdatePolyfill(projectData.editCanvasConfig)
  97. // 列表组件注册
  98. projectData.componentList.forEach(async (e: CreateComponentType | CreateComponentGroupType) => {
  99. const intComponent = (target: CreateComponentType) => {
  100. if (!window['$vue'].component(target.chartConfig.chartKey)) {
  101. window['$vue'].component(target.chartConfig.chartKey, fetchChartComponent(target.chartConfig))
  102. window['$vue'].component(target.chartConfig.conKey, fetchConfigComponent(target.chartConfig))
  103. }
  104. }
  105. if (e.isGroup) {
  106. (e as CreateComponentGroupType).groupList.forEach(groupItem => {
  107. intComponent(groupItem)
  108. })
  109. } else {
  110. intComponent(e as CreateComponentType)
  111. }
  112. })
  113. // 创建函数-重新创建是为了处理类种方法消失的问题
  114. const create = async (
  115. _componentInstance: CreateComponentType,
  116. callBack?: (componentInstance: CreateComponentType) => void
  117. ) => {
  118. // 补充 class 上的方法
  119. let newComponent: CreateComponentType = await createComponent(_componentInstance.chartConfig)
  120. if (callBack) {
  121. if (changeId) {
  122. callBack(componentMerge(newComponent, { ..._componentInstance, id: getUUID() }))
  123. } else {
  124. callBack(componentMerge(newComponent, _componentInstance))
  125. }
  126. } else {
  127. if (changeId) {
  128. chartEditStore.addComponentList(
  129. componentMerge(newComponent, { ..._componentInstance, id: getUUID() }),
  130. false,
  131. true
  132. )
  133. } else {
  134. chartEditStore.addComponentList(componentMerge(newComponent, _componentInstance), false, true)
  135. }
  136. }
  137. }
  138. // 数据赋值
  139. for (const key in projectData) {
  140. // 组件
  141. if (key === ChartEditStoreEnum.COMPONENT_LIST) {
  142. for (const comItem of projectData[key]) {
  143. if (comItem.isGroup) {
  144. // 创建分组
  145. let groupClass = new PublicGroupConfigClass()
  146. if (changeId) {
  147. groupClass = componentMerge(groupClass, { ...comItem, id: getUUID() })
  148. } else {
  149. groupClass = componentMerge(groupClass, comItem)
  150. }
  151. // 异步注册子应用
  152. const targetList: CreateComponentType[] = []
  153. for (const groupItem of (comItem as CreateComponentGroupType).groupList) {
  154. await create(groupItem, e => {
  155. targetList.push(e)
  156. })
  157. }
  158. groupClass.groupList = targetList
  159. // 分组插入到列表
  160. chartEditStore.addComponentList(groupClass, false, true)
  161. } else {
  162. await create(comItem as CreateComponentType)
  163. }
  164. }
  165. } else {
  166. // 非组件(顺便排除脏数据)
  167. if (key !== 'editCanvasConfig' && key !== 'requestGlobalConfig') return
  168. componentMerge(chartEditStore[key], projectData[key], true)
  169. }
  170. }
  171. }
  172. return {
  173. updateComponent
  174. }
  175. }