@react-fabric/graph 1.0.0-beta.63 → 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.
Files changed (224) hide show
  1. package/dist/cjs/context/context.js +16 -0
  2. package/dist/cjs/graph/index.js +58 -381
  3. package/dist/cjs/index.js +25 -21
  4. package/dist/cjs/utils/edge.js +76 -0
  5. package/dist/cjs/utils/node.js +93 -0
  6. package/dist/cjs/utils/sdfFolder.js +107 -0
  7. package/dist/cjs/viewer/Graph.js +174 -0
  8. package/dist/esm/context/context.js +15 -0
  9. package/dist/esm/graph/index.js +59 -382
  10. package/dist/esm/index.js +24 -20
  11. package/dist/esm/utils/edge.js +75 -0
  12. package/dist/esm/utils/node.js +92 -0
  13. package/dist/esm/utils/sdfFolder.js +107 -0
  14. package/dist/esm/viewer/Graph.js +174 -0
  15. package/dist/types/context/context.d.ts +35 -0
  16. package/dist/types/graph/index.d.ts +47 -24
  17. package/dist/types/index.d.ts +28 -2
  18. package/dist/types/types/index.d.ts +124 -175
  19. package/dist/types/utils/edge.d.ts +28 -0
  20. package/dist/types/utils/node.d.ts +28 -0
  21. package/dist/types/utils/sdfFolder.d.ts +75 -0
  22. package/dist/types/viewer/Graph.d.ts +31 -0
  23. package/package.json +19 -25
  24. package/src/context/context.tsx +43 -0
  25. package/src/graph/index.ts +76 -399
  26. package/src/index.ts +24 -26
  27. package/src/types/index.ts +139 -185
  28. package/src/utils/edge.ts +65 -0
  29. package/src/utils/node.ts +105 -0
  30. package/src/utils/sdfFolder.ts +141 -0
  31. package/src/viewer/Graph.tsx +159 -0
  32. package/css/styles.css +0 -56
  33. package/dist/cjs/_virtual/_rollup-plugin-web-worker-loader__helper__auto__createBase64WorkerFactory.js +0 -14
  34. package/dist/cjs/_virtual/_rollup-plugin-web-worker-loader__helper__auto__isNodeJS.js +0 -9
  35. package/dist/cjs/_virtual/_rollup-plugin-web-worker-loader__helper__browser__createBase64WorkerFactory.js +0 -35
  36. package/dist/cjs/_virtual/_rollup-plugin-web-worker-loader__helper__node__WorkerClass.js +0 -11
  37. package/dist/cjs/_virtual/_rollup-plugin-web-worker-loader__helper__node__createBase64WorkerFactory.js +0 -20
  38. package/dist/cjs/_virtual/elk-worker.js +0 -8
  39. package/dist/cjs/components/ContextMenu.js +0 -133
  40. package/dist/cjs/components/Provider.js +0 -103
  41. package/dist/cjs/components/Tools.js +0 -205
  42. package/dist/cjs/components/Viewer.js +0 -59
  43. package/dist/cjs/components/context.js +0 -34
  44. package/dist/cjs/constants/index.js +0 -16
  45. package/dist/cjs/hooks/sigmaDragSelect.js +0 -169
  46. package/dist/cjs/hooks/sigmaHilighter.js +0 -83
  47. package/dist/cjs/hooks/sigmaMouseActions.js +0 -145
  48. package/dist/cjs/hooks/useGraphology.js +0 -41
  49. package/dist/cjs/hooks/useSigma.js +0 -112
  50. package/dist/cjs/programs/arrow-head/frag.glsl.js +0 -8
  51. package/dist/cjs/programs/arrow-head/index.js +0 -142
  52. package/dist/cjs/programs/arrow-head/vert.glsl.js +0 -8
  53. package/dist/cjs/programs/edge-curve/drawLabel.js +0 -136
  54. package/dist/cjs/programs/edge-curve/frag.glsl.js +0 -8
  55. package/dist/cjs/programs/edge-curve/index.js +0 -157
  56. package/dist/cjs/programs/edge-curve/vert.glsl.js +0 -8
  57. package/dist/cjs/programs/edge-line/drawLabel.js +0 -70
  58. package/dist/cjs/programs/edge-line/frag.glsl.js +0 -8
  59. package/dist/cjs/programs/edge-line/index.js +0 -166
  60. package/dist/cjs/programs/edge-line/vert.glsl.js +0 -8
  61. package/dist/cjs/programs/node-badge/factory.js +0 -250
  62. package/dist/cjs/programs/node-badge/frag.glsl.js +0 -8
  63. package/dist/cjs/programs/node-badge/index.js +0 -33
  64. package/dist/cjs/programs/node-badge/texture.js +0 -455
  65. package/dist/cjs/programs/node-badge/vert.glsl.js +0 -19
  66. package/dist/cjs/programs/node-circle/base/drawHover.js +0 -71
  67. package/dist/cjs/programs/node-circle/base/drawLabel.js +0 -113
  68. package/dist/cjs/programs/node-circle/base/frag.glsl.js +0 -8
  69. package/dist/cjs/programs/node-circle/base/index.js +0 -136
  70. package/dist/cjs/programs/node-circle/base/vert.glsl.js +0 -8
  71. package/dist/cjs/programs/node-circle/index.js +0 -15
  72. package/dist/cjs/programs/node-image/factory.js +0 -224
  73. package/dist/cjs/programs/node-image/frag.glsl.js +0 -8
  74. package/dist/cjs/programs/node-image/index.js +0 -14
  75. package/dist/cjs/programs/node-image/texture.js +0 -472
  76. package/dist/cjs/programs/node-image/vert.glsl.js +0 -8
  77. package/dist/cjs/programs/node-rect/base/drawHover.js +0 -68
  78. package/dist/cjs/programs/node-rect/base/drawLabel.js +0 -107
  79. package/dist/cjs/programs/node-rect/base/frag.glsl.js +0 -8
  80. package/dist/cjs/programs/node-rect/base/index.js +0 -135
  81. package/dist/cjs/programs/node-rect/base/vert.glsl.js +0 -8
  82. package/dist/cjs/programs/node-rect/index.js +0 -15
  83. package/dist/esm/_virtual/_rollup-plugin-web-worker-loader__helper__auto__createBase64WorkerFactory.js +0 -14
  84. package/dist/esm/_virtual/_rollup-plugin-web-worker-loader__helper__auto__isNodeJS.js +0 -9
  85. package/dist/esm/_virtual/_rollup-plugin-web-worker-loader__helper__browser__createBase64WorkerFactory.js +0 -34
  86. package/dist/esm/_virtual/_rollup-plugin-web-worker-loader__helper__node__WorkerClass.js +0 -13
  87. package/dist/esm/_virtual/_rollup-plugin-web-worker-loader__helper__node__createBase64WorkerFactory.js +0 -20
  88. package/dist/esm/_virtual/elk-worker.js +0 -8
  89. package/dist/esm/components/ContextMenu.js +0 -133
  90. package/dist/esm/components/Provider.js +0 -103
  91. package/dist/esm/components/Tools.js +0 -205
  92. package/dist/esm/components/Viewer.js +0 -59
  93. package/dist/esm/components/context.js +0 -33
  94. package/dist/esm/constants/index.js +0 -16
  95. package/dist/esm/hooks/sigmaDragSelect.js +0 -169
  96. package/dist/esm/hooks/sigmaHilighter.js +0 -83
  97. package/dist/esm/hooks/sigmaMouseActions.js +0 -145
  98. package/dist/esm/hooks/useGraphology.js +0 -41
  99. package/dist/esm/hooks/useSigma.js +0 -112
  100. package/dist/esm/programs/arrow-head/frag.glsl.js +0 -8
  101. package/dist/esm/programs/arrow-head/index.js +0 -141
  102. package/dist/esm/programs/arrow-head/vert.glsl.js +0 -8
  103. package/dist/esm/programs/edge-curve/drawLabel.js +0 -136
  104. package/dist/esm/programs/edge-curve/frag.glsl.js +0 -8
  105. package/dist/esm/programs/edge-curve/index.js +0 -156
  106. package/dist/esm/programs/edge-curve/vert.glsl.js +0 -8
  107. package/dist/esm/programs/edge-line/drawLabel.js +0 -70
  108. package/dist/esm/programs/edge-line/frag.glsl.js +0 -8
  109. package/dist/esm/programs/edge-line/index.js +0 -166
  110. package/dist/esm/programs/edge-line/vert.glsl.js +0 -8
  111. package/dist/esm/programs/node-badge/factory.js +0 -250
  112. package/dist/esm/programs/node-badge/frag.glsl.js +0 -8
  113. package/dist/esm/programs/node-badge/index.js +0 -32
  114. package/dist/esm/programs/node-badge/texture.js +0 -445
  115. package/dist/esm/programs/node-badge/vert.glsl.js +0 -19
  116. package/dist/esm/programs/node-circle/base/drawHover.js +0 -71
  117. package/dist/esm/programs/node-circle/base/drawLabel.js +0 -113
  118. package/dist/esm/programs/node-circle/base/frag.glsl.js +0 -8
  119. package/dist/esm/programs/node-circle/base/index.js +0 -136
  120. package/dist/esm/programs/node-circle/base/vert.glsl.js +0 -8
  121. package/dist/esm/programs/node-circle/index.js +0 -15
  122. package/dist/esm/programs/node-image/factory.js +0 -224
  123. package/dist/esm/programs/node-image/frag.glsl.js +0 -8
  124. package/dist/esm/programs/node-image/index.js +0 -13
  125. package/dist/esm/programs/node-image/texture.js +0 -462
  126. package/dist/esm/programs/node-image/vert.glsl.js +0 -8
  127. package/dist/esm/programs/node-rect/base/drawHover.js +0 -68
  128. package/dist/esm/programs/node-rect/base/drawLabel.js +0 -107
  129. package/dist/esm/programs/node-rect/base/frag.glsl.js +0 -8
  130. package/dist/esm/programs/node-rect/base/index.js +0 -135
  131. package/dist/esm/programs/node-rect/base/vert.glsl.js +0 -8
  132. package/dist/esm/programs/node-rect/index.js +0 -15
  133. package/dist/types/components/ContextMenu.d.ts +0 -1
  134. package/dist/types/components/Provider.d.ts +0 -3
  135. package/dist/types/components/Tools.d.ts +0 -1
  136. package/dist/types/components/Viewer.d.ts +0 -2
  137. package/dist/types/components/context.d.ts +0 -17
  138. package/dist/types/constants/index.d.ts +0 -12
  139. package/dist/types/graph/layout.worker.d.ts +0 -1
  140. package/dist/types/hooks/sigmaDragSelect.d.ts +0 -8
  141. package/dist/types/hooks/sigmaHilighter.d.ts +0 -3
  142. package/dist/types/hooks/sigmaMouseActions.d.ts +0 -3
  143. package/dist/types/hooks/useGraphology.d.ts +0 -6
  144. package/dist/types/hooks/useSigma.d.ts +0 -8
  145. package/dist/types/i18n/index.d.ts +0 -0
  146. package/dist/types/programs/arrow-head/frag.glsl.d.ts +0 -2
  147. package/dist/types/programs/arrow-head/index.d.ts +0 -9
  148. package/dist/types/programs/arrow-head/vert.glsl.d.ts +0 -2
  149. package/dist/types/programs/edge-curve/drawLabel.d.ts +0 -6
  150. package/dist/types/programs/edge-curve/frag.glsl.d.ts +0 -2
  151. package/dist/types/programs/edge-curve/index.d.ts +0 -43
  152. package/dist/types/programs/edge-curve/vert.glsl.d.ts +0 -2
  153. package/dist/types/programs/edge-line/drawLabel.d.ts +0 -5
  154. package/dist/types/programs/edge-line/frag.glsl.d.ts +0 -2
  155. package/dist/types/programs/edge-line/index.d.ts +0 -11
  156. package/dist/types/programs/edge-line/vert.glsl.d.ts +0 -2
  157. package/dist/types/programs/node-badge/factory.d.ts +0 -27
  158. package/dist/types/programs/node-badge/frag.glsl.d.ts +0 -2
  159. package/dist/types/programs/node-badge/index.d.ts +0 -5
  160. package/dist/types/programs/node-badge/texture.d.ts +0 -102
  161. package/dist/types/programs/node-badge/vert.glsl.d.ts +0 -2
  162. package/dist/types/programs/node-circle/base/drawHover.d.ts +0 -8
  163. package/dist/types/programs/node-circle/base/drawLabel.d.ts +0 -8
  164. package/dist/types/programs/node-circle/base/frag.glsl.d.ts +0 -2
  165. package/dist/types/programs/node-circle/base/index.d.ts +0 -37
  166. package/dist/types/programs/node-circle/base/vert.glsl.d.ts +0 -2
  167. package/dist/types/programs/node-circle/index.d.ts +0 -11
  168. package/dist/types/programs/node-image/factory.d.ts +0 -25
  169. package/dist/types/programs/node-image/frag.glsl.d.ts +0 -2
  170. package/dist/types/programs/node-image/index.d.ts +0 -5
  171. package/dist/types/programs/node-image/texture.d.ts +0 -102
  172. package/dist/types/programs/node-image/vert.glsl.d.ts +0 -2
  173. package/dist/types/programs/node-rect/base/drawHover.d.ts +0 -8
  174. package/dist/types/programs/node-rect/base/drawLabel.d.ts +0 -8
  175. package/dist/types/programs/node-rect/base/frag.glsl.d.ts +0 -2
  176. package/dist/types/programs/node-rect/base/index.d.ts +0 -34
  177. package/dist/types/programs/node-rect/base/vert.glsl.d.ts +0 -2
  178. package/dist/types/programs/node-rect/index.d.ts +0 -11
  179. package/src/components/ContextMenu.tsx +0 -138
  180. package/src/components/Provider.tsx +0 -116
  181. package/src/components/Tools.tsx +0 -68
  182. package/src/components/Viewer.tsx +0 -75
  183. package/src/components/context.ts +0 -43
  184. package/src/constants/index.ts +0 -22
  185. package/src/graph/layout.worker.ts +0 -42
  186. package/src/hooks/sigmaDragSelect.ts +0 -219
  187. package/src/hooks/sigmaHilighter.ts +0 -107
  188. package/src/hooks/sigmaMouseActions.ts +0 -153
  189. package/src/hooks/useGraphology.ts +0 -31
  190. package/src/hooks/useSigma.ts +0 -118
  191. package/src/i18n/index.ts +0 -0
  192. package/src/programs/arrow-head/frag.glsl.ts +0 -18
  193. package/src/programs/arrow-head/index.ts +0 -156
  194. package/src/programs/arrow-head/vert.glsl.ts +0 -75
  195. package/src/programs/edge-curve/drawLabel.ts +0 -166
  196. package/src/programs/edge-curve/frag.glsl.ts +0 -86
  197. package/src/programs/edge-curve/index.ts +0 -156
  198. package/src/programs/edge-curve/vert.glsl.ts +0 -110
  199. package/src/programs/edge-line/drawLabel.ts +0 -113
  200. package/src/programs/edge-line/frag.glsl.ts +0 -34
  201. package/src/programs/edge-line/index.ts +0 -163
  202. package/src/programs/edge-line/vert.glsl.ts +0 -104
  203. package/src/programs/node-badge/factory.ts +0 -325
  204. package/src/programs/node-badge/frag.glsl.ts +0 -79
  205. package/src/programs/node-badge/index.ts +0 -35
  206. package/src/programs/node-badge/texture.ts +0 -425
  207. package/src/programs/node-badge/vert.glsl.ts +0 -99
  208. package/src/programs/node-circle/base/drawHover.ts +0 -80
  209. package/src/programs/node-circle/base/drawLabel.ts +0 -145
  210. package/src/programs/node-circle/base/frag.glsl.ts +0 -72
  211. package/src/programs/node-circle/base/index.ts +0 -100
  212. package/src/programs/node-circle/base/vert.glsl.ts +0 -83
  213. package/src/programs/node-circle/index.ts +0 -19
  214. package/src/programs/node-image/factory.ts +0 -299
  215. package/src/programs/node-image/frag.glsl.ts +0 -97
  216. package/src/programs/node-image/index.ts +0 -7
  217. package/src/programs/node-image/texture.ts +0 -435
  218. package/src/programs/node-image/vert.glsl.ts +0 -60
  219. package/src/programs/node-rect/base/drawHover.ts +0 -77
  220. package/src/programs/node-rect/base/drawLabel.ts +0 -149
  221. package/src/programs/node-rect/base/frag.glsl.ts +0 -67
  222. package/src/programs/node-rect/base/index.ts +0 -107
  223. package/src/programs/node-rect/base/vert.glsl.ts +0 -87
  224. package/src/programs/node-rect/index.ts +0 -19
