Icard/angular-clarity-master(work.../node_modules/highcharts/modules/arc-diagram.src.js

632 lines
27 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/**
* @license Highcharts JS v11.4.1 (2024-04-04)
*
* Arc diagram module
*
* (c) 2021 Piotr Madej
*
* License: www.highcharts.com/license
*/
(function (factory) {
if (typeof module === 'object' && module.exports) {
factory['default'] = factory;
module.exports = factory;
} else if (typeof define === 'function' && define.amd) {
define('highcharts/modules/arc-diagram', ['highcharts', 'highcharts/modules/sankey'], function (Highcharts) {
factory(Highcharts);
factory.Highcharts = Highcharts;
return factory;
});
} else {
factory(typeof Highcharts !== 'undefined' ? Highcharts : undefined);
}
}(function (Highcharts) {
'use strict';
var _modules = Highcharts ? Highcharts._modules : {};
function _registerModule(obj, path, args, fn) {
if (!obj.hasOwnProperty(path)) {
obj[path] = fn.apply(null, args);
if (typeof CustomEvent === 'function') {
window.dispatchEvent(new CustomEvent(
'HighchartsModuleLoaded',
{ detail: { path: path, module: obj[path] } }
));
}
}
}
_registerModule(_modules, 'Series/ArcDiagram/ArcDiagramPoint.js', [_modules['Series/NodesComposition.js'], _modules['Core/Series/SeriesRegistry.js'], _modules['Core/Utilities.js']], function (NodesComposition, SeriesRegistry, U) {
/* *
*
* Arc diagram module
*
* (c) 2018-2024 Torstein Honsi
*
* License: www.highcharts.com/license
*
* !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!
*
* */
const { seriesTypes: { sankey: { prototype: { pointClass: SankeyPoint } } } } = SeriesRegistry;
const { extend } = U;
/* *
*
* Class
*
* */
class ArcDiagramPoint extends SankeyPoint {
/* *
*
* Functions
*
* */
/* eslint-disable valid-jsdoc */
isValid() {
// No null points here
return true;
}
}
extend(ArcDiagramPoint.prototype, {
setState: NodesComposition.setNodeState
});
/* *
*
* Default Export
*
* */
return ArcDiagramPoint;
});
_registerModule(_modules, 'Series/ArcDiagram/ArcDiagramSeries.js', [_modules['Series/ArcDiagram/ArcDiagramPoint.js'], _modules['Series/Sankey/SankeyColumnComposition.js'], _modules['Core/Series/Series.js'], _modules['Core/Series/SeriesRegistry.js'], _modules['Core/Renderer/SVG/SVGRenderer.js'], _modules['Core/Utilities.js']], function (ArcDiagramPoint, SankeyColumnComposition, Series, SeriesRegistry, SVGRenderer, U) {
/* *
*
* Arc diagram module
*
* (c) 2021 Piotr Madej, Grzegorz Blachliński
*
* License: www.highcharts.com/license
*
* !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!
*
* */
const { prototype: { symbols } } = SVGRenderer;
const { seriesTypes: { column: ColumnSeries, sankey: SankeySeries } } = SeriesRegistry;
const { extend, merge, pick, relativeLength } = U;
/* *
*
* Class
*
* */
/**
* @private
* @class
* @name Highcharts.seriesTypes.arcdiagram
*
* @augments Highcharts.seriesTypes.sankey
*/
class ArcDiagramSeries extends SankeySeries {
/* *
*
* Functions
*
* */
/**
* Create node columns by analyzing the nodes and the relations between
* incoming and outgoing links.
* @private
*/
createNodeColumns() {
const series = this, chart = series.chart,
// Column needs casting, to much methods required at the same time
column = SankeyColumnComposition.compose([], series);
column.sankeyColumn.maxLength = chart.inverted ?
chart.plotHeight : chart.plotWidth;
// Get the translation factor needed for each column to fill up the plot
// height
column.sankeyColumn.getTranslationFactor = (series) => {
const nodes = column.slice(), minLinkWidth = this.options.minLinkWidth || 0;
let skipPoint, factor = 0, i, radius, maxRadius = 0, scale = 1, additionalSpace = 0, remainingWidth = (chart.plotSizeX || 0) -
(series.options.marker &&
series.options.marker.lineWidth || 0) -
(column.length - 1) *
series.nodePadding;
// Because the minLinkWidth option doesn't obey the direct
// translation, we need to run translation iteratively, check node
// heights, remove those nodes affected by minLinkWidth, check
// again, etc.
while (column.length) {
factor = remainingWidth / column.sankeyColumn.sum();
skipPoint = false;
i = column.length;
while (i--) {
radius = (column[i].getSum()) * factor * scale;
const plotArea = Math.min(chart.plotHeight, chart.plotWidth);
if (radius > plotArea) {
scale = Math.min(plotArea / radius, scale);
}
else if (radius < minLinkWidth) {
column.splice(i, 1);
remainingWidth -= minLinkWidth;
radius = minLinkWidth;
skipPoint = true;
}
additionalSpace += radius * (1 - scale) / 2;
maxRadius = Math.max(maxRadius, radius);
}
if (!skipPoint) {
break;
}
}
// Re-insert original nodes
column.length = 0;
nodes.forEach((node) => {
node.scale = scale;
column.push(node);
});
column.sankeyColumn.maxRadius = maxRadius;
column.sankeyColumn.scale = scale;
column.sankeyColumn.additionalSpace = additionalSpace;
return factor;
};
column.sankeyColumn.offset = function (node, factor) {
const equalNodes = node.series.options.equalNodes, nodePadding = series.nodePadding, maxRadius = Math.min(chart.plotWidth, chart.plotHeight, (column.sankeyColumn.maxLength || 0) /
series.nodes.length - nodePadding);
let offset = column.sankeyColumn.additionalSpace || 0, totalNodeOffset;
for (let i = 0; i < column.length; i++) {
const sum = column[i].getSum() *
(column.sankeyColumn.scale || 0);
const width = equalNodes ?
maxRadius :
Math.max(sum * factor, series.options.minLinkWidth || 0);
if (sum) {
totalNodeOffset = width + nodePadding;
}
else {
// If node sum equals 0 nodePadding is missed #12453
totalNodeOffset = 0;
}
if (column[i] === node) {
return {
relativeLeft: offset + relativeLength(node.options.offset || 0, totalNodeOffset)
};
}
offset += totalNodeOffset;
}
};
// Add nodes directly to the column right after it's creation
series.nodes.forEach(function (node) {
node.column = 0;
column.push(node);
});
return [column];
}
/**
* Run translation operations for one link.
* @private
*/
translateLink(point) {
const series = this, fromNode = point.fromNode, toNode = point.toNode, chart = this.chart, translationFactor = series.translationFactor, pointOptions = point.options, seriesOptions = series.options, linkWeight = pick(pointOptions.linkWeight, seriesOptions.linkWeight, Math.max((point.weight || 0) *
translationFactor *
fromNode.scale, (series.options.minLinkWidth || 0))), centeredLinks = point.series.options.centeredLinks, nodeTop = fromNode.nodeY;
const getX = (node, fromOrTo) => {
const linkLeft = ((node.offset(point, fromOrTo) || 0) *
translationFactor);
const x = Math.min(node.nodeX + linkLeft,
// Prevent links from spilling below the node (#12014)
node.nodeX + (node.shapeArgs && node.shapeArgs.height || 0) - linkWeight);
return x;
};
let fromX = centeredLinks ?
fromNode.nodeX +
((fromNode.shapeArgs.height || 0) - linkWeight) / 2 :
getX(fromNode, 'linksFrom'), toX = centeredLinks ? toNode.nodeX +
((toNode.shapeArgs.height || 0) - linkWeight) / 2 :
getX(toNode, 'linksTo'), bottom = nodeTop;
if (fromX > toX) {
[fromX, toX] = [toX, fromX];
}
if (seriesOptions.reversed) {
[fromX, toX] = [toX, fromX];
bottom = (chart.plotSizeY || 0) - bottom;
}
point.shapeType = 'path';
point.linkBase = [
fromX,
fromX + linkWeight,
toX,
toX + linkWeight
];
const linkRadius = ((toX + linkWeight - fromX) / Math.abs(toX + linkWeight - fromX)) * pick(seriesOptions.linkRadius, Math.min(Math.abs(toX + linkWeight - fromX) / 2, fromNode.nodeY - Math.abs(linkWeight)));
point.shapeArgs = {
d: [
['M', fromX, bottom],
[
'A',
(toX + linkWeight - fromX) / 2,
linkRadius,
0,
0,
1,
toX + linkWeight,
bottom
],
['L', toX, bottom],
[
'A',
(toX - fromX - linkWeight) / 2,
linkRadius - linkWeight,
0,
0,
0,
fromX + linkWeight,
bottom
],
['Z']
]
};
point.dlBox = {
x: fromX + (toX - fromX) / 2,
y: bottom - linkRadius,
height: linkWeight,
width: 0
};
// And set the tooltip anchor in the middle
point.tooltipPos = chart.inverted ? [
(chart.plotSizeY || 0) - point.dlBox.y - linkWeight / 2,
(chart.plotSizeX || 0) - point.dlBox.x
] : [
point.dlBox.x,
point.dlBox.y + linkWeight / 2
];
// Pass test in drawPoints
point.y = point.plotY = 1;
point.x = point.plotX = 1;
if (!point.color) {
point.color = fromNode.color;
}
}
/**
* Run translation operations for one node.
* @private
*/
translateNode(node, column) {
const series = this, translationFactor = series.translationFactor, chart = series.chart, maxNodesLength = chart.inverted ?
chart.plotWidth : chart.plotHeight, options = series.options, maxRadius = Math.min(chart.plotWidth, chart.plotHeight, maxNodesLength / node.series.nodes.length - this.nodePadding), sum = node.getSum() * (column.sankeyColumn.scale || 0), equalNodes = options.equalNodes, nodeHeight = equalNodes ?
maxRadius :
Math.max(sum * translationFactor, this.options.minLinkWidth || 0), crisp = Math.round(options.marker &&
options.marker.lineWidth || 0) % 2 / 2, nodeOffset = column.sankeyColumn.offset(node, translationFactor), fromNodeLeft = Math.floor(pick(nodeOffset && nodeOffset.absoluteLeft, ((column.sankeyColumn.left(translationFactor) || 0) +
(nodeOffset && nodeOffset.relativeLeft || 0)))) + crisp, markerOptions = merge(options.marker, node.options.marker), symbol = markerOptions.symbol, markerRadius = markerOptions.radius, top = parseInt(options.offset, 10) *
((chart.inverted ?
chart.plotWidth : chart.plotHeight) - (Math.floor(this.colDistance * (node.column || 0) +
(markerOptions.lineWidth || 0) / 2) + crisp +
(column.sankeyColumn.scale || 0) *
(column.sankeyColumn.maxRadius || 0) / 2)) / 100;
node.sum = sum;
// If node sum is 0, dont render the rect #12453
if (sum) {
// Draw the node
node.nodeX = fromNodeLeft;
node.nodeY = top;
const x = fromNodeLeft, width = node.options.width || options.width || nodeHeight, height = node.options.height || options.height || nodeHeight;
let y = top;
if (options.reversed) {
y = (chart.plotSizeY || 0) - top;
if (chart.inverted) {
y = (chart.plotSizeY || 0) - top;
}
}
if (this.mapOptionsToLevel) {
// Calculate data label options for the point
node.dlOptions = SankeySeries.getDLOptions({
level: this.mapOptionsToLevel[node.level],
optionsPoint: node.options
});
}
// Pass test in drawPoints
node.plotX = 1;
node.plotY = 1;
// Set the anchor position for tooltips
node.tooltipPos = chart.inverted ? [
(chart.plotSizeY || 0) - y - height / 2,
(chart.plotSizeX || 0) - x - width / 2
] : [
x + width / 2,
y + height / 2
];
node.shapeType = 'path';
node.shapeArgs = {
d: symbols[symbol || 'circle'](x, y - (markerRadius || height) / 2, markerRadius || width, markerRadius || height),
width: markerRadius || width,
height: markerRadius || height
};
node.dlBox = {
x: x + width / 2,
y: y,
height: 0,
width: 0
};
}
else {
node.dlOptions = {
enabled: false
};
}
}
// Networkgraph has two separate collecions of nodes and lines, render
// dataLabels for both sets:
drawDataLabels() {
if (this.options.dataLabels) {
const textPath = this.options.dataLabels.textPath;
// Render node labels:
ColumnSeries.prototype.drawDataLabels.call(this, this.nodes);
// Render link labels:
this.options.dataLabels.textPath =
this.options.dataLabels.linkTextPath;
ColumnSeries.prototype.drawDataLabels.call(this, this.data);
// Restore nodes
this.options.dataLabels.textPath = textPath;
}
}
pointAttribs(point,
// eslint-disable-next-line @typescript-eslint/no-unused-vars
state) {
if (point && point.isNode) {
const { ...attrs } = Series.prototype.pointAttribs
.apply(this, arguments);
return attrs;
}
return super.pointAttribs.apply(this, arguments);
}
markerAttribs(point) {
if (point.isNode) {
return super.markerAttribs.apply(this, arguments);
}
return {};
}
}
/**
* Arc diagram series is a chart drawing style in which
* the vertices of the chart are positioned along a line
* on the Euclidean plane and the edges are drawn as a semicircle
* in one of the two half-planes delimited by the line,
* or as smooth curves formed by sequences of semicircles.
*
* @sample highcharts/demo/arc-diagram/
* Arc Diagram
*
* @extends plotOptions.sankey
* @since 10.0.0
* @product highcharts
* @requires modules/arc-diagram
* @exclude curveFactor, connectEnds, connectNulls, colorAxis, colorKey,
* dataSorting, dragDrop, getExtremesFromAll, nodeAlignment,
* nodePadding, centerInCategory, pointInterval,
* pointIntervalUnit, pointPlacement, pointStart,
* relativeXValue, softThreshold, stack, stacking, step,
* xAxis, yAxis
* @optionparent plotOptions.arcdiagram
*/
ArcDiagramSeries.defaultOptions = merge(SankeySeries.defaultOptions, {
/**
* The option to center links rather than position them one after
* another
*
* @type {boolean}
* @since 10.0.0
* @default false
* @product highcharts
*/
centeredLinks: false,
/**
* The radius of the link arc. If not set, series renders a semi-circle
* between the nodes, except when overflowing the edge of the plot area,
* in which case an arc touching the edge is rendered. If `linkRadius`
* is set, an arc extending to the given value is rendered.
*
* @type {number}
* @since 10.0.0
* @default undefined
* @product highcharts
* @apioption series.arcdiagram.linkRadius
*/
/**
* The offset of an arc diagram nodes column in relation to the
* `plotArea`. The offset equal to 50% places nodes in the center of a
* chart. By default the series is placed so that the biggest node is
* touching the bottom border of the `plotArea`.
*
* @type {string}
* @since 10.0.0
* @default '100%'
* @product highcharts
* @apioption series.arcdiagram.offset
*/
offset: '100%',
/**
* The global link weight, in pixels. If not set, width is calculated
* per link, depending on the weight value.
*
* @sample highcharts/series-arcdiagram/link-weight
* Link weight
*
* @type {number}
* @since 10.0.0
* @default undefined
* @product highcharts
* @apioption series.arcdiagram.linkWeight
*/
/**
* Whether nodes with different values should have the same size. If set
* to true, all nodes are calculated based on the `nodePadding` and
* current `plotArea`. It is possible to override it using the
* `marker.radius` option.
*
* @type {boolean}
* @since 10.0.0
* @default false
* @product highcharts
*/
equalNodes: false,
/**
* Whether the series should be placed on the other side of the
* `plotArea`.
*
* @type {boolean}
* @since 10.0.0
* @default false
* @product highcharts
*/
reversed: false,
/**
* Options for the data labels appearing on top of the nodes and links.
* For arc diagram charts, data labels are visible for the nodes by
* default, but hidden for links. This is controlled by modifying the
* `nodeFormat`, and the `format` that applies to links and is an empty
* string by default.
*
* @declare Highcharts.SeriesArcDiagramDataLabelsOptionsObject
*
* @private
*/
dataLabels: {
/**
* Options for a _link_ label text which should follow link
* connection. Border and background are disabled for a label that
* follows a path.
*
* **Note:** Only SVG-based renderer supports this option. Setting
* `useHTML` to true will disable this option.
*
* @extends plotOptions.networkgraph.dataLabels.linkTextPath
* @since 10.0.0
*/
linkTextPath: {
/**
* @type {Highcharts.SVGAttributes}
* @default {"startOffset":"25%"}
*/
attributes: {
/**
* @ignore-option
*/
startOffset: '25%'
}
}
},
/**
* @extends plotOptions.series.marker
* @excluding enabled, enabledThreshold, height, width
*/
marker: {
symbol: 'circle',
fillOpacity: 1,
lineWidth: 0,
states: {}
}
});
extend(ArcDiagramSeries.prototype, {
orderNodes: false
});
ArcDiagramSeries.prototype.pointClass = ArcDiagramPoint;
SeriesRegistry.registerSeriesType('arcdiagram', ArcDiagramSeries);
/* *
*
* Default Export
*
* */
/* *
*
* API Options
*
* */
/**
* An `arcdiagram` series. If the [type](#series.arcdiagram.type)
* option is not specified, it is inherited from [chart.type](#chart.type).
*
* @extends series,plotOptions.arcdiagram
* @exclude dataSorting, boostThreshold, boostBlending, curveFactor,
* connectEnds, connectNulls, colorAxis, colorKey, dataSorting,
* dragDrop, getExtremesFromAll, nodePadding, centerInCategory,
* pointInterval, pointIntervalUnit, pointPlacement,
* pointStart, relativeXValue, softThreshold, stack,
* stacking, step, xAxis, yAxis
* @product highcharts
* @requires modules/sankey
* @requires modules/arc-diagram
* @apioption series.arcdiagram
*/
/**
* @extends plotOptions.series.marker
* @excluding enabled, enabledThreshold, height, radius, width
* @apioption series.arcdiagram.marker
*/
/**
* @type {Highcharts.SeriesArcDiagramDataLabelsOptionsObject|Array<Highcharts.SeriesArcDiagramDataLabelsOptionsObject>}
* @product highcharts
* @apioption series.arcdiagram.data.dataLabels
*/
/**
* A collection of options for the individual nodes. The nodes in an arc diagram
* are auto-generated instances of `Highcharts.Point`, but options can be
* applied here and linked by the `id`.
*
* @extends series.sankey.nodes
* @type {Array<*>}
* @product highcharts
* @excluding column, level
* @apioption series.arcdiagram.nodes
*/
/**
* Individual data label for each node. The options are the same as the ones for
* [series.arcdiagram.dataLabels](#series.arcdiagram.dataLabels).
*
* @type
* {Highcharts.SeriesArcDiagramDataLabelsOptionsObject|Array<Highcharts.SeriesArcDiagramDataLabelsOptionsObject>}
*
* @apioption series.arcdiagram.nodes.dataLabels
*/
/**
* Individual data label for each node. The options are the same as the ones for
* [series.arcdiagram.dataLabels](#series.arcdiagram.dataLabels).
*
* @type
* {Highcharts.SeriesArcDiagramDataLabelsOptionsObject|Array<Highcharts.SeriesArcDiagramDataLabelsOptionsObject>}
*
*/
/**
* An array of data points for the series. For the `arcdiagram` series type,
* points can be given in the following way:
*
* An array of objects with named values. The following snippet shows only a few
* settings, see the complete options set below. If the total number of data
* points exceeds the series' [turboThreshold](#series.area.turboThreshold),
* this option is not available.
*
* ```js
* data: [{
* from: 'Category1',
* to: 'Category2',
* weight: 2
* }, {
* from: 'Category1',
* to: 'Category3',
* weight: 5
* }]
* ```
*
* @type {Array<*>}
* @extends series.sankey.data
* @product highcharts
* @excluding outgoing, dataLabels
* @apioption series.arcdiagram.data
*/
''; // Adds doclets above to the transpiled file
return ArcDiagramSeries;
});
_registerModule(_modules, 'masters/modules/arc-diagram.src.js', [_modules['Core/Globals.js']], function (Highcharts) {
return Highcharts;
});
}));