@krainovsd/graph 0.12.0-beta.5 → 0.12.0-beta.6
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.
|
@@ -141,7 +141,38 @@ class GraphCanvas {
|
|
|
141
141
|
this.area.width = this.dpi * this.width;
|
|
142
142
|
this.area.height = this.dpi * this.height;
|
|
143
143
|
this.areaRect = this.area.getBoundingClientRect();
|
|
144
|
+
this.context = this.area.getContext("2d");
|
|
145
|
+
if (!this.context)
|
|
146
|
+
throw new Error("couldn't create canvas context");
|
|
147
|
+
this.context.scale(this.dpi, this.dpi);
|
|
144
148
|
this.draw();
|
|
149
|
+
// this.clearHTMLElements();
|
|
150
|
+
// initArea.call<
|
|
151
|
+
// GraphCanvas<NodeData, LinkData>,
|
|
152
|
+
// Parameters<typeof initArea>,
|
|
153
|
+
// ReturnType<typeof initArea>
|
|
154
|
+
// >(this);
|
|
155
|
+
// initDnd.call<
|
|
156
|
+
// GraphCanvas<NodeData, LinkData>,
|
|
157
|
+
// Parameters<typeof initDnd>,
|
|
158
|
+
// ReturnType<typeof initDnd>
|
|
159
|
+
// >(this);
|
|
160
|
+
// initZoom.call<
|
|
161
|
+
// GraphCanvas<NodeData, LinkData>,
|
|
162
|
+
// Parameters<typeof initZoom>,
|
|
163
|
+
// ReturnType<typeof initZoom>
|
|
164
|
+
// >(this);
|
|
165
|
+
// initResize.call<
|
|
166
|
+
// GraphCanvas<NodeData, LinkData>,
|
|
167
|
+
// Parameters<typeof initResize>,
|
|
168
|
+
// ReturnType<typeof initResize>
|
|
169
|
+
// >(this);
|
|
170
|
+
// initPointer.call<
|
|
171
|
+
// GraphCanvas<NodeData, LinkData>,
|
|
172
|
+
// Parameters<typeof initPointer>,
|
|
173
|
+
// ReturnType<typeof initPointer>
|
|
174
|
+
// >(this);
|
|
175
|
+
// this.draw();
|
|
145
176
|
}
|
|
146
177
|
clearCache(keys) {
|
|
147
178
|
if (!keys) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"GraphCanvas.js","sources":["../../../../src/module/GraphCanvas/GraphCanvas.ts"],"sourcesContent":["import { forceLink } from \"d3-force\";\nimport { type ZoomTransform, zoomIdentity } from \"d3-zoom\";\nimport {\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 CachedNodeTextInterface,\n ForceSettingsInterface,\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} 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: Record<string, LinkParticle[]> = {};\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 areaRect: DOMRect | undefined;\n\n protected draw: (this: GraphCanvas<NodeData, LinkData>, recursive?: boolean) => void;\n\n protected eventAbortController: AbortController;\n\n protected cachedNodeText: CachedNodeTextInterface = {};\n\n protected cachedNodeLabel: CachedNodeTextInterface = {};\n\n protected linkOptionsCache: Record<string, Required<LinkOptionsInterface<NodeData, LinkData>>> =\n {};\n\n protected nodeOptionsCache: Record<string, Required<NodeOptionsInterface<NodeData, LinkData>>> =\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 highlightWorking: 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 changeData(\n options: Pick<Partial<GraphCanvasInterface<NodeData, LinkData>>, \"links\" | \"nodes\">,\n alpha: number = 0.5,\n clearCache: boolean = 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 changeSettings(\n options: Omit<\n Partial<GraphCanvasInterface<NodeData, LinkData>>,\n \"links\" | \"nodes\" | \"listeners\"\n >,\n clearCache: boolean = 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) {\n this.clearCache([\"nodeOptionsCache\", \"linkOptionsCache\"]);\n }\n }\n if (options.linkSettings) {\n this.linkSettings = linkSettingsGetter(options.linkSettings, this.linkSettings);\n\n if (clearCache) {\n this.clearCache([\"linkOptionsCache\"]);\n }\n }\n if (options.nodeSettings) {\n this.nodeSettings = nodeSettingsGetter(options.nodeSettings, this.nodeSettings);\n\n if (clearCache) {\n this.clearCache([\"nodeOptionsCache\"]);\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.draw();\n }\n\n clearCache(keys?: (\"nodeOptionsCache\" | \"linkOptionsCache\")[]) {\n if (!keys) {\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 } else {\n for (let i = 0; i < keys.length; i++) {\n const key = keys[i];\n if (key === \"nodeOptionsCache\") {\n updateNodeCache.call<\n GraphCanvas<NodeData, LinkData>,\n Parameters<typeof updateNodeCache>,\n ReturnType<typeof updateNodeCache>\n >(this);\n } else {\n updateLinkCache.call<\n GraphCanvas<NodeData, LinkData>,\n Parameters<typeof updateLinkCache>,\n ReturnType<typeof updateLinkCache>\n >(this);\n }\n }\n }\n }\n\n tick() {\n if (!this.simulationWorking && !this.highlightWorking) this.draw();\n }\n\n restart(alpha?: number) {\n if (this.simulation) this.simulation.alpha(alpha ?? 1).restart();\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();\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.simulation.alpha(1);\n this.simulation.restart();\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.highlightWorking = false;\n }\n\n protected updateData(alpha: number = 0.5, clearCache: boolean = true) {\n if (clearCache) {\n this.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\n .nodes(this.nodes)\n .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 .alpha(alpha)\n .restart();\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 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":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"GraphCanvas.js","sources":["../../../../src/module/GraphCanvas/GraphCanvas.ts"],"sourcesContent":["import { forceLink } from \"d3-force\";\nimport { type ZoomTransform, zoomIdentity } from \"d3-zoom\";\nimport {\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 CachedNodeTextInterface,\n ForceSettingsInterface,\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} 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: Record<string, LinkParticle[]> = {};\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 areaRect: DOMRect | undefined;\n\n protected draw: (this: GraphCanvas<NodeData, LinkData>, recursive?: boolean) => void;\n\n protected eventAbortController: AbortController;\n\n protected cachedNodeText: CachedNodeTextInterface = {};\n\n protected cachedNodeLabel: CachedNodeTextInterface = {};\n\n protected linkOptionsCache: Record<string, Required<LinkOptionsInterface<NodeData, LinkData>>> =\n {};\n\n protected nodeOptionsCache: Record<string, Required<NodeOptionsInterface<NodeData, LinkData>>> =\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 highlightWorking: 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 changeData(\n options: Pick<Partial<GraphCanvasInterface<NodeData, LinkData>>, \"links\" | \"nodes\">,\n alpha: number = 0.5,\n clearCache: boolean = 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 changeSettings(\n options: Omit<\n Partial<GraphCanvasInterface<NodeData, LinkData>>,\n \"links\" | \"nodes\" | \"listeners\"\n >,\n clearCache: boolean = 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) {\n this.clearCache([\"nodeOptionsCache\", \"linkOptionsCache\"]);\n }\n }\n if (options.linkSettings) {\n this.linkSettings = linkSettingsGetter(options.linkSettings, this.linkSettings);\n\n if (clearCache) {\n this.clearCache([\"linkOptionsCache\"]);\n }\n }\n if (options.nodeSettings) {\n this.nodeSettings = nodeSettingsGetter(options.nodeSettings, this.nodeSettings);\n\n if (clearCache) {\n this.clearCache([\"nodeOptionsCache\"]);\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 // this.clearHTMLElements();\n\n // initArea.call<\n // GraphCanvas<NodeData, LinkData>,\n // Parameters<typeof initArea>,\n // ReturnType<typeof initArea>\n // >(this);\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 // this.draw();\n }\n\n clearCache(keys?: (\"nodeOptionsCache\" | \"linkOptionsCache\")[]) {\n if (!keys) {\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 } else {\n for (let i = 0; i < keys.length; i++) {\n const key = keys[i];\n if (key === \"nodeOptionsCache\") {\n updateNodeCache.call<\n GraphCanvas<NodeData, LinkData>,\n Parameters<typeof updateNodeCache>,\n ReturnType<typeof updateNodeCache>\n >(this);\n } else {\n updateLinkCache.call<\n GraphCanvas<NodeData, LinkData>,\n Parameters<typeof updateLinkCache>,\n ReturnType<typeof updateLinkCache>\n >(this);\n }\n }\n }\n }\n\n tick() {\n if (!this.simulationWorking && !this.highlightWorking) this.draw();\n }\n\n restart(alpha?: number) {\n if (this.simulation) this.simulation.alpha(alpha ?? 1).restart();\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();\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.simulation.alpha(1);\n this.simulation.restart();\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.highlightWorking = false;\n }\n\n protected updateData(alpha: number = 0.5, clearCache: boolean = true) {\n if (clearCache) {\n this.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\n .nodes(this.nodes)\n .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 .alpha(alpha)\n .restart();\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 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":[],"mappings":"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"}
|