@deck.gl-community/graph-layers 9.0.0

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 (210) hide show
  1. package/LICENSE +20 -0
  2. package/README.md +7 -0
  3. package/dist/core/base-layout.d.ts +71 -0
  4. package/dist/core/base-layout.js +133 -0
  5. package/dist/core/cache.d.ts +14 -0
  6. package/dist/core/cache.js +26 -0
  7. package/dist/core/constants.d.ts +101 -0
  8. package/dist/core/constants.js +48 -0
  9. package/dist/core/edge.d.ts +86 -0
  10. package/dist/core/edge.js +121 -0
  11. package/dist/core/graph-engine.d.ts +54 -0
  12. package/dist/core/graph-engine.js +128 -0
  13. package/dist/core/graph.d.ts +155 -0
  14. package/dist/core/graph.js +301 -0
  15. package/dist/core/interaction-manager.d.ts +40 -0
  16. package/dist/core/interaction-manager.js +169 -0
  17. package/dist/core/node.d.ts +103 -0
  18. package/dist/core/node.js +177 -0
  19. package/dist/index.cjs +3540 -0
  20. package/dist/index.cjs.map +7 -0
  21. package/dist/index.d.ts +19 -0
  22. package/dist/index.js +28 -0
  23. package/dist/layers/common-layers/flow-path-layer/flow-path-layer-fragment.glsl.d.ts +1 -0
  24. package/dist/layers/common-layers/flow-path-layer/flow-path-layer-fragment.glsl.js +49 -0
  25. package/dist/layers/common-layers/flow-path-layer/flow-path-layer-vertex-tf.glsl.d.ts +1 -0
  26. package/dist/layers/common-layers/flow-path-layer/flow-path-layer-vertex-tf.glsl.js +14 -0
  27. package/dist/layers/common-layers/flow-path-layer/flow-path-layer-vertex.glsl.d.ts +1 -0
  28. package/dist/layers/common-layers/flow-path-layer/flow-path-layer-vertex.glsl.js +73 -0
  29. package/dist/layers/common-layers/flow-path-layer/flow-path-layer.d.ts +20 -0
  30. package/dist/layers/common-layers/flow-path-layer/flow-path-layer.js +133 -0
  31. package/dist/layers/common-layers/marker-layer/atlas-data-url.d.ts +3 -0
  32. package/dist/layers/common-layers/marker-layer/atlas-data-url.js +8 -0
  33. package/dist/layers/common-layers/marker-layer/marker-layer.d.ts +13 -0
  34. package/dist/layers/common-layers/marker-layer/marker-layer.js +29 -0
  35. package/dist/layers/common-layers/marker-layer/marker-list.d.ts +62 -0
  36. package/dist/layers/common-layers/marker-layer/marker-list.js +67 -0
  37. package/dist/layers/common-layers/marker-layer/marker-mapping.d.ts +422 -0
  38. package/dist/layers/common-layers/marker-layer/marker-mapping.js +427 -0
  39. package/dist/layers/common-layers/spline-layer/spline-layer.d.ts +24 -0
  40. package/dist/layers/common-layers/spline-layer/spline-layer.js +68 -0
  41. package/dist/layers/common-layers/zoomable-text-layer/zoomable-text-layer.d.ts +16 -0
  42. package/dist/layers/common-layers/zoomable-text-layer/zoomable-text-layer.js +65 -0
  43. package/dist/layers/edge-layer.d.ts +25 -0
  44. package/dist/layers/edge-layer.js +75 -0
  45. package/dist/layers/edge-layers/curved-edge-layer.d.ts +6 -0
  46. package/dist/layers/edge-layers/curved-edge-layer.js +69 -0
  47. package/dist/layers/edge-layers/edge-label-layer.d.ts +6 -0
  48. package/dist/layers/edge-layers/edge-label-layer.js +42 -0
  49. package/dist/layers/edge-layers/flow-layer.d.ts +6 -0
  50. package/dist/layers/edge-layers/flow-layer.js +28 -0
  51. package/dist/layers/edge-layers/path-edge-layer.d.ts +6 -0
  52. package/dist/layers/edge-layers/path-edge-layer.js +27 -0
  53. package/dist/layers/edge-layers/straight-line-edge-layer.d.ts +6 -0
  54. package/dist/layers/edge-layers/straight-line-edge-layer.js +26 -0
  55. package/dist/layers/graph-layer.d.ts +32 -0
  56. package/dist/layers/graph-layer.js +193 -0
  57. package/dist/layers/node-layers/circle-layer.d.ts +6 -0
  58. package/dist/layers/node-layers/circle-layer.js +23 -0
  59. package/dist/layers/node-layers/image-layer.d.ts +6 -0
  60. package/dist/layers/node-layers/image-layer.js +23 -0
  61. package/dist/layers/node-layers/label-layer.d.ts +6 -0
  62. package/dist/layers/node-layers/label-layer.js +23 -0
  63. package/dist/layers/node-layers/path-rounded-rectange-layer.d.ts +6 -0
  64. package/dist/layers/node-layers/path-rounded-rectange-layer.js +46 -0
  65. package/dist/layers/node-layers/rectangle-layer.d.ts +6 -0
  66. package/dist/layers/node-layers/rectangle-layer.js +49 -0
  67. package/dist/layers/node-layers/rounded-rectangle-layer-fragment.d.ts +1 -0
  68. package/dist/layers/node-layers/rounded-rectangle-layer-fragment.js +30 -0
  69. package/dist/layers/node-layers/rounded-rectangle-layer.d.ts +8 -0
  70. package/dist/layers/node-layers/rounded-rectangle-layer.js +28 -0
  71. package/dist/layers/node-layers/zoomable-marker-layer.d.ts +10 -0
  72. package/dist/layers/node-layers/zoomable-marker-layer.js +40 -0
  73. package/dist/layouts/d3-force/d3-force-layout.d.ts +24 -0
  74. package/dist/layouts/d3-force/d3-force-layout.js +116 -0
  75. package/dist/layouts/d3-force/worker.d.ts +0 -0
  76. package/dist/layouts/d3-force/worker.js +46 -0
  77. package/dist/layouts/gpu-force/gpu-force-layout.d.ts +30 -0
  78. package/dist/layouts/gpu-force/gpu-force-layout.js +232 -0
  79. package/dist/layouts/gpu-force/worker.d.ts +0 -0
  80. package/dist/layouts/gpu-force/worker.js +116 -0
  81. package/dist/layouts/simple-layout/simple-layout.d.ts +22 -0
  82. package/dist/layouts/simple-layout/simple-layout.js +64 -0
  83. package/dist/loaders/edge-parsers.d.ts +6 -0
  84. package/dist/loaders/edge-parsers.js +17 -0
  85. package/dist/loaders/json-loader.d.ts +7 -0
  86. package/dist/loaders/json-loader.js +16 -0
  87. package/dist/loaders/node-parsers.d.ts +3 -0
  88. package/dist/loaders/node-parsers.js +11 -0
  89. package/dist/style/style-property.d.ts +14 -0
  90. package/dist/style/style-property.js +195 -0
  91. package/dist/style/style-sheet.d.ts +10 -0
  92. package/dist/style/style-sheet.js +252 -0
  93. package/dist/utils/create-graph.d.ts +8 -0
  94. package/dist/utils/create-graph.js +33 -0
  95. package/dist/utils/layer-utils.d.ts +1 -0
  96. package/dist/utils/layer-utils.js +20 -0
  97. package/dist/utils/log.d.ts +2 -0
  98. package/dist/utils/log.js +6 -0
  99. package/dist/utils/polygon-calculations.d.ts +1 -0
  100. package/dist/utils/polygon-calculations.js +102 -0
  101. package/package.json +55 -0
  102. package/src/core/base-layout.ts +154 -0
  103. package/src/core/cache.ts +31 -0
  104. package/src/core/constants.ts +58 -0
  105. package/src/core/edge.ts +145 -0
  106. package/src/core/graph-engine.ts +170 -0
  107. package/src/core/graph.ts +342 -0
  108. package/src/core/interaction-manager.ts +225 -0
  109. package/src/core/node.ts +205 -0
  110. package/src/index.ts +42 -0
  111. package/src/layers/common-layers/flow-path-layer/flow-path-layer-fragment.glsl.ts +50 -0
  112. package/src/layers/common-layers/flow-path-layer/flow-path-layer-vertex-tf.glsl.ts +15 -0
  113. package/src/layers/common-layers/flow-path-layer/flow-path-layer-vertex.glsl.ts +74 -0
  114. package/src/layers/common-layers/flow-path-layer/flow-path-layer.ts +154 -0
  115. package/src/layers/common-layers/marker-layer/atlas-data-url.ts +10 -0
  116. package/src/layers/common-layers/marker-layer/marker-atlas.png +0 -0
  117. package/src/layers/common-layers/marker-layer/marker-layer.ts +36 -0
  118. package/src/layers/common-layers/marker-layer/marker-list.ts +68 -0
  119. package/src/layers/common-layers/marker-layer/marker-mapping.ts +428 -0
  120. package/src/layers/common-layers/marker-layer/markers/bell-filled.png +0 -0
  121. package/src/layers/common-layers/marker-layer/markers/bell.png +0 -0
  122. package/src/layers/common-layers/marker-layer/markers/bookmark-filled.png +0 -0
  123. package/src/layers/common-layers/marker-layer/markers/bookmark.png +0 -0
  124. package/src/layers/common-layers/marker-layer/markers/cd-filled.png +0 -0
  125. package/src/layers/common-layers/marker-layer/markers/cd.png +0 -0
  126. package/src/layers/common-layers/marker-layer/markers/checkmark.png +0 -0
  127. package/src/layers/common-layers/marker-layer/markers/circle-check-filled.png +0 -0
  128. package/src/layers/common-layers/marker-layer/markers/circle-check.png +0 -0
  129. package/src/layers/common-layers/marker-layer/markers/circle-filled.png +0 -0
  130. package/src/layers/common-layers/marker-layer/markers/circle-i-filled.png +0 -0
  131. package/src/layers/common-layers/marker-layer/markers/circle-i.png +0 -0
  132. package/src/layers/common-layers/marker-layer/markers/circle-minus-filled.png +0 -0
  133. package/src/layers/common-layers/marker-layer/markers/circle-minus.png +0 -0
  134. package/src/layers/common-layers/marker-layer/markers/circle-plus-filled.png +0 -0
  135. package/src/layers/common-layers/marker-layer/markers/circle-plus.png +0 -0
  136. package/src/layers/common-layers/marker-layer/markers/circle-questionmark-filled.png +0 -0
  137. package/src/layers/common-layers/marker-layer/markers/circle-questionmark.png +0 -0
  138. package/src/layers/common-layers/marker-layer/markers/circle-slash-filled.png +0 -0
  139. package/src/layers/common-layers/marker-layer/markers/circle-slash.png +0 -0
  140. package/src/layers/common-layers/marker-layer/markers/circle-x-filled.png +0 -0
  141. package/src/layers/common-layers/marker-layer/markers/circle-x.png +0 -0
  142. package/src/layers/common-layers/marker-layer/markers/circle.png +0 -0
  143. package/src/layers/common-layers/marker-layer/markers/diamond-filled.png +0 -0
  144. package/src/layers/common-layers/marker-layer/markers/diamond.png +0 -0
  145. package/src/layers/common-layers/marker-layer/markers/flag-filled.png +0 -0
  146. package/src/layers/common-layers/marker-layer/markers/flag.png +0 -0
  147. package/src/layers/common-layers/marker-layer/markers/gear.png +0 -0
  148. package/src/layers/common-layers/marker-layer/markers/heart-filled.png +0 -0
  149. package/src/layers/common-layers/marker-layer/markers/heart.png +0 -0
  150. package/src/layers/common-layers/marker-layer/markers/location-marker-filled.png +0 -0
  151. package/src/layers/common-layers/marker-layer/markers/location-marker.png +0 -0
  152. package/src/layers/common-layers/marker-layer/markers/octagonal-star-filled.png +0 -0
  153. package/src/layers/common-layers/marker-layer/markers/octagonal-star.png +0 -0
  154. package/src/layers/common-layers/marker-layer/markers/person-filled.png +0 -0
  155. package/src/layers/common-layers/marker-layer/markers/person.png +0 -0
  156. package/src/layers/common-layers/marker-layer/markers/pin-filled.png +0 -0
  157. package/src/layers/common-layers/marker-layer/markers/pin.png +0 -0
  158. package/src/layers/common-layers/marker-layer/markers/plus-small.png +0 -0
  159. package/src/layers/common-layers/marker-layer/markers/plus.png +0 -0
  160. package/src/layers/common-layers/marker-layer/markers/rectangle-filled.png +0 -0
  161. package/src/layers/common-layers/marker-layer/markers/rectangle.png +0 -0
  162. package/src/layers/common-layers/marker-layer/markers/star-filled.png +0 -0
  163. package/src/layers/common-layers/marker-layer/markers/star.png +0 -0
  164. package/src/layers/common-layers/marker-layer/markers/tag-filled.png +0 -0
  165. package/src/layers/common-layers/marker-layer/markers/tag.png +0 -0
  166. package/src/layers/common-layers/marker-layer/markers/thumb-down-filled.png +0 -0
  167. package/src/layers/common-layers/marker-layer/markers/thumb-down.png +0 -0
  168. package/src/layers/common-layers/marker-layer/markers/thumb-up.png +0 -0
  169. package/src/layers/common-layers/marker-layer/markers/thumb_up-filled.png +0 -0
  170. package/src/layers/common-layers/marker-layer/markers/triangle-down-filled.png +0 -0
  171. package/src/layers/common-layers/marker-layer/markers/triangle-down.png +0 -0
  172. package/src/layers/common-layers/marker-layer/markers/triangle-left-filled.png +0 -0
  173. package/src/layers/common-layers/marker-layer/markers/triangle-left.png +0 -0
  174. package/src/layers/common-layers/marker-layer/markers/triangle-right-filled.png +0 -0
  175. package/src/layers/common-layers/marker-layer/markers/triangle-right.png +0 -0
  176. package/src/layers/common-layers/marker-layer/markers/triangle-up-filled.png +0 -0
  177. package/src/layers/common-layers/marker-layer/markers/triangle-up.png +0 -0
  178. package/src/layers/common-layers/marker-layer/markers/x-small.png +0 -0
  179. package/src/layers/common-layers/marker-layer/markers/x.png +0 -0
  180. package/src/layers/common-layers/spline-layer/spline-layer.ts +83 -0
  181. package/src/layers/common-layers/zoomable-text-layer/zoomable-text-layer.ts +90 -0
  182. package/src/layers/edge-layer.ts +88 -0
  183. package/src/layers/edge-layers/curved-edge-layer.ts +88 -0
  184. package/src/layers/edge-layers/edge-label-layer.ts +48 -0
  185. package/src/layers/edge-layers/flow-layer.ts +34 -0
  186. package/src/layers/edge-layers/path-edge-layer.ts +39 -0
  187. package/src/layers/edge-layers/straight-line-edge-layer.ts +38 -0
  188. package/src/layers/graph-layer.ts +225 -0
  189. package/src/layers/node-layers/circle-layer.ts +29 -0
  190. package/src/layers/node-layers/image-layer.ts +29 -0
  191. package/src/layers/node-layers/label-layer.ts +29 -0
  192. package/src/layers/node-layers/path-rounded-rectange-layer.ts +56 -0
  193. package/src/layers/node-layers/rectangle-layer.ts +58 -0
  194. package/src/layers/node-layers/rounded-rectangle-layer-fragment.ts +31 -0
  195. package/src/layers/node-layers/rounded-rectangle-layer.ts +32 -0
  196. package/src/layers/node-layers/zoomable-marker-layer.ts +49 -0
  197. package/src/layouts/d3-force/d3-force-layout.ts +145 -0
  198. package/src/layouts/d3-force/worker.ts +61 -0
  199. package/src/layouts/gpu-force/gpu-force-layout.ts +249 -0
  200. package/src/layouts/gpu-force/worker.ts +137 -0
  201. package/src/layouts/simple-layout/simple-layout.ts +87 -0
  202. package/src/loaders/edge-parsers.ts +21 -0
  203. package/src/loaders/json-loader.ts +19 -0
  204. package/src/loaders/node-parsers.ts +13 -0
  205. package/src/style/style-property.ts +229 -0
  206. package/src/style/style-sheet.ts +277 -0
  207. package/src/utils/create-graph.ts +38 -0
  208. package/src/utils/layer-utils.ts +23 -0
  209. package/src/utils/log.ts +9 -0
  210. package/src/utils/polygon-calculations.ts +154 -0
