@deck.gl-community/graph-layers 9.2.0-beta.2 → 9.2.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/dist/core/graph-engine.d.ts +63 -21
- package/dist/core/graph-engine.d.ts.map +1 -1
- package/dist/core/graph-engine.js +155 -75
- package/dist/core/graph-engine.js.map +1 -1
- package/dist/core/graph-layout.d.ts +22 -18
- package/dist/core/graph-layout.d.ts.map +1 -1
- package/dist/core/graph-layout.js +33 -18
- package/dist/core/graph-layout.js.map +1 -1
- package/dist/core/interaction-manager.d.ts +2 -2
- package/dist/core/interaction-manager.d.ts.map +1 -1
- package/dist/core/interaction-manager.js +7 -5
- package/dist/core/interaction-manager.js.map +1 -1
- package/dist/graph/arrow-graph.d.ts +69 -0
- package/dist/graph/arrow-graph.d.ts.map +1 -0
- package/dist/graph/arrow-graph.js +513 -0
- package/dist/graph/arrow-graph.js.map +1 -0
- package/dist/graph/classic-graph.d.ts +169 -0
- package/dist/graph/classic-graph.d.ts.map +1 -0
- package/dist/graph/classic-graph.js +390 -0
- package/dist/graph/classic-graph.js.map +1 -0
- package/dist/graph/edge.d.ts +6 -6
- package/dist/graph/edge.d.ts.map +1 -1
- package/dist/graph/edge.js.map +1 -1
- package/dist/graph/functions/arrow-utils.d.ts +6 -0
- package/dist/graph/functions/arrow-utils.d.ts.map +1 -0
- package/dist/graph/functions/arrow-utils.js +67 -0
- package/dist/graph/functions/arrow-utils.js.map +1 -0
- package/dist/graph/functions/create-graph-from-data.d.ts +3 -0
- package/dist/graph/functions/create-graph-from-data.d.ts.map +1 -0
- package/dist/graph/functions/create-graph-from-data.js +12 -0
- package/dist/graph/functions/create-graph-from-data.js.map +1 -0
- package/dist/graph/graph-normalization.d.ts +10 -0
- package/dist/graph/graph-normalization.d.ts.map +1 -0
- package/dist/graph/graph-normalization.js +65 -0
- package/dist/graph/graph-normalization.js.map +1 -0
- package/dist/graph/graph.d.ts +62 -155
- package/dist/graph/graph.d.ts.map +1 -1
- package/dist/graph/graph.js +11 -300
- package/dist/graph/graph.js.map +1 -1
- package/dist/graph/node.d.ts +6 -6
- package/dist/graph/node.d.ts.map +1 -1
- package/dist/graph/node.js +2 -2
- package/dist/graph/node.js.map +1 -1
- package/dist/graph-data/arrow-graph-data-builder.d.ts +21 -0
- package/dist/graph-data/arrow-graph-data-builder.d.ts.map +1 -0
- package/dist/graph-data/arrow-graph-data-builder.js +105 -0
- package/dist/graph-data/arrow-graph-data-builder.js.map +1 -0
- package/dist/graph-data/graph-data-builder.d.ts +6 -0
- package/dist/graph-data/graph-data-builder.d.ts.map +1 -0
- package/dist/graph-data/graph-data-builder.js +1 -0
- package/dist/graph-data/graph-data-builder.js.map +1 -0
- package/dist/graph-data/graph-data.d.ts +40 -0
- package/dist/graph-data/graph-data.d.ts.map +1 -0
- package/dist/graph-data/graph-data.js +11 -0
- package/dist/graph-data/graph-data.js.map +1 -0
- package/dist/graph-data/plain-graph-data-builder.d.ts +20 -0
- package/dist/graph-data/plain-graph-data-builder.d.ts.map +1 -0
- package/dist/graph-data/plain-graph-data-builder.js +105 -0
- package/dist/graph-data/plain-graph-data-builder.js.map +1 -0
- package/dist/graph-style-schema.cdn.js +1 -1
- package/dist/graph-style-schema.json +1 -1
- package/dist/index.cjs +6905 -4576
- package/dist/index.cjs.map +4 -4
- package/dist/index.d.ts +14 -7
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +24 -11
- package/dist/index.js.map +1 -1
- package/dist/layers/common-layers/flow-path-layer/flow-path-layer.d.ts.map +1 -1
- package/dist/layers/common-layers/flow-path-layer/flow-path-layer.js +1 -2
- package/dist/layers/common-layers/flow-path-layer/flow-path-layer.js.map +1 -1
- package/dist/layers/common-layers/grid-layer/grid-layer.d.ts +83 -0
- package/dist/layers/common-layers/grid-layer/grid-layer.d.ts.map +1 -0
- package/dist/layers/common-layers/grid-layer/grid-layer.js +133 -0
- package/dist/layers/common-layers/grid-layer/grid-layer.js.map +1 -0
- package/dist/layers/edge-attachment-helper.d.ts.map +1 -1
- package/dist/layers/edge-attachment-helper.js +1 -2
- package/dist/layers/edge-attachment-helper.js.map +1 -1
- package/dist/layers/graph-layer.d.ts +68 -11
- package/dist/layers/graph-layer.d.ts.map +1 -1
- package/dist/layers/graph-layer.js +435 -50
- package/dist/layers/graph-layer.js.map +1 -1
- package/dist/layouts/d3-dag/collapsable-d3-dag-layout.d.ts +24 -0
- package/dist/layouts/d3-dag/collapsable-d3-dag-layout.d.ts.map +1 -0
- package/dist/layouts/d3-dag/collapsable-d3-dag-layout.js +251 -0
- package/dist/layouts/d3-dag/collapsable-d3-dag-layout.js.map +1 -0
- package/dist/layouts/d3-dag/d3-dag-layout.d.ts +46 -61
- package/dist/layouts/d3-dag/d3-dag-layout.d.ts.map +1 -1
- package/dist/layouts/d3-dag/d3-dag-layout.js +85 -270
- package/dist/layouts/d3-dag/d3-dag-layout.js.map +1 -1
- package/dist/layouts/d3-force/d3-force-layout.d.ts +20 -8
- package/dist/layouts/d3-force/d3-force-layout.d.ts.map +1 -1
- package/dist/layouts/d3-force/d3-force-layout.js +39 -20
- package/dist/layouts/d3-force/d3-force-layout.js.map +1 -1
- package/dist/layouts/experimental/force-multi-graph-layout.d.ts +19 -15
- package/dist/layouts/experimental/force-multi-graph-layout.d.ts.map +1 -1
- package/dist/layouts/experimental/force-multi-graph-layout.js +47 -38
- package/dist/layouts/experimental/force-multi-graph-layout.js.map +1 -1
- package/dist/layouts/experimental/hive-plot-layout.d.ts +18 -15
- package/dist/layouts/experimental/hive-plot-layout.d.ts.map +1 -1
- package/dist/layouts/experimental/hive-plot-layout.js +33 -34
- package/dist/layouts/experimental/hive-plot-layout.js.map +1 -1
- package/dist/layouts/experimental/radial-layout.d.ts +12 -7
- package/dist/layouts/experimental/radial-layout.d.ts.map +1 -1
- package/dist/layouts/experimental/radial-layout.js +31 -14
- package/dist/layouts/experimental/radial-layout.js.map +1 -1
- package/dist/layouts/gpu-force/gpu-force-layout.d.ts +11 -8
- package/dist/layouts/gpu-force/gpu-force-layout.d.ts.map +1 -1
- package/dist/layouts/gpu-force/gpu-force-layout.js +59 -56
- package/dist/layouts/gpu-force/gpu-force-layout.js.map +1 -1
- package/dist/layouts/simple-layout.d.ts +8 -25
- package/dist/layouts/simple-layout.d.ts.map +1 -1
- package/dist/layouts/simple-layout.js +13 -17
- package/dist/layouts/simple-layout.js.map +1 -1
- package/dist/loaders/dot-graph-loader.d.ts +25 -0
- package/dist/loaders/dot-graph-loader.d.ts.map +1 -0
- package/dist/loaders/dot-graph-loader.js +668 -0
- package/dist/loaders/dot-graph-loader.js.map +1 -0
- package/dist/loaders/json-graph-loader.d.ts +6 -0
- package/dist/loaders/json-graph-loader.d.ts.map +1 -0
- package/dist/loaders/json-graph-loader.js +31 -0
- package/dist/loaders/json-graph-loader.js.map +1 -0
- package/dist/loaders/{edge-parsers.d.ts → parsers/edge-parsers.d.ts} +1 -1
- package/dist/loaders/parsers/edge-parsers.d.ts.map +1 -0
- package/dist/loaders/{edge-parsers.js → parsers/edge-parsers.js} +1 -1
- package/dist/loaders/parsers/edge-parsers.js.map +1 -0
- package/dist/loaders/{node-parsers.d.ts → parsers/node-parsers.d.ts} +1 -1
- package/dist/loaders/parsers/node-parsers.d.ts.map +1 -0
- package/dist/loaders/{node-parsers.js → parsers/node-parsers.js} +1 -1
- package/dist/loaders/parsers/node-parsers.js.map +1 -0
- package/dist/loaders/parsers/parse-json-graph.d.ts +29 -0
- package/dist/loaders/parsers/parse-json-graph.d.ts.map +1 -0
- package/dist/loaders/parsers/parse-json-graph.js +78 -0
- package/dist/loaders/parsers/parse-json-graph.js.map +1 -0
- package/dist/style/graph-style-engine.d.ts +4 -2
- package/dist/style/graph-style-engine.d.ts.map +1 -1
- package/dist/style/graph-style-engine.js +3 -2
- package/dist/style/graph-style-engine.js.map +1 -1
- package/dist/style/{style-engine.d.ts → stylesheet-engine.d.ts} +3 -3
- package/dist/style/stylesheet-engine.d.ts.map +1 -0
- package/dist/style/{style-engine.js → stylesheet-engine.js} +1 -1
- package/dist/style/stylesheet-engine.js.map +1 -0
- package/dist/utils/collapsed-chains.d.ts +8 -8
- package/dist/utils/collapsed-chains.d.ts.map +1 -1
- package/dist/utils/collapsed-chains.js +1 -6
- package/dist/utils/collapsed-chains.js.map +1 -1
- package/dist/utils/rank-grid.d.ts +30 -0
- package/dist/utils/rank-grid.d.ts.map +1 -0
- package/dist/utils/rank-grid.js +306 -0
- package/dist/utils/rank-grid.js.map +1 -0
- package/package.json +4 -8
- package/src/_disabled/arrow-graph-data.ts.disabled +18 -0
- package/src/_disabled/columnar-graph-data-builder.ts.disabled +250 -0
- package/src/_disabled/graph-runtime-layout.ts.disabled +29 -0
- package/src/core/graph-engine.ts +201 -84
- package/src/core/graph-layout.ts +52 -29
- package/src/core/interaction-manager.ts +20 -20
- package/src/graph/arrow-graph.ts +648 -0
- package/src/graph/classic-graph.ts +447 -0
- package/src/graph/edge.ts +7 -7
- package/src/graph/functions/arrow-utils.ts +72 -0
- package/src/graph/functions/convert-arrow-graph-to-classic-graph.ts.disabled +47 -0
- package/src/graph/functions/convert-plain-graph-to-arrow-graph.ts.disabled +119 -0
- package/src/graph/functions/create-graph-from-data.ts +16 -0
- package/src/graph/functions/create-plain-graph-from-data.ts.disabled +176 -0
- package/src/graph/graph-normalization.ts +87 -0
- package/src/graph/graph.ts +68 -339
- package/src/graph/node.ts +9 -9
- package/src/graph/tabular-graph.ts.disabled +761 -0
- package/src/graph-data/arrow-graph-data-builder.ts +165 -0
- package/src/graph-data/graph-data-builder.ts +7 -0
- package/src/graph-data/graph-data.ts +57 -0
- package/src/graph-data/plain-graph-data-builder.ts +132 -0
- package/src/index.ts +53 -13
- package/src/layers/common-layers/flow-path-layer/flow-path-layer.ts +1 -2
- package/src/layers/common-layers/grid-layer/grid-layer.ts +237 -0
- package/src/layers/edge-attachment-helper.ts +22 -16
- package/src/layers/graph-layer.ts +642 -62
- package/src/layouts/d3-dag/collapsable-d3-dag-layout.ts +330 -0
- package/src/layouts/d3-dag/d3-dag-layout.ts +166 -396
- package/src/layouts/d3-force/d3-force-layout.ts +52 -30
- package/src/layouts/experimental/force-multi-graph-layout.ts +55 -49
- package/src/layouts/experimental/hive-plot-layout.ts +41 -42
- package/src/layouts/experimental/radial-layout.ts +39 -20
- package/src/layouts/gpu-force/gpu-force-layout.ts +72 -70
- package/src/layouts/simple-layout.ts +20 -44
- package/src/loaders/{create-graph.ts → deprecated/create-graph.ts.disabled} +6 -6
- package/src/loaders/deprecated/json-classic-graph-loader.ts.disabled +33 -0
- package/src/loaders/{simple-json-graph-loader.ts → deprecated/simple-json-graph-loader.ts.disabled} +3 -3
- package/src/loaders/{table-graph-loader.ts → deprecated/table-graph-loader.ts.disabled} +8 -8
- package/src/loaders/dot-graph-loader.ts +860 -0
- package/src/loaders/json-graph-loader.ts +48 -0
- package/src/loaders/parsers/create-graph-data.ts.disabled +45 -0
- package/src/loaders/{edge-parsers.ts → parsers/edge-parsers.ts} +2 -2
- package/src/loaders/{node-parsers.ts → parsers/node-parsers.ts} +2 -2
- package/src/loaders/parsers/parse-json-graph.ts +134 -0
- package/src/style/graph-style-engine.ts +5 -2
- package/src/style/{style-engine.ts → stylesheet-engine.ts} +3 -3
- package/src/utils/collapsed-chains.ts +11 -17
- package/src/utils/rank-grid.ts +426 -0
- package/dist/loaders/create-graph.d.ts +0 -12
- package/dist/loaders/create-graph.d.ts.map +0 -1
- package/dist/loaders/create-graph.js +0 -38
- package/dist/loaders/create-graph.js.map +0 -1
- package/dist/loaders/edge-parsers.d.ts.map +0 -1
- package/dist/loaders/edge-parsers.js.map +0 -1
- package/dist/loaders/json-loader.d.ts +0 -7
- package/dist/loaders/json-loader.d.ts.map +0 -1
- package/dist/loaders/json-loader.js +0 -16
- package/dist/loaders/json-loader.js.map +0 -1
- package/dist/loaders/node-parsers.d.ts.map +0 -1
- package/dist/loaders/node-parsers.js.map +0 -1
- package/dist/loaders/simple-json-graph-loader.d.ts +0 -11
- package/dist/loaders/simple-json-graph-loader.d.ts.map +0 -1
- package/dist/loaders/simple-json-graph-loader.js +0 -20
- package/dist/loaders/simple-json-graph-loader.js.map +0 -1
- package/dist/loaders/table-graph-loader.d.ts +0 -16
- package/dist/loaders/table-graph-loader.d.ts.map +0 -1
- package/dist/loaders/table-graph-loader.js +0 -91
- package/dist/loaders/table-graph-loader.js.map +0 -1
- package/dist/style/style-engine.d.ts.map +0 -1
- package/dist/style/style-engine.js.map +0 -1
- package/dist/widgets/long-press-button.d.ts +0 -12
- package/dist/widgets/long-press-button.d.ts.map +0 -1
- package/dist/widgets/long-press-button.js +0 -31
- package/dist/widgets/long-press-button.js.map +0 -1
- package/dist/widgets/view-control-widget.d.ts +0 -77
- package/dist/widgets/view-control-widget.d.ts.map +0 -1
- package/dist/widgets/view-control-widget.js +0 -197
- package/dist/widgets/view-control-widget.js.map +0 -1
- package/src/loaders/json-loader.ts +0 -19
- package/src/widgets/long-press-button.tsx +0 -50
- package/src/widgets/view-control-widget.tsx +0 -339
package/src/graph/graph.ts
CHANGED
|
@@ -2,356 +2,85 @@
|
|
|
2
2
|
// SPDX-License-Identifier: MIT
|
|
3
3
|
// Copyright (c) vis.gl contributors
|
|
4
4
|
|
|
5
|
-
import {
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
5
|
+
import type {NodeState, EdgeState} from '../core/constants';
|
|
6
|
+
|
|
7
|
+
/** Shared interface for graph nodes used by the rendering runtime. */
|
|
8
|
+
export interface NodeInterface {
|
|
9
|
+
readonly isNode: boolean;
|
|
10
|
+
readonly id: string | number;
|
|
11
|
+
getId(): string | number;
|
|
12
|
+
getDegree(): number;
|
|
13
|
+
getInDegree(): number;
|
|
14
|
+
getOutDegree(): number;
|
|
15
|
+
getSiblingIds(): (string | number)[];
|
|
16
|
+
getConnectedEdges(): EdgeInterface[];
|
|
17
|
+
addConnectedEdges(edge: EdgeInterface | EdgeInterface[]): void;
|
|
18
|
+
removeConnectedEdges(edge: EdgeInterface | EdgeInterface[]): void;
|
|
19
|
+
clearConnectedEdges(): void;
|
|
20
|
+
getPropertyValue(key: string): unknown;
|
|
21
|
+
setData(data: Record<string, unknown>): void;
|
|
22
|
+
setDataProperty(key: string, value: unknown): void;
|
|
23
|
+
setState(state: NodeState): void;
|
|
24
|
+
getState(): NodeState;
|
|
25
|
+
isSelectable(): boolean;
|
|
26
|
+
shouldHighlightConnectedEdges(): boolean;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
/** Shared interface for graph edges used by the rendering runtime. */
|
|
30
|
+
export interface EdgeInterface {
|
|
31
|
+
readonly isEdge: boolean;
|
|
32
|
+
readonly id: string | number;
|
|
33
|
+
getId(): string | number;
|
|
34
|
+
isDirected(): boolean;
|
|
35
|
+
getSourceNodeId(): string | number;
|
|
36
|
+
getTargetNodeId(): string | number;
|
|
37
|
+
getConnectedNodes(): NodeInterface[];
|
|
38
|
+
addNode(node: NodeInterface): void;
|
|
39
|
+
removeNode(node: NodeInterface): void;
|
|
40
|
+
getPropertyValue(key: string): unknown;
|
|
41
|
+
setData(data: Record<string, unknown>): void;
|
|
42
|
+
setDataProperty(key: string, value: unknown): void;
|
|
43
|
+
setState(state: EdgeState): void;
|
|
44
|
+
getState(): EdgeState;
|
|
45
|
+
}
|
|
9
46
|
|
|
10
47
|
export type GraphProps = {
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
48
|
+
onTransactionStart?: () => void;
|
|
49
|
+
onTransactionEnd?: () => void;
|
|
50
|
+
onNodeAdded?: (node: NodeInterface) => void;
|
|
51
|
+
onNodeRemoved?: (node: NodeInterface) => void;
|
|
52
|
+
onNodeUpdated?: (node: NodeInterface) => void;
|
|
53
|
+
onEdgeAdded?: (edge: EdgeInterface) => void;
|
|
54
|
+
onEdgeRemoved?: (edge: EdgeInterface) => void;
|
|
55
|
+
onEdgeUpdated?: (edge: EdgeInterface) => void;
|
|
14
56
|
};
|
|
15
57
|
|
|
16
|
-
/**
|
|
17
|
-
export class Graph extends
|
|
18
|
-
|
|
19
|
-
private _nodeMap: Record<string, Node> = {};
|
|
20
|
-
/** List of object edges. */
|
|
21
|
-
private _edgeMap: Record<string, Edge> = {};
|
|
22
|
-
/**
|
|
23
|
-
* Identifies whether performing dirty check when streaming new data. If
|
|
24
|
-
* the name of the graph is not specified, will fall back to current time stamp.
|
|
25
|
-
*/
|
|
26
|
-
private _name: string = Date.now().toString();
|
|
27
|
-
/** Version the graph. A version is a number that is incremented every time the graph is updated. */
|
|
28
|
-
public version = 0;
|
|
29
|
-
/** Cached data: create array data from maps. */
|
|
30
|
-
private _cache = new Cache<'nodes' | 'edges', Node[] | Edge[]>();
|
|
31
|
-
|
|
32
|
-
constructor(props?: GraphProps);
|
|
33
|
-
constructor(graph: Graph);
|
|
34
|
-
|
|
35
|
-
/**
|
|
36
|
-
* The constructor of the Graph class.
|
|
37
|
-
* @param graph - copy the graph if this exists.
|
|
38
|
-
*/
|
|
39
|
-
constructor(propsOrGraph?: GraphProps | Graph) {
|
|
40
|
-
super();
|
|
41
|
-
|
|
42
|
-
if (propsOrGraph instanceof Graph) {
|
|
43
|
-
// if a Graph instance was supplied, copy the supplied graph into this graph
|
|
44
|
-
const graph = propsOrGraph;
|
|
45
|
-
this._name = graph?._name || this._name;
|
|
46
|
-
this._nodeMap = graph._nodeMap;
|
|
47
|
-
this._edgeMap = graph._edgeMap;
|
|
48
|
-
} else {
|
|
49
|
-
// If graphProps were supplied, initialize this graph from the supplied props
|
|
50
|
-
const props = propsOrGraph;
|
|
51
|
-
this._name = props?.name || this._name;
|
|
52
|
-
this.batchAddNodes(props?.nodes || []);
|
|
53
|
-
this.batchAddEdges(props?.edges || []);
|
|
54
|
-
}
|
|
55
|
-
}
|
|
56
|
-
|
|
57
|
-
/**
|
|
58
|
-
* Set graph name
|
|
59
|
-
* @param name
|
|
60
|
-
*/
|
|
61
|
-
setGraphName(name: string): void {
|
|
62
|
-
this._name = name;
|
|
63
|
-
}
|
|
64
|
-
|
|
65
|
-
/** Get the name of the graph. Default value is the time stamp when creating this graph.
|
|
66
|
-
* @return graph name.
|
|
67
|
-
*/
|
|
68
|
-
getGraphName(): string {
|
|
69
|
-
return this._name.toString();
|
|
70
|
-
}
|
|
71
|
-
|
|
72
|
-
/**
|
|
73
|
-
* Perform a batch of operations defined by cb before indicating graph is updated
|
|
74
|
-
* @param {function} cb - a callback function containing the operations to perform
|
|
75
|
-
*/
|
|
76
|
-
transaction<T>(cb: (...args: unknown[]) => T): T {
|
|
77
|
-
try {
|
|
78
|
-
this.dispatchEvent(new CustomEvent('transactionStart'));
|
|
79
|
-
return cb();
|
|
80
|
-
} finally {
|
|
81
|
-
this.dispatchEvent(new CustomEvent('transactionEnd'));
|
|
82
|
-
}
|
|
83
|
-
}
|
|
84
|
-
|
|
85
|
-
/**
|
|
86
|
-
* Add a new node to the graph.
|
|
87
|
-
* @paramnode - expect a Node object to be added to the graph.
|
|
88
|
-
*/
|
|
89
|
-
addNode(node: Node): void {
|
|
90
|
-
// add it to the list and map
|
|
91
|
-
this._nodeMap[node.getId()] = node;
|
|
92
|
-
// update last update time stamp
|
|
93
|
-
this._bumpVersion();
|
|
94
|
-
this.dispatchEvent(new CustomEvent('onNodeAdded', {node} as any));
|
|
95
|
-
}
|
|
96
|
-
|
|
97
|
-
/**
|
|
98
|
-
* Batch add nodes to the graph.
|
|
99
|
-
* @param nodes - a list of nodes to be added.
|
|
100
|
-
*/
|
|
101
|
-
batchAddNodes(nodes: Node[]): void {
|
|
102
|
-
// convert an array of objects to an object
|
|
103
|
-
this._nodeMap = nodes.reduce(
|
|
104
|
-
(res, node) => {
|
|
105
|
-
res[node.getId()] = node;
|
|
106
|
-
this.dispatchEvent(new CustomEvent('onNodeAdded', {node} as any));
|
|
107
|
-
return res;
|
|
108
|
-
},
|
|
109
|
-
{...this._nodeMap}
|
|
110
|
-
);
|
|
111
|
-
this._bumpVersion();
|
|
112
|
-
}
|
|
113
|
-
|
|
114
|
-
/**
|
|
115
|
-
* Get all the nodes of the graph.
|
|
116
|
-
* @return {Node[]} - get all the nodes in the graph.
|
|
117
|
-
*/
|
|
118
|
-
getNodes(): Node[] {
|
|
119
|
-
this._updateCache('nodes', () => Object.values(this._nodeMap));
|
|
120
|
-
|
|
121
|
-
return this._cache.get('nodes') as Node[];
|
|
122
|
-
}
|
|
58
|
+
/** Runtime abstraction consumed by the rendering engine. */
|
|
59
|
+
export abstract class Graph<PropsT extends GraphProps = GraphProps> {
|
|
60
|
+
private _props: PropsT;
|
|
123
61
|
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
* @return - a map of nodes keyed by node IDs.
|
|
127
|
-
*/
|
|
128
|
-
getNodeMap(): Record<string | number, Node> {
|
|
129
|
-
return this._nodeMap;
|
|
62
|
+
protected constructor(props: PropsT) {
|
|
63
|
+
this._props = {...props};
|
|
130
64
|
}
|
|
131
65
|
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
* @param nodeId The id of the node
|
|
135
|
-
* @return Node
|
|
136
|
-
*/
|
|
137
|
-
findNode(nodeId: string | number): Node | undefined {
|
|
138
|
-
return this._nodeMap[nodeId];
|
|
66
|
+
get props(): PropsT {
|
|
67
|
+
return {...this._props};
|
|
139
68
|
}
|
|
140
69
|
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
* @param node
|
|
144
|
-
*/
|
|
145
|
-
updateNode(node: Node): void {
|
|
146
|
-
this._nodeMap[node.getId()] = node;
|
|
147
|
-
this._bumpVersion();
|
|
148
|
-
this.dispatchEvent(new CustomEvent('onNodeUpdated', {node} as any));
|
|
70
|
+
setProps(props: PropsT): void {
|
|
71
|
+
this._props = {...props};
|
|
149
72
|
}
|
|
150
73
|
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
* @param edge - expect a Edge object to be added to the graph.
|
|
154
|
-
*/
|
|
155
|
-
addEdge(edge: Edge): void {
|
|
156
|
-
const sourceNode = this.findNode(edge.getSourceNodeId());
|
|
157
|
-
const targetNode = this.findNode(edge.getTargetNodeId());
|
|
158
|
-
|
|
159
|
-
if (!sourceNode || !targetNode) {
|
|
160
|
-
warn(`Unable to add edge ${edge.id}, source or target node is missing.`);
|
|
161
|
-
return;
|
|
162
|
-
}
|
|
163
|
-
|
|
164
|
-
this._edgeMap[edge.getId()] = edge;
|
|
165
|
-
sourceNode.addConnectedEdges(edge);
|
|
166
|
-
targetNode.addConnectedEdges(edge);
|
|
167
|
-
this._bumpVersion();
|
|
168
|
-
this.dispatchEvent(new CustomEvent('onEdgeAdded', {edge} as any));
|
|
74
|
+
updateProps(props: PropsT): void {
|
|
75
|
+
this._props = {...this._props, ...props};
|
|
169
76
|
}
|
|
170
77
|
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
/**
|
|
181
|
-
* Update the indicated edge to the provided value
|
|
182
|
-
* @param edge
|
|
183
|
-
*/
|
|
184
|
-
updateEdge(edge: Edge): void {
|
|
185
|
-
this._edgeMap[edge.getId()] = edge;
|
|
186
|
-
this._bumpVersion();
|
|
187
|
-
this.dispatchEvent(new CustomEvent('onEdgeUpdated', {edge} as any));
|
|
188
|
-
}
|
|
189
|
-
|
|
190
|
-
/**
|
|
191
|
-
* Remove a node from the graph by node ID
|
|
192
|
-
* @param nodeId - the ID of the target node.
|
|
193
|
-
*/
|
|
194
|
-
removeNode(nodeId: string | number): void {
|
|
195
|
-
const node = this.findNode(nodeId);
|
|
196
|
-
if (!node) {
|
|
197
|
-
warn(`Unable to remove node ${nodeId} - doesn't exist`);
|
|
198
|
-
return;
|
|
199
|
-
}
|
|
200
|
-
// remove all edges connect to this node from map
|
|
201
|
-
node.getConnectedEdges().forEach((e) => {
|
|
202
|
-
delete this._edgeMap[e.getId()];
|
|
203
|
-
});
|
|
204
|
-
// remove the node from map
|
|
205
|
-
delete this._nodeMap[nodeId];
|
|
206
|
-
this._bumpVersion();
|
|
207
|
-
this.dispatchEvent(new CustomEvent('onNodeRemoved', {node} as any));
|
|
208
|
-
}
|
|
209
|
-
|
|
210
|
-
/**
|
|
211
|
-
* Get all the edges of the graph.
|
|
212
|
-
* @return get all the edges in the graph.
|
|
213
|
-
*/
|
|
214
|
-
getEdges(): Edge[] {
|
|
215
|
-
this._updateCache('edges', () => Object.values(this._edgeMap));
|
|
216
|
-
|
|
217
|
-
return this._cache.get('edges') as Edge[];
|
|
218
|
-
}
|
|
219
|
-
|
|
220
|
-
/**
|
|
221
|
-
* Get the edge map of the graph. The key of the map is the ID of the edges.
|
|
222
|
-
* @return - a map of edges keyed by edge IDs.
|
|
223
|
-
*/
|
|
224
|
-
getEdgeMap(): Record<string, Edge> {
|
|
225
|
-
return this._edgeMap;
|
|
226
|
-
}
|
|
227
|
-
|
|
228
|
-
/**
|
|
229
|
-
* Remove an edge from the graph by the edge ID
|
|
230
|
-
* @param {String|Number} edgeId - the target edge ID.
|
|
231
|
-
*/
|
|
232
|
-
removeEdge(edgeId: string | number): void {
|
|
233
|
-
const edge = this.findEdge(edgeId);
|
|
234
|
-
if (!edge) {
|
|
235
|
-
warn(`Unable to remove edge ${edgeId} - doesn't exist`);
|
|
236
|
-
return;
|
|
237
|
-
}
|
|
238
|
-
const sourceNode = this.findNode(edge.getSourceNodeId());
|
|
239
|
-
const targetNode = this.findNode(edge.getTargetNodeId());
|
|
240
|
-
|
|
241
|
-
delete this._edgeMap[edgeId];
|
|
242
|
-
sourceNode.removeConnectedEdges(edge);
|
|
243
|
-
targetNode.removeConnectedEdges(edge);
|
|
244
|
-
this._bumpVersion();
|
|
245
|
-
}
|
|
246
|
-
|
|
247
|
-
/**
|
|
248
|
-
* Find the edge by edge ID.
|
|
249
|
-
* @param id - the target edge ID
|
|
250
|
-
* @return - the target edge.
|
|
251
|
-
*/
|
|
252
|
-
findEdge(edgeId: string | number): Edge {
|
|
253
|
-
return this._edgeMap[edgeId];
|
|
254
|
-
}
|
|
255
|
-
|
|
256
|
-
/**
|
|
257
|
-
* Return all the connected edges of a node by nodeID.
|
|
258
|
-
* @param nodeId - the target node ID
|
|
259
|
-
* @return - an array of the connected edges.
|
|
260
|
-
*/
|
|
261
|
-
getConnectedEdges(nodeId: string | number): Edge[] {
|
|
262
|
-
const node = this.findNode(nodeId);
|
|
263
|
-
if (!node) {
|
|
264
|
-
warn(`Unable to find node ${nodeId} - doesn't exist`);
|
|
265
|
-
return [];
|
|
266
|
-
}
|
|
267
|
-
return node.getConnectedEdges();
|
|
268
|
-
}
|
|
269
|
-
|
|
270
|
-
/**
|
|
271
|
-
* Return all the sibling nodes of a node by nodeID.
|
|
272
|
-
* @param nodeId - the target node ID
|
|
273
|
-
* @return - an array of the sibling nodes.
|
|
274
|
-
*/
|
|
275
|
-
getNodeSiblings(nodeId: string | number): Node[] {
|
|
276
|
-
const node = this.findNode(nodeId);
|
|
277
|
-
if (!node) {
|
|
278
|
-
warn(`Unable to find node ${nodeId} - doesn't exist`);
|
|
279
|
-
return [];
|
|
280
|
-
}
|
|
281
|
-
return node.getSiblingIds().map((siblingNodeId) => this.findNode(siblingNodeId));
|
|
282
|
-
}
|
|
283
|
-
|
|
284
|
-
/**
|
|
285
|
-
* Get the degree of a node.
|
|
286
|
-
* @param nodeId - the target node ID.
|
|
287
|
-
* @return - the degree of the node.
|
|
288
|
-
*/
|
|
289
|
-
getDegree(nodeId: string | number): number {
|
|
290
|
-
const node = this.findNode(nodeId);
|
|
291
|
-
if (!node) {
|
|
292
|
-
warn(`Unable to find node ${nodeId} - doesn't exist`);
|
|
293
|
-
return 0;
|
|
294
|
-
}
|
|
295
|
-
return node.getDegree();
|
|
296
|
-
}
|
|
297
|
-
|
|
298
|
-
/**
|
|
299
|
-
* Clean up all the nodes in the graph.
|
|
300
|
-
*/
|
|
301
|
-
resetNodes(): void {
|
|
302
|
-
this._nodeMap = {};
|
|
303
|
-
this._bumpVersion();
|
|
304
|
-
}
|
|
305
|
-
|
|
306
|
-
/**
|
|
307
|
-
* Clean up all the edges in the graph.
|
|
308
|
-
*/
|
|
309
|
-
resetEdges(): void {
|
|
310
|
-
this._edgeMap = {};
|
|
311
|
-
this._bumpVersion();
|
|
312
|
-
}
|
|
313
|
-
|
|
314
|
-
/**
|
|
315
|
-
* Clean up everything in the graph.
|
|
316
|
-
*/
|
|
317
|
-
reset(): void {
|
|
318
|
-
this.resetNodes();
|
|
319
|
-
this.resetEdges();
|
|
320
|
-
this._bumpVersion();
|
|
321
|
-
}
|
|
322
|
-
|
|
323
|
-
/**
|
|
324
|
-
* Trigger an update to the graph.
|
|
325
|
-
*/
|
|
326
|
-
triggerUpdate(): void {
|
|
327
|
-
this._bumpVersion();
|
|
328
|
-
}
|
|
329
|
-
|
|
330
|
-
/**
|
|
331
|
-
* Return true if the graph is empty.
|
|
332
|
-
* @return {Boolean} Return true if the graph is empty.
|
|
333
|
-
*/
|
|
334
|
-
isEmpty(): boolean {
|
|
335
|
-
return Object.keys(this._nodeMap).length === 0;
|
|
336
|
-
}
|
|
337
|
-
|
|
338
|
-
/**
|
|
339
|
-
* Check the equality of two graphs data by checking last update time stamp
|
|
340
|
-
* @param graph Another graph to be compared against itself
|
|
341
|
-
* @return true if the graph is the same as itself.
|
|
342
|
-
*/
|
|
343
|
-
equals(graph: Graph): boolean {
|
|
344
|
-
if (!graph || !(graph instanceof Graph)) {
|
|
345
|
-
return false;
|
|
346
|
-
}
|
|
347
|
-
return this.version === graph.version;
|
|
348
|
-
}
|
|
349
|
-
|
|
350
|
-
_bumpVersion(): void {
|
|
351
|
-
this.version += 1;
|
|
352
|
-
}
|
|
353
|
-
|
|
354
|
-
_updateCache(key: 'nodes' | 'edges', updateValue: unknown): void {
|
|
355
|
-
this._cache.set(key, updateValue as any, this.version);
|
|
356
|
-
}
|
|
78
|
+
abstract get version(): number;
|
|
79
|
+
abstract getNodes(): Iterable<NodeInterface>;
|
|
80
|
+
abstract getEdges(): Iterable<EdgeInterface>;
|
|
81
|
+
abstract findNode(id: string | number): NodeInterface | undefined;
|
|
82
|
+
findNodeById?(id: string | number): NodeInterface | undefined;
|
|
83
|
+
getGraphName?(): string;
|
|
84
|
+
triggerUpdate?(): void;
|
|
85
|
+
abstract destroy?(): void;
|
|
357
86
|
}
|
package/src/graph/node.ts
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
// Copyright (c) vis.gl contributors
|
|
4
4
|
|
|
5
5
|
import type {NodeState} from '../core/constants';
|
|
6
|
-
import {
|
|
6
|
+
import type {EdgeInterface, NodeInterface} from './graph';
|
|
7
7
|
|
|
8
8
|
/** Properties for creating a new node */
|
|
9
9
|
export interface NodeOptions {
|
|
@@ -16,12 +16,12 @@ export interface NodeOptions {
|
|
|
16
16
|
}
|
|
17
17
|
|
|
18
18
|
/** Basic data structure of a node */
|
|
19
|
-
export class Node {
|
|
20
|
-
public id: string | number;
|
|
19
|
+
export class Node implements NodeInterface {
|
|
20
|
+
public readonly id: string | number;
|
|
21
21
|
/** Keep a reference to origin data. */
|
|
22
22
|
private _data: Record<string, unknown>;
|
|
23
23
|
/** List edges. */
|
|
24
|
-
private _connectedEdges: Record<string,
|
|
24
|
+
private _connectedEdges: Record<string, EdgeInterface> = {};
|
|
25
25
|
/** Interaction state of the node. */
|
|
26
26
|
public state: NodeState = 'default';
|
|
27
27
|
/** Can the node be selected? */
|
|
@@ -109,7 +109,7 @@ export class Node {
|
|
|
109
109
|
* Return all the connected edges.
|
|
110
110
|
* @return - an array of the connected edges.
|
|
111
111
|
*/
|
|
112
|
-
getConnectedEdges():
|
|
112
|
+
getConnectedEdges(): EdgeInterface[] {
|
|
113
113
|
return Object.values(this._connectedEdges);
|
|
114
114
|
}
|
|
115
115
|
|
|
@@ -168,10 +168,10 @@ export class Node {
|
|
|
168
168
|
* Add connected edges to the node
|
|
169
169
|
* @param edge an edge or an array of edges to be added to this._connectedEdges
|
|
170
170
|
*/
|
|
171
|
-
addConnectedEdges(edge:
|
|
171
|
+
addConnectedEdges(edge: EdgeInterface | EdgeInterface[]): void {
|
|
172
172
|
const iterableEdges = Array.isArray(edge) ? edge : [edge];
|
|
173
173
|
iterableEdges.forEach((e) => {
|
|
174
|
-
this._connectedEdges[e.
|
|
174
|
+
this._connectedEdges[e.getId()] = e;
|
|
175
175
|
e.addNode(this);
|
|
176
176
|
});
|
|
177
177
|
}
|
|
@@ -180,11 +180,11 @@ export class Node {
|
|
|
180
180
|
* Remove edges from this._connectedEdges
|
|
181
181
|
* @param edge an edge or an array of edges to be removed from this._connectedEdges
|
|
182
182
|
*/
|
|
183
|
-
removeConnectedEdges(edge:
|
|
183
|
+
removeConnectedEdges(edge: EdgeInterface | EdgeInterface[]): void {
|
|
184
184
|
const iterableEdges = Array.isArray(edge) ? edge : [edge];
|
|
185
185
|
iterableEdges.forEach((e) => {
|
|
186
186
|
e.removeNode(this);
|
|
187
|
-
delete this._connectedEdges[e.
|
|
187
|
+
delete this._connectedEdges[e.getId()];
|
|
188
188
|
});
|
|
189
189
|
}
|
|
190
190
|
|