@logicflow/core 2.0.0-beta.1 → 2.0.0-beta.3
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 +9 -3
- package/es/LogicFlow.d.ts +37 -20
- package/es/LogicFlow.js +27 -24
- package/es/LogicFlow.js.map +1 -1
- package/es/common/drag.d.ts +51 -0
- package/es/common/drag.js +145 -0
- package/es/common/drag.js.map +1 -0
- package/es/common/history.d.ts +28 -0
- package/es/common/history.js +92 -0
- package/es/common/history.js.map +1 -0
- package/es/common/index.d.ts +5 -0
- package/es/common/index.js +6 -0
- package/es/common/index.js.map +1 -0
- package/es/common/keyboard.d.ts +34 -0
- package/es/common/keyboard.js +80 -0
- package/es/common/keyboard.js.map +1 -0
- package/es/common/matrix.d.ts +30 -0
- package/es/common/matrix.js +155 -0
- package/es/common/matrix.js.map +1 -0
- package/es/common/vector.d.ts +23 -0
- package/es/common/vector.js +97 -0
- package/es/common/vector.js.map +1 -0
- package/es/event/eventEmitter.js +1 -1
- package/es/event/eventEmitter.js.map +1 -1
- package/es/index.d.ts +1 -1
- package/es/index.js +1 -1
- package/es/index.js.map +1 -1
- package/es/model/SnaplineModel.d.ts +2 -0
- package/es/model/edge/BaseEdgeModel.d.ts +5 -9
- package/es/model/edge/BaseEdgeModel.js +26 -23
- package/es/model/edge/BaseEdgeModel.js.map +1 -1
- package/es/model/edge/BezierEdgeModel.d.ts +2 -0
- package/es/model/edge/LineEdgeModel.d.ts +2 -0
- package/es/model/edge/PolylineEdgeModel.d.ts +2 -0
- package/es/model/node/BaseNodeModel.js +22 -21
- package/es/model/node/BaseNodeModel.js.map +1 -1
- package/es/model/node/CircleNodeModel.d.ts +2 -0
- package/es/model/node/CircleNodeModel.js +2 -2
- package/es/model/node/CircleNodeModel.js.map +1 -1
- package/es/model/node/DiamondNodeModel.d.ts +2 -0
- package/es/model/node/DiamondNodeModel.js +2 -1
- package/es/model/node/DiamondNodeModel.js.map +1 -1
- package/es/model/node/EllipseNodeModel.d.ts +2 -0
- package/es/model/node/EllipseNodeModel.js +2 -1
- package/es/model/node/EllipseNodeModel.js.map +1 -1
- package/es/model/node/HtmlNodeModel.d.ts +2 -2
- package/es/model/node/HtmlNodeModel.js.map +1 -1
- package/es/model/node/PolygonNodeModel.d.ts +2 -0
- package/es/model/node/PolygonNodeModel.js +2 -2
- package/es/model/node/PolygonNodeModel.js.map +1 -1
- package/es/model/node/RectNodeModel.d.ts +3 -0
- package/es/model/node/RectNodeModel.js +8 -2
- package/es/model/node/RectNodeModel.js.map +1 -1
- package/es/model/node/TextNodeModel.d.ts +4 -2
- package/es/options.d.ts +2 -2
- package/es/options.js +2 -11
- package/es/options.js.map +1 -1
- package/es/tool/tool.js.map +1 -1
- package/es/util/edge.d.ts +6 -0
- package/es/util/edge.js +15 -1
- package/es/util/edge.js.map +1 -1
- package/es/util/node.d.ts +6 -2
- package/es/util/node.js +22 -7
- package/es/util/node.js.map +1 -1
- package/es/view/Anchor.d.ts +1 -1
- package/es/view/Anchor.js +3 -3
- package/es/view/Anchor.js.map +1 -1
- package/es/view/Control.js +14 -2
- package/es/view/Control.js.map +1 -1
- package/es/view/Graph.d.ts +3 -0
- package/es/view/Graph.js +38 -3
- package/es/view/Graph.js.map +1 -1
- package/es/view/edge/AdjustPoint.js +3 -3
- package/es/view/edge/AdjustPoint.js.map +1 -1
- package/es/view/edge/BaseEdge.d.ts +2 -2
- package/es/view/edge/BaseEdge.js +5 -5
- package/es/view/node/BaseNode.d.ts +2 -2
- package/es/view/node/BaseNode.js +5 -5
- package/es/view/node/TextNode.js +1 -1
- package/es/view/node/TextNode.js.map +1 -1
- package/es/view/shape/Circle.d.ts +9 -1
- package/es/view/shape/Circle.js +5 -5
- package/es/view/shape/Circle.js.map +1 -1
- package/es/view/shape/Ellipse.d.ts +10 -1
- package/es/view/shape/Ellipse.js +5 -5
- package/es/view/shape/Ellipse.js.map +1 -1
- package/es/view/shape/Line.d.ts +14 -1
- package/es/view/shape/Line.js +5 -7
- package/es/view/shape/Line.js.map +1 -1
- package/es/view/shape/Path.d.ts +3 -2
- package/es/view/shape/Path.js +3 -3
- package/es/view/shape/Path.js.map +1 -1
- package/es/view/shape/Polygon.d.ts +5 -3
- package/es/view/shape/Polygon.js +6 -6
- package/es/view/shape/Polygon.js.map +1 -1
- package/es/view/shape/Polyline.d.ts +7 -1
- package/es/view/shape/Polyline.js +8 -6
- package/es/view/shape/Polyline.js.map +1 -1
- package/es/view/shape/Rect.d.ts +11 -13
- package/es/view/shape/Rect.js +6 -9
- package/es/view/shape/Rect.js.map +1 -1
- package/es/view/shape/Text.d.ts +19 -1
- package/es/view/shape/Text.js +28 -21
- package/es/view/shape/Text.js.map +1 -1
- package/es/view/text/BaseText.d.ts +12 -15
- package/es/view/text/BaseText.js +37 -27
- package/es/view/text/BaseText.js.map +1 -1
- package/es/view/text/LineText.d.ts +19 -7
- package/es/view/text/LineText.js +62 -54
- package/es/view/text/LineText.js.map +1 -1
- package/lib/LogicFlow.d.ts +37 -20
- package/lib/LogicFlow.js +26 -23
- package/lib/LogicFlow.js.map +1 -1
- package/lib/common/drag.d.ts +51 -0
- package/lib/common/drag.js +148 -0
- package/lib/common/drag.js.map +1 -0
- package/lib/common/history.d.ts +28 -0
- package/lib/common/history.js +95 -0
- package/lib/common/history.js.map +1 -0
- package/lib/common/index.d.ts +5 -0
- package/lib/common/index.js +22 -0
- package/lib/common/index.js.map +1 -0
- package/lib/common/keyboard.d.ts +34 -0
- package/lib/common/keyboard.js +86 -0
- package/lib/common/keyboard.js.map +1 -0
- package/lib/common/matrix.d.ts +30 -0
- package/lib/common/matrix.js +158 -0
- package/lib/common/matrix.js.map +1 -0
- package/lib/common/vector.d.ts +23 -0
- package/lib/common/vector.js +101 -0
- package/lib/common/vector.js.map +1 -0
- package/lib/event/eventEmitter.js +1 -1
- package/lib/event/eventEmitter.js.map +1 -1
- package/lib/index.d.ts +1 -1
- package/lib/index.js +2 -2
- package/lib/index.js.map +1 -1
- package/lib/model/SnaplineModel.d.ts +2 -0
- package/lib/model/edge/BaseEdgeModel.d.ts +5 -9
- package/lib/model/edge/BaseEdgeModel.js +25 -22
- package/lib/model/edge/BaseEdgeModel.js.map +1 -1
- package/lib/model/edge/BezierEdgeModel.d.ts +2 -0
- package/lib/model/edge/LineEdgeModel.d.ts +2 -0
- package/lib/model/edge/PolylineEdgeModel.d.ts +2 -0
- package/lib/model/node/BaseNodeModel.js +21 -20
- package/lib/model/node/BaseNodeModel.js.map +1 -1
- package/lib/model/node/CircleNodeModel.d.ts +2 -0
- package/lib/model/node/CircleNodeModel.js +2 -2
- package/lib/model/node/CircleNodeModel.js.map +1 -1
- package/lib/model/node/DiamondNodeModel.d.ts +2 -0
- package/lib/model/node/DiamondNodeModel.js +2 -1
- package/lib/model/node/DiamondNodeModel.js.map +1 -1
- package/lib/model/node/EllipseNodeModel.d.ts +2 -0
- package/lib/model/node/EllipseNodeModel.js +2 -1
- package/lib/model/node/EllipseNodeModel.js.map +1 -1
- package/lib/model/node/HtmlNodeModel.d.ts +2 -2
- package/lib/model/node/HtmlNodeModel.js.map +1 -1
- package/lib/model/node/PolygonNodeModel.d.ts +2 -0
- package/lib/model/node/PolygonNodeModel.js +2 -2
- package/lib/model/node/PolygonNodeModel.js.map +1 -1
- package/lib/model/node/RectNodeModel.d.ts +3 -0
- package/lib/model/node/RectNodeModel.js +8 -2
- package/lib/model/node/RectNodeModel.js.map +1 -1
- package/lib/model/node/TextNodeModel.d.ts +4 -2
- package/lib/options.d.ts +2 -2
- package/lib/options.js +2 -11
- package/lib/options.js.map +1 -1
- package/lib/tool/tool.js.map +1 -1
- package/lib/util/edge.d.ts +6 -0
- package/lib/util/edge.js +16 -1
- package/lib/util/edge.js.map +1 -1
- package/lib/util/node.d.ts +6 -2
- package/lib/util/node.js +24 -9
- package/lib/util/node.js.map +1 -1
- package/lib/view/Anchor.d.ts +1 -1
- package/lib/view/Anchor.js +2 -2
- package/lib/view/Anchor.js.map +1 -1
- package/lib/view/Control.js +14 -2
- package/lib/view/Control.js.map +1 -1
- package/lib/view/Graph.d.ts +3 -0
- package/lib/view/Graph.js +37 -2
- package/lib/view/Graph.js.map +1 -1
- package/lib/view/edge/AdjustPoint.js +2 -2
- package/lib/view/edge/AdjustPoint.js.map +1 -1
- package/lib/view/edge/BaseEdge.d.ts +2 -2
- package/lib/view/edge/BaseEdge.js +5 -5
- package/lib/view/node/BaseNode.d.ts +2 -2
- package/lib/view/node/BaseNode.js +5 -5
- package/lib/view/node/TextNode.js +1 -1
- package/lib/view/node/TextNode.js.map +1 -1
- package/lib/view/shape/Circle.d.ts +9 -1
- package/lib/view/shape/Circle.js +5 -5
- package/lib/view/shape/Circle.js.map +1 -1
- package/lib/view/shape/Ellipse.d.ts +10 -1
- package/lib/view/shape/Ellipse.js +5 -5
- package/lib/view/shape/Ellipse.js.map +1 -1
- package/lib/view/shape/Line.d.ts +14 -1
- package/lib/view/shape/Line.js +5 -7
- package/lib/view/shape/Line.js.map +1 -1
- package/lib/view/shape/Path.d.ts +3 -2
- package/lib/view/shape/Path.js +3 -3
- package/lib/view/shape/Path.js.map +1 -1
- package/lib/view/shape/Polygon.d.ts +5 -3
- package/lib/view/shape/Polygon.js +6 -6
- package/lib/view/shape/Polygon.js.map +1 -1
- package/lib/view/shape/Polyline.d.ts +7 -1
- package/lib/view/shape/Polyline.js +8 -6
- package/lib/view/shape/Polyline.js.map +1 -1
- package/lib/view/shape/Rect.d.ts +11 -13
- package/lib/view/shape/Rect.js +6 -9
- package/lib/view/shape/Rect.js.map +1 -1
- package/lib/view/shape/Text.d.ts +19 -1
- package/lib/view/shape/Text.js +29 -21
- package/lib/view/shape/Text.js.map +1 -1
- package/lib/view/text/BaseText.d.ts +12 -15
- package/lib/view/text/BaseText.js +40 -27
- package/lib/view/text/BaseText.js.map +1 -1
- package/lib/view/text/LineText.d.ts +19 -7
- package/lib/view/text/LineText.js +62 -57
- package/lib/view/text/LineText.js.map +1 -1
- package/package.json +2 -1
- package/src/LogicFlow.tsx +97 -55
- package/src/common/drag.ts +205 -0
- package/src/common/history.ts +108 -0
- package/src/common/index.ts +6 -0
- package/src/common/keyboard.ts +108 -0
- package/src/common/matrix.ts +122 -0
- package/src/common/vector.ts +93 -0
- package/src/event/eventEmitter.ts +1 -1
- package/src/index.ts +1 -1
- package/src/model/edge/BaseEdgeModel.ts +31 -21
- package/src/model/node/BaseNodeModel.ts +27 -19
- package/src/model/node/CircleNodeModel.ts +2 -2
- package/src/model/node/DiamondNodeModel.ts +2 -0
- package/src/model/node/EllipseNodeModel.ts +2 -0
- package/src/model/node/HtmlNodeModel.ts +2 -2
- package/src/model/node/PolygonNodeModel.ts +2 -2
- package/src/model/node/RectNodeModel.ts +9 -2
- package/src/options.ts +4 -13
- package/src/tool/tool.ts +1 -1
- package/src/util/edge.ts +26 -1
- package/src/util/node.ts +29 -8
- package/src/view/Anchor.tsx +4 -4
- package/src/view/Control.tsx +5 -2
- package/src/view/Graph.tsx +14 -2
- package/src/view/edge/AdjustPoint.tsx +3 -3
- package/src/view/edge/BaseEdge.tsx +7 -7
- package/src/view/node/BaseNode.tsx +7 -7
- package/src/view/node/TextNode.tsx +1 -1
- package/src/view/shape/Circle.tsx +21 -7
- package/src/view/shape/Ellipse.tsx +20 -6
- package/src/view/shape/Line.tsx +24 -9
- package/src/view/shape/Path.tsx +9 -6
- package/src/view/shape/Polygon.tsx +13 -10
- package/src/view/shape/Polyline.tsx +20 -8
- package/src/view/shape/Rect.tsx +19 -19
- package/src/view/shape/Text.tsx +64 -33
- package/src/view/text/BaseText.tsx +67 -41
- package/src/view/text/LineText.tsx +94 -80
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"LineText.js","sourceRoot":"","sources":["../../../src/view/text/LineText.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"LineText.js","sourceRoot":"","sources":["../../../src/view/text/LineText.tsx"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@logicflow/core",
|
|
3
|
-
"version": "2.0.0-beta.
|
|
3
|
+
"version": "2.0.0-beta.3",
|
|
4
4
|
"description": "LogicFlow, help you quickly create flowcharts",
|
|
5
5
|
"main": "lib/index.js",
|
|
6
6
|
"module": "es/index.js",
|
|
@@ -24,6 +24,7 @@
|
|
|
24
24
|
"author": "Logicflow-Team",
|
|
25
25
|
"license": "Apache-2.0",
|
|
26
26
|
"dependencies": {
|
|
27
|
+
"lodash-es": "^4.17.21",
|
|
27
28
|
"classnames": "^2.3.2",
|
|
28
29
|
"mobx": "^5.15.7",
|
|
29
30
|
"mobx-preact": "^3.0.0",
|
package/src/LogicFlow.tsx
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { ComponentType, createElement as h, render } from 'preact/compat'
|
|
2
|
-
import { cloneDeep, forEach } from 'lodash-es'
|
|
2
|
+
import { cloneDeep, forEach, indexOf } from 'lodash-es'
|
|
3
3
|
import { observer } from '.'
|
|
4
4
|
import { Options as LFOptions } from './options'
|
|
5
5
|
import * as _Model from './model'
|
|
@@ -24,8 +24,9 @@ import History from './history'
|
|
|
24
24
|
import { EventCallback, CallbackArgs, EventArgs } from './event/eventEmitter'
|
|
25
25
|
import { ElementType, EventType, SegmentDirection } from './constant'
|
|
26
26
|
import { initDefaultShortcut } from './keyboard/shortcut'
|
|
27
|
+
|
|
27
28
|
import Extension = LogicFlow.Extension
|
|
28
|
-
import
|
|
29
|
+
import ExtensionConfig = LogicFlow.ExtensionConfig
|
|
29
30
|
import ExtensionConstructor = LogicFlow.ExtensionConstructor
|
|
30
31
|
import GraphConfigData = LogicFlow.GraphConfigData
|
|
31
32
|
import NodeConfig = LogicFlow.NodeConfig
|
|
@@ -38,11 +39,13 @@ import RegisterParam = LogicFlow.RegisterParam
|
|
|
38
39
|
import GraphElements = LogicFlow.GraphElements
|
|
39
40
|
import Position = LogicFlow.Position
|
|
40
41
|
import PointTuple = LogicFlow.PointTuple
|
|
41
|
-
import
|
|
42
|
+
import ExtensionRenderFunc = LogicFlow.ExtensionRenderFunc
|
|
42
43
|
import RegisterElementFunc = LogicFlow.RegisterElementFunc
|
|
43
44
|
import PropertiesType = LogicFlow.PropertiesType
|
|
44
45
|
import BaseNodeModelCtor = LogicFlow.BaseNodeModelCtor
|
|
45
46
|
import ClientPosition = LogicFlow.ClientPosition
|
|
47
|
+
import ExtensionDefinition = LogicFlow.ExtensionDefinition
|
|
48
|
+
import ExtensionType = LogicFlow.ExtensionType
|
|
46
49
|
|
|
47
50
|
const pluginFlag = Symbol('plugin registered by Logicflow.use')
|
|
48
51
|
|
|
@@ -61,13 +64,13 @@ export class LogicFlow {
|
|
|
61
64
|
tool: Tool
|
|
62
65
|
snaplineModel?: SnaplineModel
|
|
63
66
|
|
|
64
|
-
components:
|
|
67
|
+
components: ExtensionRenderFunc[] = []
|
|
65
68
|
// 个性配置的插件,覆盖全局配置的插件
|
|
66
|
-
readonly plugins:
|
|
69
|
+
readonly plugins: ExtensionType[]
|
|
67
70
|
// 全局配置的插件,所有的LogicFlow示例都会使用
|
|
68
|
-
static extensions: Map<string,
|
|
71
|
+
static extensions: Map<string, ExtensionConfig> = new Map()
|
|
69
72
|
// 插件扩展方法
|
|
70
|
-
extension: Record<string, Extension> = {}
|
|
73
|
+
extension: Record<string, Extension | ExtensionDefinition> = {}
|
|
71
74
|
|
|
72
75
|
readonly width?: number // 只读:画布宽度
|
|
73
76
|
readonly height?: number // 只读:画布高度
|
|
@@ -78,19 +81,23 @@ export class LogicFlow {
|
|
|
78
81
|
* 包括 adapterIn 和 adapterOut 两个方法
|
|
79
82
|
*/
|
|
80
83
|
// TODO: 如何让用户执行时定义下面方法参数和返回值的类型
|
|
81
|
-
|
|
82
|
-
|
|
84
|
+
adapterIn?: (data: unknown) => GraphData
|
|
85
|
+
adapterOut?: (data: GraphData, ...rest: any) => unknown;
|
|
83
86
|
|
|
84
87
|
// 支持插件在 LogicFlow 实例上增加自定义方法
|
|
85
88
|
[propName: string]: any
|
|
86
89
|
|
|
87
|
-
private initContainer(
|
|
90
|
+
private initContainer(
|
|
91
|
+
container: HTMLElement | HTMLDivElement,
|
|
92
|
+
width?: number,
|
|
93
|
+
height?: number,
|
|
94
|
+
) {
|
|
88
95
|
// TODO: 确认是否需要,后续是否只要返回 container 即可(下面方法是为了解决事件绑定问题的)
|
|
89
96
|
// fix: destroy keyboard events while destroy LogicFlow.(#1110)
|
|
90
97
|
const lfContainer = document.createElement('div')
|
|
91
98
|
lfContainer.style.position = 'relative'
|
|
92
|
-
lfContainer.style.width = '100%'
|
|
93
|
-
lfContainer.style.height = '100%'
|
|
99
|
+
lfContainer.style.width = width ? `${width}px` : '100%'
|
|
100
|
+
lfContainer.style.height = height ? `${height}px` : '100%'
|
|
94
101
|
container.innerHTML = ''
|
|
95
102
|
container.appendChild(lfContainer)
|
|
96
103
|
return lfContainer
|
|
@@ -102,8 +109,9 @@ export class LogicFlow {
|
|
|
102
109
|
|
|
103
110
|
constructor(options: LFOptions.Common) {
|
|
104
111
|
const initOptions = LFOptions.get(options)
|
|
112
|
+
const { container, width, height } = initOptions
|
|
105
113
|
this.options = initOptions
|
|
106
|
-
this.container = this.initContainer(
|
|
114
|
+
this.container = this.initContainer(container, width, height)
|
|
107
115
|
this.graphModel = new GraphModel({
|
|
108
116
|
...initOptions,
|
|
109
117
|
container: this.container, // TODO:测试该部分是否会有问题
|
|
@@ -1292,19 +1300,14 @@ export class LogicFlow {
|
|
|
1292
1300
|
* @param props
|
|
1293
1301
|
*/
|
|
1294
1302
|
static use(
|
|
1295
|
-
extension: ExtensionConstructor,
|
|
1303
|
+
extension: ExtensionConstructor | ExtensionDefinition,
|
|
1296
1304
|
props?: Record<string, unknown>,
|
|
1297
1305
|
): void {
|
|
1298
|
-
|
|
1306
|
+
const { pluginName } = extension
|
|
1299
1307
|
if (!pluginName) {
|
|
1300
|
-
|
|
1301
|
-
`请给插件${
|
|
1302
|
-
extension.name || extension.constructor.name
|
|
1303
|
-
}指定pluginName!`,
|
|
1304
|
-
)
|
|
1305
|
-
pluginName = extension.name // 兼容以前name的情况,1.0版本去掉。
|
|
1308
|
+
throw new Error(`请给插件指定 pluginName!`)
|
|
1306
1309
|
}
|
|
1307
|
-
// TODO:
|
|
1310
|
+
// TODO: 应该在何时进行插件的销毁???
|
|
1308
1311
|
// const preExtension = this.extensions.get(pluginName)?.extension
|
|
1309
1312
|
// preExtension?.destroy?.() // 该代码应该有问题,因为 preExtension 直接用的是 Constructor,没有实例化。无法访问实例方法 destroy
|
|
1310
1313
|
|
|
@@ -1316,19 +1319,26 @@ export class LogicFlow {
|
|
|
1316
1319
|
}
|
|
1317
1320
|
|
|
1318
1321
|
private installPlugins(disabledPlugins: string[] = []) {
|
|
1322
|
+
const extensionsAddByUse = Array.from(
|
|
1323
|
+
LogicFlow.extensions,
|
|
1324
|
+
([, extension]) => extension,
|
|
1325
|
+
)
|
|
1319
1326
|
// 安装插件,优先使用个性插件
|
|
1320
|
-
const extensions = this.plugins
|
|
1321
|
-
|
|
1322
|
-
let extension:
|
|
1323
|
-
let props
|
|
1324
|
-
|
|
1327
|
+
const extensions = [...extensionsAddByUse, ...this.plugins]
|
|
1328
|
+
forEach(extensions, (ext) => {
|
|
1329
|
+
let extension: ExtensionConstructor | ExtensionDefinition
|
|
1330
|
+
let props: Record<string, any> | undefined
|
|
1331
|
+
|
|
1332
|
+
if (pluginFlag in ext) {
|
|
1325
1333
|
extension = ext.extension
|
|
1326
1334
|
props = ext.props
|
|
1327
1335
|
} else {
|
|
1328
1336
|
extension = ext
|
|
1329
1337
|
}
|
|
1330
|
-
|
|
1331
|
-
|
|
1338
|
+
|
|
1339
|
+
const pluginName = extension?.pluginName
|
|
1340
|
+
|
|
1341
|
+
if (indexOf(disabledPlugins, pluginName) === -1) {
|
|
1332
1342
|
this.installPlugin(extension, props)
|
|
1333
1343
|
}
|
|
1334
1344
|
})
|
|
@@ -1337,31 +1347,38 @@ export class LogicFlow {
|
|
|
1337
1347
|
/**
|
|
1338
1348
|
* 加载插件-内部方法
|
|
1339
1349
|
*/
|
|
1340
|
-
private installPlugin(
|
|
1341
|
-
|
|
1342
|
-
|
|
1350
|
+
private installPlugin(
|
|
1351
|
+
extension: ExtensionConstructor | ExtensionDefinition,
|
|
1352
|
+
props?: Record<string, any>,
|
|
1353
|
+
) {
|
|
1354
|
+
if ('pluginName' in extension && 'install' in extension) {
|
|
1355
|
+
const { pluginName, install, render } = extension
|
|
1343
1356
|
if (pluginName) {
|
|
1344
1357
|
install && install.call(extension, this, LogicFlow)
|
|
1345
|
-
|
|
1358
|
+
render && this.components.push(render.bind(extension))
|
|
1346
1359
|
this.extension[pluginName] = extension
|
|
1347
1360
|
}
|
|
1348
1361
|
return
|
|
1349
1362
|
}
|
|
1350
|
-
|
|
1351
|
-
const
|
|
1363
|
+
|
|
1364
|
+
const ExtensionCtor = extension as ExtensionConstructor
|
|
1365
|
+
const extensionIns = new ExtensionCtor({
|
|
1352
1366
|
lf: this,
|
|
1353
1367
|
LogicFlow,
|
|
1354
|
-
options: this.options.pluginsOptions ?? {},
|
|
1355
1368
|
props,
|
|
1369
|
+
options: this.options.pluginsOptions ?? {},
|
|
1356
1370
|
})
|
|
1357
|
-
|
|
1358
|
-
this.components.push(
|
|
1359
|
-
this.extension[
|
|
1371
|
+
extensionIns.render &&
|
|
1372
|
+
this.components.push(extensionIns.render.bind(extensionIns))
|
|
1373
|
+
this.extension[ExtensionCtor.pluginName] = extensionIns
|
|
1360
1374
|
}
|
|
1361
1375
|
}
|
|
1362
1376
|
|
|
1363
1377
|
// Option
|
|
1364
1378
|
export namespace LogicFlow {
|
|
1379
|
+
/**
|
|
1380
|
+
* LogicFlow init Options
|
|
1381
|
+
*/
|
|
1365
1382
|
export interface Options extends LFOptions.Common {}
|
|
1366
1383
|
|
|
1367
1384
|
export type DomAttributes = {
|
|
@@ -1376,6 +1393,7 @@ export namespace LogicFlow {
|
|
|
1376
1393
|
ry?: number
|
|
1377
1394
|
} & Record<string, any>
|
|
1378
1395
|
export type AttributesType = Record<string, any>
|
|
1396
|
+
|
|
1379
1397
|
export type VectorData = {
|
|
1380
1398
|
deltaX: number
|
|
1381
1399
|
deltaY: number
|
|
@@ -1390,7 +1408,7 @@ export namespace LogicFlow {
|
|
|
1390
1408
|
}
|
|
1391
1409
|
export type Point = {
|
|
1392
1410
|
id?: string
|
|
1393
|
-
[key: string]: any
|
|
1411
|
+
[key: string]: any // TODO: 确认这个属性是干什么的呢?是有可以移除
|
|
1394
1412
|
} & Position
|
|
1395
1413
|
export type PointTuple = [number, number]
|
|
1396
1414
|
export type ClientPosition = {
|
|
@@ -1420,9 +1438,12 @@ export namespace LogicFlow {
|
|
|
1420
1438
|
}
|
|
1421
1439
|
export type TextConfig = {
|
|
1422
1440
|
value: string
|
|
1441
|
+
x: number
|
|
1442
|
+
y: number
|
|
1423
1443
|
editable?: boolean
|
|
1424
1444
|
draggable?: boolean
|
|
1425
|
-
|
|
1445
|
+
// overflowMode?: 'default' | 'autoWrap' | 'ellipsis'
|
|
1446
|
+
}
|
|
1426
1447
|
|
|
1427
1448
|
export type AppendConfig = {
|
|
1428
1449
|
startIndex: number
|
|
@@ -1553,6 +1574,8 @@ export namespace LogicFlow {
|
|
|
1553
1574
|
radius?: number
|
|
1554
1575
|
rx?: number
|
|
1555
1576
|
ry?: number
|
|
1577
|
+
width?: number
|
|
1578
|
+
height?: number
|
|
1556
1579
|
path?: string
|
|
1557
1580
|
[key: string]: unknown
|
|
1558
1581
|
}
|
|
@@ -1636,6 +1659,7 @@ export namespace LogicFlow {
|
|
|
1636
1659
|
* ellipsis: 超出省略
|
|
1637
1660
|
*/
|
|
1638
1661
|
overflowMode?: 'default' | 'autoWrap' | 'ellipsis'
|
|
1662
|
+
textWidth?: number
|
|
1639
1663
|
background?: RectTheme
|
|
1640
1664
|
/**
|
|
1641
1665
|
* 背景区域 padding
|
|
@@ -1643,6 +1667,7 @@ export namespace LogicFlow {
|
|
|
1643
1667
|
*/
|
|
1644
1668
|
wrapPadding?: string
|
|
1645
1669
|
} & TextTheme
|
|
1670
|
+
|
|
1646
1671
|
// 边上文本样式
|
|
1647
1672
|
export type EdgeTextTheme = {
|
|
1648
1673
|
textWidth: number
|
|
@@ -1755,8 +1780,14 @@ export namespace LogicFlow {
|
|
|
1755
1780
|
|
|
1756
1781
|
// Render or Functions
|
|
1757
1782
|
export namespace LogicFlow {
|
|
1758
|
-
type FocusOnById = {
|
|
1759
|
-
|
|
1783
|
+
type FocusOnById = {
|
|
1784
|
+
id: string
|
|
1785
|
+
coordinate?: never
|
|
1786
|
+
}
|
|
1787
|
+
type FocusOnByCoordinate = {
|
|
1788
|
+
id?: string
|
|
1789
|
+
coordinate: Position
|
|
1790
|
+
}
|
|
1760
1791
|
export type FocusOnArgsType = FocusOnById | FocusOnByCoordinate
|
|
1761
1792
|
|
|
1762
1793
|
export type BaseNodeModelCtor = typeof BaseNodeModel
|
|
@@ -1794,32 +1825,43 @@ export namespace LogicFlow {
|
|
|
1794
1825
|
new (options: LFOptions.Definition): LogicFlow
|
|
1795
1826
|
}
|
|
1796
1827
|
|
|
1797
|
-
|
|
1828
|
+
/**
|
|
1829
|
+
* Extension 插件类型
|
|
1830
|
+
*/
|
|
1831
|
+
export type ExtensionType = ExtensionConstructor | ExtensionDefinition
|
|
1832
|
+
export type ExtensionConfig = {
|
|
1798
1833
|
[pluginFlag]: symbol
|
|
1799
|
-
extension:
|
|
1800
|
-
props?: Record<string,
|
|
1834
|
+
extension: ExtensionType
|
|
1835
|
+
props?: Record<string, any> // TODO: 看这类型是否可以更精确
|
|
1801
1836
|
}
|
|
1802
1837
|
|
|
1803
|
-
export type
|
|
1838
|
+
export type IExtensionProps = {
|
|
1804
1839
|
lf: LogicFlow
|
|
1805
1840
|
LogicFlow: LogicFlowConstructor
|
|
1806
|
-
options: Record<string, unknown>
|
|
1807
1841
|
props?: Record<string, unknown>
|
|
1842
|
+
options: Record<string, unknown>
|
|
1808
1843
|
}
|
|
1809
1844
|
|
|
1810
1845
|
export interface ExtensionConstructor {
|
|
1811
1846
|
pluginName: string
|
|
1812
|
-
|
|
1813
|
-
new (props: ExtensionProps): Extension
|
|
1847
|
+
new (props: IExtensionProps): Extension
|
|
1814
1848
|
}
|
|
1815
1849
|
|
|
1816
|
-
export type
|
|
1850
|
+
export type ExtensionRenderFunc = (
|
|
1851
|
+
lf: LogicFlow,
|
|
1852
|
+
container: HTMLElement,
|
|
1853
|
+
) => void
|
|
1854
|
+
|
|
1855
|
+
// 对象形式定义的插件
|
|
1856
|
+
export type ExtensionDefinition = {
|
|
1857
|
+
pluginName: string
|
|
1858
|
+
install?: (lf: LogicFlow, LFCtor: LogicFlowConstructor) => void
|
|
1859
|
+
render?: ExtensionRenderFunc
|
|
1860
|
+
}
|
|
1817
1861
|
|
|
1818
1862
|
export interface Extension {
|
|
1819
|
-
|
|
1820
|
-
|
|
1821
|
-
render?: ExtensionRender
|
|
1822
|
-
destroy?: () => void
|
|
1863
|
+
render: ExtensionRenderFunc
|
|
1864
|
+
destroy?: () => void // TODO: 确认插件销毁函数参数类型
|
|
1823
1865
|
}
|
|
1824
1866
|
}
|
|
1825
1867
|
|
|
@@ -0,0 +1,205 @@
|
|
|
1
|
+
import { noop } from 'lodash-es'
|
|
2
|
+
import { Model } from '../model'
|
|
3
|
+
import { EventType } from '../constant'
|
|
4
|
+
import EventEmitter from '../event/eventEmitter'
|
|
5
|
+
|
|
6
|
+
// TODO:这种方式在同构项目中,会报错,该如何解决(是否要求用户控制在浏览器环境时才初始化)
|
|
7
|
+
// const DOC: any = window?.document
|
|
8
|
+
const LEFT_MOUSE_BUTTON_CODE = 0
|
|
9
|
+
|
|
10
|
+
export type IDragParams = {
|
|
11
|
+
deltaX: number
|
|
12
|
+
deltaY: number
|
|
13
|
+
event: MouseEvent | null
|
|
14
|
+
[key: string]: unknown
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
export type ICreateDragParams = {
|
|
18
|
+
onDragStart?: (params: Partial<IDragParams>) => void
|
|
19
|
+
onDragging?: (param: IDragParams) => void
|
|
20
|
+
onDragEnd?: (param: Partial<IDragParams>) => void
|
|
21
|
+
step?: number
|
|
22
|
+
isStopPropagation?: boolean
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
export type IStepperDragProps = {
|
|
26
|
+
eventType?: 'NODE' | 'BLANK' | 'SELECTION' | 'ADJUST_POINT' | ''
|
|
27
|
+
eventCenter?: EventEmitter
|
|
28
|
+
model?: Model.BaseModel
|
|
29
|
+
data?: Record<string, unknown>
|
|
30
|
+
[key: string]: unknown
|
|
31
|
+
} & Partial<ICreateDragParams>
|
|
32
|
+
/**
|
|
33
|
+
* 支持拖拽时按步长进行移动
|
|
34
|
+
* REMIND:在绘制的过程中因为放大缩小,移动的真实 step 是变化的
|
|
35
|
+
*/
|
|
36
|
+
export class StepperDrag {
|
|
37
|
+
// 初始化
|
|
38
|
+
onDragStart: (params: Partial<IDragParams>) => void
|
|
39
|
+
onDragging: (params: IDragParams) => void
|
|
40
|
+
onDragEnd: (params: Partial<IDragParams>) => void
|
|
41
|
+
|
|
42
|
+
step: number
|
|
43
|
+
isStopPropagation: boolean
|
|
44
|
+
eventType: 'NODE' | 'BLANK' | 'SELECTION' | 'ADJUST_POINT' | ''
|
|
45
|
+
eventCenter?: EventEmitter
|
|
46
|
+
model?: Model.BaseModel
|
|
47
|
+
data?: Record<string, unknown>
|
|
48
|
+
|
|
49
|
+
// 运行时
|
|
50
|
+
isDragging: boolean = false
|
|
51
|
+
isStartDrag: boolean = false
|
|
52
|
+
|
|
53
|
+
startX: number = 0
|
|
54
|
+
startY: number = 0
|
|
55
|
+
totalDeltaX: number = 0
|
|
56
|
+
totalDeltaY: number = 0
|
|
57
|
+
|
|
58
|
+
startTime?: number
|
|
59
|
+
constructor({
|
|
60
|
+
onDragStart = noop,
|
|
61
|
+
onDragging = noop,
|
|
62
|
+
onDragEnd = noop,
|
|
63
|
+
step = 1,
|
|
64
|
+
eventType = '',
|
|
65
|
+
isStopPropagation = true,
|
|
66
|
+
eventCenter,
|
|
67
|
+
model,
|
|
68
|
+
data,
|
|
69
|
+
}: IStepperDragProps) {
|
|
70
|
+
this.onDragStart = onDragStart
|
|
71
|
+
this.onDragging = onDragging
|
|
72
|
+
this.onDragEnd = onDragEnd
|
|
73
|
+
this.step = step
|
|
74
|
+
this.eventType = eventType
|
|
75
|
+
this.isStopPropagation = isStopPropagation
|
|
76
|
+
this.eventCenter = eventCenter
|
|
77
|
+
this.model = model
|
|
78
|
+
this.data = data
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
setStep(step: number) {
|
|
82
|
+
this.step = step
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
handleMouseMove = (e: MouseEvent) => {
|
|
86
|
+
if (this.isStopPropagation) e.stopPropagation()
|
|
87
|
+
if (!this.isStartDrag) return
|
|
88
|
+
|
|
89
|
+
this.totalDeltaX += e.clientX - this.startX
|
|
90
|
+
this.totalDeltaY += e.clientY - this.startY
|
|
91
|
+
this.startX = e.clientX
|
|
92
|
+
this.startY = e.clientY
|
|
93
|
+
|
|
94
|
+
if (
|
|
95
|
+
this.step <= 1 ||
|
|
96
|
+
Math.abs(this.totalDeltaX) > this.step ||
|
|
97
|
+
Math.abs(this.totalDeltaY) > this.step
|
|
98
|
+
) {
|
|
99
|
+
const remainderX = this.totalDeltaX % this.step
|
|
100
|
+
const remainderY = this.totalDeltaY % this.step
|
|
101
|
+
|
|
102
|
+
const deltaX = this.totalDeltaX - remainderX
|
|
103
|
+
const deltaY = this.totalDeltaY - remainderY
|
|
104
|
+
|
|
105
|
+
this.totalDeltaX = remainderX
|
|
106
|
+
this.totalDeltaY = remainderY
|
|
107
|
+
|
|
108
|
+
const elementData = this.model?.getData()
|
|
109
|
+
// REMIND: 为了区分点击和拖动,在鼠标没有拖动时,不触发 dragstart。
|
|
110
|
+
if (!this.isDragging) {
|
|
111
|
+
if (this.eventType) {
|
|
112
|
+
this.eventCenter?.emit(EventType[`${this.eventType}_DRAGSTART`], {
|
|
113
|
+
e,
|
|
114
|
+
data: this.data || elementData,
|
|
115
|
+
})
|
|
116
|
+
}
|
|
117
|
+
this.onDragStart({ event: e })
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
this.isDragging = true
|
|
121
|
+
// REMIND: 为了让 dragstart 和 drag 不在同一个事件循环中,将 drag 事件放在下一个任务队列中。
|
|
122
|
+
// TODO: 测试用例是否可覆盖???
|
|
123
|
+
Promise.resolve().then(() => {
|
|
124
|
+
this.onDragging({ deltaX, deltaY, event: e })
|
|
125
|
+
if (this.eventType) {
|
|
126
|
+
this.eventCenter?.emit(EventType[`${this.eventType}_MOUSEMOVE`], {
|
|
127
|
+
e,
|
|
128
|
+
data: this.data || elementData,
|
|
129
|
+
})
|
|
130
|
+
this.eventCenter?.emit(EventType[`${this.eventType}_DRAG`], {
|
|
131
|
+
e,
|
|
132
|
+
data: this.data || elementData,
|
|
133
|
+
})
|
|
134
|
+
}
|
|
135
|
+
})
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
handleMouseUp = (e: MouseEvent) => {
|
|
140
|
+
const DOC: any = window?.document
|
|
141
|
+
|
|
142
|
+
this.isStartDrag = false
|
|
143
|
+
if (this.isStopPropagation) e.stopPropagation()
|
|
144
|
+
|
|
145
|
+
// fix: issue#568, 如果 onDragging 在下一个时间循环中触发,而 drop 在当前事件循环,会出现问题
|
|
146
|
+
Promise.resolve().then(() => {
|
|
147
|
+
DOC?.removeEventListener('mousemove', this.handleMouseMove, true)
|
|
148
|
+
DOC?.removeEventListener('mouseup', this.handleMouseUp, true)
|
|
149
|
+
|
|
150
|
+
const elementData = this.model?.getData()
|
|
151
|
+
if (this.eventType) {
|
|
152
|
+
this.eventCenter?.emit(EventType[`${this.eventType}_MOUSEUP`], {
|
|
153
|
+
e,
|
|
154
|
+
data: this.data || elementData,
|
|
155
|
+
})
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
if (!this.isDragging) return
|
|
159
|
+
this.isDragging = false
|
|
160
|
+
this.onDragEnd({ event: e })
|
|
161
|
+
if (this.eventType) {
|
|
162
|
+
this.eventCenter?.emit(EventType[`${this.eventType}_DROP`], {
|
|
163
|
+
e,
|
|
164
|
+
data: this.data || elementData,
|
|
165
|
+
})
|
|
166
|
+
}
|
|
167
|
+
})
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
handleMouseDown = (e: MouseEvent) => {
|
|
171
|
+
const DOC: any = window?.document
|
|
172
|
+
|
|
173
|
+
// issue: LogicFlow交流群-3群 8.10 号抛出的事件相关的问题,是否是这引起的???
|
|
174
|
+
if (e.button !== LEFT_MOUSE_BUTTON_CODE) return
|
|
175
|
+
if (this.isStopPropagation) e.stopPropagation()
|
|
176
|
+
|
|
177
|
+
this.isStartDrag = true
|
|
178
|
+
this.startX = e.clientX
|
|
179
|
+
this.startY = e.clientY
|
|
180
|
+
|
|
181
|
+
DOC?.addEventListener('mousemove', this.handleMouseMove, true)
|
|
182
|
+
DOC?.addEventListener('mouseup', this.handleMouseUp, true)
|
|
183
|
+
|
|
184
|
+
const elementData = this.model?.getData()
|
|
185
|
+
if (this.eventType) {
|
|
186
|
+
this.eventCenter?.emit(EventType[`${this.eventType}_MOUSEDOWN`], {
|
|
187
|
+
e,
|
|
188
|
+
data: this.data || elementData,
|
|
189
|
+
})
|
|
190
|
+
}
|
|
191
|
+
this.startTime = new Date().getTime()
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
cancelDrag = () => {
|
|
195
|
+
const DOC: any = window?.document
|
|
196
|
+
|
|
197
|
+
DOC?.removeEventListener('mousemove', this.handleMouseMove, true)
|
|
198
|
+
DOC?.removeEventListener('mouseup', this.handleMouseUp, true)
|
|
199
|
+
|
|
200
|
+
this.onDragEnd({ event: null })
|
|
201
|
+
this.isDragging = false
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
|
|
205
|
+
export default StepperDrag
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
import { cloneDeep, debounce, isEqual, last } from 'lodash-es'
|
|
2
|
+
import { deepObserve, IDisposer } from 'mobx-utils'
|
|
3
|
+
import { LogicFlow } from '../LogicFlow'
|
|
4
|
+
// import { EventType } from '../constant'
|
|
5
|
+
import { GraphModel } from '../model'
|
|
6
|
+
import EventEmitter from '../event/eventEmitter'
|
|
7
|
+
|
|
8
|
+
export type HistoryData = LogicFlow.GraphConfigData
|
|
9
|
+
|
|
10
|
+
export class History {
|
|
11
|
+
undos: HistoryData[] = []
|
|
12
|
+
redos: HistoryData[] = []
|
|
13
|
+
stopWatch: IDisposer | null = null
|
|
14
|
+
curData: HistoryData | null = null
|
|
15
|
+
maxSize: number = 50
|
|
16
|
+
// 发生数据变化后,最多再等 500ms,把距离上次的数据变更存储起来。
|
|
17
|
+
// 所以 waitTime 值越小,History 对数据变化越敏感,存的 undos 数据就越细
|
|
18
|
+
waitTime: number = 100
|
|
19
|
+
eventCenter: EventEmitter
|
|
20
|
+
|
|
21
|
+
constructor(eventCenter: EventEmitter) {
|
|
22
|
+
this.eventCenter = eventCenter
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
add(data: HistoryData) {
|
|
26
|
+
if (isEqual(last(this.undos), data)) return
|
|
27
|
+
this.undos.push(data)
|
|
28
|
+
|
|
29
|
+
// 因为 undo 的时候会触发 add.
|
|
30
|
+
// 所以需要区分这个 add 是 undo 触发的还是用户正常操作触发的
|
|
31
|
+
// 如果是用户正常操作触发的,需要清空 redos
|
|
32
|
+
if (!isEqual(this.curData, data)) {
|
|
33
|
+
this.redos = []
|
|
34
|
+
}
|
|
35
|
+
// this.eventCenter.emit(EventType.HISTORY_CHANGE, {
|
|
36
|
+
// data: {
|
|
37
|
+
// undos: this.undos,
|
|
38
|
+
// redos: this.redos,
|
|
39
|
+
// undoAble: this.undos.length > 1,
|
|
40
|
+
// redoAble: this.redos.length > 0,
|
|
41
|
+
// },
|
|
42
|
+
// })
|
|
43
|
+
|
|
44
|
+
if (this.undos.length > this.maxSize) {
|
|
45
|
+
this.undos.shift()
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
undoAble() {
|
|
50
|
+
return this.undos.length > 1
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
/**
|
|
54
|
+
* undo 方法触发:
|
|
55
|
+
* graphModel 重新渲染 nodes 和 edges
|
|
56
|
+
* graphModel 发生变化,触发 watch
|
|
57
|
+
* watch 触发 add
|
|
58
|
+
*/
|
|
59
|
+
undo() {
|
|
60
|
+
if (!this.undoAble()) return
|
|
61
|
+
const preData = this.undos.pop()
|
|
62
|
+
if (preData) {
|
|
63
|
+
this.redos.push(preData)
|
|
64
|
+
}
|
|
65
|
+
const curData = this.undos.pop()
|
|
66
|
+
if (curData) {
|
|
67
|
+
this.curData = cloneDeep(curData)
|
|
68
|
+
}
|
|
69
|
+
return curData
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
redoAble() {
|
|
73
|
+
return this.redos.length > 0
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
redo() {
|
|
77
|
+
if (!this.redoAble()) return
|
|
78
|
+
const curData = this.redos.pop()
|
|
79
|
+
if (curData) {
|
|
80
|
+
this.curData = cloneDeep(curData)
|
|
81
|
+
}
|
|
82
|
+
return curData
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
watch(model: GraphModel) {
|
|
86
|
+
this.stopWatch && this.stopWatch()
|
|
87
|
+
|
|
88
|
+
// 把当前 watch 的 model 转换一下数据存起来,无需清空 redos
|
|
89
|
+
const historyData = model.modelToHistoryData()
|
|
90
|
+
if (historyData) {
|
|
91
|
+
this.undos.push(historyData)
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
this.stopWatch = deepObserve(
|
|
95
|
+
model,
|
|
96
|
+
debounce(() => {
|
|
97
|
+
// 数据变更后,把最新的当前 model 数据存起来,并清空 redos
|
|
98
|
+
// 因为这个回调函数的触发,一般是用户交互而引起的,所以按照正常逻辑需要清空 redos
|
|
99
|
+
const data = model.modelToHistoryData()
|
|
100
|
+
if (data) {
|
|
101
|
+
this.add(data)
|
|
102
|
+
}
|
|
103
|
+
}, this.waitTime),
|
|
104
|
+
)
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
export default History
|