@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.
- package/LICENSE +20 -0
- package/README.md +7 -0
- package/dist/core/base-layout.d.ts +71 -0
- package/dist/core/base-layout.js +133 -0
- package/dist/core/cache.d.ts +14 -0
- package/dist/core/cache.js +26 -0
- package/dist/core/constants.d.ts +101 -0
- package/dist/core/constants.js +48 -0
- package/dist/core/edge.d.ts +86 -0
- package/dist/core/edge.js +121 -0
- package/dist/core/graph-engine.d.ts +54 -0
- package/dist/core/graph-engine.js +128 -0
- package/dist/core/graph.d.ts +155 -0
- package/dist/core/graph.js +301 -0
- package/dist/core/interaction-manager.d.ts +40 -0
- package/dist/core/interaction-manager.js +169 -0
- package/dist/core/node.d.ts +103 -0
- package/dist/core/node.js +177 -0
- package/dist/index.cjs +3540 -0
- package/dist/index.cjs.map +7 -0
- package/dist/index.d.ts +19 -0
- package/dist/index.js +28 -0
- package/dist/layers/common-layers/flow-path-layer/flow-path-layer-fragment.glsl.d.ts +1 -0
- package/dist/layers/common-layers/flow-path-layer/flow-path-layer-fragment.glsl.js +49 -0
- package/dist/layers/common-layers/flow-path-layer/flow-path-layer-vertex-tf.glsl.d.ts +1 -0
- package/dist/layers/common-layers/flow-path-layer/flow-path-layer-vertex-tf.glsl.js +14 -0
- package/dist/layers/common-layers/flow-path-layer/flow-path-layer-vertex.glsl.d.ts +1 -0
- package/dist/layers/common-layers/flow-path-layer/flow-path-layer-vertex.glsl.js +73 -0
- package/dist/layers/common-layers/flow-path-layer/flow-path-layer.d.ts +20 -0
- package/dist/layers/common-layers/flow-path-layer/flow-path-layer.js +133 -0
- package/dist/layers/common-layers/marker-layer/atlas-data-url.d.ts +3 -0
- package/dist/layers/common-layers/marker-layer/atlas-data-url.js +8 -0
- package/dist/layers/common-layers/marker-layer/marker-layer.d.ts +13 -0
- package/dist/layers/common-layers/marker-layer/marker-layer.js +29 -0
- package/dist/layers/common-layers/marker-layer/marker-list.d.ts +62 -0
- package/dist/layers/common-layers/marker-layer/marker-list.js +67 -0
- package/dist/layers/common-layers/marker-layer/marker-mapping.d.ts +422 -0
- package/dist/layers/common-layers/marker-layer/marker-mapping.js +427 -0
- package/dist/layers/common-layers/spline-layer/spline-layer.d.ts +24 -0
- package/dist/layers/common-layers/spline-layer/spline-layer.js +68 -0
- package/dist/layers/common-layers/zoomable-text-layer/zoomable-text-layer.d.ts +16 -0
- package/dist/layers/common-layers/zoomable-text-layer/zoomable-text-layer.js +65 -0
- package/dist/layers/edge-layer.d.ts +25 -0
- package/dist/layers/edge-layer.js +75 -0
- package/dist/layers/edge-layers/curved-edge-layer.d.ts +6 -0
- package/dist/layers/edge-layers/curved-edge-layer.js +69 -0
- package/dist/layers/edge-layers/edge-label-layer.d.ts +6 -0
- package/dist/layers/edge-layers/edge-label-layer.js +42 -0
- package/dist/layers/edge-layers/flow-layer.d.ts +6 -0
- package/dist/layers/edge-layers/flow-layer.js +28 -0
- package/dist/layers/edge-layers/path-edge-layer.d.ts +6 -0
- package/dist/layers/edge-layers/path-edge-layer.js +27 -0
- package/dist/layers/edge-layers/straight-line-edge-layer.d.ts +6 -0
- package/dist/layers/edge-layers/straight-line-edge-layer.js +26 -0
- package/dist/layers/graph-layer.d.ts +32 -0
- package/dist/layers/graph-layer.js +193 -0
- package/dist/layers/node-layers/circle-layer.d.ts +6 -0
- package/dist/layers/node-layers/circle-layer.js +23 -0
- package/dist/layers/node-layers/image-layer.d.ts +6 -0
- package/dist/layers/node-layers/image-layer.js +23 -0
- package/dist/layers/node-layers/label-layer.d.ts +6 -0
- package/dist/layers/node-layers/label-layer.js +23 -0
- package/dist/layers/node-layers/path-rounded-rectange-layer.d.ts +6 -0
- package/dist/layers/node-layers/path-rounded-rectange-layer.js +46 -0
- package/dist/layers/node-layers/rectangle-layer.d.ts +6 -0
- package/dist/layers/node-layers/rectangle-layer.js +49 -0
- package/dist/layers/node-layers/rounded-rectangle-layer-fragment.d.ts +1 -0
- package/dist/layers/node-layers/rounded-rectangle-layer-fragment.js +30 -0
- package/dist/layers/node-layers/rounded-rectangle-layer.d.ts +8 -0
- package/dist/layers/node-layers/rounded-rectangle-layer.js +28 -0
- package/dist/layers/node-layers/zoomable-marker-layer.d.ts +10 -0
- package/dist/layers/node-layers/zoomable-marker-layer.js +40 -0
- package/dist/layouts/d3-force/d3-force-layout.d.ts +24 -0
- package/dist/layouts/d3-force/d3-force-layout.js +116 -0
- package/dist/layouts/d3-force/worker.d.ts +0 -0
- package/dist/layouts/d3-force/worker.js +46 -0
- package/dist/layouts/gpu-force/gpu-force-layout.d.ts +30 -0
- package/dist/layouts/gpu-force/gpu-force-layout.js +232 -0
- package/dist/layouts/gpu-force/worker.d.ts +0 -0
- package/dist/layouts/gpu-force/worker.js +116 -0
- package/dist/layouts/simple-layout/simple-layout.d.ts +22 -0
- package/dist/layouts/simple-layout/simple-layout.js +64 -0
- package/dist/loaders/edge-parsers.d.ts +6 -0
- package/dist/loaders/edge-parsers.js +17 -0
- package/dist/loaders/json-loader.d.ts +7 -0
- package/dist/loaders/json-loader.js +16 -0
- package/dist/loaders/node-parsers.d.ts +3 -0
- package/dist/loaders/node-parsers.js +11 -0
- package/dist/style/style-property.d.ts +14 -0
- package/dist/style/style-property.js +195 -0
- package/dist/style/style-sheet.d.ts +10 -0
- package/dist/style/style-sheet.js +252 -0
- package/dist/utils/create-graph.d.ts +8 -0
- package/dist/utils/create-graph.js +33 -0
- package/dist/utils/layer-utils.d.ts +1 -0
- package/dist/utils/layer-utils.js +20 -0
- package/dist/utils/log.d.ts +2 -0
- package/dist/utils/log.js +6 -0
- package/dist/utils/polygon-calculations.d.ts +1 -0
- package/dist/utils/polygon-calculations.js +102 -0
- package/package.json +55 -0
- package/src/core/base-layout.ts +154 -0
- package/src/core/cache.ts +31 -0
- package/src/core/constants.ts +58 -0
- package/src/core/edge.ts +145 -0
- package/src/core/graph-engine.ts +170 -0
- package/src/core/graph.ts +342 -0
- package/src/core/interaction-manager.ts +225 -0
- package/src/core/node.ts +205 -0
- package/src/index.ts +42 -0
- package/src/layers/common-layers/flow-path-layer/flow-path-layer-fragment.glsl.ts +50 -0
- package/src/layers/common-layers/flow-path-layer/flow-path-layer-vertex-tf.glsl.ts +15 -0
- package/src/layers/common-layers/flow-path-layer/flow-path-layer-vertex.glsl.ts +74 -0
- package/src/layers/common-layers/flow-path-layer/flow-path-layer.ts +154 -0
- package/src/layers/common-layers/marker-layer/atlas-data-url.ts +10 -0
- package/src/layers/common-layers/marker-layer/marker-atlas.png +0 -0
- package/src/layers/common-layers/marker-layer/marker-layer.ts +36 -0
- package/src/layers/common-layers/marker-layer/marker-list.ts +68 -0
- package/src/layers/common-layers/marker-layer/marker-mapping.ts +428 -0
- package/src/layers/common-layers/marker-layer/markers/bell-filled.png +0 -0
- package/src/layers/common-layers/marker-layer/markers/bell.png +0 -0
- package/src/layers/common-layers/marker-layer/markers/bookmark-filled.png +0 -0
- package/src/layers/common-layers/marker-layer/markers/bookmark.png +0 -0
- package/src/layers/common-layers/marker-layer/markers/cd-filled.png +0 -0
- package/src/layers/common-layers/marker-layer/markers/cd.png +0 -0
- package/src/layers/common-layers/marker-layer/markers/checkmark.png +0 -0
- package/src/layers/common-layers/marker-layer/markers/circle-check-filled.png +0 -0
- package/src/layers/common-layers/marker-layer/markers/circle-check.png +0 -0
- package/src/layers/common-layers/marker-layer/markers/circle-filled.png +0 -0
- package/src/layers/common-layers/marker-layer/markers/circle-i-filled.png +0 -0
- package/src/layers/common-layers/marker-layer/markers/circle-i.png +0 -0
- package/src/layers/common-layers/marker-layer/markers/circle-minus-filled.png +0 -0
- package/src/layers/common-layers/marker-layer/markers/circle-minus.png +0 -0
- package/src/layers/common-layers/marker-layer/markers/circle-plus-filled.png +0 -0
- package/src/layers/common-layers/marker-layer/markers/circle-plus.png +0 -0
- package/src/layers/common-layers/marker-layer/markers/circle-questionmark-filled.png +0 -0
- package/src/layers/common-layers/marker-layer/markers/circle-questionmark.png +0 -0
- package/src/layers/common-layers/marker-layer/markers/circle-slash-filled.png +0 -0
- package/src/layers/common-layers/marker-layer/markers/circle-slash.png +0 -0
- package/src/layers/common-layers/marker-layer/markers/circle-x-filled.png +0 -0
- package/src/layers/common-layers/marker-layer/markers/circle-x.png +0 -0
- package/src/layers/common-layers/marker-layer/markers/circle.png +0 -0
- package/src/layers/common-layers/marker-layer/markers/diamond-filled.png +0 -0
- package/src/layers/common-layers/marker-layer/markers/diamond.png +0 -0
- package/src/layers/common-layers/marker-layer/markers/flag-filled.png +0 -0
- package/src/layers/common-layers/marker-layer/markers/flag.png +0 -0
- package/src/layers/common-layers/marker-layer/markers/gear.png +0 -0
- package/src/layers/common-layers/marker-layer/markers/heart-filled.png +0 -0
- package/src/layers/common-layers/marker-layer/markers/heart.png +0 -0
- package/src/layers/common-layers/marker-layer/markers/location-marker-filled.png +0 -0
- package/src/layers/common-layers/marker-layer/markers/location-marker.png +0 -0
- package/src/layers/common-layers/marker-layer/markers/octagonal-star-filled.png +0 -0
- package/src/layers/common-layers/marker-layer/markers/octagonal-star.png +0 -0
- package/src/layers/common-layers/marker-layer/markers/person-filled.png +0 -0
- package/src/layers/common-layers/marker-layer/markers/person.png +0 -0
- package/src/layers/common-layers/marker-layer/markers/pin-filled.png +0 -0
- package/src/layers/common-layers/marker-layer/markers/pin.png +0 -0
- package/src/layers/common-layers/marker-layer/markers/plus-small.png +0 -0
- package/src/layers/common-layers/marker-layer/markers/plus.png +0 -0
- package/src/layers/common-layers/marker-layer/markers/rectangle-filled.png +0 -0
- package/src/layers/common-layers/marker-layer/markers/rectangle.png +0 -0
- package/src/layers/common-layers/marker-layer/markers/star-filled.png +0 -0
- package/src/layers/common-layers/marker-layer/markers/star.png +0 -0
- package/src/layers/common-layers/marker-layer/markers/tag-filled.png +0 -0
- package/src/layers/common-layers/marker-layer/markers/tag.png +0 -0
- package/src/layers/common-layers/marker-layer/markers/thumb-down-filled.png +0 -0
- package/src/layers/common-layers/marker-layer/markers/thumb-down.png +0 -0
- package/src/layers/common-layers/marker-layer/markers/thumb-up.png +0 -0
- package/src/layers/common-layers/marker-layer/markers/thumb_up-filled.png +0 -0
- package/src/layers/common-layers/marker-layer/markers/triangle-down-filled.png +0 -0
- package/src/layers/common-layers/marker-layer/markers/triangle-down.png +0 -0
- package/src/layers/common-layers/marker-layer/markers/triangle-left-filled.png +0 -0
- package/src/layers/common-layers/marker-layer/markers/triangle-left.png +0 -0
- package/src/layers/common-layers/marker-layer/markers/triangle-right-filled.png +0 -0
- package/src/layers/common-layers/marker-layer/markers/triangle-right.png +0 -0
- package/src/layers/common-layers/marker-layer/markers/triangle-up-filled.png +0 -0
- package/src/layers/common-layers/marker-layer/markers/triangle-up.png +0 -0
- package/src/layers/common-layers/marker-layer/markers/x-small.png +0 -0
- package/src/layers/common-layers/marker-layer/markers/x.png +0 -0
- package/src/layers/common-layers/spline-layer/spline-layer.ts +83 -0
- package/src/layers/common-layers/zoomable-text-layer/zoomable-text-layer.ts +90 -0
- package/src/layers/edge-layer.ts +88 -0
- package/src/layers/edge-layers/curved-edge-layer.ts +88 -0
- package/src/layers/edge-layers/edge-label-layer.ts +48 -0
- package/src/layers/edge-layers/flow-layer.ts +34 -0
- package/src/layers/edge-layers/path-edge-layer.ts +39 -0
- package/src/layers/edge-layers/straight-line-edge-layer.ts +38 -0
- package/src/layers/graph-layer.ts +225 -0
- package/src/layers/node-layers/circle-layer.ts +29 -0
- package/src/layers/node-layers/image-layer.ts +29 -0
- package/src/layers/node-layers/label-layer.ts +29 -0
- package/src/layers/node-layers/path-rounded-rectange-layer.ts +56 -0
- package/src/layers/node-layers/rectangle-layer.ts +58 -0
- package/src/layers/node-layers/rounded-rectangle-layer-fragment.ts +31 -0
- package/src/layers/node-layers/rounded-rectangle-layer.ts +32 -0
- package/src/layers/node-layers/zoomable-marker-layer.ts +49 -0
- package/src/layouts/d3-force/d3-force-layout.ts +145 -0
- package/src/layouts/d3-force/worker.ts +61 -0
- package/src/layouts/gpu-force/gpu-force-layout.ts +249 -0
- package/src/layouts/gpu-force/worker.ts +137 -0
- package/src/layouts/simple-layout/simple-layout.ts +87 -0
- package/src/loaders/edge-parsers.ts +21 -0
- package/src/loaders/json-loader.ts +19 -0
- package/src/loaders/node-parsers.ts +13 -0
- package/src/style/style-property.ts +229 -0
- package/src/style/style-sheet.ts +277 -0
- package/src/utils/create-graph.ts +38 -0
- package/src/utils/layer-utils.ts +23 -0
- package/src/utils/log.ts +9 -0
- 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
|
+
}
|