@logicflow/core 2.0.0-beta.7 → 2.0.0-beta.9
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 +19 -14
- package/es/LogicFlow.js +1 -2
- package/es/LogicFlow.js.map +1 -1
- package/es/event/eventArgs.d.ts +13 -4
- package/es/event/eventEmitter.d.ts +2 -2
- package/es/index.d.ts +1 -0
- package/es/index.js +1 -0
- package/es/index.js.map +1 -1
- package/es/keyboard/index.d.ts +1 -0
- package/es/keyboard/index.js +1 -0
- package/es/keyboard/index.js.map +1 -1
- package/es/keyboard/shortcut.d.ts +4 -0
- package/es/keyboard/shortcut.js +61 -0
- package/es/keyboard/shortcut.js.map +1 -1
- package/es/model/BaseModel.d.ts +15 -2
- package/es/model/EditConfigModel.d.ts +1 -1
- package/es/model/EditConfigModel.js +11 -11
- package/es/model/EditConfigModel.js.map +1 -1
- package/es/model/GraphModel.d.ts +12 -12
- package/es/model/GraphModel.js +3 -3
- package/es/model/GraphModel.js.map +1 -1
- package/es/model/edge/BaseEdgeModel.d.ts +9 -7
- package/es/model/edge/BaseEdgeModel.js +5 -2
- package/es/model/edge/BaseEdgeModel.js.map +1 -1
- package/es/model/edge/BezierEdgeModel.d.ts +2 -2
- package/es/model/edge/BezierEdgeModel.js +2 -1
- package/es/model/edge/BezierEdgeModel.js.map +1 -1
- package/es/model/edge/LineEdgeModel.js +2 -1
- package/es/model/edge/LineEdgeModel.js.map +1 -1
- package/es/model/edge/PolylineEdgeModel.js +2 -1
- package/es/model/edge/PolylineEdgeModel.js.map +1 -1
- package/es/model/node/BaseNodeModel.d.ts +23 -21
- package/es/model/node/BaseNodeModel.js +17 -16
- package/es/model/node/BaseNodeModel.js.map +1 -1
- package/es/model/node/CircleNodeModel.d.ts +2 -3
- package/es/model/node/CircleNodeModel.js +2 -5
- package/es/model/node/CircleNodeModel.js.map +1 -1
- package/es/model/node/DiamondNodeModel.d.ts +3 -4
- package/es/model/node/DiamondNodeModel.js +2 -5
- package/es/model/node/DiamondNodeModel.js.map +1 -1
- package/es/model/node/EllipseNodeModel.d.ts +3 -4
- package/es/model/node/EllipseNodeModel.js +2 -5
- package/es/model/node/EllipseNodeModel.js.map +1 -1
- package/es/model/node/HtmlNodeModel.d.ts +3 -4
- package/es/model/node/HtmlNodeModel.js +2 -12
- package/es/model/node/HtmlNodeModel.js.map +1 -1
- package/es/model/node/PolygonNodeModel.d.ts +3 -4
- package/es/model/node/PolygonNodeModel.js +2 -5
- package/es/model/node/PolygonNodeModel.js.map +1 -1
- package/es/model/node/RectNodeModel.d.ts +4 -5
- package/es/model/node/RectNodeModel.js +2 -5
- package/es/model/node/RectNodeModel.js.map +1 -1
- package/es/model/node/TextNodeModel.d.ts +14 -8
- package/es/model/node/TextNodeModel.js.map +1 -1
- package/es/util/edge.d.ts +1 -1
- package/es/util/index.d.ts +1 -0
- package/es/util/index.js +1 -0
- package/es/util/index.js.map +1 -1
- package/es/util/node.js +3 -0
- package/es/util/node.js.map +1 -1
- package/es/util/resize.d.ts +32 -0
- package/es/util/resize.js +197 -0
- package/es/util/resize.js.map +1 -0
- package/es/view/Anchor.d.ts +4 -3
- package/es/view/Control.d.ts +1 -1
- package/es/view/Control.js +72 -35
- package/es/view/Control.js.map +1 -1
- package/es/view/Graph.js +2 -1
- package/es/view/Graph.js.map +1 -1
- package/es/view/node/BaseNode.d.ts +2 -2
- package/es/view/node/BaseNode.js +15 -11
- package/es/view/node/BaseNode.js.map +1 -1
- package/es/view/node/CircleNode.d.ts +1 -1
- package/es/view/node/CircleNode.js.map +1 -1
- package/es/view/node/DiamondNode.d.ts +1 -1
- package/es/view/node/DiamondNode.js.map +1 -1
- package/es/view/node/EllipseNode.d.ts +1 -1
- package/es/view/node/EllipseNode.js.map +1 -1
- package/es/view/node/HtmlNode.d.ts +1 -1
- package/es/view/node/HtmlNode.js.map +1 -1
- package/es/view/node/PolygonNode.d.ts +1 -1
- package/es/view/node/PolygonNode.js.map +1 -1
- package/es/view/node/RectNode.d.ts +1 -1
- package/es/view/node/RectNode.js.map +1 -1
- package/es/view/node/TextNode.d.ts +1 -1
- package/es/view/node/TextNode.js.map +1 -1
- package/es/view/text/BaseText.js +1 -1
- package/es/view/text/BaseText.js.map +1 -1
- package/lib/LogicFlow.d.ts +19 -14
- package/lib/LogicFlow.js +2 -3
- package/lib/LogicFlow.js.map +1 -1
- package/lib/event/eventArgs.d.ts +13 -4
- package/lib/event/eventEmitter.d.ts +2 -2
- package/lib/index.d.ts +1 -0
- package/lib/index.js +1 -0
- package/lib/index.js.map +1 -1
- package/lib/keyboard/index.d.ts +1 -0
- package/lib/keyboard/index.js +15 -0
- package/lib/keyboard/index.js.map +1 -1
- package/lib/keyboard/shortcut.d.ts +4 -0
- package/lib/keyboard/shortcut.js +64 -1
- package/lib/keyboard/shortcut.js.map +1 -1
- package/lib/model/BaseModel.d.ts +15 -2
- package/lib/model/EditConfigModel.d.ts +1 -1
- package/lib/model/EditConfigModel.js +10 -10
- package/lib/model/EditConfigModel.js.map +1 -1
- package/lib/model/GraphModel.d.ts +12 -12
- package/lib/model/GraphModel.js +2 -2
- package/lib/model/GraphModel.js.map +1 -1
- package/lib/model/edge/BaseEdgeModel.d.ts +9 -7
- package/lib/model/edge/BaseEdgeModel.js +5 -2
- package/lib/model/edge/BaseEdgeModel.js.map +1 -1
- package/lib/model/edge/BezierEdgeModel.d.ts +2 -2
- package/lib/model/edge/BezierEdgeModel.js +2 -1
- package/lib/model/edge/BezierEdgeModel.js.map +1 -1
- package/lib/model/edge/LineEdgeModel.js +2 -1
- package/lib/model/edge/LineEdgeModel.js.map +1 -1
- package/lib/model/edge/PolylineEdgeModel.js +2 -1
- package/lib/model/edge/PolylineEdgeModel.js.map +1 -1
- package/lib/model/node/BaseNodeModel.d.ts +23 -21
- package/lib/model/node/BaseNodeModel.js +17 -16
- package/lib/model/node/BaseNodeModel.js.map +1 -1
- package/lib/model/node/CircleNodeModel.d.ts +2 -3
- package/lib/model/node/CircleNodeModel.js +2 -5
- package/lib/model/node/CircleNodeModel.js.map +1 -1
- package/lib/model/node/DiamondNodeModel.d.ts +3 -4
- package/lib/model/node/DiamondNodeModel.js +2 -5
- package/lib/model/node/DiamondNodeModel.js.map +1 -1
- package/lib/model/node/EllipseNodeModel.d.ts +3 -4
- package/lib/model/node/EllipseNodeModel.js +2 -5
- package/lib/model/node/EllipseNodeModel.js.map +1 -1
- package/lib/model/node/HtmlNodeModel.d.ts +3 -4
- package/lib/model/node/HtmlNodeModel.js +2 -12
- package/lib/model/node/HtmlNodeModel.js.map +1 -1
- package/lib/model/node/PolygonNodeModel.d.ts +3 -4
- package/lib/model/node/PolygonNodeModel.js +2 -5
- package/lib/model/node/PolygonNodeModel.js.map +1 -1
- package/lib/model/node/RectNodeModel.d.ts +4 -5
- package/lib/model/node/RectNodeModel.js +2 -5
- package/lib/model/node/RectNodeModel.js.map +1 -1
- package/lib/model/node/TextNodeModel.d.ts +14 -8
- package/lib/model/node/TextNodeModel.js.map +1 -1
- package/lib/util/edge.d.ts +1 -1
- package/lib/util/index.d.ts +1 -0
- package/lib/util/index.js +1 -0
- package/lib/util/index.js.map +1 -1
- package/lib/util/node.js +3 -0
- package/lib/util/node.js.map +1 -1
- package/lib/util/resize.d.ts +32 -0
- package/lib/util/resize.js +204 -0
- package/lib/util/resize.js.map +1 -0
- package/lib/view/Anchor.d.ts +4 -3
- package/lib/view/Control.d.ts +1 -1
- package/lib/view/Control.js +71 -34
- package/lib/view/Control.js.map +1 -1
- package/lib/view/Graph.js +2 -1
- package/lib/view/Graph.js.map +1 -1
- package/lib/view/node/BaseNode.d.ts +2 -2
- package/lib/view/node/BaseNode.js +15 -11
- package/lib/view/node/BaseNode.js.map +1 -1
- package/lib/view/node/CircleNode.d.ts +1 -1
- package/lib/view/node/CircleNode.js.map +1 -1
- package/lib/view/node/DiamondNode.d.ts +1 -1
- package/lib/view/node/DiamondNode.js.map +1 -1
- package/lib/view/node/EllipseNode.d.ts +1 -1
- package/lib/view/node/EllipseNode.js.map +1 -1
- package/lib/view/node/HtmlNode.d.ts +1 -1
- package/lib/view/node/HtmlNode.js.map +1 -1
- package/lib/view/node/PolygonNode.d.ts +1 -1
- package/lib/view/node/PolygonNode.js.map +1 -1
- package/lib/view/node/RectNode.d.ts +1 -1
- package/lib/view/node/RectNode.js.map +1 -1
- package/lib/view/node/TextNode.d.ts +1 -1
- package/lib/view/node/TextNode.js.map +1 -1
- package/lib/view/text/BaseText.js +1 -1
- package/lib/view/text/BaseText.js.map +1 -1
- package/package.json +1 -1
- package/src/LogicFlow.tsx +18 -14
- package/src/event/eventArgs.ts +16 -4
- package/src/event/eventEmitter.ts +1 -1
- package/src/index.ts +1 -0
- package/src/keyboard/index.ts +2 -0
- package/src/keyboard/shortcut.ts +67 -0
- package/src/model/BaseModel.ts +16 -3
- package/src/model/EditConfigModel.ts +11 -11
- package/src/model/GraphModel.ts +3 -3
- package/src/model/edge/BaseEdgeModel.ts +17 -5
- package/src/model/edge/BezierEdgeModel.ts +2 -0
- package/src/model/edge/LineEdgeModel.ts +2 -0
- package/src/model/edge/PolylineEdgeModel.ts +2 -0
- package/src/model/node/BaseNodeModel.ts +23 -16
- package/src/model/node/CircleNodeModel.ts +6 -4
- package/src/model/node/DiamondNodeModel.ts +7 -5
- package/src/model/node/EllipseNodeModel.ts +7 -5
- package/src/model/node/HtmlNodeModel.ts +7 -6
- package/src/model/node/PolygonNodeModel.ts +7 -5
- package/src/model/node/RectNodeModel.ts +8 -6
- package/src/model/node/TextNodeModel.ts +13 -2
- package/src/util/index.ts +1 -0
- package/src/util/node.ts +4 -0
- package/src/util/resize.ts +286 -0
- package/src/view/Control.tsx +76 -57
- package/src/view/Graph.tsx +2 -1
- package/src/view/node/BaseNode.tsx +26 -13
- package/src/view/node/CircleNode.tsx +3 -1
- package/src/view/node/DiamondNode.tsx +3 -1
- package/src/view/node/EllipseNode.tsx +3 -1
- package/src/view/node/HtmlNode.tsx +3 -1
- package/src/view/node/PolygonNode.tsx +3 -1
- package/src/view/node/RectNode.tsx +3 -1
- package/src/view/node/TextNode.tsx +3 -1
- package/src/view/text/BaseText.tsx +1 -1
package/src/LogicFlow.tsx
CHANGED
|
@@ -19,10 +19,9 @@ import { formatData } from './util'
|
|
|
19
19
|
import { Dnd, snapline } from './view/behavior'
|
|
20
20
|
import Tool from './tool'
|
|
21
21
|
import History from './history'
|
|
22
|
-
import Keyboard from './keyboard'
|
|
22
|
+
import Keyboard, { initDefaultShortcut } from './keyboard'
|
|
23
23
|
import { EventCallback, CallbackArgs, EventArgs } from './event/eventEmitter'
|
|
24
24
|
import { ElementType, EventType, SegmentDirection } from './constant'
|
|
25
|
-
import { initDefaultShortcut } from './keyboard/shortcut'
|
|
26
25
|
|
|
27
26
|
import Extension = LogicFlow.Extension
|
|
28
27
|
import ExtensionConfig = LogicFlow.ExtensionConfig
|
|
@@ -692,10 +691,7 @@ export class LogicFlow {
|
|
|
692
691
|
* @param edges
|
|
693
692
|
* @param distance
|
|
694
693
|
*/
|
|
695
|
-
addElements(
|
|
696
|
-
{ nodes, edges }: GraphConfigData,
|
|
697
|
-
distance = 40,
|
|
698
|
-
): GraphElements | undefined {
|
|
694
|
+
addElements({ nodes, edges }: GraphConfigData, distance = 40): GraphElements {
|
|
699
695
|
// TODO: 1. 解决下面方法中 distance 传参缺未使用的问题;该方法在快捷键中有调用
|
|
700
696
|
// TODO: 2. review 一下本函数代码逻辑,确认 nodeIdMap 的作用,看是否有优化的空间
|
|
701
697
|
console.log('distance', distance)
|
|
@@ -1387,12 +1383,17 @@ export namespace LogicFlow {
|
|
|
1387
1383
|
[key: string]: string | undefined
|
|
1388
1384
|
}
|
|
1389
1385
|
|
|
1390
|
-
export
|
|
1386
|
+
export interface PropertiesType {
|
|
1391
1387
|
width?: number
|
|
1392
1388
|
height?: number
|
|
1393
1389
|
rx?: number
|
|
1394
1390
|
ry?: number
|
|
1395
|
-
|
|
1391
|
+
|
|
1392
|
+
style?: LogicFlow.CommonTheme
|
|
1393
|
+
textStyle?: LogicFlow.CommonTheme
|
|
1394
|
+
|
|
1395
|
+
[key: string]: any
|
|
1396
|
+
}
|
|
1396
1397
|
export type AttributesType = Record<string, any>
|
|
1397
1398
|
|
|
1398
1399
|
export type VectorData = {
|
|
@@ -1530,17 +1531,20 @@ export namespace LogicFlow {
|
|
|
1530
1531
|
[key: string]: any
|
|
1531
1532
|
}
|
|
1532
1533
|
|
|
1533
|
-
export interface NodeConfig {
|
|
1534
|
+
export interface NodeConfig<P extends PropertiesType = PropertiesType> {
|
|
1534
1535
|
id?: string
|
|
1535
1536
|
type: string
|
|
1536
1537
|
x: number
|
|
1537
1538
|
y: number
|
|
1538
1539
|
text?: TextConfig | string
|
|
1539
1540
|
zIndex?: number
|
|
1540
|
-
properties?:
|
|
1541
|
+
properties?: P
|
|
1541
1542
|
virtual?: boolean // 是否虚拟节点
|
|
1542
1543
|
rotate?: number
|
|
1543
1544
|
|
|
1545
|
+
rotatable?: boolean // 节点是否可旋转
|
|
1546
|
+
resizable?: boolean // 节点是否可缩放
|
|
1547
|
+
|
|
1544
1548
|
[key: string]: any
|
|
1545
1549
|
}
|
|
1546
1550
|
|
|
@@ -1550,7 +1554,7 @@ export namespace LogicFlow {
|
|
|
1550
1554
|
[key: string]: unknown
|
|
1551
1555
|
}
|
|
1552
1556
|
|
|
1553
|
-
export interface EdgeConfig {
|
|
1557
|
+
export interface EdgeConfig<P extends PropertiesType = PropertiesType> {
|
|
1554
1558
|
id?: string
|
|
1555
1559
|
type?: string // TODO: 将所有类型选项列出来;LogicFlow 内部默认为 polyline
|
|
1556
1560
|
|
|
@@ -1563,7 +1567,7 @@ export namespace LogicFlow {
|
|
|
1563
1567
|
text?: TextConfig | string
|
|
1564
1568
|
pointsList?: Point[]
|
|
1565
1569
|
zIndex?: number
|
|
1566
|
-
properties?:
|
|
1570
|
+
properties?: P
|
|
1567
1571
|
}
|
|
1568
1572
|
|
|
1569
1573
|
export interface EdgeData extends EdgeConfig {
|
|
@@ -1828,8 +1832,8 @@ export namespace LogicFlow {
|
|
|
1828
1832
|
}
|
|
1829
1833
|
export type FocusOnArgsType = FocusOnById | FocusOnByCoordinate
|
|
1830
1834
|
|
|
1831
|
-
export type BaseNodeModelCtor = typeof BaseNodeModel
|
|
1832
|
-
export type BaseEdgeModelCtor = typeof BaseEdgeModel
|
|
1835
|
+
export type BaseNodeModelCtor = typeof BaseNodeModel<PropertiesType>
|
|
1836
|
+
export type BaseEdgeModelCtor = typeof BaseEdgeModel<PropertiesType>
|
|
1833
1837
|
|
|
1834
1838
|
export type GraphElementCtor = BaseNodeModelCtor | BaseEdgeModelCtor
|
|
1835
1839
|
export type GraphElement = BaseNodeModel | BaseEdgeModel
|
package/src/event/eventArgs.ts
CHANGED
|
@@ -32,7 +32,8 @@ type NodeEventArgsPick<
|
|
|
32
32
|
| 'e'
|
|
33
33
|
| 'position'
|
|
34
34
|
| 'deltaX'
|
|
35
|
-
| 'deltaY'
|
|
35
|
+
| 'deltaY'
|
|
36
|
+
| 'index',
|
|
36
37
|
> = Pick<
|
|
37
38
|
{
|
|
38
39
|
/**
|
|
@@ -63,6 +64,10 @@ type NodeEventArgsPick<
|
|
|
63
64
|
* 鼠标Y轴移动的距离
|
|
64
65
|
*/
|
|
65
66
|
deltaY: number
|
|
67
|
+
/**
|
|
68
|
+
* Resize 时调整的是哪个控制点
|
|
69
|
+
*/
|
|
70
|
+
index: number
|
|
66
71
|
},
|
|
67
72
|
T
|
|
68
73
|
>
|
|
@@ -159,7 +164,9 @@ interface NodeEventArgs {
|
|
|
159
164
|
/**
|
|
160
165
|
* 节点缩放
|
|
161
166
|
*/
|
|
162
|
-
'node:resize': NodeEventArgsPick<
|
|
167
|
+
'node:resize': NodeEventArgsPick<
|
|
168
|
+
'preData' | 'data' | 'model' | 'deltaX' | 'deltaY' | 'index'
|
|
169
|
+
>
|
|
163
170
|
}
|
|
164
171
|
|
|
165
172
|
type EdgeEventArgsPick<T extends 'data' | 'e' | 'position'> = Pick<
|
|
@@ -403,11 +410,16 @@ interface CommonEventArgs {
|
|
|
403
410
|
graphModel: GraphModel
|
|
404
411
|
}
|
|
405
412
|
/**
|
|
406
|
-
* 画布重新更新后触发. 即 lf.render(graphData)方法被调用后或者改变画布(
|
|
413
|
+
* 画布重新更新后触发. 即 lf.render(graphData)方法被调用后或者改变画布(graphModel)上的属性后触发。
|
|
407
414
|
* 如果是主动修改某个特定属性导致画布更新,想要在画布更新后做一些操作,建议注册事件后在回调函数中及时注销该事件,或者使用once事件代替on事件。
|
|
408
415
|
* 因为其他属性也可能导致画布更新,触发该事件。
|
|
409
416
|
*/
|
|
410
|
-
'graph:updated':
|
|
417
|
+
'graph:updated': {
|
|
418
|
+
/**
|
|
419
|
+
* 更新后的画布数据
|
|
420
|
+
*/
|
|
421
|
+
data: GraphData
|
|
422
|
+
}
|
|
411
423
|
}
|
|
412
424
|
|
|
413
425
|
type AnchorEventArgsPick<T extends 'data' | 'e' | 'nodeModel' | 'edgeModel'> =
|
package/src/index.ts
CHANGED
|
@@ -18,6 +18,7 @@ export * from './options'
|
|
|
18
18
|
export * from './keyboard'
|
|
19
19
|
export * from './constant'
|
|
20
20
|
export * from './algorithm'
|
|
21
|
+
export * from './event/eventEmitter'
|
|
21
22
|
export { ElementState, ModelType, ElementType, EventType } from './constant'
|
|
22
23
|
|
|
23
24
|
export { formatAnchorConnectValidateData } from './util/node'
|
package/src/keyboard/index.ts
CHANGED
|
@@ -2,6 +2,8 @@ import { isArray } from 'lodash-es'
|
|
|
2
2
|
import Mousetrap, { MousetrapInstance } from 'mousetrap'
|
|
3
3
|
import LogicFlow from '../LogicFlow'
|
|
4
4
|
|
|
5
|
+
export * from './shortcut'
|
|
6
|
+
|
|
5
7
|
export type Action = 'keypress' | 'keydown' | 'keyup'
|
|
6
8
|
export type Handler = (e: KeyboardEvent) => void
|
|
7
9
|
|
package/src/keyboard/shortcut.ts
CHANGED
|
@@ -1,9 +1,12 @@
|
|
|
1
1
|
import { isEmpty } from 'lodash-es'
|
|
2
2
|
import LogicFlow from '../LogicFlow'
|
|
3
|
+
import { map } from 'lodash-es'
|
|
3
4
|
import GraphModel from '../model/GraphModel'
|
|
4
5
|
|
|
5
6
|
import NodeData = LogicFlow.NodeData
|
|
6
7
|
import EdgeData = LogicFlow.EdgeData
|
|
8
|
+
import NodeConfig = LogicFlow.NodeConfig
|
|
9
|
+
import EdgeConfig = LogicFlow.EdgeConfig
|
|
7
10
|
|
|
8
11
|
let selected: LogicFlow.GraphData | null = null
|
|
9
12
|
|
|
@@ -42,6 +45,70 @@ export function translateEdgeData(edgeData: EdgeData, distance: number) {
|
|
|
42
45
|
return edgeData
|
|
43
46
|
}
|
|
44
47
|
|
|
48
|
+
export function transformNodeData(
|
|
49
|
+
nodeData: NodeData,
|
|
50
|
+
distance: number,
|
|
51
|
+
): NodeConfig {
|
|
52
|
+
const { x, y, text } = nodeData
|
|
53
|
+
// 重新计算 text 的位置,保证粘贴后 text 位置和复制的原节点相对位置一致
|
|
54
|
+
const nextText = text
|
|
55
|
+
? {
|
|
56
|
+
x: text.x + distance,
|
|
57
|
+
y: text.y + distance,
|
|
58
|
+
value: text.value,
|
|
59
|
+
}
|
|
60
|
+
: undefined
|
|
61
|
+
|
|
62
|
+
return {
|
|
63
|
+
...nodeData,
|
|
64
|
+
id: '',
|
|
65
|
+
x: x + distance,
|
|
66
|
+
y: y + distance,
|
|
67
|
+
text: nextText,
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
export function transformEdgeData(
|
|
72
|
+
edgeData: EdgeData,
|
|
73
|
+
distance: number,
|
|
74
|
+
): EdgeConfig {
|
|
75
|
+
const { startPoint, endPoint, pointsList, text, ...edgeConfig } = edgeData
|
|
76
|
+
// 清除原始边的 id
|
|
77
|
+
edgeConfig.id = ''
|
|
78
|
+
|
|
79
|
+
// 重新计算边的位置,包括 startPoint、endPoint、pointsList 以及 text
|
|
80
|
+
// TODO: 看这个是否可以提出一个通用方法,用于重新计算边的位置
|
|
81
|
+
const nextStartPoint = {
|
|
82
|
+
x: startPoint.x + distance,
|
|
83
|
+
y: startPoint.y + distance,
|
|
84
|
+
}
|
|
85
|
+
const nextEndPoint = {
|
|
86
|
+
x: endPoint.x + distance,
|
|
87
|
+
y: endPoint.y + distance,
|
|
88
|
+
}
|
|
89
|
+
const newPointsList: LogicFlow.Point[] = map(pointsList, (point) => {
|
|
90
|
+
return {
|
|
91
|
+
x: point.x + distance,
|
|
92
|
+
y: point.y + distance,
|
|
93
|
+
}
|
|
94
|
+
})
|
|
95
|
+
const nextText = text
|
|
96
|
+
? {
|
|
97
|
+
...text,
|
|
98
|
+
x: text.x + distance,
|
|
99
|
+
y: text.y + distance,
|
|
100
|
+
}
|
|
101
|
+
: undefined
|
|
102
|
+
|
|
103
|
+
return {
|
|
104
|
+
...edgeConfig,
|
|
105
|
+
startPoint: nextStartPoint,
|
|
106
|
+
endPoint: nextEndPoint,
|
|
107
|
+
pointsList: newPointsList,
|
|
108
|
+
text: nextText,
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
|
|
45
112
|
const TRANSLATION_DISTANCE = 40
|
|
46
113
|
let CHILDREN_TRANSLATION_DISTANCE = 40
|
|
47
114
|
|
package/src/model/BaseModel.ts
CHANGED
|
@@ -4,6 +4,7 @@ import LogicFlow from '../LogicFlow'
|
|
|
4
4
|
import { ElementState } from '../constant'
|
|
5
5
|
|
|
6
6
|
export namespace Model {
|
|
7
|
+
import PropertiesType = LogicFlow.PropertiesType
|
|
7
8
|
export type AdditionStateDataType = Record<string, unknown>
|
|
8
9
|
export type PropertyType = Record<string, unknown>
|
|
9
10
|
export type VectorType = [number, number]
|
|
@@ -87,7 +88,20 @@ export namespace Model {
|
|
|
87
88
|
y1: number
|
|
88
89
|
}
|
|
89
90
|
|
|
90
|
-
export interface
|
|
91
|
+
export interface BoxBounds {
|
|
92
|
+
x: number
|
|
93
|
+
y: number
|
|
94
|
+
width: number
|
|
95
|
+
height: number
|
|
96
|
+
minX: number
|
|
97
|
+
minY: number
|
|
98
|
+
maxX: number
|
|
99
|
+
maxY: number
|
|
100
|
+
centerX: number
|
|
101
|
+
centerY: number
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
export interface BaseModel<P extends PropertiesType = PropertiesType> {
|
|
91
105
|
/**
|
|
92
106
|
* 节点或边对应的 ID.
|
|
93
107
|
*
|
|
@@ -140,8 +154,7 @@ export namespace Model {
|
|
|
140
154
|
* 此属性控制的是第二种。节点和边在删除、调整的同时,其关联的文本也会对应删除、调整。
|
|
141
155
|
*/
|
|
142
156
|
text: LogicFlow.TextConfig
|
|
143
|
-
|
|
144
|
-
properties: Record<string, unknown>
|
|
157
|
+
properties: P
|
|
145
158
|
|
|
146
159
|
isSelected: boolean // 元素是否被选中
|
|
147
160
|
isHovered: boolean // 鼠标是否悬停在元素上
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { assign, isBoolean, pick } from 'lodash-es'
|
|
1
|
+
import { assign, isBoolean, isUndefined, pick } from 'lodash-es'
|
|
2
2
|
import { observable, action } from 'mobx'
|
|
3
3
|
import { TextMode } from '../constant'
|
|
4
4
|
|
|
@@ -206,7 +206,7 @@ export class EditConfigModel {
|
|
|
206
206
|
@observable textDraggable = false
|
|
207
207
|
// 节点
|
|
208
208
|
@observable nodeTextEdit = true
|
|
209
|
-
@observable nodeTextDraggable =
|
|
209
|
+
@observable nodeTextDraggable = false
|
|
210
210
|
@observable nodeTextMultiple = false // 是否支持多个节点文本
|
|
211
211
|
@observable nodeTextVertical = false // 节点文本朝向是否是纵向
|
|
212
212
|
@observable nodeTextMode = TextMode.TEXT // 节点文本模式
|
|
@@ -279,24 +279,24 @@ export class EditConfigModel {
|
|
|
279
279
|
}
|
|
280
280
|
|
|
281
281
|
// 如果不传,默认undefined表示允许文本编辑
|
|
282
|
-
if (textEdit
|
|
282
|
+
if (!isUndefined(textEdit)) {
|
|
283
283
|
assign(conf, {
|
|
284
|
-
nodeTextEdit:
|
|
285
|
-
edgeTextEdit:
|
|
284
|
+
nodeTextEdit: textEdit,
|
|
285
|
+
edgeTextEdit: textEdit,
|
|
286
286
|
})
|
|
287
287
|
}
|
|
288
288
|
|
|
289
|
-
if (
|
|
289
|
+
if (!isUndefined(textDraggable)) {
|
|
290
290
|
assign(conf, {
|
|
291
|
-
|
|
292
|
-
|
|
291
|
+
nodeTextDraggable: textDraggable,
|
|
292
|
+
edgeTextDraggable: textDraggable,
|
|
293
293
|
})
|
|
294
294
|
}
|
|
295
295
|
|
|
296
|
-
if (
|
|
296
|
+
if (textMode) {
|
|
297
297
|
assign(conf, {
|
|
298
|
-
|
|
299
|
-
|
|
298
|
+
nodeTextMode: textMode,
|
|
299
|
+
edgeTextMode: textMode,
|
|
300
300
|
})
|
|
301
301
|
}
|
|
302
302
|
|
package/src/model/GraphModel.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { find, forEach,
|
|
1
|
+
import { find, forEach, map } from 'lodash-es'
|
|
2
2
|
import { action, computed, observable } from 'mobx'
|
|
3
3
|
import {
|
|
4
4
|
BaseEdgeModel,
|
|
@@ -789,7 +789,7 @@ export class GraphModel {
|
|
|
789
789
|
if (nodeX && nodeY) {
|
|
790
790
|
node.x = snapToGrid(nodeX, this.gridSize)
|
|
791
791
|
node.y = snapToGrid(nodeY, this.gridSize)
|
|
792
|
-
if (
|
|
792
|
+
if (typeof node.text === 'object' && node.text !== null) {
|
|
793
793
|
// 原来的处理是:node.text.x -= getGridOffset(nodeX, this.gridSize)
|
|
794
794
|
// 由于snapToGrid()使用了Math.round()四舍五入的做法,因此无法判断需要执行
|
|
795
795
|
// node.text.x = node.text.x + getGridOffset()
|
|
@@ -815,7 +815,7 @@ export class GraphModel {
|
|
|
815
815
|
data.x += 30
|
|
816
816
|
data.y += 30
|
|
817
817
|
data.id = ''
|
|
818
|
-
if (
|
|
818
|
+
if (typeof data.text === 'object' && data.text !== null) {
|
|
819
819
|
data.text.x += 30
|
|
820
820
|
data.text.y += 30
|
|
821
821
|
}
|
|
@@ -22,12 +22,15 @@ import Point = LogicFlow.Point
|
|
|
22
22
|
import EdgeData = LogicFlow.EdgeData
|
|
23
23
|
import EdgeConfig = LogicFlow.EdgeConfig
|
|
24
24
|
import TextConfig = LogicFlow.TextConfig
|
|
25
|
+
import PropertiesType = LogicFlow.PropertiesType
|
|
25
26
|
|
|
26
|
-
export interface IBaseEdgeModel extends
|
|
27
|
+
export interface IBaseEdgeModel<P extends PropertiesType>
|
|
28
|
+
extends Model.BaseModel<P> {
|
|
27
29
|
/**
|
|
28
30
|
* model 基础类型,固定为 edge
|
|
29
31
|
*/
|
|
30
32
|
readonly BaseType: ElementType.EDGE
|
|
33
|
+
properties: P
|
|
31
34
|
|
|
32
35
|
sourceNodeId: string
|
|
33
36
|
targetNodeId: string
|
|
@@ -46,7 +49,9 @@ export interface IBaseEdgeModel extends Model.BaseModel {
|
|
|
46
49
|
arrowConfig?: LogicFlow.ArrowConfig
|
|
47
50
|
}
|
|
48
51
|
|
|
49
|
-
export class BaseEdgeModel
|
|
52
|
+
export class BaseEdgeModel<P extends PropertiesType = PropertiesType>
|
|
53
|
+
implements IBaseEdgeModel<P>
|
|
54
|
+
{
|
|
50
55
|
readonly BaseType = ElementType.EDGE
|
|
51
56
|
static BaseType: ElementType = ElementType.EDGE
|
|
52
57
|
|
|
@@ -66,7 +71,7 @@ export class BaseEdgeModel implements IBaseEdgeModel {
|
|
|
66
71
|
draggable: false,
|
|
67
72
|
editable: true,
|
|
68
73
|
}
|
|
69
|
-
@observable properties:
|
|
74
|
+
@observable properties: P
|
|
70
75
|
@observable points = ''
|
|
71
76
|
@observable pointsList: Point[] = []
|
|
72
77
|
|
|
@@ -104,8 +109,10 @@ export class BaseEdgeModel implements IBaseEdgeModel {
|
|
|
104
109
|
};
|
|
105
110
|
[propName: string]: unknown // 支持自定义
|
|
106
111
|
|
|
107
|
-
constructor(data: EdgeConfig
|
|
112
|
+
constructor(data: EdgeConfig<P>, graphModel: GraphModel) {
|
|
108
113
|
this.graphModel = graphModel
|
|
114
|
+
this.properties = data.properties ?? ({} as P)
|
|
115
|
+
|
|
109
116
|
this.initEdgeData(data)
|
|
110
117
|
this.setAttributes()
|
|
111
118
|
}
|
|
@@ -420,7 +427,12 @@ export class BaseEdgeModel implements IBaseEdgeModel {
|
|
|
420
427
|
*/
|
|
421
428
|
@action
|
|
422
429
|
setProperty(key: string, val: any): void {
|
|
423
|
-
|
|
430
|
+
const preProperties = toJS(this.properties)
|
|
431
|
+
this.properties = {
|
|
432
|
+
...preProperties,
|
|
433
|
+
[key]: formatData(val),
|
|
434
|
+
}
|
|
435
|
+
|
|
424
436
|
this.setAttributes()
|
|
425
437
|
}
|
|
426
438
|
|
|
@@ -27,9 +27,11 @@ export class BezierEdgeModel extends BaseEdgeModel {
|
|
|
27
27
|
getEdgeStyle() {
|
|
28
28
|
const { bezier } = this.graphModel.theme
|
|
29
29
|
const style = super.getEdgeStyle()
|
|
30
|
+
const { style: customStyle = {} } = this.properties
|
|
30
31
|
return {
|
|
31
32
|
...style,
|
|
32
33
|
...cloneDeep(bezier),
|
|
34
|
+
...cloneDeep(customStyle),
|
|
33
35
|
}
|
|
34
36
|
}
|
|
35
37
|
getTextPosition(): Point {
|
|
@@ -10,9 +10,11 @@ export class LineEdgeModel extends BaseEdgeModel {
|
|
|
10
10
|
getEdgeStyle() {
|
|
11
11
|
const { line } = this.graphModel.theme
|
|
12
12
|
const style = super.getEdgeStyle()
|
|
13
|
+
const { style: customStyle = {} } = this.properties
|
|
13
14
|
return {
|
|
14
15
|
...style,
|
|
15
16
|
...cloneDeep(line),
|
|
17
|
+
...cloneDeep(customStyle),
|
|
16
18
|
}
|
|
17
19
|
}
|
|
18
20
|
getTextPosition(): Point {
|
|
@@ -41,9 +41,11 @@ export class PolylineEdgeModel extends BaseEdgeModel {
|
|
|
41
41
|
getEdgeStyle() {
|
|
42
42
|
const { polyline } = this.graphModel.theme
|
|
43
43
|
const style = super.getEdgeStyle()
|
|
44
|
+
const { style: customStyle = {} } = this.properties
|
|
44
45
|
return {
|
|
45
46
|
...style,
|
|
46
47
|
...cloneDeep(polyline),
|
|
48
|
+
...cloneDeep(customStyle),
|
|
47
49
|
}
|
|
48
50
|
}
|
|
49
51
|
|
|
@@ -27,16 +27,19 @@ import NodeConfig = LogicFlow.NodeConfig
|
|
|
27
27
|
import NodeData = LogicFlow.NodeData
|
|
28
28
|
import Point = LogicFlow.Point
|
|
29
29
|
import CommonTheme = LogicFlow.CommonTheme
|
|
30
|
+
import PropertiesType = LogicFlow.PropertiesType
|
|
30
31
|
|
|
31
32
|
import ResizeInfo = ResizeControl.ResizeInfo
|
|
32
33
|
import ResizeNodeData = ResizeControl.ResizeNodeData
|
|
33
34
|
import PCTResizeParams = ResizeControl.PCTResizeParams
|
|
34
35
|
|
|
35
|
-
export interface IBaseNodeModel extends
|
|
36
|
+
export interface IBaseNodeModel<P extends PropertiesType>
|
|
37
|
+
extends Model.BaseModel<P> {
|
|
36
38
|
/**
|
|
37
39
|
* model基础类型,固定为node
|
|
38
40
|
*/
|
|
39
41
|
readonly BaseType: ElementType.NODE
|
|
42
|
+
properties: P
|
|
40
43
|
|
|
41
44
|
isDragging: boolean
|
|
42
45
|
isShowAnchor: boolean
|
|
@@ -45,7 +48,9 @@ export interface IBaseNodeModel extends Model.BaseModel {
|
|
|
45
48
|
setIsShowAnchor: (isShowAnchor: boolean) => void
|
|
46
49
|
}
|
|
47
50
|
|
|
48
|
-
export class BaseNodeModel
|
|
51
|
+
export class BaseNodeModel<P extends PropertiesType = PropertiesType>
|
|
52
|
+
implements IBaseNodeModel<P>
|
|
53
|
+
{
|
|
49
54
|
readonly BaseType = ElementType.NODE
|
|
50
55
|
static BaseType: ElementType = ElementType.NODE
|
|
51
56
|
|
|
@@ -62,7 +67,7 @@ export class BaseNodeModel implements IBaseNodeModel {
|
|
|
62
67
|
draggable: false,
|
|
63
68
|
editable: true,
|
|
64
69
|
}
|
|
65
|
-
@observable properties:
|
|
70
|
+
@observable properties: P
|
|
66
71
|
// 形状属性
|
|
67
72
|
@observable private _width = 100
|
|
68
73
|
public get width() {
|
|
@@ -101,8 +106,9 @@ export class BaseNodeModel implements IBaseNodeModel {
|
|
|
101
106
|
@observable isHittable = true // 细粒度控制节点是否对用户操作进行反应
|
|
102
107
|
@observable draggable = true
|
|
103
108
|
@observable visible = true
|
|
104
|
-
|
|
105
|
-
@observable
|
|
109
|
+
|
|
110
|
+
@observable rotatable = true // 节点可旋转
|
|
111
|
+
@observable resizable = true // 节点可缩放
|
|
106
112
|
|
|
107
113
|
// 其它属性
|
|
108
114
|
graphModel: GraphModel
|
|
@@ -138,9 +144,9 @@ export class BaseNodeModel implements IBaseNodeModel {
|
|
|
138
144
|
hasSetSourceRules = false; // 用来限制rules的重复值
|
|
139
145
|
[propName: string]: any // 支持用户自定义属性
|
|
140
146
|
|
|
141
|
-
constructor(data: NodeConfig
|
|
147
|
+
constructor(data: NodeConfig<P>, graphModel: GraphModel) {
|
|
142
148
|
this.graphModel = graphModel
|
|
143
|
-
this.properties = data.properties
|
|
149
|
+
this.properties = data.properties ?? ({} as P)
|
|
144
150
|
|
|
145
151
|
this.initNodeData(data)
|
|
146
152
|
this.setAttributes()
|
|
@@ -169,9 +175,9 @@ export class BaseNodeModel implements IBaseNodeModel {
|
|
|
169
175
|
/**
|
|
170
176
|
* @overridable 可以重写
|
|
171
177
|
* 初始化节点数据
|
|
172
|
-
* initNodeData和setAttributes的区别在于
|
|
173
|
-
* initNodeData只在节点初始化的时候调用,用于初始化节点的所有属性。
|
|
174
|
-
* setAttributes除了初始化调用外,还会在properties发生变化了调用。
|
|
178
|
+
* initNodeData 和 setAttributes 的区别在于
|
|
179
|
+
* initNodeData 只在节点初始化的时候调用,用于初始化节点的所有属性。
|
|
180
|
+
* setAttributes 除了初始化调用外,还会在 properties 发生变化了调用。
|
|
175
181
|
*/
|
|
176
182
|
public initNodeData(data: NodeConfig) {
|
|
177
183
|
if (!data.properties) {
|
|
@@ -188,7 +194,8 @@ export class BaseNodeModel implements IBaseNodeModel {
|
|
|
188
194
|
|
|
189
195
|
this.formatText(data)
|
|
190
196
|
// 在下面又将 NodeConfig 中的数据赋值给了 this,应该会触发 setAttributes,确认是否符合预期
|
|
191
|
-
|
|
197
|
+
// TODO: 确认 constructor 中赋值 properties 是否必要,此处将 NodeConfig 中所有属性赋值给 this,包括 rotate、rotatable,resizable 等
|
|
198
|
+
assign(this, pickNodeConfig(data))
|
|
192
199
|
|
|
193
200
|
const { overlapMode } = this.graphModel
|
|
194
201
|
if (overlapMode === OverlapMode.INCREASE) {
|
|
@@ -363,7 +370,7 @@ export class BaseNodeModel implements IBaseNodeModel {
|
|
|
363
370
|
const { textStyle = {} } = this.properties
|
|
364
371
|
return {
|
|
365
372
|
...cloneDeep(nodeText),
|
|
366
|
-
...cloneDeep(textStyle
|
|
373
|
+
...cloneDeep(textStyle),
|
|
367
374
|
}
|
|
368
375
|
}
|
|
369
376
|
|
|
@@ -743,12 +750,12 @@ export class BaseNodeModel implements IBaseNodeModel {
|
|
|
743
750
|
this.isShowAnchor = flag
|
|
744
751
|
}
|
|
745
752
|
|
|
746
|
-
@action
|
|
747
|
-
this.
|
|
753
|
+
@action setRotatable(flag = true): void {
|
|
754
|
+
this.rotatable = flag
|
|
748
755
|
}
|
|
749
756
|
|
|
750
|
-
@action
|
|
751
|
-
this.
|
|
757
|
+
@action setResizable(flag = true): void {
|
|
758
|
+
this.resizable = flag
|
|
752
759
|
}
|
|
753
760
|
|
|
754
761
|
@action setHitable(flag = true): void {
|
|
@@ -18,9 +18,11 @@ export type ICircleNodeProperties = {
|
|
|
18
18
|
[key: string]: any
|
|
19
19
|
}
|
|
20
20
|
|
|
21
|
-
export class CircleNodeModel
|
|
21
|
+
export class CircleNodeModel<
|
|
22
|
+
P extends ICircleNodeProperties = ICircleNodeProperties,
|
|
23
|
+
> extends BaseNodeModel<P> {
|
|
22
24
|
modelType = ModelType.CIRCLE_NODE
|
|
23
|
-
@observable properties: ICircleNodeProperties = {}
|
|
25
|
+
// @observable properties: ICircleNodeProperties = {}
|
|
24
26
|
@observable r = 50
|
|
25
27
|
|
|
26
28
|
@computed get width(): number {
|
|
@@ -31,9 +33,9 @@ export class CircleNodeModel extends BaseNodeModel {
|
|
|
31
33
|
return this.r * 2
|
|
32
34
|
}
|
|
33
35
|
|
|
34
|
-
constructor(data: NodeConfig
|
|
36
|
+
constructor(data: NodeConfig<P>, graphModel: GraphModel) {
|
|
35
37
|
super(data, graphModel)
|
|
36
|
-
this.properties = data.properties || {}
|
|
38
|
+
// this.properties = data.properties || {}
|
|
37
39
|
|
|
38
40
|
this.setAttributes()
|
|
39
41
|
}
|
|
@@ -18,18 +18,20 @@ export type IDiamondNodeProperties = {
|
|
|
18
18
|
style?: LogicFlow.CommonTheme
|
|
19
19
|
textStyle?: LogicFlow.CommonTheme
|
|
20
20
|
|
|
21
|
-
[key: string]:
|
|
21
|
+
[key: string]: unknown
|
|
22
22
|
}
|
|
23
23
|
|
|
24
|
-
export class DiamondNodeModel
|
|
24
|
+
export class DiamondNodeModel<
|
|
25
|
+
P extends IDiamondNodeProperties = IDiamondNodeProperties,
|
|
26
|
+
> extends BaseNodeModel<P> {
|
|
25
27
|
modelType = ModelType.DIAMOND_NODE
|
|
26
28
|
@observable rx = 30
|
|
27
29
|
@observable ry = 50
|
|
28
|
-
@observable properties: IDiamondNodeProperties = {}
|
|
30
|
+
// @observable properties: IDiamondNodeProperties = {}
|
|
29
31
|
|
|
30
|
-
constructor(data: NodeConfig
|
|
32
|
+
constructor(data: NodeConfig<P>, graphModel: GraphModel) {
|
|
31
33
|
super(data, graphModel)
|
|
32
|
-
this.properties = data.properties || {}
|
|
34
|
+
// this.properties = data.properties || {}
|
|
33
35
|
|
|
34
36
|
this.setAttributes()
|
|
35
37
|
}
|
|
@@ -16,18 +16,20 @@ export type IEllipseNodeProperties = {
|
|
|
16
16
|
style?: LogicFlow.CommonTheme
|
|
17
17
|
textStyle?: LogicFlow.CommonTheme
|
|
18
18
|
|
|
19
|
-
[key: string]:
|
|
19
|
+
[key: string]: unknown
|
|
20
20
|
}
|
|
21
21
|
|
|
22
|
-
export class EllipseNodeModel
|
|
22
|
+
export class EllipseNodeModel<
|
|
23
|
+
P extends IEllipseNodeProperties = IEllipseNodeProperties,
|
|
24
|
+
> extends BaseNodeModel<P> {
|
|
23
25
|
modelType = ModelType.ELLIPSE_NODE
|
|
24
26
|
@observable rx = 30
|
|
25
27
|
@observable ry = 45
|
|
26
|
-
@observable properties: IEllipseNodeProperties = {}
|
|
28
|
+
// @observable properties: IEllipseNodeProperties = {}
|
|
27
29
|
|
|
28
|
-
constructor(data: NodeConfig
|
|
30
|
+
constructor(data: NodeConfig<P>, graphModel: GraphModel) {
|
|
29
31
|
super(data, graphModel)
|
|
30
|
-
this.properties = data.properties || {}
|
|
32
|
+
// this.properties = data.properties || {}
|
|
31
33
|
|
|
32
34
|
this.setAttributes()
|
|
33
35
|
}
|