@deck.gl-community/graph-layers 9.1.1 → 9.2.0-beta.2

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 (251) hide show
  1. package/dist/_deprecated/old-constants.d.ts +107 -0
  2. package/dist/_deprecated/old-constants.d.ts.map +1 -0
  3. package/dist/_deprecated/old-constants.js +111 -0
  4. package/dist/_deprecated/old-constants.js.map +1 -0
  5. package/dist/core/cache.d.ts +0 -1
  6. package/dist/core/cache.js +0 -1
  7. package/dist/core/constants.d.ts +12 -100
  8. package/dist/core/constants.d.ts.map +1 -1
  9. package/dist/core/constants.js +3 -44
  10. package/dist/core/constants.js.map +1 -1
  11. package/dist/core/graph-engine.d.ts +12 -11
  12. package/dist/core/graph-engine.d.ts.map +1 -1
  13. package/dist/core/graph-engine.js +22 -11
  14. package/dist/core/graph-engine.js.map +1 -1
  15. package/dist/core/graph-layout.d.ts +48 -21
  16. package/dist/core/graph-layout.d.ts.map +1 -1
  17. package/dist/core/graph-layout.js +91 -24
  18. package/dist/core/graph-layout.js.map +1 -1
  19. package/dist/core/interaction-manager.d.ts +6 -4
  20. package/dist/core/interaction-manager.d.ts.map +1 -1
  21. package/dist/core/interaction-manager.js +59 -17
  22. package/dist/core/interaction-manager.js.map +1 -1
  23. package/dist/graph/edge.d.ts +7 -7
  24. package/dist/graph/edge.d.ts.map +1 -1
  25. package/dist/graph/edge.js +3 -6
  26. package/dist/graph/edge.js.map +1 -1
  27. package/dist/graph/graph.d.ts +2 -3
  28. package/dist/graph/graph.js +8 -9
  29. package/dist/graph/graph.js.map +1 -1
  30. package/dist/graph/node.d.ts +7 -8
  31. package/dist/graph/node.d.ts.map +1 -1
  32. package/dist/graph/node.js +3 -5
  33. package/dist/graph/node.js.map +1 -1
  34. package/dist/graph-style-schema.cdn.d.ts +2 -0
  35. package/dist/graph-style-schema.cdn.js +2 -0
  36. package/dist/graph-style-schema.json +12 -0
  37. package/dist/index.cjs +2821 -549
  38. package/dist/index.cjs.map +4 -4
  39. package/dist/index.d.ts +28 -22
  40. package/dist/index.d.ts.map +1 -1
  41. package/dist/index.js +25 -21
  42. package/dist/index.js.map +1 -1
  43. package/dist/layers/common-layers/flow-path-layer/flow-path-layer-fragment.glsl.d.ts +0 -1
  44. package/dist/layers/common-layers/flow-path-layer/flow-path-layer-fragment.glsl.js +0 -1
  45. package/dist/layers/common-layers/flow-path-layer/flow-path-layer-vertex-tf.glsl.d.ts +0 -1
  46. package/dist/layers/common-layers/flow-path-layer/flow-path-layer-vertex-tf.glsl.js +0 -1
  47. package/dist/layers/common-layers/flow-path-layer/flow-path-layer-vertex.glsl.d.ts +0 -1
  48. package/dist/layers/common-layers/flow-path-layer/flow-path-layer-vertex.glsl.js +0 -1
  49. package/dist/layers/common-layers/flow-path-layer/flow-path-layer.d.ts +0 -1
  50. package/dist/layers/common-layers/flow-path-layer/flow-path-layer.js +0 -1
  51. package/dist/layers/common-layers/marker-layer/atlas-data-url.d.ts +0 -1
  52. package/dist/layers/common-layers/marker-layer/atlas-data-url.js +0 -1
  53. package/dist/layers/common-layers/marker-layer/marker-layer.d.ts +0 -1
  54. package/dist/layers/common-layers/marker-layer/marker-layer.js +2 -3
  55. package/dist/layers/common-layers/marker-layer/marker-list.d.ts +2 -63
  56. package/dist/layers/common-layers/marker-layer/marker-list.d.ts.map +1 -1
  57. package/dist/layers/common-layers/marker-layer/marker-list.js +1 -65
  58. package/dist/layers/common-layers/marker-layer/marker-list.js.map +1 -1
  59. package/dist/layers/common-layers/marker-layer/marker-mapping.d.ts +0 -1
  60. package/dist/layers/common-layers/marker-layer/marker-mapping.js +0 -1
  61. package/dist/layers/common-layers/spline-layer/spline-layer.d.ts +0 -1
  62. package/dist/layers/common-layers/spline-layer/spline-layer.js +0 -1
  63. package/dist/layers/common-layers/zoomable-text-layer/zoomable-text-layer.d.ts +0 -1
  64. package/dist/layers/common-layers/zoomable-text-layer/zoomable-text-layer.js +0 -1
  65. package/dist/layers/edge-attachment-helper.d.ts +15 -0
  66. package/dist/layers/edge-attachment-helper.d.ts.map +1 -0
  67. package/dist/layers/edge-attachment-helper.js +230 -0
  68. package/dist/layers/edge-attachment-helper.js.map +1 -0
  69. package/dist/layers/edge-layer.d.ts +1 -5
  70. package/dist/layers/edge-layer.d.ts.map +1 -1
  71. package/dist/layers/edge-layer.js +9 -11
  72. package/dist/layers/edge-layer.js.map +1 -1
  73. package/dist/layers/edge-layers/arrow-2d-geometry.d.ts +4 -0
  74. package/dist/layers/edge-layers/arrow-2d-geometry.d.ts.map +1 -0
  75. package/dist/layers/edge-layers/arrow-2d-geometry.js +42 -0
  76. package/dist/layers/edge-layers/arrow-2d-geometry.js.map +1 -0
  77. package/dist/layers/edge-layers/curved-edge-layer.d.ts +1 -2
  78. package/dist/layers/edge-layers/curved-edge-layer.js +1 -2
  79. package/dist/layers/edge-layers/edge-arrow-layer.d.ts +21 -0
  80. package/dist/layers/edge-layers/edge-arrow-layer.d.ts.map +1 -0
  81. package/dist/layers/edge-layers/edge-arrow-layer.js +131 -0
  82. package/dist/layers/edge-layers/edge-arrow-layer.js.map +1 -0
  83. package/dist/layers/edge-layers/edge-label-layer.d.ts +1 -2
  84. package/dist/layers/edge-layers/edge-label-layer.js +1 -2
  85. package/dist/layers/edge-layers/flow-layer.d.ts +1 -2
  86. package/dist/layers/edge-layers/flow-layer.js +1 -2
  87. package/dist/layers/edge-layers/path-edge-layer.d.ts +0 -1
  88. package/dist/layers/edge-layers/path-edge-layer.js +0 -1
  89. package/dist/layers/edge-layers/straight-line-edge-layer.d.ts +0 -1
  90. package/dist/layers/edge-layers/straight-line-edge-layer.js +0 -1
  91. package/dist/layers/graph-layer.d.ts +22 -23
  92. package/dist/layers/graph-layer.d.ts.map +1 -1
  93. package/dist/layers/graph-layer.js +218 -62
  94. package/dist/layers/graph-layer.js.map +1 -1
  95. package/dist/layers/node-layers/circle-layer.d.ts +0 -1
  96. package/dist/layers/node-layers/circle-layer.js +0 -1
  97. package/dist/layers/node-layers/image-layer.d.ts +0 -1
  98. package/dist/layers/node-layers/image-layer.js +0 -1
  99. package/dist/layers/node-layers/label-layer.d.ts +1 -2
  100. package/dist/layers/node-layers/label-layer.js +1 -2
  101. package/dist/layers/node-layers/path-rounded-rectangle-layer.d.ts +0 -1
  102. package/dist/layers/node-layers/path-rounded-rectangle-layer.js +1 -2
  103. package/dist/layers/node-layers/rectangle-layer.d.ts +0 -1
  104. package/dist/layers/node-layers/rectangle-layer.js +0 -1
  105. package/dist/layers/node-layers/rounded-rectangle-layer-fragment.d.ts +0 -1
  106. package/dist/layers/node-layers/rounded-rectangle-layer-fragment.js +0 -1
  107. package/dist/layers/node-layers/rounded-rectangle-layer.d.ts +1 -2
  108. package/dist/layers/node-layers/rounded-rectangle-layer.js +2 -3
  109. package/dist/layers/node-layers/zoomable-marker-layer.d.ts +1 -2
  110. package/dist/layers/node-layers/zoomable-marker-layer.js +1 -2
  111. package/dist/layouts/d3-dag/d3-dag-layout.d.ts +117 -0
  112. package/dist/layouts/d3-dag/d3-dag-layout.d.ts.map +1 -0
  113. package/dist/layouts/d3-dag/d3-dag-layout.js +716 -0
  114. package/dist/layouts/d3-dag/d3-dag-layout.js.map +1 -0
  115. package/dist/layouts/d3-force/d3-force-layout.d.ts +4 -4
  116. package/dist/layouts/d3-force/d3-force-layout.d.ts.map +1 -1
  117. package/dist/layouts/d3-force/d3-force-layout.js +25 -10
  118. package/dist/layouts/d3-force/d3-force-layout.js.map +1 -1
  119. package/dist/layouts/d3-force/worker.d.ts +0 -1
  120. package/dist/layouts/d3-force/worker.js +0 -1
  121. package/dist/layouts/experimental/force-multi-graph-layout.d.ts +9 -8
  122. package/dist/layouts/experimental/force-multi-graph-layout.d.ts.map +1 -1
  123. package/dist/layouts/experimental/force-multi-graph-layout.js +15 -11
  124. package/dist/layouts/experimental/force-multi-graph-layout.js.map +1 -1
  125. package/dist/layouts/experimental/hive-plot-layout.d.ts +11 -8
  126. package/dist/layouts/experimental/hive-plot-layout.d.ts.map +1 -1
  127. package/dist/layouts/experimental/hive-plot-layout.js +12 -7
  128. package/dist/layouts/experimental/hive-plot-layout.js.map +1 -1
  129. package/dist/layouts/experimental/radial-layout.d.ts +10 -7
  130. package/dist/layouts/experimental/radial-layout.d.ts.map +1 -1
  131. package/dist/layouts/experimental/radial-layout.js +11 -6
  132. package/dist/layouts/experimental/radial-layout.js.map +1 -1
  133. package/dist/layouts/gpu-force/gpu-force-layout.d.ts +4 -4
  134. package/dist/layouts/gpu-force/gpu-force-layout.d.ts.map +1 -1
  135. package/dist/layouts/gpu-force/gpu-force-layout.js +18 -9
  136. package/dist/layouts/gpu-force/gpu-force-layout.js.map +1 -1
  137. package/dist/layouts/gpu-force/worker.d.ts +0 -1
  138. package/dist/layouts/gpu-force/worker.js +0 -1
  139. package/dist/layouts/simple-layout.d.ts +19 -12
  140. package/dist/layouts/simple-layout.d.ts.map +1 -1
  141. package/dist/layouts/simple-layout.js +26 -15
  142. package/dist/layouts/simple-layout.js.map +1 -1
  143. package/dist/loaders/create-graph.d.ts +1 -2
  144. package/dist/loaders/create-graph.js +3 -4
  145. package/dist/loaders/edge-parsers.d.ts +1 -2
  146. package/dist/loaders/edge-parsers.js +2 -3
  147. package/dist/loaders/edge-parsers.js.map +1 -1
  148. package/dist/loaders/json-loader.d.ts +2 -3
  149. package/dist/loaders/json-loader.d.ts.map +1 -1
  150. package/dist/loaders/json-loader.js +5 -6
  151. package/dist/loaders/json-loader.js.map +1 -1
  152. package/dist/loaders/node-parsers.d.ts +1 -2
  153. package/dist/loaders/node-parsers.js +2 -3
  154. package/dist/loaders/node-parsers.js.map +1 -1
  155. package/dist/loaders/simple-json-graph-loader.d.ts +0 -1
  156. package/dist/loaders/simple-json-graph-loader.d.ts.map +1 -1
  157. package/dist/loaders/simple-json-graph-loader.js +5 -6
  158. package/dist/loaders/simple-json-graph-loader.js.map +1 -1
  159. package/dist/loaders/table-graph-loader.d.ts +3 -4
  160. package/dist/loaders/table-graph-loader.js +5 -6
  161. package/dist/loaders/table-graph-loader.js.map +1 -1
  162. package/dist/style/graph-layer-stylesheet.d.ts +34 -0
  163. package/dist/style/graph-layer-stylesheet.d.ts.map +1 -0
  164. package/dist/style/graph-layer-stylesheet.js +39 -0
  165. package/dist/style/graph-layer-stylesheet.js.map +1 -0
  166. package/dist/style/graph-style-accessor-map.d.ts +93 -0
  167. package/dist/style/graph-style-accessor-map.d.ts.map +1 -0
  168. package/dist/style/graph-style-accessor-map.js +93 -0
  169. package/dist/style/graph-style-accessor-map.js.map +1 -0
  170. package/dist/style/graph-style-engine.d.ts +10 -0
  171. package/dist/style/graph-style-engine.d.ts.map +1 -0
  172. package/dist/style/graph-style-engine.js +163 -0
  173. package/dist/style/graph-style-engine.js.map +1 -0
  174. package/dist/style/graph-stylesheet.schema.d.ts +310 -0
  175. package/dist/style/graph-stylesheet.schema.d.ts.map +1 -0
  176. package/dist/style/graph-stylesheet.schema.js +237 -0
  177. package/dist/style/graph-stylesheet.schema.js.map +1 -0
  178. package/dist/style/style-engine.d.ts +33 -0
  179. package/dist/style/style-engine.d.ts.map +1 -0
  180. package/dist/style/style-engine.js +121 -0
  181. package/dist/style/style-engine.js.map +1 -0
  182. package/dist/style/style-property.d.ts +2 -3
  183. package/dist/style/style-property.d.ts.map +1 -1
  184. package/dist/style/style-property.js +224 -48
  185. package/dist/style/style-property.js.map +1 -1
  186. package/dist/utils/collapsed-chains.d.ts +17 -0
  187. package/dist/utils/collapsed-chains.d.ts.map +1 -0
  188. package/dist/utils/collapsed-chains.js +197 -0
  189. package/dist/utils/collapsed-chains.js.map +1 -0
  190. package/dist/utils/layer-utils.d.ts +0 -1
  191. package/dist/utils/layer-utils.d.ts.map +1 -1
  192. package/dist/utils/layer-utils.js +0 -1
  193. package/dist/utils/log.d.ts +2 -1
  194. package/dist/utils/log.d.ts.map +1 -1
  195. package/dist/utils/log.js +12 -2
  196. package/dist/utils/log.js.map +1 -1
  197. package/dist/utils/node-boundary.d.ts +10 -0
  198. package/dist/utils/node-boundary.d.ts.map +1 -0
  199. package/dist/utils/node-boundary.js +130 -0
  200. package/dist/utils/node-boundary.js.map +1 -0
  201. package/dist/utils/polygon-calculations.d.ts +0 -1
  202. package/dist/utils/polygon-calculations.js +0 -1
  203. package/dist/widgets/long-press-button.d.ts +0 -1
  204. package/dist/widgets/long-press-button.js +0 -1
  205. package/dist/widgets/view-control-widget.d.ts +4 -5
  206. package/dist/widgets/view-control-widget.d.ts.map +1 -1
  207. package/dist/widgets/view-control-widget.js +10 -8
  208. package/dist/widgets/view-control-widget.js.map +1 -1
  209. package/package.json +23 -7
  210. package/src/_deprecated/old-constants.ts +122 -0
  211. package/src/core/constants.ts +21 -43
  212. package/src/core/graph-engine.ts +24 -9
  213. package/src/core/graph-layout.ts +133 -28
  214. package/src/core/interaction-manager.ts +80 -20
  215. package/src/graph/edge.ts +6 -6
  216. package/src/graph/graph.ts +7 -7
  217. package/src/graph/node.ts +6 -6
  218. package/src/index.ts +31 -6
  219. package/src/layers/common-layers/marker-layer/marker-list.ts +62 -64
  220. package/src/layers/edge-attachment-helper.ts +355 -0
  221. package/src/layers/edge-layer.ts +6 -7
  222. package/src/layers/edge-layers/arrow-2d-geometry.ts +51 -0
  223. package/src/layers/edge-layers/edge-arrow-layer.ts +171 -0
  224. package/src/layers/graph-layer.ts +304 -86
  225. package/src/layouts/d3-dag/d3-dag-layout.ts +969 -0
  226. package/src/layouts/d3-force/d3-force-layout.ts +33 -11
  227. package/src/layouts/experimental/force-multi-graph-layout.ts +22 -13
  228. package/src/layouts/experimental/hive-plot-layout.ts +22 -10
  229. package/src/layouts/experimental/radial-layout.ts +20 -8
  230. package/src/layouts/gpu-force/gpu-force-layout.ts +22 -10
  231. package/src/layouts/simple-layout.ts +48 -25
  232. package/src/loaders/edge-parsers.ts +2 -2
  233. package/src/loaders/json-loader.ts +2 -2
  234. package/src/loaders/node-parsers.ts +2 -2
  235. package/src/loaders/simple-json-graph-loader.ts +2 -2
  236. package/src/loaders/table-graph-loader.ts +2 -2
  237. package/src/style/graph-layer-stylesheet.ts +99 -0
  238. package/src/style/graph-style-accessor-map.ts +103 -0
  239. package/src/style/graph-style-engine.ts +229 -0
  240. package/src/style/graph-stylesheet.schema.ts +344 -0
  241. package/src/style/style-engine.ts +168 -0
  242. package/src/style/style-property.ts +314 -51
  243. package/src/utils/collapsed-chains.ts +261 -0
  244. package/src/utils/log.ts +15 -1
  245. package/src/utils/node-boundary.ts +238 -0
  246. package/src/widgets/view-control-widget.tsx +15 -13
  247. package/dist/style/style-sheet.d.ts +0 -11
  248. package/dist/style/style-sheet.d.ts.map +0 -1
  249. package/dist/style/style-sheet.js +0 -253
  250. package/dist/style/style-sheet.js.map +0 -1
  251. package/src/style/style-sheet.ts +0 -277
