UNPKG

@progress/kendo-charts

Version:

Kendo UI platform-independent Charts library

338 lines (280 loc) 10.4 kB
import { ChartElement, BoxElement, Box, TextBox, FloatElement } from '../../core'; import LegendLayout from './legend-layout'; import LegendItem from './legend-item'; import { TOP, RIGHT, BOTTOM, LEFT, CENTER, X, Y, BLACK, CIRCLE, POINTER, START, END, HORIZONTAL, SQUARE } from '../../common/constants'; import { deepExtend, defined, getTemplate, getSpacing, inArray, setDefaultOptions } from '../../common'; var CUSTOM = "custom"; var Legend = (function (ChartElement) { function Legend(options, chartService) { if ( chartService === void 0 ) chartService = {}; ChartElement.call(this, options); this.chartService = chartService; if (!inArray(this.options.position, [ TOP, RIGHT, BOTTOM, LEFT, CUSTOM ])) { this.options.position = RIGHT; } this.createContainers(); this.createLegendTitle(options.title); this.createItems(); } if ( ChartElement ) Legend.__proto__ = ChartElement; Legend.prototype = Object.create( ChartElement && ChartElement.prototype ); Legend.prototype.constructor = Legend; Legend.prototype.createContainers = function createContainers () { var options = this.options; var position = options.position; var userAlign = options.align; var align = position; var vAlign = CENTER; if (position === CUSTOM) { align = LEFT; } else if (inArray(position, [ TOP, BOTTOM ])) { if (userAlign === START) { align = LEFT; } else if (userAlign === END) { align = RIGHT; } else { align = CENTER; } vAlign = position; } else if (userAlign) { if (userAlign === START) { vAlign = TOP; } else if (userAlign === END) { vAlign = BOTTOM; } } this.container = new BoxElement({ margin: options.margin, padding: options.padding, background: options.background, border: options.border, vAlign: vAlign, align: align, zIndex: options.zIndex, shrinkToFit: true }); if (this.hasTitle()) { this.itemsContainer = new BoxElement({ vAlign: vAlign, align: align, zIndex: options.zIndex, shrinkToFit: true }); } else { this.itemsContainer = this.container; } this.append(this.container); }; Legend.prototype.createItems = function createItems () { var chartService = this.getService(); var options = this.options; var vertical = this.isVertical(); var innerElement = new LegendLayout({ vertical: vertical, spacing: options.spacing, rtl: chartService.rtl }, chartService); var data = options.data; if (options.reverse) { data = data.slice(0).reverse(); } var count = data.length; for (var i = 0; i < count; i++) { var dataItem = data[i]; var ref = dataItem.series || {}; var markers = ref.markers; if ( markers === void 0 ) markers = {}; var dashType = ref.dashType; var legendItem = ref.legendItem; var opacity = ref.opacity; var markersOptions = deepExtend({ visible: markers.visible !== false, type: CIRCLE }, markers); delete markersOptions.size; var itemOptions = deepExtend({}, { markers: markersOptions, labels: options.labels, rtl: chartService.rtl, line: Object.assign({}, {dashType: dashType}, options.line), area: Object.assign({}, {opacity: opacity}, options.area), opacity: opacity, accessibility: options.accessibility, focusHighlight: options.focusHighlight }, options.item, legendItem, dataItem, { markers: options.markers } ); innerElement.append(new LegendItem(itemOptions)); } innerElement.render(); this.itemsContainer.append(innerElement); }; Legend.prototype.isVertical = function isVertical () { var ref = this.options; var orientation = ref.orientation; var position = ref.position; var vertical = (position === CUSTOM && orientation !== HORIZONTAL) || (defined(orientation) ? orientation !== HORIZONTAL : inArray(position, [ LEFT, RIGHT ])); return vertical; }; Legend.prototype.hasItems = function hasItems () { return this.container.children[0].children.length > 0; }; Legend.prototype.getItems = function getItems () { return this.itemsContainer.children[0].children; }; Legend.prototype.reflow = function reflow (targetBox) { var options = this.options; var legendBox = targetBox.clone(); if (!this.hasItems()) { this.box = legendBox; return; } if (options.position === CUSTOM) { this.containerCustomReflow(legendBox); this.box = legendBox; } else { this.containerReflow(legendBox); } if (this.hasTitle()) { this.title.reflow(new Box(this.container.box.x1, this.title.box.y1, this.container.box.x2, this.title.box.y2)); } }; Legend.prototype.containerReflow = function containerReflow (targetBox) { var ref = this; var options = ref.options; var container = ref.container; var position = options.position; var width = options.width; var height = options.height; var pos = position === TOP || position === BOTTOM ? X : Y; var vertical = this.isVertical(); var alignTarget = targetBox.clone(); var containerBox = targetBox.clone(); if (position === LEFT || position === RIGHT) { containerBox.y1 = alignTarget.y1 = 0; } if (vertical && height) { containerBox.y2 = containerBox.y1 + height; containerBox.align(alignTarget, Y, container.options.vAlign); } else if (!vertical && width) { containerBox.x2 = containerBox.x1 + width; containerBox.align(alignTarget, X, container.options.align); } container.reflow(containerBox); containerBox = container.box; var box = containerBox.clone(); if (options.offsetX || options.offsetY) { containerBox.translate(options.offsetX, options.offsetY); container.reflow(containerBox); } box[pos + 1] = targetBox[pos + 1]; box[pos + 2] = targetBox[pos + 2]; this.box = box; }; Legend.prototype.containerCustomReflow = function containerCustomReflow (targetBox) { var ref = this; var options = ref.options; var container = ref.container; var offsetX = options.offsetX; var offsetY = options.offsetY; var width = options.width; var height = options.height; var vertical = this.isVertical(); var containerBox = targetBox.clone(); if (vertical && height) { containerBox.y2 = containerBox.y1 + height; } else if (!vertical && width) { containerBox.x2 = containerBox.x1 + width; } container.reflow(containerBox); containerBox = container.box; container.reflow(new Box( offsetX, offsetY, offsetX + containerBox.width(), offsetY + containerBox.height() )); }; Legend.prototype.renderVisual = function renderVisual () { if (this.hasItems()) { ChartElement.prototype.renderVisual.call(this); } }; Legend.prototype.createLegendTitle = function createLegendTitle (title) { var titleOptions = deepExtend({}, { color: BLACK, position: TOP, align: CENTER }, title); var text = titleOptions.text; if (!title || title.visible === false || !title.text) { return; } if (defined(titleOptions) && titleOptions.visible) { var labelTemplate = getTemplate(titleOptions); if (labelTemplate) { text = labelTemplate({ text: text }); } else if (titleOptions.format) { text = this.chartService.format.auto(titleOptions.format, text); } } this.title = new TextBox(text, titleOptions); this.createTitleLayout(); this.appendTitleLayoutContent(); }; Legend.prototype.createTitleLayout = function createTitleLayout () { this.layout = new FloatElement({ vertical: true, wrap: false }); this.container.append(this.layout); }; Legend.prototype.hasTitle = function hasTitle () { return Boolean(this.options.title && this.options.title.visible !== false && this.options.title.text); }; Legend.prototype.appendTitleLayoutContent = function appendTitleLayoutContent () { var options = this.options; if (options.title.position === BOTTOM) { this.layout.append(this.itemsContainer); this.layout.append(this.title); } else { this.layout.append(this.title); this.layout.append(this.itemsContainer); } }; return Legend; }(ChartElement)); setDefaultOptions(Legend, { position: RIGHT, data: [], offsetX: 0, offsetY: 0, margin: getSpacing(2), padding: getSpacing(5), border: { color: BLACK, width: 0 }, item: { cursor: POINTER, spacing: 6 }, spacing: 6, background: "", zIndex: 1, markers: {}, line: { width: 20, height: 2, cursor: POINTER, opacity: 1 }, area: { type: SQUARE, align: RIGHT, width: 15, height: 15, } }); export default Legend;