@logicflow/extension 2.2.0-alpha.7 → 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/package.json +10 -7
- package/.turbo/turbo-build.log +0 -38
- package/CHANGELOG.md +0 -1829
- 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 -126
- 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 -105
- package/src/bpmn-elements-adapter/xml2json.ts +0 -542
- package/src/components/context-menu/index.ts +0 -253
- package/src/components/control/index.ts +0 -155
- 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 -774
- package/src/dynamic-group/model.ts +0 -580
- 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 -47
- package/src/insert-node-in-polyline/edge.ts +0 -175
- package/src/insert-node-in-polyline/index.ts +0 -193
- package/src/materials/curved-edge/__test__/curved-edge.test.ts +0 -46
- package/src/materials/curved-edge/index.ts +0 -217
- package/src/materials/group/GroupNode.ts +0 -437
- 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/pool/LaneModel.ts +0 -226
- package/src/pool/LaneView.ts +0 -220
- package/src/pool/PoolModel.ts +0 -631
- package/src/pool/PoolView.ts +0 -75
- package/src/pool/constant.ts +0 -19
- package/src/pool/index.ts +0 -621
- package/src/pool/utils.ts +0 -46
- package/src/rect-label-node/RectLabelNodeView.ts +0 -33
- package/src/rect-label-node/index.ts +0 -15
- package/src/style/index.less +0 -381
- package/src/style/raw.ts +0 -328
- 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 -162
- package/src/tools/label/algorithm.ts +0 -42
- package/src/tools/label/index.ts +0 -479
- package/src/tools/label/mediumEditor.ts +0 -121
- 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 -701
- 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,437 +0,0 @@
|
|
|
1
|
-
import LogicFlow, { h, BaseEdgeModel } from '@logicflow/core'
|
|
2
|
-
import { isArray } from 'lodash-es'
|
|
3
|
-
import { RectResizeModel, RectResizeView } from '../../NodeResize'
|
|
4
|
-
|
|
5
|
-
import Point = LogicFlow.Point
|
|
6
|
-
import NodeData = LogicFlow.NodeData
|
|
7
|
-
import EdgeConfig = LogicFlow.EdgeConfig
|
|
8
|
-
import GraphElements = LogicFlow.GraphElements
|
|
9
|
-
|
|
10
|
-
const defaultWidth = 500
|
|
11
|
-
const defaultHeight = 300
|
|
12
|
-
const DEFAULT_BOTTOM_Z_INDEX = -10000
|
|
13
|
-
|
|
14
|
-
export class GroupNodeModel extends RectResizeModel {
|
|
15
|
-
readonly isGroup = true
|
|
16
|
-
/**
|
|
17
|
-
* 此分组的子节点Id
|
|
18
|
-
*/
|
|
19
|
-
children!: Set<string>
|
|
20
|
-
/**
|
|
21
|
-
* 其子节点是否被禁止通过拖拽移出分组。 默认false,允许拖拽移除分组。
|
|
22
|
-
*/
|
|
23
|
-
isRestrict?: boolean
|
|
24
|
-
/**
|
|
25
|
-
* 分组节点是否允许折叠
|
|
26
|
-
*/
|
|
27
|
-
foldable?: boolean
|
|
28
|
-
/**
|
|
29
|
-
* 折叠后的宽度
|
|
30
|
-
*/
|
|
31
|
-
foldedWidth!: number
|
|
32
|
-
/**
|
|
33
|
-
* 折叠后的高度
|
|
34
|
-
*/
|
|
35
|
-
foldedHeight!: number
|
|
36
|
-
/**
|
|
37
|
-
* 分组折叠状态
|
|
38
|
-
*/
|
|
39
|
-
isFolded: boolean = false
|
|
40
|
-
unfoldedWidth = defaultWidth
|
|
41
|
-
unfoldedHeight = defaultHeight
|
|
42
|
-
/**
|
|
43
|
-
* children元素上一次折叠的状态缓存
|
|
44
|
-
*/
|
|
45
|
-
childrenLastFoldStatus: Record<string, boolean> = {}
|
|
46
|
-
|
|
47
|
-
initNodeData(data: any): void {
|
|
48
|
-
super.initNodeData(data)
|
|
49
|
-
let children: any = []
|
|
50
|
-
if (isArray(data.children)) {
|
|
51
|
-
children = data.children
|
|
52
|
-
}
|
|
53
|
-
// 初始化组的子节点
|
|
54
|
-
this.children = new Set(children)
|
|
55
|
-
this.width = defaultWidth
|
|
56
|
-
this.height = defaultHeight
|
|
57
|
-
this.foldedWidth = 80
|
|
58
|
-
this.foldedHeight = 60
|
|
59
|
-
this.zIndex = DEFAULT_BOTTOM_Z_INDEX
|
|
60
|
-
this.radius = 0
|
|
61
|
-
|
|
62
|
-
this.text.editable = false
|
|
63
|
-
this.text.draggable = false
|
|
64
|
-
|
|
65
|
-
this.isRestrict = false
|
|
66
|
-
this.resizable = false
|
|
67
|
-
this.autoToFront = false
|
|
68
|
-
this.foldable = false
|
|
69
|
-
if (this.properties.isFolded === undefined) {
|
|
70
|
-
this.properties.isFolded = false
|
|
71
|
-
}
|
|
72
|
-
this.isFolded = !!this.properties.isFolded
|
|
73
|
-
// fixme: 虽然默认保存的分组不会收起,但是如果重写保存数据分组了,
|
|
74
|
-
// 此处代码会导致多一个history记录
|
|
75
|
-
setTimeout(() => {
|
|
76
|
-
this.isFolded && this.foldGroup(this.isFolded)
|
|
77
|
-
})
|
|
78
|
-
// this.foldGroup(this.isFolded);
|
|
79
|
-
}
|
|
80
|
-
|
|
81
|
-
/**
|
|
82
|
-
* 折叠分组
|
|
83
|
-
* 1. 折叠分组的宽高
|
|
84
|
-
* 2. 处理分组子节点
|
|
85
|
-
* 3. 处理连线
|
|
86
|
-
*/
|
|
87
|
-
foldGroup(isFolded: boolean) {
|
|
88
|
-
if (isFolded === this.isFolded) {
|
|
89
|
-
// 防止多次调用同样的状态设置
|
|
90
|
-
// 如果this.isFolded=false,同时触发foldGroup(false),会导致下面的childrenLastFoldStatus状态错乱
|
|
91
|
-
return
|
|
92
|
-
}
|
|
93
|
-
this.setProperty('isFolded', isFolded)
|
|
94
|
-
this.isFolded = isFolded
|
|
95
|
-
// step 1
|
|
96
|
-
if (isFolded) {
|
|
97
|
-
this.x = this.x - this.width / 2 + this.foldedWidth / 2
|
|
98
|
-
this.y = this.y - this.height / 2 + this.foldedHeight / 2
|
|
99
|
-
this.unfoldedWidth = this.width
|
|
100
|
-
this.unfoldedHeight = this.height
|
|
101
|
-
this.width = this.foldedWidth
|
|
102
|
-
this.height = this.foldedHeight
|
|
103
|
-
} else {
|
|
104
|
-
this.width = this.unfoldedWidth
|
|
105
|
-
this.height = this.unfoldedHeight
|
|
106
|
-
this.x = this.x + this.width / 2 - this.foldedWidth / 2
|
|
107
|
-
this.y = this.y + this.height / 2 - this.foldedHeight / 2
|
|
108
|
-
}
|
|
109
|
-
// step 2
|
|
110
|
-
let allEdges = [...this.incoming.edges, ...this.outgoing.edges]
|
|
111
|
-
this.children.forEach((elementId) => {
|
|
112
|
-
const nodeModel = this.graphModel.getElement(elementId)
|
|
113
|
-
if (nodeModel) {
|
|
114
|
-
const foldStatus = nodeModel.isFolded
|
|
115
|
-
// FIX: https://github.com/didi/LogicFlow/issues/1007
|
|
116
|
-
if (nodeModel.isGroup && !nodeModel.isFolded) {
|
|
117
|
-
// 正常情况下,parent折叠后,children应该折叠
|
|
118
|
-
// 因此当parent准备展开时,children的值目前肯定是折叠状态,也就是nodeModel.isFolded=true,这个代码块不会触发
|
|
119
|
-
// 只有当parent准备折叠时,children目前状态才有可能是展开,
|
|
120
|
-
// 即nodeModel.isFolded=false,这个代码块触发,此时isFolded=true,触发children也进行折叠
|
|
121
|
-
;(nodeModel as GroupNodeModel).foldGroup(isFolded)
|
|
122
|
-
}
|
|
123
|
-
|
|
124
|
-
if (nodeModel.isGroup && !isFolded) {
|
|
125
|
-
// 当parent准备展开时,children的值应该恢复到折叠前的状态
|
|
126
|
-
const lastFoldStatus = this.childrenLastFoldStatus[elementId]
|
|
127
|
-
if (
|
|
128
|
-
lastFoldStatus !== undefined &&
|
|
129
|
-
lastFoldStatus !== nodeModel.isFolded
|
|
130
|
-
) {
|
|
131
|
-
// https://github.com/didi/LogicFlow/issues/1145
|
|
132
|
-
// 当parent准备展开时,children的值肯定是折叠,也就是nodeModel.isFolded=true
|
|
133
|
-
// 当parent准备展开时,如果children之前的状态是展开,则恢复展开状态
|
|
134
|
-
;(nodeModel as GroupNodeModel).foldGroup(lastFoldStatus)
|
|
135
|
-
}
|
|
136
|
-
}
|
|
137
|
-
// 存储parent触发children改变折叠状态前的状态
|
|
138
|
-
this.childrenLastFoldStatus[elementId] = !!foldStatus
|
|
139
|
-
nodeModel.visible = !isFolded
|
|
140
|
-
|
|
141
|
-
const incomingEdges = (nodeModel.incoming as GraphElements).edges
|
|
142
|
-
const outgoingEdges = (nodeModel.outgoing as GraphElements).edges
|
|
143
|
-
|
|
144
|
-
allEdges = [...allEdges, ...incomingEdges, ...outgoingEdges]
|
|
145
|
-
}
|
|
146
|
-
})
|
|
147
|
-
// step 3
|
|
148
|
-
this.foldEdge(isFolded, allEdges)
|
|
149
|
-
}
|
|
150
|
-
|
|
151
|
-
getAnchorStyle(anchorInfo?: Point) {
|
|
152
|
-
const style = super.getAnchorStyle(anchorInfo)
|
|
153
|
-
style.stroke = 'transparent'
|
|
154
|
-
style.fill = 'transparent'
|
|
155
|
-
style.hover!.fill = 'transparent' // TODO: 确认这种情况如何解决,style.hover 为 undefined 时该如何处理
|
|
156
|
-
style.hover!.stroke = 'transparent'
|
|
157
|
-
return style
|
|
158
|
-
}
|
|
159
|
-
|
|
160
|
-
/**
|
|
161
|
-
* 折叠分组的时候,处理分组自身的连线和分组内部子节点上的连线
|
|
162
|
-
* 边的分类:
|
|
163
|
-
* - 虚拟边:分组被收起时,表示分组本身与外部节点关系的边。
|
|
164
|
-
* - 真实边:分组本身或者分组内部节点与外部节点节点(非收起分组)关系的边。
|
|
165
|
-
* 如果一个分组,本身与外部节点有M条连线,且内部N个子节点与外部节点有连线,那么这个分组收起时会生成M+N条连线。
|
|
166
|
-
* 折叠分组时:
|
|
167
|
-
* - 原有的虚拟边删除;
|
|
168
|
-
* - 创建一个虚拟边;
|
|
169
|
-
* - 真实边则隐藏;
|
|
170
|
-
* 展开分组是:
|
|
171
|
-
* - 原有的虚拟边删除;
|
|
172
|
-
* - 如果目外部点是收起的分组,则创建虚拟边;
|
|
173
|
-
* - 如果外部节点是普通节点,则显示真实边;
|
|
174
|
-
*/
|
|
175
|
-
foldEdge(isFolded: boolean, allEdges: BaseEdgeModel[]) {
|
|
176
|
-
allEdges.forEach((edgeModel, index) => {
|
|
177
|
-
const {
|
|
178
|
-
id,
|
|
179
|
-
sourceNodeId,
|
|
180
|
-
targetNodeId,
|
|
181
|
-
startPoint,
|
|
182
|
-
endPoint,
|
|
183
|
-
type,
|
|
184
|
-
text,
|
|
185
|
-
} = edgeModel
|
|
186
|
-
const properties = edgeModel.getProperties()
|
|
187
|
-
const data: EdgeConfig = {
|
|
188
|
-
id: `${id}__${index}`,
|
|
189
|
-
sourceNodeId,
|
|
190
|
-
targetNodeId,
|
|
191
|
-
startPoint,
|
|
192
|
-
endPoint,
|
|
193
|
-
type,
|
|
194
|
-
properties,
|
|
195
|
-
text: text?.value,
|
|
196
|
-
}
|
|
197
|
-
if (edgeModel.virtual) {
|
|
198
|
-
this.graphModel.deleteEdgeById(edgeModel.id)
|
|
199
|
-
}
|
|
200
|
-
let targetNodeIdGroup = this.graphModel.group.getNodeGroup(targetNodeId)
|
|
201
|
-
// 考虑目标节点本来就是分组的情况
|
|
202
|
-
if (!targetNodeIdGroup) {
|
|
203
|
-
targetNodeIdGroup = this.graphModel.getNodeModelById(targetNodeId)
|
|
204
|
-
}
|
|
205
|
-
let sourceNodeIdGroup = this.graphModel.group.getNodeGroup(sourceNodeId)
|
|
206
|
-
if (!sourceNodeIdGroup) {
|
|
207
|
-
sourceNodeIdGroup = this.graphModel.getNodeModelById(sourceNodeId)
|
|
208
|
-
}
|
|
209
|
-
// 折叠时,处理未被隐藏的边的逻辑
|
|
210
|
-
if (isFolded && edgeModel.visible !== false) {
|
|
211
|
-
// 需要确认此分组节点是新连线的起点还是终点
|
|
212
|
-
// 创建一个虚拟边,虚拟边相对真实边,起点或者终点从一起分组内部的节点成为了分组,
|
|
213
|
-
// 如果需要被隐藏的边的起点在需要折叠的分组中,那么设置虚拟边的开始节点为此分组
|
|
214
|
-
if (this.children.has(sourceNodeId) || this.id === sourceNodeId) {
|
|
215
|
-
data.startPoint = undefined
|
|
216
|
-
data.sourceNodeId = this.id
|
|
217
|
-
} else {
|
|
218
|
-
data.endPoint = undefined
|
|
219
|
-
data.targetNodeId = this.id
|
|
220
|
-
}
|
|
221
|
-
// 如果边的起点和终点都在分组内部,则不创建新的虚拟边
|
|
222
|
-
if (
|
|
223
|
-
targetNodeIdGroup.id !== this.id ||
|
|
224
|
-
sourceNodeIdGroup.id !== this.id
|
|
225
|
-
) {
|
|
226
|
-
this.createVirtualEdge(data)
|
|
227
|
-
}
|
|
228
|
-
edgeModel.visible = false
|
|
229
|
-
}
|
|
230
|
-
// 展开时,处理被隐藏的边的逻辑
|
|
231
|
-
if (!isFolded && edgeModel.visible === false) {
|
|
232
|
-
// 展开分组时:判断真实边的起点和终点是否有任一节点在已折叠分组中,如果不是,则显示真实边。如果是,这修改这个边的对应目标节点id来创建虚拟边。
|
|
233
|
-
if (
|
|
234
|
-
targetNodeIdGroup &&
|
|
235
|
-
targetNodeIdGroup.isGroup &&
|
|
236
|
-
targetNodeIdGroup.isFolded
|
|
237
|
-
) {
|
|
238
|
-
data.targetNodeId = targetNodeIdGroup.id
|
|
239
|
-
data.endPoint = undefined
|
|
240
|
-
this.createVirtualEdge(data)
|
|
241
|
-
} else if (
|
|
242
|
-
sourceNodeIdGroup &&
|
|
243
|
-
sourceNodeIdGroup.isGroup &&
|
|
244
|
-
sourceNodeIdGroup.isFolded
|
|
245
|
-
) {
|
|
246
|
-
data.sourceNodeId = sourceNodeIdGroup.id
|
|
247
|
-
data.startPoint = undefined
|
|
248
|
-
this.createVirtualEdge(data)
|
|
249
|
-
} else {
|
|
250
|
-
edgeModel.visible = true
|
|
251
|
-
}
|
|
252
|
-
}
|
|
253
|
-
})
|
|
254
|
-
}
|
|
255
|
-
|
|
256
|
-
createVirtualEdge(edgeData) {
|
|
257
|
-
edgeData.pointsList = undefined
|
|
258
|
-
const model = this.graphModel.addEdge(edgeData)
|
|
259
|
-
model.virtual = true
|
|
260
|
-
// 强制不保存group连线数据
|
|
261
|
-
// model.getData = () => null;
|
|
262
|
-
model.text.editable = false
|
|
263
|
-
model.isFoldedEdge = true
|
|
264
|
-
}
|
|
265
|
-
|
|
266
|
-
isInRange({ minX, minY, maxX, maxY }) {
|
|
267
|
-
return (
|
|
268
|
-
minX >= this.x - this.width / 2 &&
|
|
269
|
-
maxX <= this.x + this.width / 2 &&
|
|
270
|
-
minY >= this.y - this.height / 2 &&
|
|
271
|
-
maxY <= this.y + this.height / 2
|
|
272
|
-
)
|
|
273
|
-
}
|
|
274
|
-
|
|
275
|
-
isAllowMoveTo({ minX, minY, maxX, maxY }) {
|
|
276
|
-
return {
|
|
277
|
-
x: minX >= this.x - this.width / 2 && maxX <= this.x + this.width / 2,
|
|
278
|
-
y: minY >= this.y - this.height / 2 && maxY <= this.y + this.height / 2,
|
|
279
|
-
}
|
|
280
|
-
}
|
|
281
|
-
|
|
282
|
-
setAllowAppendChild(isAllow) {
|
|
283
|
-
this.setProperty('groupAddable', isAllow)
|
|
284
|
-
}
|
|
285
|
-
|
|
286
|
-
/**
|
|
287
|
-
* 添加分组子节点
|
|
288
|
-
* @param id 节点id
|
|
289
|
-
*/
|
|
290
|
-
addChild(id: string) {
|
|
291
|
-
this.children.add(id)
|
|
292
|
-
this.graphModel.eventCenter.emit('group:add-node', { data: this.getData() })
|
|
293
|
-
}
|
|
294
|
-
|
|
295
|
-
/**
|
|
296
|
-
* 删除分组子节点
|
|
297
|
-
* @param id 节点id
|
|
298
|
-
*/
|
|
299
|
-
removeChild(id: string) {
|
|
300
|
-
this.children.delete(id)
|
|
301
|
-
this.graphModel.eventCenter.emit('group:remove-node', {
|
|
302
|
-
data: this.getData(),
|
|
303
|
-
})
|
|
304
|
-
}
|
|
305
|
-
|
|
306
|
-
getAddableOutlineStyle() {
|
|
307
|
-
return {
|
|
308
|
-
stroke: '#FEB663',
|
|
309
|
-
strokeWidth: 2,
|
|
310
|
-
strokeDasharray: '4 4',
|
|
311
|
-
fill: 'transparent',
|
|
312
|
-
}
|
|
313
|
-
}
|
|
314
|
-
|
|
315
|
-
getData() {
|
|
316
|
-
const data = super.getData()
|
|
317
|
-
data.children = []
|
|
318
|
-
this.children.forEach((childId) => {
|
|
319
|
-
const model = this.graphModel.getNodeModelById(childId)
|
|
320
|
-
if (model && !model.virtual) {
|
|
321
|
-
;(data.children as string[]).push(childId)
|
|
322
|
-
}
|
|
323
|
-
})
|
|
324
|
-
const { properties } = data
|
|
325
|
-
delete properties?.groupAddable
|
|
326
|
-
delete properties?.isFolded
|
|
327
|
-
return data
|
|
328
|
-
}
|
|
329
|
-
|
|
330
|
-
getHistoryData() {
|
|
331
|
-
const data = super.getData()
|
|
332
|
-
data.children = [...this.children]
|
|
333
|
-
data.isGroup = true
|
|
334
|
-
const { properties } = data
|
|
335
|
-
delete properties?.groupAddable
|
|
336
|
-
if (properties?.isFolded) {
|
|
337
|
-
// 如果分组被折叠
|
|
338
|
-
data.x = data.x + this.unfoldedWidth / 2 - this.foldedWidth / 2
|
|
339
|
-
data.y = data.y + this.unfoldedHeight / 2 - this.foldedHeight / 2
|
|
340
|
-
}
|
|
341
|
-
return data
|
|
342
|
-
}
|
|
343
|
-
|
|
344
|
-
/**
|
|
345
|
-
* 是否允许此节点添加到此分组中
|
|
346
|
-
*/
|
|
347
|
-
isAllowAppendIn(_nodeData: NodeData) {
|
|
348
|
-
console.info('_nodeData', _nodeData)
|
|
349
|
-
return true
|
|
350
|
-
}
|
|
351
|
-
|
|
352
|
-
/**
|
|
353
|
-
* 当groupA被添加到groupB中时,将groupB及groupB所属的group的zIndex减1
|
|
354
|
-
*/
|
|
355
|
-
toBack() {
|
|
356
|
-
this.zIndex--
|
|
357
|
-
}
|
|
358
|
-
}
|
|
359
|
-
|
|
360
|
-
export class GroupNode extends RectResizeView {
|
|
361
|
-
getControlGroup(): h.JSX.Element | null {
|
|
362
|
-
const { resizable, properties } = this.props.model
|
|
363
|
-
return resizable && !properties.isFolded ? super.getControlGroup() : null
|
|
364
|
-
}
|
|
365
|
-
|
|
366
|
-
getAddableShape(): h.JSX.Element | null {
|
|
367
|
-
const { width, height, x, y, radius, properties, getAddableOutlineStyle } =
|
|
368
|
-
this.props.model as GroupNodeModel
|
|
369
|
-
if (!properties.groupAddable) return null
|
|
370
|
-
const { strokeWidth = 0 } = this.props.model.getNodeStyle()
|
|
371
|
-
|
|
372
|
-
const style: Record<string, any> = getAddableOutlineStyle()
|
|
373
|
-
const newWidth = width + strokeWidth + 8
|
|
374
|
-
const newHeight = height + strokeWidth + 8
|
|
375
|
-
|
|
376
|
-
return h('rect', {
|
|
377
|
-
...style,
|
|
378
|
-
width: newWidth,
|
|
379
|
-
height: newHeight,
|
|
380
|
-
x: x - newWidth / 2,
|
|
381
|
-
y: y - newHeight / 2,
|
|
382
|
-
rx: radius,
|
|
383
|
-
ry: radius,
|
|
384
|
-
})
|
|
385
|
-
}
|
|
386
|
-
|
|
387
|
-
getFoldIcon(): h.JSX.Element | null {
|
|
388
|
-
const { model } = this.props
|
|
389
|
-
const foldX = model.x - model.width / 2 + 5
|
|
390
|
-
const foldY = model.y - model.height / 2 + 5
|
|
391
|
-
if (!model.foldable) return null
|
|
392
|
-
const iconIcon = h('path', {
|
|
393
|
-
fill: 'none',
|
|
394
|
-
stroke: '#818281',
|
|
395
|
-
strokeWidth: 2,
|
|
396
|
-
'pointer-events': 'none',
|
|
397
|
-
d: model.properties.isFolded
|
|
398
|
-
? `M ${foldX + 3},${foldY + 6} ${foldX + 11},${foldY + 6} M${
|
|
399
|
-
foldX + 7
|
|
400
|
-
},${foldY + 2} ${foldX + 7},${foldY + 10}`
|
|
401
|
-
: `M ${foldX + 3},${foldY + 6} ${foldX + 11},${foldY + 6} `,
|
|
402
|
-
})
|
|
403
|
-
return h('g', {}, [
|
|
404
|
-
h('rect', {
|
|
405
|
-
height: 12,
|
|
406
|
-
width: 14,
|
|
407
|
-
rx: 2,
|
|
408
|
-
ry: 2,
|
|
409
|
-
strokeWidth: 1,
|
|
410
|
-
fill: '#F4F5F6',
|
|
411
|
-
stroke: '#CECECE',
|
|
412
|
-
cursor: 'pointer',
|
|
413
|
-
x: model.x - model.width / 2 + 5,
|
|
414
|
-
y: model.y - model.height / 2 + 5,
|
|
415
|
-
onClick: () => {
|
|
416
|
-
console.log('fold click')
|
|
417
|
-
;(model as GroupNodeModel).foldGroup(!model.properties.isFolded)
|
|
418
|
-
},
|
|
419
|
-
}),
|
|
420
|
-
iconIcon,
|
|
421
|
-
])
|
|
422
|
-
}
|
|
423
|
-
|
|
424
|
-
getResizeShape(): h.JSX.Element {
|
|
425
|
-
return h('g', {}, [
|
|
426
|
-
this.getAddableShape(),
|
|
427
|
-
super.getResizeShape(),
|
|
428
|
-
this.getFoldIcon(),
|
|
429
|
-
])
|
|
430
|
-
}
|
|
431
|
-
}
|
|
432
|
-
|
|
433
|
-
export default {
|
|
434
|
-
type: 'group',
|
|
435
|
-
view: GroupNode,
|
|
436
|
-
model: GroupNodeModel,
|
|
437
|
-
}
|