@@ -0,0 +1,169 @@
1
+ // deck.gl-community
2
+ // SPDX-License-Identifier: MIT
3
+ // Copyright (c) vis.gl contributors
4
+ import { EDGE_STATE, NODE_STATE } from './constants';
5
+ const NODE_TO_EDGE_STATE_MAP = {
6
+ [NODE_STATE.DEFAULT]: EDGE_STATE.DEFAULT,
7
+ [NODE_STATE.HOVER]: EDGE_STATE.HOVER,
8
+ [NODE_STATE.DRAGGING]: EDGE_STATE.DRAGGING,
9
+ [NODE_STATE.SELECTED]: EDGE_STATE.SELECTED
10
+ };
11
+ function shouldEdgeBeSelected(edge) {
12
+ return edge
13
+ .getConnectedNodes()
14
+ .some((node) => node.getState() === NODE_STATE.SELECTED && node.shouldHighlightConnectedEdges());
15
+ }
16
+ function setNodeState(node, state) {
17
+ node.setState(state);
18
+ if (node.shouldHighlightConnectedEdges()) {
19
+ node.getConnectedEdges().forEach((edge) => {
20
+ let newEdgeState = NODE_TO_EDGE_STATE_MAP[state];
21
+ if (shouldEdgeBeSelected(edge)) {
22
+ newEdgeState = EDGE_STATE.SELECTED;
23
+ }
24
+ edge.setState(newEdgeState);
25
+ });
26
+ }
27
+ }
28
+ export class InteractionManager {
29
+ notifyCallback;
30
+ _lastInteraction = 0;
31
+ _lastHoveredNode = null;
32
+ _lastSelectedNode = null;
33
+ nodeEvents = undefined;
34
+ edgeEvents = undefined;
35
+ engine = undefined;
36
+ enableDragging = undefined;
37
+ resumeLayoutAfterDragging = undefined;
38
+ constructor(props, notifyCallback) {
39
+ this.updateProps(props);
40
+ this.notifyCallback = notifyCallback;
41
+ // internal state
42
+ this._lastInteraction = 0;
43
+ this._lastHoveredNode = null;
44
+ this._lastSelectedNode = null;
45
+ }
46
+ updateProps({ nodeEvents = {}, edgeEvents = {}, engine, enableDragging, resumeLayoutAfterDragging }) {
47
+ this.nodeEvents = nodeEvents;
48
+ this.edgeEvents = edgeEvents;
49
+ this.engine = engine;
50
+ this.enableDragging = enableDragging;
51
+ this.resumeLayoutAfterDragging = resumeLayoutAfterDragging;
52
+ }
53
+ getLastInteraction() {
54
+ return this._lastInteraction;
55
+ }
56
+ onClick(info, event) {
57
+ const { object } = info;
58
+ if (!object) {
59
+ return;
60
+ }
61
+ if (object.isNode) {
62
+ if (object.isSelectable()) {
63
+ if (this._lastSelectedNode) {
64
+ setNodeState(this._lastSelectedNode, NODE_STATE.DEFAULT);
65
+ }
66
+ setNodeState(object, NODE_STATE.SELECTED);
67
+ this._lastSelectedNode = object;
68
+ this._lastInteraction = Date.now();
69
+ this.notifyCallback();
70
+ }
71
+ if (this.nodeEvents.onClick) {
72
+ this.nodeEvents.onClick(info, event);
73
+ }
74
+ }
75
+ if (object.isEdge && this.edgeEvents.onClick) {
76
+ this.edgeEvents.onClick(info, event);
77
+ }
78
+ }
79
+ _mouseLeaveNode() {
80
+ const lastHoveredNode = this._lastHoveredNode;
81
+ if (!(lastHoveredNode.isSelectable() && lastHoveredNode.getState() === NODE_STATE.SELECTED)) {
82
+ // reset the last hovered node's state
83
+ const newState = this._lastSelectedNode !== null && this._lastSelectedNode.id === this._lastHoveredNode?.id
84
+ ? NODE_STATE.SELECTED
85
+ : NODE_STATE.DEFAULT;
86
+ setNodeState(lastHoveredNode, newState);
87
+ }
88
+ // trigger the callback if exists
89
+ if (this.nodeEvents.onMouseLeave) {
90
+ this.nodeEvents.onMouseLeave(lastHoveredNode);
91
+ }
92
+ }
93
+ _mouseEnterNode(info) {
94
+ // set the node's state to hover
95
+ setNodeState(info.object, NODE_STATE.HOVER);
96
+ // trigger the callback if exists
97
+ if (this.nodeEvents.onMouseEnter) {
98
+ this.nodeEvents.onMouseEnter(info);
99
+ }
100
+ if (this.nodeEvents.onHover) {
101
+ this.nodeEvents.onHover(info);
102
+ }
103
+ }
104
+ onHover(info, event) {
105
+ if (!info.object) {
106
+ if (this._lastHoveredNode) {
107
+ this._mouseLeaveNode();
108
+ this._lastInteraction = Date.now();
109
+ this._lastHoveredNode = null;
110
+ this.notifyCallback();
111
+ }
112
+ return;
113
+ }
114
+ // hover over on a node
115
+ if (info.object.isNode) {
116
+ const isSameNode = this._lastHoveredNode && this._lastHoveredNode.id === info.object.id;
117
+ // stay in the same node
118
+ if (isSameNode) {
119
+ return;
120
+ }
121
+ if (this._lastHoveredNode) {
122
+ // reset the previous hovered node's state if not the same node
123
+ this._mouseLeaveNode();
124
+ }
125
+ // enter new node
126
+ this._mouseEnterNode(info);
127
+ this._lastInteraction = Date.now();
128
+ this._lastHoveredNode = info.object;
129
+ this.notifyCallback();
130
+ }
131
+ if (info.object.isEdge && this.edgeEvents.onHover) {
132
+ this.edgeEvents.onHover(info);
133
+ }
134
+ }
135
+ onDragStart(info, event) {
136
+ if (this.nodeEvents.onDragStart) {
137
+ this.nodeEvents.onDragStart(info);
138
+ }
139
+ }
140
+ onDrag(info, event) {
141
+ if (!info.object.isNode || !this.enableDragging) {
142
+ return;
143
+ }
144
+ event.stopImmediatePropagation();
145
+ // info.viewport is undefined when the object is offscreen, so we use viewport from onDragStart
146
+ const coordinates = info.layer.context.viewport.unproject([info.x, info.y]);
147
+ // limit the node position to be within bounds of the viewport
148
+ const bounds = info.layer.context.viewport.getBounds(); // [minX, minY, maxX, maxY]
149
+ const x = Math.min(Math.max(coordinates[0], bounds[0]), bounds[2]);
150
+ const y = Math.min(Math.max(coordinates[1], bounds[1]), bounds[3]);
151
+ this.engine.lockNodePosition(info.object, x, y);
152
+ setNodeState(info.object, NODE_STATE.DRAGGING);
153
+ this._lastInteraction = Date.now();
154
+ this.notifyCallback();
155
+ if (this.nodeEvents.onDrag) {
156
+ this.nodeEvents.onDrag(info);
157
+ }
158
+ }
159
+ onDragEnd(info, event) {
160
+ if (!info.object.isNode || !this.enableDragging) {
161
+ return;
162
+ }
163
+ if (this.resumeLayoutAfterDragging) {
164
+ this.engine.resume();
165
+ }
166
+ setNodeState(info.object, NODE_STATE.DEFAULT);
167
+ this.engine.unlockNodePosition(info.object);
168
+ }
169
+ }
@@ -0,0 +1,103 @@
1
+ import { NODE_STATE, ValueOf } from './constants';
2
+ import { Edge } from './edge';
3
+ interface NodeOptions {
4
+ id: number | string;
5
+ selectable?: boolean;
6
+ highlightConnectedEdges?: boolean;
7
+ data: Record<string, unknown>;
8
+ }
9
+ export declare class Node {
10
+ id: string | number;
11
+ /** Keep a reference to origin data. */
12
+ private _data;
13
+ /** List edges. */
14
+ private _connectedEdges;
15
+ /** Interaction state of the node. */
16
+ state: ValueOf<typeof NODE_STATE>;
17
+ /** Can the node be selected? */
18
+ private _selectable;
19
+ /** Should the state of this node affect the state of the connected edges? */
20
+ private _highlightConnectedEdges;
21
+ /** Check the type of the object when picking engine gets it. */
22
+ readonly isNode = true;
23
+ /**
24
+ * The constructor of a node
25
+ * @param {String|Number} options.id - the unique ID of the node
26
+ * @param {Record<string, unknown>} options.data - origin data reference
27
+ */
28
+ constructor({ id, selectable, highlightConnectedEdges, data }: NodeOptions);
29
+ /**
30
+ * Return the ID of the node
31
+ * @return {String|Number} - the ID of the node.
32
+ */
33
+ getId(): string | number;
34
+ /**
35
+ * Return the degree of the node -- includes in-degree and out-degree
36
+ * @return {Number} - the degree of the node.
37
+ */
38
+ getDegree(): number;
39
+ /**
40
+ * Return the in-degree of the node.
41
+ * @return {Number} - the in-degree of the node.
42
+ */
43
+ getInDegree(): number;
44
+ /**
45
+ * Return the out-degree of the node.
46
+ * @return {Number} - the out-degree of the node.
47
+ */
48
+ getOutDegree(): number;
49
+ /**
50
+ * Return all the IDs of the sibling nodes.
51
+ * @return {String[]} [description]
52
+ */
53
+ getSiblingIds(): (string | number)[];
54
+ /**
55
+ * Return all the connected edges.
56
+ * @return {Object[]} - an array of the connected edges.
57
+ */
58
+ getConnectedEdges(): Edge[];
59
+ /**
60
+ * Return of the value of the selected property key.
61
+ * @param {String} key - property key.
62
+ * @return {Any} - the value of the property or undefined (not found).
63
+ */
64
+ getPropertyValue(key: string): unknown;
65
+ /**
66
+ * Set the new node data.
67
+ * @param {Record<string, unknown>} data - the new data of the node
68
+ */
69
+ setData(data: Record<string, unknown>): void;
70
+ /**
71
+ * Update a data property.
72
+ * @param {String} key - the key of the property
73
+ * @param {Any} value - the value of the property.
74
+ */
75
+ setDataProperty(key: string, value: unknown): void;
76
+ /**
77
+ * Set node state
78
+ * @param {String} state - one of NODE_STATE
79
+ */
80
+ setState(state: ValueOf<typeof NODE_STATE>): void;
81
+ /**
82
+ * Get node state
83
+ * @returns {string} state - one of NODE_STATE
84
+ */
85
+ getState(): ValueOf<typeof NODE_STATE>;
86
+ /**
87
+ * Add connected edges to the node
88
+ * @param {Edge || Edge[]} edge an edge or an array of edges to be added to this._connectedEdges
89
+ */
90
+ addConnectedEdges(edge: Edge | Edge[]): void;
91
+ /**
92
+ * Remove edges from this._connectedEdges
93
+ * @param {Edge | Edge[]} edge an edge or an array of edges to be removed from this._connectedEdges
94
+ */
95
+ removeConnectedEdges(edge: Edge | Edge[]): void;
96
+ /**
97
+ * Clear this._connectedEdges
98
+ */
99
+ clearConnectedEdges(): void;
100
+ isSelectable(): boolean;
101
+ shouldHighlightConnectedEdges(): boolean;
102
+ }
103
+ export {};
@@ -0,0 +1,177 @@
1
+ // deck.gl-community
2
+ // SPDX-License-Identifier: MIT
3
+ // Copyright (c) vis.gl contributors
4
+ import { NODE_STATE } from './constants';
5
+ // Basic data structure of a node
6
+ export class Node {
7
+ id;
8
+ /** Keep a reference to origin data. */
9
+ _data;
10
+ /** List edges. */
11
+ _connectedEdges = {};
12
+ /** Interaction state of the node. */
13
+ state = NODE_STATE.DEFAULT;
14
+ /** Can the node be selected? */
15
+ _selectable;
16
+ /** Should the state of this node affect the state of the connected edges? */
17
+ _highlightConnectedEdges;
18
+ /** Check the type of the object when picking engine gets it. */
19
+ isNode = true;
20
+ /**
21
+ * The constructor of a node
22
+ * @param {String|Number} options.id - the unique ID of the node
23
+ * @param {Record<string, unknown>} options.data - origin data reference
24
+ */
25
+ constructor({ id, selectable = false, highlightConnectedEdges = false, data = {} }) {
26
+ this.id = id;
27
+ this._data = data;
28
+ this._selectable = selectable;
29
+ this._highlightConnectedEdges = highlightConnectedEdges;
30
+ }
31
+ /**
32
+ * Return the ID of the node
33
+ * @return {String|Number} - the ID of the node.
34
+ */
35
+ getId() {
36
+ return this.id;
37
+ }
38
+ /**
39
+ * Return the degree of the node -- includes in-degree and out-degree
40
+ * @return {Number} - the degree of the node.
41
+ */
42
+ getDegree() {
43
+ return Object.keys(this._connectedEdges).length;
44
+ }
45
+ /**
46
+ * Return the in-degree of the node.
47
+ * @return {Number} - the in-degree of the node.
48
+ */
49
+ getInDegree() {
50
+ const nodeId = this.getId();
51
+ return this.getConnectedEdges().reduce((count, e) => {
52
+ const isDirected = e.isDirected();
53
+ if (isDirected && e.getTargetNodeId() === nodeId) {
54
+ count += 1;
55
+ }
56
+ return count;
57
+ }, 0);
58
+ }
59
+ /**
60
+ * Return the out-degree of the node.
61
+ * @return {Number} - the out-degree of the node.
62
+ */
63
+ getOutDegree() {
64
+ const nodeId = this.getId();
65
+ return this.getConnectedEdges().reduce((count, e) => {
66
+ const isDirected = e.isDirected();
67
+ if (isDirected && e.getSourceNodeId() === nodeId) {
68
+ count += 1;
69
+ }
70
+ return count;
71
+ }, 0);
72
+ }
73
+ /**
74
+ * Return all the IDs of the sibling nodes.
75
+ * @return {String[]} [description]
76
+ */
77
+ getSiblingIds() {
78
+ const nodeId = this.getId();
79
+ return this.getConnectedEdges().reduce((siblings, e) => {
80
+ if (e.getTargetNodeId() === nodeId) {
81
+ siblings.push(e.getSourceNodeId());
82
+ }
83
+ else {
84
+ siblings.push(e.getTargetNodeId());
85
+ }
86
+ return siblings;
87
+ }, []);
88
+ }
89
+ /**
90
+ * Return all the connected edges.
91
+ * @return {Object[]} - an array of the connected edges.
92
+ */
93
+ getConnectedEdges() {
94
+ return Object.values(this._connectedEdges);
95
+ }
96
+ /**
97
+ * Return of the value of the selected property key.
98
+ * @param {String} key - property key.
99
+ * @return {Any} - the value of the property or undefined (not found).
100
+ */
101
+ getPropertyValue(key) {
102
+ // try to search the key within this object
103
+ if (this.hasOwnProperty(key)) {
104
+ return this[key];
105
+ }
106
+ // try to search the key in the original data reference
107
+ else if (this._data.hasOwnProperty(key)) {
108
+ return this._data[key];
109
+ }
110
+ // otherwise, not found
111
+ return undefined;
112
+ }
113
+ /**
114
+ * Set the new node data.
115
+ * @param {Record<string, unknown>} data - the new data of the node
116
+ */
117
+ setData(data) {
118
+ this._data = data;
119
+ }
120
+ /**
121
+ * Update a data property.
122
+ * @param {String} key - the key of the property
123
+ * @param {Any} value - the value of the property.
124
+ */
125
+ setDataProperty(key, value) {
126
+ this._data[key] = value;
127
+ }
128
+ /**
129
+ * Set node state
130
+ * @param {String} state - one of NODE_STATE
131
+ */
132
+ setState(state) {
133
+ this.state = state;
134
+ }
135
+ /**
136
+ * Get node state
137
+ * @returns {string} state - one of NODE_STATE
138
+ */
139
+ getState() {
140
+ return this.state;
141
+ }
142
+ /**
143
+ * Add connected edges to the node
144
+ * @param {Edge || Edge[]} edge an edge or an array of edges to be added to this._connectedEdges
145
+ */
146
+ addConnectedEdges(edge) {
147
+ const iterableEdges = Array.isArray(edge) ? edge : [edge];
148
+ iterableEdges.forEach((e) => {
149
+ this._connectedEdges[e.id] = e;
150
+ e.addNode(this);
151
+ });
152
+ }
153
+ /**
154
+ * Remove edges from this._connectedEdges
155
+ * @param {Edge | Edge[]} edge an edge or an array of edges to be removed from this._connectedEdges
156
+ */
157
+ removeConnectedEdges(edge) {
158
+ const iterableEdges = Array.isArray(edge) ? edge : [edge];
159
+ iterableEdges.forEach((e) => {
160
+ e.removeNode(this);
161
+ delete this._connectedEdges[e.id];
162
+ });
163
+ }
164
+ /**
165
+ * Clear this._connectedEdges
166
+ */
167
+ clearConnectedEdges() {
168
+ Object.values(this._connectedEdges).forEach((e) => e.removeNode(this));
169
+ this._connectedEdges = {};
170
+ }
171
+ isSelectable() {
172
+ return this._selectable;
173
+ }
174
+ shouldHighlightConnectedEdges() {
175
+ return this._highlightConnectedEdges;
176
+ }
177
+ }