@logicflow/extension 2.0.0-beta.1 → 2.0.0-beta.10

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 (235) hide show
  1. package/.turbo/turbo-build.log +361 -6
  2. package/dist/index.css +63 -0
  3. package/dist/index.min.js +32 -2
  4. package/es/NodeResize/control/Control.d.ts +3 -3
  5. package/es/NodeResize/control/Control.js +13 -3
  6. package/es/NodeResize/control/Control.js.map +1 -1
  7. package/es/NodeResize/index.d.ts +4 -0
  8. package/es/NodeResize/index.js.map +1 -1
  9. package/es/NodeResize/node/DiamondResize.d.ts +1 -0
  10. package/es/NodeResize/node/DiamondResize.js +2 -1
  11. package/es/NodeResize/node/DiamondResize.js.map +1 -1
  12. package/es/NodeResize/node/EllipseResize.d.ts +1 -0
  13. package/es/NodeResize/node/EllipseResize.js +2 -1
  14. package/es/NodeResize/node/EllipseResize.js.map +1 -1
  15. package/es/NodeResize/node/HtmlResize.js +1 -1
  16. package/es/NodeResize/node/HtmlResize.js.map +1 -1
  17. package/es/NodeResize/node/RectResize.js +1 -1
  18. package/es/NodeResize/node/RectResize.js.map +1 -1
  19. package/es/bpmn/constant.d.ts +1 -1
  20. package/es/bpmn/constant.js +3 -0
  21. package/es/bpmn/constant.js.map +1 -1
  22. package/es/bpmn/index.d.ts +3 -6
  23. package/es/bpmn/index.js +5 -7
  24. package/es/bpmn/index.js.map +1 -1
  25. package/es/bpmn-elements/presets/Pool/Pool.d.ts +21 -1
  26. package/es/components/control/index.d.ts +4 -4
  27. package/es/components/control/index.js.map +1 -1
  28. package/es/components/highlight/index.d.ts +6 -4
  29. package/es/components/highlight/index.js +32 -5
  30. package/es/components/highlight/index.js.map +1 -1
  31. package/es/components/menu/index.d.ts +1 -1
  32. package/es/components/menu/index.js +9 -10
  33. package/es/components/menu/index.js.map +1 -1
  34. package/es/components/mini-map/index.d.ts +1 -1
  35. package/es/components/mini-map/index.js +2 -2
  36. package/es/components/mini-map/index.js.map +1 -1
  37. package/es/components/selection-select/index.d.ts +1 -1
  38. package/es/components/selection-select/index.js.map +1 -1
  39. package/es/dynamic-group/index.d.ts +106 -0
  40. package/es/dynamic-group/index.js +536 -0
  41. package/es/dynamic-group/index.js.map +1 -0
  42. package/es/dynamic-group/model.d.ts +135 -0
  43. package/es/dynamic-group/model.js +413 -0
  44. package/es/dynamic-group/model.js.map +1 -0
  45. package/es/dynamic-group/node.d.ts +16 -0
  46. package/es/dynamic-group/node.js +143 -0
  47. package/es/dynamic-group/node.js.map +1 -0
  48. package/es/dynamic-group/utils.d.ts +17 -0
  49. package/es/dynamic-group/utils.js +27 -0
  50. package/es/dynamic-group/utils.js.map +1 -0
  51. package/es/index.css +63 -0
  52. package/es/index.d.ts +16 -8
  53. package/es/index.js +24 -8
  54. package/es/index.js.map +1 -1
  55. package/es/insert-node-in-polyline/index.js +3 -3
  56. package/es/insert-node-in-polyline/index.js.map +1 -1
  57. package/es/materials/group/GroupNode.d.ts +6 -10
  58. package/es/materials/group/GroupNode.js +8 -6
  59. package/es/materials/group/GroupNode.js.map +1 -1
  60. package/es/materials/group/index.d.ts +5 -5
  61. package/es/materials/group/index.js +25 -26
  62. package/es/materials/group/index.js.map +1 -1
  63. package/es/materials/node-selection/index.d.ts +6 -1
  64. package/es/materials/node-selection/index.js +64 -56
  65. package/es/materials/node-selection/index.js.map +1 -1
  66. package/es/mindmap/index.d.ts +2 -2
  67. package/es/style/index.css +63 -0
  68. package/es/style/index.less +73 -0
  69. package/es/style/raw.d.ts +1 -1
  70. package/es/style/raw.js +1 -1
  71. package/es/style/raw.js.map +1 -1
  72. package/es/tools/flow-path/index.js +0 -1
  73. package/es/tools/flow-path/index.js.map +1 -1
  74. package/es/tools/label/Label.d.ts +30 -0
  75. package/es/tools/label/Label.js +241 -0
  76. package/es/tools/label/Label.js.map +1 -0
  77. package/es/tools/label/LabelModel.d.ts +26 -0
  78. package/es/tools/label/LabelModel.js +86 -0
  79. package/es/tools/label/LabelModel.js.map +1 -0
  80. package/es/tools/label/LabelOverlay.d.ts +28 -0
  81. package/es/tools/label/LabelOverlay.js +161 -0
  82. package/es/tools/label/LabelOverlay.js.map +1 -0
  83. package/es/tools/label/algorithm.d.ts +16 -0
  84. package/es/tools/label/algorithm.js +27 -0
  85. package/es/tools/label/algorithm.js.map +1 -0
  86. package/es/tools/label/index.d.ts +59 -0
  87. package/es/tools/label/index.js +292 -0
  88. package/es/tools/label/index.js.map +1 -0
  89. package/es/tools/label/mediumEditor.d.ts +17 -0
  90. package/es/tools/label/mediumEditor.js +92 -0
  91. package/es/tools/label/mediumEditor.js.map +1 -0
  92. package/es/tools/label/utils.d.ts +64 -0
  93. package/es/tools/label/utils.js +336 -0
  94. package/es/tools/label/utils.js.map +1 -0
  95. package/es/tools/snapshot/index.d.ts +107 -11
  96. package/es/tools/snapshot/index.js +366 -149
  97. package/es/tools/snapshot/index.js.map +1 -1
  98. package/es/tools/snapshot/utils.d.ts +35 -0
  99. package/es/tools/snapshot/utils.js +238 -0
  100. package/es/tools/snapshot/utils.js.map +1 -0
  101. package/lib/NodeResize/control/Control.d.ts +3 -3
  102. package/lib/NodeResize/control/Control.js +13 -3
  103. package/lib/NodeResize/control/Control.js.map +1 -1
  104. package/lib/NodeResize/index.d.ts +4 -0
  105. package/lib/NodeResize/index.js.map +1 -1
  106. package/lib/NodeResize/node/DiamondResize.d.ts +1 -0
  107. package/lib/NodeResize/node/DiamondResize.js +2 -1
  108. package/lib/NodeResize/node/DiamondResize.js.map +1 -1
  109. package/lib/NodeResize/node/EllipseResize.d.ts +1 -0
  110. package/lib/NodeResize/node/EllipseResize.js +2 -1
  111. package/lib/NodeResize/node/EllipseResize.js.map +1 -1
  112. package/lib/NodeResize/node/HtmlResize.js +1 -1
  113. package/lib/NodeResize/node/HtmlResize.js.map +1 -1
  114. package/lib/NodeResize/node/RectResize.js +1 -1
  115. package/lib/NodeResize/node/RectResize.js.map +1 -1
  116. package/lib/bpmn/constant.d.ts +1 -1
  117. package/lib/bpmn/constant.js +3 -0
  118. package/lib/bpmn/constant.js.map +1 -1
  119. package/lib/bpmn/index.d.ts +3 -6
  120. package/lib/bpmn/index.js +5 -7
  121. package/lib/bpmn/index.js.map +1 -1
  122. package/lib/bpmn-elements/presets/Pool/Pool.d.ts +21 -1
  123. package/lib/components/control/index.d.ts +4 -4
  124. package/lib/components/control/index.js.map +1 -1
  125. package/lib/components/highlight/index.d.ts +6 -4
  126. package/lib/components/highlight/index.js +32 -5
  127. package/lib/components/highlight/index.js.map +1 -1
  128. package/lib/components/menu/index.d.ts +1 -1
  129. package/lib/components/menu/index.js +9 -10
  130. package/lib/components/menu/index.js.map +1 -1
  131. package/lib/components/mini-map/index.d.ts +1 -1
  132. package/lib/components/mini-map/index.js +2 -2
  133. package/lib/components/mini-map/index.js.map +1 -1
  134. package/lib/components/selection-select/index.d.ts +1 -1
  135. package/lib/components/selection-select/index.js.map +1 -1
  136. package/lib/dynamic-group/index.d.ts +106 -0
  137. package/lib/dynamic-group/index.js +553 -0
  138. package/lib/dynamic-group/index.js.map +1 -0
  139. package/lib/dynamic-group/model.d.ts +135 -0
  140. package/lib/dynamic-group/model.js +416 -0
  141. package/lib/dynamic-group/model.js.map +1 -0
  142. package/lib/dynamic-group/node.d.ts +16 -0
  143. package/lib/dynamic-group/node.js +146 -0
  144. package/lib/dynamic-group/node.js.map +1 -0
  145. package/lib/dynamic-group/utils.d.ts +17 -0
  146. package/lib/dynamic-group/utils.js +32 -0
  147. package/lib/dynamic-group/utils.js.map +1 -0
  148. package/lib/index.css +63 -0
  149. package/lib/index.d.ts +16 -8
  150. package/lib/index.js +24 -8
  151. package/lib/index.js.map +1 -1
  152. package/lib/insert-node-in-polyline/index.js +2 -2
  153. package/lib/insert-node-in-polyline/index.js.map +1 -1
  154. package/lib/materials/group/GroupNode.d.ts +6 -10
  155. package/lib/materials/group/GroupNode.js +8 -6
  156. package/lib/materials/group/GroupNode.js.map +1 -1
  157. package/lib/materials/group/index.d.ts +5 -5
  158. package/lib/materials/group/index.js +24 -25
  159. package/lib/materials/group/index.js.map +1 -1
  160. package/lib/materials/node-selection/index.d.ts +6 -1
  161. package/lib/materials/node-selection/index.js +63 -55
  162. package/lib/materials/node-selection/index.js.map +1 -1
  163. package/lib/mindmap/index.d.ts +2 -2
  164. package/lib/style/index.css +63 -0
  165. package/lib/style/index.less +73 -0
  166. package/lib/style/raw.d.ts +1 -1
  167. package/lib/style/raw.js +1 -1
  168. package/lib/style/raw.js.map +1 -1
  169. package/lib/tools/flow-path/index.js +0 -1
  170. package/lib/tools/flow-path/index.js.map +1 -1
  171. package/lib/tools/label/Label.d.ts +30 -0
  172. package/lib/tools/label/Label.js +247 -0
  173. package/lib/tools/label/Label.js.map +1 -0
  174. package/lib/tools/label/LabelModel.d.ts +26 -0
  175. package/lib/tools/label/LabelModel.js +89 -0
  176. package/lib/tools/label/LabelModel.js.map +1 -0
  177. package/lib/tools/label/LabelOverlay.d.ts +28 -0
  178. package/lib/tools/label/LabelOverlay.js +167 -0
  179. package/lib/tools/label/LabelOverlay.js.map +1 -0
  180. package/lib/tools/label/algorithm.d.ts +16 -0
  181. package/lib/tools/label/algorithm.js +32 -0
  182. package/lib/tools/label/algorithm.js.map +1 -0
  183. package/lib/tools/label/index.d.ts +59 -0
  184. package/lib/tools/label/index.js +298 -0
  185. package/lib/tools/label/index.js.map +1 -0
  186. package/lib/tools/label/mediumEditor.d.ts +17 -0
  187. package/lib/tools/label/mediumEditor.js +98 -0
  188. package/lib/tools/label/mediumEditor.js.map +1 -0
  189. package/lib/tools/label/utils.d.ts +64 -0
  190. package/lib/tools/label/utils.js +349 -0
  191. package/lib/tools/label/utils.js.map +1 -0
  192. package/lib/tools/snapshot/index.d.ts +107 -11
  193. package/lib/tools/snapshot/index.js +366 -149
  194. package/lib/tools/snapshot/index.js.map +1 -1
  195. package/lib/tools/snapshot/utils.d.ts +35 -0
  196. package/lib/tools/snapshot/utils.js +247 -0
  197. package/lib/tools/snapshot/utils.js.map +1 -0
  198. package/package.json +9 -3
  199. package/rollup.config.js +1 -1
  200. package/src/NodeResize/control/Control.tsx +13 -3
  201. package/src/NodeResize/index.ts +4 -0
  202. package/src/NodeResize/node/DiamondResize.tsx +2 -1
  203. package/src/NodeResize/node/EllipseResize.tsx +2 -1
  204. package/src/NodeResize/node/HtmlResize.tsx +1 -1
  205. package/src/NodeResize/node/RectResize.tsx +1 -1
  206. package/src/bpmn/constant.ts +4 -1
  207. package/src/bpmn/index.ts +7 -4
  208. package/src/bpmn-elements-adapter/README.md +1 -3
  209. package/src/components/control/index.ts +4 -4
  210. package/src/components/highlight/index.ts +33 -6
  211. package/src/components/menu/index.ts +16 -13
  212. package/src/components/mini-map/index.ts +3 -3
  213. package/src/components/selection-select/index.ts +6 -2
  214. package/src/dynamic-group/index.ts +609 -0
  215. package/src/dynamic-group/model.ts +503 -0
  216. package/src/dynamic-group/node.ts +140 -0
  217. package/src/dynamic-group/utils.ts +33 -0
  218. package/src/index.ts +30 -8
  219. package/src/insert-node-in-polyline/index.ts +3 -3
  220. package/src/materials/group/GroupNode.ts +12 -12
  221. package/src/materials/group/index.ts +40 -40
  222. package/src/materials/node-selection/index.ts +78 -70
  223. package/src/style/index.less +73 -0
  224. package/src/style/raw.ts +64 -1
  225. package/src/tools/flow-path/index.ts +0 -1
  226. package/src/tools/label/Label.tsx +297 -0
  227. package/src/tools/label/LabelModel.ts +82 -0
  228. package/src/tools/label/LabelOverlay.tsx +159 -0
  229. package/src/tools/label/algorithm.ts +42 -0
  230. package/src/tools/label/index.ts +401 -0
  231. package/src/tools/label/mediumEditor.ts +94 -0
  232. package/src/tools/label/utils.ts +395 -0
  233. package/src/tools/snapshot/README.md +141 -5
  234. package/src/tools/snapshot/index.ts +288 -101
  235. package/src/tools/snapshot/utils.ts +163 -0
