@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
|
@@ -0,0 +1,330 @@
|
|
|
1
|
+
// deck.gl-community
|
|
2
|
+
// SPDX-License-Identifier: MIT
|
|
3
|
+
// Copyright (c) vis.gl contributors
|
|
4
|
+
|
|
5
|
+
/* eslint-disable no-continue, complexity, max-statements */
|
|
6
|
+
|
|
7
|
+
import type {Graph, NodeInterface, EdgeInterface} from '../../graph/graph';
|
|
8
|
+
import {log} from '../../utils/log';
|
|
9
|
+
|
|
10
|
+
import {D3DagLayout, type D3DagLayoutProps} from './d3-dag-layout';
|
|
11
|
+
|
|
12
|
+
type CollapsedChainDescriptor = {
|
|
13
|
+
id: string;
|
|
14
|
+
nodeIds: (string | number)[];
|
|
15
|
+
edgeIds: (string | number)[];
|
|
16
|
+
representativeId: string | number;
|
|
17
|
+
};
|
|
18
|
+
|
|
19
|
+
export type CollapsableD3DagLayoutProps = D3DagLayoutProps & {
|
|
20
|
+
/** Whether to collapse linear chains of nodes into a single representative. */
|
|
21
|
+
collapseLinearChains?: boolean;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
export class CollapsableD3DagLayout extends D3DagLayout<CollapsableD3DagLayoutProps> {
|
|
25
|
+
static override defaultProps: Required<CollapsableD3DagLayoutProps> = {
|
|
26
|
+
...D3DagLayout.defaultProps,
|
|
27
|
+
collapseLinearChains: false
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
private _chainDescriptors = new Map<string, CollapsedChainDescriptor>();
|
|
31
|
+
private _nodeToChainId = new Map<string | number, string>();
|
|
32
|
+
private _collapsedChainState = new Map<string, boolean>();
|
|
33
|
+
private _hiddenNodeIds = new Set<string | number>();
|
|
34
|
+
|
|
35
|
+
constructor(props: CollapsableD3DagLayoutProps = {}) {
|
|
36
|
+
super(props, CollapsableD3DagLayout.defaultProps);
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
override setProps(props: Partial<CollapsableD3DagLayoutProps>): void {
|
|
40
|
+
super.setProps(props);
|
|
41
|
+
if (props.collapseLinearChains !== undefined && this._graph) {
|
|
42
|
+
this._runLayout();
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
override updateGraph(graph: Graph): void {
|
|
47
|
+
super.updateGraph(graph);
|
|
48
|
+
this._chainDescriptors.clear();
|
|
49
|
+
this._nodeToChainId.clear();
|
|
50
|
+
this._hiddenNodeIds.clear();
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
override toggleCollapsedChain(chainId: string): void {
|
|
54
|
+
if (!this._graph) {
|
|
55
|
+
log.log(1, `CollapsableD3DagLayout: toggleCollapsedChain(${chainId}) ignored (no graph)`);
|
|
56
|
+
return;
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
if (!this._chainDescriptors.has(chainId)) {
|
|
60
|
+
this._refreshCollapsedChains();
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
if (!this._chainDescriptors.has(chainId)) {
|
|
64
|
+
log.log(1, `CollapsableD3DagLayout: toggleCollapsedChain(${chainId}) skipped (unknown chain)`);
|
|
65
|
+
return;
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
const collapsed = this._isChainCollapsed(chainId);
|
|
69
|
+
const nextState = !collapsed;
|
|
70
|
+
log.log(
|
|
71
|
+
0,
|
|
72
|
+
`CollapsableD3DagLayout: toggleCollapsedChain(${chainId}) -> ${nextState ? 'collapsed' : 'expanded'}`
|
|
73
|
+
);
|
|
74
|
+
// eslint-disable-next-line no-console
|
|
75
|
+
console.log(
|
|
76
|
+
`CollapsableD3DagLayout: toggleCollapsedChain(${chainId}) -> ${nextState ? 'collapsed' : 'expanded'}`
|
|
77
|
+
);
|
|
78
|
+
this._collapsedChainState.set(chainId, nextState);
|
|
79
|
+
this._runLayout();
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
override setCollapsedChains(chainIds: Iterable<string>): void {
|
|
83
|
+
if (!this._graph) {
|
|
84
|
+
log.log(1, 'CollapsableD3DagLayout: setCollapsedChains ignored (no graph)');
|
|
85
|
+
return;
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
if (!this._chainDescriptors.size) {
|
|
89
|
+
this._refreshCollapsedChains();
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
const desired = new Set(chainIds);
|
|
93
|
+
log.log(0, `CollapsableD3DagLayout: setCollapsedChains(${desired.size}) requested`);
|
|
94
|
+
|
|
95
|
+
let changed = false;
|
|
96
|
+
for (const chainId of this._chainDescriptors.keys()) {
|
|
97
|
+
const next = desired.has(chainId);
|
|
98
|
+
if (this._isChainCollapsed(chainId) !== next) {
|
|
99
|
+
this._collapsedChainState.set(chainId, next);
|
|
100
|
+
changed = true;
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
if (changed) {
|
|
105
|
+
log.log(0, 'CollapsableD3DagLayout: setCollapsedChains -> changes detected, rerunning layout');
|
|
106
|
+
// eslint-disable-next-line no-console
|
|
107
|
+
console.log('CollapsableD3DagLayout: setCollapsedChains -> changes detected, rerunning layout');
|
|
108
|
+
this._runLayout();
|
|
109
|
+
} else {
|
|
110
|
+
log.log(1, 'CollapsableD3DagLayout: setCollapsedChains -> no changes');
|
|
111
|
+
// eslint-disable-next-line no-console
|
|
112
|
+
console.log('CollapsableD3DagLayout: setCollapsedChains -> no changes');
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
protected override _refreshCollapsedChains(): void {
|
|
117
|
+
const previousChainCount = this._chainDescriptors.size;
|
|
118
|
+
|
|
119
|
+
if (!this._graph) {
|
|
120
|
+
if (previousChainCount > 0) {
|
|
121
|
+
log.log(0, 'CollapsableD3DagLayout: clearing collapsed chains (graph unavailable)');
|
|
122
|
+
// eslint-disable-next-line no-console
|
|
123
|
+
console.log('CollapsableD3DagLayout: clearing collapsed chains (graph unavailable)');
|
|
124
|
+
}
|
|
125
|
+
this._chainDescriptors.clear();
|
|
126
|
+
this._nodeToChainId.clear();
|
|
127
|
+
this._hiddenNodeIds.clear();
|
|
128
|
+
this._updateCollapsedChainNodeMetadata();
|
|
129
|
+
return;
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
log.log(
|
|
133
|
+
0,
|
|
134
|
+
`CollapsableD3DagLayout: refreshing collapsed chains (previous=${previousChainCount})`
|
|
135
|
+
);
|
|
136
|
+
// eslint-disable-next-line no-console
|
|
137
|
+
console.log(
|
|
138
|
+
`CollapsableD3DagLayout: refreshing collapsed chains (previous=${previousChainCount})`
|
|
139
|
+
);
|
|
140
|
+
|
|
141
|
+
const collapseDefault =
|
|
142
|
+
this.props.collapseLinearChains;
|
|
143
|
+
|
|
144
|
+
const previousStates = new Map(this._collapsedChainState);
|
|
145
|
+
|
|
146
|
+
this._chainDescriptors.clear();
|
|
147
|
+
this._nodeToChainId.clear();
|
|
148
|
+
this._hiddenNodeIds.clear();
|
|
149
|
+
|
|
150
|
+
const nodes = this._graph.getNodes();
|
|
151
|
+
const candidateNodes = new Set<string | number>();
|
|
152
|
+
const incomingCache = new Map<string | number, EdgeInterface[]>();
|
|
153
|
+
const outgoingCache = new Map<string | number, EdgeInterface[]>();
|
|
154
|
+
|
|
155
|
+
for (const node of nodes) {
|
|
156
|
+
const incoming = this._getIncomingEdges(node);
|
|
157
|
+
const outgoing = this._getOutgoingEdges(node);
|
|
158
|
+
incomingCache.set(node.getId(), incoming);
|
|
159
|
+
outgoingCache.set(node.getId(), outgoing);
|
|
160
|
+
if (incoming.length <= 1 && outgoing.length <= 1 && incoming.length + outgoing.length > 0) {
|
|
161
|
+
candidateNodes.add(node.getId());
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
const visited = new Set<string | number>();
|
|
166
|
+
for (const node of nodes) {
|
|
167
|
+
const nodeId = node.getId();
|
|
168
|
+
if (!candidateNodes.has(nodeId) || visited.has(nodeId)) {
|
|
169
|
+
continue;
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
const incoming = incomingCache.get(nodeId) ?? [];
|
|
173
|
+
const hasCandidateParent =
|
|
174
|
+
incoming.length === 1 && candidateNodes.has(incoming[0].getSourceNodeId());
|
|
175
|
+
if (hasCandidateParent) {
|
|
176
|
+
continue;
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
const chainNodeIds: (string | number)[] = [];
|
|
180
|
+
const chainEdgeIds: (string | number)[] = [];
|
|
181
|
+
let currentNode: NodeInterface | undefined = node;
|
|
182
|
+
|
|
183
|
+
while (currentNode) {
|
|
184
|
+
const currentId = currentNode.getId();
|
|
185
|
+
if (!candidateNodes.has(currentId) || visited.has(currentId)) {
|
|
186
|
+
break;
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
visited.add(currentId);
|
|
190
|
+
chainNodeIds.push(currentId);
|
|
191
|
+
|
|
192
|
+
const outgoing = outgoingCache.get(currentId) ?? [];
|
|
193
|
+
if (outgoing.length !== 1) {
|
|
194
|
+
break;
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
const nextEdge = outgoing[0];
|
|
198
|
+
const nextNodeId = nextEdge.getTargetNodeId();
|
|
199
|
+
if (!candidateNodes.has(nextNodeId)) {
|
|
200
|
+
break;
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
const nextIncoming = incomingCache.get(nextNodeId) ?? [];
|
|
204
|
+
if (nextIncoming.length !== 1) {
|
|
205
|
+
break;
|
|
206
|
+
}
|
|
207
|
+
|
|
208
|
+
chainEdgeIds.push(nextEdge.getId());
|
|
209
|
+
currentNode = this._nodeLookup.get(nextNodeId);
|
|
210
|
+
}
|
|
211
|
+
|
|
212
|
+
if (chainNodeIds.length > 1) {
|
|
213
|
+
const chainId = this._createChainId(chainNodeIds);
|
|
214
|
+
const collapsed = previousStates.has(chainId)
|
|
215
|
+
? Boolean(previousStates.get(chainId))
|
|
216
|
+
: collapseDefault;
|
|
217
|
+
this._chainDescriptors.set(chainId, {
|
|
218
|
+
id: chainId,
|
|
219
|
+
nodeIds: chainNodeIds,
|
|
220
|
+
edgeIds: chainEdgeIds,
|
|
221
|
+
representativeId: chainNodeIds[0]
|
|
222
|
+
});
|
|
223
|
+
this._collapsedChainState.set(chainId, collapsed);
|
|
224
|
+
for (const chainNodeId of chainNodeIds) {
|
|
225
|
+
this._nodeToChainId.set(chainNodeId, chainId);
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
}
|
|
229
|
+
|
|
230
|
+
for (const key of previousStates.keys()) {
|
|
231
|
+
if (!this._chainDescriptors.has(key)) {
|
|
232
|
+
this._collapsedChainState.delete(key);
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
|
|
236
|
+
this._hiddenNodeIds.clear();
|
|
237
|
+
for (const [chainId, descriptor] of this._chainDescriptors) {
|
|
238
|
+
const collapsed = this._isChainCollapsed(chainId);
|
|
239
|
+
if (collapsed) {
|
|
240
|
+
for (const nodeId of descriptor.nodeIds) {
|
|
241
|
+
// eslint-disable-next-line max-depth
|
|
242
|
+
if (nodeId !== descriptor.representativeId) {
|
|
243
|
+
this._hiddenNodeIds.add(nodeId);
|
|
244
|
+
}
|
|
245
|
+
}
|
|
246
|
+
}
|
|
247
|
+
}
|
|
248
|
+
|
|
249
|
+
this._updateCollapsedChainNodeMetadata();
|
|
250
|
+
|
|
251
|
+
let collapsedCount = 0;
|
|
252
|
+
for (const chainId of this._chainDescriptors.keys()) {
|
|
253
|
+
if (this._isChainCollapsed(chainId)) {
|
|
254
|
+
collapsedCount++;
|
|
255
|
+
}
|
|
256
|
+
}
|
|
257
|
+
|
|
258
|
+
log.log(
|
|
259
|
+
0,
|
|
260
|
+
`CollapsableD3DagLayout: refreshed collapsed chains -> total=${this._chainDescriptors.size}, collapsed=${collapsedCount}`
|
|
261
|
+
);
|
|
262
|
+
}
|
|
263
|
+
|
|
264
|
+
protected override _updateCollapsedChainNodeMetadata(): void {
|
|
265
|
+
if (!this._graph) {
|
|
266
|
+
return;
|
|
267
|
+
}
|
|
268
|
+
|
|
269
|
+
for (const node of this._graph.getNodes()) {
|
|
270
|
+
const nodeId = node.getId();
|
|
271
|
+
const chainId = this._nodeToChainId.get(nodeId);
|
|
272
|
+
|
|
273
|
+
if (!chainId) {
|
|
274
|
+
node.setDataProperty('collapsedChainId', null);
|
|
275
|
+
node.setDataProperty('collapsedChainLength', 1);
|
|
276
|
+
node.setDataProperty('collapsedNodeIds', []);
|
|
277
|
+
node.setDataProperty('collapsedEdgeIds', []);
|
|
278
|
+
node.setDataProperty('collapsedChainRepresentativeId', null);
|
|
279
|
+
node.setDataProperty('isCollapsedChain', false);
|
|
280
|
+
continue;
|
|
281
|
+
}
|
|
282
|
+
|
|
283
|
+
const descriptor = this._chainDescriptors.get(chainId);
|
|
284
|
+
if (!descriptor) {
|
|
285
|
+
node.setDataProperty('collapsedChainId', null);
|
|
286
|
+
node.setDataProperty('collapsedChainLength', 1);
|
|
287
|
+
node.setDataProperty('collapsedNodeIds', []);
|
|
288
|
+
node.setDataProperty('collapsedEdgeIds', []);
|
|
289
|
+
node.setDataProperty('collapsedChainRepresentativeId', null);
|
|
290
|
+
node.setDataProperty('isCollapsedChain', false);
|
|
291
|
+
continue;
|
|
292
|
+
}
|
|
293
|
+
|
|
294
|
+
const collapsed = this._isChainCollapsed(chainId);
|
|
295
|
+
node.setDataProperty('collapsedChainId', chainId);
|
|
296
|
+
node.setDataProperty('collapsedChainLength', collapsed ? descriptor.nodeIds.length : 1);
|
|
297
|
+
node.setDataProperty('collapsedNodeIds', descriptor.nodeIds);
|
|
298
|
+
node.setDataProperty('collapsedEdgeIds', descriptor.edgeIds);
|
|
299
|
+
node.setDataProperty('collapsedChainRepresentativeId', descriptor.representativeId);
|
|
300
|
+
node.setDataProperty('isCollapsedChain', collapsed);
|
|
301
|
+
}
|
|
302
|
+
}
|
|
303
|
+
|
|
304
|
+
protected override _shouldSkipNode(nodeId: string | number): boolean {
|
|
305
|
+
return this._hiddenNodeIds.has(nodeId);
|
|
306
|
+
}
|
|
307
|
+
|
|
308
|
+
protected override _mapNodeId(nodeId: string | number): string | number {
|
|
309
|
+
const chainId = this._nodeToChainId.get(nodeId);
|
|
310
|
+
if (!chainId) {
|
|
311
|
+
return nodeId;
|
|
312
|
+
}
|
|
313
|
+
|
|
314
|
+
const descriptor = this._chainDescriptors.get(chainId);
|
|
315
|
+
if (!descriptor) {
|
|
316
|
+
return nodeId;
|
|
317
|
+
}
|
|
318
|
+
|
|
319
|
+
return this._isChainCollapsed(chainId) ? descriptor.representativeId : nodeId;
|
|
320
|
+
}
|
|
321
|
+
|
|
322
|
+
private _createChainId(nodeIds: (string | number)[]): string {
|
|
323
|
+
return `chain:${nodeIds.map((id) => this._toDagId(id)).join('>')}`;
|
|
324
|
+
}
|
|
325
|
+
|
|
326
|
+
private _isChainCollapsed(chainId: string): boolean {
|
|
327
|
+
const collapseDefault = this.props.collapseLinearChains;
|
|
328
|
+
return this._collapsedChainState.get(chainId) ?? collapseDefault;
|
|
329
|
+
}
|
|
330
|
+
}
|