@logicflow/extension 2.2.0 → 2.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 (201) hide show
  1. package/README.md +16 -0
  2. package/dist/index.css +1 -1
  3. package/dist/index.min.js +1 -1
  4. package/dist/index.min.js.map +1 -1
  5. package/es/NodeResize/node/RectResize.d.ts +0 -6
  6. package/es/NodeResize/node/RectResize.js +2 -11
  7. package/es/bpmn-elements-adapter/json2xml.d.ts +2 -1
  8. package/es/bpmn-elements-adapter/json2xml.js +18 -4
  9. package/es/bpmn-elements-adapter/xml2json.js +2 -7
  10. package/es/components/control/index.d.ts +1 -0
  11. package/es/components/control/index.js +24 -11
  12. package/es/components/mini-map/index.js +1 -1
  13. package/es/dynamic-group/model.d.ts +2 -1
  14. package/es/dynamic-group/model.js +28 -11
  15. package/es/dynamic-group/node.js +1 -0
  16. package/es/index.css +1 -1
  17. package/es/index.d.ts +1 -0
  18. package/es/index.js +2 -0
  19. package/es/insert-node-in-polyline/index.js +11 -35
  20. package/es/materials/curved-edge/index.js +49 -21
  21. package/es/materials/group/GroupNode.d.ts +0 -6
  22. package/es/materials/group/GroupNode.js +1 -6
  23. package/es/pool/LaneModel.d.ts +90 -0
  24. package/es/pool/LaneModel.js +252 -0
  25. package/es/pool/LaneView.d.ts +40 -0
  26. package/es/pool/LaneView.js +202 -0
  27. package/es/pool/PoolModel.d.ts +120 -0
  28. package/es/pool/PoolModel.js +586 -0
  29. package/es/pool/PoolView.d.ts +17 -0
  30. package/es/pool/PoolView.js +76 -0
  31. package/es/pool/constant.d.ts +15 -0
  32. package/es/pool/constant.js +17 -0
  33. package/es/pool/index.d.ts +89 -0
  34. package/es/pool/index.js +524 -0
  35. package/es/pool/utils.d.ts +19 -0
  36. package/es/pool/utils.js +33 -0
  37. package/es/style/index.css +1 -1
  38. package/es/style/raw.d.ts +1 -1
  39. package/es/style/raw.js +1 -1
  40. package/es/tools/label/LabelOverlay.js +3 -3
  41. package/es/tools/label/mediumEditor.d.ts +1 -1
  42. package/es/tools/label/mediumEditor.js +89 -52
  43. package/es/tools/snapshot/index.d.ts +7 -3
  44. package/es/tools/snapshot/index.js +72 -77
  45. package/lib/NodeResize/node/RectResize.d.ts +0 -6
  46. package/lib/NodeResize/node/RectResize.js +1 -10
  47. package/lib/bpmn-elements-adapter/json2xml.d.ts +2 -1
  48. package/lib/bpmn-elements-adapter/json2xml.js +19 -4
  49. package/lib/bpmn-elements-adapter/xml2json.js +2 -7
  50. package/lib/components/control/index.d.ts +1 -0
  51. package/lib/components/control/index.js +24 -11
  52. package/lib/components/mini-map/index.js +1 -1
  53. package/lib/dynamic-group/model.d.ts +2 -1
  54. package/lib/dynamic-group/model.js +28 -11
  55. package/lib/dynamic-group/node.js +1 -0
  56. package/lib/index.css +1 -1
  57. package/lib/index.d.ts +1 -0
  58. package/lib/index.js +2 -0
  59. package/lib/insert-node-in-polyline/index.js +10 -34
  60. package/lib/materials/curved-edge/index.js +49 -21
  61. package/lib/materials/group/GroupNode.d.ts +0 -6
  62. package/lib/materials/group/GroupNode.js +1 -6
  63. package/lib/pool/LaneModel.d.ts +90 -0
  64. package/lib/pool/LaneModel.js +255 -0
  65. package/lib/pool/LaneView.d.ts +40 -0
  66. package/lib/pool/LaneView.js +205 -0
  67. package/lib/pool/PoolModel.d.ts +120 -0
  68. package/lib/pool/PoolModel.js +589 -0
  69. package/lib/pool/PoolView.d.ts +17 -0
  70. package/lib/pool/PoolView.js +79 -0
  71. package/lib/pool/constant.d.ts +15 -0
  72. package/lib/pool/constant.js +20 -0
  73. package/lib/pool/index.d.ts +89 -0
  74. package/lib/pool/index.js +527 -0
  75. package/lib/pool/utils.d.ts +19 -0
  76. package/lib/pool/utils.js +38 -0
  77. package/lib/style/index.css +1 -1
  78. package/lib/style/raw.d.ts +1 -1
  79. package/lib/style/raw.js +1 -1
  80. package/lib/tools/label/LabelOverlay.js +2 -2
  81. package/lib/tools/label/mediumEditor.d.ts +1 -1
  82. package/lib/tools/label/mediumEditor.js +91 -53
  83. package/lib/tools/snapshot/index.d.ts +7 -3
  84. package/lib/tools/snapshot/index.js +72 -77
  85. package/package.json +10 -7
  86. package/.turbo/turbo-build.log +0 -38
  87. package/CHANGELOG.md +0 -1766
  88. package/__test__/bpmn-adapter.test.js +0 -227
  89. package/es/materials/curved-edge/__test__/curved-edge.test.d.ts +0 -1
  90. package/es/materials/curved-edge/__test__/curved-edge.test.js +0 -18
  91. package/jest.config.js +0 -198
  92. package/lib/materials/curved-edge/__test__/curved-edge.test.d.ts +0 -1
  93. package/lib/materials/curved-edge/__test__/curved-edge.test.js +0 -20
  94. package/rollup.config.js +0 -52
  95. package/src/NodeResize/BasicShape/Ellipse.tsx +0 -22
  96. package/src/NodeResize/BasicShape/Polygon.tsx +0 -24
  97. package/src/NodeResize/BasicShape/Rect.tsx +0 -44
  98. package/src/NodeResize/control/Control.tsx +0 -537
  99. package/src/NodeResize/control/ControlGroup.tsx +0 -76
  100. package/src/NodeResize/control/Util.ts +0 -206
  101. package/src/NodeResize/index.ts +0 -26
  102. package/src/NodeResize/node/DiamondResize.tsx +0 -149
  103. package/src/NodeResize/node/EllipseResize.tsx +0 -140
  104. package/src/NodeResize/node/HtmlResize.tsx +0 -125
  105. package/src/NodeResize/node/RectResize.tsx +0 -146
  106. package/src/NodeResize/node/index.ts +0 -4
  107. package/src/bpmn/constant.ts +0 -56
  108. package/src/bpmn/events/EndEvent.ts +0 -73
  109. package/src/bpmn/events/StartEvent.ts +0 -52
  110. package/src/bpmn/events/index.ts +0 -2
  111. package/src/bpmn/flow/SequenceFlow.ts +0 -25
  112. package/src/bpmn/flow/index.ts +0 -1
  113. package/src/bpmn/gateways/ExclusiveGateway.ts +0 -71
  114. package/src/bpmn/gateways/index.ts +0 -1
  115. package/src/bpmn/getBpmnId.ts +0 -31
  116. package/src/bpmn/index.ts +0 -60
  117. package/src/bpmn/tasks/ServiceTask.ts +0 -63
  118. package/src/bpmn/tasks/UserTask.ts +0 -64
  119. package/src/bpmn/tasks/index.ts +0 -2
  120. package/src/bpmn-adapter/bpmnIds.ts +0 -31
  121. package/src/bpmn-adapter/index.ts +0 -835
  122. package/src/bpmn-adapter/json2xml.ts +0 -127
  123. package/src/bpmn-adapter/xml2json.ts +0 -544
  124. package/src/bpmn-elements/README.md +0 -223
  125. package/src/bpmn-elements/__tests__/definition.test.js +0 -72
  126. package/src/bpmn-elements/index.d.ts +0 -26
  127. package/src/bpmn-elements/index.ts +0 -107
  128. package/src/bpmn-elements/presets/Event/EndEventFactory.ts +0 -114
  129. package/src/bpmn-elements/presets/Event/IntermediateCatchEvent.ts +0 -108
  130. package/src/bpmn-elements/presets/Event/IntermediateThrowEvent.ts +0 -109
  131. package/src/bpmn-elements/presets/Event/StartEventFactory.ts +0 -114
  132. package/src/bpmn-elements/presets/Event/boundaryEventFactory.ts +0 -117
  133. package/src/bpmn-elements/presets/Event/index.ts +0 -14
  134. package/src/bpmn-elements/presets/Flow/flow.d.ts +0 -6
  135. package/src/bpmn-elements/presets/Flow/index.ts +0 -8
  136. package/src/bpmn-elements/presets/Flow/manhattan.ts +0 -691
  137. package/src/bpmn-elements/presets/Flow/sequenceFlow.ts +0 -65
  138. package/src/bpmn-elements/presets/Gateway/gateway.ts +0 -107
  139. package/src/bpmn-elements/presets/Gateway/index.ts +0 -23
  140. package/src/bpmn-elements/presets/Pool/Lane.ts +0 -211
  141. package/src/bpmn-elements/presets/Pool/Pool.ts +0 -284
  142. package/src/bpmn-elements/presets/Pool/index.ts +0 -89
  143. package/src/bpmn-elements/presets/Task/index.ts +0 -122
  144. package/src/bpmn-elements/presets/Task/subProcess.ts +0 -189
  145. package/src/bpmn-elements/presets/Task/task.ts +0 -193
  146. package/src/bpmn-elements/presets/icons.ts +0 -155
  147. package/src/bpmn-elements/utils.ts +0 -52
  148. package/src/bpmn-elements-adapter/README.md +0 -293
  149. package/src/bpmn-elements-adapter/__tests__/adapter_in.test.js +0 -528
  150. package/src/bpmn-elements-adapter/__tests__/adapter_out.test.js +0 -569
  151. package/src/bpmn-elements-adapter/constant.ts +0 -76
  152. package/src/bpmn-elements-adapter/index.ts +0 -1134
  153. package/src/bpmn-elements-adapter/json2xml.ts +0 -91
  154. package/src/bpmn-elements-adapter/xml2json.ts +0 -548
  155. package/src/components/context-menu/index.ts +0 -253
  156. package/src/components/control/index.ts +0 -141
  157. package/src/components/dnd-panel/index.ts +0 -137
  158. package/src/components/highlight/index.ts +0 -227
  159. package/src/components/menu/index.ts +0 -748
  160. package/src/components/mini-map/index.ts +0 -686
  161. package/src/components/selection-select/index.ts +0 -387
  162. package/src/dynamic-group/index.ts +0 -775
  163. package/src/dynamic-group/model.ts +0 -562
  164. package/src/dynamic-group/node.ts +0 -288
  165. package/src/dynamic-group/utils.ts +0 -46
  166. package/src/index.less +0 -1
  167. package/src/index.ts +0 -45
  168. package/src/insert-node-in-polyline/edge.ts +0 -175
  169. package/src/insert-node-in-polyline/index.ts +0 -187
  170. package/src/materials/curved-edge/__test__/curved-edge.test.ts +0 -46
  171. package/src/materials/curved-edge/index.ts +0 -185
  172. package/src/materials/group/GroupNode.ts +0 -442
  173. package/src/materials/group/index.ts +0 -542
  174. package/src/materials/node-selection/index.ts +0 -380
  175. package/src/mindmap/fakerRoot.ts +0 -19
  176. package/src/mindmap/index.ts +0 -328
  177. package/src/mindmap/markContent.ts +0 -81
  178. package/src/mindmap/markContentOption.ts +0 -81
  179. package/src/mindmap/markEntity.ts +0 -82
  180. package/src/mindmap/markRoot.ts +0 -83
  181. package/src/mindmap/theme.ts +0 -11
  182. package/src/rect-label-node/RectLabelNodeView.ts +0 -33
  183. package/src/rect-label-node/index.ts +0 -15
  184. package/src/style/index.less +0 -342
  185. package/src/style/raw.ts +0 -295
  186. package/src/tools/auto-layout/index.ts +0 -282
  187. package/src/tools/flow-path/index.ts +0 -233
  188. package/src/tools/label/Label.tsx +0 -357
  189. package/src/tools/label/LabelModel.ts +0 -83
  190. package/src/tools/label/LabelOverlay.tsx +0 -158
  191. package/src/tools/label/algorithm.ts +0 -42
  192. package/src/tools/label/index.ts +0 -479
  193. package/src/tools/label/mediumEditor.ts +0 -94
  194. package/src/tools/label/utils.ts +0 -395
  195. package/src/tools/proximity-connect/index.ts +0 -435
  196. package/src/tools/snapshot/README.md +0 -145
  197. package/src/tools/snapshot/index.ts +0 -718
  198. package/src/tools/snapshot/utils.ts +0 -163
  199. package/src/turbo-adapter/index.ts +0 -212
  200. package/stats.html +0 -4842
  201. package/tsconfig.json +0 -18
