highcharts
Version:
JavaScript charting framework
116 lines (115 loc) • 3.07 kB
JavaScript
/* *
*
* Organization chart module
*
* (c) 2018-2025 Torstein Honsi
*
* License: www.highcharts.com/license
*
* !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!
*
* */
;
import SeriesRegistry from '../../Core/Series/SeriesRegistry.js';
const { sankey: { prototype: { pointClass: SankeyPointClass } } } = SeriesRegistry.seriesTypes;
import U from '../../Core/Utilities.js';
const { defined, find, pick } = U;
/* *
*
* Functions
*
* */
/**
* Get columns offset including all sibling and cousins etc.
* @private
*/
function getOffset(node) {
let offset = node.linksFrom.length;
node.linksFrom.forEach((link) => {
if (link.id === link.toNode.linksTo[0].id) {
// Node has children, that hangs directly from it:
offset += getOffset(link.toNode);
}
else {
// If the node hangs from multiple parents, and this is not
// the last one, ignore it:
offset--;
}
});
return offset;
}
/* *
*
* Class
*
* */
class OrganizationPoint extends SankeyPointClass {
/* *
*
* Functions
*
* */
constructor(series, options, x) {
super(series, options, x);
if (!this.isNode) {
this.dataLabelOnNull = true;
this.formatPrefix = 'link';
}
}
/**
* All nodes in an org chart are equal width.
* @private
*/
getSum() {
return 1;
}
/**
* Set node.column for hanging layout
* @private
*/
setNodeColumn() {
super.setNodeColumn();
const node = this, fromNode = node.getFromNode().fromNode;
// Hanging layout
if (
// Not defined by user
!defined(node.options.column) &&
// Has links to
node.linksTo.length !== 0 &&
// And parent uses hanging layout
fromNode &&
fromNode.options.layout === 'hanging') {
let i = -1, link;
// Default all children of the hanging node
// to have hanging layout
node.options.layout = pick(node.options.layout, 'hanging');
node.hangsFrom = fromNode;
find(fromNode.linksFrom, (link, index) => {
const found = link.toNode === node;
if (found) {
i = index;
}
return found;
});
// For all siblings' children (recursively)
// increase the column offset to prevent overlapping
for (let j = 0; j < fromNode.linksFrom.length; ++j) {
link = fromNode.linksFrom[j];
if (link.toNode.id === node.id) {
// Break
j = fromNode.linksFrom.length;
}
else {
i += getOffset(link.toNode);
}
}
node.column = (node.column || 0) + i;
}
}
}
/* *
*
* Default Export
*
* */
export default OrganizationPoint;