@@ -1,27 +1,35 @@
1
- import { debounce } from "@react-fabric/utilities";
2
- import {
3
- DEFAULT_EDGE_CURVATURE,
4
- indexParallelEdgesIndex,
5
- } from "@sigma/edge-curve";
6
- import ElkConstructor, { type ELK } from "elkjs/lib/elk.bundled";
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 { circular } from "graphology-layout";
9
- import forceAtlas2, {
10
- type ForceAtlas2Settings,
11
- } from "graphology-layout-forceatlas2";
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
- InternalNodeAttributes<N>,
34
- EdgeAttributes<E>,
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
- groupNodes(
136
- key: string,
137
- nodes: string[],
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: [{ key, attributes: newNodeAttributes }],
210
- edges: edgeList.concat(movedEdges),
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
- true,
57
+ false,
213
58
  );
214
- return this;
215
- }
216
-
217
- ungroupNode(node: string) {
218
- const atts = this.getNodeAttributes(node);
219
- if (!atts || !atts.isGroup) return;
220
- const nodes = atts.nodeList ?? [];
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.setNodeAttribute(n, "hidden", false);
229
- this.removeNodeAttribute(n, "originalEdges");
230
- });
231
- this.dropNode(node);
68
+ this.emit("layoutDone");
69
+ }, 500);
232
70
  return this;