@@ -1,562 +0,0 @@
1
- import LogicFlow, {
2
- observable,
3
- BaseEdgeModel,
4
- ElementType,
5
- GraphModel,
6
- IRectNodeProperties,
7
- RectNodeModel,
8
- } from '@logicflow/core'
9
- import { forEach } from 'lodash-es'
10
-
11
- import NodeData = LogicFlow.NodeData
12
- import NodeConfig = LogicFlow.NodeConfig
13
- import EdgeConfig = LogicFlow.EdgeConfig
14
-
15
- export type IGroupNodeProperties = {
16
- /**
17
- * 当前分组中的节点 id
18
- */
19
- children?: string[]
20
- /**
21
- * 分组节点是否可以折叠
22
- */
23
- collapsible?: boolean
24
- /**
25
- * 分组节点折叠状态
26
- */
27
- isCollapsed?: boolean
28
- /**
29
- * 子节点是否限制移动范围
30
- * 默认为 false,允许拖拽移除分组
31
- */
32
- isRestrict?: boolean
33
- /**
34
- * isRestrict 模式启用时,
35
- * 如果同时设置 autoResize 为 true,
36
- * 那么子节点在父节点中移动时,父节点会自动调整大小
37
- */
38
- autoResize?: boolean
39
-
40
- /**
41
- * 分组节点的收起状态宽高
42
- */
43
- collapsedWidth?: number
44
- collapsedHeight?: number
45
- // 默认宽高作为 group 的展开宽高
46
- // /**
47
- // * 分组节点的展开状态宽高
48
- // */
49
- // expandWidth?: number
50
- // expandHeight?: number
51
-
52
- /**
53
- * 缩放或旋转容器时,是否缩放或旋转组内节点
54
- */
55
- transformWithContainer?: boolean
56
-
57
- /**
58
- * 当前分组元素的 zIndex
59
- */
60
- zIndex?: number
61
- /**
62
- * 分组节点是否自动置顶
63
- */
64
- autoToFront?: boolean
65
-
66
- // 节点是否允许添加到分组中,是否可以通过 properties 的方式传入
67
- // TODO: 函数类型的 properties 该如何传入
68
- isAllowAppendIn?: (_nodeData) => boolean
69
- } & IRectNodeProperties
70
-
71
- // 分组节点默认展开时的大小
72
- const DEFAULT_GROUP_EXPAND_WIDTH = 400
73
- const DEFAULT_GROUP_EXPAND_HEIGHT = 230
74
- // 分组节点默认收起时的大小
75
- const DEFAULT_GROUP_COLLAPSE_WIDTH = 80
76
- const DEFAULT_GROUP_COLLAPSE_HEIGHT = 60
77
-
78
- const DEFAULT_BOTTOM_Z_INDEX = -10000
79
-
80
- export class DynamicGroupNodeModel extends RectNodeModel<IGroupNodeProperties> {
81
- readonly isGroup = true
82
-
83
- // 保存组内的节点
84
- children!: Set<string>
85
- // 是否限制组内节点的移动范围。默认不限制 TODO: 完善该功能
86
- isRestrict: boolean = false
87
- // isRestrict 模式启用时,如果同时设置 autoResize 为 true,那么子节点在父节点中移动时,父节点会自动调整大小
88
- autoResize: boolean = false
89
- // 分组节点是否可以折叠
90
- collapsible: boolean = true
91
-
92
- // 分组节点 初始化尺寸(默认展开),后续支持从 properties 中传入 width 和 height 设置
93
- expandWidth!: number
94
- expandHeight!: number
95
- // 折叠后
96
- collapsedWidth!: number
97
- collapsedHeight!: number
98
-
99
- // 当前组是否收起状态
100
- @observable isCollapsed: boolean = false
101
- // 当前分组是否在可添加状态 - 实时状态
102
- @observable groupAddable: boolean = false
103
- // 缩放或旋转容器时,是否缩放或旋转组内节点
104
- @observable transformWithContainer: boolean = false
105
- childrenLastCollapseStateDict: Map<string, boolean> = new Map()
106
-
107
- constructor(data: NodeConfig<IGroupNodeProperties>, graphModel: GraphModel) {
108
- super(data, graphModel)
109
- this.childrenLastCollapseStateDict = new Map()
110
-
111
- this.initNodeData(data)
112
- this.setAttributes()
113
- }
114
-
115
- initNodeData(data: LogicFlow.NodeConfig<IGroupNodeProperties>) {
116
- super.initNodeData(data)
117
-
118
- const {
119
- children,
120
- width,
121
- height,
122
- collapsedWidth,
123
- collapsedHeight,
124
-
125
- collapsible,
126
- isCollapsed,
127
- zIndex,
128
- isRestrict,
129
- autoResize,
130
- autoToFront,
131
- transformWithContainer,
132
- } = data.properties ?? {}
133
-
134
- this.children = children ? new Set(children) : new Set()
135
- this.zIndex = zIndex ?? DEFAULT_BOTTOM_Z_INDEX
136
- this.isCollapsed = isCollapsed ?? false
137
- this.setProperties({ isCollapsed: isCollapsed ?? false })
138
-
139
- const expandWidth = width ?? DEFAULT_GROUP_EXPAND_WIDTH
140
- const expandHeight = height ?? DEFAULT_GROUP_EXPAND_HEIGHT
141
-
142
- // 初始化分组节点的宽高数据
143
- this.width = expandWidth
144
- this.height = expandHeight
145
- this.expandWidth = expandWidth
146
- this.expandHeight = expandHeight
147
- this.collapsedWidth = collapsedWidth ?? DEFAULT_GROUP_COLLAPSE_WIDTH
148
- this.collapsedHeight = collapsedHeight ?? DEFAULT_GROUP_COLLAPSE_HEIGHT
149
-
150
- this.isRestrict = isRestrict ?? false
151
- this.transformWithContainer = transformWithContainer ?? false
152
- this.autoResize = autoResize ?? false
153
- this.collapsible = collapsible ?? true
154
- this.autoToFront = autoToFront ?? false
155
-
156
- // 禁用掉 Group 节点的文本编辑能力
157
- this.text.editable = false
158
- this.text.draggable = false
159
- }
160
-
161
- setAttributes() {
162
- super.setAttributes()
163
- }
164
-
165
- getData(): NodeData {
166
- const data = super.getData()
167
- const children: string[] = []
168
-
169
- forEach(Array.from(this.children), (childId) => {
170
- const model = this.graphModel.getNodeModelById(childId)
171
- if (model && !model.virtual) {
172
- children.push(childId)
173
- }
174
- })
175
- data.children = children
176
-
177
- if (data.properties) {
178
- data.properties.children = children
179
- data.properties.isCollapsed = this.isCollapsed
180
- }
181
-
182
- return data
183
- }
184
-
185
- /**
186
- * 获取分组内的节点
187
- * @param groupModel
188
- */
189
- getNodesInGroup(groupModel: DynamicGroupNodeModel): string[] {
190
- const nodeIds: string[] = []
191
- if (groupModel.isGroup) {
192
- forEach(Array.from(groupModel.children), (nodeId: string) => {
193
- nodeIds.push(nodeId)
194
- })
195
- }
196
- return nodeIds
197
- }
198
-
199
- getMoveDistance(
200
- deltaX: number,
201
- deltaY: number,
202
- isIgnoreRule = false,
203
- ): [number, number] {
204
- const [moveDeltaX, moveDeltaY] = super.getMoveDistance(
205
- deltaX,
206
- deltaY,
207
- isIgnoreRule,
208
- )
209
- const nodeIds = this.getNodesInGroup(this)
210
- this.graphModel.moveNodes(nodeIds, deltaX, deltaY, isIgnoreRule)
211
- return [moveDeltaX, moveDeltaY]
212
- }
213
-
214
- /**
215
- * 重写 getHistoryData 方法
216
- */
217
- getHistoryData(): NodeData {
218
- const data = super.getHistoryData()
219
- data.children = Array.from(this.children)
220
- data.isGroup = true
221
-
222
- const {
223
- x,
224
- y,
225
- collapsedWidth,
226
- collapsedHeight,
227
- expandWidth,
228
- expandHeight,
229
- isCollapsed,
230
- } = this
231
- if (isCollapsed) {
232
- // 如果当前是折叠模式
233
- // 存入history的时候,将坐标恢复到未折叠前的坐标数据
234
- // 因为拿出history数据的时候,会触发collapse()进行坐标的折叠计算
235
- data.x = x + expandWidth / 2 - collapsedWidth / 2
236
- data.y = y + expandHeight / 2 - collapsedHeight / 2
237
- if (data.text) {
238
- data.text.x = data.text.x + expandWidth / 2 - collapsedWidth / 2
239
- data.text.y = data.text.y + expandHeight / 2 - collapsedHeight / 2
240
- }
241
- }
242
- return data
243
- }
244
-
245
- /**
246
- * 触发分组节点的「折叠 or 展开」动作
247
- * 1. 折叠分组的宽高
248
- * 2. 处理分组子节点
249
- * 3. 处理连线
250
- * @param collapse {boolean} true -> 折叠;false -> 展开
251
- */
252
- toggleCollapse(collapse?: boolean) {
253
- const { graphModel } = this
254
- const nextCollapseState = !!collapse
255
- // DONE: 通过 setProperty 设置 isCollapsed 的值 -> 否则无法触发 node:properties-changed 事件
256
- this.isCollapsed = nextCollapseState
257
- this.setProperties({ isCollapsed: nextCollapseState })
258
-
259
- graphModel.eventCenter.emit('dynamicGroup:collapse', {
260
- collapse: nextCollapseState,
261
- nodeModel: this,
262
- })
263
-
264
- // step 1
265
- if (nextCollapseState) {
266
- this.collapse()
267
- } else {
268
- this.expand()
269
- }
270
-
271
- // step 2
272
- let allRelatedEdges = [...this.incoming.edges, ...this.outgoing.edges]
273
- const childrenArr = Array.from(this.children)
274
-
275
- forEach(childrenArr, (elementId) => {
276
- // FIX: 当使用 graphModel.getElement 获取元素时,会因为
277
- // const model = this.graphModel.getElement(elementId)
278
- const model = this.graphModel.elementsModelMap.get(elementId)
279
-
280
- if (model) {
281
- // TODO: ??? 普通节点有这个属性吗?确认这个代码的意义
282
- const collapseStatus = model.isCollapsed
283
- // FIX: https://github.com/didi/LogicFlow/issues/1007
284
- // 下面代码片段,针对 Group 节点执行
285
- if (model.isGroup) {
286
- const groupModel = model as DynamicGroupNodeModel
287
-
288
- if (!groupModel.isCollapsed) {
289
- // 正常情况下,parent 折叠后,children 也应该折叠
290
- // 因此当前 parent 准备展开时,children 的目前状态肯定是折叠状态,也就是 model.isCollapsed 为 true,这个代码块不会触发
291
- // 只有当 parent 准备折叠时,children 目前状态才有可能是展开
292
- // 即 model.isCollapsed 为 false,这个代码块触发, 此时 isCollapse 为 true,触发 children 也进行折叠
293
- groupModel.toggleCollapse(collapse)
294
- }
295
-
296
- if (!collapse) {
297
- // 当 parent 准备展开时,children 的值应该恢复到折叠前的状态
298
- const lastCollapseStatus =
299
- this.childrenLastCollapseStateDict?.get(elementId)
300
- if (
301
- lastCollapseStatus !== undefined &&
302
- lastCollapseStatus !== model.isCollapsed
303
- ) {
304
- // https://github.com/didi/LogicFlow/issues/1145
305
- // 当parent准备展开时,children的值肯定是折叠,也就是nodeModel.isCollapsed=true
306
- // 当parent准备展开时,如果children之前的状态是展开,则恢复展开状态
307
- groupModel.toggleCollapse(lastCollapseStatus)
308
- }
309
- }
310
- }
311
-
312
- this.childrenLastCollapseStateDict?.set(elementId, !!collapseStatus)
313
- model.visible = !collapse
314
-
315
- // 判断,如果是节点时,才去读取节点的 incoming 和 outgoing
316
- if (model.BaseType === ElementType.NODE) {
317
- const incomingEdges = model.incoming.edges
318
- const outgoingEdges = model.outgoing.edges
319
-
320
- allRelatedEdges = [
321
- ...allRelatedEdges,
322
- ...incomingEdges,
323
- ...outgoingEdges,
324
- ]
325
- }
326
- }
327
- })
328
- // step 3
329
- this.collapseEdge(nextCollapseState, allRelatedEdges)
330
- }
331
-
332
- // 折叠操作
333
- private collapse() {
334
- const { x, y, text, width, height, collapsedWidth, collapsedHeight } = this
335
- this.x = x - width / 2 + collapsedWidth / 2
336
- this.y = y - height / 2 + collapsedHeight / 2
337
-
338
- this.text.x = text.x - width / 2 + collapsedWidth / 2
339
- this.text.y = text.y - height / 2 + collapsedHeight / 2
340
-
341
- // 记录折叠前的节点大小,并将其记录到 expandWidth 中
342
- this.expandWidth = width
343
- this.expandHeight = height
344
-
345
- this.width = collapsedWidth
346
- this.height = collapsedHeight
347
- }
348
-
349
- // 展开操作
350
- private expand() {
351
- const {
352
- x,
353
- y,
354
- text,
355
- expandWidth,
356
- expandHeight,
357
- collapsedWidth,
358
- collapsedHeight,
359
- } = this
360
- this.width = expandWidth
361
- this.height = expandHeight
362
-
363
- // 重新计算节点及文本的坐标
364
- this.x = x + this.width / 2 - collapsedWidth / 2
365
- this.y = y + this.height / 2 - collapsedHeight / 2
366
-
367
- this.text.x = text.x + this.width / 2 - collapsedWidth / 2
368
- this.text.y = text.y + this.height / 2 - collapsedHeight / 2
369
- }
370
-
371
- createVirtualEdge(edgeConfig: EdgeConfig) {
372
- edgeConfig.pointsList = undefined
373
-
374
- const virtualEdge = this.graphModel.addEdge(edgeConfig)
375
- virtualEdge.virtual = true
376
-
377
- // TODO: 强制不保存 group 连线数据???-> 为什么注释掉?是不是不能强制设置为 null,会导致无法回填
378
- // virtualEdge.getData = () => null
379
- virtualEdge.text.editable = false
380
- virtualEdge.isCollapsedEdge = true // 这一行干啥的,TODO: 项目中没搜到应用的地方,是否应该移除
381
- }
382
-
383
- /**
384
- * 折叠分组的时候,需要处理分组自身的连线和分组内部子节点上的连线
385
- * 边的分类:
386
- * - 虚拟边:分组被收起时,标识分组本身与外部节点关系的边
387
- * - 真实边:分组本身或者分组内部节点与外部节点(非收起分组)关系的边
388
- * 如果一个分组,本身与外部节点有 M 条连线,且内部 N 个子节点与外部节点有连线,那么这个分组收起时会生成 M+N 条连线
389
- * 折叠分组时:
390
- * - 原有的虚拟边删除
391
- * - 创建一个虚拟边
392
- * - 真实边则隐藏
393
- * 展开分组时:
394
- * - 当前的虚拟边删除
395
- * - 如果外部节点是收起的分组,则创建虚拟边
396
- * - 如果外部节点是普通节点,则显示真实边
397
- *
398
- * @param collapse
399
- * @param edges
400
- */
401
- collapseEdge(collapse: boolean, edges: BaseEdgeModel[]) {
402
- const { graphModel } = this
403
- forEach(edges, (edge, idx) => {
404
- const edgeData = edge.getData()
405
- const { targetNodeId, sourceNodeId } = edgeData
406
-
407
- const edgeConfig: EdgeConfig = {
408
- ...edgeData,
409
- id: `${edgeData.id}__${idx}`,
410
- text: edgeData.text?.value,
411
- }
412
-
413
- if (edge.virtual) {
414
- graphModel.deleteEdgeById(edge.id)
415
- }
416
- // 考虑目标节点也属于分组的情况
417
- let targetNodeGroup =
418
- graphModel.dynamicGroup.getGroupByNodeId(targetNodeId)
419
- if (!targetNodeGroup) {
420
- targetNodeGroup = graphModel.getNodeModelById(targetNodeId)
421
- }
422
-
423
- // 考虑源节点也属于分组的情况
424
- let sourceNodeGroup =
425
- graphModel.dynamicGroup.getGroupByNodeId(sourceNodeId)
426
- if (!sourceNodeGroup) {
427
- sourceNodeGroup = graphModel.getNodeModelById(sourceNodeId)
428
- }
429
-
430
- // 折叠时,处理未被隐藏的边的逻辑 -> collapse
431
- if (collapse && edge.visible) {
432
- // 需要确认此分组节点是新连线的起点还是终点
433
- // 创建一个虚拟边,虚拟边相对于真实边,起点或者终点从一起分组节点的中心点开始 TODO:??? 确认什么意思
434
- // 如果需要被隐藏的边的起点在需要折叠的分组中,那么设置虚拟边的开始节点为此分组
435
- if (this.children.has(sourceNodeId) || this.id === sourceNodeId) {
436
- edgeConfig.startPoint = undefined
437
- edgeConfig.sourceNodeId = this.id
438
- } else {
439
- edgeConfig.endPoint = undefined
440
- edgeConfig.targetNodeId = this.id
441
- }
442
-
443
- // 如果边的起点和终点都在分组内部,则不创建新的虚拟边
444
- if (targetNodeGroup.id !== this.id || sourceNodeGroup.id !== this.id) {
445
- this.createVirtualEdge(edgeConfig)
446
- }
447
- edge.visible = false
448
- }
449
-
450
- // 展开时,处理被隐藏的边的逻辑 -> expand
451
- if (!collapse && !edge.visible) {
452
- // 展开分组时:判断真实边的起点和中带你是否有任一节点在已折叠分组中,如果不是,则显示真实边
453
- // 如果是,则修改这个边的对应目标节点 id 来创建虚拟边
454
- if (
455
- targetNodeGroup &&
456
- targetNodeGroup.isGroup &&
457
- targetNodeGroup.isCollapsed
458
- ) {
459
- edgeConfig.targetNodeId = targetNodeGroup.id
460
- edgeConfig.endPoint = undefined
461
- this.createVirtualEdge(edgeConfig)
462
- } else if (
463
- sourceNodeGroup &&
464
- sourceNodeGroup.isGroup &&
465
- sourceNodeGroup.isCollapsed
466
- ) {
467
- edgeConfig.sourceNodeId = sourceNodeGroup.id
468
- edgeConfig.startPoint = undefined
469
- this.createVirtualEdge(edgeConfig)
470
- } else {
471
- edge.visible = true
472
- }
473
- }
474
- })
475
- }
476
-
477
- /**
478
- * 是否允许此节点添加到该分组
479
- * TODO: 如何重写该方法呢?
480
- * @param _nodeData
481
- */
482
- // eslint-disable-next-line
483
- isAllowAppendIn(_nodeData: NodeData) {
484
- // TODO: 此处使用 this.properties.groupAddable 还是 this.groupAddable
485
- // this.groupAddable 是否存在更新不及时的问题
486
- return true
487
- }
488
-
489
- /**
490
- * 更新分组节点是否允许添加节点的属性
491
- * @param isAllow
492
- */
493
- setAllowAppendChild(isAllow: boolean) {
494
- // this.setProperty('groupAddable', isAllow)
495
- this.groupAddable = isAllow
496
- }
497
-
498
- /**
499
- * 添加节点至分组中
500
- * @param id
501
- */
502
- addChild(id: string) {
503
- this.children.add(id)
504
- const groupData = this.getData()
505
- this.graphModel.eventCenter.emit('group:add-node', {
506
- data: groupData,
507
- childId: id,
508
- })
509
- }
510
-
511
- /**
512
- * 从分组中移除某节点
513
- * @param id
514
- */
515
- removeChild(id: string) {
516
- this.children.delete(id)
517
- const groupData = this.getData()
518
- this.graphModel.eventCenter.emit('group:remove-node', { data: groupData })
519
- }
520
-
521
- /**
522
- * 当 groupA 被添加到 groupB 中时,将 groupB 及 groupB 所属的 group zIndex 减 1
523
- */
524
- toBack() {
525
- this.zIndex--
526
- }
527
-
528
- /**
529
- * 重写 Group 节点的 Resize Outline
530
- */
531
- getResizeOutlineStyle(): LogicFlow.CommonTheme {
532
- const style = super.getResizeOutlineStyle()
533
- style.stroke = 'none'
534
- return style
535
- }
536
-
537
- // TODO: 是否是设置 group 节点没有锚点,而不是设置成透明???
538
- getAnchorStyle() {
539
- const style = super.getAnchorStyle()
540
- style.stroke = 'transparent'
541
- style.fill = 'transparent'
542
- if (style.hover) {
543
- style.hover.fill = 'transparent'
544
- style.hover.stroke = 'transparent'
545
- }
546
- return style
547
- }
548
-
549
- /**
550
- * 设置分组节点 drop 区域的样式
551
- */
552
- getAddableOutlineStyle() {
553
- return {
554
- stroke: '#feb663',
555
- strokeWidth: 2,
556
- strokeDasharray: '4 4',
557
- fill: 'transparent',
558
- }
559
- }
560
- }
561
-
562
- export default DynamicGroupNodeModel