@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.
- package/README.md +16 -0
- package/dist/index.css +1 -1
- package/dist/index.min.js +1 -1
- package/dist/index.min.js.map +1 -1
- package/es/NodeResize/node/RectResize.d.ts +0 -6
- package/es/NodeResize/node/RectResize.js +2 -11
- package/es/bpmn-elements-adapter/json2xml.d.ts +2 -1
- package/es/bpmn-elements-adapter/json2xml.js +18 -4
- package/es/bpmn-elements-adapter/xml2json.js +2 -7
- package/es/components/control/index.d.ts +1 -0
- package/es/components/control/index.js +24 -11
- package/es/components/mini-map/index.js +1 -1
- package/es/dynamic-group/model.d.ts +2 -1
- package/es/dynamic-group/model.js +28 -11
- package/es/dynamic-group/node.js +1 -0
- package/es/index.css +1 -1
- package/es/index.d.ts +1 -0
- package/es/index.js +2 -0
- package/es/insert-node-in-polyline/index.js +11 -35
- package/es/materials/curved-edge/index.js +49 -21
- package/es/materials/group/GroupNode.d.ts +0 -6
- package/es/materials/group/GroupNode.js +1 -6
- package/es/pool/LaneModel.d.ts +90 -0
- package/es/pool/LaneModel.js +252 -0
- package/es/pool/LaneView.d.ts +40 -0
- package/es/pool/LaneView.js +202 -0
- package/es/pool/PoolModel.d.ts +120 -0
- package/es/pool/PoolModel.js +586 -0
- package/es/pool/PoolView.d.ts +17 -0
- package/es/pool/PoolView.js +76 -0
- package/es/pool/constant.d.ts +15 -0
- package/es/pool/constant.js +17 -0
- package/es/pool/index.d.ts +89 -0
- package/es/pool/index.js +524 -0
- package/es/pool/utils.d.ts +19 -0
- package/es/pool/utils.js +33 -0
- package/es/style/index.css +1 -1
- package/es/style/raw.d.ts +1 -1
- package/es/style/raw.js +1 -1
- package/es/tools/label/LabelOverlay.js +3 -3
- package/es/tools/label/mediumEditor.d.ts +1 -1
- package/es/tools/label/mediumEditor.js +89 -52
- package/es/tools/snapshot/index.d.ts +7 -3
- package/es/tools/snapshot/index.js +72 -77
- package/lib/NodeResize/node/RectResize.d.ts +0 -6
- package/lib/NodeResize/node/RectResize.js +1 -10
- package/lib/bpmn-elements-adapter/json2xml.d.ts +2 -1
- package/lib/bpmn-elements-adapter/json2xml.js +19 -4
- package/lib/bpmn-elements-adapter/xml2json.js +2 -7
- package/lib/components/control/index.d.ts +1 -0
- package/lib/components/control/index.js +24 -11
- package/lib/components/mini-map/index.js +1 -1
- package/lib/dynamic-group/model.d.ts +2 -1
- package/lib/dynamic-group/model.js +28 -11
- package/lib/dynamic-group/node.js +1 -0
- package/lib/index.css +1 -1
- package/lib/index.d.ts +1 -0
- package/lib/index.js +2 -0
- package/lib/insert-node-in-polyline/index.js +10 -34
- package/lib/materials/curved-edge/index.js +49 -21
- package/lib/materials/group/GroupNode.d.ts +0 -6
- package/lib/materials/group/GroupNode.js +1 -6
- package/lib/pool/LaneModel.d.ts +90 -0
- package/lib/pool/LaneModel.js +255 -0
- package/lib/pool/LaneView.d.ts +40 -0
- package/lib/pool/LaneView.js +205 -0
- package/lib/pool/PoolModel.d.ts +120 -0
- package/lib/pool/PoolModel.js +589 -0
- package/lib/pool/PoolView.d.ts +17 -0
- package/lib/pool/PoolView.js +79 -0
- package/lib/pool/constant.d.ts +15 -0
- package/lib/pool/constant.js +20 -0
- package/lib/pool/index.d.ts +89 -0
- package/lib/pool/index.js +527 -0
- package/lib/pool/utils.d.ts +19 -0
- package/lib/pool/utils.js +38 -0
- package/lib/style/index.css +1 -1
- package/lib/style/raw.d.ts +1 -1
- package/lib/style/raw.js +1 -1
- package/lib/tools/label/LabelOverlay.js +2 -2
- package/lib/tools/label/mediumEditor.d.ts +1 -1
- package/lib/tools/label/mediumEditor.js +91 -53
- package/lib/tools/snapshot/index.d.ts +7 -3
- package/lib/tools/snapshot/index.js +72 -77
- package/package.json +10 -7
- package/.turbo/turbo-build.log +0 -38
- package/CHANGELOG.md +0 -1766
- package/__test__/bpmn-adapter.test.js +0 -227
- package/es/materials/curved-edge/__test__/curved-edge.test.d.ts +0 -1
- package/es/materials/curved-edge/__test__/curved-edge.test.js +0 -18
- package/jest.config.js +0 -198
- package/lib/materials/curved-edge/__test__/curved-edge.test.d.ts +0 -1
- package/lib/materials/curved-edge/__test__/curved-edge.test.js +0 -20
- package/rollup.config.js +0 -52
- package/src/NodeResize/BasicShape/Ellipse.tsx +0 -22
- package/src/NodeResize/BasicShape/Polygon.tsx +0 -24
- package/src/NodeResize/BasicShape/Rect.tsx +0 -44
- package/src/NodeResize/control/Control.tsx +0 -537
- package/src/NodeResize/control/ControlGroup.tsx +0 -76
- package/src/NodeResize/control/Util.ts +0 -206
- package/src/NodeResize/index.ts +0 -26
- package/src/NodeResize/node/DiamondResize.tsx +0 -149
- package/src/NodeResize/node/EllipseResize.tsx +0 -140
- package/src/NodeResize/node/HtmlResize.tsx +0 -125
- package/src/NodeResize/node/RectResize.tsx +0 -146
- package/src/NodeResize/node/index.ts +0 -4
- package/src/bpmn/constant.ts +0 -56
- package/src/bpmn/events/EndEvent.ts +0 -73
- package/src/bpmn/events/StartEvent.ts +0 -52
- package/src/bpmn/events/index.ts +0 -2
- package/src/bpmn/flow/SequenceFlow.ts +0 -25
- package/src/bpmn/flow/index.ts +0 -1
- package/src/bpmn/gateways/ExclusiveGateway.ts +0 -71
- package/src/bpmn/gateways/index.ts +0 -1
- package/src/bpmn/getBpmnId.ts +0 -31
- package/src/bpmn/index.ts +0 -60
- package/src/bpmn/tasks/ServiceTask.ts +0 -63
- package/src/bpmn/tasks/UserTask.ts +0 -64
- package/src/bpmn/tasks/index.ts +0 -2
- package/src/bpmn-adapter/bpmnIds.ts +0 -31
- package/src/bpmn-adapter/index.ts +0 -835
- package/src/bpmn-adapter/json2xml.ts +0 -127
- package/src/bpmn-adapter/xml2json.ts +0 -544
- package/src/bpmn-elements/README.md +0 -223
- package/src/bpmn-elements/__tests__/definition.test.js +0 -72
- package/src/bpmn-elements/index.d.ts +0 -26
- package/src/bpmn-elements/index.ts +0 -107
- package/src/bpmn-elements/presets/Event/EndEventFactory.ts +0 -114
- package/src/bpmn-elements/presets/Event/IntermediateCatchEvent.ts +0 -108
- package/src/bpmn-elements/presets/Event/IntermediateThrowEvent.ts +0 -109
- package/src/bpmn-elements/presets/Event/StartEventFactory.ts +0 -114
- package/src/bpmn-elements/presets/Event/boundaryEventFactory.ts +0 -117
- package/src/bpmn-elements/presets/Event/index.ts +0 -14
- package/src/bpmn-elements/presets/Flow/flow.d.ts +0 -6
- package/src/bpmn-elements/presets/Flow/index.ts +0 -8
- package/src/bpmn-elements/presets/Flow/manhattan.ts +0 -691
- package/src/bpmn-elements/presets/Flow/sequenceFlow.ts +0 -65
- package/src/bpmn-elements/presets/Gateway/gateway.ts +0 -107
- package/src/bpmn-elements/presets/Gateway/index.ts +0 -23
- package/src/bpmn-elements/presets/Pool/Lane.ts +0 -211
- package/src/bpmn-elements/presets/Pool/Pool.ts +0 -284
- package/src/bpmn-elements/presets/Pool/index.ts +0 -89
- package/src/bpmn-elements/presets/Task/index.ts +0 -122
- package/src/bpmn-elements/presets/Task/subProcess.ts +0 -189
- package/src/bpmn-elements/presets/Task/task.ts +0 -193
- package/src/bpmn-elements/presets/icons.ts +0 -155
- package/src/bpmn-elements/utils.ts +0 -52
- package/src/bpmn-elements-adapter/README.md +0 -293
- package/src/bpmn-elements-adapter/__tests__/adapter_in.test.js +0 -528
- package/src/bpmn-elements-adapter/__tests__/adapter_out.test.js +0 -569
- package/src/bpmn-elements-adapter/constant.ts +0 -76
- package/src/bpmn-elements-adapter/index.ts +0 -1134
- package/src/bpmn-elements-adapter/json2xml.ts +0 -91
- package/src/bpmn-elements-adapter/xml2json.ts +0 -548
- package/src/components/context-menu/index.ts +0 -253
- package/src/components/control/index.ts +0 -141
- package/src/components/dnd-panel/index.ts +0 -137
- package/src/components/highlight/index.ts +0 -227
- package/src/components/menu/index.ts +0 -748
- package/src/components/mini-map/index.ts +0 -686
- package/src/components/selection-select/index.ts +0 -387
- package/src/dynamic-group/index.ts +0 -775
- package/src/dynamic-group/model.ts +0 -562
- package/src/dynamic-group/node.ts +0 -288
- package/src/dynamic-group/utils.ts +0 -46
- package/src/index.less +0 -1
- package/src/index.ts +0 -45
- package/src/insert-node-in-polyline/edge.ts +0 -175
- package/src/insert-node-in-polyline/index.ts +0 -187
- package/src/materials/curved-edge/__test__/curved-edge.test.ts +0 -46
- package/src/materials/curved-edge/index.ts +0 -185
- package/src/materials/group/GroupNode.ts +0 -442
- package/src/materials/group/index.ts +0 -542
- package/src/materials/node-selection/index.ts +0 -380
- package/src/mindmap/fakerRoot.ts +0 -19
- package/src/mindmap/index.ts +0 -328
- package/src/mindmap/markContent.ts +0 -81
- package/src/mindmap/markContentOption.ts +0 -81
- package/src/mindmap/markEntity.ts +0 -82
- package/src/mindmap/markRoot.ts +0 -83
- package/src/mindmap/theme.ts +0 -11
- package/src/rect-label-node/RectLabelNodeView.ts +0 -33
- package/src/rect-label-node/index.ts +0 -15
- package/src/style/index.less +0 -342
- package/src/style/raw.ts +0 -295
- package/src/tools/auto-layout/index.ts +0 -282
- package/src/tools/flow-path/index.ts +0 -233
- package/src/tools/label/Label.tsx +0 -357
- package/src/tools/label/LabelModel.ts +0 -83
- package/src/tools/label/LabelOverlay.tsx +0 -158
- package/src/tools/label/algorithm.ts +0 -42
- package/src/tools/label/index.ts +0 -479
- package/src/tools/label/mediumEditor.ts +0 -94
- package/src/tools/label/utils.ts +0 -395
- package/src/tools/proximity-connect/index.ts +0 -435
- package/src/tools/snapshot/README.md +0 -145
- package/src/tools/snapshot/index.ts +0 -718
- package/src/tools/snapshot/utils.ts +0 -163
- package/src/turbo-adapter/index.ts +0 -212
- package/stats.html +0 -4842
- package/tsconfig.json +0 -18
|
@@ -1,542 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @deprecated
|
|
3
|
-
* 待废弃,2.0 版本将 提供 dynamic-group 支持分组功能,当前 Group 插件设计和实现有比较多的问题,后续不再维护,请及时切换
|
|
4
|
-
*/
|
|
5
|
-
import { forEach, isEmpty, isObject } from 'lodash-es'
|
|
6
|
-
import LogicFlow, {
|
|
7
|
-
BaseEdgeModel,
|
|
8
|
-
BaseNodeModel,
|
|
9
|
-
EventType,
|
|
10
|
-
Model,
|
|
11
|
-
} from '@logicflow/core'
|
|
12
|
-
import GroupNode, { GroupNodeModel } from './GroupNode'
|
|
13
|
-
|
|
14
|
-
import GraphConfigData = LogicFlow.GraphConfigData
|
|
15
|
-
import EdgeConfig = LogicFlow.EdgeConfig
|
|
16
|
-
import NodeData = LogicFlow.NodeData
|
|
17
|
-
import Point = LogicFlow.Point
|
|
18
|
-
import BoxBoundsPoint = Model.BoxBoundsPoint
|
|
19
|
-
import NodeConfig = LogicFlow.NodeConfig
|
|
20
|
-
|
|
21
|
-
const DEFAULT_TOP_Z_INDEX = -1000
|
|
22
|
-
const DEFAULT_BOTTOM_Z_INDEX = -10000
|
|
23
|
-
|
|
24
|
-
export class Group {
|
|
25
|
-
static pluginName = 'group'
|
|
26
|
-
|
|
27
|
-
private lf: LogicFlow
|
|
28
|
-
topGroupZIndex = DEFAULT_BOTTOM_Z_INDEX
|
|
29
|
-
activeGroup: any
|
|
30
|
-
nodeGroupMap: Map<string, string> = new Map()
|
|
31
|
-
|
|
32
|
-
constructor({ lf }: LogicFlow.IExtensionProps) {
|
|
33
|
-
lf.register(GroupNode)
|
|
34
|
-
this.lf = lf
|
|
35
|
-
|
|
36
|
-
lf.graphModel.addNodeMoveRules((model, deltaX, deltaY) => {
|
|
37
|
-
if (model.isGroup) {
|
|
38
|
-
// 如果移动的是分组,那么分组的子节点也跟着移动。
|
|
39
|
-
const nodeIds = this.getNodeAllChild(model)
|
|
40
|
-
lf.graphModel.moveNodes(nodeIds, deltaX, deltaY, true)
|
|
41
|
-
return true
|
|
42
|
-
}
|
|
43
|
-
const groupModel = lf.getNodeModelById(
|
|
44
|
-
this.nodeGroupMap.get(model.id)!,
|
|
45
|
-
) as GroupNodeModel
|
|
46
|
-
if (groupModel && groupModel.isRestrict) {
|
|
47
|
-
// 如果移动的节点存在分组中,且这个分组禁止子节点移出去。
|
|
48
|
-
const { minX, minY, maxX, maxY } = model.getBounds()
|
|
49
|
-
return groupModel.isAllowMoveTo({
|
|
50
|
-
minX: minX + deltaX,
|
|
51
|
-
minY: minY + deltaY,
|
|
52
|
-
maxX: maxX + deltaX,
|
|
53
|
-
maxY: maxY + deltaY,
|
|
54
|
-
})
|
|
55
|
-
}
|
|
56
|
-
|
|
57
|
-
return true
|
|
58
|
-
})
|
|
59
|
-
|
|
60
|
-
lf.graphModel.group = this
|
|
61
|
-
lf.on('node:add,node:drop,node:dnd-add', this.appendNodeToGroup)
|
|
62
|
-
lf.on('node:delete', this.deleteGroupChild)
|
|
63
|
-
lf.on('node:dnd-drag,node:drag', this.setActiveGroup)
|
|
64
|
-
lf.on('node:click', this.nodeSelected)
|
|
65
|
-
lf.on('graph:rendered', this.graphRendered)
|
|
66
|
-
|
|
67
|
-
// https://github.com/didi/LogicFlow/issues/1346
|
|
68
|
-
// 重写 addElements() 方法,在 addElements() 原有基础上增加对 group 内部所有 nodes 和 edges 的复制功能
|
|
69
|
-
lf.addElements = (
|
|
70
|
-
{ nodes: selectedNodes, edges: selectedEdges }: GraphConfigData,
|
|
71
|
-
distance: number,
|
|
72
|
-
): {
|
|
73
|
-
nodes: BaseNodeModel[]
|
|
74
|
-
edges: BaseEdgeModel[]
|
|
75
|
-
} => {
|
|
76
|
-
// ============== 变量初始化 ==============
|
|
77
|
-
const nodeIdMap: Record<string, string> = {}
|
|
78
|
-
const elements: any = {
|
|
79
|
-
nodes: [],
|
|
80
|
-
edges: [],
|
|
81
|
-
}
|
|
82
|
-
const groupInnerEdges: EdgeConfig[] = []
|
|
83
|
-
// ============== 变量初始化 ==============
|
|
84
|
-
|
|
85
|
-
forEach(selectedNodes, (node) => {
|
|
86
|
-
const preId = node.id
|
|
87
|
-
const { children, ...rest } = node
|
|
88
|
-
const nodeModel = lf.addNode(rest)
|
|
89
|
-
if (!nodeModel) {
|
|
90
|
-
return {
|
|
91
|
-
nodes: [],
|
|
92
|
-
edges: [],
|
|
93
|
-
}
|
|
94
|
-
}
|
|
95
|
-
if (preId) nodeIdMap[preId] = nodeModel.id
|
|
96
|
-
elements.nodes.push(nodeModel) // group的nodeModel
|
|
97
|
-
|
|
98
|
-
// 递归创建group的nodeModel的children
|
|
99
|
-
const { edgesArray } = this.createAllChildNodes(
|
|
100
|
-
nodeIdMap,
|
|
101
|
-
children as Set<string>,
|
|
102
|
-
nodeModel,
|
|
103
|
-
distance,
|
|
104
|
-
)
|
|
105
|
-
groupInnerEdges.push(...edgesArray)
|
|
106
|
-
})
|
|
107
|
-
|
|
108
|
-
groupInnerEdges.forEach((edge) => {
|
|
109
|
-
this.createEdgeModel(edge, nodeIdMap, distance)
|
|
110
|
-
})
|
|
111
|
-
// 构建的时候直接偏移,这里不需要再进行再度偏移
|
|
112
|
-
// groupInnerChildren.nodes.forEach(node => this.translateNodeData(node, distance));
|
|
113
|
-
// groupInnerChildren.edges.forEach(edge => this. translateEdgeData(edge, distance));
|
|
114
|
-
|
|
115
|
-
// 最外层的edges继续执行创建edgeModel的流程
|
|
116
|
-
// 由于最外层会调用 translateEdgeData(),因此这里不用传入distance进行偏移
|
|
117
|
-
forEach(selectedEdges, (edge) => {
|
|
118
|
-
const edgeModel = this.createEdgeModel(edge, nodeIdMap, 0)
|
|
119
|
-
elements.edges.push(edgeModel)
|
|
120
|
-
})
|
|
121
|
-
|
|
122
|
-
// 返回elements进行选中效果,即触发element.selectElementById()
|
|
123
|
-
// shortcut.ts也会对最外层的nodes和edges进行偏移,即translateNodeData()
|
|
124
|
-
return elements
|
|
125
|
-
}
|
|
126
|
-
}
|
|
127
|
-
|
|
128
|
-
/**
|
|
129
|
-
* 创建一个Group类型节点内部的所有子节点的副本
|
|
130
|
-
* 并且在遍历所有nodes的过程中顺便拿到所有edges(只在Group范围的edges)
|
|
131
|
-
*/
|
|
132
|
-
createAllChildNodes(
|
|
133
|
-
nodeIdMap: Record<string, string>,
|
|
134
|
-
children: Set<string>,
|
|
135
|
-
current: BaseNodeModel,
|
|
136
|
-
distance: number,
|
|
137
|
-
) {
|
|
138
|
-
const { lf } = this
|
|
139
|
-
const edgesDataArray: EdgeConfig[] = []
|
|
140
|
-
const edgesNodeModelArray: BaseEdgeModel[] = []
|
|
141
|
-
const nodesArray: BaseNodeModel[] = []
|
|
142
|
-
children?.forEach((childId: string) => {
|
|
143
|
-
const childNodeModel = lf.getNodeModelById(childId)
|
|
144
|
-
if (childNodeModel) {
|
|
145
|
-
const {
|
|
146
|
-
x,
|
|
147
|
-
y,
|
|
148
|
-
properties,
|
|
149
|
-
type,
|
|
150
|
-
rotate,
|
|
151
|
-
children,
|
|
152
|
-
// incoming,
|
|
153
|
-
// outgoing,
|
|
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
|
-
}
|
|
164
|
-
|
|
165
|
-
const eventType =
|
|
166
|
-
EventType.NODE_GROUP_COPY || ('node:group-copy-add' as EventType)
|
|
167
|
-
const newChildModel = lf.addNode(nodeConfig, eventType)
|
|
168
|
-
|
|
169
|
-
;(current as GroupNodeModel).addChild(newChildModel.id)
|
|
170
|
-
nodeIdMap[childId] = newChildModel.id
|
|
171
|
-
nodesArray.push(newChildModel)
|
|
172
|
-
// 存储children内部节点相关的输入边
|
|
173
|
-
childNodeModel.incoming.edges.forEach((edge) => {
|
|
174
|
-
edgesNodeModelArray.push(edge)
|
|
175
|
-
})
|
|
176
|
-
// 存储children内部节点相关的输出边
|
|
177
|
-
childNodeModel.outgoing.edges.forEach((edge) => {
|
|
178
|
-
edgesNodeModelArray.push(edge)
|
|
179
|
-
})
|
|
180
|
-
|
|
181
|
-
if (children instanceof Set) {
|
|
182
|
-
const { nodesArray: childNodes, edgesArray: childEdges } =
|
|
183
|
-
this.createAllChildNodes(
|
|
184
|
-
nodeIdMap,
|
|
185
|
-
children,
|
|
186
|
-
newChildModel,
|
|
187
|
-
distance,
|
|
188
|
-
)
|
|
189
|
-
nodesArray.push(...childNodes)
|
|
190
|
-
edgesDataArray.push(...childEdges)
|
|
191
|
-
}
|
|
192
|
-
}
|
|
193
|
-
})
|
|
194
|
-
// 1. 判断每一条边的开始节点和目标节点是否在Group中
|
|
195
|
-
const filterEdgesArray: BaseEdgeModel[] = edgesNodeModelArray.filter(
|
|
196
|
-
(edge: BaseEdgeModel) =>
|
|
197
|
-
nodeIdMap[edge.sourceNodeId] && nodeIdMap[edge.targetNodeId],
|
|
198
|
-
)
|
|
199
|
-
// 2. 为每一条group的内部边构建出EdgeData数据
|
|
200
|
-
// 从GraphModel.ts的getSelectElements()可以知道EdgeConfig就是EdgeData
|
|
201
|
-
const filterEdgesDataArray: EdgeConfig[] = filterEdgesArray.map((item) =>
|
|
202
|
-
item.getData(),
|
|
203
|
-
)
|
|
204
|
-
return {
|
|
205
|
-
nodesArray,
|
|
206
|
-
edgesArray: edgesDataArray.concat(filterEdgesDataArray), // ??? what's this
|
|
207
|
-
}
|
|
208
|
-
}
|
|
209
|
-
|
|
210
|
-
createEdgeModel(
|
|
211
|
-
edge: EdgeConfig,
|
|
212
|
-
nodeIdMap: Record<string, string>,
|
|
213
|
-
distance: number,
|
|
214
|
-
) {
|
|
215
|
-
const { lf } = this
|
|
216
|
-
let sourceId = edge.sourceNodeId
|
|
217
|
-
let targetId = edge.targetNodeId
|
|
218
|
-
if (nodeIdMap[sourceId]) sourceId = nodeIdMap[sourceId]
|
|
219
|
-
if (nodeIdMap[targetId]) targetId = nodeIdMap[targetId]
|
|
220
|
-
const { type, startPoint, endPoint, pointsList, text } = edge
|
|
221
|
-
// ====== 仿造shortcut.ts的 translateEdgeData()逻辑 ======
|
|
222
|
-
const newStartPoint = {
|
|
223
|
-
x: (startPoint?.x || 0) + distance,
|
|
224
|
-
y: (startPoint?.y || 0) + distance,
|
|
225
|
-
}
|
|
226
|
-
const newEndPoint = {
|
|
227
|
-
x: (endPoint?.x || 0) + distance,
|
|
228
|
-
y: (endPoint?.y || 0) + distance,
|
|
229
|
-
}
|
|
230
|
-
let newPointsList: Point[] = []
|
|
231
|
-
if (pointsList && pointsList.length > 0) {
|
|
232
|
-
newPointsList = pointsList.map((point) => {
|
|
233
|
-
point.x += distance
|
|
234
|
-
point.y += distance
|
|
235
|
-
return point
|
|
236
|
-
})
|
|
237
|
-
}
|
|
238
|
-
const edgeConfig: EdgeConfig = {
|
|
239
|
-
type,
|
|
240
|
-
startPoint: newStartPoint,
|
|
241
|
-
endPoint: newEndPoint,
|
|
242
|
-
sourceNodeId: sourceId,
|
|
243
|
-
targetNodeId: targetId,
|
|
244
|
-
pointsList: newPointsList,
|
|
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)
|
|
258
|
-
}
|
|
259
|
-
|
|
260
|
-
/**
|
|
261
|
-
* 获取一个节点内部所有的子节点,包裹分组的子节点
|
|
262
|
-
*/
|
|
263
|
-
getNodeAllChild(model: GroupNodeModel | BaseNodeModel) {
|
|
264
|
-
let nodeIds: string[] = []
|
|
265
|
-
if (model.children) {
|
|
266
|
-
;(model as GroupNodeModel).children.forEach((nodeId) => {
|
|
267
|
-
nodeIds.push(nodeId)
|
|
268
|
-
const nodeModel = this.lf.getNodeModelById(nodeId)
|
|
269
|
-
if (nodeModel?.isGroup) {
|
|
270
|
-
nodeIds = nodeIds.concat(this.getNodeAllChild(nodeModel))
|
|
271
|
-
}
|
|
272
|
-
})
|
|
273
|
-
}
|
|
274
|
-
return nodeIds
|
|
275
|
-
}
|
|
276
|
-
|
|
277
|
-
graphRendered = ({ data }: { data: LogicFlow.GraphData }) => {
|
|
278
|
-
// 如果节点
|
|
279
|
-
if (data && data.nodes) {
|
|
280
|
-
data.nodes.forEach((node) => {
|
|
281
|
-
if (node.children) {
|
|
282
|
-
;(node.children as string[]).forEach((nodeId) => {
|
|
283
|
-
this.nodeGroupMap.set(nodeId, node.id)
|
|
284
|
-
})
|
|
285
|
-
}
|
|
286
|
-
})
|
|
287
|
-
|
|
288
|
-
// 初始化nodes时进行this.topGroupZIndex的校准更新
|
|
289
|
-
this.checkAndCorrectTopGroupZIndex(data.nodes)
|
|
290
|
-
}
|
|
291
|
-
}
|
|
292
|
-
appendNodeToGroup = ({ data }: { data: NodeData }) => {
|
|
293
|
-
// 如果这个节点之前已经在group中了,则将其从之前的group中移除
|
|
294
|
-
const preGroupId = this.nodeGroupMap.get(data.id)
|
|
295
|
-
if (preGroupId) {
|
|
296
|
-
const preGroup = this.lf.getNodeModelById(preGroupId) as GroupNodeModel
|
|
297
|
-
preGroup.removeChild(data.id)
|
|
298
|
-
this.nodeGroupMap.delete(data.id)
|
|
299
|
-
preGroup.setAllowAppendChild(false)
|
|
300
|
-
}
|
|
301
|
-
|
|
302
|
-
// 然后再判断这个节点是否在某个group中,如果在,则将其添加到对应的group中
|
|
303
|
-
const nodeModel = this.lf.getNodeModelById(data.id)
|
|
304
|
-
const bounds = nodeModel?.getBounds()
|
|
305
|
-
if (bounds && nodeModel) {
|
|
306
|
-
const group = this.getGroup(bounds, data) as GroupNodeModel
|
|
307
|
-
|
|
308
|
-
// https://github.com/didi/LogicFlow/issues/1261
|
|
309
|
-
// 当使用SelectionSelect框选后触发lf.addNode(Group)
|
|
310
|
-
// 会触发appendNodeToGroup()的执行
|
|
311
|
-
// 由于this.getGroup()会判断node.id !== nodeData.id
|
|
312
|
-
// 因此当addNode是Group类型时,this.getGroup()会一直返回空
|
|
313
|
-
// 导致了下面这段代码无法执行,也就是无法将当前添加的Group添加到this.nodeGroupMap中
|
|
314
|
-
// 这导致了折叠分组时触发的foldEdge()无法正确通过getNodeGroup()拿到正确的groupId
|
|
315
|
-
// 从而导致折叠分组时一直都会创建一个虚拟边
|
|
316
|
-
// 而初始化分组时由于正确设置了nodeGroupMap的数据,因此不会产生虚拟边的错误情况
|
|
317
|
-
if (nodeModel.isGroup) {
|
|
318
|
-
// 如果这个节点是分组,那么将其子节点也记录下来
|
|
319
|
-
;(data.children as Set<string>).forEach((nodeId) => {
|
|
320
|
-
this.nodeGroupMap.set(nodeId, data.id)
|
|
321
|
-
})
|
|
322
|
-
// 新增node时进行this.topGroupZIndex的校准更新
|
|
323
|
-
this.checkAndCorrectTopGroupZIndex([data])
|
|
324
|
-
this.nodeSelected({
|
|
325
|
-
data,
|
|
326
|
-
isSelected: false,
|
|
327
|
-
isMultiple: false,
|
|
328
|
-
})
|
|
329
|
-
}
|
|
330
|
-
if (!group) return
|
|
331
|
-
const isAllowAppendIn = group.isAllowAppendIn(data)
|
|
332
|
-
if (!isAllowAppendIn) {
|
|
333
|
-
this.lf.emit('group:not-allowed', {
|
|
334
|
-
group: group.getData(),
|
|
335
|
-
node: data,
|
|
336
|
-
})
|
|
337
|
-
return
|
|
338
|
-
}
|
|
339
|
-
group.addChild(data.id)
|
|
340
|
-
this.nodeGroupMap.set(data.id, group.id)
|
|
341
|
-
group.setAllowAppendChild(false)
|
|
342
|
-
}
|
|
343
|
-
}
|
|
344
|
-
deleteGroupChild = ({ data }: { data: NodeData }) => {
|
|
345
|
-
// 如果删除的是分组节点,则同时删除分组的子节点
|
|
346
|
-
if (data.children) {
|
|
347
|
-
;(data.children as Set<string>).forEach((nodeId) => {
|
|
348
|
-
this.nodeGroupMap.delete(nodeId)
|
|
349
|
-
this.lf.deleteNode(nodeId)
|
|
350
|
-
})
|
|
351
|
-
}
|
|
352
|
-
const groupId = this.nodeGroupMap.get(data.id)
|
|
353
|
-
if (groupId) {
|
|
354
|
-
const group = this.lf.getNodeModelById(groupId) as GroupNodeModel
|
|
355
|
-
group.removeChild(data.id)
|
|
356
|
-
this.nodeGroupMap.delete(data.id)
|
|
357
|
-
}
|
|
358
|
-
}
|
|
359
|
-
setActiveGroup = ({ data }: { data: NodeData }) => {
|
|
360
|
-
const nodeModel = this.lf.getNodeModelById(data.id)
|
|
361
|
-
const bounds = nodeModel?.getBounds()
|
|
362
|
-
if (nodeModel && bounds) {
|
|
363
|
-
const newGroup = this.getGroup(bounds, data)
|
|
364
|
-
if (this.activeGroup) {
|
|
365
|
-
this.activeGroup.setAllowAppendChild(false)
|
|
366
|
-
}
|
|
367
|
-
if (!newGroup || (nodeModel.isGroup && newGroup.id === data.id)) return
|
|
368
|
-
const isAllowAppendIn = (newGroup as GroupNodeModel).isAllowAppendIn(data)
|
|
369
|
-
if (!isAllowAppendIn) {
|
|
370
|
-
return
|
|
371
|
-
}
|
|
372
|
-
this.activeGroup = newGroup
|
|
373
|
-
this.activeGroup.setAllowAppendChild(true)
|
|
374
|
-
}
|
|
375
|
-
}
|
|
376
|
-
findNodeAndChildMaxZIndex = (nodeModel: BaseNodeModel) => {
|
|
377
|
-
let maxZIndex = DEFAULT_BOTTOM_Z_INDEX
|
|
378
|
-
if (nodeModel.isGroup) {
|
|
379
|
-
maxZIndex = Math.max(maxZIndex, nodeModel.zIndex)
|
|
380
|
-
}
|
|
381
|
-
if (nodeModel.children) {
|
|
382
|
-
;(nodeModel as GroupNodeModel).children.forEach((nodeId) => {
|
|
383
|
-
if (typeof nodeId === 'object') {
|
|
384
|
-
// 正常情况下, GroupNodeModel.children是一个id数组,这里只是做个兼容
|
|
385
|
-
// @ts-ignore
|
|
386
|
-
nodeId = nodeId.id
|
|
387
|
-
}
|
|
388
|
-
const child = this.lf.getNodeModelById(nodeId)
|
|
389
|
-
if (child?.isGroup) {
|
|
390
|
-
const childMaxZIndex = this.findNodeAndChildMaxZIndex(child)
|
|
391
|
-
maxZIndex = Math.max(childMaxZIndex, maxZIndex)
|
|
392
|
-
}
|
|
393
|
-
})
|
|
394
|
-
}
|
|
395
|
-
return maxZIndex
|
|
396
|
-
}
|
|
397
|
-
checkAndCorrectTopGroupZIndex = (nodes: NodeData[]) => {
|
|
398
|
-
// 初始化时/增加新节点时,找出新增nodes的最大zIndex
|
|
399
|
-
let maxZIndex = DEFAULT_BOTTOM_Z_INDEX
|
|
400
|
-
nodes.forEach((node: NodeData) => {
|
|
401
|
-
const nodeModel = this.lf.getNodeModelById(node.id)
|
|
402
|
-
if (nodeModel) {
|
|
403
|
-
const currentNodeMaxZIndex = this.findNodeAndChildMaxZIndex(nodeModel)
|
|
404
|
-
if (currentNodeMaxZIndex > maxZIndex) {
|
|
405
|
-
maxZIndex = currentNodeMaxZIndex
|
|
406
|
-
}
|
|
407
|
-
}
|
|
408
|
-
})
|
|
409
|
-
|
|
410
|
-
if (this.topGroupZIndex >= maxZIndex) {
|
|
411
|
-
// 一般是初始化时/增加新节点时发生,因为外部强行设置了一个很大的zIndex
|
|
412
|
-
// 删除节点不会影响目前最高zIndex的赋值
|
|
413
|
-
return
|
|
414
|
-
}
|
|
415
|
-
// 新增nodes中如果存在zIndex比this.topGroupZIndex大
|
|
416
|
-
// 说明this.topGroupZIndex已经失去意义,代表不了目前最高zIndex的group,需要重新校准
|
|
417
|
-
|
|
418
|
-
// https://github.com/didi/LogicFlow/issues/1535
|
|
419
|
-
// 当外部直接设置多个BaseNode.zIndex=1时
|
|
420
|
-
// 当点击某一个node时,由于这个this.topGroupZIndex是从-10000开始计算的,this.topGroupZIndex+1也就是-9999
|
|
421
|
-
// 这就造成当前点击的node的zIndex远远比其它node的zIndex小,因此造成zIndex错乱问题
|
|
422
|
-
const allGroupNodes = this.lf.graphModel.nodes.filter(
|
|
423
|
-
(node: BaseNodeModel) => node.isGroup,
|
|
424
|
-
)
|
|
425
|
-
let max = this.topGroupZIndex
|
|
426
|
-
for (let i = 0; i < allGroupNodes.length; i++) {
|
|
427
|
-
const groupNode = allGroupNodes[i]
|
|
428
|
-
if (groupNode.zIndex > max) {
|
|
429
|
-
max = groupNode.zIndex
|
|
430
|
-
}
|
|
431
|
-
}
|
|
432
|
-
this.topGroupZIndex = max
|
|
433
|
-
}
|
|
434
|
-
/**
|
|
435
|
-
* 1. 分组节点默认在普通节点下面。
|
|
436
|
-
* 2. 分组节点被选中后,会将分组节点以及其内部的其他分组节点放到其余分组节点的上面。
|
|
437
|
-
* 3. 分组节点取消选中后,不会将分组节点重置为原来的高度。
|
|
438
|
-
* 4. 由于LogicFlow核心目标是支持用户手动绘制流程图,所以不考虑一张流程图超过1000个分组节点的情况。
|
|
439
|
-
*/
|
|
440
|
-
nodeSelected = ({
|
|
441
|
-
data,
|
|
442
|
-
isMultiple,
|
|
443
|
-
isSelected,
|
|
444
|
-
}: {
|
|
445
|
-
data: NodeData
|
|
446
|
-
isMultiple: boolean
|
|
447
|
-
isSelected: boolean
|
|
448
|
-
}) => {
|
|
449
|
-
const nodeModel = this.lf.getNodeModelById(data.id)
|
|
450
|
-
this.toFrontGroup(nodeModel)
|
|
451
|
-
// 重置所有的group zIndex,防止group节点zIndex增长为正。
|
|
452
|
-
if (this.topGroupZIndex > DEFAULT_TOP_Z_INDEX) {
|
|
453
|
-
this.topGroupZIndex = DEFAULT_BOTTOM_Z_INDEX
|
|
454
|
-
const allGroups = this.lf.graphModel.nodes
|
|
455
|
-
.filter((node) => node.isGroup)
|
|
456
|
-
.sort((a, b) => a.zIndex - b.zIndex)
|
|
457
|
-
let preZIndex = 0
|
|
458
|
-
for (let i = 0; i < allGroups.length; i++) {
|
|
459
|
-
const group = allGroups[i]
|
|
460
|
-
if (group.zIndex !== preZIndex) {
|
|
461
|
-
this.topGroupZIndex++
|
|
462
|
-
preZIndex = group.zIndex
|
|
463
|
-
}
|
|
464
|
-
group.setZIndex(this.topGroupZIndex)
|
|
465
|
-
}
|
|
466
|
-
}
|
|
467
|
-
// FIX #1004
|
|
468
|
-
// 如果节点被多选,
|
|
469
|
-
// 这个节点是分组,则将分组的所有子节点取消选中
|
|
470
|
-
// 这个节点是分组的子节点,且其所属分组节点已选,则取消选中
|
|
471
|
-
if (isMultiple && isSelected) {
|
|
472
|
-
if (nodeModel?.isGroup) {
|
|
473
|
-
;(nodeModel as GroupNodeModel).children.forEach((child) => {
|
|
474
|
-
const childModel = this.lf.graphModel.getElement(child)
|
|
475
|
-
childModel?.setSelected(false)
|
|
476
|
-
})
|
|
477
|
-
} else {
|
|
478
|
-
const groupId = this.nodeGroupMap.get(data.id)
|
|
479
|
-
if (groupId) {
|
|
480
|
-
const groupModel = this.lf.getNodeModelById(groupId)
|
|
481
|
-
groupModel?.isSelected && nodeModel?.setSelected(false)
|
|
482
|
-
}
|
|
483
|
-
}
|
|
484
|
-
}
|
|
485
|
-
}
|
|
486
|
-
toFrontGroup = (model?: BaseNodeModel) => {
|
|
487
|
-
if (!model || !model.isGroup) {
|
|
488
|
-
return
|
|
489
|
-
}
|
|
490
|
-
this.topGroupZIndex++
|
|
491
|
-
model.setZIndex(this.topGroupZIndex)
|
|
492
|
-
if (model.children) {
|
|
493
|
-
;(model as GroupNodeModel).children.forEach((nodeId) => {
|
|
494
|
-
const node = this.lf.getNodeModelById(nodeId)
|
|
495
|
-
this.toFrontGroup(node)
|
|
496
|
-
})
|
|
497
|
-
}
|
|
498
|
-
}
|
|
499
|
-
|
|
500
|
-
/**
|
|
501
|
-
* 获取自定位置其所属分组
|
|
502
|
-
* 当分组重合时,优先返回最上层的分组
|
|
503
|
-
*/
|
|
504
|
-
getGroup(
|
|
505
|
-
bounds: BoxBoundsPoint,
|
|
506
|
-
nodeData: NodeData,
|
|
507
|
-
): BaseNodeModel | undefined {
|
|
508
|
-
const { nodes } = this.lf.graphModel
|
|
509
|
-
const groups = nodes.filter(
|
|
510
|
-
(node) =>
|
|
511
|
-
node.isGroup &&
|
|
512
|
-
(node as GroupNodeModel).isInRange(bounds) &&
|
|
513
|
-
node.id !== nodeData.id,
|
|
514
|
-
)
|
|
515
|
-
|
|
516
|
-
if (groups.length === 0) return
|
|
517
|
-
if (groups.length === 1) return groups[0]
|
|
518
|
-
let topGroup = groups[groups.length - 1]
|
|
519
|
-
for (let i = groups.length - 2; i >= 0; i--) {
|
|
520
|
-
if (groups[i].zIndex > topGroup.zIndex) {
|
|
521
|
-
topGroup = groups[i]
|
|
522
|
-
}
|
|
523
|
-
}
|
|
524
|
-
return topGroup
|
|
525
|
-
}
|
|
526
|
-
|
|
527
|
-
/**
|
|
528
|
-
* 获取某个节点所属的groupModel
|
|
529
|
-
*/
|
|
530
|
-
getNodeGroup(nodeId: string) {
|
|
531
|
-
const groupId = this.nodeGroupMap.get(nodeId)
|
|
532
|
-
if (groupId) {
|
|
533
|
-
return this.lf.getNodeModelById(groupId)
|
|
534
|
-
}
|
|
535
|
-
}
|
|
536
|
-
|
|
537
|
-
render() {}
|
|
538
|
-
destroy() {}
|
|
539
|
-
}
|
|
540
|
-
|
|
541
|
-
export * from './GroupNode'
|
|
542
|
-
export default GroupNode
|