@react-fabric/graph 1.0.0-beta.62 → 1.0.1
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/cjs/context/context.js +16 -0
- package/dist/cjs/graph/index.js +62 -385
- package/dist/cjs/index.js +25 -21
- package/dist/cjs/utils/edge.js +76 -0
- package/dist/cjs/utils/node.js +93 -0
- package/dist/cjs/utils/sdfFolder.js +107 -0
- package/dist/cjs/viewer/Graph.js +174 -0
- package/dist/esm/context/context.js +15 -0
- package/dist/esm/graph/index.js +63 -386
- package/dist/esm/index.js +24 -20
- package/dist/esm/utils/edge.js +75 -0
- package/dist/esm/utils/node.js +92 -0
- package/dist/esm/utils/sdfFolder.js +107 -0
- package/dist/esm/viewer/Graph.js +174 -0
- package/dist/types/context/context.d.ts +35 -0
- package/dist/types/graph/index.d.ts +47 -24
- package/dist/types/index.d.ts +28 -2
- package/dist/types/types/index.d.ts +124 -175
- package/dist/types/utils/edge.d.ts +28 -0
- package/dist/types/utils/node.d.ts +28 -0
- package/dist/types/utils/sdfFolder.d.ts +75 -0
- package/dist/types/viewer/Graph.d.ts +31 -0
- package/package.json +19 -25
- package/src/context/context.tsx +43 -0
- package/src/graph/index.ts +76 -399
- package/src/index.ts +24 -26
- package/src/types/index.ts +139 -185
- package/src/utils/edge.ts +65 -0
- package/src/utils/node.ts +105 -0
- package/src/utils/sdfFolder.ts +141 -0
- package/src/viewer/Graph.tsx +159 -0
- package/css/styles.css +0 -56
- package/dist/cjs/_virtual/_rollup-plugin-web-worker-loader__helper__auto__createBase64WorkerFactory.js +0 -14
- package/dist/cjs/_virtual/_rollup-plugin-web-worker-loader__helper__auto__isNodeJS.js +0 -9
- package/dist/cjs/_virtual/_rollup-plugin-web-worker-loader__helper__browser__createBase64WorkerFactory.js +0 -35
- package/dist/cjs/_virtual/_rollup-plugin-web-worker-loader__helper__node__WorkerClass.js +0 -11
- package/dist/cjs/_virtual/_rollup-plugin-web-worker-loader__helper__node__createBase64WorkerFactory.js +0 -20
- package/dist/cjs/_virtual/elk-worker.js +0 -8
- package/dist/cjs/components/Context.js +0 -107
- package/dist/cjs/components/ContextMenu.js +0 -133
- package/dist/cjs/components/Tools.js +0 -205
- package/dist/cjs/components/Viewer.js +0 -58
- package/dist/cjs/constants/index.js +0 -16
- package/dist/cjs/hooks/sigmaDragSelect.js +0 -169
- package/dist/cjs/hooks/sigmaHilighter.js +0 -83
- package/dist/cjs/hooks/sigmaMouseActions.js +0 -145
- package/dist/cjs/hooks/useGraphology.js +0 -41
- package/dist/cjs/hooks/useSigma.js +0 -112
- package/dist/cjs/programs/arrow-head/frag.glsl.js +0 -8
- package/dist/cjs/programs/arrow-head/index.js +0 -142
- package/dist/cjs/programs/arrow-head/vert.glsl.js +0 -8
- package/dist/cjs/programs/edge-curve/drawLabel.js +0 -136
- package/dist/cjs/programs/edge-curve/frag.glsl.js +0 -8
- package/dist/cjs/programs/edge-curve/index.js +0 -157
- package/dist/cjs/programs/edge-curve/vert.glsl.js +0 -8
- package/dist/cjs/programs/edge-line/drawLabel.js +0 -70
- package/dist/cjs/programs/edge-line/frag.glsl.js +0 -8
- package/dist/cjs/programs/edge-line/index.js +0 -166
- package/dist/cjs/programs/edge-line/vert.glsl.js +0 -8
- package/dist/cjs/programs/node-badge/factory.js +0 -249
- package/dist/cjs/programs/node-badge/frag.glsl.js +0 -8
- package/dist/cjs/programs/node-badge/index.js +0 -33
- package/dist/cjs/programs/node-badge/texture.js +0 -455
- package/dist/cjs/programs/node-badge/vert.glsl.js +0 -19
- package/dist/cjs/programs/node-circle/base/drawHover.js +0 -71
- package/dist/cjs/programs/node-circle/base/drawLabel.js +0 -113
- package/dist/cjs/programs/node-circle/base/frag.glsl.js +0 -8
- package/dist/cjs/programs/node-circle/base/index.js +0 -136
- package/dist/cjs/programs/node-circle/base/vert.glsl.js +0 -8
- package/dist/cjs/programs/node-circle/index.js +0 -15
- package/dist/cjs/programs/node-image/factory.js +0 -223
- package/dist/cjs/programs/node-image/frag.glsl.js +0 -8
- package/dist/cjs/programs/node-image/index.js +0 -14
- package/dist/cjs/programs/node-image/texture.js +0 -472
- package/dist/cjs/programs/node-image/vert.glsl.js +0 -8
- package/dist/cjs/programs/node-rect/base/drawHover.js +0 -68
- package/dist/cjs/programs/node-rect/base/drawLabel.js +0 -107
- package/dist/cjs/programs/node-rect/base/frag.glsl.js +0 -8
- package/dist/cjs/programs/node-rect/base/index.js +0 -135
- package/dist/cjs/programs/node-rect/base/vert.glsl.js +0 -8
- package/dist/cjs/programs/node-rect/index.js +0 -15
- package/dist/esm/_virtual/_rollup-plugin-web-worker-loader__helper__auto__createBase64WorkerFactory.js +0 -14
- package/dist/esm/_virtual/_rollup-plugin-web-worker-loader__helper__auto__isNodeJS.js +0 -9
- package/dist/esm/_virtual/_rollup-plugin-web-worker-loader__helper__browser__createBase64WorkerFactory.js +0 -34
- package/dist/esm/_virtual/_rollup-plugin-web-worker-loader__helper__node__WorkerClass.js +0 -13
- package/dist/esm/_virtual/_rollup-plugin-web-worker-loader__helper__node__createBase64WorkerFactory.js +0 -20
- package/dist/esm/_virtual/elk-worker.js +0 -8
- package/dist/esm/components/Context.js +0 -106
- package/dist/esm/components/ContextMenu.js +0 -133
- package/dist/esm/components/Tools.js +0 -205
- package/dist/esm/components/Viewer.js +0 -58
- package/dist/esm/constants/index.js +0 -16
- package/dist/esm/hooks/sigmaDragSelect.js +0 -169
- package/dist/esm/hooks/sigmaHilighter.js +0 -83
- package/dist/esm/hooks/sigmaMouseActions.js +0 -145
- package/dist/esm/hooks/useGraphology.js +0 -41
- package/dist/esm/hooks/useSigma.js +0 -112
- package/dist/esm/programs/arrow-head/frag.glsl.js +0 -8
- package/dist/esm/programs/arrow-head/index.js +0 -141
- package/dist/esm/programs/arrow-head/vert.glsl.js +0 -8
- package/dist/esm/programs/edge-curve/drawLabel.js +0 -136
- package/dist/esm/programs/edge-curve/frag.glsl.js +0 -8
- package/dist/esm/programs/edge-curve/index.js +0 -156
- package/dist/esm/programs/edge-curve/vert.glsl.js +0 -8
- package/dist/esm/programs/edge-line/drawLabel.js +0 -70
- package/dist/esm/programs/edge-line/frag.glsl.js +0 -8
- package/dist/esm/programs/edge-line/index.js +0 -166
- package/dist/esm/programs/edge-line/vert.glsl.js +0 -8
- package/dist/esm/programs/node-badge/factory.js +0 -249
- package/dist/esm/programs/node-badge/frag.glsl.js +0 -8
- package/dist/esm/programs/node-badge/index.js +0 -32
- package/dist/esm/programs/node-badge/texture.js +0 -445
- package/dist/esm/programs/node-badge/vert.glsl.js +0 -19
- package/dist/esm/programs/node-circle/base/drawHover.js +0 -71
- package/dist/esm/programs/node-circle/base/drawLabel.js +0 -113
- package/dist/esm/programs/node-circle/base/frag.glsl.js +0 -8
- package/dist/esm/programs/node-circle/base/index.js +0 -136
- package/dist/esm/programs/node-circle/base/vert.glsl.js +0 -8
- package/dist/esm/programs/node-circle/index.js +0 -15
- package/dist/esm/programs/node-image/factory.js +0 -223
- package/dist/esm/programs/node-image/frag.glsl.js +0 -8
- package/dist/esm/programs/node-image/index.js +0 -13
- package/dist/esm/programs/node-image/texture.js +0 -462
- package/dist/esm/programs/node-image/vert.glsl.js +0 -8
- package/dist/esm/programs/node-rect/base/drawHover.js +0 -68
- package/dist/esm/programs/node-rect/base/drawLabel.js +0 -107
- package/dist/esm/programs/node-rect/base/frag.glsl.js +0 -8
- package/dist/esm/programs/node-rect/base/index.js +0 -135
- package/dist/esm/programs/node-rect/base/vert.glsl.js +0 -8
- package/dist/esm/programs/node-rect/index.js +0 -15
- package/dist/types/components/Context.d.ts +0 -18
- package/dist/types/components/ContextMenu.d.ts +0 -1
- package/dist/types/components/Tools.d.ts +0 -1
- package/dist/types/components/Viewer.d.ts +0 -2
- package/dist/types/constants/index.d.ts +0 -12
- package/dist/types/graph/layout.worker.d.ts +0 -1
- package/dist/types/hooks/sigmaDragSelect.d.ts +0 -8
- package/dist/types/hooks/sigmaHilighter.d.ts +0 -3
- package/dist/types/hooks/sigmaMouseActions.d.ts +0 -3
- package/dist/types/hooks/useGraphology.d.ts +0 -6
- package/dist/types/hooks/useSigma.d.ts +0 -8
- package/dist/types/i18n/index.d.ts +0 -0
- package/dist/types/programs/arrow-head/frag.glsl.d.ts +0 -2
- package/dist/types/programs/arrow-head/index.d.ts +0 -9
- package/dist/types/programs/arrow-head/vert.glsl.d.ts +0 -2
- package/dist/types/programs/edge-curve/drawLabel.d.ts +0 -6
- package/dist/types/programs/edge-curve/frag.glsl.d.ts +0 -2
- package/dist/types/programs/edge-curve/index.d.ts +0 -43
- package/dist/types/programs/edge-curve/vert.glsl.d.ts +0 -2
- package/dist/types/programs/edge-line/drawLabel.d.ts +0 -5
- package/dist/types/programs/edge-line/frag.glsl.d.ts +0 -2
- package/dist/types/programs/edge-line/index.d.ts +0 -11
- package/dist/types/programs/edge-line/vert.glsl.d.ts +0 -2
- package/dist/types/programs/node-badge/factory.d.ts +0 -27
- package/dist/types/programs/node-badge/frag.glsl.d.ts +0 -2
- package/dist/types/programs/node-badge/index.d.ts +0 -5
- package/dist/types/programs/node-badge/texture.d.ts +0 -102
- package/dist/types/programs/node-badge/vert.glsl.d.ts +0 -2
- package/dist/types/programs/node-circle/base/drawHover.d.ts +0 -8
- package/dist/types/programs/node-circle/base/drawLabel.d.ts +0 -8
- package/dist/types/programs/node-circle/base/frag.glsl.d.ts +0 -2
- package/dist/types/programs/node-circle/base/index.d.ts +0 -37
- package/dist/types/programs/node-circle/base/vert.glsl.d.ts +0 -2
- package/dist/types/programs/node-circle/index.d.ts +0 -11
- package/dist/types/programs/node-image/factory.d.ts +0 -25
- package/dist/types/programs/node-image/frag.glsl.d.ts +0 -2
- package/dist/types/programs/node-image/index.d.ts +0 -5
- package/dist/types/programs/node-image/texture.d.ts +0 -102
- package/dist/types/programs/node-image/vert.glsl.d.ts +0 -2
- package/dist/types/programs/node-rect/base/drawHover.d.ts +0 -8
- package/dist/types/programs/node-rect/base/drawLabel.d.ts +0 -8
- package/dist/types/programs/node-rect/base/frag.glsl.d.ts +0 -2
- package/dist/types/programs/node-rect/base/index.d.ts +0 -34
- package/dist/types/programs/node-rect/base/vert.glsl.d.ts +0 -2
- package/dist/types/programs/node-rect/index.d.ts +0 -11
- package/src/components/Context.tsx +0 -143
- package/src/components/ContextMenu.tsx +0 -174
- package/src/components/Tools.tsx +0 -106
- package/src/components/Viewer.tsx +0 -76
- package/src/constants/index.ts +0 -22
- package/src/graph/layout.worker.ts +0 -42
- package/src/hooks/sigmaDragSelect.ts +0 -219
- package/src/hooks/sigmaHilighter.ts +0 -107
- package/src/hooks/sigmaMouseActions.ts +0 -153
- package/src/hooks/useGraphology.ts +0 -31
- package/src/hooks/useSigma.ts +0 -118
- package/src/i18n/index.ts +0 -0
- package/src/programs/arrow-head/frag.glsl.ts +0 -18
- package/src/programs/arrow-head/index.ts +0 -157
- package/src/programs/arrow-head/vert.glsl.ts +0 -75
- package/src/programs/edge-curve/drawLabel.ts +0 -166
- package/src/programs/edge-curve/frag.glsl.ts +0 -86
- package/src/programs/edge-curve/index.ts +0 -158
- package/src/programs/edge-curve/vert.glsl.ts +0 -110
- package/src/programs/edge-line/drawLabel.ts +0 -113
- package/src/programs/edge-line/frag.glsl.ts +0 -34
- package/src/programs/edge-line/index.ts +0 -165
- package/src/programs/edge-line/vert.glsl.ts +0 -104
- package/src/programs/node-badge/factory.ts +0 -327
- package/src/programs/node-badge/frag.glsl.ts +0 -79
- package/src/programs/node-badge/index.ts +0 -35
- package/src/programs/node-badge/texture.ts +0 -425
- package/src/programs/node-badge/vert.glsl.ts +0 -99
- package/src/programs/node-circle/base/drawHover.ts +0 -80
- package/src/programs/node-circle/base/drawLabel.ts +0 -145
- package/src/programs/node-circle/base/frag.glsl.ts +0 -72
- package/src/programs/node-circle/base/index.ts +0 -102
- package/src/programs/node-circle/base/vert.glsl.ts +0 -83
- package/src/programs/node-circle/index.ts +0 -19
- package/src/programs/node-image/factory.ts +0 -301
- package/src/programs/node-image/frag.glsl.ts +0 -97
- package/src/programs/node-image/index.ts +0 -7
- package/src/programs/node-image/texture.ts +0 -435
- package/src/programs/node-image/vert.glsl.ts +0 -60
- package/src/programs/node-rect/base/drawHover.ts +0 -77
- package/src/programs/node-rect/base/drawLabel.ts +0 -149
- package/src/programs/node-rect/base/frag.glsl.ts +0 -67
- package/src/programs/node-rect/base/index.ts +0 -109
- package/src/programs/node-rect/base/vert.glsl.ts +0 -87
- package/src/programs/node-rect/index.ts +0 -19
package/src/graph/index.ts
CHANGED
|
@@ -1,27 +1,35 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
1
|
+
/**
|
|
2
|
+
* React Fabric
|
|
3
|
+
* @version 1.0.0
|
|
4
|
+
* @license MIT
|
|
5
|
+
* @copyright 2024 Adarsh Pastakia
|
|
6
|
+
*
|
|
7
|
+
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
8
|
+
* of this software and associated documentation files (the "Software"), to deal
|
|
9
|
+
* in the Software without restriction, including without limitation the rights
|
|
10
|
+
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
11
|
+
* copies of the Software, and to permit persons to whom the Software is
|
|
12
|
+
* furnished to do so, subject to the following conditions:
|
|
13
|
+
*
|
|
14
|
+
* The above copyright notice and this permission notice shall be included in all
|
|
15
|
+
* copies or substantial portions of the Software.
|
|
16
|
+
*
|
|
17
|
+
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
18
|
+
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
19
|
+
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
20
|
+
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
21
|
+
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
22
|
+
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
23
|
+
* SOFTWARE.
|
|
24
|
+
*/
|
|
25
|
+
|
|
7
26
|
import Graphology from "graphology";
|
|
8
|
-
import {
|
|
9
|
-
import forceAtlas2
|
|
10
|
-
|
|
11
|
-
} from "
|
|
12
|
-
import ForceAtlas2Worker from "graphology-layout-forceatlas2/worker";
|
|
13
|
-
import { type GraphEvents, type GraphOptions } from "graphology-types";
|
|
14
|
-
import { animateNodes } from "sigma/utils";
|
|
15
|
-
// @ts-expect-error ignore
|
|
16
|
-
import ElkWorker from "../../../../node_modules/elkjs/lib/elk-worker?worker";
|
|
17
|
-
import {
|
|
18
|
-
type EdgeAttributes,
|
|
19
|
-
type InternalNodeAttributes,
|
|
20
|
-
type NodeAttributes,
|
|
21
|
-
type RawGraph,
|
|
22
|
-
} from "../types";
|
|
27
|
+
import { random } from "graphology-layout";
|
|
28
|
+
import forceAtlas2 from "graphology-layout-forceatlas2";
|
|
29
|
+
import type { GraphEvents } from "graphology-types";
|
|
30
|
+
import type { EdgeAttributes, InternalEdge, InternalNode, NodeAttributes, RawGraph } from "../types";
|
|
23
31
|
|
|
24
|
-
interface ExtendedEvents extends GraphEvents {
|
|
32
|
+
interface ExtendedEvents<N extends KeyValue = KeyValue, E extends KeyValue = KeyValue> extends GraphEvents<InternalNode<N>, InternalEdge<E>> {
|
|
25
33
|
nodesLoaded: (nodes: string[]) => void;
|
|
26
34
|
nodesDropped: (nodes: string[]) => void;
|
|
27
35
|
nodesSelected: (nodes: string[]) => void;
|
|
@@ -29,405 +37,74 @@ interface ExtendedEvents extends GraphEvents {
|
|
|
29
37
|
layoutDone: () => void;
|
|
30
38
|
}
|
|
31
39
|
|
|
32
|
-
export class Graph<N = KeyValue, E = KeyValue> extends Graphology<
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
KeyValue
|
|
36
|
-
> {
|
|
37
|
-
constructor(options?: GraphOptions) {
|
|
38
|
-
super(options);
|
|
39
|
-
|
|
40
|
-
const edgeHandler = debounce(() => this.checkParallelEdges());
|
|
41
|
-
this.on("edgeAdded", edgeHandler);
|
|
42
|
-
this.on("edgeDropped", edgeHandler);
|
|
43
|
-
|
|
44
|
-
const fireNodeSelect = debounce(() => {
|
|
45
|
-
this.emit(
|
|
46
|
-
"nodesSelected",
|
|
47
|
-
this.filterNodes((_, atts) => atts.selected),
|
|
48
|
-
);
|
|
49
|
-
});
|
|
50
|
-
const nodeSelectHandler = ({ name }: KeyValue) => {
|
|
51
|
-
if (name === "selected") {
|
|
52
|
-
fireNodeSelect();
|
|
53
|
-
}
|
|
54
|
-
};
|
|
55
|
-
this.on("nodeDropped", fireNodeSelect);
|
|
56
|
-
this.on("nodeAttributesUpdated", nodeSelectHandler);
|
|
57
|
-
}
|
|
58
|
-
|
|
59
|
-
on<Event extends keyof ExtendedEvents>(
|
|
60
|
-
type: Event,
|
|
61
|
-
listener: ExtendedEvents[Event],
|
|
62
|
-
) {
|
|
63
|
-
return super.on(type as AnyObject, listener);
|
|
64
|
-
}
|
|
65
|
-
|
|
66
|
-
off<Event extends keyof ExtendedEvents>(
|
|
67
|
-
type: Event,
|
|
68
|
-
listener: ExtendedEvents[Event],
|
|
69
|
-
) {
|
|
70
|
-
return super.off(type as AnyObject, listener);
|
|
71
|
-
}
|
|
72
|
-
|
|
73
|
-
emit<Event extends keyof ExtendedEvents>(
|
|
74
|
-
type: Event,
|
|
75
|
-
...args: Parameters<ExtendedEvents[Event]>
|
|
76
|
-
) {
|
|
77
|
-
return super.emit(type as AnyObject, ...args);
|
|
78
|
-
}
|
|
79
|
-
|
|
80
|
-
mergeNodes(
|
|
81
|
-
key: string,
|
|
82
|
-
nodes: string[],
|
|
83
|
-
attributesOrNodeReducer?:
|
|
84
|
-
| NodeAttributes<N>
|
|
85
|
-
| ((attributes: Array<NodeAttributes<N>>) => NodeAttributes<N>),
|
|
86
|
-
edgeReducer?: (edges: RawGraph<N, E>["edges"]) => RawGraph<N, E>["edges"],
|
|
87
|
-
) {
|
|
88
|
-
if (!nodes.length) return;
|
|
89
|
-
let newNodeAttributes: NodeAttributes<N> = {};
|
|
90
|
-
let edgeList: RawGraph<N, E>["edges"] = [];
|
|
91
|
-
const attributeList: Array<NodeAttributes<N>> = [];
|
|
92
|
-
nodes.forEach((n) => {
|
|
93
|
-
const atts = this.getNodeAttributes(n);
|
|
94
|
-
if (atts) {
|
|
95
|
-
attributeList.push(atts);
|
|
96
|
-
}
|
|
97
|
-
const edges = this.edges(n);
|
|
98
|
-
if (edges.length) {
|
|
99
|
-
edges.forEach((e) => {
|
|
100
|
-
const source = this.source(e);
|
|
101
|
-
const target = this.target(e);
|
|
102
|
-
const edge = this.getEdgeAttributes(e);
|
|
103
|
-
if (edge) {
|
|
104
|
-
edgeList.push({
|
|
105
|
-
key: e,
|
|
106
|
-
// move source to new node if source is old node
|
|
107
|
-
source: source === n ? key : source,
|
|
108
|
-
// move target to new node if target is old node
|
|
109
|
-
target: target === n ? key : target,
|
|
110
|
-
attributes: edge,
|
|
111
|
-
});
|
|
112
|
-
}
|
|
113
|
-
});
|
|
114
|
-
}
|
|
115
|
-
});
|
|
116
|
-
if (typeof attributesOrNodeReducer === "function") {
|
|
117
|
-
newNodeAttributes = attributesOrNodeReducer(attributeList);
|
|
118
|
-
} else if (typeof attributesOrNodeReducer === "object") {
|
|
119
|
-
Object.assign(newNodeAttributes, attributesOrNodeReducer);
|
|
120
|
-
}
|
|
121
|
-
if (typeof edgeReducer === "function") {
|
|
122
|
-
edgeList = edgeReducer(edgeList);
|
|
123
|
-
}
|
|
124
|
-
this.dropNodes(nodes);
|
|
125
|
-
this.import(
|
|
126
|
-
{
|
|
127
|
-
nodes: [{ key, attributes: newNodeAttributes }],
|
|
128
|
-
edges: edgeList,
|
|
129
|
-
},
|
|
130
|
-
true,
|
|
131
|
-
);
|
|
132
|
-
return this;
|
|
40
|
+
export class Graph<N extends KeyValue = KeyValue, E extends KeyValue = KeyValue> extends Graphology<NodeAttributes<N>, EdgeAttributes<E>> {
|
|
41
|
+
constructor() {
|
|
42
|
+
super({ multi: true });
|
|
133
43
|
}
|
|
134
44
|
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
attributesOrNodeReducer?:
|
|
139
|
-
| NodeAttributes<N>
|
|
140
|
-
| ((attributes: Array<NodeAttributes<N>>) => NodeAttributes<N>),
|
|
141
|
-
edgeReducer?: (edges: RawGraph<N, E>["edges"]) => RawGraph<N, E>["edges"],
|
|
142
|
-
) {
|
|
143
|
-
if (!nodes.length) return;
|
|
144
|
-
let newNodeAttributes: NodeAttributes<N> = {
|
|
145
|
-
nodeList: nodes,
|
|
146
|
-
isGroup: true,
|
|
147
|
-
expanded: false,
|
|
148
|
-
} as any;
|
|
149
|
-
let edgeList: RawGraph<N, E>["edges"] = [];
|
|
150
|
-
const movedEdges: RawGraph<N, E>["edges"] = [];
|
|
151
|
-
const attributeList: Array<NodeAttributes<N>> = [];
|
|
152
|
-
nodes.forEach((n) => {
|
|
153
|
-
const atts = this.getNodeAttributes(n);
|
|
154
|
-
if (atts) {
|
|
155
|
-
attributeList.push(atts);
|
|
156
|
-
}
|
|
157
|
-
const edges = this.edges(n);
|
|
158
|
-
if (edges.length) {
|
|
159
|
-
const nodeEdges = edges.map((e) => {
|
|
160
|
-
const source = this.source(e);
|
|
161
|
-
const target = this.target(e);
|
|
162
|
-
const edge = this.getEdgeAttributes(e);
|
|
163
|
-
if (edge) {
|
|
164
|
-
movedEdges.push({
|
|
165
|
-
key: e,
|
|
166
|
-
// move source to group node if source is not old node
|
|
167
|
-
source: source === n ? n : key,
|
|
168
|
-
// move target to group node if target is not old node
|
|
169
|
-
target: target === n ? n : key,
|
|
170
|
-
attributes: edge,
|
|
171
|
-
});
|
|
172
|
-
// make new connection to neighboring node
|
|
173
|
-
edgeList.push({
|
|
174
|
-
key: `${key}-${e}`,
|
|
175
|
-
source: source === n ? key : source,
|
|
176
|
-
target: target === n ? key : target,
|
|
177
|
-
attributes: edge,
|
|
178
|
-
});
|
|
179
|
-
}
|
|
180
|
-
this.dropEdge(e);
|
|
181
|
-
return {
|
|
182
|
-
key: e,
|
|
183
|
-
// move source to group node if source is not old node
|
|
184
|
-
source,
|
|
185
|
-
// move target to group node if target is not old node
|
|
186
|
-
target,
|
|
187
|
-
attributes: edge,
|
|
188
|
-
};
|
|
189
|
-
});
|
|
190
|
-
this.setNodeAttribute(n, "hidden", true);
|
|
191
|
-
this.setNodeAttribute(n, "selected", false);
|
|
192
|
-
// store original edges for grouped node
|
|
193
|
-
this.setNodeAttribute(n, "originalEdges", nodeEdges);
|
|
194
|
-
}
|
|
195
|
-
});
|
|
196
|
-
if (typeof attributesOrNodeReducer === "function") {
|
|
197
|
-
newNodeAttributes = Object.assign(
|
|
198
|
-
newNodeAttributes,
|
|
199
|
-
attributesOrNodeReducer(attributeList),
|
|
200
|
-
);
|
|
201
|
-
} else if (typeof attributesOrNodeReducer === "object") {
|
|
202
|
-
Object.assign(newNodeAttributes, attributesOrNodeReducer);
|
|
203
|
-
}
|
|
204
|
-
if (typeof edgeReducer === "function") {
|
|
205
|
-
edgeList = edgeReducer(edgeList);
|
|
206
|
-
}
|
|
207
|
-
this.import(
|
|
45
|
+
importGraph(data: RawGraph<N, E>, applyLayout = true): this {
|
|
46
|
+
super.clear();
|
|
47
|
+
super.import(
|
|
208
48
|
{
|
|
209
|
-
nodes:
|
|
210
|
-
edges:
|
|
49
|
+
nodes: data.nodes.map((n) => ({ key: n.id, attributes: this.enrichNodeAttributes(n) })),
|
|
50
|
+
edges: data.edges.map((e) => ({
|
|
51
|
+
key: e.id,
|
|
52
|
+
source: e.source,
|
|
53
|
+
target: e.target,
|
|
54
|
+
attributes: e,
|
|
55
|
+
})),
|
|
211
56
|
},
|
|
212
|
-
|
|
57
|
+
false,
|
|
213
58
|
);
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
nodes.forEach((n: string) => {
|
|
222
|
-
const originalEdges = this.getNodeAttribute(n, "originalEdges");
|
|
223
|
-
if (originalEdges && Array.isArray(originalEdges)) {
|
|
224
|
-
originalEdges.forEach((e) => {
|
|
225
|
-
this.addEdgeWithKey(e.key, e.source, e.target, e.attributes);
|
|
59
|
+
setTimeout(() => {
|
|
60
|
+
if (applyLayout) {
|
|
61
|
+
random.assign(this);
|
|
62
|
+
const settings = forceAtlas2.inferSettings(this);
|
|
63
|
+
forceAtlas2.assign(this, {
|
|
64
|
+
iterations: 500,
|
|
65
|
+
settings,
|
|
226
66
|
});
|
|
227
67
|
}
|
|
228
|
-
this.
|
|
229
|
-
|
|
230
|
-
});
|
|
231
|
-
this.dropNode(node);
|
|
68
|
+
this.emit("layoutDone");
|
|
69
|
+
}, 500);
|
|
232
70
|
return this;
|
|
233
71
|
}
|
|
234
72
|
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
const nodes = this.getNodeAttribute(node, "nodeList");
|
|
238
|
-
this.setNodeAttribute(node, "expanded", expanded);
|
|
239
|
-
nodes?.forEach((n: string) => {
|
|
240
|
-
this.setNodeAttribute(n, "hidden", !expanded);
|
|
241
|
-
});
|
|
242
|
-
return this;
|
|
73
|
+
on<Event extends keyof ExtendedEvents<N, E>>(type: Event, listener: ExtendedEvents<N, E>[Event]) {
|
|
74
|
+
return super.on(type as AnyObject, listener);
|
|
243
75
|
}
|
|
244
76
|
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
const newNodes = [];
|
|
248
|
-
if (data instanceof Graph) {
|
|
249
|
-
newNodes.push(...data.nodes());
|
|
250
|
-
} else {
|
|
251
|
-
newNodes.push(...data.nodes.map((n) => n.key));
|
|
252
|
-
}
|
|
253
|
-
super.import(data as any, merge);
|
|
254
|
-
// fire events for nodes added
|
|
255
|
-
this.emit("nodesLoaded", newNodes);
|
|
256
|
-
// apply random positions for nodes
|
|
257
|
-
// const positions = random(this as any);
|
|
258
|
-
// animateNodes(
|
|
259
|
-
// this as any,
|
|
260
|
-
// positions,
|
|
261
|
-
// {
|
|
262
|
-
// duration: 200,
|
|
263
|
-
// },
|
|
264
|
-
// () => {
|
|
265
|
-
// // fire layout done event
|
|
266
|
-
// this.emit("layoutDone");
|
|
267
|
-
// },
|
|
268
|
-
// );
|
|
269
|
-
void this.elkLayout("force");
|
|
270
|
-
return this;
|
|
77
|
+
off<Event extends keyof ExtendedEvents<N, E>>(type: Event, listener: ExtendedEvents<N, E>[Event]) {
|
|
78
|
+
return super.off(type as AnyObject, listener);
|
|
271
79
|
}
|
|
272
80
|
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
const positions = circular(this as any);
|
|
276
|
-
animateNodes(
|
|
277
|
-
this as any,
|
|
278
|
-
positions,
|
|
279
|
-
{
|
|
280
|
-
duration: 200,
|
|
281
|
-
},
|
|
282
|
-
() => {
|
|
283
|
-
this.emit("layoutDone");
|
|
284
|
-
},
|
|
285
|
-
);
|
|
286
|
-
return this;
|
|
81
|
+
emit<Event extends keyof ExtendedEvents<N, E>>(type: Event, ...args: Parameters<ExtendedEvents<N, E>[Event]>) {
|
|
82
|
+
return super.emit(type as AnyObject, ...args);
|
|
287
83
|
}
|
|
288
84
|
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
clearTimeout(this._timer);
|
|
296
|
-
}
|
|
297
|
-
this._worker?.kill();
|
|
298
|
-
this._worker = new ForceAtlas2Worker(this as any, {
|
|
299
|
-
settings: {
|
|
300
|
-
...sensibleSettings,
|
|
301
|
-
...settings,
|
|
302
|
-
},
|
|
303
|
-
});
|
|
304
|
-
this.emit("layoutRunning", true);
|
|
305
|
-
this._worker.start();
|
|
306
|
-
this._timer = setTimeout(
|
|
307
|
-
() => {
|
|
308
|
-
this._worker?.stop();
|
|
309
|
-
this._worker?.kill();
|
|
310
|
-
this.emit("layoutRunning", false);
|
|
311
|
-
this.emit("layoutDone");
|
|
312
|
-
},
|
|
313
|
-
// @ts-expect-error ignore
|
|
314
|
-
this.nodes().length * window.__GRAPH_LAYOUT_DURATION_MULTIPLIER__,
|
|
315
|
-
);
|
|
85
|
+
/**
|
|
86
|
+
* @deprecated
|
|
87
|
+
* use `importGraph` instead
|
|
88
|
+
*/
|
|
89
|
+
override import(): this {
|
|
90
|
+
throw new Error("Graphology import is deprecated, use `importGraph` instead");
|
|
316
91
|
return this;
|
|
317
92
|
}
|
|
318
93
|
|
|
319
|
-
// @ts-expect-error ignore
|
|
320
|
-
private elk: ELK;
|
|
321
|
-
async elkLayout(type: string) {
|
|
322
|
-
if (!this.elk)
|
|
323
|
-
this.elk = new ElkConstructor({
|
|
324
|
-
workerFactory() {
|
|
325
|
-
return new ElkWorker();
|
|
326
|
-
},
|
|
327
|
-
});
|
|
328
|
-
this.emit("layoutRunning", true);
|
|
329
|
-
this.elk
|
|
330
|
-
.layout(
|
|
331
|
-
{
|
|
332
|
-
id: "root",
|
|
333
|
-
// width: 1600,
|
|
334
|
-
// height: 900,
|
|
335
|
-
children: this.mapNodes((node, atts) => ({
|
|
336
|
-
id: node,
|
|
337
|
-
width: atts.size ?? Math.max(16, (atts.weight ?? 0) * 3),
|
|
338
|
-
height: atts.size ?? Math.max(16, (atts.weight ?? 0) * 3),
|
|
339
|
-
})),
|
|
340
|
-
edges: this.mapEdges((edge, _, source, target) => ({
|
|
341
|
-
id: edge,
|
|
342
|
-
sources: [source],
|
|
343
|
-
targets: [target],
|
|
344
|
-
})),
|
|
345
|
-
},
|
|
346
|
-
{
|
|
347
|
-
logging: true,
|
|
348
|
-
measureExecutionTime: true,
|
|
349
|
-
layoutOptions: { "elk.algorithm": type },
|
|
350
|
-
},
|
|
351
|
-
)
|
|
352
|
-
.then((graph) => {
|
|
353
|
-
const positions = Object.fromEntries(
|
|
354
|
-
graph.children?.map((node) => [
|
|
355
|
-
node.id,
|
|
356
|
-
{ x: node.x ?? 0, y: node.y ?? 0 },
|
|
357
|
-
]) ?? [],
|
|
358
|
-
);
|
|
359
|
-
animateNodes(
|
|
360
|
-
this as any,
|
|
361
|
-
positions,
|
|
362
|
-
{
|
|
363
|
-
duration: 200,
|
|
364
|
-
},
|
|
365
|
-
() => {
|
|
366
|
-
setTimeout(() => {
|
|
367
|
-
this.emit("layoutDone");
|
|
368
|
-
}, 100);
|
|
369
|
-
},
|
|
370
|
-
);
|
|
371
|
-
})
|
|
372
|
-
.catch(console.error)
|
|
373
|
-
.finally(() => {
|
|
374
|
-
this.emit("layoutRunning", false);
|
|
375
|
-
});
|
|
376
|
-
}
|
|
377
|
-
|
|
378
|
-
dropNodes(nodes: string[]) {
|
|
379
|
-
if (!nodes.length) return;
|
|
380
|
-
nodes.forEach((n) => this.dropNode(n));
|
|
381
|
-
}
|
|
382
|
-
|
|
383
94
|
/**
|
|
384
|
-
*
|
|
95
|
+
* @deprecated
|
|
96
|
+
* use `exportGraph` instead
|
|
385
97
|
*/
|
|
386
|
-
|
|
387
|
-
|
|
388
|
-
|
|
389
|
-
const amplitude = 0.25;
|
|
390
|
-
const maxCurvature =
|
|
391
|
-
amplitude *
|
|
392
|
-
(1 - Math.exp(-maxIndex / amplitude)) *
|
|
393
|
-
DEFAULT_EDGE_CURVATURE;
|
|
394
|
-
return (maxCurvature * index) / maxIndex;
|
|
98
|
+
override export() {
|
|
99
|
+
throw new Error("Graphology export is deprecated, use `exportGraph` instead");
|
|
100
|
+
return { nodes: [], edges: [], attributes: {}, options: {} };
|
|
395
101
|
}
|
|
396
102
|
|
|
397
|
-
private
|
|
398
|
-
|
|
399
|
-
|
|
400
|
-
|
|
401
|
-
|
|
402
|
-
|
|
403
|
-
edgeMaxIndexAttribute: "parallelMaxIndex",
|
|
404
|
-
});
|
|
405
|
-
// Adapt types and curvature of parallel edges for rendering:
|
|
406
|
-
this.forEachEdge(
|
|
407
|
-
(
|
|
408
|
-
edge: string,
|
|
409
|
-
{ parallelIndex, parallelMinIndex, parallelMaxIndex }: AnyObject,
|
|
410
|
-
) => {
|
|
411
|
-
if (typeof parallelMinIndex === "number") {
|
|
412
|
-
this.mergeEdgeAttributes(edge, {
|
|
413
|
-
type: parallelIndex ? "curved" : "line",
|
|
414
|
-
curvature: this.getCurvature(
|
|
415
|
-
parallelIndex ?? 1,
|
|
416
|
-
parallelMaxIndex ?? 1,
|
|
417
|
-
),
|
|
418
|
-
} as AnyObject);
|
|
419
|
-
} else if (typeof parallelIndex === "number") {
|
|
420
|
-
this.mergeEdgeAttributes(edge, {
|
|
421
|
-
type: "curved",
|
|
422
|
-
curvature: this.getCurvature(
|
|
423
|
-
parallelIndex ?? 1,
|
|
424
|
-
parallelMaxIndex ?? 1,
|
|
425
|
-
),
|
|
426
|
-
} as AnyObject);
|
|
427
|
-
} else {
|
|
428
|
-
this.setEdgeAttribute(edge, "type", "line" as AnyObject);
|
|
429
|
-
}
|
|
430
|
-
},
|
|
431
|
-
);
|
|
103
|
+
private enrichNodeAttributes(node: InternalNode<N>) {
|
|
104
|
+
if (!node.x && !node.y) {
|
|
105
|
+
node.x = 0;
|
|
106
|
+
node.y = 0;
|
|
107
|
+
}
|
|
108
|
+
return node;
|
|
432
109
|
}
|
|
433
110
|
}
|
package/src/index.ts
CHANGED
|
@@ -1,34 +1,32 @@
|
|
|
1
|
-
|
|
1
|
+
/**
|
|
2
2
|
* React Fabric
|
|
3
|
-
* @version
|
|
3
|
+
* @version 1.0.0
|
|
4
|
+
* @license MIT
|
|
5
|
+
* @copyright 2024 Adarsh Pastakia
|
|
4
6
|
*
|
|
7
|
+
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
8
|
+
* of this software and associated documentation files (the "Software"), to deal
|
|
9
|
+
* in the Software without restriction, including without limitation the rights
|
|
10
|
+
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
11
|
+
* copies of the Software, and to permit persons to whom the Software is
|
|
12
|
+
* furnished to do so, subject to the following conditions:
|
|
5
13
|
*
|
|
6
|
-
* The
|
|
7
|
-
*
|
|
14
|
+
* The above copyright notice and this permission notice shall be included in all
|
|
15
|
+
* copies or substantial portions of the Software.
|
|
8
16
|
*
|
|
9
|
-
*
|
|
10
|
-
*
|
|
11
|
-
*
|
|
12
|
-
*
|
|
13
|
-
*
|
|
14
|
-
*
|
|
15
|
-
*
|
|
16
|
-
* portions of the Software.
|
|
17
|
-
*
|
|
18
|
-
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED
|
|
19
|
-
* TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
|
|
20
|
-
* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
|
|
21
|
-
* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|
17
|
+
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
18
|
+
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
19
|
+
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
20
|
+
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
21
|
+
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
22
|
+
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
23
|
+
* SOFTWARE.
|
|
22
24
|
*/
|
|
23
25
|
|
|
24
|
-
export
|
|
26
|
+
export const GRAPH_PACKAGE = "@react-fabric/graph";
|
|
27
|
+
export const GRAPH_VERSION = "1.0.0";
|
|
28
|
+
|
|
25
29
|
export { Graph } from "./graph";
|
|
26
|
-
export type {
|
|
27
|
-
EdgeAttributes,
|
|
28
|
-
GraphRef,
|
|
29
|
-
NodeAttributes,
|
|
30
|
-
RawGraph,
|
|
31
|
-
} from "./types";
|
|
30
|
+
export type { EdgeAttributes, InternalEdge, InternalNode, NodeAttributes, PublicEdge, PublicNode, RawGraph } from "./types";
|
|
32
31
|
|
|
33
|
-
|
|
34
|
-
window.__GRAPH_LAYOUT_DURATION_MULTIPLIER__ = 10;
|
|
32
|
+
export { GraphViewer } from "./viewer/Graph";
|