@progress/kendo-charts
Version:
Kendo UI platform-independent Charts library
98 lines (84 loc) • 3.4 kB
JavaScript
import { setDefaultOptions, deepExtend } from '../common';
import { SankeyElement } from './element';
import { Box, TextBox } from '../core';
var INSIDE = 'inside';
var BEFORE = 'before';
var AFTER = 'after';
export var Label = (function (SankeyElement) {
function Label () {
SankeyElement.apply(this, arguments);
}
if ( SankeyElement ) Label.__proto__ = SankeyElement;
Label.prototype = Object.create( SankeyElement && SankeyElement.prototype );
Label.prototype.constructor = Label;
Label.prototype.getElement = function getElement () {
var options = deepExtend({}, this.options, this.options.node.label);
var node = options.node;
var diagramMinX = options.diagramMinX;
var diagramMaxX = options.diagramMaxX;
var text = options.text;
var offset = options.offset;
var rtl = options.rtl;
var position = options.position;
if (rtl && position !== INSIDE) {
position = position === BEFORE ? AFTER : BEFORE;
}
if (!options.visible || !text) {
return null;
}
var nodeBox = new Box(node.x0, node.y0, node.x1, node.y1);
var visualOptions = this.visualOptions();
if (rtl && !visualOptions.align) {
visualOptions.align = 'right';
}
var textbox = new TextBox(text, visualOptions);
textbox.reflow(new Box());
var textSizeBox = textbox.box;
var textY = nodeBox.center().y - (textSizeBox.height() / 2);
var labelAfterLastNode = node.x1 + textSizeBox.width() > diagramMaxX;
var labelBeforeFirstNode = node.x0 - textSizeBox.width() < diagramMinX;
var side = position === BEFORE || (position === INSIDE && labelAfterLastNode) ? BEFORE : AFTER;
if (rtl) {
side = position === AFTER || (position === INSIDE && labelBeforeFirstNode) ? AFTER : BEFORE;
}
var textOrigin = [side === BEFORE ? node.x0 - textSizeBox.width() : node.x1, textY];
var 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;
};
Label.prototype.visualOptions = function visualOptions () {
var 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,
};
};
return Label;
}(SankeyElement));
setDefaultOptions(Label, {
position: INSIDE, // inside, before, after
});
export var resolveLabelOptions = function (node, options, rtl, diagramMinX, diagramMaxX) { return deepExtend({},
options,
{
node: node,
diagramMinX: diagramMinX,
diagramMaxX: diagramMaxX,
rtl: 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
}
); };