@mx-sose-front/mx-sose-graph 1.1.8 → 1.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (180) hide show
  1. package/dist/assets/edgeWorker-b57ca007.js +2 -0
  2. package/dist/assets/edgeWorker-b57ca007.js.map +1 -0
  3. package/dist/index.d.ts +994 -31
  4. package/dist/index.esm.js +9541 -5145
  5. package/dist/index.esm.js.map +1 -1
  6. package/dist/index.umd.js +1 -1
  7. package/dist/index.umd.js.map +1 -1
  8. package/dist/style.css +1 -1
  9. package/package.json +1 -1
  10. package/src/components/Common/Tree.vue +451 -0
  11. package/src/components/Common/index.ts +2 -0
  12. package/src/components/DiagramListTooltip/DiagramListTooltip.vue +1 -2
  13. package/src/components/Edge/Edge.vue +172 -169
  14. package/src/components/Gantt/Gantt.vue +1544 -0
  15. package/src/components/GanttContextMenu/GanttContextMenu.vue +304 -0
  16. package/src/components/InteractionLayer.vue +343 -147
  17. package/src/components/Matrix/Matrix.vue +808 -0
  18. package/src/components/Matrix/index.ts +168 -0
  19. package/src/components/Shape/ConceptualRole.vue +2 -34
  20. package/src/components/Table/Table.vue +1193 -0
  21. package/src/constants/edgeShapeKeys.ts +8 -5
  22. package/src/constants/index.ts +279 -51
  23. package/src/hooks/index.ts +2 -0
  24. package/src/hooks/useChartRowSelection.ts +456 -0
  25. package/src/hooks/useResize.ts +2 -2
  26. package/src/hooks/useVirtualScroll.ts +258 -0
  27. package/src/index.ts +1 -1
  28. package/src/render/shape-renderer.ts +62 -2
  29. package/src/statics/icons/childIcons/AV-1/346/246/202/350/277/260/344/270/216/346/221/230/350/246/201/344/277/241/346/201/257/345/214/205@3x.png +0 -0
  30. package/src/statics/icons/childIcons/AV-1/346/246/202/350/277/260/346/221/230/350/246/201/345/233/276@3x.png +0 -0
  31. package/src/statics/icons/childIcons/AV-2/351/233/206/346/210/220/345/255/227/345/205/270/345/214/205@3x.png +0 -0
  32. package/src/statics/icons/childIcons/AV-2/351/233/206/346/210/220/345/255/227/345/205/270/350/241/250@3x.png +0 -0
  33. package/src/statics/icons/childIcons/CV-1/346/204/277/346/231/257/345/214/205@3x.png +0 -0
  34. package/src/statics/icons/childIcons/CV-1/346/204/277/346/231/257/345/233/276@3x.png +0 -0
  35. package/src/statics/icons/childIcons/CV-2/350/203/275/345/212/233/345/210/206/347/261/273/345/214/205@3x.png +0 -0
  36. package/src/statics/icons/childIcons/CV-2/350/203/275/345/212/233/345/210/206/347/261/273/345/233/276@3x-2.png +0 -0
  37. package/src/statics/icons/childIcons/CV-2/350/203/275/345/212/233/345/210/206/347/261/273/345/233/276@3x-3.png +0 -0
  38. package/src/statics/icons/childIcons/CV-2/350/203/275/345/212/233/345/210/206/347/261/273/345/233/276@3x.png +0 -0
  39. package/src/statics/icons/childIcons/CV-3/350/203/275/345/212/233/345/210/206/346/256/265/345/214/205@3x.png +0 -0
  40. package/src/statics/icons/childIcons/CV-3/350/203/275/345/212/233/351/230/266/346/256/265/347/224/230/347/211/271/345/233/276@3x.png +0 -0
  41. package/src/statics/icons/childIcons/CV-4/350/203/275/345/212/233/344/276/235/350/265/226/345/214/205@3x.png +0 -0
  42. package/src/statics/icons/childIcons/CV-4/350/203/275/345/212/233/344/276/235/350/265/226/345/233/276@3x.png +0 -0
  43. package/src/statics/icons/childIcons/CV-5/350/203/275/345/212/233/345/210/260/347/273/204/347/273/207/347/232/204/345/274/200/345/217/221/346/230/240/345/260/204/345/214/205@3x.png +0 -0
  44. package/src/statics/icons/childIcons/CV-5/350/203/275/345/212/233/345/210/260/347/273/204/347/273/207/347/232/204/346/230/240/345/260/204/347/237/251/351/230/265@3x.png +0 -0
  45. package/src/statics/icons/childIcons/CV-6/350/203/275/345/212/233/345/210/260/344/270/232/345/212/241/346/264/273/345/212/250/346/230/240/345/260/204/347/237/251/351/230/265@3x.png +0 -0
  46. package/src/statics/icons/childIcons/CV-6/350/203/275/345/212/233/345/210/260/344/275/234/346/210/230/346/264/273/345/212/250/347/232/204/346/230/240/345/260/204/345/214/205@3x.png +0 -0
  47. package/src/statics/icons/childIcons/CV-7/350/203/275/345/212/233/345/210/260/346/234/215/345/212/241/346/230/240/345/260/204/347/237/251/351/230/265@3x.png +0 -0
  48. package/src/statics/icons/childIcons/CV-7/350/203/275/345/212/233/345/210/260/346/234/215/345/212/241/347/232/204/346/230/240/345/260/204/345/214/205@3x.png +0 -0
  49. package/src/statics/icons/childIcons/DIV-1/346/246/202/345/277/265/346/225/260/346/215/256/346/250/241/345/236/213/345/214/205@3x.png +0 -0
  50. package/src/statics/icons/childIcons/DIV-1/346/246/202/345/277/265/346/225/260/346/215/256/346/250/241/345/236/213/345/233/276@3x.png +0 -0
  51. package/src/statics/icons/childIcons/DIV-2/351/200/273/350/276/221/346/225/260/346/215/256/346/250/241/345/236/213/345/214/205@3x.png +0 -0
  52. package/src/statics/icons/childIcons/DIV-2/351/200/273/350/276/221/346/225/260/346/215/256/346/250/241/345/236/213/345/233/276@3x.png +0 -0
  53. package/src/statics/icons/childIcons/DIV-3/347/211/251/347/220/206/346/225/260/346/215/256/346/250/241/345/236/213/345/214/205@3x.png +0 -0
  54. package/src/statics/icons/childIcons/OV-1/350/207/252/347/224/261/345/210/206/347/261/273/345/233/276@3x.png +0 -0
  55. package/src/statics/icons/childIcons/OV-1/351/253/230/347/272/247/344/275/234/346/210/230/346/246/202/345/277/265/345/233/276@3x.png +0 -0
  56. package/src/statics/icons/childIcons/OV-1/351/253/230/347/272/247/344/275/234/346/210/230/346/246/202/345/277/265/345/233/276/345/214/205@3x.png +0 -0
  57. package/src/statics/icons/childIcons/OV-2/344/275/234/346/210/230/350/265/204/346/272/220/346/265/201/345/206/205/351/203/250/346/217/217/350/277/260/345/233/276@3x-2.png +0 -0
  58. package/src/statics/icons/childIcons/OV-2/344/275/234/346/210/230/350/265/204/346/272/220/346/265/201/345/206/205/351/203/250/346/217/217/350/277/260/345/233/276@3x.png +0 -0
  59. package/src/statics/icons/childIcons/OV-2/344/275/234/346/210/230/350/265/204/346/272/220/346/265/201/346/217/217/350/277/260/345/214/205@3x.png +0 -0
  60. package/src/statics/icons/childIcons/OV-2/344/275/234/346/210/230/350/265/204/346/272/220/346/265/201/346/217/217/350/277/260/345/233/276@3x.png +0 -0
  61. package/src/statics/icons/childIcons/OV-3/344/275/234/346/210/230/350/265/204/346/272/220/346/265/201/347/237/251/351/230/265@3x.png +0 -0
  62. package/src/statics/icons/childIcons/OV-3/344/275/234/346/210/230/350/265/204/346/272/220/346/265/201/347/237/251/351/230/265/345/214/205@3x.png +0 -0
  63. package/src/statics/icons/childIcons/OV-3/345/237/272/347/241/200/350/247/222/350/211/262/344/275/234/346/210/230/350/265/204/346/272/220/346/265/201/347/237/251/351/230/265@3x.png +0 -0
  64. package/src/statics/icons/childIcons/OV-4/347/273/204/347/273/207/345/205/263/347/263/273/345/233/276@3x.png +0 -0
  65. package/src/statics/icons/childIcons/OV-4/347/273/204/347/273/207/345/205/263/347/263/273/345/233/276/345/214/205@3x.png +0 -0
  66. package/src/statics/icons/childIcons/OV-5a/344/275/234/346/210/230/346/264/273/345/212/250/345/210/206/350/247/243/346/240/221/345/214/205@3x.png +0 -0
  67. package/src/statics/icons/childIcons/OV-5a/344/275/234/346/210/230/346/264/273/345/212/250/345/210/206/350/247/243/346/240/221/345/233/276@3x.png +0 -0
  68. package/src/statics/icons/childIcons/OV-5b/344/275/234/346/210/230/346/264/273/345/212/250/346/250/241/345/236/213/345/214/205@3x.png +0 -0
  69. package/src/statics/icons/childIcons/OV-5b/344/275/234/346/210/230/346/264/273/345/212/250/346/250/241/345/236/213/345/233/276@3x.png +0 -0
  70. package/src/statics/icons/childIcons/OV-6a/344/275/234/346/210/230/350/247/204/345/210/231/346/250/241/345/236/213/345/214/205@3x.png +0 -0
  71. package/src/statics/icons/childIcons/OV-6a/344/275/234/346/210/230/350/265/204/346/272/220/345/217/202/346/225/260/345/233/276@3x.png +0 -0
  72. package/src/statics/icons/childIcons/OV-6b/347/212/266/346/200/201/350/275/254/346/215/242/345/233/276@3x.png +0 -0
  73. package/src/statics/icons/childIcons/OV-6b/347/212/266/346/200/201/350/275/254/346/215/242/346/250/241/345/236/213/345/214/205@3x.png +0 -0
  74. package/src/statics/icons/childIcons/OV-6c/344/272/213/344/273/266/350/277/275/350/270/252/346/217/217/350/277/260/345/214/205@3x.png +0 -0
  75. package/src/statics/icons/childIcons/OV-6c/344/275/234/346/210/230/344/272/213/344/273/266/350/267/237/350/270/252/346/217/217/350/277/260/345/233/276@3x.png +0 -0
  76. package/src/statics/icons/childIcons/PV-1/351/241/271/347/233/256/347/273/204/345/220/210/345/205/263/347/263/273/345/214/205@3x.png +0 -0
  77. package/src/statics/icons/childIcons/PV-1/351/241/271/347/233/256/347/273/204/345/220/210/345/205/263/347/263/273/345/233/276@3x.png +0 -0
  78. package/src/statics/icons/childIcons/PV-2/351/241/271/347/233/256/346/227/266/351/227/264/350/277/233/345/272/246/345/214/205@3x.png +0 -0
  79. package/src/statics/icons/childIcons/PV-2/351/241/271/347/233/256/346/227/266/351/227/264/350/277/233/345/272/246/347/224/230/347/211/271/345/233/276@3x.png +0 -0
  80. package/src/statics/icons/childIcons/PV-3/351/241/271/347/233/256/344/270/216/350/203/275/345/212/233/346/230/240/345/260/204/347/237/251/351/230/265@3x.png +0 -0
  81. package/src/statics/icons/childIcons/PV-3/351/241/271/347/233/256/344/270/216/350/203/275/345/212/233/347/232/204/346/230/240/345/260/204/345/214/205@3x.png +0 -0
  82. package/src/statics/icons/childIcons/SV-1 /347/263/273/347/273/237/346/216/245/345/217/243/345/206/205/351/203/250/346/217/217/350/277/260/345/233/276@3x.png +0 -0
  83. package/src/statics/icons/childIcons/SV-1 /347/263/273/347/273/237/346/216/245/345/217/243/346/217/217/350/277/260/345/233/276@3x.png +0 -0
  84. package/src/statics/icons/childIcons/SV-10a /347/263/273/347/273/237/345/217/202/346/225/260/345/233/276@3x.png +0 -0
  85. package/src/statics/icons/childIcons/SV-10a /347/263/273/347/273/237/350/247/204/345/210/231/346/250/241/345/236/213/350/241/250@3x.png +0 -0
  86. package/src/statics/icons/childIcons/SV-10a/347/263/273/347/273/237/350/247/204/345/210/231/346/250/241/345/236/213/345/214/205@3x.png +0 -0
  87. package/src/statics/icons/childIcons/SV-10b /347/263/273/347/273/237/347/212/266/346/200/201/350/275/254/346/215/242/346/217/217/350/277/260/345/233/276@3x.png +0 -0
  88. package/src/statics/icons/childIcons/SV-10b/347/263/273/347/273/237/347/212/266/346/200/201/350/275/254/346/215/242/346/217/217/350/277/260/345/214/205@3x.png +0 -0
  89. package/src/statics/icons/childIcons/SV-10c /347/263/273/347/273/237/344/272/213/344/273/266/350/267/237/350/270/252/346/217/217/350/277/260/345/233/276@3x.png +0 -0
  90. package/src/statics/icons/childIcons/SV-10c/347/263/273/347/273/237/344/272/213/344/273/266-/350/277/275/350/270/252/346/217/217/350/277/260/345/214/205@3x.png +0 -0
  91. package/src/statics/icons/childIcons/SV-1/347/263/273/347/273/237/346/216/245/345/217/243/346/217/217/350/277/260/345/214/205@3x.png +0 -0
  92. package/src/statics/icons/childIcons/SV-2 /347/263/273/347/273/237/345/206/205/351/203/250/350/265/204/346/272/220/346/265/201/345/212/250/346/217/217/350/277/260/345/233/276@3x.png +0 -0
  93. package/src/statics/icons/childIcons/SV-2 /347/263/273/347/273/237/350/265/204/346/272/220/346/265/201/345/212/250/346/217/217/350/277/260/345/233/276@3x.png +0 -0
  94. package/src/statics/icons/childIcons/SV-2/347/263/273/347/273/237/350/265/204/346/272/220/346/265/201/346/217/217/350/277/260/345/214/205@3x.png +0 -0
  95. package/src/statics/icons/childIcons/SV-3 /347/263/273/347/273/237 - /347/263/273/347/273/237/347/237/251/351/230/265@3x.png +0 -0
  96. package/src/statics/icons/childIcons/SV-3/347/263/273/347/273/237-/347/263/273/347/273/237/347/237/251/351/230/265/345/214/205@3x.png +0 -0
  97. package/src/statics/icons/childIcons/SV-4 /347/263/273/347/273/237/345/212/237/350/203/275/346/217/217/350/277/260/345/233/276@3x.png +0 -0
  98. package/src/statics/icons/childIcons/SV-4 /347/263/273/347/273/237/345/212/237/350/203/275/346/265/201/347/250/213/346/217/217/350/277/260/345/233/276@3x.png +0 -0
  99. package/src/statics/icons/childIcons/SV-4/347/263/273/347/273/237/345/212/237/350/203/275/346/217/217/350/277/260/345/214/205@3x.png +0 -0
  100. package/src/statics/icons/childIcons/SV-5a /344/270/232/345/212/241/346/264/273/345/212/250/345/210/260/347/263/273/347/273/237/345/212/237/350/203/275/347/232/204/345/217/257/350/277/275/346/272/257/346/200/247/347/237/251/351/230/265@3x.png +0 -0
  101. package/src/statics/icons/childIcons/SV-5a/344/275/234/346/210/230/346/264/273/345/212/250/345/210/260/347/263/273/347/273/237/345/212/237/350/203/275/345/217/257/350/277/275/350/270/252/347/237/251/351/230/265/345/214/205@3x.png +0 -0
  102. package/src/statics/icons/childIcons/SV-5b /344/270/232/345/212/241/346/264/273/345/212/250/345/210/260/347/263/273/347/273/237/347/232/204/345/217/257/350/277/275/346/272/257/346/200/247/347/237/251/351/230/265@3x.png +0 -0
  103. package/src/statics/icons/childIcons/SV-5b/344/275/234/346/210/230/346/264/273/345/212/250/345/210/260/347/263/273/347/273/237/345/217/257/350/277/275/350/270/252/347/237/251/351/230/265/345/214/205@3x.png +0 -0
  104. package/src/statics/icons/childIcons/SV-6 /347/263/273/347/273/237/350/265/204/346/272/220/346/265/201/345/212/250/347/237/251/351/230/265@3x.png +0 -0
  105. package/src/statics/icons/childIcons/SV-6/347/263/273/347/273/237/350/265/204/346/272/220/346/265/201/347/237/251/351/230/265/345/214/205@3x.png +0 -0
  106. package/src/statics/icons/childIcons/SV-7 /347/263/273/347/273/237/345/256/236/351/231/205/345/272/246/351/207/217/347/237/251/351/230/265@3x.png +0 -0
  107. package/src/statics/icons/childIcons/SV-7/347/263/273/347/273/237/345/272/246/351/207/217/347/237/251/351/230/265/345/214/205@3x.png +0 -0
  108. package/src/statics/icons/childIcons/SV-8 /347/263/273/347/273/237/346/274/224/350/277/233/346/217/217/350/277/260/347/224/230/347/211/271/345/233/276@3x.png +0 -0
  109. package/src/statics/icons/childIcons/SV-8/347/263/273/347/273/237/346/274/224/350/277/233/346/217/217/350/277/260/345/214/205@3x.png +0 -0
  110. package/src/statics/icons/childIcons/SV-9 /347/263/273/347/273/237/346/212/200/346/234/257/344/270/216/346/212/200/350/203/275/351/242/204/346/265/213/350/241/250@3x.png +0 -0
  111. package/src/statics/icons/childIcons/SV-9/347/263/273/347/273/237/346/212/200/346/234/257/344/270/216/346/212/200/350/203/275/351/242/204/346/265/213/345/214/205@3x.png +0 -0
  112. package/src/statics/icons/childIcons/StdV-1 /346/240/207/345/207/206/351/205/215/347/275/256/350/241/250@3x.png +0 -0
  113. package/src/statics/icons/childIcons/StdV-1/346/240/207/345/207/206/351/205/215/347/275/256/346/226/207/344/273/266/345/214/205@3x.png +0 -0
  114. package/src/statics/icons/childIcons/StdV-2 /346/240/207/345/207/206/351/242/204/346/265/213/350/241/250@3x.png +0 -0
  115. package/src/statics/icons/childIcons/StdV-2/346/240/207/345/207/206/351/242/204/346/265/213/345/214/205@3x.png +0 -0
  116. package/src/statics/icons/childIcons/SvcV-10a /346/234/215/345/212/241/345/217/202/346/225/260/345/233/276@3x.png +0 -0
  117. package/src/statics/icons/childIcons/SvcV-10a/346/234/215/345/212/241/350/247/204/345/210/231/346/250/241/345/236/213/345/214/205@3x.png +0 -0
  118. package/src/statics/icons/childIcons/SvcV-10b /346/234/215/345/212/241/347/212/266/346/200/201/350/275/254/346/215/242/346/217/217/350/277/260/345/233/276@3x.png +0 -0
  119. package/src/statics/icons/childIcons/SvcV-10b/346/234/215/345/212/241/347/212/266/346/200/201/350/275/254/346/215/242/346/217/217/350/277/260/345/214/205@3x.png +0 -0
  120. package/src/statics/icons/childIcons/SvcV-10c /346/234/215/345/212/241/344/272/213/344/273/266/350/267/237/350/270/252/346/217/217/350/277/260/345/233/276@3x.png +0 -0
  121. package/src/statics/icons/childIcons/SvcV-10c/346/234/215/345/212/241/344/272/213/344/273/266-/350/277/275/350/270/252/346/217/217/350/277/260/345/214/205@3x.png +0 -0
  122. package/src/statics/icons/childIcons/SvcV-1/346/234/215/345/212/241/344/270/212/344/270/213/346/226/207/346/217/217/350/277/260/345/233/276@3x.png +0 -0
  123. package/src/statics/icons/childIcons/SvcV-1/346/234/215/345/212/241/350/203/214/346/231/257/346/250/241/345/236/213/345/214/205@3x.png +0 -0
  124. package/src/statics/icons/childIcons/SvcV-2 /346/234/215/345/212/241/350/265/204/346/272/220/346/265/201/346/217/217/350/277/260/345/233/276@3x.png +0 -0
  125. package/src/statics/icons/childIcons/SvcV-2/346/234/215/345/212/241/350/265/204/346/272/220/346/265/201/346/217/217/350/277/260/345/214/205@3x.png +0 -0
  126. package/src/statics/icons/childIcons/SvcV-3a /347/263/273/347/273/237 -/346/234/215/345/212/241/347/237/251/351/230/265@3x-2.png +0 -0
  127. package/src/statics/icons/childIcons/SvcV-3a /347/263/273/347/273/237 -/346/234/215/345/212/241/347/237/251/351/230/265@3x.png +0 -0
  128. package/src/statics/icons/childIcons/SvcV-3a/347/263/273/347/273/237-/346/234/215/345/212/241/347/237/251/351/230/265/345/214/205@3x.png +0 -0
  129. package/src/statics/icons/childIcons/SvcV-3b/346/234/215/345/212/241-/346/234/215/345/212/241/347/237/251/351/230/265/345/214/205@3x.png +0 -0
  130. package/src/statics/icons/childIcons/SvcV-4 /346/234/215/345/212/241/345/212/237/350/203/275/346/217/217/350/277/260/345/233/276@3x.png +0 -0
  131. package/src/statics/icons/childIcons/SvcV-4 /346/234/215/345/212/241/345/212/237/350/203/275/346/265/201/345/233/276@3x.png +0 -0
  132. package/src/statics/icons/childIcons/SvcV-4/346/234/215/345/212/241/345/212/237/350/203/275/346/217/217/350/277/260/345/214/205@3x.png +0 -0
  133. package/src/statics/icons/childIcons/SvcV-5/344/275/234/346/210/230/346/264/273/345/212/250/345/210/260/346/234/215/345/212/241/345/217/257/350/277/275/350/270/252/347/237/251/351/230/265/345/214/205@3x.png +0 -0
  134. package/src/statics/icons/childIcons/SvcV-6 /346/234/215/345/212/241/350/265/204/346/272/220/346/265/201/347/237/251/351/230/265@3x.png +0 -0
  135. package/src/statics/icons/childIcons/SvcV-6/346/234/215/345/212/241/350/265/204/346/272/220/346/265/201/347/237/251/351/230/265/345/214/205@3x.png +0 -0
  136. package/src/statics/icons/childIcons/SvcV-7 /346/234/215/345/212/241/345/205/270/345/236/213/345/272/246/351/207/217/347/237/251/351/230/265@3x.png +0 -0
  137. package/src/statics/icons/childIcons/SvcV-7/346/234/215/345/212/241/345/272/246/351/207/217/347/237/251/351/230/265/345/214/205@3x.png +0 -0
  138. package/src/statics/icons/childIcons/SvcV-8 /346/234/215/345/212/241/346/274/224/350/277/233/347/224/230/347/211/271/345/233/276@3x.png +0 -0
  139. package/src/statics/icons/childIcons/SvcV-8/346/234/215/345/212/241/346/274/224/350/277/233/346/217/217/350/277/260/345/214/205@3x.png +0 -0
  140. package/src/statics/icons/childIcons/SvcV-9 /346/234/215/345/212/241/346/212/200/346/234/257/344/270/216/346/212/200/350/203/275/351/242/204/346/265/213/350/241/250@3x.png +0 -0
  141. package/src/statics/icons/childIcons/SvcV-9/346/234/215/345/212/241/346/212/200/346/234/257/344/270/216/346/212/200/350/203/275/351/242/204/346/265/213/345/214/205@3x.png +0 -0
  142. package/src/statics/icons/childIcons//344/275/223/347/263/273/346/236/266/346/236/204@3x.png +0 -0
  143. package/src/statics/icons/childIcons//344/275/234/346/210/230/350/247/206/350/247/222@3x.png +0 -0
  144. package/src/statics/icons/childIcons//345/205/250/346/231/257/350/247/206/350/247/222@3x.png +0 -0
  145. package/src/statics/icons/childIcons//345/205/254/345/217/270@3x.png +0 -0
  146. package/src/statics/icons/childIcons//345/215/217/350/256/256@3x.png +0 -0
  147. package/src/statics/icons/childIcons//345/215/217/350/256/256/345/261/202@3x.png +0 -0
  148. package/src/statics/icons/childIcons//345/215/217/350/256/256/346/240/210@3x.png +0 -0
  149. package/src/statics/icons/childIcons//345/221/275/344/273/244@3x.png +0 -0
  150. package/src/statics/icons/childIcons//346/210/230/347/225/245/346/246/202/345/277/265/350/241/250@3x.png +0 -0
  151. package/src/statics/icons/childIcons//346/216/247/345/210/266@3x.png +0 -0
  152. package/src/statics/icons/childIcons//346/224/257/346/214/201@3x.png +0 -0
  153. package/src/statics/icons/childIcons//346/225/260/346/215/256/344/277/241/346/201/257/350/247/206/350/247/222@3x.png +0 -0
  154. package/src/statics/icons/childIcons//346/234/215/345/212/241/350/247/206/350/247/222@3x.png +0 -0
  155. package/src/statics/icons/childIcons//346/240/207/345/207/206@3x.png +0 -0
  156. package/src/statics/icons/childIcons//346/240/207/345/207/206/350/247/206/350/247/222@3x.png +0 -0
  157. package/src/statics/icons/childIcons//347/263/273/347/273/237/350/247/206/350/247/222@3x.png +0 -0
  158. package/src/statics/icons/childIcons//350/203/275/345/212/233/350/247/206/350/247/222@3x.png +0 -0
  159. package/src/statics/icons/childIcons//351/241/271/347/233/256/350/247/206/350/247/222@3x.png +0 -0
  160. package/src/statics/icons/createMenu/down.png +0 -0
  161. package/src/statics/icons/createMenu/remove.png +0 -0
  162. package/src/statics/icons/createMenu/up.png +0 -0
  163. package/src/store/graphStore.ts +238 -45
  164. package/src/types/index.ts +87 -4
  165. package/src/utils/batchAutoExpand.ts +9 -10
  166. package/src/utils/containers.ts +72 -17
  167. package/src/utils/contextMenuUtils.ts +7 -7
  168. package/src/utils/dateUtils.ts +160 -0
  169. package/src/utils/diagram.ts +10 -8
  170. package/src/utils/drag.ts +6 -5
  171. package/src/utils/edgeUtils.ts +344 -427
  172. package/src/utils/edgeWorker.ts +471 -0
  173. package/src/utils/hittest.ts +37 -38
  174. package/src/utils/index.ts +3 -0
  175. package/src/utils/keyboardUtils.ts +5 -5
  176. package/src/utils/packageOutline.ts +96 -0
  177. package/src/utils/rafThrottle.ts +162 -0
  178. package/src/utils/workerManager.ts +335 -0
  179. package/src/view/graph.vue +47 -33
  180. /package/src/statics/icons/childIcons//346/210/230/347/225/{245@3x.png" → 245/345/261/202@3x.png"} +0 -0
