@unovis/ts 1.5.0-alpha.5 → 1.5.0-alpha.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.
- package/components/crosshair/index.js +2 -0
- package/components/crosshair/index.js.map +1 -1
- package/components/graph/index.js +13 -2
- package/components/graph/index.js.map +1 -1
- package/components/graph/modules/layout.js +6 -2
- package/components/graph/modules/layout.js.map +1 -1
- package/components/tooltip/config.d.ts +8 -2
- package/components/tooltip/config.js +1 -0
- package/components/tooltip/config.js.map +1 -1
- package/components/tooltip/index.js +19 -8
- package/components/tooltip/index.js.map +1 -1
- package/package.json +1 -1
|
@@ -140,6 +140,8 @@ class Crosshair extends XYComponentCore {
|
|
|
140
140
|
const container = tooltip.getContainer() || this.container.node();
|
|
141
141
|
const [x, y] = tooltip.isContainerBody() ? [event.clientX, event.clientY] : pointer(event, container);
|
|
142
142
|
const content = config.template(this.datum, this.xScale.invert(this.x));
|
|
143
|
+
// Force set `followCursor` to `true` because we don't want Crosshair's tooltip to be hoverable
|
|
144
|
+
tooltip.config.followCursor = true;
|
|
143
145
|
if (content)
|
|
144
146
|
tooltip.show(content, { x, y });
|
|
145
147
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../../../src/components/crosshair/index.ts"],"sourcesContent":["import { Selection, pointer } from 'd3-selection'\nimport { easeLinear } from 'd3-ease'\n\n// Core\nimport { XYComponentCore } from 'core/xy-component'\nimport { Tooltip } from 'components/tooltip'\n\n// Utils\nimport { isNumber, isArray, getNumber, clamp, getStackedValues, getNearest, isFunction } from 'utils/data'\nimport { smartTransition } from 'utils/d3'\nimport { getColor } from 'utils/color'\n\n// Local Types\nimport { CrosshairAccessors, CrosshairCircle } from './types'\n\n// Config\nimport { CrosshairDefaultConfig, CrosshairConfigInterface } from './config'\n\n// Styles\nimport * as s from './style'\n\nexport class Crosshair<Datum> extends XYComponentCore<Datum, CrosshairConfigInterface<Datum>> {\n static selectors = s\n clippable = true // Don't apply clipping path to this component. See XYContainer\n protected _defaultConfig = CrosshairDefaultConfig as CrosshairConfigInterface<Datum>\n public config: CrosshairConfigInterface<Datum> = this._defaultConfig\n container: Selection<SVGSVGElement, any, SVGSVGElement, any>\n line: Selection<SVGLineElement, any, SVGElement, any>\n x = 0\n datum: Datum\n datumIndex: number\n show = false\n private _animFrameId: number = null\n\n /** Tooltip component to be used by Crosshair if not provided by the config.\n * This property is supposed to be set externally by a container component like XYContainer. */\n public tooltip: Tooltip\n\n /** Accessors passed externally (e.g. from XYContainer) */\n private _accessors: CrosshairAccessors<Datum> = {\n x: undefined,\n y: undefined,\n yStacked: undefined,\n baseline: undefined,\n }\n\n public set accessors (accessors: CrosshairAccessors<Datum>) { this._accessors = accessors }\n public get accessors (): CrosshairAccessors<Datum> {\n const { config } = this\n\n const hasConfig = !!(config.x || config.y || config.yStacked)\n const x = hasConfig ? config.x : this._accessors.x\n const yAcc = hasConfig ? config.y : this._accessors.y\n const y = yAcc ? (isArray(yAcc) ? yAcc : [yAcc]) : undefined\n const yStacked = hasConfig ? config.yStacked : this._accessors.yStacked\n const baseline = config.baseline ?? this._accessors.baseline\n\n return { x, y, yStacked, baseline }\n }\n\n constructor (config?: CrosshairConfigInterface<Datum>) {\n super()\n if (config) this.setConfig(config)\n\n this.g.style('opacity', this.show ? 1 : 0)\n this.line = this.g.append('line')\n .attr('class', s.line)\n }\n\n setContainer (containerSvg: Selection<SVGSVGElement, unknown, SVGSVGElement, unknown>): void {\n // Set up mousemove event for Crosshair\n this.container = containerSvg\n this.container.on('mousemove.crosshair', this._onMouseMove.bind(this))\n this.container.on('mouseout.crosshair', this._onMouseOut.bind(this))\n }\n\n _render (customDuration?: number): void {\n const { config } = this\n if (config.snapToData && !this.datum) return\n const duration = isNumber(customDuration) ? customDuration : config.duration\n\n smartTransition(this.g, duration)\n .style('opacity', this.show ? 1 : 0)\n\n this.line\n .attr('y1', 0)\n .attr('y1', this._height)\n\n smartTransition(this.line, duration, easeLinear)\n .attr('x1', this.x)\n .attr('x2', this.x)\n\n const circleData = this.getCircleData()\n const circles = this.g\n .selectAll<SVGCircleElement, CrosshairCircle>('circle')\n .data(circleData, (d, i) => d.id ?? i)\n\n const circlesEnter = circles.enter()\n .append('circle')\n .attr('class', s.circle)\n .attr('r', 0)\n .attr('cx', this.x)\n .attr('cy', d => d.y)\n .style('fill', d => d.color)\n .style('stroke', d => d.strokeColor)\n .style('stroke-width', d => d.strokeWidth)\n\n smartTransition(circlesEnter.merge(circles), duration, easeLinear)\n .attr('cx', this.x)\n .attr('cy', d => d.y)\n .attr('r', 4)\n .style('opacity', d => d.opacity)\n .style('fill', d => d.color)\n .style('stroke', d => d.strokeColor)\n .style('stroke-width', d => d.strokeWidth)\n\n circles.exit().remove()\n }\n\n hide (): void {\n this._onMouseOut()\n }\n\n _onMouseMove (event: MouseEvent): void {\n const { config, datamodel, element } = this\n if (!this.accessors.x && datamodel.data?.length) {\n console.warn('Unovis | Crosshair: X accessor function has not been configured. Please check if it\\'s present in the configuration object')\n }\n const [x] = pointer(event, element)\n const xRange = this.xScale.range()\n\n if (config.snapToData) {\n if (!this.accessors.y && !this.accessors.yStacked && datamodel.data?.length) {\n console.warn('Unovis | Crosshair: Y accessors have not been configured. Please check if they\\'re present in the configuration object')\n }\n const scaleX = this.xScale\n const valueX = scaleX.invert(x) as number\n\n this.datum = getNearest(datamodel.data, valueX, this.accessors.x)\n this.datumIndex = datamodel.data.indexOf(this.datum)\n if (!this.datum) return\n\n this.x = clamp(Math.round(scaleX(getNumber(this.datum, this.accessors.x, this.datumIndex))), 0, this._width)\n\n // Show the crosshair only if it's in the chart range and not far from mouse pointer (if configured)\n this.show = (this.x >= 0) && (this.x <= this._width) && (!config.hideWhenFarFromPointer || (Math.abs(this.x - x) < config.hideWhenFarFromPointerDistance))\n } else {\n const tolerance = 2 // Show the crosshair when it is at least 2 pixels close to the chart area\n this.x = clamp(x, xRange[0], xRange[1])\n this.show = (x >= (xRange[0] - tolerance)) && (x <= (xRange[1] + tolerance))\n }\n\n window.cancelAnimationFrame(this._animFrameId)\n this._animFrameId = window.requestAnimationFrame(() => {\n this._render()\n })\n\n if (this.show) this._showTooltip(event)\n else this._hideTooltip()\n }\n\n _onMouseOut (): void {\n this.show = false\n\n window.cancelAnimationFrame(this._animFrameId)\n this._animFrameId = window.requestAnimationFrame(() => {\n this._render()\n })\n this._hideTooltip()\n }\n\n _showTooltip (event: MouseEvent): void {\n const { config } = this\n const tooltip = config.tooltip ?? this.tooltip\n if (!tooltip) return\n\n const container = tooltip.getContainer() || this.container.node()\n const [x, y] = tooltip.isContainerBody() ? [event.clientX, event.clientY] : pointer(event, container)\n const content = config.template(this.datum, this.xScale.invert(this.x))\n if (content) tooltip.show(content, { x, y })\n }\n\n _hideTooltip (): void {\n const { config } = this\n const tooltip = config.tooltip ?? this.tooltip\n tooltip?.hide()\n }\n\n // We don't want Crosshair to be be taken in to account in domain calculations\n getYDataExtent (): number[] {\n return [undefined, undefined]\n }\n\n private getCircleData (): CrosshairCircle[] {\n const { config, datamodel: { data } } = this\n\n if (isFunction(config.getCircles)) return config.getCircles(this.xScale.invert(this.x), data, this.yScale)\n\n if (config.snapToData && this.datum) {\n const yAccessors = this.accessors.y ?? []\n const yStackedAccessors = this.accessors.yStacked ?? []\n const baselineValue = getNumber(this.datum, this.accessors.baseline, this.datumIndex) || 0\n const stackedValues: CrosshairCircle[] = getStackedValues(this.datum, this.datumIndex, ...yStackedAccessors)\n .map((value, index, arr) => ({\n y: this.yScale(value + baselineValue),\n opacity: isNumber(getNumber(this.datum, yStackedAccessors[index])) ? 1 : 0,\n color: getColor(this.datum, config.color, index),\n strokeColor: config.strokeColor ? getColor(this.datum, config.strokeColor, index) : undefined,\n strokeWidth: config.strokeWidth ? getNumber(this.datum, config.strokeWidth, index) : undefined,\n }))\n\n const regularValues: CrosshairCircle[] = yAccessors\n .map((a, index) => {\n const value = getNumber(this.datum, a)\n return {\n y: this.yScale(value),\n opacity: isNumber(value) ? 1 : 0,\n color: getColor(this.datum, config.color, stackedValues.length + index),\n strokeColor: config.strokeColor ? getColor(this.datum, config.strokeColor, index) : undefined,\n strokeWidth: config.strokeWidth ? getNumber(this.datum, config.strokeWidth, index) : undefined,\n }\n })\n\n return stackedValues.concat(regularValues)\n }\n\n return []\n }\n}\n"],"names":["s.line","s.circle","s"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../../../src/components/crosshair/index.ts"],"sourcesContent":["import { Selection, pointer } from 'd3-selection'\nimport { easeLinear } from 'd3-ease'\n\n// Core\nimport { XYComponentCore } from 'core/xy-component'\nimport { Tooltip } from 'components/tooltip'\n\n// Utils\nimport { isNumber, isArray, getNumber, clamp, getStackedValues, getNearest, isFunction } from 'utils/data'\nimport { smartTransition } from 'utils/d3'\nimport { getColor } from 'utils/color'\n\n// Local Types\nimport { CrosshairAccessors, CrosshairCircle } from './types'\n\n// Config\nimport { CrosshairDefaultConfig, CrosshairConfigInterface } from './config'\n\n// Styles\nimport * as s from './style'\n\nexport class Crosshair<Datum> extends XYComponentCore<Datum, CrosshairConfigInterface<Datum>> {\n static selectors = s\n clippable = true // Don't apply clipping path to this component. See XYContainer\n protected _defaultConfig = CrosshairDefaultConfig as CrosshairConfigInterface<Datum>\n public config: CrosshairConfigInterface<Datum> = this._defaultConfig\n container: Selection<SVGSVGElement, any, SVGSVGElement, any>\n line: Selection<SVGLineElement, any, SVGElement, any>\n x = 0\n datum: Datum\n datumIndex: number\n show = false\n private _animFrameId: number = null\n\n /** Tooltip component to be used by Crosshair if not provided by the config.\n * This property is supposed to be set externally by a container component like XYContainer. */\n public tooltip: Tooltip\n\n /** Accessors passed externally (e.g. from XYContainer) */\n private _accessors: CrosshairAccessors<Datum> = {\n x: undefined,\n y: undefined,\n yStacked: undefined,\n baseline: undefined,\n }\n\n public set accessors (accessors: CrosshairAccessors<Datum>) { this._accessors = accessors }\n public get accessors (): CrosshairAccessors<Datum> {\n const { config } = this\n\n const hasConfig = !!(config.x || config.y || config.yStacked)\n const x = hasConfig ? config.x : this._accessors.x\n const yAcc = hasConfig ? config.y : this._accessors.y\n const y = yAcc ? (isArray(yAcc) ? yAcc : [yAcc]) : undefined\n const yStacked = hasConfig ? config.yStacked : this._accessors.yStacked\n const baseline = config.baseline ?? this._accessors.baseline\n\n return { x, y, yStacked, baseline }\n }\n\n constructor (config?: CrosshairConfigInterface<Datum>) {\n super()\n if (config) this.setConfig(config)\n\n this.g.style('opacity', this.show ? 1 : 0)\n this.line = this.g.append('line')\n .attr('class', s.line)\n }\n\n setContainer (containerSvg: Selection<SVGSVGElement, unknown, SVGSVGElement, unknown>): void {\n // Set up mousemove event for Crosshair\n this.container = containerSvg\n this.container.on('mousemove.crosshair', this._onMouseMove.bind(this))\n this.container.on('mouseout.crosshair', this._onMouseOut.bind(this))\n }\n\n _render (customDuration?: number): void {\n const { config } = this\n if (config.snapToData && !this.datum) return\n const duration = isNumber(customDuration) ? customDuration : config.duration\n\n smartTransition(this.g, duration)\n .style('opacity', this.show ? 1 : 0)\n\n this.line\n .attr('y1', 0)\n .attr('y1', this._height)\n\n smartTransition(this.line, duration, easeLinear)\n .attr('x1', this.x)\n .attr('x2', this.x)\n\n const circleData = this.getCircleData()\n const circles = this.g\n .selectAll<SVGCircleElement, CrosshairCircle>('circle')\n .data(circleData, (d, i) => d.id ?? i)\n\n const circlesEnter = circles.enter()\n .append('circle')\n .attr('class', s.circle)\n .attr('r', 0)\n .attr('cx', this.x)\n .attr('cy', d => d.y)\n .style('fill', d => d.color)\n .style('stroke', d => d.strokeColor)\n .style('stroke-width', d => d.strokeWidth)\n\n smartTransition(circlesEnter.merge(circles), duration, easeLinear)\n .attr('cx', this.x)\n .attr('cy', d => d.y)\n .attr('r', 4)\n .style('opacity', d => d.opacity)\n .style('fill', d => d.color)\n .style('stroke', d => d.strokeColor)\n .style('stroke-width', d => d.strokeWidth)\n\n circles.exit().remove()\n }\n\n hide (): void {\n this._onMouseOut()\n }\n\n _onMouseMove (event: MouseEvent): void {\n const { config, datamodel, element } = this\n if (!this.accessors.x && datamodel.data?.length) {\n console.warn('Unovis | Crosshair: X accessor function has not been configured. Please check if it\\'s present in the configuration object')\n }\n const [x] = pointer(event, element)\n const xRange = this.xScale.range()\n\n if (config.snapToData) {\n if (!this.accessors.y && !this.accessors.yStacked && datamodel.data?.length) {\n console.warn('Unovis | Crosshair: Y accessors have not been configured. Please check if they\\'re present in the configuration object')\n }\n const scaleX = this.xScale\n const valueX = scaleX.invert(x) as number\n\n this.datum = getNearest(datamodel.data, valueX, this.accessors.x)\n this.datumIndex = datamodel.data.indexOf(this.datum)\n if (!this.datum) return\n\n this.x = clamp(Math.round(scaleX(getNumber(this.datum, this.accessors.x, this.datumIndex))), 0, this._width)\n\n // Show the crosshair only if it's in the chart range and not far from mouse pointer (if configured)\n this.show = (this.x >= 0) && (this.x <= this._width) && (!config.hideWhenFarFromPointer || (Math.abs(this.x - x) < config.hideWhenFarFromPointerDistance))\n } else {\n const tolerance = 2 // Show the crosshair when it is at least 2 pixels close to the chart area\n this.x = clamp(x, xRange[0], xRange[1])\n this.show = (x >= (xRange[0] - tolerance)) && (x <= (xRange[1] + tolerance))\n }\n\n window.cancelAnimationFrame(this._animFrameId)\n this._animFrameId = window.requestAnimationFrame(() => {\n this._render()\n })\n\n if (this.show) this._showTooltip(event)\n else this._hideTooltip()\n }\n\n _onMouseOut (): void {\n this.show = false\n\n window.cancelAnimationFrame(this._animFrameId)\n this._animFrameId = window.requestAnimationFrame(() => {\n this._render()\n })\n this._hideTooltip()\n }\n\n _showTooltip (event: MouseEvent): void {\n const { config } = this\n const tooltip = config.tooltip ?? this.tooltip\n if (!tooltip) return\n\n const container = tooltip.getContainer() || this.container.node()\n const [x, y] = tooltip.isContainerBody() ? [event.clientX, event.clientY] : pointer(event, container)\n const content = config.template(this.datum, this.xScale.invert(this.x))\n // Force set `followCursor` to `true` because we don't want Crosshair's tooltip to be hoverable\n tooltip.config.followCursor = true\n if (content) tooltip.show(content, { x, y })\n }\n\n _hideTooltip (): void {\n const { config } = this\n const tooltip = config.tooltip ?? this.tooltip\n tooltip?.hide()\n }\n\n // We don't want Crosshair to be be taken in to account in domain calculations\n getYDataExtent (): number[] {\n return [undefined, undefined]\n }\n\n private getCircleData (): CrosshairCircle[] {\n const { config, datamodel: { data } } = this\n\n if (isFunction(config.getCircles)) return config.getCircles(this.xScale.invert(this.x), data, this.yScale)\n\n if (config.snapToData && this.datum) {\n const yAccessors = this.accessors.y ?? []\n const yStackedAccessors = this.accessors.yStacked ?? []\n const baselineValue = getNumber(this.datum, this.accessors.baseline, this.datumIndex) || 0\n const stackedValues: CrosshairCircle[] = getStackedValues(this.datum, this.datumIndex, ...yStackedAccessors)\n .map((value, index, arr) => ({\n y: this.yScale(value + baselineValue),\n opacity: isNumber(getNumber(this.datum, yStackedAccessors[index])) ? 1 : 0,\n color: getColor(this.datum, config.color, index),\n strokeColor: config.strokeColor ? getColor(this.datum, config.strokeColor, index) : undefined,\n strokeWidth: config.strokeWidth ? getNumber(this.datum, config.strokeWidth, index) : undefined,\n }))\n\n const regularValues: CrosshairCircle[] = yAccessors\n .map((a, index) => {\n const value = getNumber(this.datum, a)\n return {\n y: this.yScale(value),\n opacity: isNumber(value) ? 1 : 0,\n color: getColor(this.datum, config.color, stackedValues.length + index),\n strokeColor: config.strokeColor ? getColor(this.datum, config.strokeColor, index) : undefined,\n strokeWidth: config.strokeWidth ? getNumber(this.datum, config.strokeWidth, index) : undefined,\n }\n })\n\n return stackedValues.concat(regularValues)\n }\n\n return []\n }\n}\n"],"names":["s.line","s.circle","s"],"mappings":"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"}
|
|
@@ -6,7 +6,7 @@ import { drag } from 'd3-drag';
|
|
|
6
6
|
import { interval } from 'd3-timer';
|
|
7
7
|
import { ComponentCore } from '../../core/component/index.js';
|
|
8
8
|
import { GraphDataModel } from '../../data-models/graph.js';
|
|
9
|
-
import { isNumber, isFunction, clamp, getBoolean, shallowDiff } from '../../utils/data.js';
|
|
9
|
+
import { isNumber, isFunction, clamp, getBoolean, shallowDiff, isPlainObject, isEqual } from '../../utils/data.js';
|
|
10
10
|
import { smartTransition } from '../../utils/d3.js';
|
|
11
11
|
import { GraphLayoutType, GraphLinkArrowStyle } from './types.js';
|
|
12
12
|
import { GraphDefaultConfig } from './config.js';
|
|
@@ -585,10 +585,21 @@ class Graph extends ComponentCore {
|
|
|
585
585
|
if (Object.keys(dagreSettingsDiff).length)
|
|
586
586
|
return true;
|
|
587
587
|
}
|
|
588
|
+
if (prevConfig.layoutType === GraphLayoutType.Elk) {
|
|
589
|
+
if (isPlainObject(prevConfig.layoutElkSettings) && isPlainObject(config.layoutElkSettings)) {
|
|
590
|
+
// Do a deeper comparison if `config.layoutElkSettings` is an object
|
|
591
|
+
const elkSettingsDiff = shallowDiff(prevConfig.layoutElkSettings, config.layoutElkSettings);
|
|
592
|
+
return Boolean(Object.keys(elkSettingsDiff).length);
|
|
593
|
+
}
|
|
594
|
+
else {
|
|
595
|
+
// Otherwise, do a simple `===` comparison
|
|
596
|
+
return prevConfig.layoutElkSettings !== config.layoutElkSettings;
|
|
597
|
+
}
|
|
598
|
+
}
|
|
588
599
|
if (prevConfig.layoutType === GraphLayoutType.Parallel ||
|
|
589
600
|
prevConfig.layoutType === GraphLayoutType.ParallelHorizontal ||
|
|
590
601
|
prevConfig.layoutType === GraphLayoutType.Concentric) {
|
|
591
|
-
if (prevConfig.layoutGroupOrder
|
|
602
|
+
if (!isEqual(prevConfig.layoutGroupOrder, config.layoutGroupOrder))
|
|
592
603
|
return true;
|
|
593
604
|
if (prevConfig.layoutParallelNodesPerColumn !== config.layoutParallelNodesPerColumn)
|
|
594
605
|
return true;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../../../src/components/graph/index.ts"],"sourcesContent":["import { min, max } from 'd3-array'\nimport { Transition } from 'd3-transition'\nimport { select, Selection, pointer } from 'd3-selection'\nimport { zoom, zoomTransform, zoomIdentity, ZoomTransform, D3ZoomEvent, ZoomBehavior } from 'd3-zoom'\nimport { drag, D3DragEvent } from 'd3-drag'\nimport { interval, Timer } from 'd3-timer'\n\n// Core\nimport { ComponentCore } from 'core/component'\nimport { GraphDataModel } from 'data-models/graph'\n\n// Types\nimport { GraphInputLink, GraphInputNode } from 'types/graph'\nimport { Spacing } from 'types/spacing'\n\n// Utils\nimport { isNumber, clamp, shallowDiff, isFunction, getBoolean } from 'utils/data'\nimport { smartTransition } from 'utils/d3'\n\n// Local Types\nimport { GraphNode, GraphLink, GraphLayoutType, GraphLinkArrowStyle, GraphPanel } from './types'\n\n// Config\nimport { GraphDefaultConfig, GraphConfigInterface } from './config'\n\n// Styles\nimport * as generalSelectors from './style'\nimport * as nodeSelectors from './modules/node/style'\nimport * as linkSelectors from './modules/link/style'\nimport * as panelSelectors from './modules/panel/style'\n\n// Modules\nimport { createNodes, updateNodes, removeNodes, zoomNodesThrottled, zoomNodes, updateNodeSelectedGreyout } from './modules/node'\nimport { getMaxNodeSize, getNodeSize, getX, getY } from './modules/node/helper'\nimport { createLinks, updateLinks, removeLinks, zoomLinksThrottled, zoomLinks, animateLinkFlow, updateSelectedLinks } from './modules/link'\nimport { getDoubleArrowPath, getArrowPath } from './modules/link/helper'\nimport { createPanels, updatePanels, removePanels } from './modules/panel'\nimport { setPanelForNodes, updatePanelBBoxSize, updatePanelNumNodes, initPanels } from './modules/panel/helper'\nimport { applyLayoutCircular, applyLayoutParallel, applyLayoutDagre, applyLayoutConcentric, applyLayoutForce, applyELKLayout } from './modules/layout'\n\nexport class Graph<\n N extends GraphInputNode,\n L extends GraphInputLink,\n> extends ComponentCore<\n {nodes: N[]; links?: L[]},\n GraphConfigInterface<N, L>\n > {\n static selectors = {\n root: generalSelectors.root,\n graphGroup: generalSelectors.graphGroup,\n background: generalSelectors.background,\n node: nodeSelectors.gNode,\n nodeShape: nodeSelectors.node,\n nodeGauge: nodeSelectors.nodeGauge,\n nodeSideLabel: nodeSelectors.sideLabelGroup,\n nodeLabel: nodeSelectors.label,\n dimmedNode: nodeSelectors.greyedOutNode,\n link: linkSelectors.gLink,\n linkLine: linkSelectors.link,\n dimmedLink: linkSelectors.greyedOutLink,\n panel: panelSelectors.gPanel,\n panelRect: panelSelectors.panel,\n panelSelection: panelSelectors.panelSelection,\n panelLabel: panelSelectors.label,\n panelLabelText: panelSelectors.labelText,\n panelSideIcon: panelSelectors.sideIconGroup,\n panelSideIconShape: panelSelectors.sideIconShape,\n panelSideIconSymbol: panelSelectors.sideIconSymbol,\n }\n\n static nodeSelectors = nodeSelectors\n g: Selection<SVGGElement, unknown, null, undefined>\n protected _defaultConfig = GraphDefaultConfig as unknown as GraphConfigInterface<N, L>\n public config: GraphConfigInterface<N, L> = this._defaultConfig\n datamodel: GraphDataModel<N, L, GraphNode<N, L>, GraphLink<N, L>> = new GraphDataModel()\n private _selectedNode: GraphNode<N, L>\n private _selectedLink: GraphLink<N, L>\n\n private _graphGroup: Selection<SVGGElement, unknown, null, undefined>\n private _panelsGroup: Selection<SVGGElement, unknown, null, undefined>\n private _linksGroup: Selection<SVGGElement, unknown, null, undefined>\n private _nodesGroup: Selection<SVGGElement, unknown, null, undefined>\n private _timer: Timer\n\n private _isFirstRender = true\n private _prevWidth: number\n private _prevHeight: number\n private _shouldRecalculateLayout = false\n private _currentLayoutType: GraphLayoutType | undefined\n private _layoutCalculationPromise: Promise<boolean> | undefined\n\n private _shouldFitLayout: boolean\n private _shouldSetPanels = false\n private _panels: GraphPanel[]\n\n private _defs: Selection<SVGDefsElement, unknown, SVGGElement, undefined>\n private _backgroundRect: Selection<SVGRectElement, unknown, SVGGElement, undefined>\n private _zoomBehavior: ZoomBehavior<SVGGElement, unknown>\n private _isAutoFitDisabled = false\n private _scale: number\n private _initialTransform: ZoomTransform\n private _isDragging = false\n\n events = {\n [Graph.selectors.background]: {\n click: this._onBackgroundClick.bind(this),\n },\n [Graph.selectors.node]: {\n click: this._onNodeClick.bind(this),\n mouseover: this._onNodeMouseOver.bind(this),\n mouseout: this._onNodeMouseOut.bind(this),\n },\n [Graph.selectors.link]: {\n click: this._onLinkClick.bind(this),\n mouseover: this._onLinkMouseOver.bind(this),\n mouseout: this._onLinkMouseOut.bind(this),\n },\n }\n\n public get selectedNode (): GraphNode<N, L> {\n return this._selectedNode\n }\n\n public get selectedLink (): GraphLink<N, L> {\n return this._selectedLink\n }\n\n constructor (config?: GraphConfigInterface<N, L>) {\n super()\n if (config) this.setConfig(config)\n\n this._backgroundRect = this.g.append('rect').attr('class', generalSelectors.background)\n this._graphGroup = this.g.append('g').attr('class', generalSelectors.graphGroup)\n\n this._zoomBehavior = zoom<SVGGElement, unknown>()\n .scaleExtent(this.config.zoomScaleExtent)\n .on('zoom', (e: D3ZoomEvent<SVGGElement, unknown>) => this._onZoom(e.transform, e))\n\n this._panelsGroup = this._graphGroup.append('g').attr('class', panelSelectors.panels)\n this._linksGroup = this._graphGroup.append('g').attr('class', linkSelectors.links)\n this._nodesGroup = this._graphGroup.append('g').attr('class', nodeSelectors.nodes)\n\n this._defs = this._graphGroup.append('defs')\n\n this._getLinkArrowDefId = this._getLinkArrowDefId.bind(this)\n }\n\n setData (data: {nodes: N[]; links?: L[]}): void {\n const { config } = this\n\n this.datamodel.nodeSort = config.nodeSort\n this.datamodel.data = data\n this._shouldRecalculateLayout = true\n if (config.layoutAutofit) this._shouldFitLayout = true\n this._shouldSetPanels = true\n\n this._addSVGDefs()\n }\n\n setConfig (config: GraphConfigInterface<N, L>): void {\n super.setConfig(config)\n const hasLayoutConfigurationChanged = this._shouldLayoutRecalculate()\n\n // If the data has changed (see above in `setData`) or the layout configuration has changed, we need to recalculate the layout\n this._shouldRecalculateLayout = this._shouldRecalculateLayout || hasLayoutConfigurationChanged\n\n // If the `config.layoutAutofit` is true and data has changed (see above in `setData`),\n // or the layout configuration has changed, we need to fit the layout\n this._shouldFitLayout = this._shouldFitLayout || hasLayoutConfigurationChanged\n\n if (this._shouldFitLayout) this._isAutoFitDisabled = false\n this._shouldSetPanels = true\n }\n\n get bleed (): Spacing {\n const extraPadding = 50 // Extra padding to take into account labels and selection outlines\n return { top: extraPadding, bottom: extraPadding, left: extraPadding, right: extraPadding }\n }\n\n _render (customDuration?: number): void {\n const { config: { disableZoom, duration, layoutAutofit, zoomEventFilter }, datamodel } = this\n if (!datamodel.nodes && !datamodel.links) return\n const animDuration = isNumber(customDuration) ? customDuration : duration\n\n this._backgroundRect\n .attr('width', this._width)\n .attr('height', this._height)\n .attr('opacity', 0)\n\n if ((this._prevWidth !== this._width || this._prevHeight !== this._height) && layoutAutofit) {\n // Fit layout on resize\n this._shouldFitLayout = true\n this._prevWidth = this._width\n this._prevHeight = this._height\n }\n\n // Apply layout and render\n if (this._shouldRecalculateLayout || !this._layoutCalculationPromise) {\n this._layoutCalculationPromise = this._calculateLayout()\n\n // Call `onLayoutCalculated` after the layout calculation is done and the `this._layoutCalculationPromise`\n // variable is set because the `fitView` function relies on the promise to be initialized\n this._layoutCalculationPromise.then(() => {\n this.config.onLayoutCalculated?.(datamodel.nodes, datamodel.links)\n })\n }\n\n // Redefine Zoom Behavior filter is specified in the config\n // https://d3js.org/d3-zoom#zoom_filter\n this._zoomBehavior.filter(\n isFunction(zoomEventFilter)\n ? zoomEventFilter\n : (e: PointerEvent) => (!e.ctrlKey || e.type === 'wheel') && !e.button // Default filter\n )\n\n this._layoutCalculationPromise.then((isFirstRender) => {\n // If the component has been destroyed while the layout calculation\n // was in progress, we cancel the render\n if (this.isDestroyed()) return\n\n this._initPanelsData()\n\n // Fit the view\n if (isFirstRender) {\n this._fit()\n this._shouldFitLayout = false\n } else if (this._shouldFitLayout && !this._isAutoFitDisabled) {\n this._fit(duration)\n this._shouldFitLayout = false\n }\n\n // Draw\n this._drawNodes(animDuration)\n this._drawLinks(animDuration)\n\n // Select Links / Nodes\n this._resetSelection()\n if (this.config.selectedNodeId) {\n const selectedNode = datamodel.nodes.find(node => node.id === this.config.selectedNodeId)\n this._selectNode(selectedNode)\n }\n\n if (this.config.selectedLinkId) {\n const selectedLink = datamodel.links.find(link => link.id === this.config.selectedLinkId)\n this._selectLink(selectedLink)\n }\n\n // Link flow animation timer\n if (!this._timer) {\n const refreshRateMs = 35\n this._timer = interval(this._onLinkFlowTimerFrame.bind(this), refreshRateMs)\n }\n\n // Zoom\n if (disableZoom) this.g.on('.zoom', null)\n else this.g.call(this._zoomBehavior).on('dblclick.zoom', null)\n\n if (!this._isFirstRender && !disableZoom) {\n const transform = zoomTransform(this.g.node())\n this._onZoom(transform)\n }\n\n // While the graph is animating we disable pointer events on the graph group\n if (animDuration) { this._graphGroup.attr('pointer-events', 'none') }\n smartTransition(this._graphGroup, animDuration)\n .on('end interrupt', () => {\n this._graphGroup.attr('pointer-events', null)\n })\n\n // We need to set up events and attributes again because the rendering might have been delayed by the layout\n // calculation and they were not set up properly (see the render function of `ComponentCore`)\n this._setUpComponentEventsThrottled()\n this._setCustomAttributesThrottled()\n\n // On render complete callback\n this.config.onRenderComplete?.(this.g, datamodel.nodes, datamodel.links, this.config, animDuration, this._scale)\n })\n\n this._isFirstRender = false\n }\n\n private _drawNodes (duration: number): void {\n const { config, datamodel } = this\n\n const nodes: GraphNode<N, L>[] = datamodel.nodes\n const nodeGroups = this._nodesGroup\n .selectAll<SVGGElement, GraphNode<N, L>>(`.${nodeSelectors.gNode}:not(.${nodeSelectors.gNodeExit})`)\n .data(nodes, d => String(d._id))\n\n const nodeGroupsEnter = nodeGroups.enter().append('g')\n .attr('class', nodeSelectors.gNode)\n .call(createNodes, config, duration, this._scale)\n\n const nodeGroupsMerged = nodeGroups.merge(nodeGroupsEnter)\n const nodeUpdateSelection = updateNodes(nodeGroupsMerged, config, duration, this._scale)\n\n this._drawPanels(nodeUpdateSelection, duration)\n\n const nodesGroupExit = nodeGroups.exit<GraphNode<N, L>>()\n nodesGroupExit\n .classed(nodeSelectors.gNodeExit, true)\n .call(removeNodes, config, duration, this._scale)\n\n // eslint-disable-next-line @typescript-eslint/no-this-alias\n const thisRef = this\n if (!config.disableDrag) {\n const dragBehaviour = drag<SVGGElement, GraphNode<N, L>>()\n .on('start', function (event, d) { thisRef._onDragStarted(d, event, select(this)) })\n .on('drag', function (event, d) { thisRef._onDragged(d, event, nodeGroupsMerged) })\n .on('end', function (event, d) { thisRef._onDragEnded(d, event, select(this)) })\n nodeGroupsMerged.call(dragBehaviour)\n } else {\n nodeGroupsMerged.on('.drag', null)\n }\n }\n\n private _drawLinks (duration: number): void {\n const { config, datamodel: { links } } = this\n\n const linkGroups = this._linksGroup\n .selectAll<SVGGElement, GraphLink<N, L>>(`.${linkSelectors.gLink}`)\n .data(links, (d: GraphLink<N, L>) => String(d._id))\n\n const linkGroupsEnter = linkGroups.enter().append('g')\n .attr('class', linkSelectors.gLink)\n .call(createLinks, config, duration)\n\n const linkGroupsMerged = linkGroups.merge(linkGroupsEnter)\n linkGroupsMerged.call(updateLinks, config, duration, this._scale, this._getLinkArrowDefId)\n\n const linkGroupsExit = linkGroups.exit<GraphLink<N, L>>()\n linkGroupsExit\n .attr('class', linkSelectors.gLinkExit)\n .call(removeLinks, config, duration)\n }\n\n private _drawPanels (\n nodeUpdateSelection: Selection<SVGGElement, GraphNode<N, L>, SVGGElement, unknown> | Transition<SVGGElement, GraphNode<N, L>, SVGGElement, unknown>,\n duration: number\n ): void {\n const { config } = this\n smartTransition(this._panelsGroup, duration / 2)\n .style('opacity', config.panels?.length ? 1 : 0)\n\n if (!this._panels) return\n\n const selection = ((nodeUpdateSelection as Transition<SVGGElement, GraphNode<N, L>, SVGGElement, unknown>).duration)\n ? (nodeUpdateSelection as Transition<SVGGElement, GraphNode<N, L>, SVGGElement, unknown>).selection()\n : nodeUpdateSelection as Selection<SVGGElement, GraphNode<N, L>, SVGGElement, unknown>\n\n updatePanelNumNodes(selection, this._panels, config)\n updatePanelBBoxSize(selection, this._panels, config)\n const panelData = this._panels.filter(p => p._numNodes)\n const panelGroup = this._panelsGroup\n .selectAll<SVGGElement, GraphPanel>(`.${panelSelectors.gPanel}`)\n .data(panelData, p => p.label)\n\n const panelGroupExit = panelGroup.exit<GraphPanel<N, L>>()\n panelGroupExit.call(removePanels, config, duration)\n\n const panelGroupEnter = panelGroup.enter().append('g')\n .attr('class', panelSelectors.gPanel)\n .call(createPanels, selection)\n const panelGroupMerged = panelGroup.merge(panelGroupEnter)\n\n this._updatePanels(panelGroupMerged, duration)\n }\n\n private _updatePanels (panelToUpdate: Selection<SVGGElement, GraphPanel, SVGGElement, unknown>, duration: number): void {\n const { config } = this\n if (!this._panels) return\n\n panelToUpdate.call(updatePanels, config, duration)\n }\n\n private async _calculateLayout (): Promise<boolean> {\n const { config, datamodel } = this\n const firstRender = this._isFirstRender\n\n // If the layout type has changed, we need to reset the node positions if they were fixed before\n if (this._currentLayoutType !== config.layoutType) {\n for (const node of datamodel.nodes) {\n delete node._state.fx\n delete node._state.fy\n }\n }\n\n switch (config.layoutType) {\n case GraphLayoutType.Precalculated:\n break\n case GraphLayoutType.Parallel:\n applyLayoutParallel(datamodel, config, this._width, this._height)\n break\n case GraphLayoutType.ParallelHorizontal:\n applyLayoutParallel(datamodel, config, this._width, this._height, 'horizontal')\n break\n case GraphLayoutType.Dagre:\n await applyLayoutDagre(datamodel, config, this._width)\n break\n case GraphLayoutType.Force:\n await applyLayoutForce(datamodel, config, this._width)\n break\n case GraphLayoutType.Concentric:\n applyLayoutConcentric(datamodel, config, this._width, this._height)\n break\n case GraphLayoutType.Elk:\n await applyELKLayout(datamodel, config, this._width)\n break\n case GraphLayoutType.Circular:\n default:\n applyLayoutCircular(datamodel, config, this._width, this._height)\n break\n }\n\n // We need to update the panels data right after the layout calculation\n // because we want to have the latest coordinates before calling `onLayoutCalculated`\n this._initPanelsData()\n\n this._shouldRecalculateLayout = false\n this._currentLayoutType = config.layoutType as GraphLayoutType\n\n return firstRender\n }\n\n private _initPanelsData (): void {\n const { config, datamodel } = this\n\n if (this._shouldSetPanels) {\n this._panels = initPanels(config.panels)\n setPanelForNodes(this._panels, datamodel.nodes, this.config)\n this._shouldSetPanels = false\n }\n }\n\n private _fit (duration = 0): void {\n const { datamodel: { nodes } } = this\n const transform = this._getTransform(nodes)\n smartTransition(this.g, duration)\n .call(this._zoomBehavior.transform, transform)\n this._onZoom(transform)\n }\n\n private _getTransform (nodes: GraphNode<N, L>[]): ZoomTransform {\n const { nodeSize, zoomScaleExtent } = this.config\n const { left, top, right, bottom } = this.bleed\n\n const maxNodeSize = getMaxNodeSize(nodes, nodeSize)\n const w = this._width\n const h = this._height\n\n const xExtent = [\n min(nodes, d => getX(d) - maxNodeSize / 2 - (max((d._panels || []).map(p => p._padding.left)) || 0)),\n max(nodes, d => getX(d) + maxNodeSize / 2 + (max((d._panels || []).map(p => p._padding.right)) || 0)),\n ]\n const yExtent = [\n min(nodes, d => getY(d) - maxNodeSize / 2 - (max((d._panels || []).map(p => p._padding.top)) || 0)),\n max(nodes, d => getY(d) + maxNodeSize / 2 + (max((d._panels || []).map(p => p._padding.bottom)) || 0)),\n ]\n\n if (xExtent.some(item => item === undefined) || yExtent.some(item => item === undefined)) {\n console.warn('Unovis | Graph: Some of the node coordinates are undefined. This can happen if you try to fit the graph before the layout has been calculated.')\n return zoomIdentity\n }\n\n const xScale = w / (xExtent[1] - xExtent[0] + left + right)\n const yScale = h / (yExtent[1] - yExtent[0] + top + bottom)\n\n const clampedScale = clamp(min([xScale, yScale]), zoomScaleExtent[0], zoomScaleExtent[1])\n\n const xCenter = (xExtent[1] + xExtent[0]) / 2\n const yCenter = (yExtent[1] + yExtent[0]) / 2\n const translateX = this._width / 2 - xCenter * clampedScale\n const translateY = this._height / 2 - yCenter * clampedScale\n const transform = zoomIdentity\n .translate(translateX, translateY)\n .scale(clampedScale)\n\n return transform\n }\n\n private _selectNode (node: GraphNode<N, L>): void {\n const { datamodel: { nodes, links } } = this\n if (!node) console.warn('Unovis | Graph: Select Node: Not found')\n this._selectedNode = node\n\n // Apply grey out\n // Grey out all nodes\n nodes.forEach(n => {\n n._state.selected = false\n n._state.greyout = true\n })\n\n // Grey out all links\n links.forEach(l => {\n l._state.greyout = true\n l._state.selected = false\n })\n\n // Highlight selected\n if (node) {\n node._state.selected = true\n node._state.greyout = false\n\n const connectedLinks = links.filter(l => (l.source === node) || (l.target === node))\n connectedLinks.forEach(l => {\n const source = l.source as GraphNode<N, L>\n const target = l.target as GraphNode<N, L>\n source._state.greyout = false\n target._state.greyout = false\n l._state.greyout = false\n })\n }\n\n this._updateSelectedElements()\n }\n\n private _selectLink (link: GraphLink<N, L>): void {\n const { datamodel: { nodes, links } } = this\n if (!link) console.warn('Unovis: Graph: Select Link: Not found')\n this._selectedLink = link\n const selectedLinkSource = link?.source as GraphNode<N, L>\n const selectedLinkTarget = link?.target as GraphNode<N, L>\n\n // Apply grey out\n nodes.forEach(n => {\n n._state.selected = false\n n._state.greyout = true\n if (selectedLinkTarget?._id === n._id || selectedLinkSource?._id === n._id) {\n link._state.greyout = false\n }\n })\n\n links.forEach(l => {\n l._state.greyout = true\n const source = l.source as GraphNode<N, L>\n const target = l.target as GraphNode<N, L>\n if ((source._id === selectedLinkSource?._id) && (target._id === selectedLinkTarget?._id)) {\n source._state.greyout = false\n target._state.greyout = false\n l._state.greyout = false\n }\n })\n\n links.forEach(l => {\n delete l._state.selected\n })\n\n if (link) link._state.selected = true\n\n this._updateSelectedElements()\n }\n\n private _resetSelection (): void {\n const { datamodel: { nodes, links } } = this\n this._selectedNode = undefined\n this._selectedLink = undefined\n\n // Disable Grayout\n nodes.forEach(n => {\n delete n._state.selected\n delete n._state.greyout\n })\n links.forEach(l => {\n delete l._state.greyout\n delete l._state.selected\n })\n\n this._updateSelectedElements()\n }\n\n private _updateSelectedElements (): void {\n const { config } = this\n\n const linkElements = this._linksGroup.selectAll<SVGGElement, GraphLink<N, L>>(`.${linkSelectors.gLink}`)\n linkElements.call(updateSelectedLinks, config, this._scale)\n\n const nodeElements = this._nodesGroup.selectAll<SVGGElement, GraphNode<N, L>>(`.${nodeSelectors.gNode}`)\n nodeElements.call(updateNodeSelectedGreyout, config)\n\n // this._drawPanels(nodeElements, 0)\n }\n\n private _onBackgroundClick (): void {\n this._resetSelection()\n }\n\n // eslint-disable-next-line @typescript-eslint/no-empty-function\n private _onNodeClick (d: GraphNode<N, L>): void {\n }\n\n // eslint-disable-next-line @typescript-eslint/no-empty-function\n private _onNodeMouseOut (d: GraphNode<N, L>): void {\n }\n\n // eslint-disable-next-line @typescript-eslint/no-empty-function\n private _onNodeMouseOver (d: GraphNode<N, L>): void {\n }\n\n // eslint-disable-next-line @typescript-eslint/no-empty-function\n private _onLinkClick (d: GraphLink<N, L>): void {\n }\n\n private _onLinkMouseOver (d: GraphLink<N, L>): void {\n if (this._isDragging) return\n\n d._state.hovered = true\n this._updateSelectedElements()\n }\n\n private _onLinkMouseOut (d: GraphLink<N, L>): void {\n if (this._isDragging) return\n\n delete d._state.hovered\n this._updateSelectedElements()\n }\n\n private _onLinkFlowTimerFrame (elapsed = 0): void {\n const { config: { linkFlow, linkFlowAnimDuration }, datamodel: { links } } = this\n\n const hasLinksWithFlow = links.some((d, i) => getBoolean(d, linkFlow, i))\n if (!hasLinksWithFlow) return\n\n const t = (elapsed % linkFlowAnimDuration) / linkFlowAnimDuration\n const linkElements = this._linksGroup.selectAll<SVGGElement, GraphLink<N, L>>(`.${linkSelectors.gLink}`)\n\n const linksToAnimate = linkElements.filter(d => !d._state.greyout)\n linksToAnimate.each(d => { d._state.flowAnimTime = t })\n animateLinkFlow(linksToAnimate, this.config, this._scale)\n }\n\n private _onZoom (t: ZoomTransform, event?: D3ZoomEvent<SVGGElement, unknown>): void {\n const { config, datamodel: { nodes } } = this\n const transform = t || event.transform\n this._scale = transform.k\n this._graphGroup.attr('transform', transform.toString())\n if (isFunction(config.onZoom)) config.onZoom(this._scale, config.zoomScaleExtent, event)\n\n // console.warn('Unovis | Graph: Zoom: ', transform)\n if (!this._initialTransform) this._initialTransform = transform\n\n // If the event was triggered by a mouse interaction (pan or zoom) we don't\n // refit the layout after recalculation (e.g. on container resize)\n if (event?.sourceEvent) {\n const diff = Object.keys(transform).reduce((acc, prop) => {\n const propVal = transform[prop as keyof ZoomTransform] as number\n const initialPropVal = this._initialTransform[prop as keyof ZoomTransform] as number\n const dVal = Math.abs(propVal - initialPropVal)\n const scaledDVal = prop === 'k' ? 20 * dVal : dVal / 15\n acc += scaledDVal\n return acc\n }, 0)\n\n if (diff > config.layoutAutofitTolerance) this._isAutoFitDisabled = true\n else this._isAutoFitDisabled = false\n }\n\n this._nodesGroup.selectAll<SVGGElement, GraphNode<N, L>>(`.${nodeSelectors.gNode}`)\n .call(\n (nodes.length > config.zoomThrottledUpdateNodeThreshold ? zoomNodesThrottled : zoomNodes) as typeof zoomNodes,\n config,\n this._scale\n )\n\n this._linksGroup.selectAll<SVGGElement, GraphLink<N, L>>(`.${linkSelectors.gLink}`)\n .call(\n (nodes.length > config.zoomThrottledUpdateNodeThreshold ? zoomLinksThrottled : zoomLinks) as typeof zoomLinks,\n config,\n this._scale,\n this._getLinkArrowDefId\n )\n }\n\n private _onDragStarted (\n d: GraphNode<N, L>,\n event: D3DragEvent<SVGGElement, GraphNode<N, L>, unknown>,\n nodeSelection: Selection<SVGGElement, GraphNode<N, L>, SVGGElement, unknown>\n ): void {\n const { config } = this\n this._isDragging = true\n d._state.isDragged = true\n nodeSelection.call(updateNodes, config, 0, this._scale)\n config.onNodeDragStart?.(d, event)\n }\n\n private _onDragged (\n d: GraphNode<N, L>,\n event: D3DragEvent<SVGGElement, GraphNode<N, L>, unknown>,\n allNodesSelection: Selection<SVGGElement, GraphNode<N, L>, SVGGElement, unknown>\n ): void {\n const { config } = this\n const transform = zoomTransform(this.g.node())\n const scale = transform.k\n\n // Prevent the node from being dragged offscreen or outside its panel\n const panels = this._panels?.filter(p => p.nodes.includes(d._id)) ?? []\n const nodeSizeValue = getNodeSize(d, config.nodeSize, d._index)\n const maxY = min([(this._height - transform.y) / scale, ...panels.map(p => p._y + p._height)]) - nodeSizeValue / 2\n const maxX = min([(this._width - transform.x) / scale, ...panels.map(p => p._x + p._width)]) - nodeSizeValue / 2\n const minY = max([-transform.y / scale, ...panels.map(p => p._y)]) + nodeSizeValue / 2\n const minX = max([-transform.x / scale, ...panels.map(p => p._x)]) + nodeSizeValue / 2\n\n let [x, y] = pointer(event, this._graphGroup.node())\n if (y < minY) y = minY\n else if (y > maxY) y = maxY\n if (x < minX) x = minX\n else if (x > maxX) x = maxX\n\n // Snap to Layout\n if (Math.sqrt(Math.pow(x - d.x, 2) + Math.pow(y - d.y, 2)) < 15) {\n x = d.x\n y = d.y\n }\n\n // Assign coordinates\n d._state.fx = x\n d._state.fy = y\n if (d._state.fx === d.x) delete d._state.fx\n if (d._state.fy === d.y) delete d._state.fy\n\n // Update affected DOM elements\n const nodeSelection = this._nodesGroup.selectAll<SVGGElement, GraphNode<N, L>>(`.${nodeSelectors.gNode}`)\n const nodeToUpdate = nodeSelection.filter((n: GraphNode<N, L>) => n._id === d._id)\n nodeToUpdate.call(updateNodes, config, 0, scale)\n\n const linkSelection = this._linksGroup.selectAll<SVGGElement, GraphLink<N, L>>(`.${linkSelectors.gLink}`)\n const linksToUpdate = linkSelection.filter((l: L) => {\n const source = l.source as GraphNode<N, L>\n const target = l.target as GraphNode<N, L>\n return source._id === d._id || target._id === d._id\n })\n linksToUpdate.call(updateLinks, config, 0, scale, this._getLinkArrowDefId)\n const linksToAnimate = linksToUpdate.filter(d => d._state.greyout)\n if (linksToAnimate.size()) animateLinkFlow(linksToAnimate, config, this._scale)\n\n config.onNodeDrag?.(d, event)\n }\n\n private _onDragEnded (\n d: GraphNode<N, L>,\n event: D3DragEvent<SVGGElement, GraphNode<N, L>, unknown>,\n nodeSelection: Selection<SVGGElement, GraphNode<N, L>, SVGGElement, unknown>\n ): void {\n const { config } = this\n this._isDragging = false\n d._state.isDragged = false\n nodeSelection.call(updateNodes, config, 0, this._scale)\n config.onNodeDragEnd?.(d, event)\n }\n\n private _shouldLayoutRecalculate (): boolean {\n const { prevConfig, config } = this\n if (prevConfig.layoutType !== config.layoutType) return true\n if (prevConfig.layoutNonConnectedAside !== config.layoutNonConnectedAside) return true\n\n if (prevConfig.layoutType === GraphLayoutType.Force) {\n const forceSettingsDiff = shallowDiff(prevConfig.forceLayoutSettings, config.forceLayoutSettings)\n if (Object.keys(forceSettingsDiff).length) return true\n }\n\n if (prevConfig.layoutType === GraphLayoutType.Dagre) {\n const dagreSettingsDiff = shallowDiff(prevConfig.dagreLayoutSettings, config.dagreLayoutSettings)\n if (Object.keys(dagreSettingsDiff).length) return true\n }\n\n if (\n prevConfig.layoutType === GraphLayoutType.Parallel ||\n prevConfig.layoutType === GraphLayoutType.ParallelHorizontal ||\n prevConfig.layoutType === GraphLayoutType.Concentric\n ) {\n if (prevConfig.layoutGroupOrder !== config.layoutGroupOrder) return true\n if (prevConfig.layoutParallelNodesPerColumn !== config.layoutParallelNodesPerColumn) return true\n if (prevConfig.layoutParallelSortConnectionsByGroup !== config.layoutParallelSortConnectionsByGroup) return true\n }\n\n return false\n }\n\n private _getLinkArrowDefId (arrow: GraphLinkArrowStyle | undefined): string | null {\n return arrow ? `${this.uid}-${arrow}` : null\n }\n\n private _addSVGDefs (): void {\n // Clean up old defs\n this._defs.selectAll('*').remove()\n\n // Single Arrow\n this._defs.append('path').attr('d', getArrowPath())\n .attr('id', this._getLinkArrowDefId(GraphLinkArrowStyle.Single))\n\n // Double Arrow\n this._defs.append('path').attr('d', getDoubleArrowPath())\n .attr('id', this._getLinkArrowDefId(GraphLinkArrowStyle.Double))\n }\n\n public zoomIn (increment = 0.3): void {\n const scaleBy = 1 + increment\n smartTransition(this.g, this.config.duration / 2)\n .call(this._zoomBehavior.scaleBy, scaleBy)\n }\n\n public zoomOut (increment = 0.3): void {\n const scaleBy = 1 - increment\n smartTransition(this.g, this.config.duration / 2)\n .call(this._zoomBehavior.scaleBy, scaleBy)\n }\n\n public setZoom (zoomLevel: number): void {\n smartTransition(this.g, this.config.duration / 2)\n .call(this._zoomBehavior.scaleTo, zoomLevel)\n }\n\n public getZoom (): number {\n return zoomTransform(this.g.node()).k\n }\n\n public fitView (duration = this.config.duration): void {\n this._layoutCalculationPromise.then(() => {\n this._fit(duration)\n })\n }\n\n /** Enable automatic fitting to container if it was disabled due to previous zoom / pan interactions */\n public resetAutofitState (): void {\n this._isAutoFitDisabled = false\n }\n\n /** Get current coordinates of the nodes as an array of { id: string; x: number; y: number } objects */\n public getNodesCoordinates (): { id: string; x: number; y: number }[] {\n const { datamodel: { nodes } } = this\n return nodes.map(n => ({\n id: n._id,\n x: n.x,\n y: n.y,\n }))\n }\n\n /** Get node coordinates by id as { id: string; x: number; y: number } */\n public getNodeCoordinatesById (id: string): { id: string; x: number; y: number } | undefined {\n const { datamodel: { nodes } } = this\n const node = nodes.find(n => n._id === id)\n\n if (!node) {\n console.warn(`Unovis | Graph: Node ${id} not found`)\n return undefined\n } else {\n return {\n id: node._id,\n x: node.x,\n y: node.y,\n }\n }\n }\n}\n"],"names":["generalSelectors.background","generalSelectors.graphGroup","panelSelectors.panels","linkSelectors.links","nodeSelectors.nodes","nodeSelectors.gNode","nodeSelectors.gNodeExit","linkSelectors.gLink","linkSelectors.gLinkExit","panelSelectors.gPanel","generalSelectors.root","nodeSelectors.node","nodeSelectors.nodeGauge","nodeSelectors.sideLabelGroup","nodeSelectors.label","nodeSelectors.greyedOutNode","linkSelectors.link","linkSelectors.greyedOutLink","panelSelectors.panel","panelSelectors.panelSelection","panelSelectors.label","panelSelectors.labelText","panelSelectors.sideIconGroup","panelSelectors.sideIconShape","panelSelectors.sideIconSymbol","nodeSelectors"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../../../src/components/graph/index.ts"],"sourcesContent":["import { min, max } from 'd3-array'\nimport { Transition } from 'd3-transition'\nimport { select, Selection, pointer } from 'd3-selection'\nimport { zoom, zoomTransform, zoomIdentity, ZoomTransform, D3ZoomEvent, ZoomBehavior } from 'd3-zoom'\nimport { drag, D3DragEvent } from 'd3-drag'\nimport { interval, Timer } from 'd3-timer'\n\n// Core\nimport { ComponentCore } from 'core/component'\nimport { GraphDataModel } from 'data-models/graph'\n\n// Types\nimport { GraphInputLink, GraphInputNode } from 'types/graph'\nimport { Spacing } from 'types/spacing'\n\n// Utils\nimport { isNumber, clamp, shallowDiff, isFunction, getBoolean, isPlainObject, isEqual } from 'utils/data'\nimport { smartTransition } from 'utils/d3'\n\n// Local Types\nimport { GraphNode, GraphLink, GraphLayoutType, GraphLinkArrowStyle, GraphPanel } from './types'\n\n// Config\nimport { GraphDefaultConfig, GraphConfigInterface } from './config'\n\n// Styles\nimport * as generalSelectors from './style'\nimport * as nodeSelectors from './modules/node/style'\nimport * as linkSelectors from './modules/link/style'\nimport * as panelSelectors from './modules/panel/style'\n\n// Modules\nimport { createNodes, updateNodes, removeNodes, zoomNodesThrottled, zoomNodes, updateNodeSelectedGreyout } from './modules/node'\nimport { getMaxNodeSize, getNodeSize, getX, getY } from './modules/node/helper'\nimport { createLinks, updateLinks, removeLinks, zoomLinksThrottled, zoomLinks, animateLinkFlow, updateSelectedLinks } from './modules/link'\nimport { getDoubleArrowPath, getArrowPath } from './modules/link/helper'\nimport { createPanels, updatePanels, removePanels } from './modules/panel'\nimport { setPanelForNodes, updatePanelBBoxSize, updatePanelNumNodes, initPanels } from './modules/panel/helper'\nimport { applyLayoutCircular, applyLayoutParallel, applyLayoutDagre, applyLayoutConcentric, applyLayoutForce, applyELKLayout } from './modules/layout'\n\nexport class Graph<\n N extends GraphInputNode,\n L extends GraphInputLink,\n> extends ComponentCore<\n {nodes: N[]; links?: L[]},\n GraphConfigInterface<N, L>\n > {\n static selectors = {\n root: generalSelectors.root,\n graphGroup: generalSelectors.graphGroup,\n background: generalSelectors.background,\n node: nodeSelectors.gNode,\n nodeShape: nodeSelectors.node,\n nodeGauge: nodeSelectors.nodeGauge,\n nodeSideLabel: nodeSelectors.sideLabelGroup,\n nodeLabel: nodeSelectors.label,\n dimmedNode: nodeSelectors.greyedOutNode,\n link: linkSelectors.gLink,\n linkLine: linkSelectors.link,\n dimmedLink: linkSelectors.greyedOutLink,\n panel: panelSelectors.gPanel,\n panelRect: panelSelectors.panel,\n panelSelection: panelSelectors.panelSelection,\n panelLabel: panelSelectors.label,\n panelLabelText: panelSelectors.labelText,\n panelSideIcon: panelSelectors.sideIconGroup,\n panelSideIconShape: panelSelectors.sideIconShape,\n panelSideIconSymbol: panelSelectors.sideIconSymbol,\n }\n\n static nodeSelectors = nodeSelectors\n g: Selection<SVGGElement, unknown, null, undefined>\n protected _defaultConfig = GraphDefaultConfig as unknown as GraphConfigInterface<N, L>\n public config: GraphConfigInterface<N, L> = this._defaultConfig\n datamodel: GraphDataModel<N, L, GraphNode<N, L>, GraphLink<N, L>> = new GraphDataModel()\n private _selectedNode: GraphNode<N, L>\n private _selectedLink: GraphLink<N, L>\n\n private _graphGroup: Selection<SVGGElement, unknown, null, undefined>\n private _panelsGroup: Selection<SVGGElement, unknown, null, undefined>\n private _linksGroup: Selection<SVGGElement, unknown, null, undefined>\n private _nodesGroup: Selection<SVGGElement, unknown, null, undefined>\n private _timer: Timer\n\n private _isFirstRender = true\n private _prevWidth: number\n private _prevHeight: number\n private _shouldRecalculateLayout = false\n private _currentLayoutType: GraphLayoutType | undefined\n private _layoutCalculationPromise: Promise<boolean> | undefined\n\n private _shouldFitLayout: boolean\n private _shouldSetPanels = false\n private _panels: GraphPanel[]\n\n private _defs: Selection<SVGDefsElement, unknown, SVGGElement, undefined>\n private _backgroundRect: Selection<SVGRectElement, unknown, SVGGElement, undefined>\n private _zoomBehavior: ZoomBehavior<SVGGElement, unknown>\n private _isAutoFitDisabled = false\n private _scale: number\n private _initialTransform: ZoomTransform\n private _isDragging = false\n\n events = {\n [Graph.selectors.background]: {\n click: this._onBackgroundClick.bind(this),\n },\n [Graph.selectors.node]: {\n click: this._onNodeClick.bind(this),\n mouseover: this._onNodeMouseOver.bind(this),\n mouseout: this._onNodeMouseOut.bind(this),\n },\n [Graph.selectors.link]: {\n click: this._onLinkClick.bind(this),\n mouseover: this._onLinkMouseOver.bind(this),\n mouseout: this._onLinkMouseOut.bind(this),\n },\n }\n\n public get selectedNode (): GraphNode<N, L> {\n return this._selectedNode\n }\n\n public get selectedLink (): GraphLink<N, L> {\n return this._selectedLink\n }\n\n constructor (config?: GraphConfigInterface<N, L>) {\n super()\n if (config) this.setConfig(config)\n\n this._backgroundRect = this.g.append('rect').attr('class', generalSelectors.background)\n this._graphGroup = this.g.append('g').attr('class', generalSelectors.graphGroup)\n\n this._zoomBehavior = zoom<SVGGElement, unknown>()\n .scaleExtent(this.config.zoomScaleExtent)\n .on('zoom', (e: D3ZoomEvent<SVGGElement, unknown>) => this._onZoom(e.transform, e))\n\n this._panelsGroup = this._graphGroup.append('g').attr('class', panelSelectors.panels)\n this._linksGroup = this._graphGroup.append('g').attr('class', linkSelectors.links)\n this._nodesGroup = this._graphGroup.append('g').attr('class', nodeSelectors.nodes)\n\n this._defs = this._graphGroup.append('defs')\n\n this._getLinkArrowDefId = this._getLinkArrowDefId.bind(this)\n }\n\n setData (data: {nodes: N[]; links?: L[]}): void {\n const { config } = this\n\n this.datamodel.nodeSort = config.nodeSort\n this.datamodel.data = data\n this._shouldRecalculateLayout = true\n if (config.layoutAutofit) this._shouldFitLayout = true\n this._shouldSetPanels = true\n\n this._addSVGDefs()\n }\n\n setConfig (config: GraphConfigInterface<N, L>): void {\n super.setConfig(config)\n const hasLayoutConfigurationChanged = this._shouldLayoutRecalculate()\n\n // If the data has changed (see above in `setData`) or the layout configuration has changed, we need to recalculate the layout\n this._shouldRecalculateLayout = this._shouldRecalculateLayout || hasLayoutConfigurationChanged\n\n // If the `config.layoutAutofit` is true and data has changed (see above in `setData`),\n // or the layout configuration has changed, we need to fit the layout\n this._shouldFitLayout = this._shouldFitLayout || hasLayoutConfigurationChanged\n\n if (this._shouldFitLayout) this._isAutoFitDisabled = false\n this._shouldSetPanels = true\n }\n\n get bleed (): Spacing {\n const extraPadding = 50 // Extra padding to take into account labels and selection outlines\n return { top: extraPadding, bottom: extraPadding, left: extraPadding, right: extraPadding }\n }\n\n _render (customDuration?: number): void {\n const { config: { disableZoom, duration, layoutAutofit, zoomEventFilter }, datamodel } = this\n if (!datamodel.nodes && !datamodel.links) return\n const animDuration = isNumber(customDuration) ? customDuration : duration\n\n this._backgroundRect\n .attr('width', this._width)\n .attr('height', this._height)\n .attr('opacity', 0)\n\n if ((this._prevWidth !== this._width || this._prevHeight !== this._height) && layoutAutofit) {\n // Fit layout on resize\n this._shouldFitLayout = true\n this._prevWidth = this._width\n this._prevHeight = this._height\n }\n\n // Apply layout and render\n if (this._shouldRecalculateLayout || !this._layoutCalculationPromise) {\n this._layoutCalculationPromise = this._calculateLayout()\n\n // Call `onLayoutCalculated` after the layout calculation is done and the `this._layoutCalculationPromise`\n // variable is set because the `fitView` function relies on the promise to be initialized\n this._layoutCalculationPromise.then(() => {\n this.config.onLayoutCalculated?.(datamodel.nodes, datamodel.links)\n })\n }\n\n // Redefine Zoom Behavior filter is specified in the config\n // https://d3js.org/d3-zoom#zoom_filter\n this._zoomBehavior.filter(\n isFunction(zoomEventFilter)\n ? zoomEventFilter\n : (e: PointerEvent) => (!e.ctrlKey || e.type === 'wheel') && !e.button // Default filter\n )\n\n this._layoutCalculationPromise.then((isFirstRender) => {\n // If the component has been destroyed while the layout calculation\n // was in progress, we cancel the render\n if (this.isDestroyed()) return\n\n this._initPanelsData()\n\n // Fit the view\n if (isFirstRender) {\n this._fit()\n this._shouldFitLayout = false\n } else if (this._shouldFitLayout && !this._isAutoFitDisabled) {\n this._fit(duration)\n this._shouldFitLayout = false\n }\n\n // Draw\n this._drawNodes(animDuration)\n this._drawLinks(animDuration)\n\n // Select Links / Nodes\n this._resetSelection()\n if (this.config.selectedNodeId) {\n const selectedNode = datamodel.nodes.find(node => node.id === this.config.selectedNodeId)\n this._selectNode(selectedNode)\n }\n\n if (this.config.selectedLinkId) {\n const selectedLink = datamodel.links.find(link => link.id === this.config.selectedLinkId)\n this._selectLink(selectedLink)\n }\n\n // Link flow animation timer\n if (!this._timer) {\n const refreshRateMs = 35\n this._timer = interval(this._onLinkFlowTimerFrame.bind(this), refreshRateMs)\n }\n\n // Zoom\n if (disableZoom) this.g.on('.zoom', null)\n else this.g.call(this._zoomBehavior).on('dblclick.zoom', null)\n\n if (!this._isFirstRender && !disableZoom) {\n const transform = zoomTransform(this.g.node())\n this._onZoom(transform)\n }\n\n // While the graph is animating we disable pointer events on the graph group\n if (animDuration) { this._graphGroup.attr('pointer-events', 'none') }\n smartTransition(this._graphGroup, animDuration)\n .on('end interrupt', () => {\n this._graphGroup.attr('pointer-events', null)\n })\n\n // We need to set up events and attributes again because the rendering might have been delayed by the layout\n // calculation and they were not set up properly (see the render function of `ComponentCore`)\n this._setUpComponentEventsThrottled()\n this._setCustomAttributesThrottled()\n\n // On render complete callback\n this.config.onRenderComplete?.(this.g, datamodel.nodes, datamodel.links, this.config, animDuration, this._scale)\n })\n\n this._isFirstRender = false\n }\n\n private _drawNodes (duration: number): void {\n const { config, datamodel } = this\n\n const nodes: GraphNode<N, L>[] = datamodel.nodes\n const nodeGroups = this._nodesGroup\n .selectAll<SVGGElement, GraphNode<N, L>>(`.${nodeSelectors.gNode}:not(.${nodeSelectors.gNodeExit})`)\n .data(nodes, d => String(d._id))\n\n const nodeGroupsEnter = nodeGroups.enter().append('g')\n .attr('class', nodeSelectors.gNode)\n .call(createNodes, config, duration, this._scale)\n\n const nodeGroupsMerged = nodeGroups.merge(nodeGroupsEnter)\n const nodeUpdateSelection = updateNodes(nodeGroupsMerged, config, duration, this._scale)\n\n this._drawPanels(nodeUpdateSelection, duration)\n\n const nodesGroupExit = nodeGroups.exit<GraphNode<N, L>>()\n nodesGroupExit\n .classed(nodeSelectors.gNodeExit, true)\n .call(removeNodes, config, duration, this._scale)\n\n // eslint-disable-next-line @typescript-eslint/no-this-alias\n const thisRef = this\n if (!config.disableDrag) {\n const dragBehaviour = drag<SVGGElement, GraphNode<N, L>>()\n .on('start', function (event, d) { thisRef._onDragStarted(d, event, select(this)) })\n .on('drag', function (event, d) { thisRef._onDragged(d, event, nodeGroupsMerged) })\n .on('end', function (event, d) { thisRef._onDragEnded(d, event, select(this)) })\n nodeGroupsMerged.call(dragBehaviour)\n } else {\n nodeGroupsMerged.on('.drag', null)\n }\n }\n\n private _drawLinks (duration: number): void {\n const { config, datamodel: { links } } = this\n\n const linkGroups = this._linksGroup\n .selectAll<SVGGElement, GraphLink<N, L>>(`.${linkSelectors.gLink}`)\n .data(links, (d: GraphLink<N, L>) => String(d._id))\n\n const linkGroupsEnter = linkGroups.enter().append('g')\n .attr('class', linkSelectors.gLink)\n .call(createLinks, config, duration)\n\n const linkGroupsMerged = linkGroups.merge(linkGroupsEnter)\n linkGroupsMerged.call(updateLinks, config, duration, this._scale, this._getLinkArrowDefId)\n\n const linkGroupsExit = linkGroups.exit<GraphLink<N, L>>()\n linkGroupsExit\n .attr('class', linkSelectors.gLinkExit)\n .call(removeLinks, config, duration)\n }\n\n private _drawPanels (\n nodeUpdateSelection: Selection<SVGGElement, GraphNode<N, L>, SVGGElement, unknown> | Transition<SVGGElement, GraphNode<N, L>, SVGGElement, unknown>,\n duration: number\n ): void {\n const { config } = this\n smartTransition(this._panelsGroup, duration / 2)\n .style('opacity', config.panels?.length ? 1 : 0)\n\n if (!this._panels) return\n\n const selection = ((nodeUpdateSelection as Transition<SVGGElement, GraphNode<N, L>, SVGGElement, unknown>).duration)\n ? (nodeUpdateSelection as Transition<SVGGElement, GraphNode<N, L>, SVGGElement, unknown>).selection()\n : nodeUpdateSelection as Selection<SVGGElement, GraphNode<N, L>, SVGGElement, unknown>\n\n updatePanelNumNodes(selection, this._panels, config)\n updatePanelBBoxSize(selection, this._panels, config)\n const panelData = this._panels.filter(p => p._numNodes)\n const panelGroup = this._panelsGroup\n .selectAll<SVGGElement, GraphPanel>(`.${panelSelectors.gPanel}`)\n .data(panelData, p => p.label)\n\n const panelGroupExit = panelGroup.exit<GraphPanel<N, L>>()\n panelGroupExit.call(removePanels, config, duration)\n\n const panelGroupEnter = panelGroup.enter().append('g')\n .attr('class', panelSelectors.gPanel)\n .call(createPanels, selection)\n const panelGroupMerged = panelGroup.merge(panelGroupEnter)\n\n this._updatePanels(panelGroupMerged, duration)\n }\n\n private _updatePanels (panelToUpdate: Selection<SVGGElement, GraphPanel, SVGGElement, unknown>, duration: number): void {\n const { config } = this\n if (!this._panels) return\n\n panelToUpdate.call(updatePanels, config, duration)\n }\n\n private async _calculateLayout (): Promise<boolean> {\n const { config, datamodel } = this\n const firstRender = this._isFirstRender\n\n // If the layout type has changed, we need to reset the node positions if they were fixed before\n if (this._currentLayoutType !== config.layoutType) {\n for (const node of datamodel.nodes) {\n delete node._state.fx\n delete node._state.fy\n }\n }\n\n switch (config.layoutType) {\n case GraphLayoutType.Precalculated:\n break\n case GraphLayoutType.Parallel:\n applyLayoutParallel(datamodel, config, this._width, this._height)\n break\n case GraphLayoutType.ParallelHorizontal:\n applyLayoutParallel(datamodel, config, this._width, this._height, 'horizontal')\n break\n case GraphLayoutType.Dagre:\n await applyLayoutDagre(datamodel, config, this._width)\n break\n case GraphLayoutType.Force:\n await applyLayoutForce(datamodel, config, this._width)\n break\n case GraphLayoutType.Concentric:\n applyLayoutConcentric(datamodel, config, this._width, this._height)\n break\n case GraphLayoutType.Elk:\n await applyELKLayout(datamodel, config, this._width)\n break\n case GraphLayoutType.Circular:\n default:\n applyLayoutCircular(datamodel, config, this._width, this._height)\n break\n }\n\n // We need to update the panels data right after the layout calculation\n // because we want to have the latest coordinates before calling `onLayoutCalculated`\n this._initPanelsData()\n\n this._shouldRecalculateLayout = false\n this._currentLayoutType = config.layoutType as GraphLayoutType\n\n return firstRender\n }\n\n private _initPanelsData (): void {\n const { config, datamodel } = this\n\n if (this._shouldSetPanels) {\n this._panels = initPanels(config.panels)\n setPanelForNodes(this._panels, datamodel.nodes, this.config)\n this._shouldSetPanels = false\n }\n }\n\n private _fit (duration = 0): void {\n const { datamodel: { nodes } } = this\n const transform = this._getTransform(nodes)\n smartTransition(this.g, duration)\n .call(this._zoomBehavior.transform, transform)\n this._onZoom(transform)\n }\n\n private _getTransform (nodes: GraphNode<N, L>[]): ZoomTransform {\n const { nodeSize, zoomScaleExtent } = this.config\n const { left, top, right, bottom } = this.bleed\n\n const maxNodeSize = getMaxNodeSize(nodes, nodeSize)\n const w = this._width\n const h = this._height\n\n const xExtent = [\n min(nodes, d => getX(d) - maxNodeSize / 2 - (max((d._panels || []).map(p => p._padding.left)) || 0)),\n max(nodes, d => getX(d) + maxNodeSize / 2 + (max((d._panels || []).map(p => p._padding.right)) || 0)),\n ]\n const yExtent = [\n min(nodes, d => getY(d) - maxNodeSize / 2 - (max((d._panels || []).map(p => p._padding.top)) || 0)),\n max(nodes, d => getY(d) + maxNodeSize / 2 + (max((d._panels || []).map(p => p._padding.bottom)) || 0)),\n ]\n\n if (xExtent.some(item => item === undefined) || yExtent.some(item => item === undefined)) {\n console.warn('Unovis | Graph: Some of the node coordinates are undefined. This can happen if you try to fit the graph before the layout has been calculated.')\n return zoomIdentity\n }\n\n const xScale = w / (xExtent[1] - xExtent[0] + left + right)\n const yScale = h / (yExtent[1] - yExtent[0] + top + bottom)\n\n const clampedScale = clamp(min([xScale, yScale]), zoomScaleExtent[0], zoomScaleExtent[1])\n\n const xCenter = (xExtent[1] + xExtent[0]) / 2\n const yCenter = (yExtent[1] + yExtent[0]) / 2\n const translateX = this._width / 2 - xCenter * clampedScale\n const translateY = this._height / 2 - yCenter * clampedScale\n const transform = zoomIdentity\n .translate(translateX, translateY)\n .scale(clampedScale)\n\n return transform\n }\n\n private _selectNode (node: GraphNode<N, L>): void {\n const { datamodel: { nodes, links } } = this\n if (!node) console.warn('Unovis | Graph: Select Node: Not found')\n this._selectedNode = node\n\n // Apply grey out\n // Grey out all nodes\n nodes.forEach(n => {\n n._state.selected = false\n n._state.greyout = true\n })\n\n // Grey out all links\n links.forEach(l => {\n l._state.greyout = true\n l._state.selected = false\n })\n\n // Highlight selected\n if (node) {\n node._state.selected = true\n node._state.greyout = false\n\n const connectedLinks = links.filter(l => (l.source === node) || (l.target === node))\n connectedLinks.forEach(l => {\n const source = l.source as GraphNode<N, L>\n const target = l.target as GraphNode<N, L>\n source._state.greyout = false\n target._state.greyout = false\n l._state.greyout = false\n })\n }\n\n this._updateSelectedElements()\n }\n\n private _selectLink (link: GraphLink<N, L>): void {\n const { datamodel: { nodes, links } } = this\n if (!link) console.warn('Unovis: Graph: Select Link: Not found')\n this._selectedLink = link\n const selectedLinkSource = link?.source as GraphNode<N, L>\n const selectedLinkTarget = link?.target as GraphNode<N, L>\n\n // Apply grey out\n nodes.forEach(n => {\n n._state.selected = false\n n._state.greyout = true\n if (selectedLinkTarget?._id === n._id || selectedLinkSource?._id === n._id) {\n link._state.greyout = false\n }\n })\n\n links.forEach(l => {\n l._state.greyout = true\n const source = l.source as GraphNode<N, L>\n const target = l.target as GraphNode<N, L>\n if ((source._id === selectedLinkSource?._id) && (target._id === selectedLinkTarget?._id)) {\n source._state.greyout = false\n target._state.greyout = false\n l._state.greyout = false\n }\n })\n\n links.forEach(l => {\n delete l._state.selected\n })\n\n if (link) link._state.selected = true\n\n this._updateSelectedElements()\n }\n\n private _resetSelection (): void {\n const { datamodel: { nodes, links } } = this\n this._selectedNode = undefined\n this._selectedLink = undefined\n\n // Disable Grayout\n nodes.forEach(n => {\n delete n._state.selected\n delete n._state.greyout\n })\n links.forEach(l => {\n delete l._state.greyout\n delete l._state.selected\n })\n\n this._updateSelectedElements()\n }\n\n private _updateSelectedElements (): void {\n const { config } = this\n\n const linkElements = this._linksGroup.selectAll<SVGGElement, GraphLink<N, L>>(`.${linkSelectors.gLink}`)\n linkElements.call(updateSelectedLinks, config, this._scale)\n\n const nodeElements = this._nodesGroup.selectAll<SVGGElement, GraphNode<N, L>>(`.${nodeSelectors.gNode}`)\n nodeElements.call(updateNodeSelectedGreyout, config)\n\n // this._drawPanels(nodeElements, 0)\n }\n\n private _onBackgroundClick (): void {\n this._resetSelection()\n }\n\n // eslint-disable-next-line @typescript-eslint/no-empty-function\n private _onNodeClick (d: GraphNode<N, L>): void {\n }\n\n // eslint-disable-next-line @typescript-eslint/no-empty-function\n private _onNodeMouseOut (d: GraphNode<N, L>): void {\n }\n\n // eslint-disable-next-line @typescript-eslint/no-empty-function\n private _onNodeMouseOver (d: GraphNode<N, L>): void {\n }\n\n // eslint-disable-next-line @typescript-eslint/no-empty-function\n private _onLinkClick (d: GraphLink<N, L>): void {\n }\n\n private _onLinkMouseOver (d: GraphLink<N, L>): void {\n if (this._isDragging) return\n\n d._state.hovered = true\n this._updateSelectedElements()\n }\n\n private _onLinkMouseOut (d: GraphLink<N, L>): void {\n if (this._isDragging) return\n\n delete d._state.hovered\n this._updateSelectedElements()\n }\n\n private _onLinkFlowTimerFrame (elapsed = 0): void {\n const { config: { linkFlow, linkFlowAnimDuration }, datamodel: { links } } = this\n\n const hasLinksWithFlow = links.some((d, i) => getBoolean(d, linkFlow, i))\n if (!hasLinksWithFlow) return\n\n const t = (elapsed % linkFlowAnimDuration) / linkFlowAnimDuration\n const linkElements = this._linksGroup.selectAll<SVGGElement, GraphLink<N, L>>(`.${linkSelectors.gLink}`)\n\n const linksToAnimate = linkElements.filter(d => !d._state.greyout)\n linksToAnimate.each(d => { d._state.flowAnimTime = t })\n animateLinkFlow(linksToAnimate, this.config, this._scale)\n }\n\n private _onZoom (t: ZoomTransform, event?: D3ZoomEvent<SVGGElement, unknown>): void {\n const { config, datamodel: { nodes } } = this\n const transform = t || event.transform\n this._scale = transform.k\n this._graphGroup.attr('transform', transform.toString())\n if (isFunction(config.onZoom)) config.onZoom(this._scale, config.zoomScaleExtent, event)\n\n // console.warn('Unovis | Graph: Zoom: ', transform)\n if (!this._initialTransform) this._initialTransform = transform\n\n // If the event was triggered by a mouse interaction (pan or zoom) we don't\n // refit the layout after recalculation (e.g. on container resize)\n if (event?.sourceEvent) {\n const diff = Object.keys(transform).reduce((acc, prop) => {\n const propVal = transform[prop as keyof ZoomTransform] as number\n const initialPropVal = this._initialTransform[prop as keyof ZoomTransform] as number\n const dVal = Math.abs(propVal - initialPropVal)\n const scaledDVal = prop === 'k' ? 20 * dVal : dVal / 15\n acc += scaledDVal\n return acc\n }, 0)\n\n if (diff > config.layoutAutofitTolerance) this._isAutoFitDisabled = true\n else this._isAutoFitDisabled = false\n }\n\n this._nodesGroup.selectAll<SVGGElement, GraphNode<N, L>>(`.${nodeSelectors.gNode}`)\n .call(\n (nodes.length > config.zoomThrottledUpdateNodeThreshold ? zoomNodesThrottled : zoomNodes) as typeof zoomNodes,\n config,\n this._scale\n )\n\n this._linksGroup.selectAll<SVGGElement, GraphLink<N, L>>(`.${linkSelectors.gLink}`)\n .call(\n (nodes.length > config.zoomThrottledUpdateNodeThreshold ? zoomLinksThrottled : zoomLinks) as typeof zoomLinks,\n config,\n this._scale,\n this._getLinkArrowDefId\n )\n }\n\n private _onDragStarted (\n d: GraphNode<N, L>,\n event: D3DragEvent<SVGGElement, GraphNode<N, L>, unknown>,\n nodeSelection: Selection<SVGGElement, GraphNode<N, L>, SVGGElement, unknown>\n ): void {\n const { config } = this\n this._isDragging = true\n d._state.isDragged = true\n nodeSelection.call(updateNodes, config, 0, this._scale)\n config.onNodeDragStart?.(d, event)\n }\n\n private _onDragged (\n d: GraphNode<N, L>,\n event: D3DragEvent<SVGGElement, GraphNode<N, L>, unknown>,\n allNodesSelection: Selection<SVGGElement, GraphNode<N, L>, SVGGElement, unknown>\n ): void {\n const { config } = this\n const transform = zoomTransform(this.g.node())\n const scale = transform.k\n\n // Prevent the node from being dragged offscreen or outside its panel\n const panels = this._panels?.filter(p => p.nodes.includes(d._id)) ?? []\n const nodeSizeValue = getNodeSize(d, config.nodeSize, d._index)\n const maxY = min([(this._height - transform.y) / scale, ...panels.map(p => p._y + p._height)]) - nodeSizeValue / 2\n const maxX = min([(this._width - transform.x) / scale, ...panels.map(p => p._x + p._width)]) - nodeSizeValue / 2\n const minY = max([-transform.y / scale, ...panels.map(p => p._y)]) + nodeSizeValue / 2\n const minX = max([-transform.x / scale, ...panels.map(p => p._x)]) + nodeSizeValue / 2\n\n let [x, y] = pointer(event, this._graphGroup.node())\n if (y < minY) y = minY\n else if (y > maxY) y = maxY\n if (x < minX) x = minX\n else if (x > maxX) x = maxX\n\n // Snap to Layout\n if (Math.sqrt(Math.pow(x - d.x, 2) + Math.pow(y - d.y, 2)) < 15) {\n x = d.x\n y = d.y\n }\n\n // Assign coordinates\n d._state.fx = x\n d._state.fy = y\n if (d._state.fx === d.x) delete d._state.fx\n if (d._state.fy === d.y) delete d._state.fy\n\n // Update affected DOM elements\n const nodeSelection = this._nodesGroup.selectAll<SVGGElement, GraphNode<N, L>>(`.${nodeSelectors.gNode}`)\n const nodeToUpdate = nodeSelection.filter((n: GraphNode<N, L>) => n._id === d._id)\n nodeToUpdate.call(updateNodes, config, 0, scale)\n\n const linkSelection = this._linksGroup.selectAll<SVGGElement, GraphLink<N, L>>(`.${linkSelectors.gLink}`)\n const linksToUpdate = linkSelection.filter((l: L) => {\n const source = l.source as GraphNode<N, L>\n const target = l.target as GraphNode<N, L>\n return source._id === d._id || target._id === d._id\n })\n linksToUpdate.call(updateLinks, config, 0, scale, this._getLinkArrowDefId)\n const linksToAnimate = linksToUpdate.filter(d => d._state.greyout)\n if (linksToAnimate.size()) animateLinkFlow(linksToAnimate, config, this._scale)\n\n config.onNodeDrag?.(d, event)\n }\n\n private _onDragEnded (\n d: GraphNode<N, L>,\n event: D3DragEvent<SVGGElement, GraphNode<N, L>, unknown>,\n nodeSelection: Selection<SVGGElement, GraphNode<N, L>, SVGGElement, unknown>\n ): void {\n const { config } = this\n this._isDragging = false\n d._state.isDragged = false\n nodeSelection.call(updateNodes, config, 0, this._scale)\n config.onNodeDragEnd?.(d, event)\n }\n\n private _shouldLayoutRecalculate (): boolean {\n const { prevConfig, config } = this\n if (prevConfig.layoutType !== config.layoutType) return true\n if (prevConfig.layoutNonConnectedAside !== config.layoutNonConnectedAside) return true\n\n if (prevConfig.layoutType === GraphLayoutType.Force) {\n const forceSettingsDiff = shallowDiff(prevConfig.forceLayoutSettings, config.forceLayoutSettings)\n if (Object.keys(forceSettingsDiff).length) return true\n }\n\n if (prevConfig.layoutType === GraphLayoutType.Dagre) {\n const dagreSettingsDiff = shallowDiff(prevConfig.dagreLayoutSettings, config.dagreLayoutSettings)\n if (Object.keys(dagreSettingsDiff).length) return true\n }\n\n if (prevConfig.layoutType === GraphLayoutType.Elk) {\n if (isPlainObject(prevConfig.layoutElkSettings) && isPlainObject(config.layoutElkSettings)) {\n // Do a deeper comparison if `config.layoutElkSettings` is an object\n const elkSettingsDiff = shallowDiff(\n prevConfig.layoutElkSettings as Record<string, string>,\n config.layoutElkSettings as Record<string, string>\n )\n return Boolean(Object.keys(elkSettingsDiff).length)\n } else {\n // Otherwise, do a simple `===` comparison\n return prevConfig.layoutElkSettings !== config.layoutElkSettings\n }\n }\n\n if (\n prevConfig.layoutType === GraphLayoutType.Parallel ||\n prevConfig.layoutType === GraphLayoutType.ParallelHorizontal ||\n prevConfig.layoutType === GraphLayoutType.Concentric\n ) {\n if (!isEqual(prevConfig.layoutGroupOrder, config.layoutGroupOrder)) return true\n if (prevConfig.layoutParallelNodesPerColumn !== config.layoutParallelNodesPerColumn) return true\n if (prevConfig.layoutParallelSortConnectionsByGroup !== config.layoutParallelSortConnectionsByGroup) return true\n }\n\n return false\n }\n\n private _getLinkArrowDefId (arrow: GraphLinkArrowStyle | undefined): string | null {\n return arrow ? `${this.uid}-${arrow}` : null\n }\n\n private _addSVGDefs (): void {\n // Clean up old defs\n this._defs.selectAll('*').remove()\n\n // Single Arrow\n this._defs.append('path').attr('d', getArrowPath())\n .attr('id', this._getLinkArrowDefId(GraphLinkArrowStyle.Single))\n\n // Double Arrow\n this._defs.append('path').attr('d', getDoubleArrowPath())\n .attr('id', this._getLinkArrowDefId(GraphLinkArrowStyle.Double))\n }\n\n public zoomIn (increment = 0.3): void {\n const scaleBy = 1 + increment\n smartTransition(this.g, this.config.duration / 2)\n .call(this._zoomBehavior.scaleBy, scaleBy)\n }\n\n public zoomOut (increment = 0.3): void {\n const scaleBy = 1 - increment\n smartTransition(this.g, this.config.duration / 2)\n .call(this._zoomBehavior.scaleBy, scaleBy)\n }\n\n public setZoom (zoomLevel: number): void {\n smartTransition(this.g, this.config.duration / 2)\n .call(this._zoomBehavior.scaleTo, zoomLevel)\n }\n\n public getZoom (): number {\n return zoomTransform(this.g.node()).k\n }\n\n public fitView (duration = this.config.duration): void {\n this._layoutCalculationPromise.then(() => {\n this._fit(duration)\n })\n }\n\n /** Enable automatic fitting to container if it was disabled due to previous zoom / pan interactions */\n public resetAutofitState (): void {\n this._isAutoFitDisabled = false\n }\n\n /** Get current coordinates of the nodes as an array of { id: string; x: number; y: number } objects */\n public getNodesCoordinates (): { id: string; x: number; y: number }[] {\n const { datamodel: { nodes } } = this\n return nodes.map(n => ({\n id: n._id,\n x: n.x,\n y: n.y,\n }))\n }\n\n /** Get node coordinates by id as { id: string; x: number; y: number } */\n public getNodeCoordinatesById (id: string): { id: string; x: number; y: number } | undefined {\n const { datamodel: { nodes } } = this\n const node = nodes.find(n => n._id === id)\n\n if (!node) {\n console.warn(`Unovis | Graph: Node ${id} not found`)\n return undefined\n } else {\n return {\n id: node._id,\n x: node.x,\n y: node.y,\n }\n }\n }\n}\n"],"names":["generalSelectors.background","generalSelectors.graphGroup","panelSelectors.panels","linkSelectors.links","nodeSelectors.nodes","nodeSelectors.gNode","nodeSelectors.gNodeExit","linkSelectors.gLink","linkSelectors.gLinkExit","panelSelectors.gPanel","generalSelectors.root","nodeSelectors.node","nodeSelectors.nodeGauge","nodeSelectors.sideLabelGroup","nodeSelectors.label","nodeSelectors.greyedOutNode","linkSelectors.link","linkSelectors.greyedOutLink","panelSelectors.panel","panelSelectors.panelSelection","panelSelectors.label","panelSelectors.labelText","panelSelectors.sideIconGroup","panelSelectors.sideIconShape","panelSelectors.sideIconSymbol","nodeSelectors"],"mappings":"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"}
|
|
@@ -353,9 +353,13 @@ function applyLayoutForce(datamodel, config, width) {
|
|
|
353
353
|
for (let i = 0, n = numIterations; i < n; ++i) {
|
|
354
354
|
simulation.tick();
|
|
355
355
|
}
|
|
356
|
-
// Fix node positions if requested
|
|
356
|
+
// Fix node positions to `_state` if requested.
|
|
357
|
+
// And remove fx and fy from the node datum if present to make sure the nodes are not fixed
|
|
358
|
+
// if the layout was changed to a different layout and then back to force
|
|
357
359
|
if (forceLayoutSettings.fixNodePositionAfterSimulation) {
|
|
358
|
-
nodes.forEach(d => {
|
|
360
|
+
nodes.forEach((d) => {
|
|
361
|
+
delete d.fx;
|
|
362
|
+
delete d.fy;
|
|
359
363
|
d._state.fx = d.x;
|
|
360
364
|
d._state.fy = d.y;
|
|
361
365
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"layout.js","sources":["../../../../src/components/graph/modules/layout.ts"],"sourcesContent":["import { min, max, group } from 'd3-array'\nimport type { SimulationNodeDatum } from 'd3-force'\nimport type { ElkNode } from 'elkjs/lib/elk.bundled.js'\nimport type { graphlib, Node } from 'dagre'\n\n// Core\nimport { GraphDataModel } from 'data-models/graph'\n\n// Utils\nimport { without, clamp, groupBy, unique, sortBy, getString, getNumber, getValue, merge, isFunction, isNil } from 'utils/data'\n\n// Types\nimport { GraphInputLink, GraphInputNode } from 'types/graph'\n\n// Local Types\nimport { GraphNode, GraphLink, GraphForceSimulationNode } from '../types'\n\n// Config\nimport { GraphConfigInterface } from '../config'\n\n// Helpers\nimport { getMaxNodeSize, configuredNodeSize, getNodeSize, getAverageNodeSize } from './node/helper'\nimport {\n DEFAULT_ELK_SETTINGS,\n adjustElkHierarchyCoordinates,\n positionNonConnectedNodes,\n toElkHierarchy,\n GraphElkHierarchyNode,\n} from './layout-helpers'\n\nexport function applyLayoutCircular<N extends GraphInputNode, L extends GraphInputLink> (\n datamodel: GraphDataModel<N, L, GraphNode<N, L>, GraphLink<N, L>>,\n config: GraphConfigInterface<N, L>,\n width: number,\n height: number\n): void {\n const { nonConnectedNodes, connectedNodes, nodes } = datamodel\n const { layoutNonConnectedAside, nodeSize } = config\n\n const activeWidth = width\n const activeHeight = height\n\n // Handle layout nodes\n const layoutNodes = layoutNonConnectedAside ? connectedNodes : nodes\n const maxNodeSize = getMaxNodeSize(layoutNodes, nodeSize)\n const yRatio = activeHeight / maxNodeSize\n const yScaling = yRatio < layoutNodes.length / 2 ? layoutNodes.length / 2 / yRatio : 1\n const xRatio = activeWidth / maxNodeSize\n const xScaling = xRatio < layoutNodes.length / 2 ? layoutNodes.length / 2 / xRatio : 1\n const scaling = Math.max(xScaling, yScaling)\n\n layoutNodes.forEach((d, i) => {\n const rX = scaling * activeWidth / 2\n const rY = scaling * activeHeight / 2 // maxNodeSize * layoutNodes.length / 4\n const angle = 2 * i * Math.PI / layoutNodes.length\n d.x = activeWidth / 2 + rX * Math.cos(angle)\n d.y = activeHeight / 2 + rY * Math.sin(angle)\n })\n\n // Handle non-connected nodes\n if (layoutNonConnectedAside) {\n const maxSize = getMaxNodeSize(nonConnectedNodes, nodeSize)\n const maxY = max<number>(connectedNodes.map(d => d.y))\n const maxX = max<number>(connectedNodes.map(d => d.x))\n const minX = min<number>(connectedNodes.map(d => d.x))\n const graphWidth = maxX - minX\n positionNonConnectedNodes(nonConnectedNodes, maxY + maxSize * 3, maxSize * 2.25, Math.max(graphWidth, width), minX)\n }\n}\n\nexport function applyLayoutParallel<N extends GraphInputNode, L extends GraphInputLink> (\n datamodel: GraphDataModel<N, L, GraphNode<N, L>, GraphLink<N, L>>,\n config: GraphConfigInterface<N, L>,\n width: number,\n height: number,\n orientation?: string\n): void {\n const { nonConnectedNodes, connectedNodes, nodes } = datamodel\n const {\n layoutNonConnectedAside, layoutGroupOrder, layoutParallelSortConnectionsByGroup, layoutParallelNodesPerColumn,\n layoutParallelSubGroupsPerRow, nodeSize, layoutNodeGroup, layoutParallelNodeSubGroup, layoutParallelGroupSpacing,\n } = config\n\n const activeWidth = width - configuredNodeSize(nodeSize)\n const activeHeight = height - configuredNodeSize(nodeSize) - (nonConnectedNodes.length ? configuredNodeSize(nodeSize) * 5 : 0)\n\n // Handle connected nodes\n const layoutNodes = layoutNonConnectedAside ? connectedNodes : nodes\n const groupNames = unique(layoutNodes.map(d => getString(d, layoutNodeGroup, d._index)))\n const groupNamesSorted: string[] = sortBy(groupNames, d => layoutGroupOrder.indexOf(d))\n\n const groups = groupNamesSorted.map(groupName => {\n const groupNodes = layoutNodes.filter(d => getString(d, layoutNodeGroup, d._index) === groupName)\n const groupedBySubgroup = groupBy(groupNodes, d => getString(d, layoutParallelNodeSubGroup, d._index))\n const subgroups = Object.keys(groupedBySubgroup).map(name => ({\n nodes: groupedBySubgroup[name],\n name,\n }))\n\n return {\n name: groupName,\n nodes: groupNodes,\n subgroups,\n }\n })\n\n // Sort\n const group = groups.find(g => g.name === layoutParallelSortConnectionsByGroup)\n if (group) {\n const sortMap: Record<string, number> = {}\n let idx = 0\n group.subgroups.forEach(subgroup => {\n subgroup.nodes.forEach(node => {\n node.links.forEach(link => {\n const linkTargetId = link?.target._id\n sortMap[linkTargetId] = idx\n idx = idx + 1\n })\n })\n })\n\n without(groups, group).forEach(g => {\n g.subgroups.forEach(subgroup => {\n subgroup.nodes.sort((a, b) => {\n return (sortMap[a._id] || 0) - (sortMap[b._id] || 0)\n })\n })\n })\n }\n\n const maxN = max(groups, d => d.nodes?.length)\n const labelApprxHeight = 40\n const labelMargin = 10\n const subgroupMargin = 40\n const maxNodeSize = getMaxNodeSize(layoutNodes, nodeSize)\n\n if (orientation === 'horizontal') {\n const minHorizontalStep = 2 * maxNodeSize + labelMargin\n const maxHorizontalStep = 3.5 * maxNodeSize + labelMargin\n const horizontalStep = clamp(activeWidth / (maxN - 1), minHorizontalStep, maxHorizontalStep)\n\n const maxVerticalStep = maxNodeSize * 4 + labelApprxHeight\n const minVerticalStep = maxNodeSize * 1.5 + labelApprxHeight\n const verticalStep = (maxNodeSize + layoutParallelGroupSpacing) || clamp(activeHeight / (groups.length - 1), minVerticalStep, maxVerticalStep)\n const subgroupNodeStep = maxNodeSize + labelApprxHeight + labelMargin\n\n let y0 = (groups.length < 2) ? height / 2 : 0\n groups.forEach(group => {\n let x0 = 0\n let dy = 0\n let subgroupMaxWidth = 0\n let groupWidth = 0\n let groupHeight = 0\n let k = 0\n group.subgroups.forEach(subgroup => {\n const subgroupRows = Math.ceil(subgroup.nodes.length / layoutParallelNodesPerColumn)\n let n = 0\n let x = x0\n let y = y0 + dy\n subgroup.nodes.forEach(d => {\n x = x + horizontalStep\n d.x = x\n d.y = y\n groupWidth = Math.max(groupWidth, x)\n\n n = n + 1\n if (n >= layoutParallelNodesPerColumn) {\n n = 0\n y += subgroupNodeStep\n x = x0\n }\n })\n\n const subgroupWidth = Math.min(subgroup.nodes.length, layoutParallelNodesPerColumn) * horizontalStep\n const subgroupHeight = subgroupRows * subgroupNodeStep\n subgroupMaxWidth = Math.max(subgroupMaxWidth, subgroupWidth)\n dy = dy + subgroupHeight + subgroupMargin\n k = k + 1\n if (k >= layoutParallelSubGroupsPerRow) {\n k = 0\n dy = 0\n x0 = x0 + subgroupMaxWidth + subgroupMargin\n subgroupMaxWidth = 0\n }\n\n groupHeight = Math.max(groupHeight, y)\n // x0 += Math.min(subgroup.nodes.length, layoutParallelNodesPerColumn) * horizontalStep + subgroupMargin\n })\n\n // Center group horizontally\n group.subgroups.forEach(subgroup => {\n subgroup.nodes.forEach(d => {\n d.x -= groupWidth / 2\n })\n })\n groupWidth = 0\n\n // Update y0 for the next group\n y0 = groupHeight + verticalStep\n })\n } else {\n const minHorizontalStep = 6 * maxNodeSize + labelMargin\n const maxHorizontalStep = 10 * maxNodeSize + labelMargin\n const horizontalStep = (maxNodeSize + layoutParallelGroupSpacing) || clamp(activeWidth / (maxN - 1), minHorizontalStep, maxHorizontalStep)\n\n const maxVerticalStep = maxNodeSize * 2.0 + labelApprxHeight\n const minVerticalStep = maxNodeSize * 1.5 + labelApprxHeight\n const verticalStep = clamp(activeHeight / (groups.length - 1), minVerticalStep, maxVerticalStep)\n const subgroupNodeStep = maxNodeSize * 2.0\n\n let x0 = (groups.length < 2) ? width / 2 : 0\n groups.forEach(group => {\n let y0 = 0\n let dx = 0 // Horizontal shift inside the group (column)\n let subgroupMaxHeight = 0\n let groupWidth = 0\n let groupHeight = 0\n\n let k = 0\n group.subgroups.forEach(subgroup => {\n const subgroupColumns = Math.ceil(subgroup.nodes.length / layoutParallelNodesPerColumn)\n let n = 0\n let y = y0\n let x = x0 + dx\n subgroup.nodes.forEach(d => {\n y = y + verticalStep\n d.x = x\n d.y = y\n groupHeight = Math.max(groupHeight, y)\n\n n = n + 1\n if (n >= layoutParallelNodesPerColumn) {\n n = 0\n x += subgroupNodeStep\n y = y0\n }\n })\n\n const subgroupHeight = Math.min(subgroup.nodes.length, layoutParallelNodesPerColumn) * verticalStep\n const subgroupWidth = subgroupColumns * subgroupNodeStep\n subgroupMaxHeight = Math.max(subgroupMaxHeight, subgroupHeight)\n dx = dx + subgroupWidth + subgroupMargin\n k = k + 1\n if (k >= layoutParallelSubGroupsPerRow) {\n k = 0\n dx = 0\n y0 = y0 + subgroupMaxHeight + subgroupMargin\n subgroupMaxHeight = 0\n }\n\n groupWidth = Math.max(groupWidth, x)\n })\n\n // Center group vertically\n group.subgroups.forEach(subgroup => {\n subgroup.nodes.forEach(d => {\n d.y -= groupHeight / 2\n })\n })\n groupHeight = 0\n\n // Update x0 for the next group\n x0 = groupWidth + horizontalStep\n })\n }\n\n // Handle non-connected nodes\n if (layoutNonConnectedAside) {\n const maxSize = getMaxNodeSize(nonConnectedNodes, nodeSize)\n const maxY = max<number>(connectedNodes.map(d => d.y)) || 0\n const maxX = max<number>(connectedNodes.map(d => d.x)) || 0\n const minX = min<number>(connectedNodes.map(d => d.x)) || 0\n const graphWidth = (maxX - minX) || width\n positionNonConnectedNodes(nonConnectedNodes, maxY + maxSize * 3, maxSize * 2.25, Math.max(graphWidth, width))\n }\n}\n\nexport async function applyLayoutDagre<N extends GraphInputNode, L extends GraphInputLink> (\n datamodel: GraphDataModel<N, L, GraphNode<N, L>, GraphLink<N, L>>,\n config: GraphConfigInterface<N, L>,\n width: number\n): Promise<void> {\n const { nonConnectedNodes, connectedNodes, nodes, links } = datamodel\n const { nodeSize, layoutNonConnectedAside, dagreLayoutSettings, nodeStrokeWidth, nodeLabel } = config\n\n // eslint-disable-next-line @typescript-eslint/naming-convention,@typescript-eslint/ban-ts-comment\n // @ts-ignore\n // eslint-disable-next-line @typescript-eslint/naming-convention\n const { Graph } = await import('@unovis/graphlibrary')\n // eslint-disable-next-line @typescript-eslint/naming-convention,@typescript-eslint/ban-ts-comment\n // @ts-ignore\n // eslint-disable-next-line @typescript-eslint/naming-convention\n const { layout } = await import('@unovis/dagre-layout')\n\n // https://github.com/dagrejs/dagre/wiki\n const dagreGraph = new Graph() as graphlib.Graph<GraphNode<N, L>>\n\n // Set an object for the graph label\n dagreGraph.setGraph(dagreLayoutSettings)\n\n // Default to assigning a new object as a label for each new edge.\n dagreGraph.setDefaultEdgeLabel(() => ({}))\n\n // Add nodes to the graph. The first argument is the node id. The second is\n // metadata about the node. In this case we're going to add labels to each of\n // our nodes.\n const labelApprxHeight = 40\n const nds = (layoutNonConnectedAside ? connectedNodes : nodes)\n nds.forEach(node => {\n dagreGraph.setNode(`${node._index}`, {\n label: getString(node, nodeLabel, node._index),\n width: getNumber(node, nodeSize, node._index) * 1.5 + getNumber(node, nodeStrokeWidth, node._index),\n height: labelApprxHeight + getNumber(node, nodeSize, node._index) * 1.5,\n originalNode: node,\n })\n })\n\n // Add edges to the graph.\n links.forEach(link => {\n dagreGraph.setEdge(\n `${link.source._index}`,\n `${link.target._index}`\n )\n })\n\n // Calculate the layout\n layout(dagreGraph)\n\n // Apply coordinates to the graph\n dagreGraph.nodes().forEach(d => {\n const node = dagreGraph.node(d) as Node<GraphNode<N, L>> & { originalNode: GraphNode<N, L>}\n node.originalNode.x = node.x // width * d.x / dagreGraph._label.width\n node.originalNode.y = node.y // height * d.y / dagreGraph._label.height\n })\n\n // Handle non-connected nodes\n if (layoutNonConnectedAside) {\n const maxNodeSize = getMaxNodeSize(nonConnectedNodes, nodeSize)\n const maxY = max<number>(connectedNodes.map(d => d.y))\n const maxX = max<number>(connectedNodes.map(d => d.x))\n const minX = min<number>(connectedNodes.map(d => d.x))\n const graphWidth = maxX - minX\n positionNonConnectedNodes(nonConnectedNodes, maxY + maxNodeSize * 3, maxNodeSize * 2.25, Math.max(graphWidth, width), 0)\n }\n}\n\nexport function applyLayoutConcentric<N extends GraphInputNode, L extends GraphInputLink> (\n datamodel: GraphDataModel<N, L, GraphNode<N, L>, GraphLink<N, L>>,\n config: GraphConfigInterface<N, L>,\n width: number,\n height: number\n): void {\n const { nonConnectedNodes, connectedNodes, nodes } = datamodel\n const { layoutNonConnectedAside, layoutGroupOrder, nodeSize, layoutNodeGroup } = config\n\n const layoutNodes = layoutNonConnectedAside ? connectedNodes : nodes\n\n const groupNames: string[] = unique(layoutNodes.map(d => getString(d, layoutNodeGroup, d._index)))\n const groupNamesSorted: string[] = sortBy(groupNames, d => layoutGroupOrder.indexOf(d))\n\n const groups = groupNamesSorted.map(groupName => ({\n name: groupName,\n nodes: layoutNodes.filter(d => getString(d, layoutNodeGroup, d._index) === groupName),\n }))\n\n // Handle connected nodes\n let r = 2 * getAverageNodeSize(groups[0]?.nodes ?? [], nodeSize)\n const widthToHeightRatio = width / height\n\n groups.forEach((group, i) => {\n const avgNodeSize = getAverageNodeSize(group.nodes, nodeSize)\n const requiredRadius = 1.1 * avgNodeSize * group.nodes.length / Math.PI\n if (r < requiredRadius) r = requiredRadius\n\n group.nodes.forEach((node, j) => {\n // If the first (central) group has only one node\n if (i === 0 && group.nodes.length === 1) {\n node.x = width / 2\n node.y = height / 2\n } else {\n let dAngle = 0\n if (i === 0 && group.nodes.length === 3) dAngle = Math.PI / 6\n if (i === 0 && group.nodes.length === 4) dAngle = Math.PI / 4\n const angle = 2 * j * Math.PI / group.nodes.length + i * Math.PI / 12 + dAngle\n node.x = width / 2 + r * Math.cos(angle) * widthToHeightRatio\n node.y = height / 2 + r * Math.sin(angle)\n }\n })\n\n const groupSpacing = avgNodeSize * 3\n r += groupSpacing\n })\n\n // Handle non-connected nodes\n if (layoutNonConnectedAside) {\n const maxSize = getMaxNodeSize(nonConnectedNodes, nodeSize)\n const maxY = max<number>(connectedNodes.map(d => d.y))\n const maxX = max<number>(connectedNodes.map(d => d.x))\n const minX = min<number>(connectedNodes.map(d => d.x))\n const graphWidth = maxX - minX\n positionNonConnectedNodes(nonConnectedNodes, maxY + maxSize * 3, maxSize * 2.25, graphWidth, minX)\n }\n}\n\nexport async function applyLayoutForce<N extends GraphInputNode, L extends GraphInputLink> (\n datamodel: GraphDataModel<N, L, GraphNode<N, L>, GraphLink<N, L>>,\n config: GraphConfigInterface<N, L>,\n width: number\n): Promise<void> {\n const { layoutNonConnectedAside, forceLayoutSettings, nodeSize } = config\n\n const { forceSimulation, forceLink, forceManyBody, forceX, forceY, forceCollide } = await import('d3-force')\n\n const { nonConnectedNodes, connectedNodes, nodes, links } = datamodel\n\n // Apply fx and fy to nodes if present before running the simulation\n if (forceLayoutSettings.fixNodePositionAfterSimulation) {\n nodes.forEach((d: GraphForceSimulationNode<N, L>) => {\n d.fx = isNil(d._state.fx) ? undefined : d._state.fx\n d.fy = isNil(d._state.fy) ? undefined : d._state.fy\n })\n } else {\n nodes.forEach((d: GraphForceSimulationNode<N, L>) => {\n delete d._state.fx\n delete d._state.fy\n })\n }\n\n const simulation = forceSimulation(layoutNonConnectedAside ? connectedNodes : nodes)\n .force('link', forceLink(links)\n .id((d) => String((d as GraphNode<N, L>)._id))\n .distance((l, i) => isFunction(forceLayoutSettings.linkDistance) ? forceLayoutSettings.linkDistance(l, i) : forceLayoutSettings.linkDistance)\n .strength((l, i) => isFunction(forceLayoutSettings.linkStrength) ? forceLayoutSettings.linkStrength(l, i) : forceLayoutSettings.linkStrength)\n )\n .force('charge', forceManyBody().strength((d, i) => {\n if (isFunction(forceLayoutSettings.charge)) {\n return forceLayoutSettings.charge(d as GraphNode<N, L>, i)\n } else {\n const linkCount = links.reduce((count, l) => count + Number((l.source === d) || (l.target === d)), 0)\n return forceLayoutSettings.charge * Math.sqrt(linkCount)\n }\n }))\n .force('x', forceX().strength(forceLayoutSettings.forceXStrength))\n .force('y', forceY().strength(forceLayoutSettings.forceYStrength))\n .force('collide', forceCollide<SimulationNodeDatum & N>().radius((d, i) => getNodeSize(d, nodeSize, i)).iterations(1))\n .stop()\n\n // See https://bl.ocks.org/mbostock/1667139, https://github.com/d3/d3-force/blob/master/README.md#simulation_tick\n const numIterations = forceLayoutSettings.numIterations ?? Math.ceil(Math.log(simulation.alphaMin()) / Math.log(1 - simulation.alphaDecay()))\n for (let i = 0, n = numIterations; i < n; ++i) {\n simulation.tick()\n }\n\n // Fix node positions if requested\n if (forceLayoutSettings.fixNodePositionAfterSimulation) {\n nodes.forEach(d => {\n d._state.fx = d.x\n d._state.fy = d.y\n })\n }\n\n // Handle non-connected nodes\n if (layoutNonConnectedAside) {\n const maxSize = getMaxNodeSize(nonConnectedNodes, nodeSize)\n const maxY = max<number>(connectedNodes.map(d => d.y))\n const maxX = max<number>(connectedNodes.map(d => d.x))\n const minX = min<number>(connectedNodes.map(d => d.x))\n const graphWidth = maxX - minX\n positionNonConnectedNodes(nonConnectedNodes, maxY + maxSize * 6, maxSize * 2.25, Math.max(graphWidth, width), minX)\n }\n}\n\nexport async function applyELKLayout<N extends GraphInputNode, L extends GraphInputLink> (\n datamodel: GraphDataModel<N, L, GraphNode<N, L>, GraphLink<N, L>>,\n config: GraphConfigInterface<N, L>,\n width: number\n): Promise<void> {\n const ELK = (await import('elkjs/lib/elk.bundled.js')).default\n const elk = new ELK()\n\n const labelApprxHeight = 30\n const nodes = datamodel.nodes.map(n => ({\n ...n,\n id: n._id,\n width: getNumber(n, config.nodeSize, n._index) + getNumber(n, config.nodeStrokeWidth, n._index),\n height: getNumber(n, config.nodeSize, n._index) + labelApprxHeight,\n }))\n\n let elkNodes: (GraphNode<N, L> | GraphElkHierarchyNode<N, L>)[]\n if (config.layoutElkNodeGroups) {\n const groupingFunctions = config.layoutElkNodeGroups\n .map(accessor => (d: GraphNode<N, L>) => getString(d, accessor, d._index)) as [(d: GraphNode<N, L>) => string]\n const grouped = group(nodes, ...groupingFunctions)\n elkNodes = toElkHierarchy(grouped, config.layoutElkSettings)\n } else {\n elkNodes = nodes\n }\n\n const rootNodeId = 'root'\n const elkGraph: ElkNode = {\n id: rootNodeId,\n layoutOptions: merge(DEFAULT_ELK_SETTINGS, getValue(rootNodeId, config.layoutElkSettings)),\n children: elkNodes as ElkNode[],\n edges: datamodel.links.map(l => ({\n id: l._id,\n sources: [l.source._id],\n targets: [l.target._id],\n })),\n }\n\n const layout = await elk.layout(elkGraph)\n adjustElkHierarchyCoordinates(layout)\n\n nodes.forEach((node, i) => {\n const found = datamodel.nodes.find(n => n._id === node.id)\n if (!found) return\n\n found.x = node.x\n found.y = node.y\n })\n\n // Handle non-connected nodes\n if (config.layoutNonConnectedAside) {\n const maxSize = getMaxNodeSize(datamodel.nonConnectedNodes, config.nodeSize)\n const maxY = max<number>(datamodel.connectedNodes.map(d => d.y)) || 0\n const maxX = max<number>(datamodel.connectedNodes.map(d => d.x)) || 0\n const minX = min<number>(datamodel.connectedNodes.map(d => d.x)) || 0\n const graphWidth = (maxX - minX) || width\n positionNonConnectedNodes(datamodel.nonConnectedNodes, maxY + maxSize * 3, maxSize * 2.25, Math.max(graphWidth, width))\n }\n}\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"layout.js","sources":["../../../../src/components/graph/modules/layout.ts"],"sourcesContent":["import { min, max, group } from 'd3-array'\nimport type { SimulationNodeDatum } from 'd3-force'\nimport type { ElkNode } from 'elkjs/lib/elk.bundled.js'\nimport type { graphlib, Node } from 'dagre'\n\n// Core\nimport { GraphDataModel } from 'data-models/graph'\n\n// Utils\nimport { without, clamp, groupBy, unique, sortBy, getString, getNumber, getValue, merge, isFunction, isNil } from 'utils/data'\n\n// Types\nimport { GraphInputLink, GraphInputNode } from 'types/graph'\n\n// Local Types\nimport { GraphNode, GraphLink, GraphForceSimulationNode } from '../types'\n\n// Config\nimport { GraphConfigInterface } from '../config'\n\n// Helpers\nimport { getMaxNodeSize, configuredNodeSize, getNodeSize, getAverageNodeSize } from './node/helper'\nimport {\n DEFAULT_ELK_SETTINGS,\n adjustElkHierarchyCoordinates,\n positionNonConnectedNodes,\n toElkHierarchy,\n GraphElkHierarchyNode,\n} from './layout-helpers'\n\nexport function applyLayoutCircular<N extends GraphInputNode, L extends GraphInputLink> (\n datamodel: GraphDataModel<N, L, GraphNode<N, L>, GraphLink<N, L>>,\n config: GraphConfigInterface<N, L>,\n width: number,\n height: number\n): void {\n const { nonConnectedNodes, connectedNodes, nodes } = datamodel\n const { layoutNonConnectedAside, nodeSize } = config\n\n const activeWidth = width\n const activeHeight = height\n\n // Handle layout nodes\n const layoutNodes = layoutNonConnectedAside ? connectedNodes : nodes\n const maxNodeSize = getMaxNodeSize(layoutNodes, nodeSize)\n const yRatio = activeHeight / maxNodeSize\n const yScaling = yRatio < layoutNodes.length / 2 ? layoutNodes.length / 2 / yRatio : 1\n const xRatio = activeWidth / maxNodeSize\n const xScaling = xRatio < layoutNodes.length / 2 ? layoutNodes.length / 2 / xRatio : 1\n const scaling = Math.max(xScaling, yScaling)\n\n layoutNodes.forEach((d, i) => {\n const rX = scaling * activeWidth / 2\n const rY = scaling * activeHeight / 2 // maxNodeSize * layoutNodes.length / 4\n const angle = 2 * i * Math.PI / layoutNodes.length\n d.x = activeWidth / 2 + rX * Math.cos(angle)\n d.y = activeHeight / 2 + rY * Math.sin(angle)\n })\n\n // Handle non-connected nodes\n if (layoutNonConnectedAside) {\n const maxSize = getMaxNodeSize(nonConnectedNodes, nodeSize)\n const maxY = max<number>(connectedNodes.map(d => d.y))\n const maxX = max<number>(connectedNodes.map(d => d.x))\n const minX = min<number>(connectedNodes.map(d => d.x))\n const graphWidth = maxX - minX\n positionNonConnectedNodes(nonConnectedNodes, maxY + maxSize * 3, maxSize * 2.25, Math.max(graphWidth, width), minX)\n }\n}\n\nexport function applyLayoutParallel<N extends GraphInputNode, L extends GraphInputLink> (\n datamodel: GraphDataModel<N, L, GraphNode<N, L>, GraphLink<N, L>>,\n config: GraphConfigInterface<N, L>,\n width: number,\n height: number,\n orientation?: string\n): void {\n const { nonConnectedNodes, connectedNodes, nodes } = datamodel\n const {\n layoutNonConnectedAside, layoutGroupOrder, layoutParallelSortConnectionsByGroup, layoutParallelNodesPerColumn,\n layoutParallelSubGroupsPerRow, nodeSize, layoutNodeGroup, layoutParallelNodeSubGroup, layoutParallelGroupSpacing,\n } = config\n\n const activeWidth = width - configuredNodeSize(nodeSize)\n const activeHeight = height - configuredNodeSize(nodeSize) - (nonConnectedNodes.length ? configuredNodeSize(nodeSize) * 5 : 0)\n\n // Handle connected nodes\n const layoutNodes = layoutNonConnectedAside ? connectedNodes : nodes\n const groupNames = unique(layoutNodes.map(d => getString(d, layoutNodeGroup, d._index)))\n const groupNamesSorted: string[] = sortBy(groupNames, d => layoutGroupOrder.indexOf(d))\n\n const groups = groupNamesSorted.map(groupName => {\n const groupNodes = layoutNodes.filter(d => getString(d, layoutNodeGroup, d._index) === groupName)\n const groupedBySubgroup = groupBy(groupNodes, d => getString(d, layoutParallelNodeSubGroup, d._index))\n const subgroups = Object.keys(groupedBySubgroup).map(name => ({\n nodes: groupedBySubgroup[name],\n name,\n }))\n\n return {\n name: groupName,\n nodes: groupNodes,\n subgroups,\n }\n })\n\n // Sort\n const group = groups.find(g => g.name === layoutParallelSortConnectionsByGroup)\n if (group) {\n const sortMap: Record<string, number> = {}\n let idx = 0\n group.subgroups.forEach(subgroup => {\n subgroup.nodes.forEach(node => {\n node.links.forEach(link => {\n const linkTargetId = link?.target._id\n sortMap[linkTargetId] = idx\n idx = idx + 1\n })\n })\n })\n\n without(groups, group).forEach(g => {\n g.subgroups.forEach(subgroup => {\n subgroup.nodes.sort((a, b) => {\n return (sortMap[a._id] || 0) - (sortMap[b._id] || 0)\n })\n })\n })\n }\n\n const maxN = max(groups, d => d.nodes?.length)\n const labelApprxHeight = 40\n const labelMargin = 10\n const subgroupMargin = 40\n const maxNodeSize = getMaxNodeSize(layoutNodes, nodeSize)\n\n if (orientation === 'horizontal') {\n const minHorizontalStep = 2 * maxNodeSize + labelMargin\n const maxHorizontalStep = 3.5 * maxNodeSize + labelMargin\n const horizontalStep = clamp(activeWidth / (maxN - 1), minHorizontalStep, maxHorizontalStep)\n\n const maxVerticalStep = maxNodeSize * 4 + labelApprxHeight\n const minVerticalStep = maxNodeSize * 1.5 + labelApprxHeight\n const verticalStep = (maxNodeSize + layoutParallelGroupSpacing) || clamp(activeHeight / (groups.length - 1), minVerticalStep, maxVerticalStep)\n const subgroupNodeStep = maxNodeSize + labelApprxHeight + labelMargin\n\n let y0 = (groups.length < 2) ? height / 2 : 0\n groups.forEach(group => {\n let x0 = 0\n let dy = 0\n let subgroupMaxWidth = 0\n let groupWidth = 0\n let groupHeight = 0\n let k = 0\n group.subgroups.forEach(subgroup => {\n const subgroupRows = Math.ceil(subgroup.nodes.length / layoutParallelNodesPerColumn)\n let n = 0\n let x = x0\n let y = y0 + dy\n subgroup.nodes.forEach(d => {\n x = x + horizontalStep\n d.x = x\n d.y = y\n groupWidth = Math.max(groupWidth, x)\n\n n = n + 1\n if (n >= layoutParallelNodesPerColumn) {\n n = 0\n y += subgroupNodeStep\n x = x0\n }\n })\n\n const subgroupWidth = Math.min(subgroup.nodes.length, layoutParallelNodesPerColumn) * horizontalStep\n const subgroupHeight = subgroupRows * subgroupNodeStep\n subgroupMaxWidth = Math.max(subgroupMaxWidth, subgroupWidth)\n dy = dy + subgroupHeight + subgroupMargin\n k = k + 1\n if (k >= layoutParallelSubGroupsPerRow) {\n k = 0\n dy = 0\n x0 = x0 + subgroupMaxWidth + subgroupMargin\n subgroupMaxWidth = 0\n }\n\n groupHeight = Math.max(groupHeight, y)\n // x0 += Math.min(subgroup.nodes.length, layoutParallelNodesPerColumn) * horizontalStep + subgroupMargin\n })\n\n // Center group horizontally\n group.subgroups.forEach(subgroup => {\n subgroup.nodes.forEach(d => {\n d.x -= groupWidth / 2\n })\n })\n groupWidth = 0\n\n // Update y0 for the next group\n y0 = groupHeight + verticalStep\n })\n } else {\n const minHorizontalStep = 6 * maxNodeSize + labelMargin\n const maxHorizontalStep = 10 * maxNodeSize + labelMargin\n const horizontalStep = (maxNodeSize + layoutParallelGroupSpacing) || clamp(activeWidth / (maxN - 1), minHorizontalStep, maxHorizontalStep)\n\n const maxVerticalStep = maxNodeSize * 2.0 + labelApprxHeight\n const minVerticalStep = maxNodeSize * 1.5 + labelApprxHeight\n const verticalStep = clamp(activeHeight / (groups.length - 1), minVerticalStep, maxVerticalStep)\n const subgroupNodeStep = maxNodeSize * 2.0\n\n let x0 = (groups.length < 2) ? width / 2 : 0\n groups.forEach(group => {\n let y0 = 0\n let dx = 0 // Horizontal shift inside the group (column)\n let subgroupMaxHeight = 0\n let groupWidth = 0\n let groupHeight = 0\n\n let k = 0\n group.subgroups.forEach(subgroup => {\n const subgroupColumns = Math.ceil(subgroup.nodes.length / layoutParallelNodesPerColumn)\n let n = 0\n let y = y0\n let x = x0 + dx\n subgroup.nodes.forEach(d => {\n y = y + verticalStep\n d.x = x\n d.y = y\n groupHeight = Math.max(groupHeight, y)\n\n n = n + 1\n if (n >= layoutParallelNodesPerColumn) {\n n = 0\n x += subgroupNodeStep\n y = y0\n }\n })\n\n const subgroupHeight = Math.min(subgroup.nodes.length, layoutParallelNodesPerColumn) * verticalStep\n const subgroupWidth = subgroupColumns * subgroupNodeStep\n subgroupMaxHeight = Math.max(subgroupMaxHeight, subgroupHeight)\n dx = dx + subgroupWidth + subgroupMargin\n k = k + 1\n if (k >= layoutParallelSubGroupsPerRow) {\n k = 0\n dx = 0\n y0 = y0 + subgroupMaxHeight + subgroupMargin\n subgroupMaxHeight = 0\n }\n\n groupWidth = Math.max(groupWidth, x)\n })\n\n // Center group vertically\n group.subgroups.forEach(subgroup => {\n subgroup.nodes.forEach(d => {\n d.y -= groupHeight / 2\n })\n })\n groupHeight = 0\n\n // Update x0 for the next group\n x0 = groupWidth + horizontalStep\n })\n }\n\n // Handle non-connected nodes\n if (layoutNonConnectedAside) {\n const maxSize = getMaxNodeSize(nonConnectedNodes, nodeSize)\n const maxY = max<number>(connectedNodes.map(d => d.y)) || 0\n const maxX = max<number>(connectedNodes.map(d => d.x)) || 0\n const minX = min<number>(connectedNodes.map(d => d.x)) || 0\n const graphWidth = (maxX - minX) || width\n positionNonConnectedNodes(nonConnectedNodes, maxY + maxSize * 3, maxSize * 2.25, Math.max(graphWidth, width))\n }\n}\n\nexport async function applyLayoutDagre<N extends GraphInputNode, L extends GraphInputLink> (\n datamodel: GraphDataModel<N, L, GraphNode<N, L>, GraphLink<N, L>>,\n config: GraphConfigInterface<N, L>,\n width: number\n): Promise<void> {\n const { nonConnectedNodes, connectedNodes, nodes, links } = datamodel\n const { nodeSize, layoutNonConnectedAside, dagreLayoutSettings, nodeStrokeWidth, nodeLabel } = config\n\n // eslint-disable-next-line @typescript-eslint/naming-convention,@typescript-eslint/ban-ts-comment\n // @ts-ignore\n // eslint-disable-next-line @typescript-eslint/naming-convention\n const { Graph } = await import('@unovis/graphlibrary')\n // eslint-disable-next-line @typescript-eslint/naming-convention,@typescript-eslint/ban-ts-comment\n // @ts-ignore\n // eslint-disable-next-line @typescript-eslint/naming-convention\n const { layout } = await import('@unovis/dagre-layout')\n\n // https://github.com/dagrejs/dagre/wiki\n const dagreGraph = new Graph() as graphlib.Graph<GraphNode<N, L>>\n\n // Set an object for the graph label\n dagreGraph.setGraph(dagreLayoutSettings)\n\n // Default to assigning a new object as a label for each new edge.\n dagreGraph.setDefaultEdgeLabel(() => ({}))\n\n // Add nodes to the graph. The first argument is the node id. The second is\n // metadata about the node. In this case we're going to add labels to each of\n // our nodes.\n const labelApprxHeight = 40\n const nds = (layoutNonConnectedAside ? connectedNodes : nodes)\n nds.forEach(node => {\n dagreGraph.setNode(`${node._index}`, {\n label: getString(node, nodeLabel, node._index),\n width: getNumber(node, nodeSize, node._index) * 1.5 + getNumber(node, nodeStrokeWidth, node._index),\n height: labelApprxHeight + getNumber(node, nodeSize, node._index) * 1.5,\n originalNode: node,\n })\n })\n\n // Add edges to the graph.\n links.forEach(link => {\n dagreGraph.setEdge(\n `${link.source._index}`,\n `${link.target._index}`\n )\n })\n\n // Calculate the layout\n layout(dagreGraph)\n\n // Apply coordinates to the graph\n dagreGraph.nodes().forEach(d => {\n const node = dagreGraph.node(d) as Node<GraphNode<N, L>> & { originalNode: GraphNode<N, L>}\n node.originalNode.x = node.x // width * d.x / dagreGraph._label.width\n node.originalNode.y = node.y // height * d.y / dagreGraph._label.height\n })\n\n // Handle non-connected nodes\n if (layoutNonConnectedAside) {\n const maxNodeSize = getMaxNodeSize(nonConnectedNodes, nodeSize)\n const maxY = max<number>(connectedNodes.map(d => d.y))\n const maxX = max<number>(connectedNodes.map(d => d.x))\n const minX = min<number>(connectedNodes.map(d => d.x))\n const graphWidth = maxX - minX\n positionNonConnectedNodes(nonConnectedNodes, maxY + maxNodeSize * 3, maxNodeSize * 2.25, Math.max(graphWidth, width), 0)\n }\n}\n\nexport function applyLayoutConcentric<N extends GraphInputNode, L extends GraphInputLink> (\n datamodel: GraphDataModel<N, L, GraphNode<N, L>, GraphLink<N, L>>,\n config: GraphConfigInterface<N, L>,\n width: number,\n height: number\n): void {\n const { nonConnectedNodes, connectedNodes, nodes } = datamodel\n const { layoutNonConnectedAside, layoutGroupOrder, nodeSize, layoutNodeGroup } = config\n\n const layoutNodes = layoutNonConnectedAside ? connectedNodes : nodes\n\n const groupNames: string[] = unique(layoutNodes.map(d => getString(d, layoutNodeGroup, d._index)))\n const groupNamesSorted: string[] = sortBy(groupNames, d => layoutGroupOrder.indexOf(d))\n\n const groups = groupNamesSorted.map(groupName => ({\n name: groupName,\n nodes: layoutNodes.filter(d => getString(d, layoutNodeGroup, d._index) === groupName),\n }))\n\n // Handle connected nodes\n let r = 2 * getAverageNodeSize(groups[0]?.nodes ?? [], nodeSize)\n const widthToHeightRatio = width / height\n\n groups.forEach((group, i) => {\n const avgNodeSize = getAverageNodeSize(group.nodes, nodeSize)\n const requiredRadius = 1.1 * avgNodeSize * group.nodes.length / Math.PI\n if (r < requiredRadius) r = requiredRadius\n\n group.nodes.forEach((node, j) => {\n // If the first (central) group has only one node\n if (i === 0 && group.nodes.length === 1) {\n node.x = width / 2\n node.y = height / 2\n } else {\n let dAngle = 0\n if (i === 0 && group.nodes.length === 3) dAngle = Math.PI / 6\n if (i === 0 && group.nodes.length === 4) dAngle = Math.PI / 4\n const angle = 2 * j * Math.PI / group.nodes.length + i * Math.PI / 12 + dAngle\n node.x = width / 2 + r * Math.cos(angle) * widthToHeightRatio\n node.y = height / 2 + r * Math.sin(angle)\n }\n })\n\n const groupSpacing = avgNodeSize * 3\n r += groupSpacing\n })\n\n // Handle non-connected nodes\n if (layoutNonConnectedAside) {\n const maxSize = getMaxNodeSize(nonConnectedNodes, nodeSize)\n const maxY = max<number>(connectedNodes.map(d => d.y))\n const maxX = max<number>(connectedNodes.map(d => d.x))\n const minX = min<number>(connectedNodes.map(d => d.x))\n const graphWidth = maxX - minX\n positionNonConnectedNodes(nonConnectedNodes, maxY + maxSize * 3, maxSize * 2.25, graphWidth, minX)\n }\n}\n\nexport async function applyLayoutForce<N extends GraphInputNode, L extends GraphInputLink> (\n datamodel: GraphDataModel<N, L, GraphNode<N, L>, GraphLink<N, L>>,\n config: GraphConfigInterface<N, L>,\n width: number\n): Promise<void> {\n const { layoutNonConnectedAside, forceLayoutSettings, nodeSize } = config\n\n const { forceSimulation, forceLink, forceManyBody, forceX, forceY, forceCollide } = await import('d3-force')\n\n const { nonConnectedNodes, connectedNodes, nodes, links } = datamodel\n\n\n // Apply fx and fy to nodes if present before running the simulation\n if (forceLayoutSettings.fixNodePositionAfterSimulation) {\n nodes.forEach((d: GraphForceSimulationNode<N, L>) => {\n d.fx = isNil(d._state.fx) ? undefined : d._state.fx\n d.fy = isNil(d._state.fy) ? undefined : d._state.fy\n })\n } else {\n nodes.forEach((d: GraphForceSimulationNode<N, L>) => {\n delete d._state.fx\n delete d._state.fy\n })\n }\n\n const simulation = forceSimulation(layoutNonConnectedAside ? connectedNodes : nodes)\n .force('link', forceLink(links)\n .id((d) => String((d as GraphNode<N, L>)._id))\n .distance((l, i) => isFunction(forceLayoutSettings.linkDistance) ? forceLayoutSettings.linkDistance(l, i) : forceLayoutSettings.linkDistance)\n .strength((l, i) => isFunction(forceLayoutSettings.linkStrength) ? forceLayoutSettings.linkStrength(l, i) : forceLayoutSettings.linkStrength)\n )\n .force('charge', forceManyBody().strength((d, i) => {\n if (isFunction(forceLayoutSettings.charge)) {\n return forceLayoutSettings.charge(d as GraphNode<N, L>, i)\n } else {\n const linkCount = links.reduce((count, l) => count + Number((l.source === d) || (l.target === d)), 0)\n return forceLayoutSettings.charge * Math.sqrt(linkCount)\n }\n }))\n .force('x', forceX().strength(forceLayoutSettings.forceXStrength))\n .force('y', forceY().strength(forceLayoutSettings.forceYStrength))\n .force('collide', forceCollide<SimulationNodeDatum & N>().radius((d, i) => getNodeSize(d, nodeSize, i)).iterations(1))\n .stop()\n\n // See https://bl.ocks.org/mbostock/1667139, https://github.com/d3/d3-force/blob/master/README.md#simulation_tick\n const numIterations = forceLayoutSettings.numIterations ?? Math.ceil(Math.log(simulation.alphaMin()) / Math.log(1 - simulation.alphaDecay()))\n for (let i = 0, n = numIterations; i < n; ++i) {\n simulation.tick()\n }\n\n // Fix node positions to `_state` if requested.\n // And remove fx and fy from the node datum if present to make sure the nodes are not fixed\n // if the layout was changed to a different layout and then back to force\n if (forceLayoutSettings.fixNodePositionAfterSimulation) {\n nodes.forEach((d: GraphForceSimulationNode<N, L>) => {\n delete d.fx\n delete d.fy\n d._state.fx = d.x\n d._state.fy = d.y\n })\n }\n\n // Handle non-connected nodes\n if (layoutNonConnectedAside) {\n const maxSize = getMaxNodeSize(nonConnectedNodes, nodeSize)\n const maxY = max<number>(connectedNodes.map(d => d.y))\n const maxX = max<number>(connectedNodes.map(d => d.x))\n const minX = min<number>(connectedNodes.map(d => d.x))\n const graphWidth = maxX - minX\n positionNonConnectedNodes(nonConnectedNodes, maxY + maxSize * 6, maxSize * 2.25, Math.max(graphWidth, width), minX)\n }\n}\n\nexport async function applyELKLayout<N extends GraphInputNode, L extends GraphInputLink> (\n datamodel: GraphDataModel<N, L, GraphNode<N, L>, GraphLink<N, L>>,\n config: GraphConfigInterface<N, L>,\n width: number\n): Promise<void> {\n const ELK = (await import('elkjs/lib/elk.bundled.js')).default\n const elk = new ELK()\n\n const labelApprxHeight = 30\n const nodes = datamodel.nodes.map(n => ({\n ...n,\n id: n._id,\n width: getNumber(n, config.nodeSize, n._index) + getNumber(n, config.nodeStrokeWidth, n._index),\n height: getNumber(n, config.nodeSize, n._index) + labelApprxHeight,\n }))\n\n let elkNodes: (GraphNode<N, L> | GraphElkHierarchyNode<N, L>)[]\n if (config.layoutElkNodeGroups) {\n const groupingFunctions = config.layoutElkNodeGroups\n .map(accessor => (d: GraphNode<N, L>) => getString(d, accessor, d._index)) as [(d: GraphNode<N, L>) => string]\n const grouped = group(nodes, ...groupingFunctions)\n elkNodes = toElkHierarchy(grouped, config.layoutElkSettings)\n } else {\n elkNodes = nodes\n }\n\n const rootNodeId = 'root'\n const elkGraph: ElkNode = {\n id: rootNodeId,\n layoutOptions: merge(DEFAULT_ELK_SETTINGS, getValue(rootNodeId, config.layoutElkSettings)),\n children: elkNodes as ElkNode[],\n edges: datamodel.links.map(l => ({\n id: l._id,\n sources: [l.source._id],\n targets: [l.target._id],\n })),\n }\n\n const layout = await elk.layout(elkGraph)\n adjustElkHierarchyCoordinates(layout)\n\n nodes.forEach((node, i) => {\n const found = datamodel.nodes.find(n => n._id === node.id)\n if (!found) return\n\n found.x = node.x\n found.y = node.y\n })\n\n // Handle non-connected nodes\n if (config.layoutNonConnectedAside) {\n const maxSize = getMaxNodeSize(datamodel.nonConnectedNodes, config.nodeSize)\n const maxY = max<number>(datamodel.connectedNodes.map(d => d.y)) || 0\n const maxX = max<number>(datamodel.connectedNodes.map(d => d.x)) || 0\n const minX = min<number>(datamodel.connectedNodes.map(d => d.x)) || 0\n const graphWidth = (maxX - minX) || width\n positionNonConnectedNodes(datamodel.nonConnectedNodes, maxY + maxSize * 3, maxSize * 2.25, Math.max(graphWidth, width))\n }\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -13,11 +13,15 @@ export interface TooltipConfigInterface {
|
|
|
13
13
|
allowHover?: boolean;
|
|
14
14
|
/** Horizontal placement of the tooltip. Default: `Position.Auto` */
|
|
15
15
|
horizontalPlacement?: Position | string | undefined;
|
|
16
|
-
/** Horizontal shift of the tooltip in pixels.
|
|
16
|
+
/** Horizontal shift of the tooltip in pixels. Works only with
|
|
17
|
+
* `horizontalPlacement` set to `Position.Left` or `Position.Right`.
|
|
18
|
+
* Default: `0` */
|
|
17
19
|
horizontalShift?: number;
|
|
18
20
|
/** Vertical placement of the tooltip. Default: `Position.Top` */
|
|
19
21
|
verticalPlacement?: Position | string | undefined;
|
|
20
|
-
/** Vertical shift of the tooltip in pixels.
|
|
22
|
+
/** Vertical shift of the tooltip in pixels. Works only with
|
|
23
|
+
* `verticalPlacement` set to `Position.Top` or `Position.Bottom`.
|
|
24
|
+
* Default: `0` */
|
|
21
25
|
verticalShift?: number;
|
|
22
26
|
/** Defines the content of the tooltip and hovering over which elements should trigger it.
|
|
23
27
|
* An object containing properties in the following format:
|
|
@@ -56,5 +60,7 @@ export interface TooltipConfigInterface {
|
|
|
56
60
|
attributes?: {
|
|
57
61
|
[attr: string]: string | number | boolean;
|
|
58
62
|
};
|
|
63
|
+
/** Custom class name for the tooltip. Default: `undefined` */
|
|
64
|
+
className?: string;
|
|
59
65
|
}
|
|
60
66
|
export declare const TooltipDefaultConfig: TooltipConfigInterface;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.js","sources":["../../../src/components/tooltip/config.ts"],"sourcesContent":["/* eslint-disable no-irregular-whitespace */\nimport { ComponentCore } from 'core/component'\n\n// Types\nimport { Position } from 'types/position'\n\nexport interface TooltipConfigInterface {\n /** An array of visualization components to interact with. Default: `[]` */\n components?: ComponentCore<unknown>[];\n /** Container to where the Tooltip component should be inserted. Default: `undefined` */\n container?: HTMLElement;\n /** Follow the mouse cursor. If `true`, the tooltip can't be hovered over\n * even when `allowHover` is set to `true`. Default: `true` */\n followCursor?: boolean;\n /** Allow the tooltip to be hovered over and interacted with when `followCursor` is set to `false`.\n * Default: `true` */\n allowHover?: boolean;\n /** Horizontal placement of the tooltip. Default: `Position.Auto` */\n horizontalPlacement?: Position | string | undefined;\n /** Horizontal shift of the tooltip in pixels. Default: `0` */\n horizontalShift?: number;\n /** Vertical placement of the tooltip. Default: `Position.Top` */\n verticalPlacement?: Position | string | undefined;\n /** Vertical shift of the tooltip in pixels. Default: `0` */\n verticalShift?: number;\n /** Defines the content of the tooltip and hovering over which elements should trigger it.\n * An object containing properties in the following format:\n *\n * ```\n * {\n * [selectorString]: (d: unknown) => string | HTMLElement\n * }\n * ```\n * e.g.:\n * ```\n * {\n * [Area.selectors.area]: (d: AreaDatum[]) => `<div>${d.value.toString()}</div>\n * }\n * ```\n */\n triggers?: {\n [selector: string]: ((data: any, i: number, elements: (HTMLElement | SVGElement)[]) => string | HTMLElement | undefined | null | void) | undefined | null;\n };\n /** Custom DOM attributes for the tooltip. Useful when you need to refer to a specific tooltip instance\n * by using a CSS selector. Attributes configuration object has the following structure:\n *\n * ```\n * {\n * [attributeName]: attribute value\n * }\n * ```\n * e.g.:\n * ```\n * {\n * 'type': 'area-tooltip',\n * 'value': 42\n * }\n * ```\n */\n attributes?: { [attr: string]: string | number | boolean };\n}\n\nexport const TooltipDefaultConfig: TooltipConfigInterface = {\n components: [],\n container: undefined,\n followCursor: true,\n allowHover: true,\n horizontalPlacement: Position.Auto,\n horizontalShift: 0,\n verticalPlacement: Position.Top,\n verticalShift: 0,\n attributes: {},\n triggers: {},\n}\n\n"],"names":[],"mappings":";;AAGA;
|
|
1
|
+
{"version":3,"file":"config.js","sources":["../../../src/components/tooltip/config.ts"],"sourcesContent":["/* eslint-disable no-irregular-whitespace */\nimport { ComponentCore } from 'core/component'\n\n// Types\nimport { Position } from 'types/position'\n\nexport interface TooltipConfigInterface {\n /** An array of visualization components to interact with. Default: `[]` */\n components?: ComponentCore<unknown>[];\n /** Container to where the Tooltip component should be inserted. Default: `undefined` */\n container?: HTMLElement;\n /** Follow the mouse cursor. If `true`, the tooltip can't be hovered over\n * even when `allowHover` is set to `true`. Default: `true` */\n followCursor?: boolean;\n /** Allow the tooltip to be hovered over and interacted with when `followCursor` is set to `false`.\n * Default: `true` */\n allowHover?: boolean;\n /** Horizontal placement of the tooltip. Default: `Position.Auto` */\n horizontalPlacement?: Position | string | undefined;\n /** Horizontal shift of the tooltip in pixels. Works only with\n * `horizontalPlacement` set to `Position.Left` or `Position.Right`.\n * Default: `0` */\n horizontalShift?: number;\n /** Vertical placement of the tooltip. Default: `Position.Top` */\n verticalPlacement?: Position | string | undefined;\n /** Vertical shift of the tooltip in pixels. Works only with\n * `verticalPlacement` set to `Position.Top` or `Position.Bottom`.\n * Default: `0` */\n verticalShift?: number;\n /** Defines the content of the tooltip and hovering over which elements should trigger it.\n * An object containing properties in the following format:\n *\n * ```\n * {\n * [selectorString]: (d: unknown) => string | HTMLElement\n * }\n * ```\n * e.g.:\n * ```\n * {\n * [Area.selectors.area]: (d: AreaDatum[]) => `<div>${d.value.toString()}</div>\n * }\n * ```\n */\n triggers?: {\n [selector: string]: ((data: any, i: number, elements: (HTMLElement | SVGElement)[]) => string | HTMLElement | undefined | null | void) | undefined | null;\n };\n /** Custom DOM attributes for the tooltip. Useful when you need to refer to a specific tooltip instance\n * by using a CSS selector. Attributes configuration object has the following structure:\n *\n * ```\n * {\n * [attributeName]: attribute value\n * }\n * ```\n * e.g.:\n * ```\n * {\n * 'type': 'area-tooltip',\n * 'value': 42\n * }\n * ```\n */\n attributes?: { [attr: string]: string | number | boolean };\n /** Custom class name for the tooltip. Default: `undefined` */\n className?: string;\n}\n\nexport const TooltipDefaultConfig: TooltipConfigInterface = {\n components: [],\n container: undefined,\n followCursor: true,\n allowHover: true,\n horizontalPlacement: Position.Auto,\n horizontalShift: 0,\n verticalPlacement: Position.Top,\n verticalShift: 0,\n attributes: {},\n triggers: {},\n className: undefined,\n}\n\n"],"names":[],"mappings":";;AAGA;AAiEa,MAAA,oBAAoB,GAA2B;AAC1D,IAAA,UAAU,EAAE,EAAE;AACd,IAAA,SAAS,EAAE,SAAS;AACpB,IAAA,YAAY,EAAE,IAAI;AAClB,IAAA,UAAU,EAAE,IAAI;IAChB,mBAAmB,EAAE,QAAQ,CAAC,IAAI;AAClC,IAAA,eAAe,EAAE,CAAC;IAClB,iBAAiB,EAAE,QAAQ,CAAC,GAAG;AAC/B,IAAA,aAAa,EAAE,CAAC;AAChB,IAAA,UAAU,EAAE,EAAE;AACd,IAAA,QAAQ,EAAE,EAAE;AACZ,IAAA,SAAS,EAAE,SAAS;;;;;"}
|
|
@@ -13,8 +13,7 @@ class Tooltip {
|
|
|
13
13
|
this._setContainerPositionThrottled = throttle(this._setContainerPosition, 500);
|
|
14
14
|
this._isShown = false;
|
|
15
15
|
this.element = document.createElement('div');
|
|
16
|
-
this.div = select(this.element)
|
|
17
|
-
.attr('class', root);
|
|
16
|
+
this.div = select(this.element).attr('class', root);
|
|
18
17
|
this.setConfig(config);
|
|
19
18
|
this.components = this.config.components;
|
|
20
19
|
// Set up MutationObserver to automatically re-position the tooltip
|
|
@@ -101,7 +100,9 @@ class Tooltip {
|
|
|
101
100
|
const verticalPlacement = config.verticalPlacement === Position.Auto
|
|
102
101
|
? ((pos.y - tooltipHeight) < 0 ? Position.Bottom : Position.Top)
|
|
103
102
|
: config.verticalPlacement;
|
|
104
|
-
//
|
|
103
|
+
// Todo: Get rid of the hardcoded margin in version 2.0
|
|
104
|
+
// Can be simply replaced with `verticalShift` and `horizontalShift`
|
|
105
|
+
// but it'll be a breaking change
|
|
105
106
|
const margin = 5;
|
|
106
107
|
const translateX = horizontalPlacement === Position.Left ? -tooltipWidth - margin - config.horizontalShift
|
|
107
108
|
: horizontalPlacement === Position.Center ? -tooltipWidth / 2
|
|
@@ -109,6 +110,7 @@ class Tooltip {
|
|
|
109
110
|
const translateY = verticalPlacement === Position.Bottom ? margin + config.verticalShift
|
|
110
111
|
: verticalPlacement === Position.Center ? -tooltipHeight / 2
|
|
111
112
|
: -margin - config.verticalShift - tooltipHeight;
|
|
113
|
+
// translateX and translateY variables shift the tooltip from the default position (above the cursor, centred horizontally)
|
|
112
114
|
const [top, left] = this._constraintPosToContainer(pos.x + translateX, pos.y + translateY, tooltipWidth, tooltipHeight);
|
|
113
115
|
this._applyPosition(top, left, tooltipHeight);
|
|
114
116
|
}
|
|
@@ -118,6 +120,9 @@ class Tooltip {
|
|
|
118
120
|
// i.e. to re-position the tooltip if the content has been changed
|
|
119
121
|
// by something else and it was captured by the MutationObserver
|
|
120
122
|
this._hoveredElement = hoveredElement;
|
|
123
|
+
// Todo: Get rid of the hardcoded margin in version 2.0
|
|
124
|
+
// Can be simply replaced with `verticalShift` and `horizontalShift`
|
|
125
|
+
// but it'll be a breaking change
|
|
121
126
|
const margin = 5;
|
|
122
127
|
const tooltipWidth = this.element.offsetWidth;
|
|
123
128
|
const tooltipHeight = this.element.offsetHeight;
|
|
@@ -139,10 +144,10 @@ class Tooltip {
|
|
|
139
144
|
let translateX = 0;
|
|
140
145
|
switch (horizontalPlacement) {
|
|
141
146
|
case Position.Left:
|
|
142
|
-
translateX = -tooltipWidth - margin;
|
|
147
|
+
translateX = -tooltipWidth - margin - config.horizontalShift;
|
|
143
148
|
break;
|
|
144
149
|
case Position.Right:
|
|
145
|
-
translateX = hoveredElementRect.width + margin;
|
|
150
|
+
translateX = hoveredElementRect.width + margin + config.horizontalShift;
|
|
146
151
|
break;
|
|
147
152
|
case Position.Center:
|
|
148
153
|
default:
|
|
@@ -159,11 +164,11 @@ class Tooltip {
|
|
|
159
164
|
translateY += (tooltipHeight + hoveredElementRect.height) / 2;
|
|
160
165
|
break;
|
|
161
166
|
case Position.Bottom:
|
|
162
|
-
translateY += tooltipHeight + hoveredElementRect.height + margin;
|
|
167
|
+
translateY += tooltipHeight + hoveredElementRect.height + margin + config.verticalShift;
|
|
163
168
|
break;
|
|
164
169
|
case Position.Top:
|
|
165
170
|
default:
|
|
166
|
-
translateY += -margin;
|
|
171
|
+
translateY += -margin - config.verticalShift;
|
|
167
172
|
break;
|
|
168
173
|
}
|
|
169
174
|
const [top, left] = this._constraintPosToContainer(elementPos[0] + translateX, elementPos[1] + translateY, tooltipWidth, tooltipHeight);
|
|
@@ -173,7 +178,8 @@ class Tooltip {
|
|
|
173
178
|
return this._container === document.body;
|
|
174
179
|
}
|
|
175
180
|
render(html) {
|
|
176
|
-
|
|
181
|
+
var _a;
|
|
182
|
+
const { config, prevConfig } = this;
|
|
177
183
|
if (html instanceof HTMLElement) {
|
|
178
184
|
const node = this.div.select(':first-child').node();
|
|
179
185
|
if (node !== html)
|
|
@@ -183,7 +189,12 @@ class Tooltip {
|
|
|
183
189
|
this.div.html(html);
|
|
184
190
|
}
|
|
185
191
|
this.div
|
|
192
|
+
.classed((_a = config.className) !== null && _a !== void 0 ? _a : '', Boolean(config.className))
|
|
186
193
|
.classed(nonInteractive, !config.allowHover || config.followCursor);
|
|
194
|
+
// Remove the previous class name if it was set
|
|
195
|
+
if ((prevConfig === null || prevConfig === void 0 ? void 0 : prevConfig.className) && prevConfig.className !== config.className) {
|
|
196
|
+
this.div.classed(prevConfig.className, false);
|
|
197
|
+
}
|
|
187
198
|
this.display();
|
|
188
199
|
}
|
|
189
200
|
_applyPosition(x, y, tooltipHeight) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../../../src/components/tooltip/index.ts"],"sourcesContent":["import { select, Selection, pointer } from 'd3-selection'\n\n// Core\nimport { ComponentCore } from 'core/component'\n\n// Types\nimport { Position } from 'types/position'\n\n// Utils\nimport { merge, throttle } from 'utils/data'\n\n// Config\nimport { TooltipDefaultConfig, TooltipConfigInterface } from './config'\n\n// Style\nimport * as s from './style'\n\nexport class Tooltip {\n element: HTMLElement\n div: Selection<HTMLElement, unknown, null, undefined>\n protected _defaultConfig = TooltipDefaultConfig as TooltipConfigInterface\n public config: TooltipConfigInterface = this._defaultConfig\n prevConfig: TooltipConfigInterface\n components: ComponentCore<unknown>[]\n static selectors = s\n private _setUpEventsThrottled = throttle(this._setUpEvents, 500)\n private _setContainerPositionThrottled = throttle(this._setContainerPosition, 500)\n private _isShown = false\n private _container: HTMLElement\n private _mutationObserver: MutationObserver\n private _hoveredElement: HTMLElement | SVGElement\n private _position: [number, number]\n\n constructor (config: TooltipConfigInterface = {}) {\n this.element = document.createElement('div')\n this.div = select(this.element)\n .attr('class', s.root)\n\n this.setConfig(config)\n this.components = this.config.components\n\n // Set up MutationObserver to automatically re-position the tooltip\n // if the content has been dynamically changed\n this._mutationObserver = new MutationObserver(() => {\n if (!this._isShown) return\n\n // Handle changes to the content of this.div\n // Add your logic here\n if (!this.config.followCursor && this._hoveredElement) {\n this.placeByElement(this._hoveredElement)\n } else if (this._position) {\n this.place({ x: this._position[0], y: this._position[1] })\n }\n })\n\n this._mutationObserver.observe(this.div.node(), { childList: true, subtree: true })\n }\n\n public setConfig (config: TooltipConfigInterface): void {\n this.prevConfig = this.config\n this.config = merge(this._defaultConfig, config)\n\n if (this.config.container && (this.config.container !== this.prevConfig?.container)) {\n this.setContainer(this.config.container)\n }\n\n this._setUpAttributes()\n }\n\n public setContainer (container: HTMLElement): void {\n this.element.parentNode?.removeChild(this.element)\n\n this._container = container\n this._container.appendChild(this.element)\n\n this._setContainerPositionThrottled()\n }\n\n public getContainer (): HTMLElement {\n return this._container\n }\n\n public hasContainer (): boolean {\n return !!this._container && this._container.isConnected\n }\n\n public setComponents (components: ComponentCore<unknown>[]): void {\n this.components = components\n }\n\n public update (): void {\n if (!this._container) return\n\n this._setUpEventsThrottled()\n }\n\n /** Show the tooltip by providing content and position */\n public show (html: string | HTMLElement | null | void, pos: { x: number; y: number }): void {\n this.render(html)\n this.place(pos)\n }\n\n /** Hide the tooltip */\n public hide (): void {\n this.div\n .classed(s.show, false) // The `show` class triggers the opacity transition\n .on('transitionend', () => {\n // We hide the element once the transition completes\n // This ensures container overflow will not occur when the window is resized\n this.div.classed(s.hidden, !this._isShown)\n })\n\n this._isShown = false\n }\n\n /** Simply displays the tooltip with its previous content on position */\n public display (): void {\n this.div\n .classed(s.hidden, false) // The `hidden` class sets `display: none;`\n .classed(s.show, true) // The `show` class triggers the opacity transition\n\n this._isShown = true\n }\n\n public place (pos: { x: number; y: number }): void {\n this._position = [pos.x, pos.y]\n\n if (!this.hasContainer()) {\n console.warn('Unovis | Tooltip: Container was not set or is not initialized yet')\n return\n }\n\n const { config } = this\n const tooltipWidth = this.element.offsetWidth\n const tooltipHeight = this.element.offsetHeight\n\n const horizontalPlacement = config.horizontalPlacement === Position.Auto\n ? Position.Center\n : config.horizontalPlacement\n\n const verticalPlacement = config.verticalPlacement === Position.Auto\n ? ((pos.y - tooltipHeight) < 0 ? Position.Bottom : Position.Top)\n : config.verticalPlacement\n\n // dx and dy variables shift the tooltip from the default position (above the cursor, centred horizontally)\n const margin = 5\n const translateX = horizontalPlacement === Position.Left ? -tooltipWidth - margin - config.horizontalShift\n : horizontalPlacement === Position.Center ? -tooltipWidth / 2\n : margin + config.horizontalShift\n\n const translateY = verticalPlacement === Position.Bottom ? margin + config.verticalShift\n : verticalPlacement === Position.Center ? -tooltipHeight / 2\n : -margin - config.verticalShift - tooltipHeight\n\n const [top, left] = this._constraintPosToContainer(pos.x + translateX, pos.y + translateY, tooltipWidth, tooltipHeight)\n this._applyPosition(top, left, tooltipHeight)\n }\n\n public placeByElement (hoveredElement: SVGElement | HTMLElement): void {\n const { config } = this\n\n // Store the hovered element and the event for future reference,\n // i.e. to re-position the tooltip if the content has been changed\n // by something else and it was captured by the MutationObserver\n this._hoveredElement = hoveredElement\n\n const margin = 5\n const tooltipWidth = this.element.offsetWidth\n const tooltipHeight = this.element.offsetHeight\n const isContainerBody = this.isContainerBody()\n const containerWidth = isContainerBody ? window.innerWidth : this._container.scrollWidth\n const hoveredElementRect = hoveredElement.getBoundingClientRect()\n\n // We use D3's point transformation to get the correct position of the element by pretending it's a pointer event\n // See more: https://github.com/d3/d3-selection/blob/main/src/pointer.js\n const elementPos = isContainerBody ? [hoveredElementRect.x, hoveredElementRect.y] : pointer({\n clientX: hoveredElementRect.x,\n clientY: hoveredElementRect.y,\n pageX: hoveredElementRect.x,\n pageY: hoveredElementRect.y,\n }, this._container)\n\n const horizontalPlacement = config.horizontalPlacement === Position.Auto\n ? (elementPos[0] - tooltipWidth < 0 ? Position.Right\n : elementPos[0] + tooltipWidth > containerWidth ? Position.Left : Position.Center)\n : config.horizontalPlacement\n\n let translateX = 0\n switch (horizontalPlacement) {\n case Position.Left:\n translateX = -tooltipWidth - margin\n break\n case Position.Right:\n translateX = hoveredElementRect.width + margin\n break\n case Position.Center:\n default:\n translateX = (-tooltipWidth + hoveredElementRect.width) / 2\n break\n }\n\n const verticalPlacement = config.verticalPlacement === Position.Auto\n ? (horizontalPlacement !== Position.Center ? Position.Center\n : elementPos[1] - tooltipHeight < 0 ? Position.Bottom : Position.Top)\n : config.verticalPlacement\n\n let translateY = -tooltipHeight\n switch (verticalPlacement) {\n case Position.Center:\n translateY += (tooltipHeight + hoveredElementRect.height) / 2\n break\n case Position.Bottom:\n translateY += tooltipHeight + hoveredElementRect.height + margin\n break\n case Position.Top:\n default:\n translateY += -margin\n break\n }\n\n const [top, left] = this._constraintPosToContainer(elementPos[0] + translateX, elementPos[1] + translateY, tooltipWidth, tooltipHeight)\n this._applyPosition(top, left, tooltipHeight)\n }\n\n public isContainerBody (): boolean {\n return this._container === document.body\n }\n\n public render (html: string | HTMLElement | null | void): void {\n const { config } = this\n if (html instanceof HTMLElement) {\n const node = this.div.select(':first-child').node()\n if (node !== html) this.div.html('').append(() => html)\n } else if (html) {\n this.div.html(html)\n }\n\n this.div\n .classed(s.nonInteractive, !config.allowHover || config.followCursor)\n\n this.display()\n }\n\n private _applyPosition (x: number, y: number, tooltipHeight: number): void {\n const isContainerBody = this.isContainerBody()\n const containerHeight = isContainerBody ? window.innerHeight : this._container.scrollHeight\n\n this.div\n .classed(s.positionFixed, isContainerBody)\n .style('top', isContainerBody ? `${y}px` : 'unset')\n .style('bottom', !isContainerBody ? `${containerHeight - y - tooltipHeight}px` : 'unset')\n .style('left', `${x}px`)\n }\n\n private _constraintPosToContainer (top: number, left: number, tooltipWidth: number, tooltipHeight: number): [number, number] {\n const isContainerBody = this.isContainerBody()\n const containerHeight = isContainerBody ? window.innerHeight : this._container.scrollHeight\n const containerWidth = isContainerBody ? window.innerWidth : this._container.scrollWidth\n\n // // Constraint to container\n const paddingX = 10\n const hitRight = top > (containerWidth - tooltipWidth - paddingX)\n const hitLeft = top < paddingX\n const constrainedLeft = hitRight ? containerWidth - tooltipWidth - paddingX\n : hitLeft ? paddingX : top\n\n const paddingY = 10\n const hitBottom = left > (containerHeight - tooltipHeight - paddingY)\n const hitTop = left < paddingY\n const constrainedTop = hitBottom ? containerHeight - tooltipHeight - paddingY\n : hitTop ? paddingY : left\n\n return [\n containerWidth < tooltipWidth ? 0 : constrainedLeft,\n containerHeight < tooltipHeight ? 0 : constrainedTop,\n ]\n }\n\n private _setContainerPosition (): void {\n // Tooltip position calculation relies on the parent position\n // If it's not set (static), we set it to `relative` (not a good practice)\n if (this._container !== document.body && getComputedStyle(this._container)?.position === 'static') {\n this._container.style.position = 'relative'\n }\n }\n\n private _setUpEvents (): void {\n const { config } = this\n\n // We use the Event Delegation pattern to set up Tooltip events\n // Every component will have single `mousemove` and `mouseleave` event listener functions, where we'll check\n // the `path` of the event and trigger corresponding callbacks\n this.components.forEach(component => {\n const selection = select(component.element)\n selection\n .on('mousemove.tooltip', (e: MouseEvent) => {\n const path: (HTMLElement | SVGGElement)[] = (e.composedPath && e.composedPath()) || (e as any).path || [e.target]\n\n // Go through all of the configured triggers\n for (const className of Object.keys(config.triggers)) {\n const template = config.triggers[className]\n if (!template) continue // Skip if the trigger is not configured\n\n const els = selection.selectAll<HTMLElement | SVGGElement, unknown>(`.${className}`).nodes()\n\n // Go through all of the elements in the event path (from the deepest element upwards)\n for (const el of path) {\n if (el === selection.node()) break // Break on the component's level (usually the `<g>` element)\n if (el.classList.contains(className)) { // If there's a match, show the tooltip\n const i = els.indexOf(el)\n const d = select(el).datum()\n const content = template(d, i, els)\n const [x, y] = this.isContainerBody() ? [e.clientX, e.clientY] : pointer(e, this._container)\n if (content === null) {\n // If the content is `null`, we hide the tooltip\n this.hide()\n } else {\n // Otherwise we show the tooltip, but don't render the content if it's `undefined` or\n // an empty string. This way we can allow it to work with things like `createPortal` in React\n this.render(content)\n if (config.followCursor) this.place({ x, y })\n else this.placeByElement(el)\n }\n\n // Stop propagation to prevent other interfering events from being triggered, e.g. Crosshair\n e.stopPropagation()\n\n // Stop looking for other matches\n return\n }\n }\n }\n\n // Hide the tooltip if the event didn't pass through any of the configured triggers.\n // We use the `this._isShown` condition as a little performance optimization tweak\n // (we don't want the tooltip to update its class on every mouse movement, see `this.hide()`).\n if (this._isShown) this.hide()\n })\n .on('mouseleave.tooltip', (e: MouseEvent) => {\n e.stopPropagation() // Stop propagation to prevent other interfering events from being triggered, e.g. Crosshair\n this.hide()\n })\n })\n\n // Set up Tooltip hover\n if (config.allowHover && !config.followCursor) {\n this.div\n .on('mouseenter.tooltip', this.display.bind(this))\n .on('mouseleave.tooltip', this.hide.bind(this))\n } else {\n this.div\n .on('mouseenter.tooltip', null)\n .on('mouseleave.tooltip', null)\n }\n }\n\n private _setUpAttributes (): void {\n const attributesMap = this.config.attributes\n if (!attributesMap) return\n\n Object.keys(attributesMap).forEach(attr => {\n this.div.attr(attr, attributesMap[attr])\n })\n }\n\n public destroy (): void {\n this._mutationObserver.disconnect()\n this.div?.remove()\n }\n}\n"],"names":["s.root","s.show","s.hidden","s.nonInteractive","s.positionFixed","s"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../../../src/components/tooltip/index.ts"],"sourcesContent":["import { select, Selection, pointer } from 'd3-selection'\n\n// Core\nimport { ComponentCore } from 'core/component'\n\n// Types\nimport { Position } from 'types/position'\n\n// Utils\nimport { merge, throttle } from 'utils/data'\n\n// Config\nimport { TooltipDefaultConfig, TooltipConfigInterface } from './config'\n\n// Style\nimport * as s from './style'\n\nexport class Tooltip {\n element: HTMLElement\n div: Selection<HTMLElement, unknown, null, undefined>\n protected _defaultConfig = TooltipDefaultConfig as TooltipConfigInterface\n public config: TooltipConfigInterface = this._defaultConfig\n prevConfig: TooltipConfigInterface\n components: ComponentCore<unknown>[]\n static selectors = s\n private _setUpEventsThrottled = throttle(this._setUpEvents, 500)\n private _setContainerPositionThrottled = throttle(this._setContainerPosition, 500)\n private _isShown = false\n private _container: HTMLElement\n private _mutationObserver: MutationObserver\n private _hoveredElement: HTMLElement | SVGElement\n private _position: [number, number]\n\n constructor (config: TooltipConfigInterface = {}) {\n this.element = document.createElement('div')\n this.div = select(this.element).attr('class', s.root)\n\n this.setConfig(config)\n this.components = this.config.components\n\n // Set up MutationObserver to automatically re-position the tooltip\n // if the content has been dynamically changed\n this._mutationObserver = new MutationObserver(() => {\n if (!this._isShown) return\n\n // Handle changes to the content of this.div\n // Add your logic here\n if (!this.config.followCursor && this._hoveredElement) {\n this.placeByElement(this._hoveredElement)\n } else if (this._position) {\n this.place({ x: this._position[0], y: this._position[1] })\n }\n })\n\n this._mutationObserver.observe(this.div.node(), { childList: true, subtree: true })\n }\n\n public setConfig (config: TooltipConfigInterface): void {\n this.prevConfig = this.config\n this.config = merge(this._defaultConfig, config)\n\n if (this.config.container && (this.config.container !== this.prevConfig?.container)) {\n this.setContainer(this.config.container)\n }\n\n this._setUpAttributes()\n }\n\n public setContainer (container: HTMLElement): void {\n this.element.parentNode?.removeChild(this.element)\n\n this._container = container\n this._container.appendChild(this.element)\n\n this._setContainerPositionThrottled()\n }\n\n public getContainer (): HTMLElement {\n return this._container\n }\n\n public hasContainer (): boolean {\n return !!this._container && this._container.isConnected\n }\n\n public setComponents (components: ComponentCore<unknown>[]): void {\n this.components = components\n }\n\n public update (): void {\n if (!this._container) return\n\n this._setUpEventsThrottled()\n }\n\n /** Show the tooltip by providing content and position */\n public show (html: string | HTMLElement | null | void, pos: { x: number; y: number }): void {\n this.render(html)\n this.place(pos)\n }\n\n /** Hide the tooltip */\n public hide (): void {\n this.div\n .classed(s.show, false) // The `show` class triggers the opacity transition\n .on('transitionend', () => {\n // We hide the element once the transition completes\n // This ensures container overflow will not occur when the window is resized\n this.div.classed(s.hidden, !this._isShown)\n })\n\n this._isShown = false\n }\n\n /** Simply displays the tooltip with its previous content on position */\n public display (): void {\n this.div\n .classed(s.hidden, false) // The `hidden` class sets `display: none;`\n .classed(s.show, true) // The `show` class triggers the opacity transition\n\n this._isShown = true\n }\n\n public place (pos: { x: number; y: number }): void {\n this._position = [pos.x, pos.y]\n\n if (!this.hasContainer()) {\n console.warn('Unovis | Tooltip: Container was not set or is not initialized yet')\n return\n }\n\n const { config } = this\n const tooltipWidth = this.element.offsetWidth\n const tooltipHeight = this.element.offsetHeight\n\n const horizontalPlacement = config.horizontalPlacement === Position.Auto\n ? Position.Center\n : config.horizontalPlacement\n\n const verticalPlacement = config.verticalPlacement === Position.Auto\n ? ((pos.y - tooltipHeight) < 0 ? Position.Bottom : Position.Top)\n : config.verticalPlacement\n\n // Todo: Get rid of the hardcoded margin in version 2.0\n // Can be simply replaced with `verticalShift` and `horizontalShift`\n // but it'll be a breaking change\n const margin = 5\n const translateX = horizontalPlacement === Position.Left ? -tooltipWidth - margin - config.horizontalShift\n : horizontalPlacement === Position.Center ? -tooltipWidth / 2\n : margin + config.horizontalShift\n\n const translateY = verticalPlacement === Position.Bottom ? margin + config.verticalShift\n : verticalPlacement === Position.Center ? -tooltipHeight / 2\n : -margin - config.verticalShift - tooltipHeight\n\n // translateX and translateY variables shift the tooltip from the default position (above the cursor, centred horizontally)\n const [top, left] = this._constraintPosToContainer(pos.x + translateX, pos.y + translateY, tooltipWidth, tooltipHeight)\n this._applyPosition(top, left, tooltipHeight)\n }\n\n public placeByElement (hoveredElement: SVGElement | HTMLElement): void {\n const { config } = this\n\n // Store the hovered element and the event for future reference,\n // i.e. to re-position the tooltip if the content has been changed\n // by something else and it was captured by the MutationObserver\n this._hoveredElement = hoveredElement\n\n // Todo: Get rid of the hardcoded margin in version 2.0\n // Can be simply replaced with `verticalShift` and `horizontalShift`\n // but it'll be a breaking change\n const margin = 5\n const tooltipWidth = this.element.offsetWidth\n const tooltipHeight = this.element.offsetHeight\n const isContainerBody = this.isContainerBody()\n const containerWidth = isContainerBody ? window.innerWidth : this._container.scrollWidth\n const hoveredElementRect = hoveredElement.getBoundingClientRect()\n\n // We use D3's point transformation to get the correct position of the element by pretending it's a pointer event\n // See more: https://github.com/d3/d3-selection/blob/main/src/pointer.js\n const elementPos = isContainerBody ? [hoveredElementRect.x, hoveredElementRect.y] : pointer({\n clientX: hoveredElementRect.x,\n clientY: hoveredElementRect.y,\n pageX: hoveredElementRect.x,\n pageY: hoveredElementRect.y,\n }, this._container)\n\n const horizontalPlacement = config.horizontalPlacement === Position.Auto\n ? (elementPos[0] - tooltipWidth < 0 ? Position.Right\n : elementPos[0] + tooltipWidth > containerWidth ? Position.Left : Position.Center)\n : config.horizontalPlacement\n\n let translateX = 0\n switch (horizontalPlacement) {\n case Position.Left:\n translateX = -tooltipWidth - margin - config.horizontalShift\n break\n case Position.Right:\n translateX = hoveredElementRect.width + margin + config.horizontalShift\n break\n case Position.Center:\n default:\n translateX = (-tooltipWidth + hoveredElementRect.width) / 2\n break\n }\n\n const verticalPlacement = config.verticalPlacement === Position.Auto\n ? (horizontalPlacement !== Position.Center ? Position.Center\n : elementPos[1] - tooltipHeight < 0 ? Position.Bottom : Position.Top)\n : config.verticalPlacement\n\n let translateY = -tooltipHeight\n switch (verticalPlacement) {\n case Position.Center:\n translateY += (tooltipHeight + hoveredElementRect.height) / 2\n break\n case Position.Bottom:\n translateY += tooltipHeight + hoveredElementRect.height + margin + config.verticalShift\n break\n case Position.Top:\n default:\n translateY += -margin - config.verticalShift\n break\n }\n\n const [top, left] = this._constraintPosToContainer(elementPos[0] + translateX, elementPos[1] + translateY, tooltipWidth, tooltipHeight)\n this._applyPosition(top, left, tooltipHeight)\n }\n\n public isContainerBody (): boolean {\n return this._container === document.body\n }\n\n public render (html: string | HTMLElement | null | void): void {\n const { config, prevConfig } = this\n if (html instanceof HTMLElement) {\n const node = this.div.select(':first-child').node()\n if (node !== html) this.div.html('').append(() => html)\n } else if (html) {\n this.div.html(html)\n }\n\n this.div\n .classed(config.className ?? '', Boolean(config.className))\n .classed(s.nonInteractive, !config.allowHover || config.followCursor)\n\n // Remove the previous class name if it was set\n if (prevConfig?.className && prevConfig.className !== config.className) {\n this.div.classed(prevConfig.className, false)\n }\n\n this.display()\n }\n\n private _applyPosition (x: number, y: number, tooltipHeight: number): void {\n const isContainerBody = this.isContainerBody()\n const containerHeight = isContainerBody ? window.innerHeight : this._container.scrollHeight\n\n this.div\n .classed(s.positionFixed, isContainerBody)\n .style('top', isContainerBody ? `${y}px` : 'unset')\n .style('bottom', !isContainerBody ? `${containerHeight - y - tooltipHeight}px` : 'unset')\n .style('left', `${x}px`)\n }\n\n private _constraintPosToContainer (top: number, left: number, tooltipWidth: number, tooltipHeight: number): [number, number] {\n const isContainerBody = this.isContainerBody()\n const containerHeight = isContainerBody ? window.innerHeight : this._container.scrollHeight\n const containerWidth = isContainerBody ? window.innerWidth : this._container.scrollWidth\n\n // // Constraint to container\n const paddingX = 10\n const hitRight = top > (containerWidth - tooltipWidth - paddingX)\n const hitLeft = top < paddingX\n const constrainedLeft = hitRight ? containerWidth - tooltipWidth - paddingX\n : hitLeft ? paddingX : top\n\n const paddingY = 10\n const hitBottom = left > (containerHeight - tooltipHeight - paddingY)\n const hitTop = left < paddingY\n const constrainedTop = hitBottom ? containerHeight - tooltipHeight - paddingY\n : hitTop ? paddingY : left\n\n return [\n containerWidth < tooltipWidth ? 0 : constrainedLeft,\n containerHeight < tooltipHeight ? 0 : constrainedTop,\n ]\n }\n\n private _setContainerPosition (): void {\n // Tooltip position calculation relies on the parent position\n // If it's not set (static), we set it to `relative` (not a good practice)\n if (this._container !== document.body && getComputedStyle(this._container)?.position === 'static') {\n this._container.style.position = 'relative'\n }\n }\n\n private _setUpEvents (): void {\n const { config } = this\n\n // We use the Event Delegation pattern to set up Tooltip events\n // Every component will have single `mousemove` and `mouseleave` event listener functions, where we'll check\n // the `path` of the event and trigger corresponding callbacks\n this.components.forEach(component => {\n const selection = select(component.element)\n selection\n .on('mousemove.tooltip', (e: MouseEvent) => {\n const path: (HTMLElement | SVGGElement)[] = (e.composedPath && e.composedPath()) || (e as any).path || [e.target]\n\n // Go through all of the configured triggers\n for (const className of Object.keys(config.triggers)) {\n const template = config.triggers[className]\n if (!template) continue // Skip if the trigger is not configured\n\n const els = selection.selectAll<HTMLElement | SVGGElement, unknown>(`.${className}`).nodes()\n\n // Go through all of the elements in the event path (from the deepest element upwards)\n for (const el of path) {\n if (el === selection.node()) break // Break on the component's level (usually the `<g>` element)\n if (el.classList.contains(className)) { // If there's a match, show the tooltip\n const i = els.indexOf(el)\n const d = select(el).datum()\n const content = template(d, i, els)\n const [x, y] = this.isContainerBody() ? [e.clientX, e.clientY] : pointer(e, this._container)\n if (content === null) {\n // If the content is `null`, we hide the tooltip\n this.hide()\n } else {\n // Otherwise we show the tooltip, but don't render the content if it's `undefined` or\n // an empty string. This way we can allow it to work with things like `createPortal` in React\n this.render(content)\n if (config.followCursor) this.place({ x, y })\n else this.placeByElement(el)\n }\n\n // Stop propagation to prevent other interfering events from being triggered, e.g. Crosshair\n e.stopPropagation()\n\n // Stop looking for other matches\n return\n }\n }\n }\n\n // Hide the tooltip if the event didn't pass through any of the configured triggers.\n // We use the `this._isShown` condition as a little performance optimization tweak\n // (we don't want the tooltip to update its class on every mouse movement, see `this.hide()`).\n if (this._isShown) this.hide()\n })\n .on('mouseleave.tooltip', (e: MouseEvent) => {\n e.stopPropagation() // Stop propagation to prevent other interfering events from being triggered, e.g. Crosshair\n this.hide()\n })\n })\n\n // Set up Tooltip hover\n if (config.allowHover && !config.followCursor) {\n this.div\n .on('mouseenter.tooltip', this.display.bind(this))\n .on('mouseleave.tooltip', this.hide.bind(this))\n } else {\n this.div\n .on('mouseenter.tooltip', null)\n .on('mouseleave.tooltip', null)\n }\n }\n\n private _setUpAttributes (): void {\n const attributesMap = this.config.attributes\n if (!attributesMap) return\n\n Object.keys(attributesMap).forEach(attr => {\n this.div.attr(attr, attributesMap[attr])\n })\n }\n\n public destroy (): void {\n this._mutationObserver.disconnect()\n this.div?.remove()\n }\n}\n"],"names":["s.root","s.show","s.hidden","s.nonInteractive","s.positionFixed","s"],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@unovis/ts",
|
|
3
3
|
"description": "Modular data visualization framework for React, Angular, Svelte, and vanilla TypeScript or JavaScript",
|
|
4
|
-
"version": "1.5.0-alpha.
|
|
4
|
+
"version": "1.5.0-alpha.6",
|
|
5
5
|
"repository": {
|
|
6
6
|
"type": "git",
|
|
7
7
|
"url": "https://github.com/f5/unovis.git",
|