@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.
- package/.turbo/turbo-build.log +361 -6
- package/dist/index.css +63 -0
- package/dist/index.min.js +32 -2
- package/es/NodeResize/control/Control.d.ts +3 -3
- package/es/NodeResize/control/Control.js +13 -3
- package/es/NodeResize/control/Control.js.map +1 -1
- package/es/NodeResize/index.d.ts +4 -0
- package/es/NodeResize/index.js.map +1 -1
- package/es/NodeResize/node/DiamondResize.d.ts +1 -0
- package/es/NodeResize/node/DiamondResize.js +2 -1
- package/es/NodeResize/node/DiamondResize.js.map +1 -1
- package/es/NodeResize/node/EllipseResize.d.ts +1 -0
- package/es/NodeResize/node/EllipseResize.js +2 -1
- package/es/NodeResize/node/EllipseResize.js.map +1 -1
- package/es/NodeResize/node/HtmlResize.js +1 -1
- package/es/NodeResize/node/HtmlResize.js.map +1 -1
- package/es/NodeResize/node/RectResize.js +1 -1
- package/es/NodeResize/node/RectResize.js.map +1 -1
- package/es/bpmn/constant.d.ts +1 -1
- package/es/bpmn/constant.js +3 -0
- package/es/bpmn/constant.js.map +1 -1
- package/es/bpmn/index.d.ts +3 -6
- package/es/bpmn/index.js +5 -7
- package/es/bpmn/index.js.map +1 -1
- package/es/bpmn-elements/presets/Pool/Pool.d.ts +21 -1
- package/es/components/control/index.d.ts +4 -4
- package/es/components/control/index.js.map +1 -1
- package/es/components/highlight/index.d.ts +6 -4
- package/es/components/highlight/index.js +32 -5
- package/es/components/highlight/index.js.map +1 -1
- package/es/components/menu/index.d.ts +1 -1
- package/es/components/menu/index.js +9 -10
- package/es/components/menu/index.js.map +1 -1
- package/es/components/mini-map/index.d.ts +1 -1
- package/es/components/mini-map/index.js +2 -2
- package/es/components/mini-map/index.js.map +1 -1
- package/es/components/selection-select/index.d.ts +1 -1
- package/es/components/selection-select/index.js.map +1 -1
- package/es/dynamic-group/index.d.ts +106 -0
- package/es/dynamic-group/index.js +536 -0
- package/es/dynamic-group/index.js.map +1 -0
- package/es/dynamic-group/model.d.ts +135 -0
- package/es/dynamic-group/model.js +413 -0
- package/es/dynamic-group/model.js.map +1 -0
- package/es/dynamic-group/node.d.ts +16 -0
- package/es/dynamic-group/node.js +143 -0
- package/es/dynamic-group/node.js.map +1 -0
- package/es/dynamic-group/utils.d.ts +17 -0
- package/es/dynamic-group/utils.js +27 -0
- package/es/dynamic-group/utils.js.map +1 -0
- package/es/index.css +63 -0
- package/es/index.d.ts +16 -8
- package/es/index.js +24 -8
- package/es/index.js.map +1 -1
- package/es/insert-node-in-polyline/index.js +3 -3
- package/es/insert-node-in-polyline/index.js.map +1 -1
- package/es/materials/group/GroupNode.d.ts +6 -10
- package/es/materials/group/GroupNode.js +8 -6
- package/es/materials/group/GroupNode.js.map +1 -1
- package/es/materials/group/index.d.ts +5 -5
- package/es/materials/group/index.js +25 -26
- package/es/materials/group/index.js.map +1 -1
- package/es/materials/node-selection/index.d.ts +6 -1
- package/es/materials/node-selection/index.js +64 -56
- package/es/materials/node-selection/index.js.map +1 -1
- package/es/mindmap/index.d.ts +2 -2
- package/es/style/index.css +63 -0
- package/es/style/index.less +73 -0
- package/es/style/raw.d.ts +1 -1
- package/es/style/raw.js +1 -1
- package/es/style/raw.js.map +1 -1
- package/es/tools/flow-path/index.js +0 -1
- package/es/tools/flow-path/index.js.map +1 -1
- package/es/tools/label/Label.d.ts +30 -0
- package/es/tools/label/Label.js +241 -0
- package/es/tools/label/Label.js.map +1 -0
- package/es/tools/label/LabelModel.d.ts +26 -0
- package/es/tools/label/LabelModel.js +86 -0
- package/es/tools/label/LabelModel.js.map +1 -0
- package/es/tools/label/LabelOverlay.d.ts +28 -0
- package/es/tools/label/LabelOverlay.js +161 -0
- package/es/tools/label/LabelOverlay.js.map +1 -0
- package/es/tools/label/algorithm.d.ts +16 -0
- package/es/tools/label/algorithm.js +27 -0
- package/es/tools/label/algorithm.js.map +1 -0
- package/es/tools/label/index.d.ts +59 -0
- package/es/tools/label/index.js +292 -0
- package/es/tools/label/index.js.map +1 -0
- package/es/tools/label/mediumEditor.d.ts +17 -0
- package/es/tools/label/mediumEditor.js +92 -0
- package/es/tools/label/mediumEditor.js.map +1 -0
- package/es/tools/label/utils.d.ts +64 -0
- package/es/tools/label/utils.js +336 -0
- package/es/tools/label/utils.js.map +1 -0
- package/es/tools/snapshot/index.d.ts +107 -11
- package/es/tools/snapshot/index.js +366 -149
- package/es/tools/snapshot/index.js.map +1 -1
- package/es/tools/snapshot/utils.d.ts +35 -0
- package/es/tools/snapshot/utils.js +238 -0
- package/es/tools/snapshot/utils.js.map +1 -0
- package/lib/NodeResize/control/Control.d.ts +3 -3
- package/lib/NodeResize/control/Control.js +13 -3
- package/lib/NodeResize/control/Control.js.map +1 -1
- package/lib/NodeResize/index.d.ts +4 -0
- package/lib/NodeResize/index.js.map +1 -1
- package/lib/NodeResize/node/DiamondResize.d.ts +1 -0
- package/lib/NodeResize/node/DiamondResize.js +2 -1
- package/lib/NodeResize/node/DiamondResize.js.map +1 -1
- package/lib/NodeResize/node/EllipseResize.d.ts +1 -0
- package/lib/NodeResize/node/EllipseResize.js +2 -1
- package/lib/NodeResize/node/EllipseResize.js.map +1 -1
- package/lib/NodeResize/node/HtmlResize.js +1 -1
- package/lib/NodeResize/node/HtmlResize.js.map +1 -1
- package/lib/NodeResize/node/RectResize.js +1 -1
- package/lib/NodeResize/node/RectResize.js.map +1 -1
- package/lib/bpmn/constant.d.ts +1 -1
- package/lib/bpmn/constant.js +3 -0
- package/lib/bpmn/constant.js.map +1 -1
- package/lib/bpmn/index.d.ts +3 -6
- package/lib/bpmn/index.js +5 -7
- package/lib/bpmn/index.js.map +1 -1
- package/lib/bpmn-elements/presets/Pool/Pool.d.ts +21 -1
- package/lib/components/control/index.d.ts +4 -4
- package/lib/components/control/index.js.map +1 -1
- package/lib/components/highlight/index.d.ts +6 -4
- package/lib/components/highlight/index.js +32 -5
- package/lib/components/highlight/index.js.map +1 -1
- package/lib/components/menu/index.d.ts +1 -1
- package/lib/components/menu/index.js +9 -10
- package/lib/components/menu/index.js.map +1 -1
- package/lib/components/mini-map/index.d.ts +1 -1
- package/lib/components/mini-map/index.js +2 -2
- package/lib/components/mini-map/index.js.map +1 -1
- package/lib/components/selection-select/index.d.ts +1 -1
- package/lib/components/selection-select/index.js.map +1 -1
- package/lib/dynamic-group/index.d.ts +106 -0
- package/lib/dynamic-group/index.js +553 -0
- package/lib/dynamic-group/index.js.map +1 -0
- package/lib/dynamic-group/model.d.ts +135 -0
- package/lib/dynamic-group/model.js +416 -0
- package/lib/dynamic-group/model.js.map +1 -0
- package/lib/dynamic-group/node.d.ts +16 -0
- package/lib/dynamic-group/node.js +146 -0
- package/lib/dynamic-group/node.js.map +1 -0
- package/lib/dynamic-group/utils.d.ts +17 -0
- package/lib/dynamic-group/utils.js +32 -0
- package/lib/dynamic-group/utils.js.map +1 -0
- package/lib/index.css +63 -0
- package/lib/index.d.ts +16 -8
- package/lib/index.js +24 -8
- package/lib/index.js.map +1 -1
- package/lib/insert-node-in-polyline/index.js +2 -2
- package/lib/insert-node-in-polyline/index.js.map +1 -1
- package/lib/materials/group/GroupNode.d.ts +6 -10
- package/lib/materials/group/GroupNode.js +8 -6
- package/lib/materials/group/GroupNode.js.map +1 -1
- package/lib/materials/group/index.d.ts +5 -5
- package/lib/materials/group/index.js +24 -25
- package/lib/materials/group/index.js.map +1 -1
- package/lib/materials/node-selection/index.d.ts +6 -1
- package/lib/materials/node-selection/index.js +63 -55
- package/lib/materials/node-selection/index.js.map +1 -1
- package/lib/mindmap/index.d.ts +2 -2
- package/lib/style/index.css +63 -0
- package/lib/style/index.less +73 -0
- package/lib/style/raw.d.ts +1 -1
- package/lib/style/raw.js +1 -1
- package/lib/style/raw.js.map +1 -1
- package/lib/tools/flow-path/index.js +0 -1
- package/lib/tools/flow-path/index.js.map +1 -1
- package/lib/tools/label/Label.d.ts +30 -0
- package/lib/tools/label/Label.js +247 -0
- package/lib/tools/label/Label.js.map +1 -0
- package/lib/tools/label/LabelModel.d.ts +26 -0
- package/lib/tools/label/LabelModel.js +89 -0
- package/lib/tools/label/LabelModel.js.map +1 -0
- package/lib/tools/label/LabelOverlay.d.ts +28 -0
- package/lib/tools/label/LabelOverlay.js +167 -0
- package/lib/tools/label/LabelOverlay.js.map +1 -0
- package/lib/tools/label/algorithm.d.ts +16 -0
- package/lib/tools/label/algorithm.js +32 -0
- package/lib/tools/label/algorithm.js.map +1 -0
- package/lib/tools/label/index.d.ts +59 -0
- package/lib/tools/label/index.js +298 -0
- package/lib/tools/label/index.js.map +1 -0
- package/lib/tools/label/mediumEditor.d.ts +17 -0
- package/lib/tools/label/mediumEditor.js +98 -0
- package/lib/tools/label/mediumEditor.js.map +1 -0
- package/lib/tools/label/utils.d.ts +64 -0
- package/lib/tools/label/utils.js +349 -0
- package/lib/tools/label/utils.js.map +1 -0
- package/lib/tools/snapshot/index.d.ts +107 -11
- package/lib/tools/snapshot/index.js +366 -149
- package/lib/tools/snapshot/index.js.map +1 -1
- package/lib/tools/snapshot/utils.d.ts +35 -0
- package/lib/tools/snapshot/utils.js +247 -0
- package/lib/tools/snapshot/utils.js.map +1 -0
- package/package.json +9 -3
- package/rollup.config.js +1 -1
- package/src/NodeResize/control/Control.tsx +13 -3
- package/src/NodeResize/index.ts +4 -0
- package/src/NodeResize/node/DiamondResize.tsx +2 -1
- package/src/NodeResize/node/EllipseResize.tsx +2 -1
- package/src/NodeResize/node/HtmlResize.tsx +1 -1
- package/src/NodeResize/node/RectResize.tsx +1 -1
- package/src/bpmn/constant.ts +4 -1
- package/src/bpmn/index.ts +7 -4
- package/src/bpmn-elements-adapter/README.md +1 -3
- package/src/components/control/index.ts +4 -4
- package/src/components/highlight/index.ts +33 -6
- package/src/components/menu/index.ts +16 -13
- package/src/components/mini-map/index.ts +3 -3
- package/src/components/selection-select/index.ts +6 -2
- package/src/dynamic-group/index.ts +609 -0
- package/src/dynamic-group/model.ts +503 -0
- package/src/dynamic-group/node.ts +140 -0
- package/src/dynamic-group/utils.ts +33 -0
- package/src/index.ts +30 -8
- package/src/insert-node-in-polyline/index.ts +3 -3
- package/src/materials/group/GroupNode.ts +12 -12
- package/src/materials/group/index.ts +40 -40
- package/src/materials/node-selection/index.ts +78 -70
- package/src/style/index.less +73 -0
- package/src/style/raw.ts +64 -1
- package/src/tools/flow-path/index.ts +0 -1
- package/src/tools/label/Label.tsx +297 -0
- package/src/tools/label/LabelModel.ts +82 -0
- package/src/tools/label/LabelOverlay.tsx +159 -0
- package/src/tools/label/algorithm.ts +42 -0
- package/src/tools/label/index.ts +401 -0
- package/src/tools/label/mediumEditor.ts +94 -0
- package/src/tools/label/utils.ts +395 -0
- package/src/tools/snapshot/README.md +141 -5
- package/src/tools/snapshot/index.ts +288 -101
- 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
|
-
|
|
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/
|
|
34
|
+
export * from './materials/node-selection'
|
|
35
|
+
|
|
36
|
+
/**
|
|
37
|
+
* @deprecated
|
|
38
|
+
* 2.0 版本废弃该插件
|
|
39
|
+
*/
|
|
17
40
|
export * from './NodeResize'
|
|
18
|
-
export * from './
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
export * from './
|
|
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
|
-
|
|
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
|
-
|
|
88
|
+
formatAnchorConnectValidateData(sourceRuleResultData)
|
|
89
89
|
const { isAllPass: isTargetPass, msg: targetMsg } =
|
|
90
|
-
|
|
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 (
|
|
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({
|
|
272
|
+
isInRange({ minX, minY, maxX, maxY }) {
|
|
274
273
|
return (
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
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
|
-
|
|
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.
|
|
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.
|
|
108
|
-
// groupInnerChildren.edges.forEach(edge => this.
|
|
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
|
-
// 由于最外层会调用
|
|
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进行偏移,即
|
|
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的
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
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
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
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
|
-
|
|
92
|
-
|
|
93
|
-
this.points = []
|
|
94
|
-
|
|
95
|
-
this.text = {
|
|
85
|
+
initNodeData(data) {
|
|
86
|
+
data.text = {
|
|
96
87
|
value: '',
|
|
97
|
-
x:
|
|
98
|
-
y:
|
|
88
|
+
x: data.x,
|
|
89
|
+
y: data.y,
|
|
99
90
|
draggable: false,
|
|
100
91
|
editable: false,
|
|
101
92
|
}
|
|
102
|
-
|
|
93
|
+
super.initNodeData(data)
|
|
103
94
|
this.zIndex = 0
|
|
104
|
-
this.draggable =
|
|
105
|
-
|
|
95
|
+
this.draggable = true
|
|
96
|
+
}
|
|
106
97
|
|
|
107
|
-
|
|
108
|
-
|
|
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
|
|
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
|
-
*
|
|
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
|
-
|
|
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
|
|
246
|
+
let hasExists = false
|
|
245
247
|
if (this.selectNodesIds.includes(val.data.id)) {
|
|
246
248
|
this.lf.getNodeModelById(val.data.id).setSelected(false)
|
|
247
|
-
|
|
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 (!
|
|
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 }
|
package/src/style/index.less
CHANGED
|
@@ -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
|
+
}
|