@@ -0,0 +1,162 @@
1
+ /**
2
+ * RAF (requestAnimationFrame) 节流工具类
3
+ * 用于优化高频事件(如 mousemove、scroll 等)的性能
4
+ * 确保在浏览器重绘前只执行一次回调,避免不必要的计算
5
+ */
6
+ export class RAFThrottle {
7
+ private rafId: number | null = null
8
+ private lastArgs: any[] = []
9
+ private isPending = false
10
+
11
+ /**
12
+ * 节流执行函数
13
+ * @param fn 要执行的函数
14
+ * @returns 节流后的函数
15
+ */
16
+ throttle<T extends (...args: any[]) => any>(fn: T): T {
17
+ return ((...args: Parameters<T>) => {
18
+ // 保存最新的参数
19
+ this.lastArgs = args
20
+
21
+ // 如果已经有待执行的 RAF,直接返回
22
+ if (this.isPending) {
23
+ return
24
+ }
25
+
26
+ this.isPending = true
27
+
28
+ // 请求动画帧
29
+ this.rafId = requestAnimationFrame(() => {
30
+ this.isPending = false
31
+ this.rafId = null
32
+
33
+ // 使用最新的参数执行函数
34
+ fn(...this.lastArgs)
35
+ })
36
+ }) as T
37
+ }
38
+
39
+ /**
40
+ * 取消待执行的 RAF
41
+ */
42
+ cancel(): void {
43
+ if (this.rafId !== null) {
44
+ cancelAnimationFrame(this.rafId)
45
+ this.rafId = null
46
+ this.isPending = false
47
+ }
48
+ }
49
+
50
+ /**
51
+ * 立即执行待处理的回调(如果有)
52
+ */
53
+ flush(): void {
54
+ if (this.isPending && this.rafId !== null) {
55
+ cancelAnimationFrame(this.rafId)
56
+ this.rafId = null
57
+ this.isPending = false
58
+ }
59
+ }
60
+ }
61
+
62
+ /**
63
+ * 创建 RAF 节流实例
64
+ * @returns RAFThrottle 实例
65
+ */
66
+ export function createRAFThrottle(): RAFThrottle {
67
+ return new RAFThrottle()
68
+ }
69
+
70
+ /**
71
+ * RAF 防抖工具类
72
+ * 延迟执行函数,但在延迟期间如果有新调用,则重新计时
73
+ * 使用 requestAnimationFrame 确保在浏览器重绘前执行
74
+ */
75
+ export class RAFDebounce {
76
+ private rafId: number | null = null
77
+ private delay: number
78
+ private timer: ReturnType<typeof setTimeout> | null = null
79
+ private lastArgs: any[] = []
80
+ private isPending = false
81
+
82
+ constructor(delay: number = 0) {
83
+ this.delay = delay
84
+ }
85
+
86
+ /**
87
+ * 防抖执行函数
88
+ * @param fn 要执行的函数
89
+ * @returns 防抖后的函数
90
+ */
91
+ debounce<T extends (...args: any[]) => any>(fn: T): T {
92
+ return ((...args: Parameters<T>) => {
93
+ // 保存最新的参数
94
+ this.lastArgs = args
95
+
96
+ // 清除之前的定时器
97
+ if (this.timer !== null) {
98
+ clearTimeout(this.timer)
99
+ }
100
+
101
+ // 设置新的定时器
102
+ this.timer = setTimeout(() => {
103
+ this.timer = null
104
+
105
+ // 如果已经有待执行的 RAF,直接返回
106
+ if (this.isPending) {
107
+ return
108
+ }
109
+
110
+ this.isPending = true
111
+
112
+ // 请求动画帧
113
+ this.rafId = requestAnimationFrame(() => {
114
+ this.isPending = false
115
+ this.rafId = null
116
+
117
+ // 使用最新的参数执行函数
118
+ fn(...this.lastArgs)
119
+ })
120
+ }, this.delay)
121
+ }) as T
122
+ }
123
+
124
+ /**
125
+ * 取消待执行的 RAF 和定时器
126
+ */
127
+ cancel(): void {
128
+ if (this.timer !== null) {
129
+ clearTimeout(this.timer)
130
+ this.timer = null
131
+ }
132
+ if (this.rafId !== null) {
133
+ cancelAnimationFrame(this.rafId)
134
+ this.rafId = null
135
+ this.isPending = false
136
+ }
137
+ }
138
+
139
+ /**
140
+ * 立即执行待处理的回调(如果有)
141
+ */
142
+ flush(): void {
143
+ if (this.timer !== null) {
144
+ clearTimeout(this.timer)
145
+ this.timer = null
146
+ }
147
+ if (this.isPending && this.rafId !== null) {
148
+ cancelAnimationFrame(this.rafId)
149
+ this.rafId = null
150
+ this.isPending = false
151
+ }
152
+ }
153
+ }
154
+
155
+ /**
156
+ * 创建 RAF 防抖实例
157
+ * @param delay 延迟时间(毫秒)
158
+ * @returns RAFDebounce 实例
159
+ */
160
+ export function createRAFDebounce(delay: number = 0): RAFDebounce {
161
+ return new RAFDebounce(delay)
162
+ }
@@ -0,0 +1,335 @@
1
+ // workerManager.ts - Web Worker manager for handling edge calculations
2
+
3
+ import type { Shape } from '../types';
4
+
5
+ interface WorkerMessage {
6
+ type: string;
7
+ data: any;
8
+ id: number;
9
+ }
10
+
11
+ interface WorkerResponse {
12
+ id: number;
13
+ result: any;
14
+ error?: string;
15
+ }
16
+
17
+ interface WorkerTask {
18
+ resolve: (value: any) => void;
19
+ reject: (reason: any) => void;
20
+ }
21
+
22
+ export class WorkerManager {
23
+ private worker: Worker | null = null;
24
+ private taskQueue: Map<number, WorkerTask> = new Map();
25
+ private nextTaskId = 1;
26
+ private isInitialized = false;
27
+ private initializationPromise: Promise<void> | null = null;
28
+
29
+ /**
30
+ * 各操作类型的版本号,用于竞态控制。
31
+ * 每次发起同类型请求时递增,回调中只采纳最新版本的结果。
32
+ */
33
+ private versionMap: Map<string, number> = new Map();
34
+
35
+ /**
36
+ * Initialize the Web Worker
37
+ */
38
+ initialize(): Promise<void> {
39
+ if (this.isInitialized) {
40
+ return Promise.resolve();
41
+ }
42
+
43
+ if (this.initializationPromise) {
44
+ return this.initializationPromise;
45
+ }
46
+
47
+ this.initializationPromise = new Promise((resolve, reject) => {
48
+ try {
49
+ this.worker = new Worker(new URL('./edgeWorker.ts', import.meta.url), { type: 'module' });
50
+
51
+ this.worker.addEventListener('message', (event: MessageEvent<WorkerResponse>) => {
52
+ this.handleWorkerMessage(event.data);
53
+ });
54
+
55
+ this.worker.addEventListener('error', (error: ErrorEvent) => {
56
+ console.error('Worker error:', error);
57
+ reject(error);
58
+ });
59
+
60
+ this.isInitialized = true;
61
+ resolve();
62
+ } catch (error) {
63
+ console.error('Failed to initialize worker:', error);
64
+ reject(error);
65
+ }
66
+ });
67
+
68
+ return this.initializationPromise;
69
+ }
70
+
71
+ /**
72
+ * Handle messages from the worker
73
+ */
74
+ private handleWorkerMessage(response: WorkerResponse): void {
75
+ const { id, result, error } = response;
76
+ const task = this.taskQueue.get(id);
77
+
78
+ if (task) {
79
+ this.taskQueue.delete(id);
80
+ if (error) {
81
+ task.reject(new Error(error));
82
+ } else {
83
+ task.resolve(result);
84
+ }
85
+ }
86
+ }
87
+
88
+ /**
89
+ * 递增并返回指定操作类型的版本号
90
+ */
91
+ private bumpVersion(opType: string): number {
92
+ const next = (this.versionMap.get(opType) ?? 0) + 1;
93
+ this.versionMap.set(opType, next);
94
+ return next;
95
+ }
96
+
97
+ /**
98
+ * 检查版本号是否仍然是最新的
99
+ */
100
+ isLatestVersion(opType: string, version: number): boolean {
101
+ return (this.versionMap.get(opType) ?? 0) === version;
102
+ }
103
+
104
+ /**
105
+ * Send a message to the worker and return a promise for the result
106
+ */
107
+ private sendMessage(type: string, data: any): Promise<any> {
108
+ return new Promise((resolve, reject) => {
109
+ if (!this.worker || !this.isInitialized) {
110
+ reject(new Error('Worker not initialized'));
111
+ return;
112
+ }
113
+
114
+ const taskId = this.nextTaskId++;
115
+ this.taskQueue.set(taskId, { resolve, reject });
116
+
117
+ const message: WorkerMessage = {
118
+ type,
119
+ data,
120
+ id: taskId
121
+ };
122
+
123
+ try {
124
+ this.worker.postMessage(message);
125
+ } catch (error) {
126
+ this.taskQueue.delete(taskId);
127
+ reject(error);
128
+ }
129
+ });
130
+ }
131
+
132
+ /**
133
+ * 只提取 Worker 需要的最小字段,减少序列化开销
134
+ * 使用展开运算符确保所有嵌套对象都是纯 JS 对象(去除 Vue Proxy)
135
+ */
136
+ private minifyShape(shape: Shape): any {
137
+ const bounds = shape.bounds
138
+ ? { x: shape.bounds.x, y: shape.bounds.y, width: shape.bounds.width, height: shape.bounds.height }
139
+ : undefined;
140
+ return {
141
+ id: shape.id,
142
+ shapeType: shape.shapeType,
143
+ bounds,
144
+ sourceId: shape.sourceId,
145
+ targetId: shape.targetId,
146
+ modelId: shape.modelId,
147
+ shapeKey: shape.shapeKey,
148
+ direction: shape.direction,
149
+ parenShapeId: shape.parenShapeId,
150
+ waypointId: (shape as any).waypointId,
151
+ };
152
+ }
153
+
154
+ /**
155
+ * 将可能来自 Vue ref/reactive 的点坐标转换为普通对象,避免 postMessage 触发 DataCloneError
156
+ */
157
+ private minifyPoint(
158
+ point: { x?: number; y?: number } | null | undefined
159
+ ): { x: number; y: number } | undefined {
160
+ if (!point) return undefined;
161
+
162
+ return {
163
+ x: Number(point.x ?? 0),
164
+ y: Number(point.y ?? 0),
165
+ };
166
+ }
167
+
168
+ /**
169
+ * 只提取与 changedIds 相关的 edge,减少传输量
170
+ */
171
+ private extractRelatedEdges(
172
+ edgeIndex: Map<string, Shape[]> | undefined,
173
+ changedIds: string[]
174
+ ): Shape[] | undefined {
175
+ if (!edgeIndex) return undefined;
176
+ const seen = new Set<string>();
177
+ const result: Shape[] = [];
178
+ for (const id of changedIds) {
179
+ const edges = edgeIndex.get(id);
180
+ if (edges) {
181
+ for (const e of edges) {
182
+ if (!seen.has(e.id)) {
183
+ seen.add(e.id);
184
+ result.push(e);
185
+ }
186
+ }
187
+ }
188
+ }
189
+ return result;
190
+ }
191
+
192
+ /**
193
+ * Update related edges endpoints
194
+ * 返回 { version, result } 以便调用方判断竞态
195
+ */
196
+ async updateRelatedEdges(
197
+ shapes: Shape[],
198
+ changedIds: string[],
199
+ edgeIndex?: Map<string, Shape[]>,
200
+ shapeMapIndex?: Map<string, Shape>
201
+ ): Promise<{ version: number; result: Shape[] }> {
202
+ await this.initialize();
203
+
204
+ const version = this.bumpVersion('updateRelatedEdges');
205
+
206
+ // 只传相关的 edge 和它们引用的 source/target shape,而非全量 shapes
207
+ const relatedEdges = this.extractRelatedEdges(edgeIndex, changedIds);
208
+ const neededShapeIds = new Set<string>(changedIds);
209
+ if (relatedEdges) {
210
+ for (const e of relatedEdges) {
211
+ if (e.sourceId) neededShapeIds.add(e.sourceId);
212
+ if (e.targetId) neededShapeIds.add(e.targetId);
213
+ }
214
+ }
215
+
216
+ const minShapes = relatedEdges
217
+ ? Array.from(neededShapeIds)
218
+ .map(id => shapeMapIndex?.get(id))
219
+ .filter(Boolean)
220
+ .map(s => this.minifyShape(s!))
221
+ .concat(relatedEdges.map(e => this.minifyShape(e)))
222
+ : shapes.map(s => this.minifyShape(s));
223
+
224
+ // 构建精简的 shapeMap(只包含需要的)
225
+ const shapeMapData: Record<string, any> = {};
226
+ if (shapeMapIndex) {
227
+ for (const id of neededShapeIds) {
228
+ const s = shapeMapIndex.get(id);
229
+ if (s) shapeMapData[id] = this.minifyShape(s);
230
+ }
231
+ }
232
+
233
+ // 构建精简的 edgeIndex
234
+ let edgeIndexData: Record<string, any[]> | undefined;
235
+ if (edgeIndex) {
236
+ edgeIndexData = {};
237
+ for (const id of changedIds) {
238
+ const edges = edgeIndex.get(id);
239
+ if (edges) {
240
+ edgeIndexData[id] = edges.map(e => this.minifyShape(e));
241
+ }
242
+ }
243
+ }
244
+
245
+ const result = await this.sendMessage('updateRelatedEdges', {
246
+ shapes: minShapes,
247
+ changedIds,
248
+ edgeIndex: edgeIndexData,
249
+ shapeMapIndex: shapeMapData
250
+ });
251
+
252
+ return { version, result };
253
+ }
254
+
255
+ /**
256
+ * Initialize all edge endpoints
257
+ */
258
+ async initializeAllEdgeEndpoints(
259
+ shapes: Shape[],
260
+ shapeMapIndex?: Map<string, Shape>
261
+ ): Promise<Shape[]> {
262
+ await this.initialize();
263
+
264
+ const minShapes = shapes.map(s => this.minifyShape(s));
265
+ const shapeMapData = shapeMapIndex
266
+ ? Object.fromEntries(
267
+ Array.from(shapeMapIndex.entries()).map(([k, v]) => [k, this.minifyShape(v)])
268
+ )
269
+ : undefined;
270
+
271
+ return this.sendMessage('initializeAllEdgeEndpoints', {
272
+ shapes: minShapes,
273
+ shapeMapIndex: shapeMapData
274
+ });
275
+ }
276
+
277
+ /**
278
+ * Complete connection operation
279
+ */
280
+ async completeConnection(
281
+ sourceShape: Shape | undefined,
282
+ targetShape: Shape,
283
+ clickPoint: { x: number; y: number },
284
+ currentConnectPoint: { x: number; y: number },
285
+ shapes: Shape[] = []
286
+ ): Promise<any> {
287
+ await this.initialize();
288
+
289
+ return this.sendMessage('completeConnection', {
290
+ sourceShape: sourceShape ? this.minifyShape(sourceShape) : undefined,
291
+ targetShape: this.minifyShape(targetShape),
292
+ clickPoint: this.minifyPoint(clickPoint),
293
+ currentConnectPoint: this.minifyPoint(currentConnectPoint),
294
+ shapes: shapes.map(s => this.minifyShape(s))
295
+ });
296
+ }
297
+
298
+ /**
299
+ * Find nearest connect point
300
+ */
301
+ async findNearestConnectPoint(
302
+ mousePos: { x: number; y: number },
303
+ shape: Shape | undefined
304
+ ): Promise<any> {
305
+ await this.initialize();
306
+
307
+ return this.sendMessage('findNearestConnectPoint', {
308
+ mousePos: this.minifyPoint(mousePos),
309
+ shape: shape ? this.minifyShape(shape) : undefined
310
+ });
311
+ }
312
+
313
+ /**
314
+ * Terminate the worker
315
+ */
316
+ terminate(): void {
317
+ if (this.worker) {
318
+ this.worker.terminate();
319
+ this.worker = null;
320
+ this.isInitialized = false;
321
+ this.taskQueue.clear();
322
+ this.versionMap.clear();
323
+ }
324
+ }
325
+
326
+ /**
327
+ * Get worker status
328
+ */
329
+ isWorkerInitialized(): boolean {
330
+ return this.isInitialized;
331
+ }
332
+ }
333
+
334
+ // Create a singleton instance
335
+ export const workerManager = new WorkerManager();
@@ -4,7 +4,7 @@
4
4
  <div class="diagram-content" ref="diagramContentRef" @wheel="handleWheel">
