@@ -7,12 +7,18 @@ import { getEdgeOffsets } from './topology';
7
7
import { IEntityState , EntityState } from '../utils/entity.utils' ;
8
8
import { IObserver , IObserverDataPayload , ISubject , Subject } from '../utils/observer.utils' ;
9
9
import { patchProperties } from '../utils/object.utils' ;
10
+ import { dedupArrays } from '../utils/array.utils' ;
10
11
11
12
export interface IGraphData < N extends INodeBase , E extends IEdgeBase > {
12
13
nodes : N [ ] ;
13
14
edges : E [ ] ;
14
15
}
15
16
17
+ export interface IGraphObjectsIds {
18
+ nodeIds : any [ ] ;
19
+ edgeIds : any [ ] ;
20
+ }
21
+
16
22
export type IEdgeFilter < N extends INodeBase , E extends IEdgeBase > = ( edge : IEdge < N , E > ) => boolean ;
17
23
18
24
export type INodeFilter < N extends INodeBase , E extends IEdgeBase > = ( node : INode < N , E > ) => boolean ;
@@ -35,7 +41,10 @@ export interface IGraph<N extends INodeBase, E extends IEdgeBase> extends ISubje
35
41
setup ( data : Partial < IGraphData < N , E > > ) : void ;
36
42
clearPositions ( ) : void ;
37
43
merge ( data : Partial < IGraphData < N , E > > ) : void ;
38
- remove ( data : Partial < { nodeIds : number [ ] ; edgeIds : number [ ] } > ) : void ;
44
+ remove ( data : Partial < IGraphObjectsIds > ) : void ;
45
+ removeAll ( ) : void ;
46
+ removeAllNodes ( ) : void ;
47
+ removeAllEdges ( ) : void ;
39
48
isEqual < T extends INodeBase , K extends IEdgeBase > ( graph : Graph < T , K > ) : boolean ;
40
49
getBoundingBox ( ) : IRectangle ;
41
50
getNearestNode ( point : IPosition ) : INode < N , E > | undefined ;
@@ -49,7 +58,7 @@ export interface IGraphSettings<N extends INodeBase, E extends IEdgeBase> {
49
58
onLoadedImages ?: ( ) => void ;
50
59
onSetupData ?: ( data : Partial < IGraphData < N , E > > ) => void ;
51
60
onMergeData ?: ( data : Partial < IGraphData < N , E > > ) => void ;
52
- onRemoveData ?: ( data : Partial < { nodeIds : number [ ] ; edgeIds : number [ ] } > ) => void ;
61
+ onRemoveData ?: ( data : Partial < IGraphObjectsIds > ) => void ;
53
62
listeners ?: IObserver [ ] ;
54
63
}
55
64
@@ -269,18 +278,41 @@ export class Graph<N extends INodeBase, E extends IEdgeBase> extends Subject imp
269
278
this . _settings ?. onMergeData ?.( data ) ;
270
279
}
271
280
272
- // TODO(dlozic): Add delete all mechanic.
273
- remove ( data : Partial < { nodeIds : number [ ] ; edgeIds : number [ ] } > ) {
281
+ remove ( data : Partial < IGraphObjectsIds > ) {
274
282
const nodeIds = data . nodeIds ?? [ ] ;
275
283
const edgeIds = data . edgeIds ?? [ ] ;
276
284
277
- this . _removeNodes ( nodeIds ) ;
278
- this . _removeEdges ( edgeIds ) ;
285
+ const removedNodesData = this . _removeNodes ( nodeIds ) ;
286
+ const removedEdgesData = this . _removeEdges ( edgeIds ) ;
279
287
280
288
this . _applyEdgeOffsets ( ) ;
281
289
this . _applyStyle ( ) ;
282
290
283
- this . _settings ?. onRemoveData ?.( data ) ;
291
+ if ( this . _settings && this . _settings . onRemoveData ) {
292
+ const removedData : IGraphObjectsIds = {
293
+ nodeIds : dedupArrays ( removedNodesData . nodeIds , removedEdgesData . nodeIds ) ,
294
+ edgeIds : dedupArrays ( removedNodesData . edgeIds , removedEdgesData . edgeIds ) ,
295
+ } ;
296
+
297
+ this . _settings . onRemoveData ( removedData ) ;
298
+ }
299
+ }
300
+
301
+ removeAll ( ) {
302
+ const nodeIds = this . _nodes . getAll ( ) . map ( ( node ) => node . id ) ;
303
+ const edgeIds = this . _edges . getAll ( ) . map ( ( edge ) => edge . id ) ;
304
+
305
+ this . remove ( { nodeIds, edgeIds } ) ;
306
+ }
307
+
308
+ removeAllEdges ( ) {
309
+ const edgeIds = this . _edges . getAll ( ) . map ( ( edge ) => edge . id ) ;
310
+
311
+ this . remove ( { edgeIds } ) ;
312
+ }
313
+
314
+ removeAllNodes ( ) {
315
+ this . removeAll ( ) ;
284
316
}
285
317
286
318
isEqual < T extends INodeBase , K extends IEdgeBase > ( graph : Graph < T , K > ) : boolean {
@@ -527,7 +559,7 @@ export class Graph<N extends INodeBase, E extends IEdgeBase> extends Subject imp
527
559
this . _edges . removeMany ( removedEdgeIds ) ;
528
560
}
529
561
530
- private _removeNodes ( nodeIds : any [ ] ) {
562
+ private _removeNodes ( nodeIds : any [ ] ) : IGraphObjectsIds {
531
563
const removedNodeIds : any [ ] = [ ] ;
532
564
const removedEdgeIds : any [ ] = [ ] ;
533
565
@@ -549,9 +581,11 @@ export class Graph<N extends INodeBase, E extends IEdgeBase> extends Subject imp
549
581
}
550
582
this . _nodes . removeMany ( removedNodeIds ) ;
551
583
this . _edges . removeMany ( removedEdgeIds ) ;
584
+
585
+ return { nodeIds : removedNodeIds , edgeIds : removedEdgeIds } ;
552
586
}
553
587
554
- private _removeEdges ( edgeIds : any [ ] ) {
588
+ private _removeEdges ( edgeIds : any [ ] ) : IGraphObjectsIds {
555
589
const removedEdgeIds : any [ ] = [ ] ;
556
590
557
591
for ( let i = 0 ; i < edgeIds . length ; i ++ ) {
@@ -565,6 +599,8 @@ export class Graph<N extends INodeBase, E extends IEdgeBase> extends Subject imp
565
599
removedEdgeIds . push ( edge . getId ( ) ) ;
566
600
}
567
601
this . _edges . removeMany ( removedEdgeIds ) ;
602
+
603
+ return { nodeIds : [ ] , edgeIds : removedEdgeIds } ;
568
604
}
569
605
570
606
private _applyEdgeOffsets ( ) {
0 commit comments