@progress/kendo-charts
Version:
Kendo UI platform-independent Charts library
83 lines (72 loc) • 2.85 kB
JavaScript
import { setDefaultOptions, deepExtend } from '../common';
import { SankeyElement } from './element';
import { Box, TextBox } from '../core';
const INSIDE = 'inside';
const BEFORE = 'before';
const AFTER = 'after';
export class Label extends SankeyElement {
getElement() {
const options = deepExtend({}, this.options, this.options.node.label);
const { node, diagramMinX, diagramMaxX, text, offset, rtl } = options;
let position = options.position;
if (rtl && position !== INSIDE) {
position = position === BEFORE ? AFTER : BEFORE;
}
if (!options.visible || !text) {
return null;
}
const nodeBox = new Box(node.x0, node.y0, node.x1, node.y1);
const visualOptions = this.visualOptions();
if (rtl && !visualOptions.align) {
visualOptions.align = 'right';
}
const textbox = new TextBox(text, visualOptions);
textbox.reflow(new Box());
const textSizeBox = textbox.box;
const textY = nodeBox.center().y - (textSizeBox.height() / 2);
const labelAfterLastNode = node.x1 + textSizeBox.width() > diagramMaxX;
const labelBeforeFirstNode = node.x0 - textSizeBox.width() < diagramMinX;
let side = position === BEFORE || (position === INSIDE && labelAfterLastNode) ? BEFORE : AFTER;
if (rtl) {
side = position === AFTER || (position === INSIDE && labelBeforeFirstNode) ? AFTER : BEFORE;
}
const textOrigin = [side === BEFORE ? node.x0 - textSizeBox.width() : node.x1, textY];
const textRect = new Box(textOrigin[0], textOrigin[1], textOrigin[0] + textSizeBox.width(), textOrigin[1] + textSizeBox.height());
textRect.translate(offset.left || 0, offset.top || 0);
textbox.reflow(textRect);
textbox.renderVisual();
return textbox.visual;
}
visualOptions() {
const options = deepExtend({}, this.options, this.options.node.label);
return {
color: options.color,
font: options.font,
border: options.border,
margin: options.margin,
padding: options.padding,
align: options.align,
paintOrder: options.paintOrder,
stroke: options.stroke,
};
}
}
setDefaultOptions(Label, {
position: INSIDE, // inside, before, after
});
export const resolveLabelOptions = (node, options, rtl, diagramMinX, diagramMaxX) => deepExtend({},
options,
{
node,
diagramMinX,
diagramMaxX,
rtl,
visual: node.label.visual,
visible: node.label.visible,
margin: node.label.margin,
padding: node.label.padding,
border: node.label.border,
align: node.label.align,
offset: node.label.offset
}
);