5
5
  <div class="shapes-container" v-if="shapes.length > 0">
6
6
  <component v-for="shape in shapes" :key="shape.id"
7
- v-memo="[shape.id, shape.bounds, graphStore.selectedShape?.id === shape.id]" :is="getShapeComponent(shape)"
7
+ v-memo="[shape.id, shape.bounds?.x, shape.bounds?.y, shape.bounds?.width, shape.bounds?.height, shape.name, shape.parenShapeId, shape.style?.zIndex, shape.waypointId, graphStore.selectedShape?.id === shape.id]" :is="getShapeComponent(shape)"
8
8
  :shape="shape" :style="getShapeStyle(shape)" @name-click="handleNameClick" @shape-click="handleShapeClick"
9
9
  @edge-click="handleEdgeClick"
10
10
  :is-selected="graphStore.selectedShape?.id === shape.id && shape.shapeType === 'edge'" class="shape-element"
@@ -13,7 +13,8 @@
13
13
  </div>
14
14
 
15
15
  <!-- 剪切状态遮盖层 - 使用 SVG 渲染,性能更优 -->
16
- <svg v-if="cutShapeBounds.length > 0" class="cut-overlay-svg">
16
+ <svg v-if="cutShapeBounds.length > 0" class="cut-overlay-svg"
17
+ :style="{ width: diagramBounds ? `${diagramBounds.width}px` : '100%', height: diagramBounds ? `${diagramBounds.height}px` : '100%' }">
17
18
  <rect v-for="bounds in cutShapeBounds" :key="bounds.id"
