194 lines
7.3 KiB
JavaScript
194 lines
7.3 KiB
JavaScript
import U from '../../Core/Utilities.js';
|
|
var defined = U.defined, relativeLength = U.relativeLength;
|
|
var SankeyColumnComposition;
|
|
(function (SankeyColumnComposition) {
|
|
/* *
|
|
*
|
|
* Declarations
|
|
*
|
|
* */
|
|
/**
|
|
* SankeyColumn Composition
|
|
* @private
|
|
* @function Highcharts.SankeyColumn#compose
|
|
*
|
|
* @param {Array<SankeyPoint>} points
|
|
* The array of nodes
|
|
* @param {SankeySeries} series
|
|
* Series connected to column
|
|
* @return {ArrayComposition} SankeyColumnArray
|
|
*/
|
|
function compose(points, series) {
|
|
var sankeyColumnArray = points;
|
|
sankeyColumnArray.sankeyColumn =
|
|
new SankeyColumnAdditions(sankeyColumnArray, series);
|
|
return sankeyColumnArray;
|
|
}
|
|
SankeyColumnComposition.compose = compose;
|
|
/* *
|
|
*
|
|
* Classes
|
|
*
|
|
* */
|
|
var SankeyColumnAdditions = /** @class */ (function () {
|
|
function SankeyColumnAdditions(points, series) {
|
|
this.points = points;
|
|
this.series = series;
|
|
}
|
|
/**
|
|
* Calculate translation factor used in column and nodes distribution
|
|
* @private
|
|
* @function Highcharts.SankeyColumn#getTranslationFactor
|
|
*
|
|
* @param {SankeySeries} series
|
|
* The Series
|
|
* @return {number} TranslationFactor
|
|
* Translation Factor
|
|
*/
|
|
SankeyColumnAdditions.prototype.getTranslationFactor = function (series) {
|
|
var column = this.points, nodes = column.slice(), chart = series.chart, minLinkWidth = series.options.minLinkWidth || 0;
|
|
var skipPoint, factor = 0, i, remainingHeight = ((chart.plotSizeY || 0) -
|
|
(series.options.borderWidth || 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 = remainingHeight / column.sankeyColumn.sum();
|
|
skipPoint = false;
|
|
i = column.length;
|
|
while (i--) {
|
|
if (column[i].getSum() * factor < minLinkWidth) {
|
|
column.splice(i, 1);
|
|
remainingHeight -= minLinkWidth;
|
|
skipPoint = true;
|
|
}
|
|
}
|
|
if (!skipPoint) {
|
|
break;
|
|
}
|
|
}
|
|
// Re-insert original nodes
|
|
column.length = 0;
|
|
nodes.forEach(function (node) {
|
|
column.push(node);
|
|
});
|
|
return factor;
|
|
};
|
|
/**
|
|
* Get the top position of the column in pixels
|
|
* @private
|
|
* @function Highcharts.SankeyColumn#top
|
|
*
|
|
* @param {number} factor
|
|
* The Translation Factor
|
|
* @return {number} top
|
|
* The top position of the column
|
|
*/
|
|
SankeyColumnAdditions.prototype.top = function (factor) {
|
|
var series = this.series;
|
|
var nodePadding = series.nodePadding;
|
|
var height = this.points.reduce(function (height, node) {
|
|
if (height > 0) {
|
|
height += nodePadding;
|
|
}
|
|
var nodeHeight = Math.max(node.getSum() * factor, series.options.minLinkWidth || 0);
|
|
height += nodeHeight;
|
|
return height;
|
|
}, 0);
|
|
return ((series.chart.plotSizeY || 0) - height) / 2;
|
|
};
|
|
/**
|
|
* Get the left position of the column in pixels
|
|
* @private
|
|
* @function Highcharts.SankeyColumn#top
|
|
*
|
|
* @param {number} factor
|
|
* The Translation Factor
|
|
* @return {number} left
|
|
* The left position of the column
|
|
*/
|
|
SankeyColumnAdditions.prototype.left = function (factor) {
|
|
var series = this.series, chart = series.chart, equalNodes = series.options.equalNodes;
|
|
var maxNodesLength = chart.inverted ?
|
|
chart.plotHeight : chart.plotWidth, nodePadding = series.nodePadding;
|
|
var width = this.points.reduce(function (width, node) {
|
|
if (width > 0) {
|
|
width += nodePadding;
|
|
}
|
|
var nodeWidth = equalNodes ?
|
|
maxNodesLength / node.series.nodes.length - nodePadding :
|
|
Math.max(node.getSum() * factor, series.options.minLinkWidth || 0);
|
|
width += nodeWidth;
|
|
return width;
|
|
}, 0);
|
|
return ((chart.plotSizeX || 0) - Math.round(width)) / 2;
|
|
};
|
|
/**
|
|
* Calculate sum of all nodes inside specific column
|
|
* @private
|
|
* @function Highcharts.SankeyColumn#sum
|
|
*
|
|
* @param {ArrayComposition} this
|
|
* Sankey Column Array
|
|
*
|
|
* @return {number} sum
|
|
* Sum of all nodes inside column
|
|
*/
|
|
SankeyColumnAdditions.prototype.sum = function () {
|
|
return this.points.reduce(function (sum, node) {
|
|
return sum + node.getSum();
|
|
}, 0);
|
|
};
|
|
/**
|
|
* Get the offset in pixels of a node inside the column
|
|
* @private
|
|
* @function Highcharts.SankeyColumn#offset
|
|
*
|
|
* @param {SankeyPoint} node
|
|
* Sankey node
|
|
* @param {number} factor
|
|
* Translation Factor
|
|
* @return {number} offset
|
|
* Offset of a node inside column
|
|
*/
|
|
SankeyColumnAdditions.prototype.offset = function (node, factor) {
|
|
var column = this.points, series = this.series, nodePadding = series.nodePadding;
|
|
var offset = 0, totalNodeOffset;
|
|
if (series.is('organization') && node.hangsFrom) {
|
|
return {
|
|
absoluteTop: node.hangsFrom.nodeY
|
|
};
|
|
}
|
|
for (var i = 0; i < column.length; i++) {
|
|
var sum = column[i].getSum();
|
|
var height = Math.max(sum * factor, series.options.minLinkWidth || 0);
|
|
var directionOffset = node.options[series.chart.inverted ?
|
|
'offsetHorizontal' :
|
|
'offsetVertical'], optionOffset = node.options.offset || 0;
|
|
if (sum) {
|
|
totalNodeOffset = height + nodePadding;
|
|
}
|
|
else {
|
|
// If node sum equals 0 nodePadding is missed #12453
|
|
totalNodeOffset = 0;
|
|
}
|
|
if (column[i] === node) {
|
|
return {
|
|
relativeTop: offset + (defined(directionOffset) ?
|
|
// directionOffset is a percent
|
|
// of the node height
|
|
relativeLength(directionOffset, height) :
|
|
relativeLength(optionOffset, totalNodeOffset))
|
|
};
|
|
}
|
|
offset += totalNodeOffset;
|
|
}
|
|
};
|
|
return SankeyColumnAdditions;
|
|
}());
|
|
SankeyColumnComposition.SankeyColumnAdditions = SankeyColumnAdditions;
|
|
})(SankeyColumnComposition || (SankeyColumnComposition = {}));
|
|
export default SankeyColumnComposition;
|