233
71
  }
234
72
 
235
- toggleExpanded(node: string, force?: boolean) {
236
- const expanded = force ?? !this.getNodeAttribute(node, "expanded");
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
- // @ts-expect-error ignore
246
- import(data: RawGraph<N, E> | Graph<N, E>, merge?: boolean) {
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
- circularLayout() {
274
- if (this.size === 0) return this;
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
- private _timer: any;
290
- private _worker?: ForceAtlas2Worker;
291
- forceLayout(settings: ForceAtlas2Settings = {}) {
292
- if (this.size === 0) return this;
293
- const sensibleSettings = forceAtlas2.inferSettings(this as any);
294
- if (this._worker?.isRunning()) {
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
- * parallel edge check to be called after adding edges
95
+ * @deprecated
96
+ * use `exportGraph` instead
385
97
  */
386
- private getCurvature(index: number, maxIndex: number = 0): number {
387
- if (maxIndex <= 0) throw new Error("Invalid maxIndex");
388
- if (index < 0) return -this.getCurvature(-index, maxIndex);
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 checkParallelEdges() {
398
- // Use dedicated helper to identify parallel edges:
399
- // @ts-expect-error ignore
400
- indexParallelEdgesIndex(this, {
401
- edgeIndexAttribute: "parallelIndex",
402
- edgeMinIndexAttribute: "parallelMinIndex",
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: 1.0.0
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 MIT License (MIT)
7
- * Copyright (c) 2024 Adarsh Pastakia
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
- * Permission is hereby granted, free of charge, to any person obtaining a copy of this software
10
- * and associated documentation files (the "Software"), to deal in the Software without restriction,
11
- * including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense,
12
- * and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so,
13
- * subject to the following conditions:
14
- *
15
- * The above copyright notice and this permission notice shall be included in all copies or substantial
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 { SigmaGraph } from "./components/Viewer";
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
- // @ts-expect-error ignore
34
- window.__GRAPH_LAYOUT_DURATION_MULTIPLIER__ = 10;
32
+ export { GraphViewer } from "./viewer/Graph";