18
19
  :x="bounds.x"
19
20
  :y="bounds.y"
@@ -22,8 +23,8 @@
22
23
  fill="rgba(255, 255, 255, 0.6)" />
23
24
  </svg>
24
25
 
25
- <!-- 交互层 - 整合了连接层逻辑 -->
26
- <InteractionLayer v-if="diagramBounds" ref="interactionLayerRef" :connect-shape-data="connectShapeData"
26
+ <!-- 交互层 - 整合了连接层逻辑(甘特图模式下不渲染) -->
27
+ <InteractionLayer v-if="diagramBounds && !isGanttMode" ref="interactionLayerRef" :connect-shape-data="connectShapeData"
27
28
  :diagram-bounds="diagramBounds" :style="{
28
29
  width: `${(diagramBounds?.width ?? 0) - 10}px`,
29
30
  height: `${(diagramBounds?.height ?? 0) - 10}px`,
@@ -38,7 +39,6 @@
38
39
  :packages="props.packages" :diagram="props.diagram" :tagged-value-labels="props.taggedValueLabels"
39
40
  @action-button-add="handleActionButtonAdd" />
40
41
  </div>
41
-
42
42
  <!-- 所在图表 -->
43
43
  <DiagramListTooltip :visible="tooltipVisible" :x="tooltipX" :y="tooltipY" :current-diagram-id="currentDiagramId"
