highcharts
Version:
JavaScript charting framework
138 lines (137 loc) • 4.48 kB
JavaScript
/* *
*
* This module implements sunburst charts in Highcharts.
*
* (c) 2016-2021 Highsoft AS
*
* Authors: Jon Arild Nygard
*
* License: www.highcharts.com/license
*
* !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!
*
* */
;
import SeriesRegistry from '../../Core/Series/SeriesRegistry.js';
var TreemapSeries = SeriesRegistry.seriesTypes.treemap;
import U from '../../Core/Utilities.js';
var isNumber = U.isNumber, isObject = U.isObject, merge = U.merge;
/* *
*
* Namespace
*
* */
var SunburstUtilities;
(function (SunburstUtilities) {
/* *
*
* Constants
*
* */
SunburstUtilities.recursive = TreemapSeries.prototype.utils.recursive;
/* *
*
* Functions
*
* */
/* eslint-disable valid-jsdoc */
/**
* @private
* @function calculateLevelSizes
*
* @param {object} levelOptions
* Map of level to its options.
*
* @param {Highcharts.Dictionary<number>} params
* Object containing number parameters `innerRadius` and `outerRadius`.
*
* @return {Highcharts.SunburstSeriesLevelsOptions|undefined}
* Returns the modified options, or undefined.
*/
function calculateLevelSizes(levelOptions, params) {
var result, p = isObject(params) ? params : {}, totalWeight = 0, diffRadius, levels, levelsNotIncluded, remainingSize, from, to;
if (isObject(levelOptions)) {
result = merge({}, levelOptions);
from = isNumber(p.from) ? p.from : 0;
to = isNumber(p.to) ? p.to : 0;
levels = range(from, to);
levelsNotIncluded = Object.keys(result).filter(function (k) {
return levels.indexOf(+k) === -1;
});
diffRadius = remainingSize = isNumber(p.diffRadius) ? p.diffRadius : 0;
// Convert percentage to pixels.
// Calculate the remaining size to divide between "weight" levels.
// Calculate total weight to use in convertion from weight to
// pixels.
levels.forEach(function (level) {
var options = result[level], unit = options.levelSize.unit, value = options.levelSize.value;
if (unit === 'weight') {
totalWeight += value;
}
else if (unit === 'percentage') {
options.levelSize = {
unit: 'pixels',
value: (value / 100) * diffRadius
};
remainingSize -= options.levelSize.value;
}
else if (unit === 'pixels') {
remainingSize -= value;
}
});
// Convert weight to pixels.
levels.forEach(function (level) {
var options = result[level], weight;
if (options.levelSize.unit === 'weight') {
weight = options.levelSize.value;
result[level].levelSize = {
unit: 'pixels',
value: (weight / totalWeight) * remainingSize
};
}
});
// Set all levels not included in interval [from,to] to have 0
// pixels.
levelsNotIncluded.forEach(function (level) {
result[level].levelSize = {
value: 0,
unit: 'pixels'
};
});
}
return result;
}
SunburstUtilities.calculateLevelSizes = calculateLevelSizes;
/**
* @private
*/
function getLevelFromAndTo(_a) {
var level = _a.level, height = _a.height;
// Never displays level below 1
var from = level > 0 ? level : 1;
var to = level + height;
return { from: from, to: to };
}
SunburstUtilities.getLevelFromAndTo = getLevelFromAndTo;
/**
* TODO introduce step, which should default to 1.
* @private
*/
function range(from, to) {
var result = [], i;
if (isNumber(from) && isNumber(to) && from <= to) {
for (i = from; i <= to; i++) {
result.push(i);
}
}
return result;
}
SunburstUtilities.range = range;
/* eslint-enable valid-jsdoc */
})(SunburstUtilities || (SunburstUtilities = {}));
/* *
*
* Default Export
*
* */
export default SunburstUtilities;