@logicflow/core 2.0.0-beta.5 → 2.0.0-beta.6
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$colon$dev.log +2 -2
- package/.turbo/turbo-build.log +8 -8
- package/dist/index.min.js +4 -4
- package/es/LogicFlow.d.ts +32 -6
- package/es/LogicFlow.js +15 -12
- package/es/LogicFlow.js.map +1 -1
- package/es/algorithm/edge.js.map +1 -1
- package/es/algorithm/index.d.ts +2 -0
- package/es/algorithm/index.js +2 -0
- package/es/algorithm/index.js.map +1 -1
- package/es/algorithm/outline.d.ts +1 -1
- package/es/common/drag.d.ts +2 -2
- package/es/common/drag.js.map +1 -1
- package/es/constant/index.d.ts +37 -1
- package/es/constant/index.js +40 -1
- package/es/constant/index.js.map +1 -1
- package/es/event/eventArgs.d.ts +88 -25
- package/es/index.d.ts +4 -0
- package/es/index.js +4 -0
- package/es/index.js.map +1 -1
- package/es/keyboard/shortcut.d.ts +4 -0
- package/es/keyboard/shortcut.js +9 -8
- package/es/keyboard/shortcut.js.map +1 -1
- package/es/model/BaseModel.d.ts +12 -16
- package/es/model/EditConfigModel.d.ts +97 -36
- package/es/model/EditConfigModel.js +166 -79
- package/es/model/EditConfigModel.js.map +1 -1
- package/es/model/GraphModel.d.ts +12 -1
- package/es/model/GraphModel.js +40 -9
- package/es/model/GraphModel.js.map +1 -1
- package/es/model/TransformModel.js +1 -1
- package/es/model/TransformModel.js.map +1 -1
- package/es/model/edge/BaseEdgeModel.d.ts +9 -3
- package/es/model/edge/BaseEdgeModel.js +33 -17
- package/es/model/edge/BaseEdgeModel.js.map +1 -1
- package/es/model/edge/BezierEdgeModel.d.ts +1 -1
- package/es/model/edge/BezierEdgeModel.js +5 -2
- package/es/model/edge/BezierEdgeModel.js.map +1 -1
- package/es/model/edge/PolylineEdgeModel.d.ts +3 -3
- package/es/model/edge/PolylineEdgeModel.js +20 -14
- package/es/model/edge/PolylineEdgeModel.js.map +1 -1
- package/es/model/node/BaseNodeModel.d.ts +7 -1
- package/es/model/node/BaseNodeModel.js +22 -11
- package/es/model/node/BaseNodeModel.js.map +1 -1
- package/es/model/node/CircleNodeModel.js.map +1 -1
- package/es/model/node/DiamondNodeModel.js.map +1 -1
- package/es/model/node/EllipseNodeModel.js.map +1 -1
- package/es/options.d.ts +4 -1
- package/es/options.js.map +1 -1
- package/es/tool/MultipleSelectTool.d.ts +1 -1
- package/es/tool/MultipleSelectTool.js +5 -5
- package/es/tool/MultipleSelectTool.js.map +1 -1
- package/es/tool/TextEditTool.d.ts +3 -3
- package/es/tool/TextEditTool.js +2 -2
- package/es/tool/TextEditTool.js.map +1 -1
- package/es/tool/index.d.ts +24 -2
- package/es/tool/index.js +82 -2
- package/es/tool/index.js.map +1 -1
- package/es/util/drag.d.ts +5 -5
- package/es/util/drag.js +3 -1
- package/es/util/drag.js.map +1 -1
- package/es/util/edge.d.ts +2 -1
- package/es/util/edge.js +9 -12
- package/es/util/edge.js.map +1 -1
- package/es/util/node.d.ts +2 -5
- package/es/util/node.js +1 -0
- package/es/util/node.js.map +1 -1
- package/es/view/Anchor.d.ts +1 -3
- package/es/view/Anchor.js +3 -0
- package/es/view/Anchor.js.map +1 -1
- package/es/view/Control.d.ts +1 -1
- package/es/view/Control.js +7 -7
- package/es/view/Control.js.map +1 -1
- package/es/view/Graph.d.ts +1 -1
- package/es/view/Rotate.js +2 -1
- package/es/view/Rotate.js.map +1 -1
- package/es/view/behavior/index.d.ts +2 -0
- package/es/view/behavior/index.js +3 -0
- package/es/view/behavior/index.js.map +1 -0
- package/es/view/behavior/snapline.d.ts +3 -0
- package/es/{tool → view/behavior}/snapline.js +0 -1
- package/es/view/behavior/snapline.js.map +1 -0
- package/es/view/edge/AdjustPoint.js +9 -20
- package/es/view/edge/AdjustPoint.js.map +1 -1
- package/es/view/edge/BaseEdge.js +25 -17
- package/es/view/edge/BaseEdge.js.map +1 -1
- package/es/view/node/BaseNode.js +14 -9
- package/es/view/node/BaseNode.js.map +1 -1
- package/es/view/node/HtmlNode.js +2 -2
- package/es/view/node/HtmlNode.js.map +1 -1
- package/es/view/overlay/CanvasOverlay.js +1 -0
- package/es/view/overlay/CanvasOverlay.js.map +1 -1
- package/es/view/overlay/ToolOverlay.d.ts +1 -1
- package/es/view/overlay/ToolOverlay.js +1 -1
- package/es/view/overlay/ToolOverlay.js.map +1 -1
- package/es/view/text/BaseText.js +7 -3
- package/es/view/text/BaseText.js.map +1 -1
- package/lib/LogicFlow.d.ts +32 -6
- package/lib/LogicFlow.js +17 -14
- package/lib/LogicFlow.js.map +1 -1
- package/lib/algorithm/edge.js.map +1 -1
- package/lib/algorithm/index.d.ts +2 -0
- package/lib/algorithm/index.js +17 -1
- package/lib/algorithm/index.js.map +1 -1
- package/lib/algorithm/outline.d.ts +1 -1
- package/lib/common/drag.d.ts +2 -2
- package/lib/common/drag.js.map +1 -1
- package/lib/constant/index.d.ts +37 -1
- package/lib/constant/index.js +41 -2
- package/lib/constant/index.js.map +1 -1
- package/lib/event/eventArgs.d.ts +88 -25
- package/lib/index.d.ts +4 -0
- package/lib/index.js +4 -0
- package/lib/index.js.map +1 -1
- package/lib/keyboard/shortcut.d.ts +4 -0
- package/lib/keyboard/shortcut.js +12 -9
- package/lib/keyboard/shortcut.js.map +1 -1
- package/lib/model/BaseModel.d.ts +12 -16
- package/lib/model/EditConfigModel.d.ts +97 -36
- package/lib/model/EditConfigModel.js +165 -78
- package/lib/model/EditConfigModel.js.map +1 -1
- package/lib/model/GraphModel.d.ts +12 -1
- package/lib/model/GraphModel.js +38 -7
- package/lib/model/GraphModel.js.map +1 -1
- package/lib/model/TransformModel.js +1 -1
- package/lib/model/TransformModel.js.map +1 -1
- package/lib/model/edge/BaseEdgeModel.d.ts +9 -3
- package/lib/model/edge/BaseEdgeModel.js +31 -15
- package/lib/model/edge/BaseEdgeModel.js.map +1 -1
- package/lib/model/edge/BezierEdgeModel.d.ts +1 -1
- package/lib/model/edge/BezierEdgeModel.js +4 -1
- package/lib/model/edge/BezierEdgeModel.js.map +1 -1
- package/lib/model/edge/PolylineEdgeModel.d.ts +3 -3
- package/lib/model/edge/PolylineEdgeModel.js +19 -13
- package/lib/model/edge/PolylineEdgeModel.js.map +1 -1
- package/lib/model/node/BaseNodeModel.d.ts +7 -1
- package/lib/model/node/BaseNodeModel.js +20 -9
- package/lib/model/node/BaseNodeModel.js.map +1 -1
- package/lib/model/node/CircleNodeModel.js.map +1 -1
- package/lib/model/node/DiamondNodeModel.js.map +1 -1
- package/lib/model/node/EllipseNodeModel.js.map +1 -1
- package/lib/options.d.ts +4 -1
- package/lib/options.js.map +1 -1
- package/lib/tool/MultipleSelectTool.d.ts +1 -1
- package/lib/tool/MultipleSelectTool.js +5 -5
- package/lib/tool/MultipleSelectTool.js.map +1 -1
- package/lib/tool/TextEditTool.d.ts +3 -3
- package/lib/tool/TextEditTool.js +4 -4
- package/lib/tool/TextEditTool.js.map +1 -1
- package/lib/tool/index.d.ts +24 -2
- package/lib/tool/index.js +85 -15
- package/lib/tool/index.js.map +1 -1
- package/lib/util/drag.d.ts +5 -5
- package/lib/util/drag.js +3 -1
- package/lib/util/drag.js.map +1 -1
- package/lib/util/edge.d.ts +2 -1
- package/lib/util/edge.js +11 -14
- package/lib/util/edge.js.map +1 -1
- package/lib/util/node.d.ts +2 -5
- package/lib/util/node.js +1 -0
- package/lib/util/node.js.map +1 -1
- package/lib/view/Anchor.d.ts +1 -3
- package/lib/view/Anchor.js +3 -0
- package/lib/view/Anchor.js.map +1 -1
- package/lib/view/Control.d.ts +1 -1
- package/lib/view/Control.js +7 -7
- package/lib/view/Control.js.map +1 -1
- package/lib/view/Graph.d.ts +1 -1
- package/lib/view/Rotate.js +2 -1
- package/lib/view/Rotate.js.map +1 -1
- package/lib/view/behavior/index.d.ts +2 -0
- package/lib/view/behavior/index.js +19 -0
- package/lib/view/behavior/index.js.map +1 -0
- package/lib/view/behavior/snapline.d.ts +3 -0
- package/lib/{tool → view/behavior}/snapline.js +0 -1
- package/lib/view/behavior/snapline.js.map +1 -0
- package/lib/view/edge/AdjustPoint.js +9 -20
- package/lib/view/edge/AdjustPoint.js.map +1 -1
- package/lib/view/edge/BaseEdge.js +24 -16
- package/lib/view/edge/BaseEdge.js.map +1 -1
- package/lib/view/node/BaseNode.js +13 -8
- package/lib/view/node/BaseNode.js.map +1 -1
- package/lib/view/node/HtmlNode.js +2 -2
- package/lib/view/node/HtmlNode.js.map +1 -1
- package/lib/view/overlay/CanvasOverlay.js +1 -0
- package/lib/view/overlay/CanvasOverlay.js.map +1 -1
- package/lib/view/overlay/ToolOverlay.d.ts +1 -1
- package/lib/view/overlay/ToolOverlay.js +1 -1
- package/lib/view/overlay/ToolOverlay.js.map +1 -1
- package/lib/view/text/BaseText.js +6 -2
- package/lib/view/text/BaseText.js.map +1 -1
- package/package.json +1 -1
- package/src/LogicFlow.tsx +52 -14
- package/src/algorithm/edge.ts +1 -0
- package/src/algorithm/index.ts +2 -0
- package/src/algorithm/outline.ts +2 -2
- package/src/common/drag.ts +16 -2
- package/src/constant/index.ts +42 -1
- package/src/event/eventArgs.ts +155 -34
- package/src/index.ts +4 -0
- package/src/keyboard/shortcut.ts +12 -8
- package/src/model/BaseModel.ts +15 -17
- package/src/model/EditConfigModel.ts +206 -94
- package/src/model/GraphModel.ts +43 -8
- package/src/model/TransformModel.ts +1 -1
- package/src/model/edge/BaseEdgeModel.ts +28 -19
- package/src/model/edge/BezierEdgeModel.ts +5 -6
- package/src/model/edge/PolylineEdgeModel.ts +22 -18
- package/src/model/node/BaseNodeModel.ts +19 -13
- package/src/model/node/CircleNodeModel.ts +0 -1
- package/src/model/node/DiamondNodeModel.ts +0 -1
- package/src/model/node/EllipseNodeModel.ts +0 -1
- package/src/options.ts +6 -1
- package/src/tool/MultipleSelectTool.tsx +6 -6
- package/src/tool/TextEditTool.tsx +3 -3
- package/src/tool/index.ts +96 -2
- package/src/util/drag.ts +22 -6
- package/src/util/edge.ts +14 -13
- package/src/util/node.ts +3 -5
- package/src/view/Anchor.tsx +3 -1
- package/src/view/Control.tsx +16 -7
- package/src/view/Graph.tsx +1 -1
- package/src/view/Rotate.tsx +2 -1
- package/src/view/behavior/index.ts +2 -0
- package/src/{tool → view/behavior}/snapline.ts +3 -4
- package/src/view/edge/AdjustPoint.tsx +32 -46
- package/src/view/edge/BaseEdge.tsx +58 -38
- package/src/view/node/BaseNode.tsx +24 -10
- package/src/view/node/HtmlNode.tsx +2 -2
- package/src/view/overlay/CanvasOverlay.tsx +1 -0
- package/src/view/overlay/ToolOverlay.tsx +1 -1
- package/src/view/text/BaseText.tsx +11 -3
- package/es/tool/snapline.d.ts +0 -3
- package/es/tool/snapline.js.map +0 -1
- package/es/tool/tool.d.ts +0 -22
- package/es/tool/tool.js +0 -43
- package/es/tool/tool.js.map +0 -1
- package/lib/tool/snapline.d.ts +0 -3
- package/lib/tool/snapline.js.map +0 -1
- package/lib/tool/tool.d.ts +0 -22
- package/lib/tool/tool.js +0 -49
- package/lib/tool/tool.js.map +0 -1
- package/src/tool/tool.ts +0 -66
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { assign, cloneDeep, find, isUndefined } from 'lodash-es'
|
|
2
|
-
import { action, computed, observable, toJS } from 'mobx'
|
|
2
|
+
import { action, computed, isObservable, observable, toJS } from 'mobx'
|
|
3
3
|
import { BaseNodeModel, GraphModel, Model } from '..'
|
|
4
4
|
import LogicFlow from '../../LogicFlow'
|
|
5
5
|
import {
|
|
@@ -15,6 +15,7 @@ import {
|
|
|
15
15
|
ElementType,
|
|
16
16
|
ModelType,
|
|
17
17
|
OverlapMode,
|
|
18
|
+
TextMode,
|
|
18
19
|
} from '../../constant'
|
|
19
20
|
|
|
20
21
|
import Point = LogicFlow.Point
|
|
@@ -57,6 +58,7 @@ export class BaseEdgeModel implements IBaseEdgeModel {
|
|
|
57
58
|
@observable startPoint!: Point
|
|
58
59
|
@observable endPoint!: Point
|
|
59
60
|
|
|
61
|
+
@observable textMode = TextMode.TEXT
|
|
60
62
|
@observable text: Required<TextConfig> = {
|
|
61
63
|
value: '',
|
|
62
64
|
x: 0,
|
|
@@ -64,7 +66,7 @@ export class BaseEdgeModel implements IBaseEdgeModel {
|
|
|
64
66
|
draggable: false,
|
|
65
67
|
editable: true,
|
|
66
68
|
}
|
|
67
|
-
@observable properties: Record<string,
|
|
69
|
+
@observable properties: Record<string, unknown> = {}
|
|
68
70
|
@observable points = ''
|
|
69
71
|
@observable pointsList: Point[] = []
|
|
70
72
|
|
|
@@ -84,7 +86,6 @@ export class BaseEdgeModel implements IBaseEdgeModel {
|
|
|
84
86
|
graphModel: GraphModel
|
|
85
87
|
@observable zIndex: number = 0
|
|
86
88
|
@observable state = ElementState.DEFAULT
|
|
87
|
-
|
|
88
89
|
modelType = ModelType.EDGE
|
|
89
90
|
additionStateData?: Model.AdditionStateDataType
|
|
90
91
|
|
|
@@ -183,7 +184,6 @@ export class BaseEdgeModel implements IBaseEdgeModel {
|
|
|
183
184
|
...this.graphModel.theme.edgeAdjust,
|
|
184
185
|
}
|
|
185
186
|
}
|
|
186
|
-
|
|
187
187
|
/**
|
|
188
188
|
* 自定义边文本样式
|
|
189
189
|
*
|
|
@@ -374,16 +374,23 @@ export class BaseEdgeModel implements IBaseEdgeModel {
|
|
|
374
374
|
* @overridable 支持重写
|
|
375
375
|
*/
|
|
376
376
|
getData(): EdgeData {
|
|
377
|
-
|
|
377
|
+
let { properties } = this
|
|
378
|
+
if (isObservable(properties)) {
|
|
379
|
+
properties = toJS(properties)
|
|
380
|
+
}
|
|
378
381
|
const data: EdgeData = {
|
|
379
382
|
id: this.id,
|
|
380
383
|
type: this.type,
|
|
384
|
+
properties,
|
|
381
385
|
sourceNodeId: this.sourceNode.id,
|
|
382
386
|
targetNodeId: this.targetNode.id,
|
|
383
387
|
startPoint: assign({}, this.startPoint),
|
|
384
388
|
endPoint: assign({}, this.endPoint),
|
|
385
|
-
properties: toJS(this.properties),
|
|
386
389
|
}
|
|
390
|
+
if (this.graphModel.overlapMode === OverlapMode.INCREASE) {
|
|
391
|
+
data.zIndex = this.zIndex
|
|
392
|
+
}
|
|
393
|
+
const { x, y, value } = this.text
|
|
387
394
|
if (value) {
|
|
388
395
|
data.text = {
|
|
389
396
|
x,
|
|
@@ -391,9 +398,6 @@ export class BaseEdgeModel implements IBaseEdgeModel {
|
|
|
391
398
|
value,
|
|
392
399
|
}
|
|
393
400
|
}
|
|
394
|
-
if (this.graphModel.overlapMode === OverlapMode.INCREASE) {
|
|
395
|
-
data.zIndex = this.zIndex
|
|
396
|
-
}
|
|
397
401
|
return data
|
|
398
402
|
}
|
|
399
403
|
|
|
@@ -493,6 +497,14 @@ export class BaseEdgeModel implements IBaseEdgeModel {
|
|
|
493
497
|
}
|
|
494
498
|
}
|
|
495
499
|
|
|
500
|
+
/**
|
|
501
|
+
* 设置当前元素的文本模式
|
|
502
|
+
* @param mode
|
|
503
|
+
*/
|
|
504
|
+
@action setTextMode(mode: TextMode) {
|
|
505
|
+
this.textMode = mode
|
|
506
|
+
}
|
|
507
|
+
|
|
496
508
|
/**
|
|
497
509
|
* 内部方法,处理初始化文本格式
|
|
498
510
|
*/
|
|
@@ -530,7 +542,6 @@ export class BaseEdgeModel implements IBaseEdgeModel {
|
|
|
530
542
|
}
|
|
531
543
|
this.text = textConfig
|
|
532
544
|
}
|
|
533
|
-
|
|
534
545
|
/**
|
|
535
546
|
* 重置文本位置
|
|
536
547
|
*/
|
|
@@ -544,15 +555,13 @@ export class BaseEdgeModel implements IBaseEdgeModel {
|
|
|
544
555
|
* 移动边上的文本
|
|
545
556
|
*/
|
|
546
557
|
@action moveText(deltaX: number, deltaY: number): void {
|
|
547
|
-
|
|
548
|
-
|
|
549
|
-
|
|
550
|
-
|
|
551
|
-
|
|
552
|
-
|
|
553
|
-
|
|
554
|
-
editable,
|
|
555
|
-
}
|
|
558
|
+
const { x, y, value, draggable, editable } = this.text
|
|
559
|
+
this.text = {
|
|
560
|
+
value,
|
|
561
|
+
editable,
|
|
562
|
+
draggable,
|
|
563
|
+
x: x + deltaX,
|
|
564
|
+
y: y + deltaY,
|
|
556
565
|
}
|
|
557
566
|
}
|
|
558
567
|
|
|
@@ -1,11 +1,11 @@
|
|
|
1
|
-
import { cloneDeep } from 'lodash-es'
|
|
1
|
+
import { assign, cloneDeep } from 'lodash-es'
|
|
2
2
|
import { action, observable } from 'mobx'
|
|
3
3
|
import BaseEdgeModel from './BaseEdgeModel'
|
|
4
4
|
import { BaseNodeModel } from '../node'
|
|
5
5
|
import LogicFlow from '../../LogicFlow'
|
|
6
|
+
import GraphModel from '../GraphModel'
|
|
6
7
|
import { ModelType } from '../../constant'
|
|
7
8
|
import { getBezierControlPoints, IBezierControls } from '../../util'
|
|
8
|
-
import GraphModel from '../GraphModel'
|
|
9
9
|
|
|
10
10
|
import Point = LogicFlow.Point
|
|
11
11
|
import EdgeConfig = LogicFlow.EdgeConfig
|
|
@@ -15,14 +15,11 @@ export class BezierEdgeModel extends BaseEdgeModel {
|
|
|
15
15
|
|
|
16
16
|
offset!: number
|
|
17
17
|
@observable path = ''
|
|
18
|
-
|
|
19
18
|
constructor(data: EdgeConfig, graphModel: GraphModel) {
|
|
20
19
|
super(data, graphModel)
|
|
21
|
-
|
|
22
20
|
this.initEdgeData(data)
|
|
23
21
|
this.setAttributes()
|
|
24
22
|
}
|
|
25
|
-
|
|
26
23
|
initEdgeData(data: EdgeConfig): void {
|
|
27
24
|
this.offset = 100
|
|
28
25
|
super.initEdgeData(data)
|
|
@@ -155,7 +152,9 @@ export class BezierEdgeModel extends BaseEdgeModel {
|
|
|
155
152
|
this.pointsList[2] = anchor
|
|
156
153
|
}
|
|
157
154
|
this.path = this.getPath(this.pointsList)
|
|
158
|
-
|
|
155
|
+
if (this.text?.value) {
|
|
156
|
+
this.setText(assign({}, this.text, this.textPosition))
|
|
157
|
+
}
|
|
159
158
|
}
|
|
160
159
|
// 获取边调整的起点
|
|
161
160
|
@action
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { cloneDeep } from 'lodash-es'
|
|
1
|
+
import { assign, cloneDeep } from 'lodash-es'
|
|
2
2
|
import { observable, action } from 'mobx'
|
|
3
3
|
import { BaseEdgeModel } from '.'
|
|
4
4
|
import { BaseNodeModel, RectNodeModel, CircleNodeModel, Model } from '..'
|
|
@@ -25,7 +25,7 @@ import {
|
|
|
25
25
|
import Point = LogicFlow.Point
|
|
26
26
|
import Position = LogicFlow.Position
|
|
27
27
|
import AppendConfig = LogicFlow.AppendConfig
|
|
28
|
-
import
|
|
28
|
+
import AnchorConfig = Model.AnchorConfig
|
|
29
29
|
|
|
30
30
|
export class PolylineEdgeModel extends BaseEdgeModel {
|
|
31
31
|
modelType = ModelType.POLYLINE_EDGE
|
|
@@ -48,15 +48,13 @@ export class PolylineEdgeModel extends BaseEdgeModel {
|
|
|
48
48
|
}
|
|
49
49
|
|
|
50
50
|
getTextPosition() {
|
|
51
|
-
//
|
|
51
|
+
// 在文本为空的情况下,文本位置为双击位置
|
|
52
52
|
const textValue = this.text?.value
|
|
53
53
|
if (this.dbClickPosition && !textValue) {
|
|
54
54
|
const { x, y } = this.dbClickPosition
|
|
55
|
-
return {
|
|
56
|
-
x,
|
|
57
|
-
y,
|
|
58
|
-
}
|
|
55
|
+
return { x, y }
|
|
59
56
|
}
|
|
57
|
+
// 文本不为空或者没有双击位置时,取最长边的中点作为文本位置
|
|
60
58
|
const currentPositionList = points2PointsList(this.points)
|
|
61
59
|
const [p1, p2] = getLongestEdge(currentPositionList)
|
|
62
60
|
return {
|
|
@@ -69,9 +67,9 @@ export class PolylineEdgeModel extends BaseEdgeModel {
|
|
|
69
67
|
getAfterAnchor(
|
|
70
68
|
direction: SegmentDirection,
|
|
71
69
|
position: Position,
|
|
72
|
-
anchorList:
|
|
70
|
+
anchorList: AnchorConfig[],
|
|
73
71
|
) {
|
|
74
|
-
let anchor:
|
|
72
|
+
let anchor: AnchorConfig
|
|
75
73
|
let minDistance: number
|
|
76
74
|
anchorList.forEach((item) => {
|
|
77
75
|
let distanceX: number
|
|
@@ -186,7 +184,7 @@ export class PolylineEdgeModel extends BaseEdgeModel {
|
|
|
186
184
|
direction: SegmentDirection,
|
|
187
185
|
positionType: string,
|
|
188
186
|
position: Position,
|
|
189
|
-
anchorList:
|
|
187
|
+
anchorList: AnchorConfig[],
|
|
190
188
|
draggingPointList: Point[],
|
|
191
189
|
) {
|
|
192
190
|
const pointList = draggingPointList.map((i) => i)
|
|
@@ -438,10 +436,13 @@ export class PolylineEdgeModel extends BaseEdgeModel {
|
|
|
438
436
|
}
|
|
439
437
|
this.updatePointsAfterDrag(draggingPointList)
|
|
440
438
|
this.draggingPointList = draggingPointList
|
|
441
|
-
|
|
439
|
+
// TODO: 判断该逻辑是否需要
|
|
440
|
+
if (this.text?.value) {
|
|
441
|
+
this.setText(assign({}, this.text, this.textPosition))
|
|
442
|
+
}
|
|
442
443
|
return {
|
|
443
|
-
start:
|
|
444
|
-
end:
|
|
444
|
+
start: assign({}, pointsList[startIndex]),
|
|
445
|
+
end: assign({}, pointsList[endIndex]),
|
|
445
446
|
startIndex,
|
|
446
447
|
endIndex,
|
|
447
448
|
direction,
|
|
@@ -571,10 +572,13 @@ export class PolylineEdgeModel extends BaseEdgeModel {
|
|
|
571
572
|
this.updatePointsAfterDrag(draggingPointList)
|
|
572
573
|
this.draggingPointList = draggingPointList
|
|
573
574
|
}
|
|
574
|
-
|
|
575
|
+
// TODO: 确认该判断逻辑是否需要
|
|
576
|
+
if (this.text?.value) {
|
|
577
|
+
this.setText(assign({}, this.text, this.textPosition))
|
|
578
|
+
}
|
|
575
579
|
return {
|
|
576
|
-
start:
|
|
577
|
-
end:
|
|
580
|
+
start: assign({}, pointsList[startIndex]),
|
|
581
|
+
end: assign({}, pointsList[endIndex]),
|
|
578
582
|
startIndex,
|
|
579
583
|
endIndex,
|
|
580
584
|
direction,
|
|
@@ -591,9 +595,9 @@ export class PolylineEdgeModel extends BaseEdgeModel {
|
|
|
591
595
|
this.draggingPointList = []
|
|
592
596
|
// 更新起终点
|
|
593
597
|
const startPoint = pointsList[0]
|
|
594
|
-
this.startPoint =
|
|
598
|
+
this.startPoint = assign({}, startPoint)
|
|
595
599
|
const endPoint = pointsList[pointsList.length - 1]
|
|
596
|
-
this.endPoint =
|
|
600
|
+
this.endPoint = assign({}, endPoint)
|
|
597
601
|
}
|
|
598
602
|
this.isDragging = false
|
|
599
603
|
}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { action, computed, isObservable, observable, toJS } from 'mobx'
|
|
2
|
-
import { assign, cloneDeep, has, isNil,
|
|
2
|
+
import { assign, cloneDeep, has, isNil, mapKeys, isUndefined } from 'lodash-es'
|
|
3
3
|
import { GraphModel, Model } from '..'
|
|
4
4
|
import LogicFlow from '../../LogicFlow'
|
|
5
5
|
import {
|
|
@@ -17,6 +17,7 @@ import {
|
|
|
17
17
|
EventType,
|
|
18
18
|
ModelType,
|
|
19
19
|
OverlapMode,
|
|
20
|
+
TextMode,
|
|
20
21
|
} from '../../constant'
|
|
21
22
|
import { ResizeControl } from '../../view/Control'
|
|
22
23
|
import AnchorConfig = Model.AnchorConfig
|
|
@@ -41,7 +42,6 @@ export interface IBaseNodeModel extends Model.BaseModel {
|
|
|
41
42
|
isShowAnchor: boolean
|
|
42
43
|
getNodeStyle: () => CommonTheme
|
|
43
44
|
getTextStyle: () => LogicFlow.TextNodeTheme
|
|
44
|
-
|
|
45
45
|
setIsShowAnchor: (isShowAnchor: boolean) => void
|
|
46
46
|
}
|
|
47
47
|
|
|
@@ -54,6 +54,7 @@ export class BaseNodeModel implements IBaseNodeModel {
|
|
|
54
54
|
@observable readonly type = ''
|
|
55
55
|
@observable x = 0
|
|
56
56
|
@observable y = 0
|
|
57
|
+
@observable textMode = TextMode.TEXT
|
|
57
58
|
@observable text: TextConfig = {
|
|
58
59
|
value: '',
|
|
59
60
|
x: 0,
|
|
@@ -188,6 +189,7 @@ export class BaseNodeModel implements IBaseNodeModel {
|
|
|
188
189
|
this.formatText(data)
|
|
189
190
|
// 在下面又将 NodeConfig 中的数据赋值给了 this,应该会触发 setAttributes,确认是否符合预期
|
|
190
191
|
assign(this, pickNodeConfig(data)) // TODO: 确认 constructor 中赋值 properties 是否必要
|
|
192
|
+
|
|
191
193
|
const { overlapMode } = this.graphModel
|
|
192
194
|
if (overlapMode === OverlapMode.INCREASE) {
|
|
193
195
|
this.zIndex = data.zIndex || getZIndex()
|
|
@@ -216,6 +218,14 @@ export class BaseNodeModel implements IBaseNodeModel {
|
|
|
216
218
|
return null
|
|
217
219
|
}
|
|
218
220
|
|
|
221
|
+
/**
|
|
222
|
+
* 设置当前元素的文本模式
|
|
223
|
+
* @param mode
|
|
224
|
+
*/
|
|
225
|
+
@action setTextMode(mode: TextMode) {
|
|
226
|
+
this.textMode = mode
|
|
227
|
+
}
|
|
228
|
+
|
|
219
229
|
/**
|
|
220
230
|
* 始化文本属性
|
|
221
231
|
*/
|
|
@@ -265,7 +275,6 @@ export class BaseNodeModel implements IBaseNodeModel {
|
|
|
265
275
|
width,
|
|
266
276
|
height,
|
|
267
277
|
})
|
|
268
|
-
|
|
269
278
|
return this.getData()
|
|
270
279
|
}
|
|
271
280
|
|
|
@@ -584,10 +593,10 @@ export class BaseNodeModel implements IBaseNodeModel {
|
|
|
584
593
|
*/
|
|
585
594
|
public getBounds(): Model.BoxBoundsPoint {
|
|
586
595
|
return {
|
|
587
|
-
|
|
588
|
-
|
|
589
|
-
|
|
590
|
-
|
|
596
|
+
minX: this.x - this.width / 2,
|
|
597
|
+
minY: this.y - this.height / 2,
|
|
598
|
+
maxX: this.x + this.width / 2,
|
|
599
|
+
maxY: this.y + this.height / 2,
|
|
591
600
|
}
|
|
592
601
|
}
|
|
593
602
|
|
|
@@ -691,12 +700,9 @@ export class BaseNodeModel implements IBaseNodeModel {
|
|
|
691
700
|
@action moveTo(x: number, y: number, isIgnoreRule = false): boolean {
|
|
692
701
|
const deltaX = x - this.x
|
|
693
702
|
const deltaY = y - this.y
|
|
694
|
-
if (!isIgnoreRule && !this.isAllowMoveNode(deltaX, deltaY))
|
|
695
|
-
|
|
696
|
-
|
|
697
|
-
if (this.text) {
|
|
698
|
-
this.text && this.moveText(deltaX, deltaY)
|
|
699
|
-
}
|
|
703
|
+
if (!isIgnoreRule && !this.isAllowMoveNode(deltaX, deltaY)) return false
|
|
704
|
+
|
|
705
|
+
this.text && this.moveText(deltaX, deltaY)
|
|
700
706
|
this.x = x
|
|
701
707
|
this.y = y
|
|
702
708
|
return true
|
package/src/options.ts
CHANGED
|
@@ -2,7 +2,7 @@ import { assign } from 'lodash-es'
|
|
|
2
2
|
import { createElement as h } from 'preact/compat'
|
|
3
3
|
import LogicFlow from './LogicFlow'
|
|
4
4
|
import { KeyboardDef } from './keyboard'
|
|
5
|
-
import { OverlapMode } from './constant'
|
|
5
|
+
import { OverlapMode, TextMode } from './constant'
|
|
6
6
|
import { Grid } from './view/overlay'
|
|
7
7
|
|
|
8
8
|
import GridOptions = Grid.GridOptions
|
|
@@ -68,6 +68,11 @@ export namespace Options {
|
|
|
68
68
|
edgeType?: EdgeType
|
|
69
69
|
adjustEdge?: boolean
|
|
70
70
|
|
|
71
|
+
// 元素文本类型:text or label
|
|
72
|
+
textMode?: TextMode
|
|
73
|
+
edgeTextMode?: TextMode
|
|
74
|
+
nodeTextMode?: TextMode
|
|
75
|
+
|
|
71
76
|
allowRotate?: boolean // 允许节点旋转
|
|
72
77
|
allowResize?: boolean // 是否允许缩放
|
|
73
78
|
|
|
@@ -1,16 +1,16 @@
|
|
|
1
1
|
import { Component } from 'preact/compat'
|
|
2
|
+
import { IToolProps } from '.'
|
|
2
3
|
import { Model, observer } from '..'
|
|
3
4
|
import LogicFlow from '../LogicFlow'
|
|
4
5
|
import { StepDrag, IDragParams } from '../util'
|
|
5
6
|
import { ElementType, EventType } from '../constant'
|
|
6
7
|
import { getNodeOutline, getEdgeOutline } from '../algorithm/outline'
|
|
7
|
-
import { IToolProps } from './tool'
|
|
8
8
|
|
|
9
9
|
import GraphData = LogicFlow.GraphData
|
|
10
10
|
|
|
11
11
|
@observer
|
|
12
12
|
export default class MultipleSelect extends Component<IToolProps> {
|
|
13
|
-
static toolName = '
|
|
13
|
+
static toolName = 'multiple-select-tool'
|
|
14
14
|
stepDrag: StepDrag
|
|
15
15
|
|
|
16
16
|
constructor(props: IToolProps) {
|
|
@@ -40,13 +40,13 @@ export default class MultipleSelect extends Component<IToolProps> {
|
|
|
40
40
|
clientY,
|
|
41
41
|
ctrlKey,
|
|
42
42
|
})
|
|
43
|
-
this.props.
|
|
43
|
+
this.props.lf.container
|
|
44
44
|
?.querySelector('.lf-canvas-overlay[name="canvas-overlay"]')
|
|
45
45
|
?.dispatchEvent(newEvent)
|
|
46
46
|
}
|
|
47
47
|
onDragging = ({ deltaX, deltaY }: IDragParams) => {
|
|
48
|
-
const { graphModel,
|
|
49
|
-
const { SCALE_X, SCALE_Y } =
|
|
48
|
+
const { graphModel, lf } = this.props
|
|
49
|
+
const { SCALE_X, SCALE_Y } = lf.getTransform()
|
|
50
50
|
const selectElements = graphModel.getSelectElements(true)
|
|
51
51
|
graphModel.moveNodes(
|
|
52
52
|
selectElements.nodes.map((node) => node.id),
|
|
@@ -88,7 +88,7 @@ export default class MultipleSelect extends Component<IToolProps> {
|
|
|
88
88
|
const {
|
|
89
89
|
graphModel: { selectElements, transformModel },
|
|
90
90
|
} = this.props
|
|
91
|
-
const { SCALE_X, SCALE_Y } = this.props.
|
|
91
|
+
const { SCALE_X, SCALE_Y } = this.props.lf.getTransform()
|
|
92
92
|
if (selectElements.size <= 1) return
|
|
93
93
|
let x = Number.MAX_SAFE_INTEGER
|
|
94
94
|
let y = Number.MAX_SAFE_INTEGER
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import { createRef, Component } from 'preact'
|
|
1
|
+
import { createRef, Component } from 'preact/compat'
|
|
2
|
+
import { IToolProps } from '.'
|
|
2
3
|
import { ElementState, observer } from '..'
|
|
3
4
|
import { ElementType, EventType, ModelType } from '../constant'
|
|
4
|
-
import { IToolProps } from './tool'
|
|
5
5
|
|
|
6
6
|
type IState = {
|
|
7
7
|
style: {
|
|
@@ -12,7 +12,7 @@ type IState = {
|
|
|
12
12
|
|
|
13
13
|
@observer
|
|
14
14
|
export class TextEditTool extends Component<IToolProps, IState> {
|
|
15
|
-
static toolName = '
|
|
15
|
+
static toolName = 'text-edit-tool'
|
|
16
16
|
ref = createRef()
|
|
17
17
|
__prevText = {
|
|
18
18
|
type: '',
|
package/src/tool/index.ts
CHANGED
|
@@ -1,2 +1,96 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
1
|
+
import { Component, ReactElement } from 'preact/compat'
|
|
2
|
+
import { action, observable } from 'mobx'
|
|
3
|
+
import { forEach } from 'lodash-es'
|
|
4
|
+
import TextEdit from './TextEditTool'
|
|
5
|
+
import MultipleSelect from './MultipleSelectTool'
|
|
6
|
+
import LogicFlow from '../LogicFlow'
|
|
7
|
+
import { ElementState, EventType } from '../constant'
|
|
8
|
+
import { GraphModel, BaseEdgeModel, BaseNodeModel } from '../model'
|
|
9
|
+
|
|
10
|
+
export type IToolProps = {
|
|
11
|
+
lf: LogicFlow
|
|
12
|
+
graphModel: GraphModel
|
|
13
|
+
textEditElement?: BaseNodeModel | BaseEdgeModel
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
type ToolConstructor = new (props: IToolProps) => Component<IToolProps>
|
|
17
|
+
|
|
18
|
+
// 默认内置的工具
|
|
19
|
+
const defaultTools = [TextEdit, MultipleSelect]
|
|
20
|
+
|
|
21
|
+
export class Tool {
|
|
22
|
+
tools?: Component[]
|
|
23
|
+
components?: ReactElement<IToolProps>[]
|
|
24
|
+
@observable toolMap = new Map<string, ToolConstructor>()
|
|
25
|
+
|
|
26
|
+
disabledToolMap = new Map<string, ToolConstructor>()
|
|
27
|
+
instance: LogicFlow
|
|
28
|
+
|
|
29
|
+
constructor(instance: LogicFlow) {
|
|
30
|
+
this.instance = instance
|
|
31
|
+
forEach(defaultTools, (tool) => {
|
|
32
|
+
if (!this.isDisabled(tool.toolName)) {
|
|
33
|
+
this.registerTool(tool.toolName, tool)
|
|
34
|
+
}
|
|
35
|
+
})
|
|
36
|
+
|
|
37
|
+
// @see https://github.com/didi/LogicFlow/issues/152
|
|
38
|
+
const { graphModel } = instance
|
|
39
|
+
const { eventCenter } = graphModel
|
|
40
|
+
eventCenter.on(
|
|
41
|
+
`${EventType.GRAPH_TRANSFORM},${EventType.NODE_CLICK},${EventType.BLANK_CLICK} `,
|
|
42
|
+
() => {
|
|
43
|
+
const {
|
|
44
|
+
textEditElement,
|
|
45
|
+
editConfigModel: { edgeTextEdit, nodeTextEdit },
|
|
46
|
+
} = graphModel
|
|
47
|
+
// fix #826, 保留之前的文本可以编辑点击空白才设置为不可编辑。如果以后有其他需求再改。
|
|
48
|
+
if ((edgeTextEdit || nodeTextEdit) && textEditElement) {
|
|
49
|
+
graphModel.textEditElement?.setElementState(ElementState.DEFAULT)
|
|
50
|
+
}
|
|
51
|
+
},
|
|
52
|
+
)
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
private isDisabled(toolName) {
|
|
56
|
+
return this.instance.options.disabledTools?.indexOf(toolName) !== -1
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
// 注册工具
|
|
60
|
+
registerTool(name: string, component: ToolConstructor) {
|
|
61
|
+
this.toolMap.set(name, component)
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
// 禁用工具
|
|
65
|
+
@action
|
|
66
|
+
disableTool(name: string): boolean | Error {
|
|
67
|
+
const tool = this.toolMap.get(name)
|
|
68
|
+
if (tool) {
|
|
69
|
+
this.disabledToolMap.set(name, tool)
|
|
70
|
+
this.toolMap.delete(name)
|
|
71
|
+
return true
|
|
72
|
+
}
|
|
73
|
+
throw new Error('禁用失败,不存在名为 ${tool} 的工具')
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
@action
|
|
77
|
+
enableTool(name: string): boolean | Error {
|
|
78
|
+
const tool = this.disabledToolMap.get(name)
|
|
79
|
+
if (tool) {
|
|
80
|
+
this.toolMap.set(name, tool)
|
|
81
|
+
this.disabledToolMap.delete(name)
|
|
82
|
+
return true
|
|
83
|
+
}
|
|
84
|
+
throw new Error('不存在名为 ${tool} 的工具')
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
getTools() {
|
|
88
|
+
return Array.from(this.toolMap.values())
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
getInstance() {
|
|
92
|
+
return this.instance
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
export default Tool
|
package/src/util/drag.ts
CHANGED
|
@@ -10,7 +10,7 @@ const LEFT_MOUSE_BUTTON_CODE = 0
|
|
|
10
10
|
export type IDragParams = {
|
|
11
11
|
deltaX: number
|
|
12
12
|
deltaY: number
|
|
13
|
-
event
|
|
13
|
+
event?: MouseEvent
|
|
14
14
|
[key: string]: unknown
|
|
15
15
|
}
|
|
16
16
|
|
|
@@ -23,9 +23,16 @@ export type ICreateDragParams = {
|
|
|
23
23
|
}
|
|
24
24
|
|
|
25
25
|
export type IStepperDragProps = {
|
|
26
|
-
eventType?:
|
|
26
|
+
eventType?:
|
|
27
|
+
| 'NODE'
|
|
28
|
+
| 'BLANK'
|
|
29
|
+
| 'SELECTION'
|
|
30
|
+
| 'ADJUST_POINT'
|
|
31
|
+
| 'TEXT'
|
|
32
|
+
| 'LABEL'
|
|
33
|
+
| ''
|
|
27
34
|
eventCenter?: EventEmitter
|
|
28
|
-
model?: Model.BaseModel |
|
|
35
|
+
model?: Model.BaseModel | unknown
|
|
29
36
|
data?: Record<string, unknown>
|
|
30
37
|
[key: string]: unknown
|
|
31
38
|
} & Partial<ICreateDragParams>
|
|
@@ -39,9 +46,16 @@ export class StepDrag {
|
|
|
39
46
|
|
|
40
47
|
step: number
|
|
41
48
|
isStopPropagation: boolean
|
|
42
|
-
eventType:
|
|
49
|
+
eventType:
|
|
50
|
+
| 'NODE'
|
|
51
|
+
| 'BLANK'
|
|
52
|
+
| 'SELECTION'
|
|
53
|
+
| 'ADJUST_POINT'
|
|
54
|
+
| 'TEXT'
|
|
55
|
+
| 'LABEL'
|
|
56
|
+
| ''
|
|
43
57
|
eventCenter?: EventEmitter
|
|
44
|
-
model?: Model.BaseModel |
|
|
58
|
+
model?: Model.BaseModel | any // TODO: 如何兼容 LabelModel 类型。 LabelModel 能否是 BaseModel 的实现呢?
|
|
45
59
|
data?: Record<string, unknown>
|
|
46
60
|
|
|
47
61
|
// 运行时
|
|
@@ -141,6 +155,8 @@ export class StepDrag {
|
|
|
141
155
|
event: e,
|
|
142
156
|
})
|
|
143
157
|
this.eventCenter?.emit(EventType[`${this.eventType}_MOUSEMOVE`], {
|
|
158
|
+
deltaX,
|
|
159
|
+
deltaY,
|
|
144
160
|
e,
|
|
145
161
|
data: this.data || elementData,
|
|
146
162
|
})
|
|
@@ -180,7 +196,7 @@ export class StepDrag {
|
|
|
180
196
|
|
|
181
197
|
DOC.removeEventListener('mousemove', this.handleMouseMove, false)
|
|
182
198
|
DOC.removeEventListener('mouseup', this.handleMouseUp, false)
|
|
183
|
-
this.onDragEnd({ event:
|
|
199
|
+
this.onDragEnd({ event: undefined })
|
|
184
200
|
this.isDragging = false
|
|
185
201
|
}
|
|
186
202
|
}
|