@krainovsd/graph 0.14.0-beta.1 → 0.14.0-beta.3
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/lib/cjs/index.cjs +138 -135
- package/lib/cjs/index.cjs.map +1 -1
- package/lib/esm/module/GraphCanvas/GraphCanvas.js +138 -135
- package/lib/esm/module/GraphCanvas/GraphCanvas.js.map +1 -1
- package/lib/index.d.ts +22 -22
- package/package.json +1 -1
|
@@ -90,13 +90,13 @@ class GraphCanvas {
|
|
|
90
90
|
get dpi() {
|
|
91
91
|
return devicePixelRatio;
|
|
92
92
|
}
|
|
93
|
-
getData() {
|
|
93
|
+
getData = () => {
|
|
94
94
|
return {
|
|
95
95
|
links: this.links,
|
|
96
96
|
nodes: this.nodes,
|
|
97
97
|
};
|
|
98
|
-
}
|
|
99
|
-
fitToView(margin = this.graphSettings.zoomToFitMargin, duration = this.graphSettings.zoomAnimationDuration) {
|
|
98
|
+
};
|
|
99
|
+
fitToView = (margin = this.graphSettings.zoomToFitMargin, duration = this.graphSettings.zoomAnimationDuration) => {
|
|
100
100
|
const area = this.area;
|
|
101
101
|
if (!area)
|
|
102
102
|
return;
|
|
@@ -123,8 +123,8 @@ class GraphCanvas {
|
|
|
123
123
|
return;
|
|
124
124
|
}
|
|
125
125
|
this.animateZoom(area, target, this.areaTransform, duration);
|
|
126
|
-
}
|
|
127
|
-
focusOnNode(nodeId, scale = this.graphSettings.zoomToNodeScale, duration = this.graphSettings.zoomAnimationDuration) {
|
|
126
|
+
};
|
|
127
|
+
focusOnNode = (nodeId, scale = this.graphSettings.zoomToNodeScale, duration = this.graphSettings.zoomAnimationDuration) => {
|
|
128
128
|
const area = this.area;
|
|
129
129
|
if (!area)
|
|
130
130
|
return;
|
|
@@ -145,101 +145,17 @@ class GraphCanvas {
|
|
|
145
145
|
return;
|
|
146
146
|
}
|
|
147
147
|
this.animateZoom(area, target, this.areaTransform, duration);
|
|
148
|
-
}
|
|
149
|
-
|
|
150
|
-
let positive = true;
|
|
151
|
-
if (node && (this.highlightedNode !== node || !this.highlightPositive)) {
|
|
152
|
-
this.highlightedNode = node;
|
|
153
|
-
this.highlightedNeighbors = new Set(node.neighbors);
|
|
154
|
-
this.particles = [];
|
|
155
|
-
this.highlightedLink = null;
|
|
156
|
-
this.highlightStart = performance.now();
|
|
157
|
-
}
|
|
158
|
-
else if (link && (this.highlightedLink !== link || !this.highlightPositive)) {
|
|
159
|
-
const { sourceId, targetId } = extractLinkPointIds(link);
|
|
160
|
-
this.highlightProgress = 0;
|
|
161
|
-
this.highlightedLink = link;
|
|
162
|
-
this.highlightedNeighbors = new Set([sourceId, targetId]);
|
|
163
|
-
this.particles = [];
|
|
164
|
-
this.highlightedNode = null;
|
|
165
|
-
this.highlightStart = performance.now();
|
|
166
|
-
}
|
|
167
|
-
else if (!node && !link && this.highlightPositive) {
|
|
168
|
-
positive = false;
|
|
169
|
-
}
|
|
170
|
-
else {
|
|
171
|
-
return;
|
|
172
|
-
}
|
|
173
|
-
if (this.highlightController) {
|
|
174
|
-
this.highlightController.abort();
|
|
175
|
-
}
|
|
176
|
-
const controller = new AbortController();
|
|
177
|
-
this.highlightPositive = positive;
|
|
178
|
-
this.highlightController = controller;
|
|
179
|
-
const startTime = performance.now();
|
|
180
|
-
const startProgress = this.highlightProgress;
|
|
181
|
-
const targetProgress = positive ? 1 : 0;
|
|
182
|
-
const delta = targetProgress - startProgress;
|
|
183
|
-
const duration = baseDuration * Math.abs(delta);
|
|
184
|
-
const animate = () => {
|
|
185
|
-
if (controller.signal.aborted)
|
|
186
|
-
return;
|
|
187
|
-
const elapsed = performance.now() - startTime;
|
|
188
|
-
const t = Math.min(elapsed / duration, 1);
|
|
189
|
-
const current = startProgress + delta * t;
|
|
190
|
-
const eased = current < 0.5 ? 4 * current * current * current : 1 - (-2 * current + 2) ** 3 / 2;
|
|
191
|
-
this.highlightProgress = eased;
|
|
192
|
-
if (t < 1 || positive) {
|
|
193
|
-
requestAnimationFrame(animate);
|
|
194
|
-
this.draw();
|
|
195
|
-
}
|
|
196
|
-
else {
|
|
197
|
-
this.highlightedNode = null;
|
|
198
|
-
this.highlightedLink = null;
|
|
199
|
-
this.highlightedNeighbors = null;
|
|
200
|
-
this.highlightStart = null;
|
|
201
|
-
this.particles = [];
|
|
202
|
-
this.tick();
|
|
203
|
-
}
|
|
204
|
-
};
|
|
205
|
-
requestAnimationFrame(animate);
|
|
206
|
-
}
|
|
207
|
-
animateZoom(area, target, start, duration) {
|
|
208
|
-
this._zoomAnimating = true;
|
|
209
|
-
const startTime = performance.now();
|
|
210
|
-
const animate = () => {
|
|
211
|
-
const elapsed = performance.now() - startTime;
|
|
212
|
-
const t = Math.min(elapsed / duration, 1);
|
|
213
|
-
const eased = t < 0.5 ? 4 * t * t * t : 1 - (-2 * t + 2) ** 3 / 2;
|
|
214
|
-
const x = start.x + (target.x - start.x) * eased;
|
|
215
|
-
const y = start.y + (target.y - start.y) * eased;
|
|
216
|
-
const k = start.k + (target.k - start.k) * eased;
|
|
217
|
-
this.areaTransform = new ZoomTransform(k, x, y);
|
|
218
|
-
zoom().transform(select(area), this.areaTransform);
|
|
219
|
-
updateLinkCache.call(this);
|
|
220
|
-
updateNodeCache.call(this);
|
|
221
|
-
this.tick();
|
|
222
|
-
if (t < 1) {
|
|
223
|
-
requestAnimationFrame(animate);
|
|
224
|
-
}
|
|
225
|
-
else {
|
|
226
|
-
this._zoomAnimating = false;
|
|
227
|
-
this.clearCache(true);
|
|
228
|
-
this.tick();
|
|
229
|
-
}
|
|
230
|
-
};
|
|
231
|
-
requestAnimationFrame(animate);
|
|
232
|
-
}
|
|
233
|
-
changeData(options, alpha = 0.5, clearCache = true) {
|
|
148
|
+
};
|
|
149
|
+
changeData = (options, alpha = 0.5, clearCache = true, precompute = false) => {
|
|
234
150
|
if (options.links != undefined)
|
|
235
151
|
this.links = options.links;
|
|
236
152
|
if (options.nodes != undefined)
|
|
237
153
|
this.nodes = options.nodes;
|
|
238
154
|
if (options.nodes != undefined || options.links != undefined) {
|
|
239
|
-
this.updateData(alpha, clearCache);
|
|
155
|
+
this.updateData(alpha, clearCache, precompute);
|
|
240
156
|
}
|
|
241
|
-
}
|
|
242
|
-
changeSettings(options, clearCache = true) {
|
|
157
|
+
};
|
|
158
|
+
changeSettings = (options, clearCache = true, precompute = false) => {
|
|
243
159
|
if (options.graphSettings) {
|
|
244
160
|
this.graphSettings = graphSettingsGetter(options.graphSettings, this.graphSettings);
|
|
245
161
|
this.draw = initDraw.call(this);
|
|
@@ -286,16 +202,16 @@ class GraphCanvas {
|
|
|
286
202
|
initCollideForce.call(this, true);
|
|
287
203
|
}
|
|
288
204
|
if (options.forceSettings) {
|
|
289
|
-
return void this.updateSimulation();
|
|
205
|
+
return void this.updateSimulation(precompute);
|
|
290
206
|
}
|
|
291
207
|
this.tick();
|
|
292
|
-
}
|
|
293
|
-
updateRect() {
|
|
208
|
+
};
|
|
209
|
+
updateRect = () => {
|
|
294
210
|
if (!this.area)
|
|
295
211
|
return;
|
|
296
212
|
this.areaRect = this.area.getBoundingClientRect();
|
|
297
|
-
}
|
|
298
|
-
updateSize() {
|
|
213
|
+
};
|
|
214
|
+
updateSize = () => {
|
|
299
215
|
if (!this.area)
|
|
300
216
|
return;
|
|
301
217
|
const { width, height } = this.root.getBoundingClientRect();
|
|
@@ -309,8 +225,8 @@ class GraphCanvas {
|
|
|
309
225
|
throw new Error("couldn't create canvas context");
|
|
310
226
|
this.context.scale(this.dpi, this.dpi);
|
|
311
227
|
this.draw();
|
|
312
|
-
}
|
|
313
|
-
clearCache(keys) {
|
|
228
|
+
};
|
|
229
|
+
clearCache = (keys) => {
|
|
314
230
|
if (keys === true) {
|
|
315
231
|
this.nodeOptionsCache.length = 0;
|
|
316
232
|
this.linkOptionsCache.length = 0;
|
|
@@ -341,12 +257,12 @@ class GraphCanvas {
|
|
|
341
257
|
}
|
|
342
258
|
updateNodeCache.call(this);
|
|
343
259
|
updateLinkCache.call(this);
|
|
344
|
-
}
|
|
345
|
-
tick() {
|
|
260
|
+
};
|
|
261
|
+
tick = () => {
|
|
346
262
|
if (!this.simulationWorking)
|
|
347
263
|
this.draw();
|
|
348
|
-
}
|
|
349
|
-
restart(alpha, options) {
|
|
264
|
+
};
|
|
265
|
+
restart = (alpha, options) => {
|
|
350
266
|
if (!this.simulation)
|
|
351
267
|
return;
|
|
352
268
|
const settings = {
|
|
@@ -382,23 +298,23 @@ class GraphCanvas {
|
|
|
382
298
|
initSimulationForces.call(this);
|
|
383
299
|
this.simulation.restart();
|
|
384
300
|
this.tick();
|
|
385
|
-
}
|
|
386
|
-
start() {
|
|
301
|
+
};
|
|
302
|
+
start = () => {
|
|
387
303
|
if (this.simulation)
|
|
388
304
|
this.simulation.alpha(1).restart();
|
|
389
305
|
if (this.container)
|
|
390
306
|
this.container.style.display = "block";
|
|
391
|
-
}
|
|
392
|
-
stop() {
|
|
307
|
+
};
|
|
308
|
+
stop = () => {
|
|
393
309
|
if (this.simulation)
|
|
394
310
|
this.simulation.stop();
|
|
395
311
|
if (this.container)
|
|
396
312
|
this.container.style.display = "none";
|
|
397
|
-
}
|
|
398
|
-
create() {
|
|
313
|
+
};
|
|
314
|
+
create = () => {
|
|
399
315
|
this.init();
|
|
400
|
-
}
|
|
401
|
-
destroy() {
|
|
316
|
+
};
|
|
317
|
+
destroy = () => {
|
|
402
318
|
if (this.simulation) {
|
|
403
319
|
this.simulation.stop();
|
|
404
320
|
this.simulation = undefined;
|
|
@@ -406,22 +322,22 @@ class GraphCanvas {
|
|
|
406
322
|
this.clearHTMLElements();
|
|
407
323
|
this.clearState();
|
|
408
324
|
this.clearCache(true);
|
|
409
|
-
}
|
|
410
|
-
clearHTMLElements() {
|
|
325
|
+
};
|
|
326
|
+
clearHTMLElements = () => {
|
|
411
327
|
this.root.replaceChildren();
|
|
412
328
|
this.area = undefined;
|
|
413
329
|
this.context = undefined;
|
|
414
330
|
this.container = undefined;
|
|
415
331
|
this.eventAbortController.abort();
|
|
416
332
|
this.eventAbortController = new AbortController();
|
|
417
|
-
}
|
|
418
|
-
updateSimulation() {
|
|
333
|
+
};
|
|
334
|
+
updateSimulation = (precompute = false) => {
|
|
419
335
|
if (this.simulation) {
|
|
420
336
|
initSimulationForces.call(this);
|
|
421
|
-
this.restart(1);
|
|
337
|
+
this.restart(1, { precompute });
|
|
422
338
|
}
|
|
423
|
-
}
|
|
424
|
-
clearState() {
|
|
339
|
+
};
|
|
340
|
+
clearState = () => {
|
|
425
341
|
this.isDragging = false;
|
|
426
342
|
this.highlightedNode = null;
|
|
427
343
|
this.highlightedLink = null;
|
|
@@ -429,8 +345,22 @@ class GraphCanvas {
|
|
|
429
345
|
this.highlightProgress = 0;
|
|
430
346
|
this.highlightStart = null;
|
|
431
347
|
this.highlightPositive = false;
|
|
432
|
-
}
|
|
433
|
-
|
|
348
|
+
};
|
|
349
|
+
init = () => {
|
|
350
|
+
initArea.call(this);
|
|
351
|
+
updateNodeCache.call(this);
|
|
352
|
+
updateLinkCache.call(this);
|
|
353
|
+
initSimulation.call(this);
|
|
354
|
+
this.restart(1);
|
|
355
|
+
initDnd.call(this);
|
|
356
|
+
initZoom.call(this);
|
|
357
|
+
initResize.call(this);
|
|
358
|
+
initPointer.call(this);
|
|
359
|
+
updateNodeCache.call(this);
|
|
360
|
+
updateLinkCache.call(this);
|
|
361
|
+
this.tick();
|
|
362
|
+
};
|
|
363
|
+
updateData = (alpha = 0.5, clearCache = true, precompute = false) => {
|
|
434
364
|
if (clearCache) {
|
|
435
365
|
this.clearCache(clearCache);
|
|
436
366
|
}
|
|
@@ -447,21 +377,94 @@ class GraphCanvas {
|
|
|
447
377
|
.iterations(this.forceSettings.forces && this.forceSettings.linkForce
|
|
448
378
|
? this.forceSettings.linkIterations
|
|
449
379
|
: 0));
|
|
450
|
-
this.restart(alpha);
|
|
380
|
+
this.restart(alpha, { precompute });
|
|
451
381
|
initZoom.call(this, this.areaTransform);
|
|
452
382
|
}
|
|
453
|
-
}
|
|
454
|
-
|
|
455
|
-
|
|
456
|
-
|
|
457
|
-
|
|
458
|
-
|
|
459
|
-
|
|
460
|
-
|
|
461
|
-
|
|
462
|
-
|
|
463
|
-
|
|
464
|
-
|
|
383
|
+
};
|
|
384
|
+
animateHighlight = (node, link, baseDuration = this.highlightSettings.highlightDuration) => {
|
|
385
|
+
let positive = true;
|
|
386
|
+
if (node && (this.highlightedNode !== node || !this.highlightPositive)) {
|
|
387
|
+
this.highlightedNode = node;
|
|
388
|
+
this.highlightedNeighbors = new Set(node.neighbors);
|
|
389
|
+
this.particles = [];
|
|
390
|
+
this.highlightedLink = null;
|
|
391
|
+
this.highlightStart = performance.now();
|
|
392
|
+
}
|
|
393
|
+
else if (link && (this.highlightedLink !== link || !this.highlightPositive)) {
|
|
394
|
+
const { sourceId, targetId } = extractLinkPointIds(link);
|
|
395
|
+
this.highlightProgress = 0;
|
|
396
|
+
this.highlightedLink = link;
|
|
397
|
+
this.highlightedNeighbors = new Set([sourceId, targetId]);
|
|
398
|
+
this.particles = [];
|
|
399
|
+
this.highlightedNode = null;
|
|
400
|
+
this.highlightStart = performance.now();
|
|
401
|
+
}
|
|
402
|
+
else if (!node && !link && this.highlightPositive) {
|
|
403
|
+
positive = false;
|
|
404
|
+
}
|
|
405
|
+
else {
|
|
406
|
+
return;
|
|
407
|
+
}
|
|
408
|
+
if (this.highlightController) {
|
|
409
|
+
this.highlightController.abort();
|
|
410
|
+
}
|
|
411
|
+
const controller = new AbortController();
|
|
412
|
+
this.highlightPositive = positive;
|
|
413
|
+
this.highlightController = controller;
|
|
414
|
+
const startTime = performance.now();
|
|
415
|
+
const startProgress = this.highlightProgress;
|
|
416
|
+
const targetProgress = positive ? 1 : 0;
|
|
417
|
+
const delta = targetProgress - startProgress;
|
|
418
|
+
const duration = baseDuration * Math.abs(delta);
|
|
419
|
+
const animate = () => {
|
|
420
|
+
if (controller.signal.aborted)
|
|
421
|
+
return;
|
|
422
|
+
const elapsed = performance.now() - startTime;
|
|
423
|
+
const t = Math.min(elapsed / duration, 1);
|
|
424
|
+
const current = startProgress + delta * t;
|
|
425
|
+
const eased = current < 0.5 ? 4 * current * current * current : 1 - (-2 * current + 2) ** 3 / 2;
|
|
426
|
+
this.highlightProgress = eased;
|
|
427
|
+
if (t < 1 || positive) {
|
|
428
|
+
requestAnimationFrame(animate);
|
|
429
|
+
this.draw();
|
|
430
|
+
}
|
|
431
|
+
else {
|
|
432
|
+
this.highlightedNode = null;
|
|
433
|
+
this.highlightedLink = null;
|
|
434
|
+
this.highlightedNeighbors = null;
|
|
435
|
+
this.highlightStart = null;
|
|
436
|
+
this.particles = [];
|
|
437
|
+
this.tick();
|
|
438
|
+
}
|
|
439
|
+
};
|
|
440
|
+
requestAnimationFrame(animate);
|
|
441
|
+
};
|
|
442
|
+
animateZoom = (area, target, start, duration) => {
|
|
443
|
+
this._zoomAnimating = true;
|
|
444
|
+
const startTime = performance.now();
|
|
445
|
+
const animate = () => {
|
|
446
|
+
const elapsed = performance.now() - startTime;
|
|
447
|
+
const t = Math.min(elapsed / duration, 1);
|
|
448
|
+
const eased = t < 0.5 ? 4 * t * t * t : 1 - (-2 * t + 2) ** 3 / 2;
|
|
449
|
+
const x = start.x + (target.x - start.x) * eased;
|
|
450
|
+
const y = start.y + (target.y - start.y) * eased;
|
|
451
|
+
const k = start.k + (target.k - start.k) * eased;
|
|
452
|
+
this.areaTransform = new ZoomTransform(k, x, y);
|
|
453
|
+
zoom().transform(select(area), this.areaTransform);
|
|
454
|
+
updateLinkCache.call(this);
|
|
455
|
+
updateNodeCache.call(this);
|
|
456
|
+
this.tick();
|
|
457
|
+
if (t < 1) {
|
|
458
|
+
requestAnimationFrame(animate);
|
|
459
|
+
}
|
|
460
|
+
else {
|
|
461
|
+
this._zoomAnimating = false;
|
|
462
|
+
this.clearCache(true);
|
|
463
|
+
this.tick();
|
|
464
|
+
}
|
|
465
|
+
};
|
|
466
|
+
requestAnimationFrame(animate);
|
|
467
|
+
};
|
|
465
468
|
}
|
|
466
469
|
|
|
467
470
|
export { GraphCanvas };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"GraphCanvas.js","sources":["../../../../src/module/GraphCanvas/GraphCanvas.ts"],"sourcesContent":["import { isArray } from \"@krainovsd/js-helpers\";\nimport { forceLink } from \"d3-force\";\nimport { select as d3Select } from \"d3-selection\";\nimport { ZoomTransform, zoom, zoomIdentity } from \"d3-zoom\";\nimport { GRAPH_CACHE_TYPE } from \"./constants\";\nimport {\n computeGraphBounds,\n extractLinkPointIds,\n forceSettingsGetter,\n graphSettingsGetter,\n highlightSettingsGetter,\n linkSettingsGetter,\n listenersGetter,\n nodeSettingsGetter,\n} from \"./lib\";\nimport {\n initArea,\n initCollideForce,\n initDnd,\n initDraw,\n initPointer,\n initResize,\n initSimulation,\n initSimulationForces,\n initZoom,\n updateLinkCache,\n updateNodeCache,\n} from \"./slices\";\nimport type {\n ForceSettingsInterface,\n GraphCanvasCacheKeys,\n GraphCanvasInterface,\n GraphCanvasSimulation,\n GraphSettingsInterface,\n HighlightSettingsInterface,\n LinkInterface,\n LinkOptionsInterface,\n LinkParticle,\n LinkSettingsInterface,\n ListenersInterface,\n NodeInterface,\n NodeOptionsInterface,\n NodeSettingsInterface,\n PrecomputeForceSettingsInterface,\n} from \"./types\";\n\nexport class GraphCanvas<\n NodeData extends Record<string, unknown>,\n LinkData extends Record<string, unknown>,\n> {\n /** initial data */\n\n protected nodes: NodeInterface<NodeData>[];\n\n protected links: LinkInterface<NodeData, LinkData>[];\n\n protected particles: (LinkParticle[] | undefined)[] = [];\n\n protected width: number;\n\n protected height: number;\n\n protected root: HTMLElement;\n\n protected container: HTMLDivElement | undefined | null;\n\n protected area: HTMLCanvasElement | null | undefined;\n\n /** settings */\n\n protected graphSettings: Required<GraphSettingsInterface<NodeData>>;\n\n protected forceSettings: Required<ForceSettingsInterface<NodeData, LinkData>>;\n\n protected highlightSettings: Required<HighlightSettingsInterface>;\n\n protected nodeSettings: Required<Omit<NodeSettingsInterface<NodeData, LinkData>, \"options\">> &\n Pick<NodeSettingsInterface<NodeData, LinkData>, \"options\">;\n\n protected linkSettings: Required<Omit<LinkSettingsInterface<NodeData, LinkData>, \"options\">> &\n Pick<LinkSettingsInterface<NodeData, LinkData>, \"options\">;\n\n protected listeners: ListenersInterface<NodeData, LinkData>;\n\n /** service */\n\n protected context: CanvasRenderingContext2D | null | undefined;\n\n protected simulation: GraphCanvasSimulation<NodeData, LinkData> | undefined;\n\n protected areaTransform: ZoomTransform = zoomIdentity;\n\n protected _translateExtent: [[number, number], [number, number]] | undefined;\n\n protected areaRect: DOMRect | undefined;\n\n protected draw: (this: GraphCanvas<NodeData, LinkData>, recursive?: boolean) => void;\n\n protected eventAbortController: AbortController;\n\n protected cachedNodeText: (string[] | undefined)[] = [];\n\n protected cachedNodeLabel: (string[] | undefined)[] = [];\n\n protected linkOptionsCache: (Required<LinkOptionsInterface<NodeData, LinkData>> | undefined)[] =\n [];\n\n protected nodeOptionsCache: (Required<NodeOptionsInterface<NodeData, LinkData>> | undefined)[] =\n [];\n\n protected isDragging: boolean = false;\n\n protected highlightedNode: NodeInterface<NodeData> | null = null;\n\n protected highlightedLink: LinkInterface<NodeData, LinkData> | null = null;\n\n protected highlightedNeighbors: Set<string | number> | null = null;\n\n protected highlightProgress: number = 1;\n\n protected highlightStart: number | null = null;\n\n protected highlightPositive: boolean = false;\n\n protected highlightController: AbortController | undefined;\n\n protected _lastNodeZoomK: number | undefined;\n\n protected _lastLinkZoomK: number | undefined;\n\n protected _zoomAnimating: boolean = false;\n\n protected get simulationWorking() {\n const simulationAlpha = this.simulation?.alpha?.() ?? 0;\n const simulationAlphaMin = this.simulation?.alphaMin?.() ?? 0;\n const simulationAlphaDecay = this.simulation?.alphaDecay?.() ?? 0;\n const force = (simulationAlpha - simulationAlphaMin) / simulationAlphaDecay;\n\n return force > 0;\n }\n\n constructor({\n links,\n nodes,\n root,\n forceSettings,\n linkSettings,\n listeners,\n nodeSettings,\n graphSettings,\n highlightSettings,\n }: GraphCanvasInterface<NodeData, LinkData>) {\n // root.style.position = \"relative\";\n root.style.overflow = \"hidden\";\n\n this.root = root;\n\n this.forceSettings = forceSettingsGetter(forceSettings);\n this.linkSettings = linkSettingsGetter(linkSettings);\n this.nodeSettings = nodeSettingsGetter(nodeSettings);\n this.listeners = listenersGetter(listeners);\n this.graphSettings = graphSettingsGetter(graphSettings);\n this.highlightSettings = highlightSettingsGetter(highlightSettings);\n\n this.eventAbortController = new AbortController();\n\n this.nodes = nodes;\n this.links = links;\n this.height = 0;\n this.width = 0;\n\n this.draw = initDraw.call<\n GraphCanvas<NodeData, LinkData>,\n Parameters<typeof initDraw>,\n ReturnType<typeof initDraw>\n >(this);\n\n this.init();\n }\n\n get dpi() {\n return devicePixelRatio;\n }\n\n getData(): Pick<GraphCanvasInterface<NodeData, LinkData>, \"nodes\" | \"links\"> {\n return {\n links: this.links,\n nodes: this.nodes,\n };\n }\n\n fitToView(\n margin: number = this.graphSettings.zoomToFitMargin,\n duration: number = this.graphSettings.zoomAnimationDuration,\n ) {\n const area = this.area;\n if (!area) return;\n\n const bounds = computeGraphBounds(this.nodes);\n if (!bounds) return;\n\n const graphWidth = bounds.maxX - bounds.minX;\n const graphHeight = bounds.maxY - bounds.minY;\n if (graphWidth === 0 || graphHeight === 0) return;\n const graphCenterX = bounds.minX + graphWidth / 2;\n const graphCenterY = bounds.minY + graphHeight / 2;\n const scale = (1 - margin) / Math.max(graphWidth / this.width, graphHeight / this.height);\n\n const clampedScale = Math.min(scale, this.graphSettings.zoomExtent?.[1] ?? scale);\n const target = zoomIdentity\n .translate(this.width / 2, this.height / 2)\n .scale(clampedScale)\n .translate(-graphCenterX, -graphCenterY);\n if (!this.graphSettings.zoomAnimation) {\n this.areaTransform = target;\n zoom<HTMLCanvasElement, unknown>().transform(d3Select(area), target);\n this.clearCache(true);\n this.tick();\n return;\n }\n this.animateZoom(area, target, this.areaTransform, duration);\n }\n\n focusOnNode(\n nodeId: string | number,\n scale: number = this.graphSettings.zoomToNodeScale,\n duration: number = this.graphSettings.zoomAnimationDuration,\n ) {\n const area = this.area;\n if (!area) return;\n\n const node = this.nodes.find((n) => n.id === nodeId);\n if (!node) return;\n if (node.x == undefined || node.y == undefined) return;\n\n const target = zoomIdentity\n .translate(this.width / 2, this.height / 2)\n .scale(scale)\n .translate(-node.x, -node.y);\n if (!this.graphSettings.zoomAnimation) {\n this.areaTransform = target;\n zoom<HTMLCanvasElement, unknown>().transform(d3Select(area), target);\n this.clearCache(true);\n this.tick();\n return;\n }\n this.animateZoom(area, target, this.areaTransform, duration);\n }\n\n protected animateHighlight(\n node: NodeInterface<NodeData> | undefined,\n link: LinkInterface<NodeData, LinkData> | undefined,\n baseDuration: number = this.highlightSettings.highlightDuration,\n ) {\n let positive = true;\n if (node && (this.highlightedNode !== node || !this.highlightPositive)) {\n this.highlightedNode = node;\n this.highlightedNeighbors = new Set(node.neighbors);\n this.particles = [];\n this.highlightedLink = null;\n this.highlightStart = performance.now();\n } else if (link && (this.highlightedLink !== link || !this.highlightPositive)) {\n const { sourceId, targetId } = extractLinkPointIds(link);\n this.highlightProgress = 0;\n this.highlightedLink = link;\n this.highlightedNeighbors = new Set([sourceId, targetId]);\n this.particles = [];\n this.highlightedNode = null;\n this.highlightStart = performance.now();\n } else if (!node && !link && this.highlightPositive) {\n positive = false;\n } else {\n return;\n }\n if (this.highlightController) {\n this.highlightController.abort();\n }\n const controller = new AbortController();\n this.highlightPositive = positive;\n this.highlightController = controller;\n const startTime = performance.now();\n const startProgress = this.highlightProgress;\n const targetProgress = positive ? 1 : 0;\n const delta = targetProgress - startProgress;\n const duration = baseDuration * Math.abs(delta);\n\n const animate = () => {\n if (controller.signal.aborted) return;\n const elapsed = performance.now() - startTime;\n const t = Math.min(elapsed / duration, 1);\n const current = startProgress + delta * t;\n const eased =\n current < 0.5 ? 4 * current * current * current : 1 - (-2 * current + 2) ** 3 / 2;\n this.highlightProgress = eased;\n\n if (t < 1 || positive) {\n requestAnimationFrame(animate);\n this.draw();\n } else {\n this.highlightedNode = null;\n this.highlightedLink = null;\n this.highlightedNeighbors = null;\n this.highlightStart = null;\n this.particles = [];\n this.tick();\n }\n };\n requestAnimationFrame(animate);\n }\n\n protected animateZoom(\n area: HTMLCanvasElement,\n target: ZoomTransform,\n start: ZoomTransform,\n duration: number,\n ) {\n this._zoomAnimating = true;\n const startTime = performance.now();\n const animate = () => {\n const elapsed = performance.now() - startTime;\n const t = Math.min(elapsed / duration, 1);\n const eased = t < 0.5 ? 4 * t * t * t : 1 - (-2 * t + 2) ** 3 / 2;\n const x = start.x + (target.x - start.x) * eased;\n const y = start.y + (target.y - start.y) * eased;\n const k = start.k + (target.k - start.k) * eased;\n\n this.areaTransform = new ZoomTransform(k, x, y);\n zoom<HTMLCanvasElement, unknown>().transform(d3Select(area), this.areaTransform);\n updateLinkCache.call<\n GraphCanvas<NodeData, LinkData>,\n Parameters<typeof updateLinkCache>,\n ReturnType<typeof updateLinkCache>\n >(this);\n updateNodeCache.call<\n GraphCanvas<NodeData, LinkData>,\n Parameters<typeof updateNodeCache>,\n ReturnType<typeof updateNodeCache>\n >(this);\n this.tick();\n\n if (t < 1) {\n requestAnimationFrame(animate);\n } else {\n this._zoomAnimating = false;\n this.clearCache(true);\n this.tick();\n }\n };\n requestAnimationFrame(animate);\n }\n\n changeData(\n options: Pick<Partial<GraphCanvasInterface<NodeData, LinkData>>, \"links\" | \"nodes\">,\n alpha: number = 0.5,\n clearCache: boolean | GraphCanvasCacheKeys[] = true,\n ) {\n if (options.links != undefined) this.links = options.links;\n if (options.nodes != undefined) this.nodes = options.nodes;\n if (options.nodes != undefined || options.links != undefined) {\n this.updateData(alpha, clearCache);\n }\n }\n\n changeSettings(\n options: Omit<\n Partial<GraphCanvasInterface<NodeData, LinkData>>,\n \"links\" | \"nodes\" | \"listeners\"\n >,\n clearCache: boolean | GraphCanvasCacheKeys[] = true,\n ) {\n if (options.graphSettings) {\n this.graphSettings = graphSettingsGetter(options.graphSettings, this.graphSettings);\n\n this.draw = initDraw.call<\n GraphCanvas<NodeData, LinkData>,\n Parameters<typeof initDraw>,\n ReturnType<typeof initDraw>\n >(this);\n initZoom.call<\n GraphCanvas<NodeData, LinkData>,\n Parameters<typeof initZoom>,\n ReturnType<typeof initZoom>\n >(this, this.areaTransform);\n }\n if (options.forceSettings) {\n this.forceSettings = forceSettingsGetter(options.forceSettings, this.forceSettings);\n }\n if (options.highlightSettings) {\n this.highlightSettings = highlightSettingsGetter(\n options.highlightSettings,\n this.highlightSettings,\n );\n\n if (clearCache === true) {\n this.clearCache([\n GRAPH_CACHE_TYPE.NodeOptions,\n GRAPH_CACHE_TYPE.NodeText,\n GRAPH_CACHE_TYPE.NodeLabel,\n GRAPH_CACHE_TYPE.LinkOptions,\n ]);\n } else {\n this.clearCache(clearCache);\n }\n }\n if (options.linkSettings) {\n this.linkSettings = linkSettingsGetter(options.linkSettings, this.linkSettings);\n\n if (clearCache) {\n this.clearCache([GRAPH_CACHE_TYPE.LinkOptions]);\n } else {\n this.clearCache(clearCache);\n }\n }\n if (options.nodeSettings) {\n this.nodeSettings = nodeSettingsGetter(options.nodeSettings, this.nodeSettings);\n\n if (clearCache) {\n this.clearCache([\n GRAPH_CACHE_TYPE.NodeOptions,\n GRAPH_CACHE_TYPE.NodeText,\n GRAPH_CACHE_TYPE.NodeLabel,\n ]);\n } else {\n this.clearCache(clearCache);\n }\n\n initCollideForce.call<\n GraphCanvas<NodeData, LinkData>,\n Parameters<typeof initCollideForce>,\n ReturnType<typeof initCollideForce>\n >(this, true);\n }\n\n if (options.forceSettings) {\n return void this.updateSimulation();\n }\n\n this.tick();\n }\n\n updateRect() {\n if (!this.area) return;\n\n this.areaRect = this.area.getBoundingClientRect();\n }\n\n updateSize() {\n if (!this.area) return;\n\n const { width, height } = this.root.getBoundingClientRect();\n this.width = width;\n this.height = height;\n this.area.width = this.dpi * this.width;\n this.area.height = this.dpi * this.height;\n this.areaRect = this.area.getBoundingClientRect();\n\n this.context = this.area.getContext(\"2d\");\n if (!this.context) throw new Error(\"couldn't create canvas context\");\n this.context.scale(this.dpi, this.dpi);\n this.draw();\n }\n\n clearCache(keys: boolean | GraphCanvasCacheKeys[]) {\n if (keys === true) {\n this.nodeOptionsCache.length = 0;\n this.linkOptionsCache.length = 0;\n this.cachedNodeLabel.length = 0;\n this.cachedNodeText.length = 0;\n } else if (isArray(keys)) {\n for (const key of keys) {\n switch (key) {\n case GRAPH_CACHE_TYPE.NodeText: {\n this.cachedNodeText.length = 0;\n break;\n }\n case GRAPH_CACHE_TYPE.NodeLabel: {\n this.cachedNodeLabel.length = 0;\n break;\n }\n case GRAPH_CACHE_TYPE.NodeOptions: {\n this.nodeOptionsCache.length = 0;\n break;\n }\n case GRAPH_CACHE_TYPE.LinkOptions: {\n this.linkOptionsCache.length = 0;\n break;\n }\n default: {\n break;\n }\n }\n }\n }\n\n updateNodeCache.call<\n GraphCanvas<NodeData, LinkData>,\n Parameters<typeof updateNodeCache>,\n ReturnType<typeof updateNodeCache>\n >(this);\n updateLinkCache.call<\n GraphCanvas<NodeData, LinkData>,\n Parameters<typeof updateLinkCache>,\n ReturnType<typeof updateLinkCache>\n >(this);\n }\n\n tick() {\n if (!this.simulationWorking) this.draw();\n }\n\n restart(alpha?: number, options?: Partial<PrecomputeForceSettingsInterface>) {\n if (!this.simulation) return;\n\n const settings: Required<PrecomputeForceSettingsInterface> = {\n precompute: options?.precompute ?? this.forceSettings.precompute,\n precomputeMaxTimeMs: options?.precomputeMaxTimeMs ?? this.forceSettings?.precomputeMaxTimeMs,\n precomputeMaxTicks:\n options?.precomputeMaxTicks ?? this.forceSettings?.precomputeMaxTicks ?? 300,\n precomputeDisableForcesAfter:\n options?.precomputeDisableForcesAfter ??\n this.forceSettings?.precomputeDisableForcesAfter ??\n false,\n };\n if (!settings.precompute) {\n this.simulation.alpha(alpha ?? 1).restart();\n return;\n }\n if (settings.precomputeDisableForcesAfter) {\n this.forceSettings = forceSettingsGetter({ forces: true }, this.forceSettings);\n }\n initSimulationForces.call<\n GraphCanvas<NodeData, LinkData>,\n Parameters<typeof initSimulationForces>,\n ReturnType<typeof initSimulationForces>\n >(this);\n this.simulation.stop();\n this.simulation.alpha(alpha ?? 1);\n\n const startTime = performance.now();\n let ticks = 0;\n while (\n performance.now() - startTime < settings.precomputeMaxTimeMs &&\n ticks < settings.precomputeMaxTicks\n ) {\n this.simulation.tick(1);\n ticks++;\n if (this.simulation.alpha() <= this.simulation.alphaMin()) break;\n }\n if (settings.precomputeDisableForcesAfter) {\n this.forceSettings = forceSettingsGetter({ forces: false }, this.forceSettings);\n }\n initSimulationForces.call<\n GraphCanvas<NodeData, LinkData>,\n Parameters<typeof initSimulationForces>,\n ReturnType<typeof initSimulationForces>\n >(this);\n this.simulation.restart();\n this.tick();\n }\n\n start() {\n if (this.simulation) this.simulation.alpha(1).restart();\n if (this.container) this.container.style.display = \"block\";\n }\n\n stop() {\n if (this.simulation) this.simulation.stop();\n if (this.container) this.container.style.display = \"none\";\n }\n\n create() {\n this.init();\n }\n\n destroy() {\n if (this.simulation) {\n this.simulation.stop();\n this.simulation = undefined;\n }\n\n this.clearHTMLElements();\n this.clearState();\n this.clearCache(true);\n }\n\n protected clearHTMLElements() {\n this.root.replaceChildren();\n this.area = undefined;\n this.context = undefined;\n this.container = undefined;\n this.eventAbortController.abort();\n this.eventAbortController = new AbortController();\n }\n\n protected updateSimulation() {\n if (this.simulation) {\n initSimulationForces.call<\n GraphCanvas<NodeData, LinkData>,\n Parameters<typeof initSimulationForces>,\n ReturnType<typeof initSimulationForces>\n >(this);\n this.restart(1);\n }\n }\n\n protected clearState() {\n this.isDragging = false;\n this.highlightedNode = null;\n this.highlightedLink = null;\n this.highlightedNeighbors = null;\n this.highlightProgress = 0;\n this.highlightStart = null;\n this.highlightPositive = false;\n }\n\n protected updateData(alpha: number = 0.5, clearCache: boolean | GraphCanvasCacheKeys[] = true) {\n if (clearCache) {\n this.clearCache(clearCache);\n }\n\n if (this.simulation) {\n initCollideForce.call<\n GraphCanvas<NodeData, LinkData>,\n Parameters<typeof initCollideForce>,\n ReturnType<typeof initCollideForce>\n >(this, false);\n\n this.simulation.nodes(this.nodes).force(\n \"link\",\n forceLink<NodeInterface<NodeData>, LinkInterface<NodeData, LinkData>>(this.links)\n .id(this.nodeSettings.idGetter.bind(this))\n .distance(\n this.forceSettings.forces && this.forceSettings.linkForce\n ? this.forceSettings.linkDistance\n : 0,\n )\n .strength(\n this.forceSettings.forces && this.forceSettings.linkForce\n ? this.forceSettings.linkStrength\n : 0,\n )\n .iterations(\n this.forceSettings.forces && this.forceSettings.linkForce\n ? this.forceSettings.linkIterations\n : 0,\n ),\n );\n this.restart(alpha);\n initZoom.call<\n GraphCanvas<NodeData, LinkData>,\n Parameters<typeof initZoom>,\n ReturnType<typeof initZoom>\n >(this, this.areaTransform);\n }\n }\n\n protected init() {\n initArea.call<\n GraphCanvas<NodeData, LinkData>,\n Parameters<typeof initArea>,\n ReturnType<typeof initArea>\n >(this);\n updateNodeCache.call<\n GraphCanvas<NodeData, LinkData>,\n Parameters<typeof updateNodeCache>,\n ReturnType<typeof updateNodeCache>\n >(this);\n updateLinkCache.call<\n GraphCanvas<NodeData, LinkData>,\n Parameters<typeof updateLinkCache>,\n ReturnType<typeof updateLinkCache>\n >(this);\n initSimulation.call<\n GraphCanvas<NodeData, LinkData>,\n Parameters<typeof initSimulation>,\n ReturnType<typeof initSimulation>\n >(this);\n this.restart(1);\n initDnd.call<\n GraphCanvas<NodeData, LinkData>,\n Parameters<typeof initDnd>,\n ReturnType<typeof initDnd>\n >(this);\n initZoom.call<\n GraphCanvas<NodeData, LinkData>,\n Parameters<typeof initZoom>,\n ReturnType<typeof initZoom>\n >(this);\n initResize.call<\n GraphCanvas<NodeData, LinkData>,\n Parameters<typeof initResize>,\n ReturnType<typeof initResize>\n >(this);\n initPointer.call<\n GraphCanvas<NodeData, LinkData>,\n Parameters<typeof initPointer>,\n ReturnType<typeof initPointer>\n >(this);\n }\n}\n"],"names":["d3Select"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"GraphCanvas.js","sources":["../../../../src/module/GraphCanvas/GraphCanvas.ts"],"sourcesContent":["import { isArray } from \"@krainovsd/js-helpers\";\nimport { forceLink } from \"d3-force\";\nimport { select as d3Select } from \"d3-selection\";\nimport { ZoomTransform, zoom, zoomIdentity } from \"d3-zoom\";\nimport { GRAPH_CACHE_TYPE } from \"./constants\";\nimport {\n computeGraphBounds,\n extractLinkPointIds,\n forceSettingsGetter,\n graphSettingsGetter,\n highlightSettingsGetter,\n linkSettingsGetter,\n listenersGetter,\n nodeSettingsGetter,\n} from \"./lib\";\nimport {\n initArea,\n initCollideForce,\n initDnd,\n initDraw,\n initPointer,\n initResize,\n initSimulation,\n initSimulationForces,\n initZoom,\n updateLinkCache,\n updateNodeCache,\n} from \"./slices\";\nimport type {\n ForceSettingsInterface,\n GraphCanvasCacheKeys,\n GraphCanvasInterface,\n GraphCanvasSimulation,\n GraphSettingsInterface,\n HighlightSettingsInterface,\n LinkInterface,\n LinkOptionsInterface,\n LinkParticle,\n LinkSettingsInterface,\n ListenersInterface,\n NodeInterface,\n NodeOptionsInterface,\n NodeSettingsInterface,\n PrecomputeForceSettingsInterface,\n} from \"./types\";\n\nexport class GraphCanvas<\n NodeData extends Record<string, unknown>,\n LinkData extends Record<string, unknown>,\n> {\n /** initial data */\n\n protected nodes: NodeInterface<NodeData>[];\n\n protected links: LinkInterface<NodeData, LinkData>[];\n\n protected particles: (LinkParticle[] | undefined)[] = [];\n\n protected width: number;\n\n protected height: number;\n\n protected root: HTMLElement;\n\n protected container: HTMLDivElement | undefined | null;\n\n protected area: HTMLCanvasElement | null | undefined;\n\n /** settings */\n\n protected graphSettings: Required<GraphSettingsInterface<NodeData>>;\n\n protected forceSettings: Required<ForceSettingsInterface<NodeData, LinkData>>;\n\n protected highlightSettings: Required<HighlightSettingsInterface>;\n\n protected nodeSettings: Required<Omit<NodeSettingsInterface<NodeData, LinkData>, \"options\">> &\n Pick<NodeSettingsInterface<NodeData, LinkData>, \"options\">;\n\n protected linkSettings: Required<Omit<LinkSettingsInterface<NodeData, LinkData>, \"options\">> &\n Pick<LinkSettingsInterface<NodeData, LinkData>, \"options\">;\n\n protected listeners: ListenersInterface<NodeData, LinkData>;\n\n /** service */\n\n protected context: CanvasRenderingContext2D | null | undefined;\n\n protected simulation: GraphCanvasSimulation<NodeData, LinkData> | undefined;\n\n protected areaTransform: ZoomTransform = zoomIdentity;\n\n protected _translateExtent: [[number, number], [number, number]] | undefined;\n\n protected areaRect: DOMRect | undefined;\n\n protected draw: (this: GraphCanvas<NodeData, LinkData>) => void;\n\n protected eventAbortController: AbortController;\n\n protected cachedNodeText: (string[] | undefined)[] = [];\n\n protected cachedNodeLabel: (string[] | undefined)[] = [];\n\n protected linkOptionsCache: (Required<LinkOptionsInterface<NodeData, LinkData>> | undefined)[] =\n [];\n\n protected nodeOptionsCache: (Required<NodeOptionsInterface<NodeData, LinkData>> | undefined)[] =\n [];\n\n protected isDragging: boolean = false;\n\n protected highlightedNode: NodeInterface<NodeData> | null = null;\n\n protected highlightedLink: LinkInterface<NodeData, LinkData> | null = null;\n\n protected highlightedNeighbors: Set<string | number> | null = null;\n\n protected highlightProgress: number = 1;\n\n protected highlightStart: number | null = null;\n\n protected highlightPositive: boolean = false;\n\n protected highlightController: AbortController | undefined;\n\n protected _lastNodeZoomK: number | undefined;\n\n protected _lastLinkZoomK: number | undefined;\n\n protected _zoomAnimating: boolean = false;\n\n protected get simulationWorking() {\n const simulationAlpha = this.simulation?.alpha?.() ?? 0;\n const simulationAlphaMin = this.simulation?.alphaMin?.() ?? 0;\n const simulationAlphaDecay = this.simulation?.alphaDecay?.() ?? 0;\n const force = (simulationAlpha - simulationAlphaMin) / simulationAlphaDecay;\n\n return force > 0;\n }\n\n constructor({\n links,\n nodes,\n root,\n forceSettings,\n linkSettings,\n listeners,\n nodeSettings,\n graphSettings,\n highlightSettings,\n }: GraphCanvasInterface<NodeData, LinkData>) {\n // root.style.position = \"relative\";\n root.style.overflow = \"hidden\";\n\n this.root = root;\n\n this.forceSettings = forceSettingsGetter(forceSettings);\n this.linkSettings = linkSettingsGetter(linkSettings);\n this.nodeSettings = nodeSettingsGetter(nodeSettings);\n this.listeners = listenersGetter(listeners);\n this.graphSettings = graphSettingsGetter(graphSettings);\n this.highlightSettings = highlightSettingsGetter(highlightSettings);\n\n this.eventAbortController = new AbortController();\n\n this.nodes = nodes;\n this.links = links;\n this.height = 0;\n this.width = 0;\n\n this.draw = initDraw.call<\n GraphCanvas<NodeData, LinkData>,\n Parameters<typeof initDraw>,\n ReturnType<typeof initDraw>\n >(this);\n\n this.init();\n }\n\n get dpi() {\n return devicePixelRatio;\n }\n\n getData = (): Pick<GraphCanvasInterface<NodeData, LinkData>, \"nodes\" | \"links\"> => {\n return {\n links: this.links,\n nodes: this.nodes,\n };\n };\n\n fitToView = (\n margin: number = this.graphSettings.zoomToFitMargin,\n duration: number = this.graphSettings.zoomAnimationDuration,\n ) => {\n const area = this.area;\n if (!area) return;\n\n const bounds = computeGraphBounds(this.nodes);\n if (!bounds) return;\n\n const graphWidth = bounds.maxX - bounds.minX;\n const graphHeight = bounds.maxY - bounds.minY;\n if (graphWidth === 0 || graphHeight === 0) return;\n const graphCenterX = bounds.minX + graphWidth / 2;\n const graphCenterY = bounds.minY + graphHeight / 2;\n const scale = (1 - margin) / Math.max(graphWidth / this.width, graphHeight / this.height);\n\n const clampedScale = Math.min(scale, this.graphSettings.zoomExtent?.[1] ?? scale);\n const target = zoomIdentity\n .translate(this.width / 2, this.height / 2)\n .scale(clampedScale)\n .translate(-graphCenterX, -graphCenterY);\n if (!this.graphSettings.zoomAnimation) {\n this.areaTransform = target;\n zoom<HTMLCanvasElement, unknown>().transform(d3Select(area), target);\n this.clearCache(true);\n this.tick();\n return;\n }\n this.animateZoom(area, target, this.areaTransform, duration);\n };\n\n focusOnNode = (\n nodeId: string | number,\n scale: number = this.graphSettings.zoomToNodeScale,\n duration: number = this.graphSettings.zoomAnimationDuration,\n ) => {\n const area = this.area;\n if (!area) return;\n\n const node = this.nodes.find((n) => n.id === nodeId);\n if (!node) return;\n if (node.x == undefined || node.y == undefined) return;\n\n const target = zoomIdentity\n .translate(this.width / 2, this.height / 2)\n .scale(scale)\n .translate(-node.x, -node.y);\n if (!this.graphSettings.zoomAnimation) {\n this.areaTransform = target;\n zoom<HTMLCanvasElement, unknown>().transform(d3Select(area), target);\n this.clearCache(true);\n this.tick();\n return;\n }\n this.animateZoom(area, target, this.areaTransform, duration);\n };\n changeData = (\n options: Pick<Partial<GraphCanvasInterface<NodeData, LinkData>>, \"links\" | \"nodes\">,\n alpha: number = 0.5,\n clearCache: boolean | GraphCanvasCacheKeys[] = true,\n precompute: boolean = false,\n ) => {\n if (options.links != undefined) this.links = options.links;\n if (options.nodes != undefined) this.nodes = options.nodes;\n if (options.nodes != undefined || options.links != undefined) {\n this.updateData(alpha, clearCache, precompute);\n }\n };\n\n changeSettings = (\n options: Omit<\n Partial<GraphCanvasInterface<NodeData, LinkData>>,\n \"links\" | \"nodes\" | \"listeners\"\n >,\n clearCache: boolean | GraphCanvasCacheKeys[] = true,\n precompute: boolean = false,\n ) => {\n if (options.graphSettings) {\n this.graphSettings = graphSettingsGetter(options.graphSettings, this.graphSettings);\n\n this.draw = initDraw.call<\n GraphCanvas<NodeData, LinkData>,\n Parameters<typeof initDraw>,\n ReturnType<typeof initDraw>\n >(this);\n initZoom.call<\n GraphCanvas<NodeData, LinkData>,\n Parameters<typeof initZoom>,\n ReturnType<typeof initZoom>\n >(this, this.areaTransform);\n }\n if (options.forceSettings) {\n this.forceSettings = forceSettingsGetter(options.forceSettings, this.forceSettings);\n }\n if (options.highlightSettings) {\n this.highlightSettings = highlightSettingsGetter(\n options.highlightSettings,\n this.highlightSettings,\n );\n\n if (clearCache === true) {\n this.clearCache([\n GRAPH_CACHE_TYPE.NodeOptions,\n GRAPH_CACHE_TYPE.NodeText,\n GRAPH_CACHE_TYPE.NodeLabel,\n GRAPH_CACHE_TYPE.LinkOptions,\n ]);\n } else {\n this.clearCache(clearCache);\n }\n }\n if (options.linkSettings) {\n this.linkSettings = linkSettingsGetter(options.linkSettings, this.linkSettings);\n\n if (clearCache) {\n this.clearCache([GRAPH_CACHE_TYPE.LinkOptions]);\n } else {\n this.clearCache(clearCache);\n }\n }\n if (options.nodeSettings) {\n this.nodeSettings = nodeSettingsGetter(options.nodeSettings, this.nodeSettings);\n\n if (clearCache) {\n this.clearCache([\n GRAPH_CACHE_TYPE.NodeOptions,\n GRAPH_CACHE_TYPE.NodeText,\n GRAPH_CACHE_TYPE.NodeLabel,\n ]);\n } else {\n this.clearCache(clearCache);\n }\n\n initCollideForce.call<\n GraphCanvas<NodeData, LinkData>,\n Parameters<typeof initCollideForce>,\n ReturnType<typeof initCollideForce>\n >(this, true);\n }\n\n if (options.forceSettings) {\n return void this.updateSimulation(precompute);\n }\n\n this.tick();\n };\n\n updateRect = () => {\n if (!this.area) return;\n\n this.areaRect = this.area.getBoundingClientRect();\n };\n\n updateSize = () => {\n if (!this.area) return;\n\n const { width, height } = this.root.getBoundingClientRect();\n this.width = width;\n this.height = height;\n this.area.width = this.dpi * this.width;\n this.area.height = this.dpi * this.height;\n this.areaRect = this.area.getBoundingClientRect();\n\n this.context = this.area.getContext(\"2d\");\n if (!this.context) throw new Error(\"couldn't create canvas context\");\n this.context.scale(this.dpi, this.dpi);\n this.draw();\n };\n\n clearCache = (keys: boolean | GraphCanvasCacheKeys[]) => {\n if (keys === true) {\n this.nodeOptionsCache.length = 0;\n this.linkOptionsCache.length = 0;\n this.cachedNodeLabel.length = 0;\n this.cachedNodeText.length = 0;\n } else if (isArray(keys)) {\n for (const key of keys) {\n switch (key) {\n case GRAPH_CACHE_TYPE.NodeText: {\n this.cachedNodeText.length = 0;\n break;\n }\n case GRAPH_CACHE_TYPE.NodeLabel: {\n this.cachedNodeLabel.length = 0;\n break;\n }\n case GRAPH_CACHE_TYPE.NodeOptions: {\n this.nodeOptionsCache.length = 0;\n break;\n }\n case GRAPH_CACHE_TYPE.LinkOptions: {\n this.linkOptionsCache.length = 0;\n break;\n }\n default: {\n break;\n }\n }\n }\n }\n\n updateNodeCache.call<\n GraphCanvas<NodeData, LinkData>,\n Parameters<typeof updateNodeCache>,\n ReturnType<typeof updateNodeCache>\n >(this);\n updateLinkCache.call<\n GraphCanvas<NodeData, LinkData>,\n Parameters<typeof updateLinkCache>,\n ReturnType<typeof updateLinkCache>\n >(this);\n };\n\n tick = () => {\n if (!this.simulationWorking) this.draw();\n };\n\n restart = (alpha?: number, options?: Partial<PrecomputeForceSettingsInterface>) => {\n if (!this.simulation) return;\n\n const settings: Required<PrecomputeForceSettingsInterface> = {\n precompute: options?.precompute ?? this.forceSettings.precompute,\n precomputeMaxTimeMs: options?.precomputeMaxTimeMs ?? this.forceSettings?.precomputeMaxTimeMs,\n precomputeMaxTicks:\n options?.precomputeMaxTicks ?? this.forceSettings?.precomputeMaxTicks ?? 300,\n precomputeDisableForcesAfter:\n options?.precomputeDisableForcesAfter ??\n this.forceSettings?.precomputeDisableForcesAfter ??\n false,\n };\n if (!settings.precompute) {\n this.simulation.alpha(alpha ?? 1).restart();\n return;\n }\n if (settings.precomputeDisableForcesAfter) {\n this.forceSettings = forceSettingsGetter({ forces: true }, this.forceSettings);\n }\n initSimulationForces.call<\n GraphCanvas<NodeData, LinkData>,\n Parameters<typeof initSimulationForces>,\n ReturnType<typeof initSimulationForces>\n >(this);\n this.simulation.stop();\n this.simulation.alpha(alpha ?? 1);\n\n const startTime = performance.now();\n let ticks = 0;\n while (\n performance.now() - startTime < settings.precomputeMaxTimeMs &&\n ticks < settings.precomputeMaxTicks\n ) {\n this.simulation.tick(1);\n ticks++;\n if (this.simulation.alpha() <= this.simulation.alphaMin()) break;\n }\n if (settings.precomputeDisableForcesAfter) {\n this.forceSettings = forceSettingsGetter({ forces: false }, this.forceSettings);\n }\n initSimulationForces.call<\n GraphCanvas<NodeData, LinkData>,\n Parameters<typeof initSimulationForces>,\n ReturnType<typeof initSimulationForces>\n >(this);\n this.simulation.restart();\n this.tick();\n };\n\n start = () => {\n if (this.simulation) this.simulation.alpha(1).restart();\n if (this.container) this.container.style.display = \"block\";\n };\n\n stop = () => {\n if (this.simulation) this.simulation.stop();\n if (this.container) this.container.style.display = \"none\";\n };\n\n create = () => {\n this.init();\n };\n\n destroy = () => {\n if (this.simulation) {\n this.simulation.stop();\n this.simulation = undefined;\n }\n\n this.clearHTMLElements();\n this.clearState();\n this.clearCache(true);\n };\n\n protected clearHTMLElements = () => {\n this.root.replaceChildren();\n this.area = undefined;\n this.context = undefined;\n this.container = undefined;\n this.eventAbortController.abort();\n this.eventAbortController = new AbortController();\n };\n\n protected updateSimulation = (precompute: boolean = false) => {\n if (this.simulation) {\n initSimulationForces.call<\n GraphCanvas<NodeData, LinkData>,\n Parameters<typeof initSimulationForces>,\n ReturnType<typeof initSimulationForces>\n >(this);\n this.restart(1, { precompute });\n }\n };\n\n protected clearState = () => {\n this.isDragging = false;\n this.highlightedNode = null;\n this.highlightedLink = null;\n this.highlightedNeighbors = null;\n this.highlightProgress = 0;\n this.highlightStart = null;\n this.highlightPositive = false;\n };\n\n protected init = () => {\n initArea.call<\n GraphCanvas<NodeData, LinkData>,\n Parameters<typeof initArea>,\n ReturnType<typeof initArea>\n >(this);\n updateNodeCache.call<\n GraphCanvas<NodeData, LinkData>,\n Parameters<typeof updateNodeCache>,\n ReturnType<typeof updateNodeCache>\n >(this);\n updateLinkCache.call<\n GraphCanvas<NodeData, LinkData>,\n Parameters<typeof updateLinkCache>,\n ReturnType<typeof updateLinkCache>\n >(this);\n initSimulation.call<\n GraphCanvas<NodeData, LinkData>,\n Parameters<typeof initSimulation>,\n ReturnType<typeof initSimulation>\n >(this);\n this.restart(1);\n initDnd.call<\n GraphCanvas<NodeData, LinkData>,\n Parameters<typeof initDnd>,\n ReturnType<typeof initDnd>\n >(this);\n initZoom.call<\n GraphCanvas<NodeData, LinkData>,\n Parameters<typeof initZoom>,\n ReturnType<typeof initZoom>\n >(this);\n initResize.call<\n GraphCanvas<NodeData, LinkData>,\n Parameters<typeof initResize>,\n ReturnType<typeof initResize>\n >(this);\n initPointer.call<\n GraphCanvas<NodeData, LinkData>,\n Parameters<typeof initPointer>,\n ReturnType<typeof initPointer>\n >(this);\n updateNodeCache.call<\n GraphCanvas<NodeData, LinkData>,\n Parameters<typeof updateNodeCache>,\n ReturnType<typeof updateNodeCache>\n >(this);\n updateLinkCache.call<\n GraphCanvas<NodeData, LinkData>,\n Parameters<typeof updateLinkCache>,\n ReturnType<typeof updateLinkCache>\n >(this);\n this.tick();\n };\n\n protected updateData = (\n alpha: number = 0.5,\n clearCache: boolean | GraphCanvasCacheKeys[] = true,\n precompute: boolean = false,\n ) => {\n if (clearCache) {\n this.clearCache(clearCache);\n }\n\n if (this.simulation) {\n initCollideForce.call<\n GraphCanvas<NodeData, LinkData>,\n Parameters<typeof initCollideForce>,\n ReturnType<typeof initCollideForce>\n >(this, false);\n\n this.simulation.nodes(this.nodes).force(\n \"link\",\n forceLink<NodeInterface<NodeData>, LinkInterface<NodeData, LinkData>>(this.links)\n .id(this.nodeSettings.idGetter.bind(this))\n .distance(\n this.forceSettings.forces && this.forceSettings.linkForce\n ? this.forceSettings.linkDistance\n : 0,\n )\n .strength(\n this.forceSettings.forces && this.forceSettings.linkForce\n ? this.forceSettings.linkStrength\n : 0,\n )\n .iterations(\n this.forceSettings.forces && this.forceSettings.linkForce\n ? this.forceSettings.linkIterations\n : 0,\n ),\n );\n this.restart(alpha, { precompute });\n initZoom.call<\n GraphCanvas<NodeData, LinkData>,\n Parameters<typeof initZoom>,\n ReturnType<typeof initZoom>\n >(this, this.areaTransform);\n }\n };\n\n protected animateHighlight = (\n node: NodeInterface<NodeData> | undefined,\n link: LinkInterface<NodeData, LinkData> | undefined,\n baseDuration: number = this.highlightSettings.highlightDuration,\n ) => {\n let positive = true;\n if (node && (this.highlightedNode !== node || !this.highlightPositive)) {\n this.highlightedNode = node;\n this.highlightedNeighbors = new Set(node.neighbors);\n this.particles = [];\n this.highlightedLink = null;\n this.highlightStart = performance.now();\n } else if (link && (this.highlightedLink !== link || !this.highlightPositive)) {\n const { sourceId, targetId } = extractLinkPointIds(link);\n this.highlightProgress = 0;\n this.highlightedLink = link;\n this.highlightedNeighbors = new Set([sourceId, targetId]);\n this.particles = [];\n this.highlightedNode = null;\n this.highlightStart = performance.now();\n } else if (!node && !link && this.highlightPositive) {\n positive = false;\n } else {\n return;\n }\n if (this.highlightController) {\n this.highlightController.abort();\n }\n const controller = new AbortController();\n this.highlightPositive = positive;\n this.highlightController = controller;\n const startTime = performance.now();\n const startProgress = this.highlightProgress;\n const targetProgress = positive ? 1 : 0;\n const delta = targetProgress - startProgress;\n const duration = baseDuration * Math.abs(delta);\n\n const animate = () => {\n if (controller.signal.aborted) return;\n const elapsed = performance.now() - startTime;\n const t = Math.min(elapsed / duration, 1);\n const current = startProgress + delta * t;\n const eased =\n current < 0.5 ? 4 * current * current * current : 1 - (-2 * current + 2) ** 3 / 2;\n this.highlightProgress = eased;\n\n if (t < 1 || positive) {\n requestAnimationFrame(animate);\n this.draw();\n } else {\n this.highlightedNode = null;\n this.highlightedLink = null;\n this.highlightedNeighbors = null;\n this.highlightStart = null;\n this.particles = [];\n this.tick();\n }\n };\n requestAnimationFrame(animate);\n };\n\n protected animateZoom = (\n area: HTMLCanvasElement,\n target: ZoomTransform,\n start: ZoomTransform,\n duration: number,\n ) => {\n this._zoomAnimating = true;\n const startTime = performance.now();\n const animate = () => {\n const elapsed = performance.now() - startTime;\n const t = Math.min(elapsed / duration, 1);\n const eased = t < 0.5 ? 4 * t * t * t : 1 - (-2 * t + 2) ** 3 / 2;\n const x = start.x + (target.x - start.x) * eased;\n const y = start.y + (target.y - start.y) * eased;\n const k = start.k + (target.k - start.k) * eased;\n\n this.areaTransform = new ZoomTransform(k, x, y);\n zoom<HTMLCanvasElement, unknown>().transform(d3Select(area), this.areaTransform);\n updateLinkCache.call<\n GraphCanvas<NodeData, LinkData>,\n Parameters<typeof updateLinkCache>,\n ReturnType<typeof updateLinkCache>\n >(this);\n updateNodeCache.call<\n GraphCanvas<NodeData, LinkData>,\n Parameters<typeof updateNodeCache>,\n ReturnType<typeof updateNodeCache>\n >(this);\n this.tick();\n\n if (t < 1) {\n requestAnimationFrame(animate);\n } else {\n this._zoomAnimating = false;\n this.clearCache(true);\n this.tick();\n }\n };\n requestAnimationFrame(animate);\n };\n}\n"],"names":["d3Select"],"mappings":"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"}
|
package/lib/index.d.ts
CHANGED
|
@@ -388,7 +388,7 @@ declare class GraphCanvas<NodeData extends Record<string, unknown>, LinkData ext
|
|
|
388
388
|
protected areaTransform: ZoomTransform;
|
|
389
389
|
protected _translateExtent: [[number, number], [number, number]] | undefined;
|
|
390
390
|
protected areaRect: DOMRect | undefined;
|
|
391
|
-
protected draw: (this: GraphCanvas<NodeData, LinkData
|
|
391
|
+
protected draw: (this: GraphCanvas<NodeData, LinkData>) => void;
|
|
392
392
|
protected eventAbortController: AbortController;
|
|
393
393
|
protected cachedNodeText: (string[] | undefined)[];
|
|
394
394
|
protected cachedNodeLabel: (string[] | undefined)[];
|
|
@@ -408,27 +408,27 @@ declare class GraphCanvas<NodeData extends Record<string, unknown>, LinkData ext
|
|
|
408
408
|
protected get simulationWorking(): boolean;
|
|
409
409
|
constructor({ links, nodes, root, forceSettings, linkSettings, listeners, nodeSettings, graphSettings, highlightSettings, }: GraphCanvasInterface<NodeData, LinkData>);
|
|
410
410
|
get dpi(): number;
|
|
411
|
-
getData()
|
|
412
|
-
fitToView(margin?: number, duration?: number)
|
|
413
|
-
focusOnNode(nodeId: string | number, scale?: number, duration?: number)
|
|
414
|
-
|
|
415
|
-
|
|
416
|
-
|
|
417
|
-
|
|
418
|
-
|
|
419
|
-
|
|
420
|
-
|
|
421
|
-
|
|
422
|
-
|
|
423
|
-
|
|
424
|
-
|
|
425
|
-
|
|
426
|
-
|
|
427
|
-
protected
|
|
428
|
-
protected
|
|
429
|
-
protected
|
|
430
|
-
protected
|
|
431
|
-
protected
|
|
411
|
+
getData: () => Pick<GraphCanvasInterface<NodeData, LinkData>, "nodes" | "links">;
|
|
412
|
+
fitToView: (margin?: number, duration?: number) => void;
|
|
413
|
+
focusOnNode: (nodeId: string | number, scale?: number, duration?: number) => void;
|
|
414
|
+
changeData: (options: Pick<Partial<GraphCanvasInterface<NodeData, LinkData>>, "links" | "nodes">, alpha?: number, clearCache?: boolean | GraphCanvasCacheKeys[], precompute?: boolean) => void;
|
|
415
|
+
changeSettings: (options: Omit<Partial<GraphCanvasInterface<NodeData, LinkData>>, "links" | "nodes" | "listeners">, clearCache?: boolean | GraphCanvasCacheKeys[], precompute?: boolean) => undefined;
|
|
416
|
+
updateRect: () => void;
|
|
417
|
+
updateSize: () => void;
|
|
418
|
+
clearCache: (keys: boolean | GraphCanvasCacheKeys[]) => void;
|
|
419
|
+
tick: () => void;
|
|
420
|
+
restart: (alpha?: number, options?: Partial<PrecomputeForceSettingsInterface>) => void;
|
|
421
|
+
start: () => void;
|
|
422
|
+
stop: () => void;
|
|
423
|
+
create: () => void;
|
|
424
|
+
destroy: () => void;
|
|
425
|
+
protected clearHTMLElements: () => void;
|
|
426
|
+
protected updateSimulation: (precompute?: boolean) => void;
|
|
427
|
+
protected clearState: () => void;
|
|
428
|
+
protected init: () => void;
|
|
429
|
+
protected updateData: (alpha?: number, clearCache?: boolean | GraphCanvasCacheKeys[], precompute?: boolean) => void;
|
|
430
|
+
protected animateHighlight: (node: NodeInterface<NodeData> | undefined, link: LinkInterface<NodeData, LinkData> | undefined, baseDuration?: number) => void;
|
|
431
|
+
protected animateZoom: (area: HTMLCanvasElement, target: ZoomTransform, start: ZoomTransform, duration: number) => void;
|
|
432
432
|
}
|
|
433
433
|
|
|
434
434
|
declare function forceSettingsGetter<NodeData extends Record<string, unknown>, LinkData extends Record<string, unknown>>(settings: ForceSettingsInterface<NodeData, LinkData> | undefined, prevSettings?: Required<ForceSettingsInterface<NodeData, LinkData>>): Required<ForceSettingsInterface<NodeData, LinkData>>;
|