package/src/index.ts CHANGED
@@ -1,22 +1,44 @@
1
+ // BPMN 相关
1
2
  export * from './bpmn'
2
3
  export * from './bpmn-adapter'
3
4
  export * from './bpmn-elements'
4
5
  export * from './bpmn-elements-adapter'
6
+ export * from './bpmn-adapter/xml2json'
7
+ export * from './bpmn-adapter/json2xml'
5
8
 
6
- export * from './tools/snapshot'
9
+ // Adapter
7
10
  export * from './turbo-adapter'
11
+
12
+ // 新版 Group
13
+ export * from './dynamic-group'
14
+ // 折线上动态插入节点
8
15
  export * from './insert-node-in-polyline'
16
+
17
+ // Tools -> 流程图辅助工具
18
+ export * from './tools/label'
19
+ export * from './tools/snapshot'
20
+ export * from './tools/flow-path'
21
+ export * from './tools/auto-layout'
22
+
23
+ // Component -> 流程图中交互组件
9
24
  export * from './components/control'
10
25
  export * from './components/menu'
11
26
  export * from './components/context-menu'
12
27
  export * from './components/dnd-panel'
13
- export * from './components/selection-select'
14
28
  export * from './components/mini-map'
29
+ export * from './components/selection-select'
30
+ export * from './components/highlight'
31
+
32
+ // materials -> 拓展物料
15
33
  export * from './materials/curved-edge'