44
44
  @close="tooltipVisible = false" :diagram-location-data="chartLocationData || []" />
@@ -64,13 +64,16 @@ import Diagram from '../components/Shape/Diagram.vue'
64
64
  import ActivityAction from '../components/Shape/ActivityAction.vue'
65
65
  import Pin from '../components/Pin/Pin.vue'
66
66
  import Port from '../components/Pin/Port.vue'
67
+ import Gantt from '../components/Gantt/Gantt.vue'
67
68
  import { registerShapes } from "../render/shape-registry";
68
69
  import { getShapeComponent, getShapeStyle, clearEdgeStyleCache } from "../render/shape-renderer";
69
- import { ShapeConfig } from '../utils/diagram'
70
+ import { ShapeConfig, adjustCanvasToFitAllShapes } from '../utils/diagram'
70
71
  import { setCompartmentZones, buildZones, setTaggedValueLabelsCache, setPackageTypesCache } from '../utils/compartment'
71
72
  import { eventBus } from "../store";
72
73
  import { guardOperate } from "../utils/license-guard"
73
74
  import DiagramListTooltip from '../components/DiagramListTooltip/DiagramListTooltip.vue';
75
+ import Table from '../components/Table/Table.vue'
76
+ import Matrix from '../components/Matrix/Matrix.vue';
74
77
 
