@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
package/dist/index.cjs
ADDED
|
@@ -0,0 +1,3540 @@
|
|
|
1
|
+
var __create = Object.create;
|
|
2
|
+
var __defProp = Object.defineProperty;
|
|
3
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
5
|
+
var __getProtoOf = Object.getPrototypeOf;
|
|
6
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
7
|
+
var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
|
|
8
|
+
var __export = (target, all) => {
|
|
9
|
+
for (var name in all)
|
|
10
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
11
|
+
};
|
|
12
|
+
var __copyProps = (to, from, except, desc) => {
|
|
13
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
14
|
+
for (let key of __getOwnPropNames(from))
|
|
15
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
16
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
17
|
+
}
|
|
18
|
+
return to;
|
|
19
|
+
};
|
|
20
|
+
var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
|
|
21
|
+
// If the importer is in node compatibility mode or this is not an ESM
|
|
22
|
+
// file that has been converted to a CommonJS file using a Babel-
|
|
23
|
+
// compatible transform (i.e. "__esModule" has not been set), then set
|
|
24
|
+
// "default" to the CommonJS "module.exports" for node compatibility.
|
|
25
|
+
isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
|
|
26
|
+
mod
|
|
27
|
+
));
|
|
28
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
29
|
+
var __publicField = (obj, key, value) => {
|
|
30
|
+
__defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
|
|
31
|
+
return value;
|
|
32
|
+
};
|
|
33
|
+
|
|
34
|
+
// dist/index.js
|
|
35
|
+
var dist_exports = {};
|
|
36
|
+
__export(dist_exports, {
|
|
37
|
+
BaseLayout: () => BaseLayout,
|
|
38
|
+
CompositeEdgeLayer: () => EdgeLayer,
|
|
39
|
+
D3ForceLayout: () => D3ForceLayout,
|
|
40
|
+
EDGE_DECORATOR_TYPE: () => EDGE_DECORATOR_TYPE,
|
|
41
|
+
EDGE_TYPE: () => EDGE_TYPE,
|
|
42
|
+
Edge: () => Edge,
|
|
43
|
+
EdgeLayer: () => EdgeLayer,
|
|
44
|
+
GPUForceLayout: () => GPUForceLayout,
|
|
45
|
+
Graph: () => Graph,
|
|
46
|
+
GraphEngine: () => GraphEngine,
|
|
47
|
+
GraphLayer: () => GraphLayer,
|
|
48
|
+
JSONLoader: () => JSONLoader,
|
|
49
|
+
LAYOUT_STATE: () => LAYOUT_STATE,
|
|
50
|
+
MARKER_TYPE: () => MARKER_TYPE,
|
|
51
|
+
NODE_STATE: () => NODE_STATE,
|
|
52
|
+
NODE_TYPE: () => NODE_TYPE,
|
|
53
|
+
Node: () => Node,
|
|
54
|
+
SimpleLayout: () => SimpleLayout,
|
|
55
|
+
basicEdgeParser: () => basicEdgeParser,
|
|
56
|
+
basicNodeParser: () => basicNodeParser,
|
|
57
|
+
createGraph: () => createGraph,
|
|
58
|
+
log: () => log,
|
|
59
|
+
mixedGetPosition: () => mixedGetPosition
|
|
60
|
+
});
|
|
61
|
+
module.exports = __toCommonJS(dist_exports);
|
|
62
|
+
|
|
63
|
+
// dist/core/cache.js
|
|
64
|
+
var Cache = class {
|
|
65
|
+
_keys = /* @__PURE__ */ new Map();
|
|
66
|
+
/**
|
|
67
|
+
* @param key The key of the cache
|
|
68
|
+
* @returns {*} The value of the cache as set by the `set` method.
|
|
69
|
+
*/
|
|
70
|
+
get(key) {
|
|
71
|
+
var _a;
|
|
72
|
+
return (_a = this._keys.get(key)) == null ? void 0 : _a.value;
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* @param key The key of the cache
|
|
76
|
+
* @param createValue A callback to create the value of the cache if it is needed.
|
|
77
|
+
* @param version The version of the cache. If the version is smaller than the current version, the cache will not be updated.
|
|
78
|
+
*/
|
|
79
|
+
set(key, createValue, version) {
|
|
80
|
+
const cached = this._keys.get(key);
|
|
81
|
+
const keyUpdated = cached === void 0 || version > cached.version;
|
|
82
|
+
if (!keyUpdated) {
|
|
83
|
+
return;
|
|
84
|
+
}
|
|
85
|
+
this._keys.set(key, { version, value: createValue() });
|
|
86
|
+
}
|
|
87
|
+
};
|
|
88
|
+
|
|
89
|
+
// dist/core/graph-engine.js
|
|
90
|
+
var GraphEngine = class extends EventTarget {
|
|
91
|
+
_graph;
|
|
92
|
+
_layout;
|
|
93
|
+
_cache = new Cache();
|
|
94
|
+
_layoutDirty = false;
|
|
95
|
+
_transactionInProgress = false;
|
|
96
|
+
constructor(graph, layout) {
|
|
97
|
+
super();
|
|
98
|
+
this._graph = graph;
|
|
99
|
+
this._layout = layout;
|
|
100
|
+
}
|
|
101
|
+
/** Getters */
|
|
102
|
+
getNodes = () => {
|
|
103
|
+
this._updateCache("nodes", () => this._graph.getNodes().filter((node) => this.getNodePosition(node)));
|
|
104
|
+
return this._cache.get("nodes");
|
|
105
|
+
};
|
|
106
|
+
getEdges = () => {
|
|
107
|
+
this._updateCache("edges", () => this._graph.getEdges().filter((edge) => this.getEdgePosition(edge)));
|
|
108
|
+
return this._cache.get("edges");
|
|
109
|
+
};
|
|
110
|
+
getNodePosition = (node) => this._layout.getNodePosition(node);
|
|
111
|
+
getEdgePosition = (edge) => this._layout.getEdgePosition(edge);
|
|
112
|
+
getGraphVersion = () => this._graph.version;
|
|
113
|
+
getLayoutLastUpdate = () => this._layout.version;
|
|
114
|
+
getLayoutState = () => this._layout.state;
|
|
115
|
+
/** Operations on the graph */
|
|
116
|
+
lockNodePosition = (node, x, y) => this._layout.lockNodePosition(node, x, y);
|
|
117
|
+
unlockNodePosition = (node) => this._layout.unlockNodePosition(node);
|
|
118
|
+
/**
|
|
119
|
+
* @fires GraphEngine#onLayoutStart
|
|
120
|
+
*/
|
|
121
|
+
_onLayoutStart = () => {
|
|
122
|
+
this.dispatchEvent(new CustomEvent("onLayoutStart"));
|
|
123
|
+
};
|
|
124
|
+
/**
|
|
125
|
+
* @fires GraphEngine#onLayoutChange
|
|
126
|
+
*/
|
|
127
|
+
_onLayoutChange = () => {
|
|
128
|
+
this.dispatchEvent(new CustomEvent("onLayoutChange"));
|
|
129
|
+
};
|
|
130
|
+
/**
|
|
131
|
+
* @fires GraphEngine#onLayoutDone
|
|
132
|
+
*/
|
|
133
|
+
_onLayoutDone = () => {
|
|
134
|
+
this.dispatchEvent(new CustomEvent("onLayoutDone"));
|
|
135
|
+
};
|
|
136
|
+
/**
|
|
137
|
+
* @fires GraphEngine#onLayoutError
|
|
138
|
+
*/
|
|
139
|
+
_onLayoutError = () => {
|
|
140
|
+
this.dispatchEvent(new CustomEvent("onLayoutError"));
|
|
141
|
+
};
|
|
142
|
+
_onGraphStructureChanged = (entity) => {
|
|
143
|
+
this._layoutDirty = true;
|
|
144
|
+
this._graphChanged();
|
|
145
|
+
};
|
|
146
|
+
_onTransactionStart = () => {
|
|
147
|
+
this._transactionInProgress = true;
|
|
148
|
+
};
|
|
149
|
+
_onTransactionEnd = () => {
|
|
150
|
+
this._transactionInProgress = false;
|
|
151
|
+
this._graphChanged();
|
|
152
|
+
};
|
|
153
|
+
/** Layout calculations */
|
|
154
|
+
run = () => {
|
|
155
|
+
this._graph.addEventListener("transactionStart", this._onTransactionStart);
|
|
156
|
+
this._graph.addEventListener("transactionEnd", this._onTransactionEnd);
|
|
157
|
+
this._graph.addEventListener("onNodeAdded", this._onGraphStructureChanged);
|
|
158
|
+
this._graph.addEventListener("onNodeRemoved", this._onGraphStructureChanged);
|
|
159
|
+
this._graph.addEventListener("onEdgeAdded", this._onGraphStructureChanged);
|
|
160
|
+
this._graph.addEventListener("onEdgeRemoved", this._onGraphStructureChanged);
|
|
161
|
+
this._layout.addEventListener("onLayoutStart", this._onLayoutStart);
|
|
162
|
+
this._layout.addEventListener("onLayoutChange", this._onLayoutChange);
|
|
163
|
+
this._layout.addEventListener("onLayoutDone", this._onLayoutDone);
|
|
164
|
+
this._layout.addEventListener("onLayoutError", this._onLayoutError);
|
|
165
|
+
this._layout.initializeGraph(this._graph);
|
|
166
|
+
this._layout.start();
|
|
167
|
+
};
|
|
168
|
+
clear = () => {
|
|
169
|
+
this._graph.removeEventListener("transactionStart", this._onTransactionStart);
|
|
170
|
+
this._graph.removeEventListener("transactionEnd", this._onTransactionEnd);
|
|
171
|
+
this._graph.removeEventListener("onNodeAdded", this._onGraphStructureChanged);
|
|
172
|
+
this._graph.removeEventListener("onNodeRemoved", this._onGraphStructureChanged);
|
|
173
|
+
this._graph.removeEventListener("onEdgeAdded", this._onGraphStructureChanged);
|
|
174
|
+
this._graph.removeEventListener("onEdgeRemoved", this._onGraphStructureChanged);
|
|
175
|
+
this._layout.removeEventListener("onLayoutStart", this._onLayoutStart);
|
|
176
|
+
this._layout.removeEventListener("onLayoutChange", this._onLayoutChange);
|
|
177
|
+
this._layout.removeEventListener("onLayoutDone", this._onLayoutDone);
|
|
178
|
+
this._layout.removeEventListener("onLayoutError", this._onLayoutError);
|
|
179
|
+
};
|
|
180
|
+
resume = () => this._layout.resume();
|
|
181
|
+
stop = () => this._layout.stop();
|
|
182
|
+
_graphChanged = () => {
|
|
183
|
+
if (this._layoutDirty && !this._transactionInProgress) {
|
|
184
|
+
this._updateLayout();
|
|
185
|
+
}
|
|
186
|
+
};
|
|
187
|
+
_updateLayout = () => {
|
|
188
|
+
this._layout.updateGraph(this._graph);
|
|
189
|
+
this._layout.update();
|
|
190
|
+
this._layoutDirty = false;
|
|
191
|
+
};
|
|
192
|
+
_updateCache(key, updateValue) {
|
|
193
|
+
this._cache.set(key, updateValue, this._graph.version + this._layout.version);
|
|
194
|
+
}
|
|
195
|
+
};
|
|
196
|
+
|
|
197
|
+
// dist/utils/log.js
|
|
198
|
+
var import_probe = require("probe.gl");
|
|
199
|
+
var log = new import_probe.Log({ id: "react-graph-layers" }).enable();
|
|
200
|
+
log.log({ color: import_probe.COLOR.CYAN }, "Initialize react-graph-layers logger.")();
|
|
201
|
+
|
|
202
|
+
// dist/core/graph.js
|
|
203
|
+
var Graph = class extends EventTarget {
|
|
204
|
+
/** List object of nodes. */
|
|
205
|
+
_nodeMap = {};
|
|
206
|
+
/** List of object edges. */
|
|
207
|
+
_edgeMap = {};
|
|
208
|
+
/**
|
|
209
|
+
* Identifies whether performing dirty check when streaming new data. If
|
|
210
|
+
* the name of the graph is not specified, will fall back to current time stamp.
|
|
211
|
+
*/
|
|
212
|
+
_name = Date.now().toString();
|
|
213
|
+
/** Version the graph. A version is a number that is incremented every time the graph is updated. */
|
|
214
|
+
version = 0;
|
|
215
|
+
/** Cached data: create array data from maps. */
|
|
216
|
+
_cache = new Cache();
|
|
217
|
+
/**
|
|
218
|
+
* The constructor of the Graph class.
|
|
219
|
+
* @param {Object} graph - copy the graph if this exists.
|
|
220
|
+
*/
|
|
221
|
+
constructor(graph = null) {
|
|
222
|
+
super();
|
|
223
|
+
if (graph) {
|
|
224
|
+
this._nodeMap = graph._nodeMap;
|
|
225
|
+
this._edgeMap = graph._edgeMap;
|
|
226
|
+
this._name = graph && graph._name;
|
|
227
|
+
}
|
|
228
|
+
}
|
|
229
|
+
/**
|
|
230
|
+
* Set graph name
|
|
231
|
+
* @param {string} name
|
|
232
|
+
*/
|
|
233
|
+
setGraphName(name) {
|
|
234
|
+
this._name = name;
|
|
235
|
+
}
|
|
236
|
+
/** Get the name of the graph. Default value is the time stamp when creating this graph.
|
|
237
|
+
* @return {string} graph name.
|
|
238
|
+
*/
|
|
239
|
+
getGraphName() {
|
|
240
|
+
return this._name.toString();
|
|
241
|
+
}
|
|
242
|
+
/**
|
|
243
|
+
* Perform a batch of operations defined by cb before indicating graph is updated
|
|
244
|
+
* @param {function} cb - a callback fuction containing the operations to perform
|
|
245
|
+
*/
|
|
246
|
+
transaction(cb) {
|
|
247
|
+
try {
|
|
248
|
+
this.dispatchEvent(new CustomEvent("transactionStart"));
|
|
249
|
+
return cb();
|
|
250
|
+
} finally {
|
|
251
|
+
this.dispatchEvent(new CustomEvent("transactionEnd"));
|
|
252
|
+
}
|
|
253
|
+
}
|
|
254
|
+
/**
|
|
255
|
+
* Add a new node to the graph.
|
|
256
|
+
* @param {Node} node - expect a Node object to be added to the graph.
|
|
257
|
+
*/
|
|
258
|
+
addNode(node) {
|
|
259
|
+
this._nodeMap[node.getId()] = node;
|
|
260
|
+
this._bumpVersion();
|
|
261
|
+
this.dispatchEvent(new CustomEvent("onNodeAdded", { node }));
|
|
262
|
+
}
|
|
263
|
+
/**
|
|
264
|
+
* Batch add nodes to the graph.
|
|
265
|
+
* @param {Node[]} nodes - a list of nodes to be added.
|
|
266
|
+
*/
|
|
267
|
+
batchAddNodes(nodes) {
|
|
268
|
+
this._nodeMap = nodes.reduce((res, node) => {
|
|
269
|
+
res[node.getId()] = node;
|
|
270
|
+
this.dispatchEvent(new CustomEvent("onNodeAdded", { node }));
|
|
271
|
+
return res;
|
|
272
|
+
}, { ...this._nodeMap });
|
|
273
|
+
this._bumpVersion();
|
|
274
|
+
}
|
|
275
|
+
/**
|
|
276
|
+
* Get all the nodes of the graph.
|
|
277
|
+
* @return {Node[]} - get all the nodes in the graph.
|
|
278
|
+
*/
|
|
279
|
+
getNodes() {
|
|
280
|
+
this._updateCache("nodes", () => Object.values(this._nodeMap));
|
|
281
|
+
return this._cache.get("nodes");
|
|
282
|
+
}
|
|
283
|
+
/**
|
|
284
|
+
* Get the node map of the graph. The key of the map is the ID of the nodes.
|
|
285
|
+
* @return {Object} - a map of nodes keyed by node IDs.
|
|
286
|
+
*/
|
|
287
|
+
getNodeMap() {
|
|
288
|
+
return this._nodeMap;
|
|
289
|
+
}
|
|
290
|
+
/**
|
|
291
|
+
* Find a node by id
|
|
292
|
+
* @param {String} nodeId The id of the node
|
|
293
|
+
* @return {Object} Node
|
|
294
|
+
*/
|
|
295
|
+
findNode(nodeId) {
|
|
296
|
+
return this._nodeMap[nodeId];
|
|
297
|
+
}
|
|
298
|
+
/**
|
|
299
|
+
* Update the indicated node to the provided value
|
|
300
|
+
* @param {Node} node
|
|
301
|
+
*/
|
|
302
|
+
updateNode(node) {
|
|
303
|
+
this._nodeMap[node.getId()] = node;
|
|
304
|
+
this._bumpVersion();
|
|
305
|
+
this.dispatchEvent(new CustomEvent("onNodeUpdated", { node }));
|
|
306
|
+
}
|
|
307
|
+
/**
|
|
308
|
+
* Add a new edge to the graph.
|
|
309
|
+
* @param {Edge} edge - expect a Edge object to be added to the graph.
|
|
310
|
+
*/
|
|
311
|
+
addEdge(edge) {
|
|
312
|
+
const sourceNode = this.findNode(edge.getSourceNodeId());
|
|
313
|
+
const targetNode = this.findNode(edge.getTargetNodeId());
|
|
314
|
+
if (!sourceNode || !targetNode) {
|
|
315
|
+
log.warn(`Unable to add edge ${edge.id}, source or target node is missing.`)();
|
|
316
|
+
return;
|
|
317
|
+
}
|
|
318
|
+
this._edgeMap[edge.getId()] = edge;
|
|
319
|
+
sourceNode.addConnectedEdges(edge);
|
|
320
|
+
targetNode.addConnectedEdges(edge);
|
|
321
|
+
this._bumpVersion();
|
|
322
|
+
this.dispatchEvent(new CustomEvent("onEdgeAdded", { edge }));
|
|
323
|
+
}
|
|
324
|
+
/**
|
|
325
|
+
* Batch add edges to the graph
|
|
326
|
+
* @param {Edge[]} edges - a list of edges to be added.
|
|
327
|
+
*/
|
|
328
|
+
batchAddEdges(edges) {
|
|
329
|
+
edges.forEach((edge) => this.addEdge(edge));
|
|
330
|
+
this._bumpVersion();
|
|
331
|
+
}
|
|
332
|
+
/**
|
|
333
|
+
* Update the indicated edge to the provided value
|
|
334
|
+
* @param {Edge} edge
|
|
335
|
+
*/
|
|
336
|
+
updateEdge(edge) {
|
|
337
|
+
this._edgeMap[edge.getId()] = edge;
|
|
338
|
+
this._bumpVersion();
|
|
339
|
+
this.dispatchEvent(new CustomEvent("onEdgeUpdated", { edge }));
|
|
340
|
+
}
|
|
341
|
+
/**
|
|
342
|
+
* Remove a node from the graph by node ID
|
|
343
|
+
* @param {String|Number} nodeId - the ID of the target node.
|
|
344
|
+
*/
|
|
345
|
+
removeNode(nodeId) {
|
|
346
|
+
const node = this.findNode(nodeId);
|
|
347
|
+
if (!node) {
|
|
348
|
+
log.warn(`Unable to remove node ${nodeId} - doesn't exist`)();
|
|
349
|
+
return;
|
|
350
|
+
}
|
|
351
|
+
node.getConnectedEdges().forEach((e) => {
|
|
352
|
+
delete this._edgeMap[e.getId()];
|
|
353
|
+
});
|
|
354
|
+
delete this._nodeMap[nodeId];
|
|
355
|
+
this._bumpVersion();
|
|
356
|
+
this.dispatchEvent(new CustomEvent("onNodeRemoved", { node }));
|
|
357
|
+
}
|
|
358
|
+
/**
|
|
359
|
+
* Get all the edges of the graph.
|
|
360
|
+
* @return {Edge[]} get all the edges in the graph.
|
|
361
|
+
*/
|
|
362
|
+
getEdges() {
|
|
363
|
+
this._updateCache("edges", () => Object.values(this._edgeMap));
|
|
364
|
+
return this._cache.get("edges");
|
|
365
|
+
}
|
|
366
|
+
/**
|
|
367
|
+
* Get the edge map of the graph. The key of the map is the ID of the edges.
|
|
368
|
+
* @return {Object} - a map of edges keyed by edge IDs.
|
|
369
|
+
*/
|
|
370
|
+
getEdgeMap() {
|
|
371
|
+
return this._edgeMap;
|
|
372
|
+
}
|
|
373
|
+
/**
|
|
374
|
+
* Remove an edge from the graph by the edge ID
|
|
375
|
+
* @param {String|Number} edgeId - the target edge ID.
|
|
376
|
+
*/
|
|
377
|
+
removeEdge(edgeId) {
|
|
378
|
+
const edge = this.findEdge(edgeId);
|
|
379
|
+
if (!edge) {
|
|
380
|
+
log.warn(`Unable to remove edge ${edgeId} - doesn't exist`)();
|
|
381
|
+
return;
|
|
382
|
+
}
|
|
383
|
+
const sourceNode = this.findNode(edge.getSourceNodeId());
|
|
384
|
+
const targetNode = this.findNode(edge.getTargetNodeId());
|
|
385
|
+
delete this._edgeMap[edgeId];
|
|
386
|
+
sourceNode.removeConnectedEdges(edge);
|
|
387
|
+
targetNode.removeConnectedEdges(edge);
|
|
388
|
+
this._bumpVersion();
|
|
389
|
+
}
|
|
390
|
+
/**
|
|
391
|
+
* Find the edge by edge ID.
|
|
392
|
+
* @param {String|Number} id - the target edge ID
|
|
393
|
+
* @return {Edge} - the target edge.
|
|
394
|
+
*/
|
|
395
|
+
findEdge(edgeId) {
|
|
396
|
+
return this._edgeMap[edgeId];
|
|
397
|
+
}
|
|
398
|
+
/**
|
|
399
|
+
* Return all the connected edges of a node by nodeID.
|
|
400
|
+
* @param {String|Number} nodeId - the target node ID
|
|
401
|
+
* @return {Edge[]} - an array of the connected edges.
|
|
402
|
+
*/
|
|
403
|
+
getConnectedEdges(nodeId) {
|
|
404
|
+
const node = this.findNode(nodeId);
|
|
405
|
+
if (!node) {
|
|
406
|
+
log.warn(`Unable to find node ${nodeId} - doesn't exist`)();
|
|
407
|
+
return [];
|
|
408
|
+
}
|
|
409
|
+
return node.getConnectedEdges();
|
|
410
|
+
}
|
|
411
|
+
/**
|
|
412
|
+
* Return all the sibling nodes of a node by nodeID.
|
|
413
|
+
* @param {String|Number} nodeId - the target node ID
|
|
414
|
+
* @return {Node[]} - an array of the sibling nodes.
|
|
415
|
+
*/
|
|
416
|
+
getNodeSiblings(nodeId) {
|
|
417
|
+
const node = this.findNode(nodeId);
|
|
418
|
+
if (!node) {
|
|
419
|
+
log.warn(`Unable to find node ${nodeId} - doesn't exist`)();
|
|
420
|
+
return [];
|
|
421
|
+
}
|
|
422
|
+
return node.getSiblingIds().map((siblingNodeId) => this.findNode(siblingNodeId));
|
|
423
|
+
}
|
|
424
|
+
/**
|
|
425
|
+
* Get the degree of a node.
|
|
426
|
+
* @param {String|Number} nodeId - the target node ID.
|
|
427
|
+
* @return {Number} - the degree of the node.
|
|
428
|
+
*/
|
|
429
|
+
getDegree(nodeId) {
|
|
430
|
+
const node = this.findNode(nodeId);
|
|
431
|
+
if (!node) {
|
|
432
|
+
log.warn(`Unable to find node ${nodeId} - doesn't exist`)();
|
|
433
|
+
return 0;
|
|
434
|
+
}
|
|
435
|
+
return node.getDegree();
|
|
436
|
+
}
|
|
437
|
+
/**
|
|
438
|
+
* Clean up all the nodes in the graph.
|
|
439
|
+
*/
|
|
440
|
+
resetNodes() {
|
|
441
|
+
this._nodeMap = {};
|
|
442
|
+
this._bumpVersion();
|
|
443
|
+
}
|
|
444
|
+
/**
|
|
445
|
+
* Clean up all the edges in the graph.
|
|
446
|
+
*/
|
|
447
|
+
resetEdges() {
|
|
448
|
+
this._edgeMap = {};
|
|
449
|
+
this._bumpVersion();
|
|
450
|
+
}
|
|
451
|
+
/**
|
|
452
|
+
* Clean up everything in the graph.
|
|
453
|
+
*/
|
|
454
|
+
reset() {
|
|
455
|
+
this.resetNodes();
|
|
456
|
+
this.resetEdges();
|
|
457
|
+
this._bumpVersion();
|
|
458
|
+
}
|
|
459
|
+
/**
|
|
460
|
+
* Trigger an update to the graph.
|
|
461
|
+
*/
|
|
462
|
+
triggerUpdate() {
|
|
463
|
+
this._bumpVersion();
|
|
464
|
+
}
|
|
465
|
+
/**
|
|
466
|
+
* Return true if the graph is empty.
|
|
467
|
+
* @return {Boolean} Return true if the graph is empty.
|
|
468
|
+
*/
|
|
469
|
+
isEmpty() {
|
|
470
|
+
return Object.keys(this._nodeMap).length === 0;
|
|
471
|
+
}
|
|
472
|
+
/**
|
|
473
|
+
* Check the equality of two graphs data by checking last update time stamp
|
|
474
|
+
* @param {Object} g Another graph to be compared against itself
|
|
475
|
+
* @return {Bool} True if the graph is the same as itself.
|
|
476
|
+
*/
|
|
477
|
+
equals(g) {
|
|
478
|
+
if (!g || !(g instanceof Graph)) {
|
|
479
|
+
return false;
|
|
480
|
+
}
|
|
481
|
+
return this.version === g.version;
|
|
482
|
+
}
|
|
483
|
+
_bumpVersion() {
|
|
484
|
+
this.version += 1;
|
|
485
|
+
}
|
|
486
|
+
_updateCache(key, updateValue) {
|
|
487
|
+
this._cache.set(key, updateValue, this.version);
|
|
488
|
+
}
|
|
489
|
+
};
|
|
490
|
+
|
|
491
|
+
// dist/layers/common-layers/marker-layer/marker-list.js
|
|
492
|
+
var MarkerList = {
|
|
493
|
+
"bell-filled": "bell-filled",
|
|
494
|
+
bell: "bell",
|
|
495
|
+
"bookmark-filled": "bookmark-filled",
|
|
496
|
+
bookmark: "bookmark",
|
|
497
|
+
"cd-filled": "cd-filled",
|
|
498
|
+
cd: "cd",
|
|
499
|
+
checkmark: "checkmark",
|
|
500
|
+
"circle-check-filled": "circle-check-filled",
|
|
501
|
+
"circle-check": "circle-check",
|
|
502
|
+
"circle-filled": "circle-filled",
|
|
503
|
+
"circle-i-filled": "circle-i-filled",
|
|
504
|
+
"circle-i": "circle-i",
|
|
505
|
+
"circle-minus-filled": "circle-minus-filled",
|
|
506
|
+
"circle-minus": "circle-minus",
|
|
507
|
+
"circle-plus-filled": "circle-plus-filled",
|
|
508
|
+
"circle-plus": "circle-plus",
|
|
509
|
+
"circle-questionmark-filled": "circle-questionmark-filled",
|
|
510
|
+
"circle-questionmark": "circle-questionmark",
|
|
511
|
+
"circle-slash-filled": "circle-slash-filled",
|
|
512
|
+
"circle-slash": "circle-slash",
|
|
513
|
+
"circle-x-filled": "circle-x-filled",
|
|
514
|
+
"circle-x": "circle-x",
|
|
515
|
+
circle: "circle",
|
|
516
|
+
"diamond-filled": "diamond-filled",
|
|
517
|
+
diamond: "diamond",
|
|
518
|
+
"flag-filled": "flag-filled",
|
|
519
|
+
flag: "flag",
|
|
520
|
+
gear: "gear",
|
|
521
|
+
"heart-filled": "heart-filled",
|
|
522
|
+
heart: "heart",
|
|
523
|
+
"location-marker-filled": "location-marker-filled",
|
|
524
|
+
"location-marker": "location-marker",
|
|
525
|
+
"octagonal-star-filled": "octagonal-star-filled",
|
|
526
|
+
"octagonal-star": "octagonal-star",
|
|
527
|
+
"person-filled": "person-filled",
|
|
528
|
+
person: "person",
|
|
529
|
+
"pin-filled": "pin-filled",
|
|
530
|
+
pin: "pin",
|
|
531
|
+
"plus-small": "plus-small",
|
|
532
|
+
plus: "plus",
|
|
533
|
+
"rectangle-filled": "rectangle-filled",
|
|
534
|
+
rectangle: "rectangle",
|
|
535
|
+
"star-filled": "star-filled",
|
|
536
|
+
star: "star",
|
|
537
|
+
"tag-filled": "tag-filled",
|
|
538
|
+
tag: "tag",
|
|
539
|
+
"thumb-down-filled": "thumb-down-filled",
|
|
540
|
+
"thumb-down": "thumb-down",
|
|
541
|
+
"thumb-up": "thumb-up",
|
|
542
|
+
"thumb_up-filled": "thumb_up-filled",
|
|
543
|
+
"triangle-down-filled": "triangle-down-filled",
|
|
544
|
+
"triangle-down": "triangle-down",
|
|
545
|
+
"triangle-left-filled": "triangle-left-filled",
|
|
546
|
+
"triangle-left": "triangle-left",
|
|
547
|
+
"triangle-right-filled": "triangle-right-filled",
|
|
548
|
+
"triangle-right": "triangle-right",
|
|
549
|
+
"triangle-up-filled": "triangle-up-filled",
|
|
550
|
+
"triangle-up": "triangle-up",
|
|
551
|
+
"x-small": "x-small",
|
|
552
|
+
x: "x"
|
|
553
|
+
};
|
|
554
|
+
|
|
555
|
+
// dist/core/constants.js
|
|
556
|
+
var MARKER_TYPE = MarkerList;
|
|
557
|
+
var NODE_STATE = {
|
|
558
|
+
DEFAULT: "default",
|
|
559
|
+
HOVER: "hover",
|
|
560
|
+
DRAGGING: "dragging",
|
|
561
|
+
SELECTED: "selected"
|
|
562
|
+
};
|
|
563
|
+
var EDGE_STATE = {
|
|
564
|
+
DEFAULT: "default",
|
|
565
|
+
HOVER: "hover",
|
|
566
|
+
DRAGGING: "dragging",
|
|
567
|
+
SELECTED: "selected"
|
|
568
|
+
};
|
|
569
|
+
var NODE_TYPE = {
|
|
570
|
+
CIRCLE: "CIRCLE",
|
|
571
|
+
RECTANGLE: "RECTANGLE",
|
|
572
|
+
ROUNDED_RECTANGLE: "ROUNDED_RECTANGLE",
|
|
573
|
+
PATH_ROUNDED_RECTANGLE: "PATH_ROUNDED_RECTANGLE",
|
|
574
|
+
ICON: "ICON",
|
|
575
|
+
LABEL: "LABEL",
|
|
576
|
+
MARKER: "MARKER"
|
|
577
|
+
};
|
|
578
|
+
var EDGE_TYPE = {
|
|
579
|
+
SPLINE_CURVE: "SPLINE_CURVE",
|
|
580
|
+
LINE: "LINE",
|
|
581
|
+
PATH: "PATH"
|
|
582
|
+
};
|
|
583
|
+
var EDGE_DECORATOR_TYPE = {
|
|
584
|
+
LABEL: "EDGE_LABEL",
|
|
585
|
+
FLOW: "FLOW"
|
|
586
|
+
};
|
|
587
|
+
var LAYOUT_STATE = {
|
|
588
|
+
INIT: "INIT",
|
|
589
|
+
START: "START",
|
|
590
|
+
CALCULATING: "CALCULATING",
|
|
591
|
+
DONE: "DONE",
|
|
592
|
+
ERROR: "ERROR"
|
|
593
|
+
};
|
|
594
|
+
|
|
595
|
+
// dist/core/node.js
|
|
596
|
+
var Node = class {
|
|
597
|
+
id;
|
|
598
|
+
/** Keep a reference to origin data. */
|
|
599
|
+
_data;
|
|
600
|
+
/** List edges. */
|
|
601
|
+
_connectedEdges = {};
|
|
602
|
+
/** Interaction state of the node. */
|
|
603
|
+
state = NODE_STATE.DEFAULT;
|
|
604
|
+
/** Can the node be selected? */
|
|
605
|
+
_selectable;
|
|
606
|
+
/** Should the state of this node affect the state of the connected edges? */
|
|
607
|
+
_highlightConnectedEdges;
|
|
608
|
+
/** Check the type of the object when picking engine gets it. */
|
|
609
|
+
isNode = true;
|
|
610
|
+
/**
|
|
611
|
+
* The constructor of a node
|
|
612
|
+
* @param {String|Number} options.id - the unique ID of the node
|
|
613
|
+
* @param {Record<string, unknown>} options.data - origin data reference
|
|
614
|
+
*/
|
|
615
|
+
constructor({ id, selectable = false, highlightConnectedEdges = false, data = {} }) {
|
|
616
|
+
this.id = id;
|
|
617
|
+
this._data = data;
|
|
618
|
+
this._selectable = selectable;
|
|
619
|
+
this._highlightConnectedEdges = highlightConnectedEdges;
|
|
620
|
+
}
|
|
621
|
+
/**
|
|
622
|
+
* Return the ID of the node
|
|
623
|
+
* @return {String|Number} - the ID of the node.
|
|
624
|
+
*/
|
|
625
|
+
getId() {
|
|
626
|
+
return this.id;
|
|
627
|
+
}
|
|
628
|
+
/**
|
|
629
|
+
* Return the degree of the node -- includes in-degree and out-degree
|
|
630
|
+
* @return {Number} - the degree of the node.
|
|
631
|
+
*/
|
|
632
|
+
getDegree() {
|
|
633
|
+
return Object.keys(this._connectedEdges).length;
|
|
634
|
+
}
|
|
635
|
+
/**
|
|
636
|
+
* Return the in-degree of the node.
|
|
637
|
+
* @return {Number} - the in-degree of the node.
|
|
638
|
+
*/
|
|
639
|
+
getInDegree() {
|
|
640
|
+
const nodeId = this.getId();
|
|
641
|
+
return this.getConnectedEdges().reduce((count, e) => {
|
|
642
|
+
const isDirected = e.isDirected();
|
|
643
|
+
if (isDirected && e.getTargetNodeId() === nodeId) {
|
|
644
|
+
count += 1;
|
|
645
|
+
}
|
|
646
|
+
return count;
|
|
647
|
+
}, 0);
|
|
648
|
+
}
|
|
649
|
+
/**
|
|
650
|
+
* Return the out-degree of the node.
|
|
651
|
+
* @return {Number} - the out-degree of the node.
|
|
652
|
+
*/
|
|
653
|
+
getOutDegree() {
|
|
654
|
+
const nodeId = this.getId();
|
|
655
|
+
return this.getConnectedEdges().reduce((count, e) => {
|
|
656
|
+
const isDirected = e.isDirected();
|
|
657
|
+
if (isDirected && e.getSourceNodeId() === nodeId) {
|
|
658
|
+
count += 1;
|
|
659
|
+
}
|
|
660
|
+
return count;
|
|
661
|
+
}, 0);
|
|
662
|
+
}
|
|
663
|
+
/**
|
|
664
|
+
* Return all the IDs of the sibling nodes.
|
|
665
|
+
* @return {String[]} [description]
|
|
666
|
+
*/
|
|
667
|
+
getSiblingIds() {
|
|
668
|
+
const nodeId = this.getId();
|
|
669
|
+
return this.getConnectedEdges().reduce((siblings, e) => {
|
|
670
|
+
if (e.getTargetNodeId() === nodeId) {
|
|
671
|
+
siblings.push(e.getSourceNodeId());
|
|
672
|
+
} else {
|
|
673
|
+
siblings.push(e.getTargetNodeId());
|
|
674
|
+
}
|
|
675
|
+
return siblings;
|
|
676
|
+
}, []);
|
|
677
|
+
}
|
|
678
|
+
/**
|
|
679
|
+
* Return all the connected edges.
|
|
680
|
+
* @return {Object[]} - an array of the connected edges.
|
|
681
|
+
*/
|
|
682
|
+
getConnectedEdges() {
|
|
683
|
+
return Object.values(this._connectedEdges);
|
|
684
|
+
}
|
|
685
|
+
/**
|
|
686
|
+
* Return of the value of the selected property key.
|
|
687
|
+
* @param {String} key - property key.
|
|
688
|
+
* @return {Any} - the value of the property or undefined (not found).
|
|
689
|
+
*/
|
|
690
|
+
getPropertyValue(key) {
|
|
691
|
+
if (this.hasOwnProperty(key)) {
|
|
692
|
+
return this[key];
|
|
693
|
+
} else if (this._data.hasOwnProperty(key)) {
|
|
694
|
+
return this._data[key];
|
|
695
|
+
}
|
|
696
|
+
return void 0;
|
|
697
|
+
}
|
|
698
|
+
/**
|
|
699
|
+
* Set the new node data.
|
|
700
|
+
* @param {Record<string, unknown>} data - the new data of the node
|
|
701
|
+
*/
|
|
702
|
+
setData(data) {
|
|
703
|
+
this._data = data;
|
|
704
|
+
}
|
|
705
|
+
/**
|
|
706
|
+
* Update a data property.
|
|
707
|
+
* @param {String} key - the key of the property
|
|
708
|
+
* @param {Any} value - the value of the property.
|
|
709
|
+
*/
|
|
710
|
+
setDataProperty(key, value) {
|
|
711
|
+
this._data[key] = value;
|
|
712
|
+
}
|
|
713
|
+
/**
|
|
714
|
+
* Set node state
|
|
715
|
+
* @param {String} state - one of NODE_STATE
|
|
716
|
+
*/
|
|
717
|
+
setState(state) {
|
|
718
|
+
this.state = state;
|
|
719
|
+
}
|
|
720
|
+
/**
|
|
721
|
+
* Get node state
|
|
722
|
+
* @returns {string} state - one of NODE_STATE
|
|
723
|
+
*/
|
|
724
|
+
getState() {
|
|
725
|
+
return this.state;
|
|
726
|
+
}
|
|
727
|
+
/**
|
|
728
|
+
* Add connected edges to the node
|
|
729
|
+
* @param {Edge || Edge[]} edge an edge or an array of edges to be added to this._connectedEdges
|
|
730
|
+
*/
|
|
731
|
+
addConnectedEdges(edge) {
|
|
732
|
+
const iterableEdges = Array.isArray(edge) ? edge : [edge];
|
|
733
|
+
iterableEdges.forEach((e) => {
|
|
734
|
+
this._connectedEdges[e.id] = e;
|
|
735
|
+
e.addNode(this);
|
|
736
|
+
});
|
|
737
|
+
}
|
|
738
|
+
/**
|
|
739
|
+
* Remove edges from this._connectedEdges
|
|
740
|
+
* @param {Edge | Edge[]} edge an edge or an array of edges to be removed from this._connectedEdges
|
|
741
|
+
*/
|
|
742
|
+
removeConnectedEdges(edge) {
|
|
743
|
+
const iterableEdges = Array.isArray(edge) ? edge : [edge];
|
|
744
|
+
iterableEdges.forEach((e) => {
|
|
745
|
+
e.removeNode(this);
|
|
746
|
+
delete this._connectedEdges[e.id];
|
|
747
|
+
});
|
|
748
|
+
}
|
|
749
|
+
/**
|
|
750
|
+
* Clear this._connectedEdges
|
|
751
|
+
*/
|
|
752
|
+
clearConnectedEdges() {
|
|
753
|
+
Object.values(this._connectedEdges).forEach((e) => e.removeNode(this));
|
|
754
|
+
this._connectedEdges = {};
|
|
755
|
+
}
|
|
756
|
+
isSelectable() {
|
|
757
|
+
return this._selectable;
|
|
758
|
+
}
|
|
759
|
+
shouldHighlightConnectedEdges() {
|
|
760
|
+
return this._highlightConnectedEdges;
|
|
761
|
+
}
|
|
762
|
+
};
|
|
763
|
+
|
|
764
|
+
// dist/core/edge.js
|
|
765
|
+
var Edge = class {
|
|
766
|
+
/** Unique uuid of the edge. */
|
|
767
|
+
id;
|
|
768
|
+
/** ID of the source node. */
|
|
769
|
+
_sourceId;
|
|
770
|
+
/** ID of the target node. */
|
|
771
|
+
_targetId;
|
|
772
|
+
/** Whether the edge is directed or not. */
|
|
773
|
+
_directed;
|
|
774
|
+
/** Origin data reference of the edge. */
|
|
775
|
+
_data;
|
|
776
|
+
/** Check the type of the object when picking engine gets it. */
|
|
777
|
+
isEdge = true;
|
|
778
|
+
/** Nodes at either end of this edge. */
|
|
779
|
+
_connectedNodes = {};
|
|
780
|
+
/** Edge state. */
|
|
781
|
+
state = EDGE_STATE.DEFAULT;
|
|
782
|
+
/**
|
|
783
|
+
* The constructor
|
|
784
|
+
* @param {String|Number} options.id - the unique ID of the edge
|
|
785
|
+
* @param {String|Number} options.sourceId - the ID of the source node
|
|
786
|
+
* @param {String|Number} options.targetId - the ID of the target node
|
|
787
|
+
* @param {Boolean} options.directed - whether the edge is directed or not
|
|
788
|
+
* @param {Record<string, unknown>} options.data - origin data reference
|
|
789
|
+
*/
|
|
790
|
+
constructor({ id, sourceId, targetId, data, directed = false }) {
|
|
791
|
+
this.id = id;
|
|
792
|
+
this._sourceId = sourceId;
|
|
793
|
+
this._targetId = targetId;
|
|
794
|
+
this._directed = directed;
|
|
795
|
+
this._data = data;
|
|
796
|
+
}
|
|
797
|
+
/**
|
|
798
|
+
* Return the ID of the edge
|
|
799
|
+
* @return {String|Number} - the ID of the edge.
|
|
800
|
+
*/
|
|
801
|
+
getId() {
|
|
802
|
+
return this.id;
|
|
803
|
+
}
|
|
804
|
+
/**
|
|
805
|
+
* Return whether the edge is directed or not.
|
|
806
|
+
* @return {Boolean} true if the edge is directed.
|
|
807
|
+
*/
|
|
808
|
+
isDirected() {
|
|
809
|
+
return this._directed;
|
|
810
|
+
}
|
|
811
|
+
/**
|
|
812
|
+
* Get the ID of the source node.
|
|
813
|
+
* @return {String|Number} the ID of the source node.
|
|
814
|
+
*/
|
|
815
|
+
getSourceNodeId() {
|
|
816
|
+
return this._sourceId;
|
|
817
|
+
}
|
|
818
|
+
/**
|
|
819
|
+
* Get the ID of the target node.
|
|
820
|
+
* @return {String|Number} the ID of the target node.
|
|
821
|
+
*/
|
|
822
|
+
getTargetNodeId() {
|
|
823
|
+
return this._targetId;
|
|
824
|
+
}
|
|
825
|
+
/**
|
|
826
|
+
* Return of the value of the selected property key.
|
|
827
|
+
* @param {String} key - property key.
|
|
828
|
+
* @return {Any} - the value of the property.
|
|
829
|
+
*/
|
|
830
|
+
getPropertyValue(key) {
|
|
831
|
+
if (this.hasOwnProperty(key)) {
|
|
832
|
+
return this[key];
|
|
833
|
+
} else if (this._data.hasOwnProperty(key)) {
|
|
834
|
+
return this._data[key];
|
|
835
|
+
}
|
|
836
|
+
return void 0;
|
|
837
|
+
}
|
|
838
|
+
/**
|
|
839
|
+
* Set the origin data as a reference.
|
|
840
|
+
* @param {Object} data - the origin data.
|
|
841
|
+
*/
|
|
842
|
+
setData(data) {
|
|
843
|
+
this._data = data;
|
|
844
|
+
}
|
|
845
|
+
/**
|
|
846
|
+
* Update a data property.
|
|
847
|
+
* @param {String} key - the key of the property
|
|
848
|
+
* @param {Any} value - the value of the property.
|
|
849
|
+
*/
|
|
850
|
+
setDataProperty(key, value) {
|
|
851
|
+
this._data[key] = value;
|
|
852
|
+
}
|
|
853
|
+
/**
|
|
854
|
+
* Set edge state
|
|
855
|
+
* @param {String} state - one of EDGE_STATE
|
|
856
|
+
*/
|
|
857
|
+
setState(state) {
|
|
858
|
+
this.state = state;
|
|
859
|
+
}
|
|
860
|
+
/**
|
|
861
|
+
* Get edge state
|
|
862
|
+
* @returns {string} state - one of EDGE_STATE
|
|
863
|
+
*/
|
|
864
|
+
getState() {
|
|
865
|
+
return this.state;
|
|
866
|
+
}
|
|
867
|
+
addNode(node) {
|
|
868
|
+
this._connectedNodes[node.getId()] = node;
|
|
869
|
+
}
|
|
870
|
+
removeNode(node) {
|
|
871
|
+
delete this._connectedNodes[node.getId()];
|
|
872
|
+
}
|
|
873
|
+
getConnectedNodes() {
|
|
874
|
+
return Object.values(this._connectedNodes);
|
|
875
|
+
}
|
|
876
|
+
};
|
|
877
|
+
|
|
878
|
+
// dist/core/base-layout.js
|
|
879
|
+
var import_lodash = __toESM(require("lodash.isequal"), 1);
|
|
880
|
+
var BaseLayout = class extends EventTarget {
|
|
881
|
+
/** Name of the layout. */
|
|
882
|
+
_name = "BaseLayout";
|
|
883
|
+
/** Extra configuration options of the layout. */
|
|
884
|
+
_options;
|
|
885
|
+
version = 0;
|
|
886
|
+
state = LAYOUT_STATE.INIT;
|
|
887
|
+
/**
|
|
888
|
+
* Constructor of BaseLayout
|
|
889
|
+
* @param {Object} options extra configuration options of the layout
|
|
890
|
+
*/
|
|
891
|
+
constructor(options = {}) {
|
|
892
|
+
super();
|
|
893
|
+
this._options = options;
|
|
894
|
+
}
|
|
895
|
+
/**
|
|
896
|
+
* @fires BaseLayout#onLayoutStart
|
|
897
|
+
* @protected
|
|
898
|
+
*/
|
|
899
|
+
_onLayoutStart() {
|
|
900
|
+
this._updateState(LAYOUT_STATE.CALCULATING);
|
|
901
|
+
this.dispatchEvent(new CustomEvent("onLayoutStart"));
|
|
902
|
+
}
|
|
903
|
+
/**
|
|
904
|
+
* @fires BaseLayout#onLayoutChange
|
|
905
|
+
* @protected
|
|
906
|
+
*/
|
|
907
|
+
_onLayoutChange() {
|
|
908
|
+
this._updateState(LAYOUT_STATE.CALCULATING);
|
|
909
|
+
this.dispatchEvent(new CustomEvent("onLayoutChange"));
|
|
910
|
+
}
|
|
911
|
+
/**
|
|
912
|
+
* @fires BaseLayout#onLayoutDone
|
|
913
|
+
* @protected
|
|
914
|
+
*/
|
|
915
|
+
_onLayoutDone() {
|
|
916
|
+
this._updateState(LAYOUT_STATE.DONE);
|
|
917
|
+
this.dispatchEvent(new CustomEvent("onLayoutDone"));
|
|
918
|
+
}
|
|
919
|
+
/**
|
|
920
|
+
* @fires BaseLayout#onLayoutError
|
|
921
|
+
* @protected
|
|
922
|
+
*/
|
|
923
|
+
_onLayoutError() {
|
|
924
|
+
this._updateState(LAYOUT_STATE.ERROR);
|
|
925
|
+
this.dispatchEvent(new CustomEvent("onLayoutError"));
|
|
926
|
+
}
|
|
927
|
+
/**
|
|
928
|
+
* Check the equality of two layouts
|
|
929
|
+
* @param {Object} layout The layout to be compared.
|
|
930
|
+
* @return {Bool} True if the layout is the same as itself.
|
|
931
|
+
*/
|
|
932
|
+
equals(layout) {
|
|
933
|
+
if (!layout || !(layout instanceof BaseLayout)) {
|
|
934
|
+
return false;
|
|
935
|
+
}
|
|
936
|
+
return this._name === layout._name && (0, import_lodash.default)(this._options, layout._options);
|
|
937
|
+
}
|
|
938
|
+
/** virtual functions: will be implemented in the child class */
|
|
939
|
+
// first time to pass the graph data into this layout
|
|
940
|
+
initializeGraph(graph) {
|
|
941
|
+
}
|
|
942
|
+
// update the existing graph
|
|
943
|
+
updateGraph(graph) {
|
|
944
|
+
}
|
|
945
|
+
// start the layout calculation
|
|
946
|
+
start() {
|
|
947
|
+
}
|
|
948
|
+
// update the layout calculation
|
|
949
|
+
update() {
|
|
950
|
+
}
|
|
951
|
+
// resume the layout calculation
|
|
952
|
+
resume() {
|
|
953
|
+
}
|
|
954
|
+
// stop the layout calculation
|
|
955
|
+
stop() {
|
|
956
|
+
}
|
|
957
|
+
// access the position of the node in the layout
|
|
958
|
+
getNodePosition(node) {
|
|
959
|
+
return [0, 0];
|
|
960
|
+
}
|
|
961
|
+
// access the layout information of the edge
|
|
962
|
+
getEdgePosition(edge) {
|
|
963
|
+
return {
|
|
964
|
+
type: EDGE_TYPE.LINE,
|
|
965
|
+
sourcePosition: [0, 0],
|
|
966
|
+
targetPosition: [0, 0],
|
|
967
|
+
controlPoints: []
|
|
968
|
+
};
|
|
969
|
+
}
|
|
970
|
+
/**
|
|
971
|
+
* Pin the node to a designated position, and the node won't move anymore
|
|
972
|
+
* @param {Object} node Node to be locked
|
|
973
|
+
* @param {Number} x x coordinate
|
|
974
|
+
* @param {Number} y y coordinate
|
|
975
|
+
*/
|
|
976
|
+
lockNodePosition(node, x, y) {
|
|
977
|
+
}
|
|
978
|
+
/**
|
|
979
|
+
* Unlock the node, the node will be able to move freely.
|
|
980
|
+
* @param {Object} node Node to be unlocked
|
|
981
|
+
*/
|
|
982
|
+
unlockNodePosition(node) {
|
|
983
|
+
}
|
|
984
|
+
_updateState(state) {
|
|
985
|
+
this.state = state;
|
|
986
|
+
this.version += 1;
|
|
987
|
+
}
|
|
988
|
+
};
|
|
989
|
+
|
|
990
|
+
// dist/layouts/d3-force/d3-force-layout.js
|
|
991
|
+
var import_meta = {};
|
|
992
|
+
var defaultOptions = {
|
|
993
|
+
alpha: 0.3,
|
|
994
|
+
resumeAlpha: 0.1,
|
|
995
|
+
nBodyStrength: -900,
|
|
996
|
+
nBodyDistanceMin: 100,
|
|
997
|
+
nBodyDistanceMax: 400,
|
|
998
|
+
getCollisionRadius: 0
|
|
999
|
+
};
|
|
1000
|
+
var D3ForceLayout = class extends BaseLayout {
|
|
1001
|
+
_name = "D3";
|
|
1002
|
+
_positionsByNodeId = /* @__PURE__ */ new Map();
|
|
1003
|
+
_graph;
|
|
1004
|
+
_worker;
|
|
1005
|
+
constructor(options) {
|
|
1006
|
+
super(options);
|
|
1007
|
+
this._options = {
|
|
1008
|
+
...defaultOptions,
|
|
1009
|
+
...options
|
|
1010
|
+
};
|
|
1011
|
+
}
|
|
1012
|
+
initializeGraph(graph) {
|
|
1013
|
+
this._graph = graph;
|
|
1014
|
+
}
|
|
1015
|
+
// for streaming new data on the same graph
|
|
1016
|
+
updateGraph(graph) {
|
|
1017
|
+
this._graph = graph;
|
|
1018
|
+
this._positionsByNodeId = new Map(this._graph.getNodes().map((node) => [node.id, this._positionsByNodeId.get(node.id)]));
|
|
1019
|
+
}
|
|
1020
|
+
start() {
|
|
1021
|
+
this._engageWorker();
|
|
1022
|
+
this._onLayoutStart();
|
|
1023
|
+
}
|
|
1024
|
+
update() {
|
|
1025
|
+
this._engageWorker();
|
|
1026
|
+
}
|
|
1027
|
+
_engageWorker() {
|
|
1028
|
+
if (this._worker) {
|
|
1029
|
+
this._worker.terminate();
|
|
1030
|
+
}
|
|
1031
|
+
this._worker = new Worker(new URL("./worker.js", import_meta.url).href);
|
|
1032
|
+
this._worker.postMessage({
|
|
1033
|
+
nodes: this._graph.getNodes().map((node) => ({
|
|
1034
|
+
id: node.id,
|
|
1035
|
+
...this._positionsByNodeId.get(node.id)
|
|
1036
|
+
})),
|
|
1037
|
+
edges: this._graph.getEdges().map((edge) => ({
|
|
1038
|
+
id: edge.id,
|
|
1039
|
+
source: edge.getSourceNodeId(),
|
|
1040
|
+
target: edge.getTargetNodeId()
|
|
1041
|
+
})),
|
|
1042
|
+
options: this._options
|
|
1043
|
+
});
|
|
1044
|
+
this._worker.onmessage = (event) => {
|
|
1045
|
+
if (event.data.type !== "end") {
|
|
1046
|
+
return;
|
|
1047
|
+
}
|
|
1048
|
+
event.data.nodes.forEach(({ id, ...d3 }) => this._positionsByNodeId.set(id, {
|
|
1049
|
+
...d3,
|
|
1050
|
+
// precompute so that when we return the node position we do not need to do the conversion
|
|
1051
|
+
coordinates: [d3.x, d3.y]
|
|
1052
|
+
}));
|
|
1053
|
+
this._onLayoutChange();
|
|
1054
|
+
this._onLayoutDone();
|
|
1055
|
+
};
|
|
1056
|
+
}
|
|
1057
|
+
resume() {
|
|
1058
|
+
throw new Error("Resume unavailable");
|
|
1059
|
+
}
|
|
1060
|
+
stop() {
|
|
1061
|
+
this._worker.terminate();
|
|
1062
|
+
}
|
|
1063
|
+
getEdgePosition = (edge) => {
|
|
1064
|
+
const sourceNode = this._graph.findNode(edge.getSourceNodeId());
|
|
1065
|
+
const targetNode = this._graph.findNode(edge.getTargetNodeId());
|
|
1066
|
+
if (!this.getNodePosition(sourceNode) || !this.getNodePosition(targetNode)) {
|
|
1067
|
+
return null;
|
|
1068
|
+
}
|
|
1069
|
+
return {
|
|
1070
|
+
type: EDGE_TYPE.LINE,
|
|
1071
|
+
sourcePosition: this.getNodePosition(sourceNode),
|
|
1072
|
+
targetPosition: this.getNodePosition(targetNode),
|
|
1073
|
+
controlPoints: []
|
|
1074
|
+
};
|
|
1075
|
+
};
|
|
1076
|
+
getNodePosition = (node) => {
|
|
1077
|
+
const d3Node = this._positionsByNodeId.get(node.id);
|
|
1078
|
+
if (d3Node) {
|
|
1079
|
+
return d3Node.coordinates;
|
|
1080
|
+
}
|
|
1081
|
+
return null;
|
|
1082
|
+
};
|
|
1083
|
+
lockNodePosition = (node, x, y) => {
|
|
1084
|
+
const d3Node = this._positionsByNodeId.get(node.id);
|
|
1085
|
+
this._positionsByNodeId.set(node.id, {
|
|
1086
|
+
...d3Node,
|
|
1087
|
+
x,
|
|
1088
|
+
y,
|
|
1089
|
+
fx: x,
|
|
1090
|
+
fy: y,
|
|
1091
|
+
coordinates: [x, y]
|
|
1092
|
+
});
|
|
1093
|
+
this._onLayoutChange();
|
|
1094
|
+
this._onLayoutDone();
|
|
1095
|
+
};
|
|
1096
|
+
unlockNodePosition = (node) => {
|
|
1097
|
+
const d3Node = this._positionsByNodeId.get(node.id);
|
|
1098
|
+
d3Node.fx = null;
|
|
1099
|
+
d3Node.fy = null;
|
|
1100
|
+
};
|
|
1101
|
+
};
|
|
1102
|
+
|
|
1103
|
+
// dist/layouts/gpu-force/gpu-force-layout.js
|
|
1104
|
+
var import_meta2 = {};
|
|
1105
|
+
var defaultOptions2 = {
|
|
1106
|
+
alpha: 0.3,
|
|
1107
|
+
resumeAlpha: 0.1,
|
|
1108
|
+
nBodyStrength: -900,
|
|
1109
|
+
nBodyDistanceMin: 100,
|
|
1110
|
+
nBodyDistanceMax: 400,
|
|
1111
|
+
getCollisionRadius: 0
|
|
1112
|
+
};
|
|
1113
|
+
var GPUForceLayout = class extends BaseLayout {
|
|
1114
|
+
_name = "GPU";
|
|
1115
|
+
_d3Graph;
|
|
1116
|
+
_nodeMap;
|
|
1117
|
+
_edgeMap;
|
|
1118
|
+
_graph;
|
|
1119
|
+
_worker;
|
|
1120
|
+
_callbacks;
|
|
1121
|
+
constructor(options) {
|
|
1122
|
+
super(options);
|
|
1123
|
+
this._name = "GPU";
|
|
1124
|
+
this._options = {
|
|
1125
|
+
...defaultOptions2,
|
|
1126
|
+
...options
|
|
1127
|
+
};
|
|
1128
|
+
this._d3Graph = { nodes: [], edges: [] };
|
|
1129
|
+
this._nodeMap = {};
|
|
1130
|
+
this._edgeMap = {};
|
|
1131
|
+
}
|
|
1132
|
+
initializeGraph(graph) {
|
|
1133
|
+
this._graph = graph;
|
|
1134
|
+
this._nodeMap = {};
|
|
1135
|
+
this._edgeMap = {};
|
|
1136
|
+
const d3Nodes = graph.getNodes().map((node) => {
|
|
1137
|
+
const id = node.id;
|
|
1138
|
+
const locked = node.getPropertyValue("locked") || false;
|
|
1139
|
+
const x = node.getPropertyValue("x") || 0;
|
|
1140
|
+
const y = node.getPropertyValue("y") || 0;
|
|
1141
|
+
const collisionRadius = node.getPropertyValue("collisionRadius") || 0;
|
|
1142
|
+
const d3Node = {
|
|
1143
|
+
id,
|
|
1144
|
+
x,
|
|
1145
|
+
y,
|
|
1146
|
+
fx: locked ? x : null,
|
|
1147
|
+
fy: locked ? y : null,
|
|
1148
|
+
collisionRadius,
|
|
1149
|
+
locked
|
|
1150
|
+
};
|
|
1151
|
+
this._nodeMap[node.id] = d3Node;
|
|
1152
|
+
return d3Node;
|
|
1153
|
+
});
|
|
1154
|
+
const d3Edges = graph.getEdges().map((edge) => {
|
|
1155
|
+
const d3Edge = {
|
|
1156
|
+
id: edge.id,
|
|
1157
|
+
source: this._nodeMap[edge.getSourceNodeId()],
|
|
1158
|
+
target: this._nodeMap[edge.getTargetNodeId()]
|
|
1159
|
+
};
|
|
1160
|
+
this._edgeMap[edge.id] = d3Edge;
|
|
1161
|
+
return d3Edge;
|
|
1162
|
+
});
|
|
1163
|
+
this._d3Graph = {
|
|
1164
|
+
nodes: d3Nodes,
|
|
1165
|
+
edges: d3Edges
|
|
1166
|
+
};
|
|
1167
|
+
}
|
|
1168
|
+
start() {
|
|
1169
|
+
this._engageWorker();
|
|
1170
|
+
}
|
|
1171
|
+
update() {
|
|
1172
|
+
this._engageWorker();
|
|
1173
|
+
}
|
|
1174
|
+
_engageWorker() {
|
|
1175
|
+
if (this._worker) {
|
|
1176
|
+
this._worker.terminate();
|
|
1177
|
+
}
|
|
1178
|
+
this._worker = new Worker(new URL("./worker.js", import_meta2.url).href);
|
|
1179
|
+
const { alpha, nBodyStrength, nBodyDistanceMin, nBodyDistanceMax, getCollisionRadius } = this._options;
|
|
1180
|
+
this._worker.postMessage({
|
|
1181
|
+
nodes: this._d3Graph.nodes,
|
|
1182
|
+
edges: this._d3Graph.edges,
|
|
1183
|
+
options: {
|
|
1184
|
+
alpha,
|
|
1185
|
+
nBodyStrength,
|
|
1186
|
+
nBodyDistanceMin,
|
|
1187
|
+
nBodyDistanceMax,
|
|
1188
|
+
getCollisionRadius
|
|
1189
|
+
}
|
|
1190
|
+
});
|
|
1191
|
+
this._worker.onmessage = (event) => {
|
|
1192
|
+
switch (event.data.type) {
|
|
1193
|
+
case "tick":
|
|
1194
|
+
this.ticked(event.data);
|
|
1195
|
+
break;
|
|
1196
|
+
case "end":
|
|
1197
|
+
this.ended(event.data);
|
|
1198
|
+
break;
|
|
1199
|
+
default:
|
|
1200
|
+
break;
|
|
1201
|
+
}
|
|
1202
|
+
};
|
|
1203
|
+
}
|
|
1204
|
+
ticked(data) {
|
|
1205
|
+
}
|
|
1206
|
+
ended(data) {
|
|
1207
|
+
const { nodes, edges } = data;
|
|
1208
|
+
this.updateD3Graph({ nodes, edges });
|
|
1209
|
+
this._onLayoutChange();
|
|
1210
|
+
this._onLayoutDone();
|
|
1211
|
+
}
|
|
1212
|
+
resume() {
|
|
1213
|
+
throw new Error("Resume unavailable");
|
|
1214
|
+
}
|
|
1215
|
+
stop() {
|
|
1216
|
+
this._worker.terminate();
|
|
1217
|
+
}
|
|
1218
|
+
// for steaming new data on the same graph
|
|
1219
|
+
updateGraph(graph) {
|
|
1220
|
+
if (this._graph.getGraphName() !== graph.getGraphName()) {
|
|
1221
|
+
this._nodeMap = {};
|
|
1222
|
+
this._edgeMap = {};
|
|
1223
|
+
}
|
|
1224
|
+
this._graph = graph;
|
|
1225
|
+
const newNodeMap = {};
|
|
1226
|
+
const newD3Nodes = graph.getNodes().map((node) => {
|
|
1227
|
+
const id = node.id;
|
|
1228
|
+
const locked = node.getPropertyValue("locked") || false;
|
|
1229
|
+
const x = node.getPropertyValue("x") || 0;
|
|
1230
|
+
const y = node.getPropertyValue("y") || 0;
|
|
1231
|
+
const fx = locked ? x : null;
|
|
1232
|
+
const fy = locked ? y : null;
|
|
1233
|
+
const collisionRadius = node.getPropertyValue("collisionRadius") || 0;
|
|
1234
|
+
const oldD3Node = this._nodeMap[node.id];
|
|
1235
|
+
const newD3Node = oldD3Node ? oldD3Node : { id, x, y, fx, fy, collisionRadius };
|
|
1236
|
+
newNodeMap[node.id] = newD3Node;
|
|
1237
|
+
return newD3Node;
|
|
1238
|
+
});
|
|
1239
|
+
this._nodeMap = newNodeMap;
|
|
1240
|
+
this._d3Graph.nodes = newD3Nodes;
|
|
1241
|
+
const newEdgeMap = {};
|
|
1242
|
+
const newD3Edges = graph.getEdges().map((edge) => {
|
|
1243
|
+
const oldD3Edge = this._edgeMap[edge.id];
|
|
1244
|
+
const newD3Edge = oldD3Edge || {
|
|
1245
|
+
id: edge.id,
|
|
1246
|
+
source: newNodeMap[edge.getSourceNodeId()],
|
|
1247
|
+
target: newNodeMap[edge.getTargetNodeId()]
|
|
1248
|
+
};
|
|
1249
|
+
newEdgeMap[edge.id] = newD3Edge;
|
|
1250
|
+
return newD3Edge;
|
|
1251
|
+
});
|
|
1252
|
+
this._edgeMap = newEdgeMap;
|
|
1253
|
+
this._d3Graph.edges = newD3Edges;
|
|
1254
|
+
}
|
|
1255
|
+
updateD3Graph(graph) {
|
|
1256
|
+
const existingNodes = this._graph.getNodes();
|
|
1257
|
+
const newNodeMap = {};
|
|
1258
|
+
const newD3Nodes = graph.nodes.map((node) => {
|
|
1259
|
+
const existingNode = existingNodes.find((n) => n.getId() === node.id);
|
|
1260
|
+
existingNode.setDataProperty("locked", node.locked);
|
|
1261
|
+
existingNode.setDataProperty("x", node.x);
|
|
1262
|
+
existingNode.setDataProperty("y", node.y);
|
|
1263
|
+
existingNode.setDataProperty("collisionRadius", node.collisionRadius);
|
|
1264
|
+
newNodeMap[node.id] = node;
|
|
1265
|
+
return node;
|
|
1266
|
+
});
|
|
1267
|
+
this._nodeMap = newNodeMap;
|
|
1268
|
+
this._d3Graph.nodes = newD3Nodes;
|
|
1269
|
+
const newEdgeMap = {};
|
|
1270
|
+
const newD3Edges = graph.edges.map((edge) => {
|
|
1271
|
+
newEdgeMap[edge.id] = edge;
|
|
1272
|
+
return edge;
|
|
1273
|
+
});
|
|
1274
|
+
this._graph.triggerUpdate();
|
|
1275
|
+
this._edgeMap = newEdgeMap;
|
|
1276
|
+
this._d3Graph.edges = newD3Edges;
|
|
1277
|
+
}
|
|
1278
|
+
getNodePosition = (node) => {
|
|
1279
|
+
const d3Node = this._nodeMap[node.id];
|
|
1280
|
+
if (d3Node) {
|
|
1281
|
+
return [d3Node.x, d3Node.y];
|
|
1282
|
+
}
|
|
1283
|
+
return [0, 0];
|
|
1284
|
+
};
|
|
1285
|
+
getEdgePosition = (edge) => {
|
|
1286
|
+
const d3Edge = this._edgeMap[edge.id];
|
|
1287
|
+
const sourcePosition = d3Edge && d3Edge.source;
|
|
1288
|
+
const targetPosition = d3Edge && d3Edge.target;
|
|
1289
|
+
if (d3Edge && sourcePosition && targetPosition) {
|
|
1290
|
+
return {
|
|
1291
|
+
type: EDGE_TYPE.LINE,
|
|
1292
|
+
sourcePosition: [sourcePosition.x, sourcePosition.y],
|
|
1293
|
+
targetPosition: [targetPosition.x, targetPosition.y],
|
|
1294
|
+
controlPoints: []
|
|
1295
|
+
};
|
|
1296
|
+
}
|
|
1297
|
+
return {
|
|
1298
|
+
type: EDGE_TYPE.LINE,
|
|
1299
|
+
sourcePosition: [0, 0],
|
|
1300
|
+
targetPosition: [0, 0],
|
|
1301
|
+
controlPoints: []
|
|
1302
|
+
};
|
|
1303
|
+
};
|
|
1304
|
+
lockNodePosition = (node, x, y) => {
|
|
1305
|
+
const d3Node = this._nodeMap[node.id];
|
|
1306
|
+
d3Node.x = x;
|
|
1307
|
+
d3Node.y = y;
|
|
1308
|
+
d3Node.fx = x;
|
|
1309
|
+
d3Node.fy = y;
|
|
1310
|
+
this._callbacks.onLayoutChange();
|
|
1311
|
+
this._callbacks.onLayoutDone();
|
|
1312
|
+
};
|
|
1313
|
+
unlockNodePosition = (node) => {
|
|
1314
|
+
const d3Node = this._nodeMap[node.id];
|
|
1315
|
+
d3Node.fx = null;
|
|
1316
|
+
d3Node.fy = null;
|
|
1317
|
+
};
|
|
1318
|
+
};
|
|
1319
|
+
|
|
1320
|
+
// dist/layouts/simple-layout/simple-layout.js
|
|
1321
|
+
var defaultOptions3 = {
|
|
1322
|
+
nodePositionAccessor: (node) => [node.getPropertyValue("x"), node.getPropertyValue("y")]
|
|
1323
|
+
};
|
|
1324
|
+
var SimpleLayout = class extends BaseLayout {
|
|
1325
|
+
_name = "SimpleLayout";
|
|
1326
|
+
_graph = null;
|
|
1327
|
+
_nodeMap = {};
|
|
1328
|
+
_nodePositionMap = {};
|
|
1329
|
+
constructor(options = {}) {
|
|
1330
|
+
super({ ...defaultOptions3, ...options });
|
|
1331
|
+
}
|
|
1332
|
+
initializeGraph(graph) {
|
|
1333
|
+
this.updateGraph(graph);
|
|
1334
|
+
}
|
|
1335
|
+
_notifyLayoutComplete() {
|
|
1336
|
+
this._onLayoutStart();
|
|
1337
|
+
this._onLayoutChange();
|
|
1338
|
+
this._onLayoutDone();
|
|
1339
|
+
}
|
|
1340
|
+
start() {
|
|
1341
|
+
this._notifyLayoutComplete();
|
|
1342
|
+
}
|
|
1343
|
+
update() {
|
|
1344
|
+
this._notifyLayoutComplete();
|
|
1345
|
+
}
|
|
1346
|
+
resume() {
|
|
1347
|
+
this._notifyLayoutComplete();
|
|
1348
|
+
}
|
|
1349
|
+
updateGraph(graph) {
|
|
1350
|
+
this._graph = graph;
|
|
1351
|
+
this._nodeMap = graph.getNodes().reduce((res, node) => {
|
|
1352
|
+
res[node.getId()] = node;
|
|
1353
|
+
return res;
|
|
1354
|
+
}, {});
|
|
1355
|
+
this._nodePositionMap = graph.getNodes().reduce((res, node) => {
|
|
1356
|
+
res[node.getId()] = this._options.nodePositionAccessor(node);
|
|
1357
|
+
return res;
|
|
1358
|
+
}, {});
|
|
1359
|
+
}
|
|
1360
|
+
setNodePositionAccessor = (accessor) => {
|
|
1361
|
+
this._options.nodePositionAccessor = accessor;
|
|
1362
|
+
};
|
|
1363
|
+
getNodePosition = (node) => this._nodePositionMap[node.getId()];
|
|
1364
|
+
getEdgePosition = (edge) => {
|
|
1365
|
+
const sourcePos = this._nodePositionMap[edge.getSourceNodeId()];
|
|
1366
|
+
const targetPos = this._nodePositionMap[edge.getTargetNodeId()];
|
|
1367
|
+
return {
|
|
1368
|
+
type: EDGE_TYPE.LINE,
|
|
1369
|
+
sourcePosition: sourcePos,
|
|
1370
|
+
targetPosition: targetPos,
|
|
1371
|
+
controlPoints: []
|
|
1372
|
+
};
|
|
1373
|
+
};
|
|
1374
|
+
lockNodePosition = (node, x, y) => {
|
|
1375
|
+
this._nodePositionMap[node.getId()] = [x, y];
|
|
1376
|
+
this._onLayoutChange();
|
|
1377
|
+
this._onLayoutDone();
|
|
1378
|
+
};
|
|
1379
|
+
};
|
|
1380
|
+
|
|
1381
|
+
// dist/utils/create-graph.js
|
|
1382
|
+
function createGraph({ name, nodes, edges, nodeParser, edgeParser }) {
|
|
1383
|
+
const graph = new Graph();
|
|
1384
|
+
const graphName = name || Date.now();
|
|
1385
|
+
graph.setGraphName(graphName);
|
|
1386
|
+
const glNodes = nodes.map((node) => {
|
|
1387
|
+
const { id } = nodeParser(node);
|
|
1388
|
+
return new Node({
|
|
1389
|
+
id,
|
|
1390
|
+
data: node
|
|
1391
|
+
});
|
|
1392
|
+
});
|
|
1393
|
+
graph.batchAddNodes(glNodes);
|
|
1394
|
+
const glEdges = edges.map((edge) => {
|
|
1395
|
+
const { id, sourceId, targetId, directed } = edgeParser(edge);
|
|
1396
|
+
return new Edge({
|
|
1397
|
+
id,
|
|
1398
|
+
sourceId,
|
|
1399
|
+
targetId,
|
|
1400
|
+
directed,
|
|
1401
|
+
data: edge
|
|
1402
|
+
});
|
|
1403
|
+
});
|
|
1404
|
+
graph.batchAddEdges(glEdges);
|
|
1405
|
+
return graph;
|
|
1406
|
+
}
|
|
1407
|
+
|
|
1408
|
+
// dist/loaders/node-parsers.js
|
|
1409
|
+
function basicNodeParser(node) {
|
|
1410
|
+
if (node.id === void 0) {
|
|
1411
|
+
log.error("Invalid node: id is missing.")();
|
|
1412
|
+
return null;
|
|
1413
|
+
}
|
|
1414
|
+
return { id: node.id };
|
|
1415
|
+
}
|
|
1416
|
+
|
|
1417
|
+
// dist/loaders/edge-parsers.js
|
|
1418
|
+
function basicEdgeParser(edge) {
|
|
1419
|
+
const { id, directed, sourceId, targetId } = edge;
|
|
1420
|
+
if (sourceId === void 0 || targetId === void 0) {
|
|
1421
|
+
log.error("Invalid edge: sourceId or targetId is missing.")();
|
|
1422
|
+
return null;
|
|
1423
|
+
}
|
|
1424
|
+
return {
|
|
1425
|
+
id,
|
|
1426
|
+
directed: directed || false,
|
|
1427
|
+
sourceId,
|
|
1428
|
+
targetId
|
|
1429
|
+
};
|
|
1430
|
+
}
|
|
1431
|
+
|
|
1432
|
+
// dist/loaders/json-loader.js
|
|
1433
|
+
var JSONLoader = ({ json, nodeParser = basicNodeParser, edgeParser = basicEdgeParser }) => {
|
|
1434
|
+
const { name = "default", nodes, edges } = json;
|
|
1435
|
+
if (!nodes) {
|
|
1436
|
+
log.error("Invalid graph: nodes is missing.")();
|
|
1437
|
+
return null;
|
|
1438
|
+
}
|
|
1439
|
+
const graph = createGraph({ name, nodes, edges, nodeParser, edgeParser });
|
|
1440
|
+
return graph;
|
|
1441
|
+
};
|
|
1442
|
+
|
|
1443
|
+
// dist/utils/layer-utils.js
|
|
1444
|
+
var mixedGetPosition = (getPosition, getOffset2) => {
|
|
1445
|
+
if (!getOffset2) {
|
|
1446
|
+
return getPosition;
|
|
1447
|
+
}
|
|
1448
|
+
if (typeof getOffset2 === "function") {
|
|
1449
|
+
return (d) => {
|
|
1450
|
+
const [x, y] = getPosition(d);
|
|
1451
|
+
const [offX2, offY2] = getOffset2(d);
|
|
1452
|
+
return [x + offX2, y + offY2];
|
|
1453
|
+
};
|
|
1454
|
+
}
|
|
1455
|
+
const [offX, offY] = getOffset2;
|
|
1456
|
+
return (d) => {
|
|
1457
|
+
const [x, y] = getPosition(d);
|
|
1458
|
+
return [x + offX, y + offY];
|
|
1459
|
+
};
|
|
1460
|
+
};
|
|
1461
|
+
|
|
1462
|
+
// dist/layers/graph-layer.js
|
|
1463
|
+
var import_core16 = require("@deck.gl/core");
|
|
1464
|
+
|
|
1465
|
+
// dist/style/style-property.js
|
|
1466
|
+
var import_color = __toESM(require("color"), 1);
|
|
1467
|
+
function getColor(value) {
|
|
1468
|
+
if (typeof value === "string") {
|
|
1469
|
+
try {
|
|
1470
|
+
const color = import_color.default.rgb(value).array();
|
|
1471
|
+
if (Number.isFinite(color[3])) {
|
|
1472
|
+
color[3] *= 255;
|
|
1473
|
+
}
|
|
1474
|
+
return color;
|
|
1475
|
+
} catch (error) {
|
|
1476
|
+
return [0, 0, 0];
|
|
1477
|
+
}
|
|
1478
|
+
}
|
|
1479
|
+
if (Array.isArray(value) && Number.isFinite(value[0])) {
|
|
1480
|
+
return value;
|
|
1481
|
+
}
|
|
1482
|
+
return [0, 0, 0];
|
|
1483
|
+
}
|
|
1484
|
+
function getNumber(value) {
|
|
1485
|
+
switch (typeof value) {
|
|
1486
|
+
case "string":
|
|
1487
|
+
value = Number(value);
|
|
1488
|
+
return isNaN(value) ? null : value;
|
|
1489
|
+
case "number":
|
|
1490
|
+
return value;
|
|
1491
|
+
default:
|
|
1492
|
+
return null;
|
|
1493
|
+
}
|
|
1494
|
+
}
|
|
1495
|
+
function getBool(value) {
|
|
1496
|
+
switch (typeof value) {
|
|
1497
|
+
case "boolean":
|
|
1498
|
+
return value;
|
|
1499
|
+
case "string":
|
|
1500
|
+
return value.toLowerCase() !== "false";
|
|
1501
|
+
case "number":
|
|
1502
|
+
return Boolean(value);
|
|
1503
|
+
default:
|
|
1504
|
+
return null;
|
|
1505
|
+
}
|
|
1506
|
+
}
|
|
1507
|
+
function getOffset(value) {
|
|
1508
|
+
if (typeof value === "function") {
|
|
1509
|
+
return value;
|
|
1510
|
+
}
|
|
1511
|
+
if (!Array.isArray(value) || value.length !== 2) {
|
|
1512
|
+
return null;
|
|
1513
|
+
}
|
|
1514
|
+
return value.map(getNumber);
|
|
1515
|
+
}
|
|
1516
|
+
var IDENTITY = (x) => x;
|
|
1517
|
+
var PROPERTY_FORMATTERS = {
|
|
1518
|
+
opacity: getNumber,
|
|
1519
|
+
zIndex: getNumber,
|
|
1520
|
+
width: getNumber,
|
|
1521
|
+
height: getNumber,
|
|
1522
|
+
radius: getNumber,
|
|
1523
|
+
fill: getColor,
|
|
1524
|
+
stroke: getColor,
|
|
1525
|
+
strokeWidth: getNumber,
|
|
1526
|
+
// for marker
|
|
1527
|
+
marker: String,
|
|
1528
|
+
size: getNumber,
|
|
1529
|
+
// text
|
|
1530
|
+
color: getColor,
|
|
1531
|
+
text: String,
|
|
1532
|
+
fontSize: getNumber,
|
|
1533
|
+
textAnchor: String,
|
|
1534
|
+
alignmentBaseline: String,
|
|
1535
|
+
angle: getNumber,
|
|
1536
|
+
textMaxWidth: getNumber,
|
|
1537
|
+
textWordBreak: String,
|
|
1538
|
+
textSizeMinPixels: getNumber,
|
|
1539
|
+
// edges
|
|
1540
|
+
speed: getNumber,
|
|
1541
|
+
tailLength: getNumber,
|
|
1542
|
+
offset: getOffset,
|
|
1543
|
+
scaleWithZoom: getBool
|
|
1544
|
+
};
|
|
1545
|
+
var DEFAULT_STYLES = {
|
|
1546
|
+
opacity: 1,
|
|
1547
|
+
zIndex: 0,
|
|
1548
|
+
width: 0,
|
|
1549
|
+
height: 0,
|
|
1550
|
+
radius: 1,
|
|
1551
|
+
fill: [0, 0, 0],
|
|
1552
|
+
stroke: [0, 0, 0],
|
|
1553
|
+
strokeWidth: 0,
|
|
1554
|
+
marker: "circle",
|
|
1555
|
+
size: 12,
|
|
1556
|
+
color: [0, 0, 0],
|
|
1557
|
+
text: "",
|
|
1558
|
+
fontSize: 12,
|
|
1559
|
+
textAnchor: "middle",
|
|
1560
|
+
alignmentBaseline: "center",
|
|
1561
|
+
angle: 0,
|
|
1562
|
+
textMaxWidth: -1,
|
|
1563
|
+
textWordBreak: "break-all",
|
|
1564
|
+
textSizeMinPixels: 9,
|
|
1565
|
+
speed: 0,
|
|
1566
|
+
tailLength: 1,
|
|
1567
|
+
offset: null,
|
|
1568
|
+
scaleWithZoom: true
|
|
1569
|
+
};
|
|
1570
|
+
function generateAccessor(key, value) {
|
|
1571
|
+
const formatter = PROPERTY_FORMATTERS[key] || IDENTITY;
|
|
1572
|
+
const valueMap = Object.keys(value).reduce((res, key0) => {
|
|
1573
|
+
res[key0] = value[key0];
|
|
1574
|
+
return res;
|
|
1575
|
+
}, {});
|
|
1576
|
+
return (node) => {
|
|
1577
|
+
const statefulValue = valueMap[node.state];
|
|
1578
|
+
if (!node.state || typeof statefulValue === "undefined") {
|
|
1579
|
+
return valueMap.default || DEFAULT_STYLES[key];
|
|
1580
|
+
}
|
|
1581
|
+
if (typeof statefulValue === "function") {
|
|
1582
|
+
return formatter(statefulValue(node));
|
|
1583
|
+
}
|
|
1584
|
+
return formatter(statefulValue);
|
|
1585
|
+
};
|
|
1586
|
+
}
|
|
1587
|
+
var VALUE_TYPE = {
|
|
1588
|
+
ACCESSOR: "ACCESSOR",
|
|
1589
|
+
PLAIN_VALUE: "PLAIN_VALUE"
|
|
1590
|
+
};
|
|
1591
|
+
var StyleProperty = class {
|
|
1592
|
+
key;
|
|
1593
|
+
_updateTrigger;
|
|
1594
|
+
_value;
|
|
1595
|
+
_valueType;
|
|
1596
|
+
// for getting default style
|
|
1597
|
+
static getDefault(key) {
|
|
1598
|
+
return DEFAULT_STYLES[key];
|
|
1599
|
+
}
|
|
1600
|
+
// pass the key and value of the property
|
|
1601
|
+
// and format the value properly.
|
|
1602
|
+
constructor({ key, value, updateTrigger }) {
|
|
1603
|
+
this.key = key;
|
|
1604
|
+
this._updateTrigger = false;
|
|
1605
|
+
if (typeof value === "object" && !Array.isArray(value)) {
|
|
1606
|
+
this._value = generateAccessor(key, value);
|
|
1607
|
+
this._valueType = VALUE_TYPE.ACCESSOR;
|
|
1608
|
+
this._updateTrigger = updateTrigger;
|
|
1609
|
+
} else if (typeof value === "function") {
|
|
1610
|
+
const formatter = PROPERTY_FORMATTERS[key] || IDENTITY;
|
|
1611
|
+
this._value = (d) => formatter(value(d));
|
|
1612
|
+
this._valueType = VALUE_TYPE.ACCESSOR;
|
|
1613
|
+
this._updateTrigger = value;
|
|
1614
|
+
} else {
|
|
1615
|
+
const formatter = PROPERTY_FORMATTERS[key] || IDENTITY;
|
|
1616
|
+
this._value = formatter(value);
|
|
1617
|
+
this._valueType = VALUE_TYPE.PLAIN_VALUE;
|
|
1618
|
+
this._updateTrigger = false;
|
|
1619
|
+
}
|
|
1620
|
+
if (this._value === null) {
|
|
1621
|
+
log.warn(`Invalid ${key} value: ${value}`)();
|
|
1622
|
+
throw new Error(`Invalid ${key} value: ${value}`);
|
|
1623
|
+
}
|
|
1624
|
+
}
|
|
1625
|
+
// get the formatted value
|
|
1626
|
+
getValue() {
|
|
1627
|
+
return this._value;
|
|
1628
|
+
}
|
|
1629
|
+
getUpdateTrigger() {
|
|
1630
|
+
return this._updateTrigger;
|
|
1631
|
+
}
|
|
1632
|
+
};
|
|
1633
|
+
|
|
1634
|
+
// dist/style/style-sheet.js
|
|
1635
|
+
var COMMON_DECKGL_PROPS = {
|
|
1636
|
+
getOffset: "offset",
|
|
1637
|
+
opacity: "opacity"
|
|
1638
|
+
};
|
|
1639
|
+
var DECKGL_ACCESSOR_MAP = {
|
|
1640
|
+
[NODE_TYPE.CIRCLE]: {
|
|
1641
|
+
...COMMON_DECKGL_PROPS,
|
|
1642
|
+
getFillColor: "fill",
|
|
1643
|
+
getLineColor: "stroke",
|
|
1644
|
+
getLineWidth: "strokeWidth",
|
|
1645
|
+
getRadius: "radius"
|
|
1646
|
+
},
|
|
1647
|
+
[NODE_TYPE.RECTANGLE]: {
|
|
1648
|
+
...COMMON_DECKGL_PROPS,
|
|
1649
|
+
getWidth: "width",
|
|
1650
|
+
getHeight: "height",
|
|
1651
|
+
getFillColor: "fill",
|
|
1652
|
+
getLineColor: "stroke",
|
|
1653
|
+
getLineWidth: "strokeWidth"
|
|
1654
|
+
},
|
|
1655
|
+
[NODE_TYPE.ROUNDED_RECTANGLE]: {
|
|
1656
|
+
...COMMON_DECKGL_PROPS,
|
|
1657
|
+
getCornerRadius: "cornerRadius",
|
|
1658
|
+
getRadius: "radius",
|
|
1659
|
+
getWidth: "width",
|
|
1660
|
+
getHeight: "height",
|
|
1661
|
+
getFillColor: "fill",
|
|
1662
|
+
getLineColor: "stroke",
|
|
1663
|
+
getLineWidth: "strokeWidth"
|
|
1664
|
+
},
|
|
1665
|
+
[NODE_TYPE.PATH_ROUNDED_RECTANGLE]: {
|
|
1666
|
+
...COMMON_DECKGL_PROPS,
|
|
1667
|
+
getWidth: "width",
|
|
1668
|
+
getHeight: "height",
|
|
1669
|
+
getFillColor: "fill",
|
|
1670
|
+
getLineColor: "stroke",
|
|
1671
|
+
getLineWidth: "strokeWidth",
|
|
1672
|
+
getCornerRadius: "cornerRadius"
|
|
1673
|
+
},
|
|
1674
|
+
[NODE_TYPE.LABEL]: {
|
|
1675
|
+
...COMMON_DECKGL_PROPS,
|
|
1676
|
+
getColor: "color",
|
|
1677
|
+
getText: "text",
|
|
1678
|
+
getSize: "fontSize",
|
|
1679
|
+
getTextAnchor: "textAnchor",
|
|
1680
|
+
getAlignmentBaseline: "alignmentBaseline",
|
|
1681
|
+
getAngle: "angle",
|
|
1682
|
+
scaleWithZoom: "scaleWithZoom",
|
|
1683
|
+
textMaxWidth: "textMaxWidth",
|
|
1684
|
+
textWordBreak: "textWordBreak",
|
|
1685
|
+
textSizeMinPixels: "textSizeMinPixels"
|
|
1686
|
+
},
|
|
1687
|
+
[NODE_TYPE.MARKER]: {
|
|
1688
|
+
...COMMON_DECKGL_PROPS,
|
|
1689
|
+
getColor: "fill",
|
|
1690
|
+
getSize: "size",
|
|
1691
|
+
getMarker: "marker",
|
|
1692
|
+
scaleWithZoom: "scaleWithZoom"
|
|
1693
|
+
},
|
|
1694
|
+
// --------- Edge related ---------
|
|
1695
|
+
Edge: {
|
|
1696
|
+
getColor: "stroke",
|
|
1697
|
+
getWidth: "strokeWidth"
|
|
1698
|
+
},
|
|
1699
|
+
[EDGE_DECORATOR_TYPE.LABEL]: {
|
|
1700
|
+
getColor: "color",
|
|
1701
|
+
getText: "text",
|
|
1702
|
+
getSize: "fontSize",
|
|
1703
|
+
getTextAnchor: "textAnchor",
|
|
1704
|
+
getAlignmentBaseline: "alignmentBaseline",
|
|
1705
|
+
scaleWithZoom: "scaleWithZoom",
|
|
1706
|
+
textMaxWidth: "textMaxWidth",
|
|
1707
|
+
textWordBreak: "textWordBreak",
|
|
1708
|
+
textSizeMinPixels: "textSizeMinPixels"
|
|
1709
|
+
},
|
|
1710
|
+
[EDGE_DECORATOR_TYPE.FLOW]: {
|
|
1711
|
+
getColor: "color",
|
|
1712
|
+
getWidth: "width",
|
|
1713
|
+
getSpeed: "speed",
|
|
1714
|
+
getTailLength: "tailLength"
|
|
1715
|
+
}
|
|
1716
|
+
};
|
|
1717
|
+
var DECKGL_UPDATE_TRIGGERS = {
|
|
1718
|
+
[NODE_TYPE.CIRCLE]: ["getFillColor", "getRadius", "getLineColor", "getLineWidth"],
|
|
1719
|
+
[NODE_TYPE.RECTANGLE]: ["getFillColor", "getLineColor", "getLineWidth"],
|
|
1720
|
+
[NODE_TYPE.ROUNDED_RECTANGLE]: [
|
|
1721
|
+
"getFillColor",
|
|
1722
|
+
"getLineColor",
|
|
1723
|
+
"getLineWidth",
|
|
1724
|
+
"getCornerRadius"
|
|
1725
|
+
],
|
|
1726
|
+
[NODE_TYPE.PATH_ROUNDED_RECTANGLE]: [
|
|
1727
|
+
"getFillColor",
|
|
1728
|
+
"getLineColor",
|
|
1729
|
+
"getLineWidth",
|
|
1730
|
+
"getCornerRadius"
|
|
1731
|
+
],
|
|
1732
|
+
[NODE_TYPE.LABEL]: [
|
|
1733
|
+
"getColor",
|
|
1734
|
+
"getText",
|
|
1735
|
+
"getSize",
|
|
1736
|
+
"getTextAnchor",
|
|
1737
|
+
"getAlignmentBaseline",
|
|
1738
|
+
"getAngle"
|
|
1739
|
+
],
|
|
1740
|
+
[NODE_TYPE.MARKER]: ["getColor", "getSize", "getMarker"],
|
|
1741
|
+
Edge: ["getColor", "getWidth"],
|
|
1742
|
+
[EDGE_DECORATOR_TYPE.LABEL]: [
|
|
1743
|
+
"getColor",
|
|
1744
|
+
"getText",
|
|
1745
|
+
"getSize",
|
|
1746
|
+
"getTextAnchor",
|
|
1747
|
+
"getAlignmentBaseline"
|
|
1748
|
+
],
|
|
1749
|
+
[EDGE_DECORATOR_TYPE.FLOW]: ["getColor", "getWidth", "getSpeed", "getTailLength"]
|
|
1750
|
+
};
|
|
1751
|
+
var Stylesheet = class {
|
|
1752
|
+
type;
|
|
1753
|
+
properties;
|
|
1754
|
+
constructor(style, updateTriggers) {
|
|
1755
|
+
const { type: layerType, ...restStyle } = style;
|
|
1756
|
+
if (!layerType || !(layerType in DECKGL_ACCESSOR_MAP)) {
|
|
1757
|
+
throw new Error(`illegal type: ${layerType}`);
|
|
1758
|
+
}
|
|
1759
|
+
this.type = layerType;
|
|
1760
|
+
const rules = Object.keys(restStyle).reduce((res, key) => {
|
|
1761
|
+
const isSelector = key.startsWith(":");
|
|
1762
|
+
if (isSelector) {
|
|
1763
|
+
const state = key.substring(1);
|
|
1764
|
+
res[state] = restStyle[key];
|
|
1765
|
+
return res;
|
|
1766
|
+
}
|
|
1767
|
+
res.default[key] = restStyle[key];
|
|
1768
|
+
return res;
|
|
1769
|
+
}, {
|
|
1770
|
+
default: {}
|
|
1771
|
+
});
|
|
1772
|
+
const attributes = Object.values(rules).reduce((res, rule) => {
|
|
1773
|
+
const attrs = Object.keys(rule);
|
|
1774
|
+
const set = /* @__PURE__ */ new Set([...res, ...attrs]);
|
|
1775
|
+
return Array.from(set);
|
|
1776
|
+
}, []);
|
|
1777
|
+
const attrMap = attributes.reduce((res, attr) => {
|
|
1778
|
+
res[attr] = Object.entries(rules).reduce((acc, entry) => {
|
|
1779
|
+
const [state, rule] = entry;
|
|
1780
|
+
if (typeof rule[attr] !== "undefined") {
|
|
1781
|
+
acc[state] = rule[attr];
|
|
1782
|
+
}
|
|
1783
|
+
return acc;
|
|
1784
|
+
}, {});
|
|
1785
|
+
return res;
|
|
1786
|
+
}, {});
|
|
1787
|
+
const simplifiedStyleMap = Object.entries(attrMap).reduce((res, entry) => {
|
|
1788
|
+
const [attr, valueMap] = entry;
|
|
1789
|
+
const onlyDefault = Object.keys(valueMap).length === 1 && valueMap.default !== void 0;
|
|
1790
|
+
if (onlyDefault) {
|
|
1791
|
+
res[attr] = valueMap.default;
|
|
1792
|
+
return res;
|
|
1793
|
+
}
|
|
1794
|
+
res[attr] = valueMap;
|
|
1795
|
+
return res;
|
|
1796
|
+
}, {});
|
|
1797
|
+
this.properties = {};
|
|
1798
|
+
for (const key in simplifiedStyleMap) {
|
|
1799
|
+
this.properties[key] = new StyleProperty({
|
|
1800
|
+
key,
|
|
1801
|
+
value: simplifiedStyleMap[key],
|
|
1802
|
+
updateTrigger: updateTriggers.stateUpdateTrigger
|
|
1803
|
+
});
|
|
1804
|
+
}
|
|
1805
|
+
}
|
|
1806
|
+
_getProperty(deckglAccessor) {
|
|
1807
|
+
const map = DECKGL_ACCESSOR_MAP[this.type];
|
|
1808
|
+
if (!map) {
|
|
1809
|
+
throw new Error(`illegal type: ${this.type}`);
|
|
1810
|
+
}
|
|
1811
|
+
const styleProp = map[deckglAccessor];
|
|
1812
|
+
if (!styleProp) {
|
|
1813
|
+
log.error(`Invalid DeckGL accessor: ${deckglAccessor}`)();
|
|
1814
|
+
throw new Error(`Invalid DeckGL accessor: ${deckglAccessor}`);
|
|
1815
|
+
}
|
|
1816
|
+
return this.properties[styleProp];
|
|
1817
|
+
}
|
|
1818
|
+
getDeckGLAccessor(deckglAccessor) {
|
|
1819
|
+
const property = this._getProperty(deckglAccessor);
|
|
1820
|
+
if (property) {
|
|
1821
|
+
return property.getValue();
|
|
1822
|
+
}
|
|
1823
|
+
const styleProp = DECKGL_ACCESSOR_MAP[this.type][deckglAccessor];
|
|
1824
|
+
return StyleProperty.getDefault(styleProp);
|
|
1825
|
+
}
|
|
1826
|
+
getDeckGLAccessorUpdateTrigger(deckglAccessor) {
|
|
1827
|
+
const property = this._getProperty(deckglAccessor);
|
|
1828
|
+
if (property) {
|
|
1829
|
+
return property.getUpdateTrigger();
|
|
1830
|
+
}
|
|
1831
|
+
return false;
|
|
1832
|
+
}
|
|
1833
|
+
getDeckGLAccessors() {
|
|
1834
|
+
const accessorMap = DECKGL_ACCESSOR_MAP[this.type];
|
|
1835
|
+
return Object.keys(accessorMap).reduce((res, accessor) => {
|
|
1836
|
+
res[accessor] = this.getDeckGLAccessor(accessor);
|
|
1837
|
+
return res;
|
|
1838
|
+
}, {});
|
|
1839
|
+
}
|
|
1840
|
+
getDeckGLUpdateTriggers() {
|
|
1841
|
+
return DECKGL_UPDATE_TRIGGERS[this.type].reduce((res, accessor) => {
|
|
1842
|
+
res[accessor] = this.getDeckGLAccessorUpdateTrigger(accessor);
|
|
1843
|
+
return res;
|
|
1844
|
+
}, {});
|
|
1845
|
+
}
|
|
1846
|
+
};
|
|
1847
|
+
|
|
1848
|
+
// dist/core/interaction-manager.js
|
|
1849
|
+
var NODE_TO_EDGE_STATE_MAP = {
|
|
1850
|
+
[NODE_STATE.DEFAULT]: EDGE_STATE.DEFAULT,
|
|
1851
|
+
[NODE_STATE.HOVER]: EDGE_STATE.HOVER,
|
|
1852
|
+
[NODE_STATE.DRAGGING]: EDGE_STATE.DRAGGING,
|
|
1853
|
+
[NODE_STATE.SELECTED]: EDGE_STATE.SELECTED
|
|
1854
|
+
};
|
|
1855
|
+
function shouldEdgeBeSelected(edge) {
|
|
1856
|
+
return edge.getConnectedNodes().some((node) => node.getState() === NODE_STATE.SELECTED && node.shouldHighlightConnectedEdges());
|
|
1857
|
+
}
|
|
1858
|
+
function setNodeState(node, state) {
|
|
1859
|
+
node.setState(state);
|
|
1860
|
+
if (node.shouldHighlightConnectedEdges()) {
|
|
1861
|
+
node.getConnectedEdges().forEach((edge) => {
|
|
1862
|
+
let newEdgeState = NODE_TO_EDGE_STATE_MAP[state];
|
|
1863
|
+
if (shouldEdgeBeSelected(edge)) {
|
|
1864
|
+
newEdgeState = EDGE_STATE.SELECTED;
|
|
1865
|
+
}
|
|
1866
|
+
edge.setState(newEdgeState);
|
|
1867
|
+
});
|
|
1868
|
+
}
|
|
1869
|
+
}
|
|
1870
|
+
var InteractionManager = class {
|
|
1871
|
+
notifyCallback;
|
|
1872
|
+
_lastInteraction = 0;
|
|
1873
|
+
_lastHoveredNode = null;
|
|
1874
|
+
_lastSelectedNode = null;
|
|
1875
|
+
nodeEvents = void 0;
|
|
1876
|
+
edgeEvents = void 0;
|
|
1877
|
+
engine = void 0;
|
|
1878
|
+
enableDragging = void 0;
|
|
1879
|
+
resumeLayoutAfterDragging = void 0;
|
|
1880
|
+
constructor(props, notifyCallback) {
|
|
1881
|
+
this.updateProps(props);
|
|
1882
|
+
this.notifyCallback = notifyCallback;
|
|
1883
|
+
this._lastInteraction = 0;
|
|
1884
|
+
this._lastHoveredNode = null;
|
|
1885
|
+
this._lastSelectedNode = null;
|
|
1886
|
+
}
|
|
1887
|
+
updateProps({ nodeEvents = {}, edgeEvents = {}, engine, enableDragging, resumeLayoutAfterDragging }) {
|
|
1888
|
+
this.nodeEvents = nodeEvents;
|
|
1889
|
+
this.edgeEvents = edgeEvents;
|
|
1890
|
+
this.engine = engine;
|
|
1891
|
+
this.enableDragging = enableDragging;
|
|
1892
|
+
this.resumeLayoutAfterDragging = resumeLayoutAfterDragging;
|
|
1893
|
+
}
|
|
1894
|
+
getLastInteraction() {
|
|
1895
|
+
return this._lastInteraction;
|
|
1896
|
+
}
|
|
1897
|
+
onClick(info, event) {
|
|
1898
|
+
const { object } = info;
|
|
1899
|
+
if (!object) {
|
|
1900
|
+
return;
|
|
1901
|
+
}
|
|
1902
|
+
if (object.isNode) {
|
|
1903
|
+
if (object.isSelectable()) {
|
|
1904
|
+
if (this._lastSelectedNode) {
|
|
1905
|
+
setNodeState(this._lastSelectedNode, NODE_STATE.DEFAULT);
|
|
1906
|
+
}
|
|
1907
|
+
setNodeState(object, NODE_STATE.SELECTED);
|
|
1908
|
+
this._lastSelectedNode = object;
|
|
1909
|
+
this._lastInteraction = Date.now();
|
|
1910
|
+
this.notifyCallback();
|
|
1911
|
+
}
|
|
1912
|
+
if (this.nodeEvents.onClick) {
|
|
1913
|
+
this.nodeEvents.onClick(info, event);
|
|
1914
|
+
}
|
|
1915
|
+
}
|
|
1916
|
+
if (object.isEdge && this.edgeEvents.onClick) {
|
|
1917
|
+
this.edgeEvents.onClick(info, event);
|
|
1918
|
+
}
|
|
1919
|
+
}
|
|
1920
|
+
_mouseLeaveNode() {
|
|
1921
|
+
var _a;
|
|
1922
|
+
const lastHoveredNode = this._lastHoveredNode;
|
|
1923
|
+
if (!(lastHoveredNode.isSelectable() && lastHoveredNode.getState() === NODE_STATE.SELECTED)) {
|
|
1924
|
+
const newState = this._lastSelectedNode !== null && this._lastSelectedNode.id === ((_a = this._lastHoveredNode) == null ? void 0 : _a.id) ? NODE_STATE.SELECTED : NODE_STATE.DEFAULT;
|
|
1925
|
+
setNodeState(lastHoveredNode, newState);
|
|
1926
|
+
}
|
|
1927
|
+
if (this.nodeEvents.onMouseLeave) {
|
|
1928
|
+
this.nodeEvents.onMouseLeave(lastHoveredNode);
|
|
1929
|
+
}
|
|
1930
|
+
}
|
|
1931
|
+
_mouseEnterNode(info) {
|
|
1932
|
+
setNodeState(info.object, NODE_STATE.HOVER);
|
|
1933
|
+
if (this.nodeEvents.onMouseEnter) {
|
|
1934
|
+
this.nodeEvents.onMouseEnter(info);
|
|
1935
|
+
}
|
|
1936
|
+
if (this.nodeEvents.onHover) {
|
|
1937
|
+
this.nodeEvents.onHover(info);
|
|
1938
|
+
}
|
|
1939
|
+
}
|
|
1940
|
+
onHover(info, event) {
|
|
1941
|
+
if (!info.object) {
|
|
1942
|
+
if (this._lastHoveredNode) {
|
|
1943
|
+
this._mouseLeaveNode();
|
|
1944
|
+
this._lastInteraction = Date.now();
|
|
1945
|
+
this._lastHoveredNode = null;
|
|
1946
|
+
this.notifyCallback();
|
|
1947
|
+
}
|
|
1948
|
+
return;
|
|
1949
|
+
}
|
|
1950
|
+
if (info.object.isNode) {
|
|
1951
|
+
const isSameNode = this._lastHoveredNode && this._lastHoveredNode.id === info.object.id;
|
|
1952
|
+
if (isSameNode) {
|
|
1953
|
+
return;
|
|
1954
|
+
}
|
|
1955
|
+
if (this._lastHoveredNode) {
|
|
1956
|
+
this._mouseLeaveNode();
|
|
1957
|
+
}
|
|
1958
|
+
this._mouseEnterNode(info);
|
|
1959
|
+
this._lastInteraction = Date.now();
|
|
1960
|
+
this._lastHoveredNode = info.object;
|
|
1961
|
+
this.notifyCallback();
|
|
1962
|
+
}
|
|
1963
|
+
if (info.object.isEdge && this.edgeEvents.onHover) {
|
|
1964
|
+
this.edgeEvents.onHover(info);
|
|
1965
|
+
}
|
|
1966
|
+
}
|
|
1967
|
+
onDragStart(info, event) {
|
|
1968
|
+
if (this.nodeEvents.onDragStart) {
|
|
1969
|
+
this.nodeEvents.onDragStart(info);
|
|
1970
|
+
}
|
|
1971
|
+
}
|
|
1972
|
+
onDrag(info, event) {
|
|
1973
|
+
if (!info.object.isNode || !this.enableDragging) {
|
|
1974
|
+
return;
|
|
1975
|
+
}
|
|
1976
|
+
event.stopImmediatePropagation();
|
|
1977
|
+
const coordinates = info.layer.context.viewport.unproject([info.x, info.y]);
|
|
1978
|
+
const bounds = info.layer.context.viewport.getBounds();
|
|
1979
|
+
const x = Math.min(Math.max(coordinates[0], bounds[0]), bounds[2]);
|
|
1980
|
+
const y = Math.min(Math.max(coordinates[1], bounds[1]), bounds[3]);
|
|
1981
|
+
this.engine.lockNodePosition(info.object, x, y);
|
|
1982
|
+
setNodeState(info.object, NODE_STATE.DRAGGING);
|
|
1983
|
+
this._lastInteraction = Date.now();
|
|
1984
|
+
this.notifyCallback();
|
|
1985
|
+
if (this.nodeEvents.onDrag) {
|
|
1986
|
+
this.nodeEvents.onDrag(info);
|
|
1987
|
+
}
|
|
1988
|
+
}
|
|
1989
|
+
onDragEnd(info, event) {
|
|
1990
|
+
if (!info.object.isNode || !this.enableDragging) {
|
|
1991
|
+
return;
|
|
1992
|
+
}
|
|
1993
|
+
if (this.resumeLayoutAfterDragging) {
|
|
1994
|
+
this.engine.resume();
|
|
1995
|
+
}
|
|
1996
|
+
setNodeState(info.object, NODE_STATE.DEFAULT);
|
|
1997
|
+
this.engine.unlockNodePosition(info.object);
|
|
1998
|
+
}
|
|
1999
|
+
};
|
|
2000
|
+
|
|
2001
|
+
// dist/layers/node-layers/circle-layer.js
|
|
2002
|
+
var import_core = require("@deck.gl/core");
|
|
2003
|
+
var import_layers = require("@deck.gl/layers");
|
|
2004
|
+
var CircleLayer = class extends import_core.CompositeLayer {
|
|
2005
|
+
renderLayers() {
|
|
2006
|
+
const { data, getPosition, stylesheet, positionUpdateTrigger = 0 } = this.props;
|
|
2007
|
+
return [
|
|
2008
|
+
new import_layers.ScatterplotLayer(this.getSubLayerProps({
|
|
2009
|
+
id: "__scatterplot-layer",
|
|
2010
|
+
data,
|
|
2011
|
+
getPosition,
|
|
2012
|
+
...stylesheet.getDeckGLAccessors(),
|
|
2013
|
+
updateTriggers: {
|
|
2014
|
+
getPosition: positionUpdateTrigger,
|
|
2015
|
+
...stylesheet.getDeckGLUpdateTriggers()
|
|
2016
|
+
}
|
|
2017
|
+
}))
|
|
2018
|
+
];
|
|
2019
|
+
}
|
|
2020
|
+
};
|
|
2021
|
+
__publicField(CircleLayer, "layerName", "CircleLayer");
|
|
2022
|
+
|
|
2023
|
+
// dist/layers/node-layers/image-layer.js
|
|
2024
|
+
var import_core2 = require("@deck.gl/core");
|
|
2025
|
+
var import_layers2 = require("@deck.gl/layers");
|
|
2026
|
+
var ImageLayer = class extends import_core2.CompositeLayer {
|
|
2027
|
+
renderLayers() {
|
|
2028
|
+
const { data, getPosition, stylesheet, positionUpdateTrigger = 0 } = this.props;
|
|
2029
|
+
return [
|
|
2030
|
+
new import_layers2.IconLayer(this.getSubLayerProps({
|
|
2031
|
+
id: "__icon-layer",
|
|
2032
|
+
data,
|
|
2033
|
+
getPosition,
|
|
2034
|
+
...stylesheet.getDeckGLAccessors(),
|
|
2035
|
+
updateTriggers: {
|
|
2036
|
+
getPosition: positionUpdateTrigger,
|
|
2037
|
+
...stylesheet.getDeckGLUpdateTriggers()
|
|
2038
|
+
}
|
|
2039
|
+
}))
|
|
2040
|
+
];
|
|
2041
|
+
}
|
|
2042
|
+
};
|
|
2043
|
+
__publicField(ImageLayer, "layerName", "ImageLayer");
|
|
2044
|
+
|
|
2045
|
+
// dist/layers/node-layers/label-layer.js
|
|
2046
|
+
var import_core4 = require("@deck.gl/core");
|
|
2047
|
+
|
|
2048
|
+
// dist/layers/common-layers/zoomable-text-layer/zoomable-text-layer.js
|
|
2049
|
+
var import_core3 = require("@deck.gl/core");
|
|
2050
|
+
var import_layers3 = require("@deck.gl/layers");
|
|
2051
|
+
var ZoomableTextLayer = class extends import_core3.CompositeLayer {
|
|
2052
|
+
initializeState() {
|
|
2053
|
+
this.state = { characterSet: [] };
|
|
2054
|
+
}
|
|
2055
|
+
shouldUpdateState({ props, changeFlags }) {
|
|
2056
|
+
const { scaleWithZoom } = this.props;
|
|
2057
|
+
if (!scaleWithZoom) {
|
|
2058
|
+
return changeFlags.dataChanged || changeFlags.propsChanged;
|
|
2059
|
+
}
|
|
2060
|
+
return changeFlags.dataChanged || changeFlags.propsChanged || changeFlags.viewportChanged;
|
|
2061
|
+
}
|
|
2062
|
+
updateState({ props, oldProps, changeFlags }) {
|
|
2063
|
+
super.updateState({ props, oldProps, changeFlags });
|
|
2064
|
+
if (changeFlags.propsOrDataChanged) {
|
|
2065
|
+
const { getText } = props;
|
|
2066
|
+
let textLabels = [];
|
|
2067
|
+
if (typeof getText === "function") {
|
|
2068
|
+
textLabels = props.data.map(getText);
|
|
2069
|
+
} else {
|
|
2070
|
+
textLabels = [getText];
|
|
2071
|
+
}
|
|
2072
|
+
const characterSet = new Set(textLabels.join(""));
|
|
2073
|
+
const uniqueCharacters = Array.from(characterSet);
|
|
2074
|
+
this.setState({ characterSet: uniqueCharacters });
|
|
2075
|
+
}
|
|
2076
|
+
}
|
|
2077
|
+
renderLayers() {
|
|
2078
|
+
const { data, getPosition, getColor: getColor2, getText, getSize, getTextAnchor, getAlignmentBaseline, getAngle, scaleWithZoom, updateTriggers, fontFamily, textWordUnits, textWordBreak, textMaxWidth, textSizeMinPixels } = this.props;
|
|
2079
|
+
const sizeUpdateTrigger = scaleWithZoom ? [getSize, this.context.viewport.zoom] : false;
|
|
2080
|
+
const newGetText = typeof getText === "function" ? getText : () => getText;
|
|
2081
|
+
return [
|
|
2082
|
+
new import_layers3.TextLayer(this.getSubLayerProps({
|
|
2083
|
+
id: "__text-layer",
|
|
2084
|
+
data,
|
|
2085
|
+
sizeScale: scaleWithZoom ? Math.pow(2, this.context.viewport.zoom - 1) : 1,
|
|
2086
|
+
characterSet: this.state.characterSet,
|
|
2087
|
+
getPosition,
|
|
2088
|
+
getColor: getColor2,
|
|
2089
|
+
getSize,
|
|
2090
|
+
getTextAnchor,
|
|
2091
|
+
getAlignmentBaseline,
|
|
2092
|
+
getAngle,
|
|
2093
|
+
getText: newGetText,
|
|
2094
|
+
maxWidth: textMaxWidth ?? 12,
|
|
2095
|
+
wordBreak: textWordBreak ?? "break-all",
|
|
2096
|
+
fontFamily: fontFamily ?? "Red Hat Text",
|
|
2097
|
+
wordUnits: textWordUnits ?? "pixels",
|
|
2098
|
+
sizeMinPixels: textSizeMinPixels ?? 9,
|
|
2099
|
+
updateTriggers: {
|
|
2100
|
+
getSize: sizeUpdateTrigger,
|
|
2101
|
+
getAngle: [sizeUpdateTrigger, updateTriggers.getPosition],
|
|
2102
|
+
...updateTriggers
|
|
2103
|
+
}
|
|
2104
|
+
}))
|
|
2105
|
+
];
|
|
2106
|
+
}
|
|
2107
|
+
};
|
|
2108
|
+
__publicField(ZoomableTextLayer, "layerName", "ZoomableTextLayer");
|
|
2109
|
+
|
|
2110
|
+
// dist/layers/node-layers/label-layer.js
|
|
2111
|
+
var LabelLayer = class extends import_core4.CompositeLayer {
|
|
2112
|
+
renderLayers() {
|
|
2113
|
+
const { data, getPosition, stylesheet, positionUpdateTrigger = 0 } = this.props;
|
|
2114
|
+
return [
|
|
2115
|
+
new ZoomableTextLayer(this.getSubLayerProps({
|
|
2116
|
+
id: "__text-layer",
|
|
2117
|
+
data,
|
|
2118
|
+
getPosition,
|
|
2119
|
+
...stylesheet.getDeckGLAccessors(),
|
|
2120
|
+
updateTriggers: {
|
|
2121
|
+
...stylesheet.getDeckGLUpdateTriggers(),
|
|
2122
|
+
getPosition: positionUpdateTrigger
|
|
2123
|
+
}
|
|
2124
|
+
}))
|
|
2125
|
+
];
|
|
2126
|
+
}
|
|
2127
|
+
};
|
|
2128
|
+
__publicField(LabelLayer, "layerName", "LabelLayer");
|
|
2129
|
+
|
|
2130
|
+
// dist/layers/node-layers/rectangle-layer.js
|
|
2131
|
+
var import_core5 = require("@deck.gl/core");
|
|
2132
|
+
var import_layers4 = require("@deck.gl/layers");
|
|
2133
|
+
var generateRectangle = (node, { getWidth, getHeight, getPosition }) => {
|
|
2134
|
+
const pos = getPosition(node);
|
|
2135
|
+
const width = typeof getWidth === "function" ? getWidth(node._data.label.length * 12) : getWidth;
|
|
2136
|
+
const height = typeof getWidth === "function" ? getHeight(node) : getHeight;
|
|
2137
|
+
const halfWidth = width / 2;
|
|
2138
|
+
const halfHeight = height / 2;
|
|
2139
|
+
return [
|
|
2140
|
+
[pos[0] - halfWidth, pos[1] - halfHeight],
|
|
2141
|
+
[pos[0] - halfWidth, pos[1] + halfHeight],
|
|
2142
|
+
[pos[0] + halfWidth, pos[1] + halfHeight],
|
|
2143
|
+
[pos[0] + halfWidth, pos[1] - halfHeight]
|
|
2144
|
+
];
|
|
2145
|
+
};
|
|
2146
|
+
var RectangleLayer = class extends import_core5.CompositeLayer {
|
|
2147
|
+
renderLayers() {
|
|
2148
|
+
const { data, getPosition, stylesheet, positionUpdateTrigger = 0 } = this.props;
|
|
2149
|
+
const getFillColor = stylesheet.getDeckGLAccessor("getFillColor");
|
|
2150
|
+
const getLineWidth = stylesheet.getDeckGLAccessor("getLineWidth");
|
|
2151
|
+
return [
|
|
2152
|
+
new import_layers4.PolygonLayer(this.getSubLayerProps({
|
|
2153
|
+
id: "__polygon-layer",
|
|
2154
|
+
data,
|
|
2155
|
+
getPolygon: (node) => generateRectangle(node, {
|
|
2156
|
+
getPosition,
|
|
2157
|
+
getWidth: stylesheet.getDeckGLAccessor("getWidth"),
|
|
2158
|
+
getHeight: stylesheet.getDeckGLAccessor("getHeight")
|
|
2159
|
+
}),
|
|
2160
|
+
filled: Boolean(getFillColor),
|
|
2161
|
+
jointRounded: true,
|
|
2162
|
+
stroked: Boolean(getLineWidth),
|
|
2163
|
+
...stylesheet.getDeckGLAccessors(),
|
|
2164
|
+
updateTriggers: {
|
|
2165
|
+
getPolygon: [
|
|
2166
|
+
positionUpdateTrigger,
|
|
2167
|
+
stylesheet.getDeckGLAccessorUpdateTrigger("getWidth"),
|
|
2168
|
+
stylesheet.getDeckGLAccessorUpdateTrigger("getHeight")
|
|
2169
|
+
],
|
|
2170
|
+
...stylesheet.getDeckGLUpdateTriggers()
|
|
2171
|
+
}
|
|
2172
|
+
}))
|
|
2173
|
+
];
|
|
2174
|
+
}
|
|
2175
|
+
};
|
|
2176
|
+
__publicField(RectangleLayer, "layerName", "RectangleLayer");
|
|
2177
|
+
|
|
2178
|
+
// dist/layers/node-layers/rounded-rectangle-layer-fragment.js
|
|
2179
|
+
var fs = (
|
|
2180
|
+
/* glsl */
|
|
2181
|
+
`#define SHADER_NAME rounded-rectangle-layer-fragment-shader
|
|
2182
|
+
|
|
2183
|
+
precision highp float;
|
|
2184
|
+
|
|
2185
|
+
uniform float cornerRadius;
|
|
2186
|
+
|
|
2187
|
+
varying vec4 vFillColor;
|
|
2188
|
+
varying vec2 unitPosition;
|
|
2189
|
+
|
|
2190
|
+
void main(void) {
|
|
2191
|
+
|
|
2192
|
+
float distToCenter = length(unitPosition);
|
|
2193
|
+
|
|
2194
|
+
/* Calculate the cutoff radius for the rounded corners */
|
|
2195
|
+
float threshold = sqrt(2.0) * (1.0 - cornerRadius) + 1.0 * cornerRadius;
|
|
2196
|
+
if (distToCenter <= threshold) {
|
|
2197
|
+
gl_FragColor = vFillColor;
|
|
2198
|
+
} else {
|
|
2199
|
+
discard;
|
|
2200
|
+
}
|
|
2201
|
+
|
|
2202
|
+
gl_FragColor = picking_filterHighlightColor(gl_FragColor);
|
|
2203
|
+
|
|
2204
|
+
gl_FragColor = picking_filterPickingColor(gl_FragColor);
|
|
2205
|
+
}
|
|
2206
|
+
`
|
|
2207
|
+
);
|
|
2208
|
+
|
|
2209
|
+
// dist/layers/node-layers/rounded-rectangle-layer.js
|
|
2210
|
+
var RoundedRectangleLayer = class extends RectangleLayer {
|
|
2211
|
+
draw({ uniforms }) {
|
|
2212
|
+
super.draw({
|
|
2213
|
+
uniforms: {
|
|
2214
|
+
...uniforms,
|
|
2215
|
+
cornerRadius: this.props.cornerRadius
|
|
2216
|
+
}
|
|
2217
|
+
});
|
|
2218
|
+
}
|
|
2219
|
+
getShaders() {
|
|
2220
|
+
return Object.assign({}, super.getShaders(void 0), {
|
|
2221
|
+
fs
|
|
2222
|
+
});
|
|
2223
|
+
}
|
|
2224
|
+
};
|
|
2225
|
+
__publicField(RoundedRectangleLayer, "layerName", "RoundedRectangleLayer");
|
|
2226
|
+
RoundedRectangleLayer.defaultProps = {
|
|
2227
|
+
// cornerRadius: the amount of rounding at the rectangle corners
|
|
2228
|
+
// 0 - rectangle. 1 - circle.
|
|
2229
|
+
cornerRadius: 0.1
|
|
2230
|
+
};
|
|
2231
|
+
|
|
2232
|
+
// dist/layers/node-layers/path-rounded-rectange-layer.js
|
|
2233
|
+
var import_core6 = require("@deck.gl/core");
|
|
2234
|
+
var import_layers5 = require("@deck.gl/layers");
|
|
2235
|
+
|
|
2236
|
+
// dist/utils/polygon-calculations.js
|
|
2237
|
+
function generateRoundedCorners(pos, width, height, radius, factor = 20) {
|
|
2238
|
+
const halfWidth = width / 2;
|
|
2239
|
+
const halfHeight = height / 2;
|
|
2240
|
+
const bottomLeft = { X: pos[0] - halfWidth, Y: pos[1] - halfHeight };
|
|
2241
|
+
const topLeft = { X: pos[0] - halfWidth, Y: pos[1] + halfHeight };
|
|
2242
|
+
const bottomRight = { X: pos[0] + halfWidth, Y: pos[1] - halfHeight };
|
|
2243
|
+
const topRight = { X: pos[0] + halfWidth, Y: pos[1] + halfHeight };
|
|
2244
|
+
const roundedPointsForBottomLeft = getRoundedCorner(bottomLeft, topLeft, bottomRight, radius, factor);
|
|
2245
|
+
const roundedPointsForTopLeft = getRoundedCorner(topLeft, topRight, bottomLeft, radius, factor).reverse();
|
|
2246
|
+
const roundedPointsForTopRight = getRoundedCorner(topRight, bottomRight, topLeft, radius, factor).reverse();
|
|
2247
|
+
const roundedPointsForBottomRight = getRoundedCorner(bottomRight, bottomLeft, topRight, radius, factor).reverse();
|
|
2248
|
+
const result = [
|
|
2249
|
+
...roundedPointsForBottomLeft,
|
|
2250
|
+
...roundedPointsForTopLeft,
|
|
2251
|
+
...roundedPointsForTopRight,
|
|
2252
|
+
...roundedPointsForBottomRight
|
|
2253
|
+
];
|
|
2254
|
+
return result;
|
|
2255
|
+
}
|
|
2256
|
+
function getRoundedCorner(angularPoint, p1, p2, radius, factor) {
|
|
2257
|
+
const dx1 = angularPoint.X - p1.X;
|
|
2258
|
+
const dy1 = angularPoint.Y - p1.Y;
|
|
2259
|
+
const dx2 = angularPoint.X - p2.X;
|
|
2260
|
+
const dy2 = angularPoint.Y - p2.Y;
|
|
2261
|
+
const angle = (Math.atan2(dy1, dx1) - Math.atan2(dy2, dx2)) / 2;
|
|
2262
|
+
const tan = Math.abs(Math.tan(angle));
|
|
2263
|
+
let segment = radius / tan;
|
|
2264
|
+
const length1 = getLength(dx1, dy1);
|
|
2265
|
+
const length2 = getLength(dx2, dy2);
|
|
2266
|
+
const length = Math.min(length1, length2);
|
|
2267
|
+
if (segment > length) {
|
|
2268
|
+
segment = length;
|
|
2269
|
+
radius = length * tan;
|
|
2270
|
+
}
|
|
2271
|
+
const p1Cross = getProportionPoint(angularPoint, segment, length1, dx1, dy1);
|
|
2272
|
+
const p2Cross = getProportionPoint(angularPoint, segment, length2, dx2, dy2);
|
|
2273
|
+
const dx = angularPoint.X * 2 - p1Cross.X - p2Cross.X;
|
|
2274
|
+
const dy = angularPoint.Y * 2 - p1Cross.Y - p2Cross.Y;
|
|
2275
|
+
const L = getLength(dx, dy);
|
|
2276
|
+
const d = getLength(segment, radius);
|
|
2277
|
+
const circlePoint = getProportionPoint(angularPoint, d, L, dx, dy);
|
|
2278
|
+
let startAngle = Math.atan2(p1Cross.Y - circlePoint.Y, p1Cross.X - circlePoint.X);
|
|
2279
|
+
const endAngle = Math.atan2(p2Cross.Y - circlePoint.Y, p2Cross.X - circlePoint.X);
|
|
2280
|
+
let sweepAngle = endAngle - startAngle;
|
|
2281
|
+
if (sweepAngle < 0) {
|
|
2282
|
+
startAngle = endAngle;
|
|
2283
|
+
sweepAngle = -sweepAngle;
|
|
2284
|
+
}
|
|
2285
|
+
if (sweepAngle > Math.PI)
|
|
2286
|
+
sweepAngle = Math.PI - sweepAngle;
|
|
2287
|
+
const degreeFactor = factor / Math.PI;
|
|
2288
|
+
return getPointsForArc(sweepAngle, degreeFactor, startAngle, circlePoint, radius);
|
|
2289
|
+
}
|
|
2290
|
+
function getLength(dx, dy) {
|
|
2291
|
+
return Math.sqrt(dx * dx + dy * dy);
|
|
2292
|
+
}
|
|
2293
|
+
function getProportionPoint(point, segment, length, dx, dy) {
|
|
2294
|
+
const factor = segment / length;
|
|
2295
|
+
return {
|
|
2296
|
+
X: point.X - dx * factor,
|
|
2297
|
+
Y: point.Y - dy * factor
|
|
2298
|
+
};
|
|
2299
|
+
}
|
|
2300
|
+
function getPointsForArc(sweepAngle, degreeFactor, startAngle, circlePoint, radius) {
|
|
2301
|
+
const pointsCount = Math.abs(sweepAngle * degreeFactor);
|
|
2302
|
+
const sign = Math.sign(sweepAngle);
|
|
2303
|
+
const points = [];
|
|
2304
|
+
for (let i = 0; i < pointsCount; ++i) {
|
|
2305
|
+
const pointX = circlePoint.X + Math.cos(startAngle + sign * i / degreeFactor) * radius;
|
|
2306
|
+
const pointY = circlePoint.Y + Math.sin(startAngle + sign * i / degreeFactor) * radius;
|
|
2307
|
+
const point = [pointX, pointY];
|
|
2308
|
+
points.push(point);
|
|
2309
|
+
}
|
|
2310
|
+
return points;
|
|
2311
|
+
}
|
|
2312
|
+
|
|
2313
|
+
// dist/layers/node-layers/path-rounded-rectange-layer.js
|
|
2314
|
+
var generateRoundedRectangle = (node, { getWidth, getHeight, getPosition, getCornerRadius }) => {
|
|
2315
|
+
const pos = getPosition(node);
|
|
2316
|
+
const width = typeof getWidth === "function" ? getWidth(node) : getWidth;
|
|
2317
|
+
const height = typeof getWidth === "function" ? getHeight(node) : getHeight;
|
|
2318
|
+
const cornerRadius = typeof getCornerRadius === "function" ? getCornerRadius(node) : getCornerRadius;
|
|
2319
|
+
const factor = 20;
|
|
2320
|
+
return generateRoundedCorners(pos, width, height, cornerRadius, factor);
|
|
2321
|
+
};
|
|
2322
|
+
var PathBasedRoundedRectangleLayer = class extends import_core6.CompositeLayer {
|
|
2323
|
+
renderLayers() {
|
|
2324
|
+
const { data, getPosition, stylesheet, positionUpdateTrigger = 0 } = this.props;
|
|
2325
|
+
const getFillColor = stylesheet.getDeckGLAccessor("getFillColor");
|
|
2326
|
+
const getLineWidth = stylesheet.getDeckGLAccessor("getLineWidth");
|
|
2327
|
+
return [
|
|
2328
|
+
new import_layers5.PolygonLayer(this.getSubLayerProps({
|
|
2329
|
+
id: "__polygon-layer",
|
|
2330
|
+
data,
|
|
2331
|
+
getPolygon: (node) => generateRoundedRectangle(node, {
|
|
2332
|
+
getPosition,
|
|
2333
|
+
getWidth: stylesheet.getDeckGLAccessor("getWidth"),
|
|
2334
|
+
getHeight: stylesheet.getDeckGLAccessor("getHeight"),
|
|
2335
|
+
getCornerRadius: stylesheet.getDeckGLAccessor("getCornerRadius")
|
|
2336
|
+
}),
|
|
2337
|
+
filled: Boolean(getFillColor),
|
|
2338
|
+
stroked: Boolean(getLineWidth),
|
|
2339
|
+
...stylesheet.getDeckGLAccessors(),
|
|
2340
|
+
updateTriggers: {
|
|
2341
|
+
getPolygon: [
|
|
2342
|
+
positionUpdateTrigger,
|
|
2343
|
+
stylesheet.getDeckGLAccessorUpdateTrigger("getWidth"),
|
|
2344
|
+
stylesheet.getDeckGLAccessorUpdateTrigger("getHeight"),
|
|
2345
|
+
stylesheet.getDeckGLAccessorUpdateTrigger("getCornerRadius")
|
|
2346
|
+
],
|
|
2347
|
+
...stylesheet.getDeckGLUpdateTriggers()
|
|
2348
|
+
}
|
|
2349
|
+
}))
|
|
2350
|
+
];
|
|
2351
|
+
}
|
|
2352
|
+
};
|
|
2353
|
+
__publicField(PathBasedRoundedRectangleLayer, "layerName", "PathBasedRoundedRectangleLayer");
|
|
2354
|
+
|
|
2355
|
+
// dist/layers/node-layers/zoomable-marker-layer.js
|
|
2356
|
+
var import_core8 = require("@deck.gl/core");
|
|
2357
|
+
|
|
2358
|
+
// dist/layers/common-layers/marker-layer/marker-layer.js
|
|
2359
|
+
var import_core7 = require("@deck.gl/core");
|
|
2360
|
+
var import_layers6 = require("@deck.gl/layers");
|
|
2361
|
+
|
|
2362
|
+
// dist/layers/common-layers/marker-layer/marker-mapping.js
|
|
2363
|
+
var MarkerMapping = {
|
|
2364
|
+
"bell-filled": {
|
|
2365
|
+
x: 0,
|
|
2366
|
+
y: 0,
|
|
2367
|
+
width: 32,
|
|
2368
|
+
height: 32,
|
|
2369
|
+
mask: true
|
|
2370
|
+
},
|
|
2371
|
+
bell: {
|
|
2372
|
+
x: 32,
|
|
2373
|
+
y: 0,
|
|
2374
|
+
width: 32,
|
|
2375
|
+
height: 32,
|
|
2376
|
+
mask: true
|
|
2377
|
+
},
|
|
2378
|
+
"bookmark-filled": {
|
|
2379
|
+
x: 0,
|
|
2380
|
+
y: 32,
|
|
2381
|
+
width: 32,
|
|
2382
|
+
height: 32,
|
|
2383
|
+
mask: true
|
|
2384
|
+
},
|
|
2385
|
+
bookmark: {
|
|
2386
|
+
x: 32,
|
|
2387
|
+
y: 32,
|
|
2388
|
+
width: 32,
|
|
2389
|
+
height: 32,
|
|
2390
|
+
mask: true
|
|
2391
|
+
},
|
|
2392
|
+
"cd-filled": {
|
|
2393
|
+
x: 64,
|
|
2394
|
+
y: 0,
|
|
2395
|
+
width: 32,
|
|
2396
|
+
height: 32,
|
|
2397
|
+
mask: true
|
|
2398
|
+
},
|
|
2399
|
+
cd: {
|
|
2400
|
+
x: 64,
|
|
2401
|
+
y: 32,
|
|
2402
|
+
width: 32,
|
|
2403
|
+
height: 32,
|
|
2404
|
+
mask: true
|
|
2405
|
+
},
|
|
2406
|
+
checkmark: {
|
|
2407
|
+
x: 0,
|
|
2408
|
+
y: 64,
|
|
2409
|
+
width: 32,
|
|
2410
|
+
height: 32,
|
|
2411
|
+
mask: true
|
|
2412
|
+
},
|
|
2413
|
+
"circle-check-filled": {
|
|
2414
|
+
x: 32,
|
|
2415
|
+
y: 64,
|
|
2416
|
+
width: 32,
|
|
2417
|
+
height: 32,
|
|
2418
|
+
mask: true
|
|
2419
|
+
},
|
|
2420
|
+
"circle-check": {
|
|
2421
|
+
x: 64,
|
|
2422
|
+
y: 64,
|
|
2423
|
+
width: 32,
|
|
2424
|
+
height: 32,
|
|
2425
|
+
mask: true
|
|
2426
|
+
},
|
|
2427
|
+
"circle-filled": {
|
|
2428
|
+
x: 96,
|
|
2429
|
+
y: 0,
|
|
2430
|
+
width: 32,
|
|
2431
|
+
height: 32,
|
|
2432
|
+
mask: true
|
|
2433
|
+
},
|
|
2434
|
+
"circle-i-filled": {
|
|
2435
|
+
x: 96,
|
|
2436
|
+
y: 32,
|
|
2437
|
+
width: 32,
|
|
2438
|
+
height: 32,
|
|
2439
|
+
mask: true
|
|
2440
|
+
},
|
|
2441
|
+
"circle-i": {
|
|
2442
|
+
x: 96,
|
|
2443
|
+
y: 64,
|
|
2444
|
+
width: 32,
|
|
2445
|
+
height: 32,
|
|
2446
|
+
mask: true
|
|
2447
|
+
},
|
|
2448
|
+
"circle-minus-filled": {
|
|
2449
|
+
x: 0,
|
|
2450
|
+
y: 96,
|
|
2451
|
+
width: 32,
|
|
2452
|
+
height: 32,
|
|
2453
|
+
mask: true
|
|
2454
|
+
},
|
|
2455
|
+
"circle-minus": {
|
|
2456
|
+
x: 32,
|
|
2457
|
+
y: 96,
|
|
2458
|
+
width: 32,
|
|
2459
|
+
height: 32,
|
|
2460
|
+
mask: true
|
|
2461
|
+
},
|
|
2462
|
+
"circle-plus-filled": {
|
|
2463
|
+
x: 64,
|
|
2464
|
+
y: 96,
|
|
2465
|
+
width: 32,
|
|
2466
|
+
height: 32,
|
|
2467
|
+
mask: true
|
|
2468
|
+
},
|
|
2469
|
+
"circle-plus": {
|
|
2470
|
+
x: 96,
|
|
2471
|
+
y: 96,
|
|
2472
|
+
width: 32,
|
|
2473
|
+
height: 32,
|
|
2474
|
+
mask: true
|
|
2475
|
+
},
|
|
2476
|
+
"circle-questionmark-filled": {
|
|
2477
|
+
x: 128,
|
|
2478
|
+
y: 0,
|
|
2479
|
+
width: 32,
|
|
2480
|
+
height: 32,
|
|
2481
|
+
mask: true
|
|
2482
|
+
},
|
|
2483
|
+
"circle-questionmark": {
|
|
2484
|
+
x: 128,
|
|
2485
|
+
y: 32,
|
|
2486
|
+
width: 32,
|
|
2487
|
+
height: 32,
|
|
2488
|
+
mask: true
|
|
2489
|
+
},
|
|
2490
|
+
"circle-slash-filled": {
|
|
2491
|
+
x: 128,
|
|
2492
|
+
y: 64,
|
|
2493
|
+
width: 32,
|
|
2494
|
+
height: 32,
|
|
2495
|
+
mask: true
|
|
2496
|
+
},
|
|
2497
|
+
"circle-slash": {
|
|
2498
|
+
x: 128,
|
|
2499
|
+
y: 96,
|
|
2500
|
+
width: 32,
|
|
2501
|
+
height: 32,
|
|
2502
|
+
mask: true
|
|
2503
|
+
},
|
|
2504
|
+
"circle-x-filled": {
|
|
2505
|
+
x: 0,
|
|
2506
|
+
y: 128,
|
|
2507
|
+
width: 32,
|
|
2508
|
+
height: 32,
|
|
2509
|
+
mask: true
|
|
2510
|
+
},
|
|
2511
|
+
"circle-x": {
|
|
2512
|
+
x: 32,
|
|
2513
|
+
y: 128,
|
|
2514
|
+
width: 32,
|
|
2515
|
+
height: 32,
|
|
2516
|
+
mask: true
|
|
2517
|
+
},
|
|
2518
|
+
circle: {
|
|
2519
|
+
x: 64,
|
|
2520
|
+
y: 128,
|
|
2521
|
+
width: 32,
|
|
2522
|
+
height: 32,
|
|
2523
|
+
mask: true
|
|
2524
|
+
},
|
|
2525
|
+
"diamond-filled": {
|
|
2526
|
+
x: 96,
|
|
2527
|
+
y: 128,
|
|
2528
|
+
width: 32,
|
|
2529
|
+
height: 32,
|
|
2530
|
+
mask: true
|
|
2531
|
+
},
|
|
2532
|
+
diamond: {
|
|
2533
|
+
x: 128,
|
|
2534
|
+
y: 128,
|
|
2535
|
+
width: 32,
|
|
2536
|
+
height: 32,
|
|
2537
|
+
mask: true
|
|
2538
|
+
},
|
|
2539
|
+
"flag-filled": {
|
|
2540
|
+
x: 160,
|
|
2541
|
+
y: 0,
|
|
2542
|
+
width: 32,
|
|
2543
|
+
height: 32,
|
|
2544
|
+
mask: true
|
|
2545
|
+
},
|
|
2546
|
+
flag: {
|
|
2547
|
+
x: 160,
|
|
2548
|
+
y: 32,
|
|
2549
|
+
width: 32,
|
|
2550
|
+
height: 32,
|
|
2551
|
+
mask: true
|
|
2552
|
+
},
|
|
2553
|
+
gear: {
|
|
2554
|
+
x: 160,
|
|
2555
|
+
y: 64,
|
|
2556
|
+
width: 32,
|
|
2557
|
+
height: 32,
|
|
2558
|
+
mask: true
|
|
2559
|
+
},
|
|
2560
|
+
"heart-filled": {
|
|
2561
|
+
x: 160,
|
|
2562
|
+
y: 96,
|
|
2563
|
+
width: 32,
|
|
2564
|
+
height: 32,
|
|
2565
|
+
mask: true
|
|
2566
|
+
},
|
|
2567
|
+
heart: {
|
|
2568
|
+
x: 160,
|
|
2569
|
+
y: 128,
|
|
2570
|
+
width: 32,
|
|
2571
|
+
height: 32,
|
|
2572
|
+
mask: true
|
|
2573
|
+
},
|
|
2574
|
+
"location-marker-filled": {
|
|
2575
|
+
x: 0,
|
|
2576
|
+
y: 160,
|
|
2577
|
+
width: 32,
|
|
2578
|
+
height: 32,
|
|
2579
|
+
mask: true
|
|
2580
|
+
},
|
|
2581
|
+
"location-marker": {
|
|
2582
|
+
x: 32,
|
|
2583
|
+
y: 160,
|
|
2584
|
+
width: 32,
|
|
2585
|
+
height: 32,
|
|
2586
|
+
mask: true
|
|
2587
|
+
},
|
|
2588
|
+
"octagonal-star-filled": {
|
|
2589
|
+
x: 64,
|
|
2590
|
+
y: 160,
|
|
2591
|
+
width: 32,
|
|
2592
|
+
height: 32,
|
|
2593
|
+
mask: true
|
|
2594
|
+
},
|
|
2595
|
+
"octagonal-star": {
|
|
2596
|
+
x: 96,
|
|
2597
|
+
y: 160,
|
|
2598
|
+
width: 32,
|
|
2599
|
+
height: 32,
|
|
2600
|
+
mask: true
|
|
2601
|
+
},
|
|
2602
|
+
"person-filled": {
|
|
2603
|
+
x: 128,
|
|
2604
|
+
y: 160,
|
|
2605
|
+
width: 32,
|
|
2606
|
+
height: 32,
|
|
2607
|
+
mask: true
|
|
2608
|
+
},
|
|
2609
|
+
person: {
|
|
2610
|
+
x: 160,
|
|
2611
|
+
y: 160,
|
|
2612
|
+
width: 32,
|
|
2613
|
+
height: 32,
|
|
2614
|
+
mask: true
|
|
2615
|
+
},
|
|
2616
|
+
"pin-filled": {
|
|
2617
|
+
x: 192,
|
|
2618
|
+
y: 0,
|
|
2619
|
+
width: 32,
|
|
2620
|
+
height: 32,
|
|
2621
|
+
mask: true
|
|
2622
|
+
},
|
|
2623
|
+
pin: {
|
|
2624
|
+
x: 192,
|
|
2625
|
+
y: 32,
|
|
2626
|
+
width: 32,
|
|
2627
|
+
height: 32,
|
|
2628
|
+
mask: true
|
|
2629
|
+
},
|
|
2630
|
+
"plus-small": {
|
|
2631
|
+
x: 192,
|
|
2632
|
+
y: 64,
|
|
2633
|
+
width: 32,
|
|
2634
|
+
height: 32,
|
|
2635
|
+
mask: true
|
|
2636
|
+
},
|
|
2637
|
+
plus: {
|
|
2638
|
+
x: 192,
|
|
2639
|
+
y: 96,
|
|
2640
|
+
width: 32,
|
|
2641
|
+
height: 32,
|
|
2642
|
+
mask: true
|
|
2643
|
+
},
|
|
2644
|
+
"rectangle-filled": {
|
|
2645
|
+
x: 192,
|
|
2646
|
+
y: 128,
|
|
2647
|
+
width: 32,
|
|
2648
|
+
height: 32,
|
|
2649
|
+
mask: true
|
|
2650
|
+
},
|
|
2651
|
+
rectangle: {
|
|
2652
|
+
x: 192,
|
|
2653
|
+
y: 160,
|
|
2654
|
+
width: 32,
|
|
2655
|
+
height: 32,
|
|
2656
|
+
mask: true
|
|
2657
|
+
},
|
|
2658
|
+
"star-filled": {
|
|
2659
|
+
x: 0,
|
|
2660
|
+
y: 192,
|
|
2661
|
+
width: 32,
|
|
2662
|
+
height: 32,
|
|
2663
|
+
mask: true
|
|
2664
|
+
},
|
|
2665
|
+
star: {
|
|
2666
|
+
x: 32,
|
|
2667
|
+
y: 192,
|
|
2668
|
+
width: 32,
|
|
2669
|
+
height: 32,
|
|
2670
|
+
mask: true
|
|
2671
|
+
},
|
|
2672
|
+
"tag-filled": {
|
|
2673
|
+
x: 64,
|
|
2674
|
+
y: 192,
|
|
2675
|
+
width: 32,
|
|
2676
|
+
height: 32,
|
|
2677
|
+
mask: true
|
|
2678
|
+
},
|
|
2679
|
+
tag: {
|
|
2680
|
+
x: 96,
|
|
2681
|
+
y: 192,
|
|
2682
|
+
width: 32,
|
|
2683
|
+
height: 32,
|
|
2684
|
+
mask: true
|
|
2685
|
+
},
|
|
2686
|
+
"thumb-down-filled": {
|
|
2687
|
+
x: 128,
|
|
2688
|
+
y: 192,
|
|
2689
|
+
width: 32,
|
|
2690
|
+
height: 32,
|
|
2691
|
+
mask: true
|
|
2692
|
+
},
|
|
2693
|
+
"thumb-down": {
|
|
2694
|
+
x: 160,
|
|
2695
|
+
y: 192,
|
|
2696
|
+
width: 32,
|
|
2697
|
+
height: 32,
|
|
2698
|
+
mask: true
|
|
2699
|
+
},
|
|
2700
|
+
"thumb-up": {
|
|
2701
|
+
x: 192,
|
|
2702
|
+
y: 192,
|
|
2703
|
+
width: 32,
|
|
2704
|
+
height: 32,
|
|
2705
|
+
mask: true
|
|
2706
|
+
},
|
|
2707
|
+
"thumb_up-filled": {
|
|
2708
|
+
x: 224,
|
|
2709
|
+
y: 0,
|
|
2710
|
+
width: 32,
|
|
2711
|
+
height: 32,
|
|
2712
|
+
mask: true
|
|
2713
|
+
},
|
|
2714
|
+
"triangle-down-filled": {
|
|
2715
|
+
x: 224,
|
|
2716
|
+
y: 32,
|
|
2717
|
+
width: 32,
|
|
2718
|
+
height: 32,
|
|
2719
|
+
mask: true
|
|
2720
|
+
},
|
|
2721
|
+
"triangle-down": {
|
|
2722
|
+
x: 224,
|
|
2723
|
+
y: 64,
|
|
2724
|
+
width: 32,
|
|
2725
|
+
height: 32,
|
|
2726
|
+
mask: true
|
|
2727
|
+
},
|
|
2728
|
+
"triangle-left-filled": {
|
|
2729
|
+
x: 224,
|
|
2730
|
+
y: 96,
|
|
2731
|
+
width: 32,
|
|
2732
|
+
height: 32,
|
|
2733
|
+
mask: true
|
|
2734
|
+
},
|
|
2735
|
+
"triangle-left": {
|
|
2736
|
+
x: 224,
|
|
2737
|
+
y: 128,
|
|
2738
|
+
width: 32,
|
|
2739
|
+
height: 32,
|
|
2740
|
+
mask: true
|
|
2741
|
+
},
|
|
2742
|
+
"triangle-right-filled": {
|
|
2743
|
+
x: 224,
|
|
2744
|
+
y: 160,
|
|
2745
|
+
width: 32,
|
|
2746
|
+
height: 32,
|
|
2747
|
+
mask: true
|
|
2748
|
+
},
|
|
2749
|
+
"triangle-right": {
|
|
2750
|
+
x: 224,
|
|
2751
|
+
y: 192,
|
|
2752
|
+
width: 32,
|
|
2753
|
+
height: 32,
|
|
2754
|
+
mask: true
|
|
2755
|
+
},
|
|
2756
|
+
"triangle-up-filled": {
|
|
2757
|
+
x: 0,
|
|
2758
|
+
y: 224,
|
|
2759
|
+
width: 32,
|
|
2760
|
+
height: 32,
|
|
2761
|
+
mask: true
|
|
2762
|
+
},
|
|
2763
|
+
"triangle-up": {
|
|
2764
|
+
x: 32,
|
|
2765
|
+
y: 224,
|
|
2766
|
+
width: 32,
|
|
2767
|
+
height: 32,
|
|
2768
|
+
mask: true
|
|
2769
|
+
},
|
|
2770
|
+
"x-small": {
|
|
2771
|
+
x: 64,
|
|
2772
|
+
y: 224,
|
|
2773
|
+
width: 32,
|
|
2774
|
+
height: 32,
|
|
2775
|
+
mask: true
|
|
2776
|
+
},
|
|
2777
|
+
x: {
|
|
2778
|
+
x: 96,
|
|
2779
|
+
y: 224,
|
|
2780
|
+
width: 32,
|
|
2781
|
+
height: 32,
|
|
2782
|
+
mask: true
|
|
2783
|
+
}
|
|
2784
|
+
};
|
|
2785
|
+
|
|
2786
|
+
// dist/layers/common-layers/marker-layer/atlas-data-url.js
|
|
2787
|
+
var AtlasDataURL = {
|
|
2788
|
+
dataURL: "data:image/png;base64,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"
|
|
2789
|
+
};
|
|
2790
|
+
|
|
2791
|
+
// dist/layers/common-layers/marker-layer/marker-layer.js
|
|
2792
|
+
var MarkerLayer = class extends import_core7.CompositeLayer {
|
|
2793
|
+
renderLayers() {
|
|
2794
|
+
const { getMarker, ...otherProps } = this.props;
|
|
2795
|
+
return [
|
|
2796
|
+
new import_layers6.IconLayer(this.getSubLayerProps({
|
|
2797
|
+
id: "marker-layer",
|
|
2798
|
+
iconAtlas: AtlasDataURL.dataURL,
|
|
2799
|
+
iconMapping: MarkerMapping,
|
|
2800
|
+
getIcon: getMarker,
|
|
2801
|
+
...otherProps
|
|
2802
|
+
}))
|
|
2803
|
+
];
|
|
2804
|
+
}
|
|
2805
|
+
};
|
|
2806
|
+
__publicField(MarkerLayer, "layerName", "MarkerLayer");
|
|
2807
|
+
__publicField(MarkerLayer, "defaultProps", {
|
|
2808
|
+
id: "MarkerLayer",
|
|
2809
|
+
data: [],
|
|
2810
|
+
getMarker: (d) => d.marker,
|
|
2811
|
+
getColor: (d) => [0, 0, 0],
|
|
2812
|
+
getSize: (d) => 10
|
|
2813
|
+
});
|
|
2814
|
+
|
|
2815
|
+
// dist/layers/node-layers/zoomable-marker-layer.js
|
|
2816
|
+
var ZoomableMarkerLayer = class extends import_core8.CompositeLayer {
|
|
2817
|
+
shouldUpdateState({ props, changeFlags }) {
|
|
2818
|
+
const { stylesheet } = this.props;
|
|
2819
|
+
const scaleWithZoom = stylesheet.getDeckGLAccessor("scaleWithZoom");
|
|
2820
|
+
if (!scaleWithZoom) {
|
|
2821
|
+
return changeFlags.somethingChanged;
|
|
2822
|
+
}
|
|
2823
|
+
return changeFlags.somethingChanged || changeFlags.viewportChanged;
|
|
2824
|
+
}
|
|
2825
|
+
renderLayers() {
|
|
2826
|
+
const { data, getPosition, stylesheet, positionUpdateTrigger = 0 } = this.props;
|
|
2827
|
+
const getSize = stylesheet.getDeckGLAccessor("getSize");
|
|
2828
|
+
const scaleWithZoom = stylesheet.getDeckGLAccessor("scaleWithZoom");
|
|
2829
|
+
const sizeUpdateTrigger = scaleWithZoom ? [getSize, this.context.viewport.zoom] : false;
|
|
2830
|
+
const oiginalGetMarker = stylesheet.getDeckGLAccessor("getMarker");
|
|
2831
|
+
const getMarker = typeof oiginalGetMarker === "function" ? oiginalGetMarker : () => oiginalGetMarker;
|
|
2832
|
+
return [
|
|
2833
|
+
new MarkerLayer(this.getSubLayerProps({
|
|
2834
|
+
id: "zoomable-marker-layer",
|
|
2835
|
+
data,
|
|
2836
|
+
getPosition,
|
|
2837
|
+
sizeScale: scaleWithZoom ? Math.max(0, this.context.viewport.zoom) : 1,
|
|
2838
|
+
...stylesheet.getDeckGLAccessors(),
|
|
2839
|
+
getMarker,
|
|
2840
|
+
updateTriggers: {
|
|
2841
|
+
...stylesheet.getDeckGLUpdateTriggers(),
|
|
2842
|
+
getPosition: positionUpdateTrigger,
|
|
2843
|
+
getSize: sizeUpdateTrigger
|
|
2844
|
+
}
|
|
2845
|
+
}))
|
|
2846
|
+
];
|
|
2847
|
+
}
|
|
2848
|
+
};
|
|
2849
|
+
__publicField(ZoomableMarkerLayer, "layerName", "ZoomableMarkerLayer");
|
|
2850
|
+
|
|
2851
|
+
// dist/layers/edge-layer.js
|
|
2852
|
+
var import_core13 = require("@deck.gl/core");
|
|
2853
|
+
|
|
2854
|
+
// dist/layers/edge-layers/straight-line-edge-layer.js
|
|
2855
|
+
var import_core9 = require("@deck.gl/core");
|
|
2856
|
+
var import_layers7 = require("@deck.gl/layers");
|
|
2857
|
+
var StraightLineEdgeLayer = class extends import_core9.CompositeLayer {
|
|
2858
|
+
renderLayers() {
|
|
2859
|
+
const { data, getLayoutInfo, positionUpdateTrigger = 0, colorUpdateTrigger = 0, widthUpdateTrigger = 0, ...otherProps } = this.props;
|
|
2860
|
+
return [
|
|
2861
|
+
new import_layers7.LineLayer(this.getSubLayerProps({
|
|
2862
|
+
id: "__line-layer",
|
|
2863
|
+
data,
|
|
2864
|
+
getSourcePosition: (e) => getLayoutInfo(e).sourcePosition,
|
|
2865
|
+
getTargetPosition: (e) => getLayoutInfo(e).targetPosition,
|
|
2866
|
+
updateTriggers: {
|
|
2867
|
+
getColor: colorUpdateTrigger,
|
|
2868
|
+
getSourcePosition: positionUpdateTrigger,
|
|
2869
|
+
getTargetPosition: positionUpdateTrigger,
|
|
2870
|
+
getWidth: widthUpdateTrigger
|
|
2871
|
+
},
|
|
2872
|
+
...otherProps
|
|
2873
|
+
}))
|
|
2874
|
+
];
|
|
2875
|
+
}
|
|
2876
|
+
};
|
|
2877
|
+
__publicField(StraightLineEdgeLayer, "layerName", "StraightLineEdgeLayer");
|
|
2878
|
+
|
|
2879
|
+
// dist/layers/edge-layers/path-edge-layer.js
|
|
2880
|
+
var import_core10 = require("@deck.gl/core");
|
|
2881
|
+
var import_layers8 = require("@deck.gl/layers");
|
|
2882
|
+
var PathEdgeLayer = class extends import_core10.CompositeLayer {
|
|
2883
|
+
renderLayers() {
|
|
2884
|
+
const { data, getLayoutInfo, positionUpdateTrigger = 0, colorUpdateTrigger = 0, widthUpdateTrigger = 0, ...otherProps } = this.props;
|
|
2885
|
+
return [
|
|
2886
|
+
new import_layers8.PathLayer(this.getSubLayerProps({
|
|
2887
|
+
id: "__line-layer",
|
|
2888
|
+
data,
|
|
2889
|
+
getPath: (e) => {
|
|
2890
|
+
const { sourcePosition, targetPosition, controlPoints } = getLayoutInfo(e);
|
|
2891
|
+
return [sourcePosition, ...controlPoints, targetPosition];
|
|
2892
|
+
},
|
|
2893
|
+
updateTriggers: {
|
|
2894
|
+
getColor: colorUpdateTrigger,
|
|
2895
|
+
getPath: positionUpdateTrigger,
|
|
2896
|
+
getWidth: widthUpdateTrigger
|
|
2897
|
+
},
|
|
2898
|
+
...otherProps
|
|
2899
|
+
}))
|
|
2900
|
+
];
|
|
2901
|
+
}
|
|
2902
|
+
};
|
|
2903
|
+
__publicField(PathEdgeLayer, "layerName", "PathEdgeLayer");
|
|
2904
|
+
|
|
2905
|
+
// dist/layers/edge-layers/curved-edge-layer.js
|
|
2906
|
+
var import_core12 = require("@deck.gl/core");
|
|
2907
|
+
var import_layers10 = require("@deck.gl/layers");
|
|
2908
|
+
|
|
2909
|
+
// dist/layers/common-layers/spline-layer/spline-layer.js
|
|
2910
|
+
var import_core11 = require("@deck.gl/core");
|
|
2911
|
+
var import_layers9 = require("@deck.gl/layers");
|
|
2912
|
+
var import_cardinal_spline_js = require("cardinal-spline-js");
|
|
2913
|
+
var defaultProps = {
|
|
2914
|
+
id: "spline-layer",
|
|
2915
|
+
getData: (d) => d.points,
|
|
2916
|
+
getAngle: (x) => 0,
|
|
2917
|
+
fontSize: 24,
|
|
2918
|
+
coordinateSystem: import_core11.COORDINATE_SYSTEM.CARTESIAN,
|
|
2919
|
+
fp64: false
|
|
2920
|
+
};
|
|
2921
|
+
var SplineLayer = class extends import_core11.CompositeLayer {
|
|
2922
|
+
initializeState() {
|
|
2923
|
+
this.state = { typedEdgeData: [] };
|
|
2924
|
+
}
|
|
2925
|
+
shouldUpdateState({ changeFlags }) {
|
|
2926
|
+
return changeFlags.dataChanged || changeFlags.propsChanged;
|
|
2927
|
+
}
|
|
2928
|
+
updateState({ props, oldProps, changeFlags }) {
|
|
2929
|
+
super.updateState({ props, oldProps, changeFlags });
|
|
2930
|
+
if (changeFlags.dataChanged || changeFlags.propsChanged) {
|
|
2931
|
+
this.updateSplineData();
|
|
2932
|
+
}
|
|
2933
|
+
}
|
|
2934
|
+
updateSplineData() {
|
|
2935
|
+
const { data } = this.props;
|
|
2936
|
+
const paths = data.reduce((res, d) => {
|
|
2937
|
+
const sourcePosition = this.props.getSourcePosition(d);
|
|
2938
|
+
const targetPosition = this.props.getTargetPosition(d);
|
|
2939
|
+
const controlPoints = this.props.getControlPoints(d);
|
|
2940
|
+
const serializedControlPoints = controlPoints.toString().split(",");
|
|
2941
|
+
const points = (0, import_cardinal_spline_js.getCurvePoints)([...sourcePosition, ...serializedControlPoints, ...targetPosition], 0.5, 10);
|
|
2942
|
+
const path = [];
|
|
2943
|
+
for (let idx = 0; idx < points.length; idx += 2) {
|
|
2944
|
+
path.push([points[idx], points[idx + 1]]);
|
|
2945
|
+
}
|
|
2946
|
+
res.push(path);
|
|
2947
|
+
return res;
|
|
2948
|
+
}, []);
|
|
2949
|
+
this.setState({ paths });
|
|
2950
|
+
}
|
|
2951
|
+
renderLayers() {
|
|
2952
|
+
const { coordinateSystem, getColor: getColor2, getWidth, id, updateTriggers } = this.props;
|
|
2953
|
+
const { paths } = this.state;
|
|
2954
|
+
return new import_layers9.PathLayer({
|
|
2955
|
+
id: `${id}-splines`,
|
|
2956
|
+
data: paths,
|
|
2957
|
+
getPath: (d) => d,
|
|
2958
|
+
getColor: getColor2,
|
|
2959
|
+
getWidth,
|
|
2960
|
+
coordinateSystem,
|
|
2961
|
+
updateTriggers
|
|
2962
|
+
});
|
|
2963
|
+
}
|
|
2964
|
+
};
|
|
2965
|
+
__publicField(SplineLayer, "layerName", "SplineLayer");
|
|
2966
|
+
SplineLayer.layerName = "SplineLayer";
|
|
2967
|
+
SplineLayer.defaultProps = defaultProps;
|
|
2968
|
+
|
|
2969
|
+
// dist/layers/edge-layers/curved-edge-layer.js
|
|
2970
|
+
var DEBUG = false;
|
|
2971
|
+
var CurvedEdgeLayer = class extends import_core12.CompositeLayer {
|
|
2972
|
+
// @ts-expect-error TODO
|
|
2973
|
+
renderLayers() {
|
|
2974
|
+
const { data, getLayoutInfo, positionUpdateTrigger = 0, colorUpdateTrigger = 0, widthUpdateTrigger = 0, ...otherProps } = this.props;
|
|
2975
|
+
return [
|
|
2976
|
+
DEBUG && new import_layers10.ScatterplotLayer(this.getSubLayerProps({
|
|
2977
|
+
id: "__control-points",
|
|
2978
|
+
data,
|
|
2979
|
+
getPosition: (e) => getLayoutInfo(e).controlPoints[0],
|
|
2980
|
+
getColor: (d) => [190, 190, 190, 150],
|
|
2981
|
+
getRadius: (d) => 5,
|
|
2982
|
+
updateTriggers: {
|
|
2983
|
+
getPosition: positionUpdateTrigger
|
|
2984
|
+
},
|
|
2985
|
+
...otherProps
|
|
2986
|
+
})),
|
|
2987
|
+
DEBUG && new import_layers10.LineLayer(this.getSubLayerProps({
|
|
2988
|
+
id: "__first_segment",
|
|
2989
|
+
data,
|
|
2990
|
+
getSourcePosition: (e) => getLayoutInfo(e).sourcePosition,
|
|
2991
|
+
getTargetPosition: (e) => getLayoutInfo(e).controlPoints[0],
|
|
2992
|
+
getColor: (e) => [210, 210, 210, 150],
|
|
2993
|
+
updateTriggers: {
|
|
2994
|
+
getSourcePosition: positionUpdateTrigger,
|
|
2995
|
+
getTargetPosition: positionUpdateTrigger
|
|
2996
|
+
},
|
|
2997
|
+
...otherProps
|
|
2998
|
+
})),
|
|
2999
|
+
DEBUG && new import_layers10.LineLayer(this.getSubLayerProps({
|
|
3000
|
+
id: "__last_segment",
|
|
3001
|
+
data,
|
|
3002
|
+
getSourcePosition: (e) => getLayoutInfo(e).controlPoints[0],
|
|
3003
|
+
getTargetPosition: (e) => getLayoutInfo(e).targetPosition,
|
|
3004
|
+
getColor: (e) => [210, 210, 210, 150],
|
|
3005
|
+
updateTriggers: {
|
|
3006
|
+
getSourcePosition: positionUpdateTrigger,
|
|
3007
|
+
getTargetPosition: positionUpdateTrigger
|
|
3008
|
+
},
|
|
3009
|
+
...otherProps
|
|
3010
|
+
})),
|
|
3011
|
+
new SplineLayer(this.getSubLayerProps({
|
|
3012
|
+
id: "__spline_layer",
|
|
3013
|
+
data,
|
|
3014
|
+
getSourcePosition: (e) => getLayoutInfo(e).sourcePosition,
|
|
3015
|
+
getTargetPosition: (e) => getLayoutInfo(e).targetPosition,
|
|
3016
|
+
getControlPoints: (e) => getLayoutInfo(e).controlPoints,
|
|
3017
|
+
updateTriggers: {
|
|
3018
|
+
getSourcePosition: positionUpdateTrigger,
|
|
3019
|
+
getTargetPosition: positionUpdateTrigger,
|
|
3020
|
+
getControlPoints: positionUpdateTrigger,
|
|
3021
|
+
getColor: colorUpdateTrigger,
|
|
3022
|
+
getWidth: widthUpdateTrigger
|
|
3023
|
+
},
|
|
3024
|
+
...otherProps
|
|
3025
|
+
}))
|
|
3026
|
+
];
|
|
3027
|
+
}
|
|
3028
|
+
};
|
|
3029
|
+
__publicField(CurvedEdgeLayer, "layerName", "CurvedEdgeLayer");
|
|
3030
|
+
|
|
3031
|
+
// dist/layers/edge-layer.js
|
|
3032
|
+
var EDGE_LAYER_MAP = {
|
|
3033
|
+
[EDGE_TYPE.LINE]: StraightLineEdgeLayer,
|
|
3034
|
+
[EDGE_TYPE.PATH]: PathEdgeLayer,
|
|
3035
|
+
[EDGE_TYPE.SPLINE_CURVE]: CurvedEdgeLayer
|
|
3036
|
+
};
|
|
3037
|
+
var EdgeLayer = class extends import_core13.CompositeLayer {
|
|
3038
|
+
updateState({ props, oldProps, changeFlags }) {
|
|
3039
|
+
super.updateState({ props, oldProps, changeFlags });
|
|
3040
|
+
if (changeFlags.dataChanged) {
|
|
3041
|
+
this.updateStateData();
|
|
3042
|
+
}
|
|
3043
|
+
}
|
|
3044
|
+
updateStateData() {
|
|
3045
|
+
const { data, getLayoutInfo } = this.props;
|
|
3046
|
+
const typedEdgeData = data.reduce((res, d) => {
|
|
3047
|
+
const { type } = getLayoutInfo(d);
|
|
3048
|
+
res[type].push(d);
|
|
3049
|
+
return res;
|
|
3050
|
+
}, {
|
|
3051
|
+
[EDGE_TYPE.LINE]: [],
|
|
3052
|
+
[EDGE_TYPE.PATH]: [],
|
|
3053
|
+
[EDGE_TYPE.SPLINE_CURVE]: []
|
|
3054
|
+
});
|
|
3055
|
+
this.setState({ typedEdgeData });
|
|
3056
|
+
}
|
|
3057
|
+
renderLayers() {
|
|
3058
|
+
const { getLayoutInfo, pickable, positionUpdateTrigger, stylesheet, id } = this.props;
|
|
3059
|
+
const { typedEdgeData } = this.state;
|
|
3060
|
+
return Object.entries(typedEdgeData).map((e, idx) => {
|
|
3061
|
+
const [type, edgeData] = e;
|
|
3062
|
+
const Layer = EDGE_LAYER_MAP[type];
|
|
3063
|
+
if (!Layer) {
|
|
3064
|
+
return null;
|
|
3065
|
+
}
|
|
3066
|
+
return new Layer({
|
|
3067
|
+
id: `${id}-${idx}`,
|
|
3068
|
+
data: edgeData,
|
|
3069
|
+
getLayoutInfo,
|
|
3070
|
+
getColor: stylesheet.getDeckGLAccessor("getColor"),
|
|
3071
|
+
getWidth: stylesheet.getDeckGLAccessor("getWidth"),
|
|
3072
|
+
colorUpdateTrigger: stylesheet.getDeckGLAccessorUpdateTrigger("getColor"),
|
|
3073
|
+
widthUpdateTrigger: stylesheet.getDeckGLAccessorUpdateTrigger("getWidth"),
|
|
3074
|
+
positionUpdateTrigger,
|
|
3075
|
+
pickable,
|
|
3076
|
+
coordinateSystem: import_core13.COORDINATE_SYSTEM.CARTESIAN,
|
|
3077
|
+
parameters: {
|
|
3078
|
+
depthCompare: "always"
|
|
3079
|
+
}
|
|
3080
|
+
});
|
|
3081
|
+
});
|
|
3082
|
+
}
|
|
3083
|
+
};
|
|
3084
|
+
__publicField(EdgeLayer, "layerName", "EdgeLayer");
|
|
3085
|
+
__publicField(EdgeLayer, "defaultProps", {
|
|
3086
|
+
data: [],
|
|
3087
|
+
pickable: true,
|
|
3088
|
+
getLayoutInfo: (d) => ({
|
|
3089
|
+
type: d.type,
|
|
3090
|
+
sourcePosition: d.sourcePosition,
|
|
3091
|
+
targetPosition: d.targetPosition,
|
|
3092
|
+
controlPoints: []
|
|
3093
|
+
}),
|
|
3094
|
+
positionUpdateTrigger: 0
|
|
3095
|
+
});
|
|
3096
|
+
|
|
3097
|
+
// dist/layers/edge-layers/edge-label-layer.js
|
|
3098
|
+
var import_core14 = require("@deck.gl/core");
|
|
3099
|
+
var EdgeLabelLayer = class extends import_core14.CompositeLayer {
|
|
3100
|
+
renderLayers() {
|
|
3101
|
+
const { data, getLayoutInfo, positionUpdateTrigger = 0, stylesheet } = this.props;
|
|
3102
|
+
return [
|
|
3103
|
+
new ZoomableTextLayer(this.getSubLayerProps({
|
|
3104
|
+
id: "edge-label-layer",
|
|
3105
|
+
data,
|
|
3106
|
+
getPosition: (e) => {
|
|
3107
|
+
const { sourcePosition, targetPosition, controlPoints = [] } = getLayoutInfo(e);
|
|
3108
|
+
const allPoints = [sourcePosition, targetPosition, ...controlPoints];
|
|
3109
|
+
const sumX = allPoints.reduce((res, p) => res + p[0], 0);
|
|
3110
|
+
const sumY = allPoints.reduce((res, p) => res + p[1], 0);
|
|
3111
|
+
return [sumX / allPoints.length, sumY / allPoints.length];
|
|
3112
|
+
},
|
|
3113
|
+
getAngle: (e) => {
|
|
3114
|
+
const { sourcePosition, targetPosition } = getLayoutInfo(e);
|
|
3115
|
+
const [newSourcePosition, newTargetPosition] = sourcePosition[0] < targetPosition[0] ? [sourcePosition, targetPosition] : [targetPosition, sourcePosition];
|
|
3116
|
+
const deltaX = newTargetPosition[0] - newSourcePosition[0];
|
|
3117
|
+
const deltaY = newTargetPosition[1] - newSourcePosition[1];
|
|
3118
|
+
return Math.atan2(deltaY, deltaX) * -180 / Math.PI;
|
|
3119
|
+
},
|
|
3120
|
+
...stylesheet.getDeckGLAccessors(),
|
|
3121
|
+
updateTriggers: {
|
|
3122
|
+
...stylesheet.getDeckGLUpdateTriggers(),
|
|
3123
|
+
getPosition: positionUpdateTrigger
|
|
3124
|
+
}
|
|
3125
|
+
}))
|
|
3126
|
+
];
|
|
3127
|
+
}
|
|
3128
|
+
};
|
|
3129
|
+
__publicField(EdgeLabelLayer, "layerName", "EdgeLabelLayer");
|
|
3130
|
+
|
|
3131
|
+
// dist/layers/edge-layers/flow-layer.js
|
|
3132
|
+
var import_core15 = require("@deck.gl/core");
|
|
3133
|
+
|
|
3134
|
+
// dist/layers/common-layers/flow-path-layer/flow-path-layer.js
|
|
3135
|
+
var import_layers11 = require("@deck.gl/layers");
|
|
3136
|
+
var import_global = require("global");
|
|
3137
|
+
|
|
3138
|
+
// dist/layers/common-layers/flow-path-layer/flow-path-layer-vertex.glsl.js
|
|
3139
|
+
var vs = (
|
|
3140
|
+
/* glsl */
|
|
3141
|
+
`#define SHADER_NAME flow-path-layer-vertex-shader
|
|
3142
|
+
|
|
3143
|
+
attribute vec3 positions;
|
|
3144
|
+
attribute vec3 instanceSourcePositions;
|
|
3145
|
+
attribute vec3 instanceTargetPositions;
|
|
3146
|
+
attribute vec4 instanceSourceTargetPositions64xyLow;
|
|
3147
|
+
attribute vec4 instanceColors;
|
|
3148
|
+
attribute vec3 instancePickingColors;
|
|
3149
|
+
attribute float instanceWidths;
|
|
3150
|
+
attribute float instanceSpeeds;
|
|
3151
|
+
attribute float instanceOffsets;
|
|
3152
|
+
attribute float instanceTailLengths;
|
|
3153
|
+
|
|
3154
|
+
uniform float opacity;
|
|
3155
|
+
uniform float widthScale;
|
|
3156
|
+
uniform float widthMinPixels;
|
|
3157
|
+
uniform float widthMaxPixels;
|
|
3158
|
+
|
|
3159
|
+
varying vec4 vColor;
|
|
3160
|
+
varying float segmentIndex;
|
|
3161
|
+
varying float speed;
|
|
3162
|
+
varying float pathLength;
|
|
3163
|
+
varying float tailLength;
|
|
3164
|
+
varying float offset;
|
|
3165
|
+
|
|
3166
|
+
// offset vector by strokeWidth pixels
|
|
3167
|
+
// offset_direction is -1 (left) or 1 (right)
|
|
3168
|
+
vec2 getExtrusionOffset(vec2 line_clipspace, float offset_direction, float width) {
|
|
3169
|
+
// normalized direction of the line
|
|
3170
|
+
vec2 dir_screenspace = normalize(line_clipspace * project_uViewportSize);
|
|
3171
|
+
// rotate by 90 degrees
|
|
3172
|
+
dir_screenspace = vec2(-dir_screenspace.y, dir_screenspace.x);
|
|
3173
|
+
|
|
3174
|
+
vec2 offset_screenspace = dir_screenspace * offset_direction * width / 2.0;
|
|
3175
|
+
vec2 offset_clipspace = project_pixel_size_to_clipspace(offset_screenspace);
|
|
3176
|
+
|
|
3177
|
+
return offset_clipspace;
|
|
3178
|
+
}
|
|
3179
|
+
|
|
3180
|
+
void main(void) {
|
|
3181
|
+
// Position
|
|
3182
|
+
vec4 source = project_position_to_clipspace(instanceSourcePositions, instanceSourceTargetPositions64xyLow.xy, vec3(0.));
|
|
3183
|
+
vec4 target = project_position_to_clipspace(instanceTargetPositions, instanceSourceTargetPositions64xyLow.zw, vec3(0.));
|
|
3184
|
+
|
|
3185
|
+
// Multiply out width and clamp to limits
|
|
3186
|
+
float widthPixels = clamp(
|
|
3187
|
+
project_size_to_pixel(instanceWidths * widthScale),
|
|
3188
|
+
widthMinPixels, widthMaxPixels
|
|
3189
|
+
);
|
|
3190
|
+
|
|
3191
|
+
// linear interpolation of source & target to pick right coord
|
|
3192
|
+
segmentIndex = positions.x;
|
|
3193
|
+
speed = instanceSpeeds;
|
|
3194
|
+
tailLength = project_size_to_pixel(instanceTailLengths * widthScale);
|
|
3195
|
+
offset = instanceOffsets;
|
|
3196
|
+
pathLength = distance(instanceSourcePositions, instanceTargetPositions);
|
|
3197
|
+
vec4 p = mix(source, target, segmentIndex);
|
|
3198
|
+
|
|
3199
|
+
// extrude
|
|
3200
|
+
vec2 offset = getExtrusionOffset(target.xy - source.xy, positions.y, widthPixels);
|
|
3201
|
+
gl_Position = p + vec4(offset, 0.0, 0.0);
|
|
3202
|
+
|
|
3203
|
+
// Color
|
|
3204
|
+
vColor = vec4(instanceColors.rgb, instanceColors.a * opacity) / 255.;
|
|
3205
|
+
|
|
3206
|
+
// Set color to be rendered to picking fbo (also used to check for selection highlight).
|
|
3207
|
+
picking_setPickingColor(instancePickingColors);
|
|
3208
|
+
}
|
|
3209
|
+
`
|
|
3210
|
+
);
|
|
3211
|
+
|
|
3212
|
+
// dist/layers/common-layers/flow-path-layer/flow-path-layer-fragment.glsl.js
|
|
3213
|
+
var fs2 = (
|
|
3214
|
+
/* glsl */
|
|
3215
|
+
`#define SHADER_NAME flow-path-layer-fragment-shader
|
|
3216
|
+
|
|
3217
|
+
precision highp float;
|
|
3218
|
+
|
|
3219
|
+
varying vec4 vColor;
|
|
3220
|
+
varying float segmentIndex;
|
|
3221
|
+
varying float speed;
|
|
3222
|
+
varying float offset;
|
|
3223
|
+
varying float pathLength;
|
|
3224
|
+
varying float tailLength;
|
|
3225
|
+
|
|
3226
|
+
void main(void) {
|
|
3227
|
+
gl_FragColor = vColor;
|
|
3228
|
+
|
|
3229
|
+
// use highlight color if this fragment belongs to the selected object.
|
|
3230
|
+
gl_FragColor = picking_filterHighlightColor(gl_FragColor);
|
|
3231
|
+
|
|
3232
|
+
// use picking color if rendering to picking FBO.
|
|
3233
|
+
gl_FragColor = picking_filterPickingColor(gl_FragColor);
|
|
3234
|
+
|
|
3235
|
+
if (speed == 0.0) {
|
|
3236
|
+
gl_FragColor = vec4(0.0, 0.0, 0.0, 0.0);
|
|
3237
|
+
} else {
|
|
3238
|
+
// the portion of the visible segment (0 to 1) , ex: 0.3
|
|
3239
|
+
// edge cases: pathLength = 0 or tailLength > pathLength
|
|
3240
|
+
float segFragment = 0.0;
|
|
3241
|
+
if (pathLength != 0.0) {
|
|
3242
|
+
segFragment = tailLength / pathLength;
|
|
3243
|
+
}
|
|
3244
|
+
if (tailLength > pathLength) {
|
|
3245
|
+
segFragment = 1.0;
|
|
3246
|
+
}
|
|
3247
|
+
float startSegmentIndex = mod(offset, 60.0) / 60.0;
|
|
3248
|
+
// the end offset, cap to 1.0 (end of the line)
|
|
3249
|
+
float endSegmentIndex = min(startSegmentIndex + segFragment, 1.0);
|
|
3250
|
+
if (segmentIndex < startSegmentIndex || segmentIndex > endSegmentIndex) {
|
|
3251
|
+
gl_FragColor = vec4(0.0, 0.0, 0.0, 0.0);
|
|
3252
|
+
} else {
|
|
3253
|
+
// fading tail
|
|
3254
|
+
float portion = (segmentIndex - startSegmentIndex) / segFragment;
|
|
3255
|
+
gl_FragColor[3] = portion;
|
|
3256
|
+
}
|
|
3257
|
+
}
|
|
3258
|
+
}
|
|
3259
|
+
`
|
|
3260
|
+
);
|
|
3261
|
+
|
|
3262
|
+
// dist/layers/common-layers/flow-path-layer/flow-path-layer.js
|
|
3263
|
+
var defaultProps2 = {
|
|
3264
|
+
...import_layers11.LineLayer.defaultProps,
|
|
3265
|
+
getWidth: { type: "accessor", value: 1 },
|
|
3266
|
+
getSpeed: { type: "accessor", value: 0 }
|
|
3267
|
+
};
|
|
3268
|
+
var FlowPathLayer = class extends import_layers11.LineLayer {
|
|
3269
|
+
getShaders() {
|
|
3270
|
+
const projectModule = this.use64bitPositions() ? "project64" : "project32";
|
|
3271
|
+
return { vs, fs: fs2, modules: [projectModule, "picking"] };
|
|
3272
|
+
}
|
|
3273
|
+
initializeState() {
|
|
3274
|
+
super.initializeState();
|
|
3275
|
+
this.getAttributeManager().addInstanced({
|
|
3276
|
+
instanceSpeeds: {
|
|
3277
|
+
size: 1,
|
|
3278
|
+
transition: true,
|
|
3279
|
+
accessor: "getSpeed",
|
|
3280
|
+
defaultValue: 0
|
|
3281
|
+
},
|
|
3282
|
+
instanceTailLengths: {
|
|
3283
|
+
size: 1,
|
|
3284
|
+
transition: true,
|
|
3285
|
+
accessor: "getTailLength",
|
|
3286
|
+
defaultValue: 1
|
|
3287
|
+
}
|
|
3288
|
+
});
|
|
3289
|
+
this.setupTransformFeedback();
|
|
3290
|
+
this.setState({
|
|
3291
|
+
...this.state,
|
|
3292
|
+
animation: import_global.window.requestAnimationFrame(this.animate.bind(this))
|
|
3293
|
+
});
|
|
3294
|
+
}
|
|
3295
|
+
animate() {
|
|
3296
|
+
const { transform } = this.state;
|
|
3297
|
+
if (transform) {
|
|
3298
|
+
transform.run();
|
|
3299
|
+
transform.swap();
|
|
3300
|
+
}
|
|
3301
|
+
this.setState({
|
|
3302
|
+
animation: import_global.window.requestAnimationFrame(this.animate.bind(this))
|
|
3303
|
+
});
|
|
3304
|
+
}
|
|
3305
|
+
updateState({ props, oldProps, changeFlags }) {
|
|
3306
|
+
super.updateState({ props, oldProps, changeFlags });
|
|
3307
|
+
const { speedsBuffer } = this.state;
|
|
3308
|
+
const speedChanged = changeFlags.dataChanged || props.fp64 !== oldProps.fp64 || changeFlags.updateTriggersChanged && (changeFlags.updateTriggersChanged.all || changeFlags.updateTriggersChanged.getSpeed);
|
|
3309
|
+
if (speedChanged) {
|
|
3310
|
+
const speeds = new Float32Array(props.data.length);
|
|
3311
|
+
for (let i = 0; i < props.data.length; i++) {
|
|
3312
|
+
speeds[i] = typeof props.getSpeed === "function" ? props.getSpeed(props.data[i]) : props.getSpeed;
|
|
3313
|
+
}
|
|
3314
|
+
speedsBuffer.subData({ data: speeds });
|
|
3315
|
+
}
|
|
3316
|
+
if (props.fp64 !== oldProps.fp64) {
|
|
3317
|
+
if (this.state.model) {
|
|
3318
|
+
this.state.model.delete();
|
|
3319
|
+
}
|
|
3320
|
+
this.setState({ model: this._getModel() });
|
|
3321
|
+
this.getAttributeManager().invalidateAll();
|
|
3322
|
+
}
|
|
3323
|
+
}
|
|
3324
|
+
finalizeState() {
|
|
3325
|
+
super.finalizeState(this.context);
|
|
3326
|
+
import_global.window.cancelAnimationFrame(this.state.animation);
|
|
3327
|
+
}
|
|
3328
|
+
setupTransformFeedback() {
|
|
3329
|
+
throw new Error("Not implemented");
|
|
3330
|
+
}
|
|
3331
|
+
draw({ uniforms }) {
|
|
3332
|
+
throw new Error("Not implemented");
|
|
3333
|
+
}
|
|
3334
|
+
};
|
|
3335
|
+
FlowPathLayer.layerName = "FlowPathLayer";
|
|
3336
|
+
FlowPathLayer.defaultProps = defaultProps2;
|
|
3337
|
+
|
|
3338
|
+
// dist/layers/edge-layers/flow-layer.js
|
|
3339
|
+
var FlowLayer = class extends import_core15.CompositeLayer {
|
|
3340
|
+
renderLayers() {
|
|
3341
|
+
const { data, getLayoutInfo, positionUpdateTrigger = 0, stylesheet } = this.props;
|
|
3342
|
+
return [
|
|
3343
|
+
new FlowPathLayer(this.getSubLayerProps({
|
|
3344
|
+
id: "__flow-layer",
|
|
3345
|
+
data,
|
|
3346
|
+
...stylesheet.getDeckGLAccessors(),
|
|
3347
|
+
getSourcePosition: (e) => getLayoutInfo(e).sourcePosition,
|
|
3348
|
+
getTargetPosition: (e) => getLayoutInfo(e).targetPosition,
|
|
3349
|
+
parameters: {
|
|
3350
|
+
depthTest: false
|
|
3351
|
+
},
|
|
3352
|
+
updateTriggers: {
|
|
3353
|
+
...stylesheet.getDeckGLUpdateTriggers(),
|
|
3354
|
+
getSourcePosition: positionUpdateTrigger,
|
|
3355
|
+
getTargetPosition: positionUpdateTrigger
|
|
3356
|
+
}
|
|
3357
|
+
}))
|
|
3358
|
+
];
|
|
3359
|
+
}
|
|
3360
|
+
};
|
|
3361
|
+
__publicField(FlowLayer, "layerName", "FlowLayer");
|
|
3362
|
+
|
|
3363
|
+
// dist/layers/graph-layer.js
|
|
3364
|
+
var NODE_LAYER_MAP = {
|
|
3365
|
+
[NODE_TYPE.RECTANGLE]: RectangleLayer,
|
|
3366
|
+
[NODE_TYPE.ROUNDED_RECTANGLE]: RoundedRectangleLayer,
|
|
3367
|
+
[NODE_TYPE.PATH_ROUNDED_RECTANGLE]: PathBasedRoundedRectangleLayer,
|
|
3368
|
+
[NODE_TYPE.ICON]: ImageLayer,
|
|
3369
|
+
[NODE_TYPE.CIRCLE]: CircleLayer,
|
|
3370
|
+
[NODE_TYPE.LABEL]: LabelLayer,
|
|
3371
|
+
[NODE_TYPE.MARKER]: ZoomableMarkerLayer
|
|
3372
|
+
};
|
|
3373
|
+
var EDGE_DECORATOR_LAYER_MAP = {
|
|
3374
|
+
[EDGE_DECORATOR_TYPE.LABEL]: EdgeLabelLayer,
|
|
3375
|
+
[EDGE_DECORATOR_TYPE.FLOW]: FlowLayer
|
|
3376
|
+
};
|
|
3377
|
+
var SHARED_LAYER_PROPS = {
|
|
3378
|
+
coordinateSystem: import_core16.COORDINATE_SYSTEM.CARTESIAN,
|
|
3379
|
+
parameters: {
|
|
3380
|
+
depthTest: false
|
|
3381
|
+
}
|
|
3382
|
+
};
|
|
3383
|
+
var defaultProps3 = {
|
|
3384
|
+
// an array of styles for layers
|
|
3385
|
+
nodeStyle: [],
|
|
3386
|
+
nodeEvents: {
|
|
3387
|
+
onMouseLeave: () => {
|
|
3388
|
+
},
|
|
3389
|
+
onHover: () => {
|
|
3390
|
+
},
|
|
3391
|
+
onMouseEnter: () => {
|
|
3392
|
+
},
|
|
3393
|
+
onClick: () => {
|
|
3394
|
+
},
|
|
3395
|
+
onDrag: () => {
|
|
3396
|
+
}
|
|
3397
|
+
},
|
|
3398
|
+
edgeStyle: {
|
|
3399
|
+
color: "black",
|
|
3400
|
+
strokeWidth: 1,
|
|
3401
|
+
// an array of styles for layers
|
|
3402
|
+
decorators: []
|
|
3403
|
+
},
|
|
3404
|
+
edgeEvents: {
|
|
3405
|
+
onClick: () => {
|
|
3406
|
+
},
|
|
3407
|
+
onHover: () => {
|
|
3408
|
+
}
|
|
3409
|
+
},
|
|
3410
|
+
enableDragging: false
|
|
3411
|
+
};
|
|
3412
|
+
var GraphLayer = class extends import_core16.CompositeLayer {
|
|
3413
|
+
forceUpdate = () => {
|
|
3414
|
+
if (this.context && this.context.layerManager) {
|
|
3415
|
+
this.setNeedsUpdate();
|
|
3416
|
+
this.setChangeFlags({ dataChanged: true });
|
|
3417
|
+
}
|
|
3418
|
+
};
|
|
3419
|
+
constructor(props) {
|
|
3420
|
+
super(props);
|
|
3421
|
+
props.engine.addEventListener("onLayoutChange", this.forceUpdate);
|
|
3422
|
+
}
|
|
3423
|
+
initializeState() {
|
|
3424
|
+
const interactionManager = new InteractionManager(this.props, () => this.forceUpdate());
|
|
3425
|
+
this.state = { interactionManager };
|
|
3426
|
+
}
|
|
3427
|
+
shouldUpdateState({ changeFlags }) {
|
|
3428
|
+
return changeFlags.dataChanged || changeFlags.propsChanged;
|
|
3429
|
+
}
|
|
3430
|
+
updateState({ props }) {
|
|
3431
|
+
this.state.interactionManager.updateProps(props);
|
|
3432
|
+
}
|
|
3433
|
+
finalize() {
|
|
3434
|
+
this.props.engine.removeEventListener("onLayoutChange", this.forceUpdate);
|
|
3435
|
+
}
|
|
3436
|
+
createNodeLayers() {
|
|
3437
|
+
const { engine, nodeStyle } = this.props;
|
|
3438
|
+
if (!nodeStyle || !Array.isArray(nodeStyle) || nodeStyle.length === 0) {
|
|
3439
|
+
return [];
|
|
3440
|
+
}
|
|
3441
|
+
return nodeStyle.filter(Boolean).map((style, idx) => {
|
|
3442
|
+
const { pickable = true, visible = true, data = (nodes) => nodes, ...restStyle } = style;
|
|
3443
|
+
const LayerType = NODE_LAYER_MAP[style.type];
|
|
3444
|
+
if (!LayerType) {
|
|
3445
|
+
log.error(`Invalid node type: ${style.type}`)();
|
|
3446
|
+
throw new Error(`Invalid node type: ${style.type}`);
|
|
3447
|
+
}
|
|
3448
|
+
const stylesheet = new Stylesheet(restStyle, {
|
|
3449
|
+
stateUpdateTrigger: this.state.interactionManager.getLastInteraction()
|
|
3450
|
+
});
|
|
3451
|
+
const getOffset2 = stylesheet.getDeckGLAccessor("getOffset");
|
|
3452
|
+
return new LayerType({
|
|
3453
|
+
...SHARED_LAYER_PROPS,
|
|
3454
|
+
id: `node-rule-${idx}`,
|
|
3455
|
+
data: data(engine.getNodes()),
|
|
3456
|
+
getPosition: mixedGetPosition(engine.getNodePosition, getOffset2),
|
|
3457
|
+
pickable,
|
|
3458
|
+
positionUpdateTrigger: [
|
|
3459
|
+
engine.getLayoutLastUpdate(),
|
|
3460
|
+
engine.getLayoutState(),
|
|
3461
|
+
stylesheet.getDeckGLAccessorUpdateTrigger("getOffset")
|
|
3462
|
+
].join(),
|
|
3463
|
+
stylesheet,
|
|
3464
|
+
visible
|
|
3465
|
+
});
|
|
3466
|
+
});
|
|
3467
|
+
}
|
|
3468
|
+
createEdgeLayers() {
|
|
3469
|
+
const { edgeStyle, engine } = this.props;
|
|
3470
|
+
if (!edgeStyle) {
|
|
3471
|
+
return [];
|
|
3472
|
+
}
|
|
3473
|
+
return (Array.isArray(edgeStyle) ? edgeStyle : [edgeStyle]).filter(Boolean).flatMap((style, idx) => {
|
|
3474
|
+
const { decorators, data = (edges) => edges, visible = true, ...restEdgeStyle } = style;
|
|
3475
|
+
const stylesheet = new Stylesheet({
|
|
3476
|
+
type: "Edge",
|
|
3477
|
+
...restEdgeStyle
|
|
3478
|
+
}, {
|
|
3479
|
+
stateUpdateTrigger: this.state.interactionManager.getLastInteraction()
|
|
3480
|
+
});
|
|
3481
|
+
const edgeLayer = new EdgeLayer({
|
|
3482
|
+
...SHARED_LAYER_PROPS,
|
|
3483
|
+
id: `edge-layer-${idx}`,
|
|
3484
|
+
data: data(engine.getEdges()),
|
|
3485
|
+
getLayoutInfo: engine.getEdgePosition,
|
|
3486
|
+
pickable: true,
|
|
3487
|
+
positionUpdateTrigger: [engine.getLayoutLastUpdate(), engine.getLayoutState()].join(),
|
|
3488
|
+
stylesheet,
|
|
3489
|
+
visible
|
|
3490
|
+
});
|
|
3491
|
+
if (!decorators || !Array.isArray(decorators) || decorators.length === 0) {
|
|
3492
|
+
return edgeLayer;
|
|
3493
|
+
}
|
|
3494
|
+
const decoratorLayers = decorators.filter(Boolean).flatMap((decoratorStyle, idx2) => {
|
|
3495
|
+
const DecoratorLayer = EDGE_DECORATOR_LAYER_MAP[decoratorStyle.type];
|
|
3496
|
+
if (!DecoratorLayer) {
|
|
3497
|
+
log.error(`Invalid edge decorator type: ${decoratorStyle.type}`)();
|
|
3498
|
+
throw new Error(`Invalid edge decorator type: ${decoratorStyle.type}`);
|
|
3499
|
+
}
|
|
3500
|
+
const decoratorStylesheet = new Stylesheet(decoratorStyle, {
|
|
3501
|
+
stateUpdateTrigger: this.state.interactionManager.getLastInteraction()
|
|
3502
|
+
});
|
|
3503
|
+
return new DecoratorLayer({
|
|
3504
|
+
...SHARED_LAYER_PROPS,
|
|
3505
|
+
id: `edge-decorator-${idx2}`,
|
|
3506
|
+
data: data(engine.getEdges()),
|
|
3507
|
+
getLayoutInfo: engine.getEdgePosition,
|
|
3508
|
+
pickable: true,
|
|
3509
|
+
positionUpdateTrigger: [engine.getLayoutLastUpdate(), engine.getLayoutState()].join(),
|
|
3510
|
+
stylesheet: decoratorStylesheet
|
|
3511
|
+
});
|
|
3512
|
+
});
|
|
3513
|
+
return [edgeLayer, decoratorLayers];
|
|
3514
|
+
});
|
|
3515
|
+
}
|
|
3516
|
+
onClick(info, event) {
|
|
3517
|
+
return this.state.interactionManager.onClick(info, event) || false;
|
|
3518
|
+
}
|
|
3519
|
+
onHover(info, event) {
|
|
3520
|
+
return this.state.interactionManager.onHover(info, event) || false;
|
|
3521
|
+
}
|
|
3522
|
+
onDragStart(info, event) {
|
|
3523
|
+
this.state.interactionManager.onDragStart(info, event);
|
|
3524
|
+
}
|
|
3525
|
+
onDrag(info, event) {
|
|
3526
|
+
this.state.interactionManager.onDrag(info, event);
|
|
3527
|
+
}
|
|
3528
|
+
onDragEnd(info, event) {
|
|
3529
|
+
this.state.interactionManager.onDragEnd(info, event);
|
|
3530
|
+
}
|
|
3531
|
+
renderLayers() {
|
|
3532
|
+
return [this.createEdgeLayers(), this.createNodeLayers()];
|
|
3533
|
+
}
|
|
3534
|
+
};
|
|
3535
|
+
__publicField(GraphLayer, "defaultProps", {
|
|
3536
|
+
pickable: true
|
|
3537
|
+
});
|
|
3538
|
+
GraphLayer.layerName = "GraphLayer";
|
|
3539
|
+
GraphLayer.defaultProps = defaultProps3;
|
|
3540
|
+
//# sourceMappingURL=index.cjs.map
|