16
- export * from './materials/group'
34
+ export * from './materials/node-selection'
35
+
36
+ /**
37
+ * @deprecated
38
+ * 2.0 版本废弃该插件
39
+ */
17
40
  export * from './NodeResize'
18
- export * from './tools/flow-path'
19
- export * from './tools/auto-layout'
20
- export * from './bpmn-adapter/xml2json'
21
- export * from './bpmn-adapter/json2xml'
22
- export * from './components/highlight'
41
+ export * from './materials/group'
42
+
43
+ // 迷之插件
44
+ export * from './rect-label-node'
@@ -2,7 +2,7 @@ import LogicFlow, {
2
2
  BaseNodeModel,
3
3
  PolylineEdgeModel,
4
4
  EventType,
5
- formateAnchorConnectValidateData,
5
+ formatAnchorConnectValidateData,
6
6
  } from '@logicflow/core'
7
7
  import { cloneDeep } from 'lodash-es'
8
8
  import { isNodeInSegment } from './edge'
@@ -85,9 +85,9 @@ export class InsertNodeInPolyline {
85
85
  )
86
86
 
87
87
  const { isAllPass: isSourcePass, msg: sourceMsg } =
88
- formateAnchorConnectValidateData(sourceRuleResultData)
88
+ formatAnchorConnectValidateData(sourceRuleResultData)
89
89
  const { isAllPass: isTargetPass, msg: targetMsg } =