@@ -2,11 +2,10 @@
2
2
  // SPDX-License-Identifier: MIT
3
3
  // Copyright (c) vis.gl contributors
4
4
 
5
- import {GraphLayout, GraphLayoutOptions} from '../../core/graph-layout';
5
+ import {GraphLayout, GraphLayoutProps} from '../../core/graph-layout';
6
+ import {log} from '../../utils/log';
6
7
 
7
- import {EDGE_TYPE} from '../../core/constants';
8
-
9
- export type D3ForceLayoutOptions = GraphLayoutOptions & {
8
+ export type D3ForceLayoutOptions = GraphLayoutProps & {
10
9
  alpha?: number;
11
10
  resumeAlpha?: number;
12
11
  nBodyStrength?: number;
@@ -16,7 +15,7 @@ export type D3ForceLayoutOptions = GraphLayoutOptions & {
16
15
  };
17
16
 
18
17
  export class D3ForceLayout extends GraphLayout<D3ForceLayoutOptions> {
19
- static defaultOptions: Required<D3ForceLayoutOptions> = {
18
+ static defaultProps: Required<D3ForceLayoutOptions> = {
20
19
  alpha: 0.3,
21
20
  resumeAlpha: 0.1,
22
21
  nBodyStrength: -900,
@@ -34,7 +33,7 @@ export class D3ForceLayout extends GraphLayout<D3ForceLayoutOptions> {
34
33
  super(options);
35
34
 
36
35
  this._options = {
37
- ...D3ForceLayout.defaultOptions,
36
+ ...D3ForceLayout.defaultProps,
38
37
  ...options
39
38
  };
40
39
  }
@@ -84,6 +83,7 @@ export class D3ForceLayout extends GraphLayout<D3ForceLayoutOptions> {
84
83
  });
85
84
 
86
85
  this._worker.onmessage = (event) => {
86
+ log.log(0, 'D3ForceLayout: worker message', event.data?.type, event.data);
87
87
  if (event.data.type !== 'end') {
88
88
  return;
89
89
  }
@@ -106,25 +106,39 @@ export class D3ForceLayout extends GraphLayout<D3ForceLayoutOptions> {
106
106
  }
107
107
 
108
108
  stop() {
109
- this._worker.terminate();
109
+ if (this._worker) {
110
+ this._worker.terminate();
111
+ this._worker = null;
112
+ }
110
113
  }
111
114
 
112
115
  getEdgePosition = (edge) => {
113
116
  const sourceNode = this._graph.findNode(edge.getSourceNodeId());
114
117
  const targetNode = this._graph.findNode(edge.getTargetNodeId());
115
- if (!this.getNodePosition(sourceNode) || !this.getNodePosition(targetNode)) {
118
+ if (!sourceNode || !targetNode) {
119
+ return null;
120
+ }
121
+
122
+ const sourcePosition = this.getNodePosition(sourceNode);
123
+ const targetPosition = this.getNodePosition(targetNode);
124
+
125
+ if (!sourcePosition || !targetPosition) {
116
126
  return null;
117
127
  }
118
128
 
119
129
  return {
120
- type: EDGE_TYPE.LINE,
121
- sourcePosition: this.getNodePosition(sourceNode),
122
- targetPosition: this.getNodePosition(targetNode),
130
+ type: 'line',
131
+ sourcePosition,
132
+ targetPosition,
123
133
  controlPoints: []
124
134
  };
125
135
  };
126
136
 
127
137
  getNodePosition = (node) => {
138
+ if (!node) {
139
+ return null;
140
+ }
141
+
128
142
  const d3Node = this._positionsByNodeId.get(node.id);
129
143
  if (d3Node) {
130
144
  return d3Node.coordinates;
@@ -152,4 +166,12 @@ export class D3ForceLayout extends GraphLayout<D3ForceLayoutOptions> {
152
166
  d3Node.fx = null;
153
167
  d3Node.fy = null;
154
168
  };
169
+
170
+ protected override _updateBounds(): void {
171
+ const positions = Array.from(
172
+ this._positionsByNodeId.values(),
173
+ (data) => data?.coordinates as [number, number] | null | undefined
174
+ );
175
+ this._bounds = this._calculateBounds(positions);
176
+ }
155
177
  }
@@ -2,21 +2,20 @@
2
2
  // SPDX-License-Identifier: MIT
3
3
  // Copyright (c) vis.gl contributors
4
4
 
5
- import {GraphLayout, GraphLayoutOptions} from '../../core/graph-layout';
5
+ import {GraphLayout, GraphLayoutProps} from '../../core/graph-layout';
6
6
  import {Node} from '../../graph/node';
7
- import {EDGE_TYPE} from '../../core/constants';
8
7
  import {Graph} from '../../graph/graph';
9
8
  import * as d3 from 'd3-force';
10
9
 
11
- export type ForceMultiGraphLayoutOptions = GraphLayoutOptions & {
10
+ export type ForceMultiGraphLayoutProps = GraphLayoutProps & {
12
11
  alpha?: number;
13
12
  nBodyStrength?: number;
14
13
  nBodyDistanceMin?: number;
15
14
  nBodyDistanceMax?: number;
16
15
  };
17
16
 
18
- export class ForceMultiGraphLayout extends GraphLayout<ForceMultiGraphLayoutOptions> {
19
- static defaultOptions = {
17
+ export class ForceMultiGraphLayout extends GraphLayout<ForceMultiGraphLayoutProps> {
18
+ static defaultProps = {
20
19
  alpha: 3,
21
20
  nBodyStrength: -1200,
22
21
  nBodyDistanceMin: 100,
@@ -33,10 +32,10 @@ export class ForceMultiGraphLayout extends GraphLayout<ForceMultiGraphLayoutOpti
33
32
  _edgeMap = {};
34
33
  _simulator;
35
34
 
36
- constructor(options: ForceMultiGraphLayoutOptions = {}) {
35
+ constructor(options: ForceMultiGraphLayoutProps = {}) {
37
36
  super(options);
38
37
  this._options = {
39
- ...ForceMultiGraphLayout.defaultOptions,
38
+ ...ForceMultiGraphLayout.defaultProps,
40
39
  ...options
41
40
  };
42
41
  }
@@ -68,6 +67,7 @@ export class ForceMultiGraphLayout extends GraphLayout<ForceMultiGraphLayoutOpti
68
67
  'edge',
69
68
  d3
70
69
  .forceLink(g.edges)
70
+ // @ts-ignore TODO id not defined?
71
71
  .id((n) => n.id)
72
72
  .strength(this._strength)
73
73
  )
@@ -98,6 +98,8 @@ export class ForceMultiGraphLayout extends GraphLayout<ForceMultiGraphLayoutOpti
98
98
  this._simulator.stop();
99
99
  }
100
100
 
101
+ update(): void {}
102
+
101
103
  updateGraph(graph) {
102
104
  this._graph = graph;
103
105
 
@@ -138,7 +140,7 @@ export class ForceMultiGraphLayout extends GraphLayout<ForceMultiGraphLayoutOpti
138
140
  if (betweenEdges.length === 1) {
139
141
  // do nothing, this is a real edge
140
142
  const newD3Edge = {
141
- type: EDGE_TYPE.LINE,
143
+ type: 'line',
142
144
  id: firstEdge.getId(),
143
145
  source: newNodeMap[firstEdge.getSourceNodeId()],
144
146
  target: newNodeMap[firstEdge.getTargetNodeId()],
@@ -151,7 +153,7 @@ export class ForceMultiGraphLayout extends GraphLayout<ForceMultiGraphLayoutOpti
151
153
 
152
154
  // else reduce to one virtual edge
153
155
  const newD3Edge = {
154
- type: EDGE_TYPE.LINE,
156
+ type: 'line',
155
157
  id: pairId,
156
158
  source: newNodeMap[firstEdge.getSourceNodeId()],
157
159
  target: newNodeMap[firstEdge.getTargetNodeId()],
@@ -163,7 +165,7 @@ export class ForceMultiGraphLayout extends GraphLayout<ForceMultiGraphLayoutOpti
163
165
 
164
166
  betweenEdges.forEach((e, idx) => {
165
167
  newEdgeMap[e.id] = {
166
- type: EDGE_TYPE.SPLINE_CURVE,
168
+ type: 'spline-curve',
167
169
  id: e.id,
168
170
  source: newNodeMap[e.getSourceNodeId()],
169
171
  target: newNodeMap[e.getTargetNodeId()],
@@ -194,7 +196,7 @@ export class ForceMultiGraphLayout extends GraphLayout<ForceMultiGraphLayoutOpti
194
196
  if (d3Edge) {
195
197
  if (!d3Edge.isVirtual) {
196
198
  return {
197
- type: EDGE_TYPE.LINE,
199
+ type: 'line',
198
200
  sourcePosition: [d3Edge.source.x, d3Edge.source.y],
199
201
  targetPosition: [d3Edge.target.x, d3Edge.target.y],
200
202
  controlPoints: []
@@ -222,7 +224,7 @@ export class ForceMultiGraphLayout extends GraphLayout<ForceMultiGraphLayoutOpti
222
224
  (symmetricShape ? Math.floor(index / 2 + 1) : Math.ceil(index / 2));
223
225
  const controlPoint = computeControlPoint(sourcePosition, targetPosition, direction, offset);
224
226
  return {
225
- type: EDGE_TYPE.SPLINE_CURVE,
227
+ type: 'spline-curve',
226
228
  sourcePosition,
227
229
  targetPosition,
228
230
  controlPoints: [controlPoint]
@@ -230,7 +232,7 @@ export class ForceMultiGraphLayout extends GraphLayout<ForceMultiGraphLayoutOpti
230
232
  }
231
233
  // default value
232
234
  return {
233
- type: EDGE_TYPE.LINE,
235
+ type: 'line',
234
236
  sourcePosition: [0, 0],
235
237
  targetPosition: [0, 0],
236
238
  controlPoints: []
@@ -244,6 +246,13 @@ export class ForceMultiGraphLayout extends GraphLayout<ForceMultiGraphLayoutOpti
244
246
  this._onLayoutChange();
245
247
  this._onLayoutDone();
246
248
  };
249
+
250
+ protected override _updateBounds(): void {
251
+ const positions = Object.values(this._nodeMap ?? {}).map((node) =>
252
+ this._normalizePosition(node)
253
+ );
254
+ this._bounds = this._calculateBounds(positions);
255
+ }
247
256
  }
248
257
 
249
258
  /**
@@ -2,23 +2,22 @@
2
2
  // SPDX-License-Identifier: MIT
3
3
  // Copyright (c) vis.gl contributors
4
4
 
5
- import {GraphLayout, GraphLayoutOptions} from '../../core/graph-layout';
5
+ import {GraphLayout, GraphLayoutProps} from '../../core/graph-layout';
6
6
  import {Node} from '../../graph/node';
7
- import {EDGE_TYPE} from '../../core/constants';
8
7
  import {Graph} from '../../graph/graph';
9
8
 
10
- export type HivePlotLayoutOptions = GraphLayoutOptions & {
9
+ export type HivePlotLayoutProps = GraphLayoutProps & {
11
10
  innerRadius?: number;
12
11
  outerRadius?: number;
13
12
  getNodeAxis?: (node: Node) => any;
14
13
  };
15
14
 
16
- export class HivePlotLayout extends GraphLayout<HivePlotLayoutOptions> {
17
- static defaultOptions = {
15
+ export class HivePlotLayout extends GraphLayout<HivePlotLayoutProps> {
16
+ static defaultProps = {
18
17
  innerRadius: 100,
19
18
  outerRadius: 500,
20
19
  getNodeAxis: (node: Node) => node.getPropertyValue('group')
21
- } as const satisfies Readonly<Required<HivePlotLayoutOptions>>;
20
+ } as const satisfies Readonly<Required<HivePlotLayoutProps>>;
22
21
 
23
22
  _name = 'HivePlot';
24
23
  _graph: Graph;
@@ -27,10 +26,10 @@ export class HivePlotLayout extends GraphLayout<HivePlotLayoutOptions> {
27
26
  _nodeMap = {};
28
27
  _nodePositionMap = {};
29
28
 
30
- constructor(options: HivePlotLayoutOptions = {}) {
29
+ constructor(options: HivePlotLayoutProps = {}) {
31
30
  super(options);
32
31
  this._options = {
33
- ...HivePlotLayout.defaultOptions,
32
+ ...HivePlotLayout.defaultProps,
34
33
  ...options
35
34
  };
36
35
  }
@@ -98,6 +97,12 @@ export class HivePlotLayout extends GraphLayout<HivePlotLayoutOptions> {
98
97
  this._onLayoutDone();
99
98
  }
100
99
 
100
+ stop() {}
101
+
102
+ update() {}
103
+
104
+ resume() {}
105
+
101
106
  getNodePosition = (node) => this._nodePositionMap[node.getId()];
102
107
 
103
108
  getEdgePosition = (edge) => {
@@ -116,7 +121,7 @@ export class HivePlotLayout extends GraphLayout<HivePlotLayoutOptions> {
116
121
 
117
122
  if (sourceNodeAxis === targetNodeAxis) {
118
123
  return {
119
- type: EDGE_TYPE.LINE,
124
+ type: 'line',
120
125
  sourcePosition,
121
126
  targetPosition,
122
127
  controlPoints: []
@@ -132,7 +137,7 @@ export class HivePlotLayout extends GraphLayout<HivePlotLayoutOptions> {
132
137
  });
133
138
 
134
139
  return {
135
- type: EDGE_TYPE.SPLINE_CURVE,
140
+ type: 'spline-curve',
136
141
  sourcePosition,
137
142
  targetPosition,
138
143
  controlPoints: [controlPoint]
@@ -144,6 +149,13 @@ export class HivePlotLayout extends GraphLayout<HivePlotLayoutOptions> {
144
149
  this._onLayoutChange();
145
150
  this._onLayoutDone();
146
151
  };
152
+
153
+ protected override _updateBounds(): void {
154
+ const positions = Object.values(this._nodePositionMap ?? {}).map((position) =>
155
+ this._normalizePosition(position)
156
+ );
157
+ this._bounds = this._calculateBounds(positions);
158
+ }
147
159
  }
148
160
 
149
161
  function computeControlPoint({
@@ -2,11 +2,10 @@
2
2
  // SPDX-License-Identifier: MIT
3
3
  // Copyright (c) vis.gl contributors
4
4
 
5
- import {GraphLayout, GraphLayoutOptions} from '../../core/graph-layout';
6
- import {EDGE_TYPE} from '../../core/constants';
5
+ import {GraphLayout, GraphLayoutProps} from '../../core/graph-layout';
7
6
  import {Graph} from '../../graph/graph';
8
7
 
9
- export type RadialLayoutOptions = GraphLayoutOptions & {
8
+ export type RadialLayoutProps = GraphLayoutProps & {
10
9
  radius?: number;
11
10
  tree?: any;
12
11
  };
@@ -52,8 +51,8 @@ const getPath = (node, targetId, path) => {
52
51
  return false;
53
52
  };
54
53
 
55
- export class RadialLayout extends GraphLayout<RadialLayoutOptions> {
56
- static defaultOptions = {
54
+ export class RadialLayout extends GraphLayout<RadialLayoutProps> {
55
+ static defaultProps = {
57
56
  radius: 500
58
57
  };
59
58
 
@@ -63,10 +62,10 @@ export class RadialLayout extends GraphLayout<RadialLayoutOptions> {
63
62
  _hierarchicalPoints = {};
64
63
  nestedTree;
65
64
 
66
- constructor(options: RadialLayoutOptions = {}) {
65
+ constructor(options: RadialLayoutProps = {}) {
67
66
  super(options);
68
67
  this._options = {
69
- ...RadialLayout.defaultOptions,
68
+ ...RadialLayout.defaultProps,
70
69
  ...options
71
70
  };
72
71
  }
@@ -149,6 +148,12 @@ export class RadialLayout extends GraphLayout<RadialLayoutOptions> {
149
148
  this._onLayoutDone();
150
149
  }
151
150
 
151
+ stop(): void {}
152
+
153
+ resume() {}
154
+
155
+ update() {}
156
+
152
157
  getNodePosition = (node) => {
153
158
  return this._hierarchicalPoints[node.id];
154
159
  };
@@ -185,7 +190,7 @@ export class RadialLayout extends GraphLayout<RadialLayoutOptions> {
185
190
  }
186
191
 
187
192
  return {
188
- type: EDGE_TYPE.SPLINE_CURVE,
193
+ type: 'spline-curve',
189
194
  sourcePosition: sourceNodePos,
190
195
  targetPosition: targetNodePos,
191
196
  controlPoints: wayPoints
@@ -197,6 +202,13 @@ export class RadialLayout extends GraphLayout<RadialLayoutOptions> {
197
202
  this._onLayoutChange();
198
203
  this._onLayoutDone();
199
204
  };
205
+
206
+ protected override _updateBounds(): void {
207
+ const positions = Object.values(this._hierarchicalPoints ?? {}).map((position) =>
208
+ this._normalizePosition(position)
209
+ );
210
+ this._bounds = this._calculateBounds(positions);
211
+ }
200
212
  }
201
213
 
202
214
  function rotate(cx, cy, x, y, angle) {
@@ -2,11 +2,9 @@
2
2
  // SPDX-License-Identifier: MIT
3
3
  // Copyright (c) vis.gl contributors
4
4
 
5
- import {GraphLayout, GraphLayoutOptions} from '../../core/graph-layout';
5
+ import {GraphLayout, GraphLayoutProps} from '../../core/graph-layout';
6
6
 
7
- import {EDGE_TYPE} from '../../core/constants';
8
-
9
- export type GPUForceLayoutOptions = GraphLayoutOptions & {
7
+ export type GPUForceLayoutOptions = GraphLayoutProps & {
10
8
  alpha?: number;
11
9
  resumeAlpha?: number;
12
10
  nBodyStrength?: number;
@@ -19,7 +17,7 @@ export type GPUForceLayoutOptions = GraphLayoutOptions & {
19
17
  * @todo this layout should be updated with the organizational and logic improvements made in d3-force
20
18
  */
21
19
  export class GPUForceLayout extends GraphLayout<GPUForceLayoutOptions> {
22
- static defaultOptions: Required<GPUForceLayoutOptions> = {
20
+ static defaultProps: Required<GPUForceLayoutOptions> = {
23
21
  alpha: 0.3,
24
22
  resumeAlpha: 0.1,
25
23
  nBodyStrength: -900,
@@ -33,12 +31,12 @@ export class GPUForceLayout extends GraphLayout<GPUForceLayoutOptions> {
33
31
  private _nodeMap: any;
34
32
  private _edgeMap: any;
35
33
  private _graph: any;
36
- private _worker: Worker;
34
+ private _worker: Worker | null = null;
37
35
  private _callbacks: any;
38
36
 
39
37
  constructor(options: GPUForceLayoutOptions = {}) {
40
38
  const _options = {
41
- ...GPUForceLayout.defaultOptions,
39
+ ...GPUForceLayout.defaultProps,
42
40
  ...options
43
41
  };
44
42
 
@@ -50,6 +48,10 @@ export class GPUForceLayout extends GraphLayout<GPUForceLayoutOptions> {
50
48
  this._d3Graph = {nodes: [], edges: []};
51
49
  this._nodeMap = {};
52
50
  this._edgeMap = {};
51
+ this._callbacks = {
52
+ onLayoutChange: this._onLayoutChange,
53
+ onLayoutDone: this._onLayoutDone
54
+ };
53
55
  }
54
56
 
55
57
  initializeGraph(graph) {
@@ -143,7 +145,10 @@ export class GPUForceLayout extends GraphLayout<GPUForceLayoutOptions> {
143
145
  throw new Error('Resume unavailable');
144
146
  }
145
147
  stop() {
146
- this._worker.terminate();
148
+ if (this._worker) {
149
+ this._worker.terminate();
150
+ this._worker = null;
151
+ }
147
152
  }
148
153
 
149
154
  // for steaming new data on the same graph
@@ -232,14 +237,14 @@ export class GPUForceLayout extends GraphLayout<GPUForceLayoutOptions> {
232
237
  const targetPosition = d3Edge && d3Edge.target;
233
238
  if (d3Edge && sourcePosition && targetPosition) {
234
239
  return {
235
- type: EDGE_TYPE.LINE,
240
+ type: 'line',
236
241
  sourcePosition: [sourcePosition.x, sourcePosition.y],
237
242
  targetPosition: [targetPosition.x, targetPosition.y],
238
243
  controlPoints: []
239
244
  };
240
245
  }
241
246
  return {
242
- type: EDGE_TYPE.LINE,
247
+ type: 'line',
243
248
  sourcePosition: [0, 0],
244
249
  targetPosition: [0, 0],
245
250
  controlPoints: []
@@ -261,4 +266,11 @@ export class GPUForceLayout extends GraphLayout<GPUForceLayoutOptions> {
261
266
  d3Node.fx = null;
262
267
  d3Node.fy = null;
263
268
  };
269
+
270
+ protected override _updateBounds(): void {
271
+ const positions = Object.values(this._nodeMap ?? {}).map((node) =>
272
+ this._normalizePosition(node)
273
+ );
274
+ this._bounds = this._calculateBounds(positions);
275
+ }
264
276
  }
@@ -2,12 +2,12 @@
2
2
  // SPDX-License-Identifier: MIT
3
3
  // Copyright (c) vis.gl contributors
4
4
 
5
- import {GraphLayout, GraphLayoutOptions} from '../core/graph-layout';
5
+ import {GraphLayout, GraphLayoutProps} from '../core/graph-layout';
6
6
  import {Node} from '../graph/node';
7
- import {EDGE_TYPE} from '../core/constants';
7
+ import {Edge} from '../graph/edge';
8
8
  import {Graph} from '../graph/graph';
9
9
 
10
- export type SimpleLayoutOptions = GraphLayoutOptions & {
10
+ export type SimpleLayoutProps = GraphLayoutProps & {
11
11
  /** The accessor lets the application supply the position ([x, y]) of each node.
12
12
  * @example
13
13
  ```js
@@ -28,8 +28,8 @@ export type SimpleLayoutOptions = GraphLayoutOptions & {
28
28
  };
29
29
 
30
30
  /** A basic layout where the application controls positions of each node */
31
- export class SimpleLayout extends GraphLayout<SimpleLayoutOptions> {
32
- static defaultOptions: Required<SimpleLayoutOptions> = {
31
+ export class SimpleLayout extends GraphLayout<SimpleLayoutProps> {
32
+ static defaultProps: Required<SimpleLayoutProps> = {
33
33
  nodePositionAccessor: (node) =>
34
34
  [node.getPropertyValue('x'), node.getPropertyValue('y')] as [number, number]
35
35
  };
@@ -37,26 +37,22 @@ export class SimpleLayout extends GraphLayout<SimpleLayoutOptions> {
37
37
  protected readonly _name = 'SimpleLayout';
38
38
  protected _graph: Graph | null = null;
39
39
  protected _nodeMap: Record<string, Node> = {};
40
- protected _nodePositionMap: Record<string, (node: Node) => [number, number]> = {};
40
+ protected _nodePositionMap: Record<string, [number, number] | null> = {};
41
41
 
42
- constructor(options: SimpleLayoutOptions = {}) {
43
- super({...SimpleLayout.defaultOptions, ...options});
42
+ constructor(options: SimpleLayoutProps = {}) {
43
+ super({...SimpleLayout.defaultProps, ...options});
44
44
  }
45
45
 
46
46
  initializeGraph(graph: Graph): void {
47
47
  this.updateGraph(graph);
48
48
  }
49
49
 
50
- _notifyLayoutComplete(): void {
51
- this._onLayoutStart();
52
- this._onLayoutChange();
53
- this._onLayoutDone();
54
- }
55
-
56
50
  start(): void {
57
51
  this._notifyLayoutComplete();
58
52
  }
59
53
 
54
+ stop() : void {}
55
+
60
56
  update(): void {
61
57
  this._notifyLayoutComplete();
62
58
  }
@@ -71,32 +67,59 @@ export class SimpleLayout extends GraphLayout<SimpleLayoutOptions> {
71
67
  res[node.getId()] = node;
72
68
  return res;
73
69
  }, {});
74
- this._nodePositionMap = graph.getNodes().reduce((res, node) => {
75
- res[node.getId()] = this._options.nodePositionAccessor(node);
76
- return res;
77
- }, {});
70
+ this._nodePositionMap = graph.getNodes().reduce<Record<string, [number, number] | null>>(
71
+ (res, node) => {
72
+ res[node.getId()] = this._normalizePosition(
73
+ this._options.nodePositionAccessor(node)
74
+ );
75
+ return res;
76
+ },
77
+ {}
78
+ );
78
79
  }
79
80
 
80
81
  setNodePositionAccessor = (accessor) => {
81
82
  (this._options as any).nodePositionAccessor = accessor;
82
83
  };
83
84
 
84
- getNodePosition = (node) => this._nodePositionMap[node.getId()] as any;
85
+ getNodePosition = (node: Node | null): [number, number] => {
86
+ if (!node) {
87
+ return [0, 0] as [number, number];
88
+ }
89
+ const position = this._nodePositionMap[node.getId()];
90
+ return position ?? [0, 0] as [number, number];
91
+ };
85
92
 
86
- getEdgePosition = (edge) => {
87
- const sourcePos = this._nodePositionMap[edge.getSourceNodeId()];
88
- const targetPos = this._nodePositionMap[edge.getTargetNodeId()];
93
+ getEdgePosition = (edge: Edge) => {
94
+ const sourceNode = this._nodeMap[edge.getSourceNodeId()];
95
+ const targetNode = this._nodeMap[edge.getTargetNodeId()];
96
+ const sourcePos = sourceNode ? this.getNodePosition(sourceNode) : [0, 0];
97
+ const targetPos = targetNode ? this.getNodePosition(targetNode) : [0, 0];
89
98
  return {
90
- type: EDGE_TYPE.LINE,
99
+ type: 'line',
91
100
  sourcePosition: sourcePos,
92
101
  targetPosition: targetPos,
93
102
  controlPoints: []
94
- } as any;
103
+ };
95
104
  };
96
105
 
97
106
  lockNodePosition = (node, x, y) => {
98
- this._nodePositionMap[node.getId()] = [x, y] as any;
107
+ this._nodePositionMap[node.getId()] = [x, y];
99
108
  this._onLayoutChange();
100
109
  this._onLayoutDone();
101
110
  };
111
+
112
+ _notifyLayoutComplete(): void {
113
+ this._onLayoutStart();
114
+ this._onLayoutChange();
115
+ this._onLayoutDone();
116
+ }
117
+
118
+
119
+ protected override _updateBounds(): void {
120
+ const positions = Object.values(this._nodePositionMap).map((position) =>
121
+ this._normalizePosition(position)
122
+ );
123
+ this._bounds = this._calculateBounds(positions);
124
+ }
102
125
  }
@@ -3,13 +3,13 @@
3
3
  // Copyright (c) vis.gl contributors
4
4
 
5
5
  import type {EdgeOptions} from '../graph/edge';
6
- import {log} from '../utils/log';
6
+ import {error} from '../utils/log';
7
7
 
8
8
  export function basicEdgeParser(edge: any): Omit<EdgeOptions, 'data'> {
9
9
  const {id, directed, sourceId, targetId} = edge;
10
10
 
11
11
  if (sourceId === undefined || targetId === undefined) {
12
- log.error('Invalid edge: sourceId or targetId is missing.')();
12
+ error('Invalid edge: sourceId or targetId is missing.');
13
13
  return null;
14
14
  }
15
15
 
@@ -5,12 +5,12 @@
5
5
  import {createGraph} from './create-graph';
6
6
  import {basicNodeParser} from './node-parsers';
7
7
  import {basicEdgeParser} from './edge-parsers';
8
- import {log} from '../utils/log';
8
+ import {error} from '../utils/log';
9
9
 
10
10
  export const JSONLoader = ({json, nodeParser = basicNodeParser, edgeParser = basicEdgeParser}) => {
11
11
  const {name = 'default', nodes, edges} = json;
12
12
  if (!nodes) {
13
- log.error('Invalid graph: nodes is missing.')();
13
+ error('Invalid graph: nodes is missing.');
14
14
  return null;
15
15
  }
16
16
 
@@ -3,11 +3,11 @@
3
3
  // Copyright (c) vis.gl contributors
4
4
 
5
5
  import type {NodeOptions} from '../graph/node';
6
- import {log} from '../utils/log';
6
+ import {error} from '../utils/log';
7
7
 
8
8
  export function basicNodeParser(node: any): Pick<NodeOptions, 'id'> {
9
9
  if (node.id === undefined) {
10
- log.error('Invalid node: id is missing.')();
10
+ error('Invalid node: id is missing.');
11
11
  return null;
12
12
  }
13
13
  return {id: node.id};
@@ -3,7 +3,7 @@
3
3
  // Copyright (c) vis.gl contributors
4
4
 
5
5
  import {createGraph} from './create-graph';
6
- import {log} from '../utils/log';
6
+ import {error} from '../utils/log';
7
7
  import {basicNodeParser} from './node-parsers';
8
8
  import {basicEdgeParser} from './edge-parsers';
9
9
 
@@ -19,7 +19,7 @@ export function loadSimpleJSONGraph(
19
19
  const {nodeParser = basicNodeParser, edgeParser = basicEdgeParser} = options;
20
20
  const {name = 'default', nodes, edges} = json;
21
21
  if (!nodes) {
22
- log.error('Invalid graph: nodes is missing.')();
22
+ error('Invalid graph: nodes is missing.');
23
23
  return null;
24
24
  }
25
25
 
@@ -8,7 +8,7 @@ import {Edge} from '../graph/edge';
8
8
  import {Node} from '../graph/node';
9
9
  import {Graph} from '../graph/graph';
10
10
 
11
- import {log} from '../utils/log';
11
+ import {error} from '../utils/log';
12
12
 
13
13
  export type ParseGraphOptions = {
14
14
  nodeIdField?: string;
@@ -73,7 +73,7 @@ export function tableGraphLoader(
73
73
  // add nodes
74
74
 
75
75
  if (!nodes) {
76
- log.error('Invalid graph: nodes is missing.')();
76
+ error('Invalid graph: nodes is missing.');
77
77
  return null;
78
78
  }
79
79