75
78
  registerShapes({
76
79
  StrategicTaxonomyDiagram,
@@ -84,7 +87,10 @@ registerShapes({
84
87
  ActivityAction,
85
88
  Diagram,
86
89
  Pin,
87
- Port
90
+ Port,
91
+ Gantt,
92
+ Table,
93
+ Matrix
88
94
  })
89
95
  const interactionLayerRef = ref<InstanceType<typeof InteractionLayer> | null>(null)
90
96
  const diagramContentRef = ref<HTMLDivElement | null>(null) // 画布内容区域ref
@@ -218,9 +224,18 @@ const onCompartmentMetrics = (
218
224
  const z = buildZones(shape, m)
219
225
  setCompartmentZones(shape.id, z)
220
226
  }
221
- // 获取StrategicTaxonomyDiagram的bounds
227
+
228
+ // 是否为甘特图模式
229
+ const isGanttMode = computed(() => {
230
+ return shapes.value.some(s => s.shapeType === 'gantt' || s.shapeType === 'table' || s.shapeType === 'matrix')
231
+ })
232
+
233
+ // 获取画布(diagram)的 bounds,仅用于 InteractionLayer 定位和剪切遮盖层尺寸
234
+ // 甘特图/表格/矩阵等铺满型画布也需取对应 shape 的 bounds
222
235
  const diagramBounds = computed(() => {
223
- const diagram = shapes.value.find(s => s.shapeType === ShapeConfig.SHAPE_TYPE)
236
+ const diagram = shapes.value.find(s =>
237
+ s.shapeType === ShapeConfig.SHAPE_TYPE || s.shapeType === 'gantt' || s.shapeType === 'table' || s.shapeType === 'matrix'
238
+ )
224
239
  return diagram?.bounds || null
225
240
  })
226
241
 
@@ -243,6 +258,13 @@ const handleNameClick = (shape: Shape, event: MouseEvent) => {
243
258
  // 处理图形点击事件
244
259
  const handleShapeClick = (shape: Shape, event: MouseEvent) => {
245
260
  return guardOperate(async () => {
261
+ if (
262
+ props.connectShapeData?.sourceId &&
263
+ interactionLayerRef.value?.tryCompleteConnectionFromShapeClick?.(shape)
264
+ ) {
265
+ return
266
+ }
267
+
246
268
  graphStore.selectShape(shape)
247
269
  })
248
270
  }
@@ -353,19 +375,15 @@ const handleWheel = (event: WheelEvent) => {
353
375
  }
354
376
 
355
377
  const updateShapes = (shapes: Shape[]) => {
356
- shapes.sort((a, b) => {
357
- if (a.shapeType === 'diagram') return -1
358
- if (b.shapeType === 'diagram') return 1
359
- return 0
360
- })
361
378
  clearEdgeStyleCache() // 批量更新时清空 edge 样式缓存,避免旧数据残留
362
379
  // graphStore.updateShapes(shapes)
363
380
  graphStore.shapes=[]
364
381
  graphStore.updateShapes(shapes, 'replace');
365
382
  // 在图形批量更新后(通常是从后端加载数据),初始化所有连线的端点
366
383
  // 确保连线不会横跨图元,而是从合适的位置连接
367
- nextTick(() => {
368
- graphStore.initializeAllEdgeEndpoints()
384
+ nextTick(async () => {
385
+ await graphStore.initializeAllEdgeEndpoints()
386
+ adjustCanvasToFitAllShapes()
369
387
  })
370
388
  }
371
389
 
@@ -380,8 +398,6 @@ watch(() => props.addShapeData, async (newVal, oldVal) => {
380
398
  graphStore.addShape(newVal)
381
399
  graphStore.selectShape(newVal)
382
400
  eventBus.emit('addShape:ok')
383
- // graphStore.addShape(newVal)
384
- // resShape.value = newVal
385
401
  },)
386
402
  function sweepShapesWithInert() {
387
403
  const arr = graphStore.shapes as any[]
@@ -460,18 +476,23 @@ watch(
460
476
  immediate: true,
461
477
  }
462
478
  )
479
+ const handleKeyDown = (event: KeyboardEvent) => {
480
+ if (event.key === 'Escape') {
481
+ graphStore.clearSelection()
482
+ graphStore.selectedIds = []
483
+ }
484
+ }
485
+
463
486
  onMounted(() => {
464
487
  initShapes()
465
- document.addEventListener('keydown', (e) => {
466
- if (e.key === 'Escape') {
467
- graphStore.clearSelection()
468
- graphStore.selectedIds = []
469
- }
470
- });
488
+ document.addEventListener('keydown', handleKeyDown);
471
489
 
472
490
  // 监听所在图表弹窗位置信息事件
473
491
  eventBus.on('locate-chart-position', handleLocateChartPosition)
474
492
 
493
+ // 初始化画布大小
494
+ nextTick(adjustCanvasToFitAllShapes)
495
+
475
496
  // ========== 视口裁剪优化:初始化视口 ==========
476
497
  nextTick(() => {
477
498
  updateViewport() // 初始化视口边界
@@ -486,12 +507,7 @@ onMounted(() => {
486
507
  })
487
508
 
488
509
  onUnmounted(() => {
489
- document.removeEventListener('keydown', (e) => {
490
- if (e.key === 'Escape') {
491
- graphStore.clearSelection()
492
- graphStore.selectedIds = []
493
- }
494
- });
510
+ document.removeEventListener('keydown', handleKeyDown);
495
511
 
496
512
  // 移除所在图表弹窗位置信息事件监听器
497
513
  eventBus.off('locate-chart-position', handleLocateChartPosition)
@@ -572,9 +588,7 @@ defineExpose({
572
588
  position: absolute;
573
589
  top: 0;
574
590
  left: 0;
575
- width: 100%;
576
- height: 100%;
577
591
  pointer-events: none;
578
592
  z-index: 998;
579
593
  }
580
- </style>
594
+ </style>