90
- formateAnchorConnectValidateData(targetRuleResultData)
90
+ formatAnchorConnectValidateData(targetRuleResultData)
91
91
 
92
92
  return {
93
93
  isPass: isSourcePass && isTargetPass,
@@ -1,10 +1,11 @@
1
1
  import LogicFlow, { h, BaseEdgeModel } from '@logicflow/core'
2
+ import { isArray } from 'lodash-es'
2
3
  import { RectResizeModel, RectResizeView } from '../../NodeResize'
3
4
 
4
- import GraphElements = LogicFlow.GraphElements
5
- import NodeData = LogicFlow.NodeData
6
5
  import Point = LogicFlow.Point
6
+ import NodeData = LogicFlow.NodeData
7
7
  import EdgeConfig = LogicFlow.EdgeConfig
8
+ import GraphElements = LogicFlow.GraphElements
8
9
 
9
10
  const defaultWidth = 500
10
11
  const defaultHeight = 300
@@ -20,10 +21,6 @@ export class GroupNodeModel extends RectResizeModel {
20
21
  * 其子节点是否被禁止通过拖拽移出分组。 默认false,允许拖拽移除分组。
21
22
  */
22
23
  isRestrict?: boolean
23
- /**
24
- * 分组节点是否允许调整大小。
25
- */
26
- resizable?: boolean
27
24
  /**
28
25
  * 分组节点是否允许折叠
29
26
  */
@@ -50,7 +47,7 @@ export class GroupNodeModel extends RectResizeModel {
50
47
  initNodeData(data: any): void {
51
48
  super.initNodeData(data)
52
49
  let children: any = []
53
- if (Array.isArray(data.children)) {
50
+ if (isArray(data.children)) {
54
51
  children = data.children
55
52
  }
56
53
  // 初始化组的子节点
@@ -61,8 +58,10 @@ export class GroupNodeModel extends RectResizeModel {
61
58
  this.foldedHeight = 60
62
59
  this.zIndex = DEFAULT_BOTTOM_Z_INDEX
63
60
  this.radius = 0
61
+
64
62
  this.text.editable = false
65
63
  this.text.draggable = false
64
+
66
65
  this.isRestrict = false
67
66
  this.resizable = false
68
67
  this.autoToFront = false
@@ -270,12 +269,12 @@ export class GroupNodeModel extends RectResizeModel {
270
269
  model.isFoldedEdge = true
271
270
  }
272
271
 
273
- isInRange({ x1, y1, x2, y2 }) {
272
+ isInRange({ minX, minY, maxX, maxY }) {
274
273
  return (
275
- x1 >= this.x - this.width / 2 &&
276
- x2 <= this.x + this.width / 2 &&
277
- y1 >= this.y - this.height / 2 &&
278
- y2 <= this.y + this.height / 2
274
+ minX >= this.x - this.width / 2 &&
275
+ maxX <= this.x + this.width / 2 &&
276
+ minY >= this.y - this.height / 2 &&
277
+ maxY <= this.y + this.height / 2
279
278
  )
280
279
  }
281
280
 
@@ -322,6 +321,7 @@ export class GroupNodeModel extends RectResizeModel {
322
321
  getData() {
323
322
  const data = super.getData()
324
323
  data.children = []
324
+ console.log('this.children', this.children)
325
325
  this.children.forEach((childId) => {
326
326
  const model = this.graphModel.getNodeModelById(childId)
327
327
  if (model && !model.virtual) {
@@ -1,4 +1,8 @@
1
- import { forEach } from 'lodash-es'
1
+ /**
2
+ * @deprecated
3
+ * 待废弃,2.0 版本将 提供 dynamic-group 支持分组功能,当前 Group 插件设计和实现有比较多的问题,后续不再维护,请及时切换
4
+ */
5
+ import { forEach, isEmpty, isObject } from 'lodash-es'
2
6
  import LogicFlow, {
3
7
  BaseEdgeModel,
4
8
  BaseNodeModel,
@@ -12,6 +16,7 @@ import EdgeConfig = LogicFlow.EdgeConfig
12
16
  import NodeData = LogicFlow.NodeData
13
17
  import Point = LogicFlow.Point
14
18
  import BoxBoundsPoint = Model.BoxBoundsPoint
19
+ import NodeConfig = LogicFlow.NodeConfig
15
20
 
16
21
  const DEFAULT_TOP_Z_INDEX = -1000
17
22
  const DEFAULT_BOTTOM_Z_INDEX = -10000
@@ -24,7 +29,7 @@ export class Group {
24
29
  activeGroup: any
25
30
  nodeGroupMap: Map<string, string> = new Map()
26
31
 
27
- constructor({ lf }: LogicFlow.ExtensionProps) {
32
+ constructor({ lf }: LogicFlow.IExtensionProps) {
28
33
  lf.register(GroupNode)
29
34
  this.lf = lf
30
35
 
@@ -40,7 +45,7 @@ export class Group {
40
45
  ) as GroupNodeModel
41
46
  if (groupModel && groupModel.isRestrict) {
42
47
  // 如果移动的节点存在分组中,且这个分组禁止子节点移出去。
43
- const { x1, y1, x2, y2 } = model.getBounds()
48
+ const { minX: x1, minY: y1, maxX: x2, maxY: y2 } = model.getBounds()
44
49
  return groupModel.isAllowMoveTo({
45
50
  x1: x1 + deltaX,
46
51
  y1: y1 + deltaY,
@@ -104,18 +109,18 @@ export class Group {
104
109
  this.createEdgeModel(edge, nodeIdMap, distance)
105
110
  })
106
111
  // 构建的时候直接偏移,这里不需要再进行再度偏移
107
- // groupInnerChildren.nodes.forEach(node => this.translationNodeData(node, distance));
108
- // groupInnerChildren.edges.forEach(edge => this.translationEdgeData(edge, distance));
112
+ // groupInnerChildren.nodes.forEach(node => this.translateNodeData(node, distance));
113
+ // groupInnerChildren.edges.forEach(edge => this. translateEdgeData(edge, distance));
109
114
 
110
115
  // 最外层的edges继续执行创建edgeModel的流程
111
- // 由于最外层会调用translationEdgeData(),因此这里不用传入distance进行偏移
116
+ // 由于最外层会调用 translateEdgeData(),因此这里不用传入distance进行偏移
112
117
  forEach(selectedEdges, (edge) => {
113
118
  const edgeModel = this.createEdgeModel(edge, nodeIdMap, 0)
114
119
  elements.edges.push(edgeModel)
115
120
  })
116
121
 
117
122
  // 返回elements进行选中效果,即触发element.selectElementById()
118
- // shortcut.ts也会对最外层的nodes和edges进行偏移,即translationNodeData()
123
+ // shortcut.ts也会对最外层的nodes和edges进行偏移,即translateNodeData()
119
124
  return elements
120
125
  }
121
126
  }
@@ -142,32 +147,25 @@ export class Group {
142
147
  y,
143
148
  properties,
144
149
  type,
145
- text,
146
150
  rotate,
147
151
  children,
148
152
  // incoming,
149
153
  // outgoing,
150
154
  } = childNodeModel
155
+ const nodeConfig: NodeConfig = {
156
+ x: x + distance,
157
+ y: y + distance,
158
+ properties,
159
+ type,
160
+ rotate,
161
+ // 如果不传递type,会自动触发NODE_ADD
162
+ // 有概率触发appendToGroup
163
+ }
151
164
 
152
165
  const eventType =
153
166
  EventType.NODE_GROUP_COPY || ('node:group-copy-add' as EventType)
154
- const newChildModel = lf.addNode(
155
- {
156
- x: x + distance,
157
- y: y + distance,
158
- properties,
159
- type,
160
- text: {
161
- ...text,
162
- x: text.x + distance,
163
- y: text.y + distance,
164
- },
165
- rotate,
166
- // 如果不传递type,会自动触发NODE_ADD
167
- // 有概率触发appendToGroup
168
- },
169
- eventType,
170
- )
167
+ const newChildModel = lf.addNode(nodeConfig, eventType)
168
+
171
169
  ;(current as GroupNodeModel).addChild(newChildModel.id)
172
170
  nodeIdMap[childId] = newChildModel.id
173
171
  nodesArray.push(newChildModel)
@@ -205,7 +203,7 @@ export class Group {
205
203
  )
206
204
  return {
207
205
  nodesArray,
208
- edgesArray: edgesDataArray.concat(filterEdgesDataArray),
206
+ edgesArray: edgesDataArray.concat(filterEdgesDataArray), // ??? what's this
209
207
  }
210
208
  }
211
209
 
@@ -220,7 +218,7 @@ export class Group {
220
218
  if (nodeIdMap[sourceId]) sourceId = nodeIdMap[sourceId]
221
219
  if (nodeIdMap[targetId]) targetId = nodeIdMap[targetId]
222
220
  const { type, startPoint, endPoint, pointsList, text } = edge
223
- // ====== 仿造shortcut.ts的translationEdgeData()逻辑 ======
221
+ // ====== 仿造shortcut.ts的 translateEdgeData()逻辑 ======
224
222
  const newStartPoint = {
225
223
  x: (startPoint?.x || 0) + distance,
226
224
  y: (startPoint?.y || 0) + distance,
@@ -237,25 +235,26 @@ export class Group {
237
235
  return point
238
236
  })
239
237
  }
240
- const newText = text
241
- if (text && typeof text !== 'string') {
242
- ;(newText as { x: number; y: number; value: string }).x =
243
- text.x + distance
244
- ;(newText as { x: number; y: number; value: string }).y =
245
- text.y + distance
246
- }
247
- // ====== 仿造shortcut.ts的translationEdgeData()逻辑 ======
248
-
249
- // 简化复制时的参数传入,防止创建出两个edge属于同个group这种情况
250
- return lf.graphModel.addEdge({
238
+ const edgeConfig: EdgeConfig = {
251
239
  type,
252
240
  startPoint: newStartPoint,
253
241
  endPoint: newEndPoint,
254
242
  sourceNodeId: sourceId,
255
243
  targetNodeId: targetId,
256
244
  pointsList: newPointsList,
257
- text: newText,
258
- })
245
+ }
246
+
247
+ if (isObject(text) && !isEmpty(text)) {
248
+ edgeConfig.text = {
249
+ ...text,
250
+ x: text?.x + distance,
251
+ y: text?.y + distance,
252
+ }
253
+ }
254
+ // ====== 仿造shortcut.ts的 translateEdgeData()逻辑 ======
255
+
256
+ // 简化复制时的参数传入,防止创建出两个edge属于同个group这种情况
257
+ return lf.graphModel.addEdge(edgeConfig)
259
258
  }
260
259
 
261
260
  /**
@@ -513,6 +512,7 @@ export class Group {
513
512
  (node as GroupNodeModel).isInRange(bounds) &&
514
513
  node.id !== nodeData.id,
515
514
  )
515
+
516
516
  if (groups.length === 0) return
517
517
  if (groups.length === 1) return groups[0]
518
518
  let topGroup = groups[groups.length - 1]
@@ -1,18 +1,12 @@
1
1
  import { get } from 'lodash-es'
2
2
  import { h, PolygonNode, PolygonNodeModel } from '@logicflow/core'
3
3
 
4
- class NodeSelectionView extends PolygonNode {
5
- d = 10
6
-
7
- getShapeStyle() {
8
- // 设置边框为虚线
9
- const style = this.props.model.getNodeStyle()
10
- // @ts-ignore
11
- style.strokeDashArray = '10 5'
12
-
13
- return style
14
- }
4
+ export type INodeSelectionProperties = {
5
+ strokeColor?: string | 'none'
6
+ node_selection_ids?: string[]
7
+ }
15
8
 
9
+ class NodeSelectionView extends PolygonNode {
16
10
  getLabelShape(): h.JSX.Element {
17
11
  const { id, x, y, width, height, properties } = this.props.model
18
12
  const style = this.props.model.getNodeStyle()
@@ -21,38 +15,38 @@ class NodeSelectionView extends PolygonNode {
21
15
  {
22
16
  x: x - width / 2,
23
17
  y: y - height / 2,
18
+ width: 50,
19
+ height: 24,
24
20
  style: 'z-index: 0; background: none; overflow: auto;',
25
21
  },
26
- properties.labelText
27
- ? h(
28
- 'text',
29
- {
30
- x: 0,
31
- y: -5,
32
- width: 50,
33
- height: 24,
34
- fontSize: '16px',
35
- fill: style.stroke,
36
- },
37
- '方案',
38
- )
39
- : '',
40
- properties.disabledDelete
41
- ? ''
42
- : h(
43
- 'text',
44
- {
45
- x: properties.labelText ? 50 : 0,
46
- y: -5,
47
- width: 50,
48
- height: 24,
49
- fontSize: '24px',
50
- cursor: 'pointer',
51
- fill: style.stroke,
52
- onclick: this.handleCustomDeleteIconClick.bind(this, id),
53
- },
54
- 'x',
55
- ),
22
+ [
23
+ properties.labelText
24
+ ? h(
25
+ 'text',
26
+ {
27
+ x: 0,
28
+ y: -5,
29
+ fontSize: '16px',
30
+ fill: style.stroke,
31
+ },
32
+ properties.labelText,
33
+ )
34
+ : '',
35
+ properties.disabledDelete
36
+ ? ''
37
+ : h(
38
+ 'text',
39
+ {
40
+ x: properties.labelText ? 50 : 0,
41
+ y: -5,
42
+ fontSize: '24px',
43
+ cursor: 'pointer',
44
+ fill: style.stroke,
45
+ onclick: this.handleCustomDeleteIconClick.bind(this, id),
46
+ },
47
+ 'x',
48
+ ),
49
+ ],
56
50
  )
57
51
  }
58
52
 
@@ -72,7 +66,7 @@ class NodeSelectionView extends PolygonNode {
72
66
  this.getLabelShape(),
73
67
  ])
74
68
  }
75
-
69
+ // 避免点击时,该节点置于最高层,挡住内部节点
76
70
  toFront() {}
77
71
 
78
72
  /**
@@ -85,39 +79,49 @@ class NodeSelectionView extends PolygonNode {
85
79
  }
86
80
  }
87
81
 
88
- class NodeSelectionModel extends PolygonNodeModel {
82
+ class NodeSelectionModel extends PolygonNodeModel<INodeSelectionProperties> {
89
83
  d = 10
90
84
 
91
- setAttributes() {
92
- // 默认不显示
93
- this.points = []
94
-
95
- this.text = {
85
+ initNodeData(data) {
86
+ data.text = {
96
87
  value: '',
97
- x: 0,
98
- y: 0,
88
+ x: data.x,
89
+ y: data.y,
99
90
  draggable: false,
100
91
  editable: false,
101
92
  }
102
- this.stroke = this.properties.active_color || '#008000'
93
+ super.initNodeData(data)
103
94
  this.zIndex = 0
104
- this.draggable = false
105
- this.anchorsOffset = [[0, 0]]
95
+ this.draggable = true
96
+ }
106
97
 
107
- // TODO: 确认此处为何使用 setTimeout, 是初始化时该设置未生效吗?
108
- if ((this.properties.node_selection_ids as string[]).length > 1) {
98
+ setAttributes() {
99
+ // 默认不显示
100
+ this.points = []
101
+
102
+ // 图render的时候,会把所有nodes数据实例化,全部实例化完成后,放到nodesMap里。
103
+ // 节点的setAttributes在实例化的时候执行第一次
104
+ // updatePointsByNodes中的getNodeModelById方法,是从nodesMap取的数据,第一次就拿不到,所以要加setTimeout
105
+ if ((this.properties?.node_selection_ids as string[]).length > 1) {
109
106
  setTimeout(() => {
110
- this.updatePointsByNodes(this.properties.node_selection_ids)
107
+ this.updatePointsByNodes(this.properties?.node_selection_ids || [])
111
108
  })
112
109
  }
113
110
  }
114
111
 
112
+ getNodeStyle() {
113
+ const style = super.getNodeStyle()
114
+ style.stroke = this.properties.strokeColor || '#008000'
115
+ style.strokeDasharray = '10 5'
116
+ return style
117
+ }
118
+
115
119
  getDefaultAnchor() {
116
120
  return []
117
121
  }
118
122
 
119
123
  /**
120
- * 更新points
124
+ * 更新points - 多边形顶点坐标集合
121
125
  * @param points
122
126
  */
123
127
  updatePoints(points) {
@@ -125,7 +129,7 @@ class NodeSelectionModel extends PolygonNodeModel {
125
129
  }
126
130
 
127
131
  /**
128
- * 更新x y
132
+ * 更新x y - 多边形中点坐标
129
133
  */
130
134
  updateCoordinate({ x, y }) {
131
135
  this.x = x
@@ -133,10 +137,9 @@ class NodeSelectionModel extends PolygonNodeModel {
133
137
  }
134
138
 
135
139
  /**
136
- * 更新points
140
+ * 计算新的 points 和 x y
137
141
  */
138
142
  updatePointsByNodes(nodesIds) {
139
- // TODO: 临时方案矩形
140
143
  const points: [number, number][] = []
141
144
  let minX = Infinity
142
145
  let minY = Infinity
@@ -164,7 +167,7 @@ class NodeSelectionModel extends PolygonNodeModel {
164
167
  }
165
168
  }
166
169
 
167
- export class NodeSelection {
170
+ class NodeSelection {
168
171
  static pluginName = 'node-selection'
169
172
  lf // lf 实例
170
173
  selectNodes: any[] = [] // 选择的nodes
@@ -237,26 +240,20 @@ export class NodeSelection {
237
240
 
238
241
  lf.on('node:click', (val) => {
239
242
  if (!val.e.shiftKey || val.data.type === 'node-selection') return
240
-
241
243
  this.currentClickNode = val.data
242
244
 
243
245
  // 如果selectNodesIds中已存在此节点,则取消选中此节点
244
- let isUnSelected = false
246
+ let hasExists = false
245
247
  if (this.selectNodesIds.includes(val.data.id)) {
246
248
  this.lf.getNodeModelById(val.data.id).setSelected(false)
247
- isUnSelected = true
249
+ hasExists = true
248
250
  }
249
251
 
250
252
  // 获取所有被选中的节点,获取到的数组是无序的
251
253
  const { nodes } = lf.getSelectElements(true)
252
- // 使用插件时判断是否允许使用node-selection
253
- if (lf.disableNodeSelection && lf.disableNodeSelection(nodes)) {
254
- return
255
- }
256
254
  this.selectNodes = nodes
257
-
258
255
  if (this.selectNodes.length === 1) {
259
- if (!isUnSelected) {
256
+ if (!hasExists) {
260
257
  this.addNodeSelection()
261
258
  } else {
262
259
  this.updateNodeSelection()
@@ -265,7 +262,18 @@ export class NodeSelection {
265
262
  this.updateNodeSelection()
266
263
  }
267
264
  })
265
+ lf.graphModel.addNodeMoveRules((model, deltaX, deltaY) => {
266
+ if (model.type === 'node-selection') {
267
+ // 如果移动的是分组,那么分组的子节点也跟着移动。
268
+ const nodeIds = model.properties.node_selection_ids
269
+ lf.graphModel.moveNodes(nodeIds, deltaX, deltaY, true)
270
+ return true
271
+ }
272
+ return true
273
+ })
268
274
  }
269
275
  }
270
276
 
271
277
  export default NodeSelection
278
+
279
+ export { NodeSelection }
@@ -1,3 +1,8 @@
1
+ @import url('medium-editor/dist/css/medium-editor.min.css');
2
+ //@import url('medium-editor/dist/css/themes/bootstrap.min.css');
3
+ @import url('medium-editor/dist/css/themes/beagle.min.css');
4
+ @import url('vanilla-picker/dist/vanilla-picker.csp.css');
5
+
1
6
  .lf-control {
2
7
  position: absolute;
3
8
  top: 0;
@@ -253,3 +258,71 @@
253
258
  .lf-mindmap_addIcon {
254
259
  margin-top: 10px;
255
260
  }
261
+
262
+ /* label */
263
+ .lf-label-overlay {
264
+ width: 0;
265
+ height: 0;
266
+ overflow: visible;
267
+
268
+ .lf-label-editor {
269
+ //box-sizing: content-box;
270
+ padding: 4px;
271
+ background: #fff;
272
+ border-radius: 5px;
273
+
274
+ &-container {
275
+ position: absolute;
276
+ display: flex;
277
+ align-items: center;
278
+ justify-content: center;
279
+ overflow: visible;
280
+ text-align: center;
281
+
282
+ p {
283
+ margin: 0;
284
+ }
285
+ }
286
+
287
+ &-dragging {
288
+ cursor: move;
289
+ }
290
+
291
+ &-editing {
292
+ border: 2px solid #275dc5;
293
+ outline: none;
294
+ cursor: text;
295
+ }
296
+
297
+ &-hover {
298
+ border: 2px dashed #acacac;
299
+ }
300
+
301
+ // textOverflowMode
302
+ &-clip {
303
+ width: 100px; /* 根据需要调整宽度 */
304
+ overflow: hidden;
305
+ white-space: nowrap;
306
+ text-overflow: clip;
307
+ }
308
+
309
+ &-ellipsis {
310
+ width: 100px; /* 根据需要调整宽度 */
311
+ overflow: hidden;
312
+ white-space: nowrap;
313
+ text-overflow: ellipsis;
314
+ }
315
+
316
+ &-wrap {
317
+ width: 100px; /* 根据需要调整宽度 */
318
+ white-space: normal;
319
+ overflow-wrap: break-word; /* 允许单词内换行 */
320
+ }
321
+
322
+ &-nowrap {
323
+ width: 100px; /* 根据需要调整宽度 */
324
+ overflow: visible;
325
+ white-space: nowrap;
326
+ }
327
+ }
328
+ }