@@ -39,7 +39,8 @@ import {
39
39
EdgeFilter ,
40
40
NodeConfig ,
41
41
NodeAttribute ,
42
- ExtensionLike ,
42
+ Extension ,
43
+ ComponentRender ,
43
44
FocusOnArgs ,
44
45
RegisterElementFn ,
45
46
RegisterParam ,
@@ -64,7 +65,7 @@ export default class LogicFlow {
64
65
width : number ;
65
66
height : number ;
66
67
graphModel : GraphModel ;
67
- history : History = new History ( ) ;
68
+ history : History ;
68
69
viewMap = new Map ( ) ;
69
70
tool : Tool ;
70
71
keyboard : Keyboard ;
@@ -73,15 +74,16 @@ export default class LogicFlow {
73
74
getSnapshot : ( ) => void ;
74
75
eventCenter : EventEmitter ;
75
76
snaplineModel : SnaplineModel ;
76
- static extensions : ExtensionLike [ ] = [ ] ;
77
+ static extensions : Extension [ ] = [ ] ;
78
+ components : ComponentRender [ ] = [ ] ;
77
79
adapterIn : ( data : unknown ) => GraphConfigData ;
78
80
adapterOut : ( data : GraphConfigData ) => unknown ;
81
+ [ propName : string ] : any ;
79
82
constructor ( options : Options . Definition ) {
80
83
const {
81
84
container,
82
85
width,
83
86
height,
84
- tool = { } ,
85
87
dndOptions,
86
88
keyboard,
87
89
isSilentMode,
@@ -97,8 +99,9 @@ export default class LogicFlow {
97
99
if ( ! this . height ) {
98
100
this . height = container . getBoundingClientRect ( ) . height ;
99
101
}
100
- this . tool = new Tool ( tool , this ) ;
102
+ this . tool = new Tool ( this ) ;
101
103
this . eventCenter = new EventEmitter ( ) ;
104
+ this . history = new History ( this . eventCenter ) ;
102
105
this . dnd = new Dnd ( { options : dndOptions , lf : this } ) ;
103
106
this . keyboard = new Keyboard ( { lf : this , keyboard } ) ;
104
107
// model 初始化
@@ -132,12 +135,16 @@ export default class LogicFlow {
132
135
* 添加扩展, 待讨论,这里是不是静态方法好一些?
133
136
* @param plugin 插件
134
137
*/
135
- static use ( extension : ExtensionLike ) {
138
+ static use ( extension : Extension ) {
136
139
this . extensions . push ( extension ) ;
137
140
}
138
141
installPlugins ( ) {
139
142
LogicFlow . extensions . forEach ( ( extension ) => {
140
- extension . install ( this ) ;
143
+ const { install, render : renderComponent } = extension ;
144
+ install . call ( extension , this ) ;
145
+ if ( renderComponent ) {
146
+ this . components . push ( renderComponent . bind ( extension ) ) ;
147
+ }
141
148
} ) ;
142
149
}
143
150
@@ -260,6 +267,14 @@ export default class LogicFlow {
260
267
const { transformMatrix } = this . graphModel ;
261
268
transformMatrix . translate ( x , y ) ;
262
269
}
270
+ /**
271
+ * 还原图形为初始位置
272
+ */
273
+ resetTranslate ( ) : void {
274
+ const { transformMatrix } = this . graphModel ;
275
+ const { TRANSLATE_X , TRANSLATE_Y } = transformMatrix ;
276
+ this . translate ( - TRANSLATE_X , - TRANSLATE_Y ) ;
277
+ }
263
278
/**
264
279
* 将图形定位到画布中心
265
280
* @param focusOnArgs 支持用户传入图形当前的坐标或id,可以通过type来区分是节点还是连线的id,也可以不传(兜底)
@@ -297,8 +312,13 @@ export default class LogicFlow {
297
312
* @param {string } nodeId 节点Id
298
313
*/
299
314
deleteNode ( nodeId : string ) : void {
300
- // todo: 1) before after钩子; 2) 删除后的回调
301
- this . graphModel . deleteNode ( nodeId ) ;
315
+ const Model = this . graphModel . getNodeModel ( nodeId ) ;
316
+ const data = Model . getData ( ) ;
317
+ const { guards } = this . options ;
318
+ const enabledDelete = guards && guards . beforeDelete ? guards . beforeDelete ( data ) : true ;
319
+ if ( enabledDelete ) {
320
+ this . graphModel . deleteNode ( nodeId ) ;
321
+ }
302
322
}
303
323
/**
304
324
* 添加节点
@@ -307,6 +327,14 @@ export default class LogicFlow {
307
327
addNode ( nodeConfig : NodeConfig ) : BaseNodeModel {
308
328
return this . graphModel . addNode ( nodeConfig ) ;
309
329
}
330
+
331
+ setProperties ( id : string , properties : Object ) : void {
332
+ this . graphModel . getElement ( id ) ?. setProperties ( properties ) ;
333
+ }
334
+
335
+ getProperties ( id : string ) : Object {
336
+ return this . graphModel . getElement ( id ) ?. getProperties ( ) ;
337
+ }
310
338
/**
311
339
* 显示节点文本编辑框
312
340
* @param nodeId 节点id
@@ -319,7 +347,13 @@ export default class LogicFlow {
319
347
* @param nodeId 节点Id
320
348
*/
321
349
cloneNode ( nodeId : string ) : BaseNodeModel {
322
- return this . graphModel . cloneNode ( nodeId ) ;
350
+ const Model = this . graphModel . getNodeModel ( nodeId ) ;
351
+ const data = Model . getData ( ) ;
352
+ const { guards } = this . options ;
353
+ const enabledClone = guards && guards . beforeClone ? guards . beforeClone ( data ) : true ;
354
+ if ( enabledClone ) {
355
+ return this . graphModel . cloneNode ( nodeId ) ;
356
+ }
323
357
}
324
358
/**
325
359
* 获取节点对象
@@ -351,14 +385,25 @@ export default class LogicFlow {
351
385
createEdge ( edgeConfig : EdgeConfig ) : void {
352
386
this . graphModel . createEdge ( edgeConfig ) ;
353
387
}
354
- /* 删除边 */
355
- removeEdge ( config : EdgeFilter ) : void {
388
+ /**
389
+ * 删除边
390
+ * @param {string } edgeId 边Id
391
+ */
392
+ deleteEdge ( edgeId : string ) : void {
393
+ // 待讨论,这种钩子在这里覆盖不到removeEdge, 是否需要在graphModel中实现
394
+ const { guards } = this . options ;
395
+ const edgeData = this . graphModel . edgesMap [ edgeId ] . model . getData ( ) ;
396
+ const enabledDelete = guards && guards . beforeDelete
397
+ ? guards . beforeDelete ( edgeData ) : true ;
398
+ if ( enabledDelete ) {
399
+ this . graphModel . removeEdgeById ( edgeId ) ;
400
+ }
401
+ }
402
+ /* 删除指定类型的边 */
403
+ removeEdge ( config : { sourceNodeId : string , targetNodeId : string } ) : void {
356
404
const {
357
- id , sourceNodeId, targetNodeId,
405
+ sourceNodeId, targetNodeId,
358
406
} = config ;
359
- if ( id ) {
360
- this . graphModel . removeEdgeById ( id ) ;
361
- }
362
407
if ( sourceNodeId && targetNodeId ) {
363
408
this . graphModel . removeEdge ( sourceNodeId , targetNodeId ) ;
364
409
} else if ( sourceNodeId ) {
@@ -501,6 +546,7 @@ export default class LogicFlow {
501
546
options = { this . options }
502
547
dnd = { this . dnd }
503
548
snaplineModel = { this . snaplineModel }
549
+ components = { this . components }
504
550
/>
505
551
</ Provider >
506
552
) , this . container ) ;
0 commit comments