@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.
@@ -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 !== config.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. Default: `0` */
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. Default: `0` */
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;
@@ -12,6 +12,7 @@ const TooltipDefaultConfig = {
12
12
  verticalShift: 0,
13
13
  attributes: {},
14
14
  triggers: {},
15
+ className: undefined,
15
16
  };
16
17
 
17
18
  export { TooltipDefaultConfig };
@@ -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;AA2Da,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;;;;;"}
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
- // dx and dy variables shift the tooltip from the default position (above the cursor, centred horizontally)
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
- const { config } = this;
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.5",
4
+ "version": "1.5.0-alpha.6",
5
5
  "repository": {
6
6
  "type": "git",
7
7
  "url": "https://github.com/f5/unovis.git",