@syncfusion/ej2-charts
Version:
Feature-rich chart control with built-in support for over 25 chart types, technical indictors, trendline, zooming, tooltip, selection, crosshair and trackball.
753 lines (752 loc) • 39.1 kB
JavaScript
var __extends = (this && this.__extends) || (function () {
var extendStatics = function (d, b) {
extendStatics = Object.setPrototypeOf ||
({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
return extendStatics(d, b);
};
return function (d, b) {
extendStatics(d, b);
function __() { this.constructor = d; }
d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
};
})();
import { valueToCoefficient, inside, isOverlap, textTrim } from '../../common/utils/helper';
import { appendChildElement } from '../../common/utils/helper';
import { CircleOption } from '../../common/utils/helper';
import { Size, measureText, TextOption, PathOption, Rect } from '@syncfusion/ej2-svg-base';
import { createElement } from '@syncfusion/ej2-base';
import { LineBase } from '../series/line-base';
import { textElement, ChartLocation, valueToPolarCoefficient, CoefficientToVector, getElement, createTemplate } from '../../common/utils/helper';
/**
* Specifies the layout for polar axis panels.
*
* @private
*/
var PolarRadarPanel = /** @class */ (function (_super) {
__extends(PolarRadarPanel, _super);
function PolarRadarPanel() {
var _this = _super !== null && _super.apply(this, arguments) || this;
/** @private */
_this.visibleAxisLabelRect = [];
return _this;
}
/**
* Measure the polar radar axis size.
*
* @returns {void}
* @private
*/
PolarRadarPanel.prototype.measureAxis = function (rect) {
var chart = this.chart;
this.initialClipRect = rect;
this.seriesClipRect = new Rect(rect.x, rect.y, rect.width, rect.height);
//Measure axis size calculation
this.measureRowAxis(chart, this.initialClipRect);
this.measureColumnAxis(chart, this.initialClipRect);
this.calculateAxisSize();
};
PolarRadarPanel.prototype.measureRowAxis = function (chart, rect) {
this.calculateRowSize(rect);
var row = chart.rows[0];
this.measureDefinition(row, chart, new Size(chart.availableSize.width, row.computedHeight));
};
PolarRadarPanel.prototype.measureColumnAxis = function (chart, rect) {
this.calculateColumnSize(rect);
var column = chart.columns[0];
this.measureDefinition(column, chart, new Size(column.computedWidth, chart.availableSize.height));
};
/**
* Measures the column and row in the chart.
*
* @param {Row | Column} definition - The row or column to measure.
* @param {Chart} chart - The chart instance.
* @param {Size} size - The size of the chart.
* @returns {void}
* @private
*/
PolarRadarPanel.prototype.measureDefinition = function (definition, chart, size) {
for (var _i = 0, _a = definition.axes; _i < _a.length; _i++) {
var axis = _a[_i];
axis.getModule(chart);
axis.baseModule.calculateRangeAndInterval(size, axis);
}
};
/**
* Measure the axis.
*
* @returns {void}
* @private
*/
PolarRadarPanel.prototype.calculateAxisSize = function () {
var chart = this.chart;
var axis;
var padding = 5;
this.centerX = this.initialClipRect.width * 0.5 + this.initialClipRect.x;
this.centerY = this.initialClipRect.height * 0.5 + this.initialClipRect.y;
chart.radius = Math.min(this.initialClipRect.width, this.initialClipRect.height) / 2 - padding -
chart.primaryXAxis.majorTickLines.height - chart.primaryXAxis.maxLabelSize.height;
chart.radius = (chart.primaryXAxis.coefficient * chart.radius) / 100;
this.seriesClipRect.y = this.centerY - chart.radius;
this.seriesClipRect.x = this.centerX - chart.radius;
this.seriesClipRect.height = 2 * chart.radius;
this.seriesClipRect.width = 2 * chart.radius;
this.calculateRowSize(this.seriesClipRect);
axis = chart.primaryYAxis;
axis.rect = this.seriesClipRect;
this.calculateColumnSize(this.seriesClipRect);
axis = chart.primaryXAxis;
axis.rect = this.seriesClipRect;
};
/**
* Measure the axis.
*
* @returns {void}
* @private
*/
PolarRadarPanel.prototype.measure = function () {
var chart = this.chart;
var yAxis = chart.primaryYAxis;
yAxis.isRTLEnabled = chart.enableRtl;
yAxis.setIsInversedAndOpposedPosition(true);
chart.verticalAxes.push(yAxis);
var row = chart.rows[0];
row.axes[0] = yAxis;
chart.rows[0] = row;
var xAxis = chart.primaryXAxis;
xAxis.isRTLEnabled = chart.enableRtl;
xAxis.setIsInversedAndOpposedPosition(true);
chart.horizontalAxes.push(xAxis);
var column = chart.columns[0];
column.axes[0] = xAxis;
chart.columns[0] = column;
};
/**
* Measure the row size.
*
* @returns {void}
*/
PolarRadarPanel.prototype.calculateRowSize = function (rect) {
/** Calculate row size */
var chart = this.chart;
var row = chart.rows[0];
row.computedHeight = rect.height / 2;
row.computedTop = rect.y;
chart.rows[0] = row;
};
/**
* Measure the row size.
*
* @returns {void}
*/
PolarRadarPanel.prototype.calculateColumnSize = function (rect) {
/** Calculate column size */
var chart = this.chart;
var column = chart.columns[0];
column.computedLeft = rect.x;
column.computedWidth = rect.width;
chart.columns[0] = column;
};
/**
* To render the axis element.
*
* @returns {void}
* @private
*/
PolarRadarPanel.prototype.renderAxes = function () {
var axis;
var chart = this.chart;
this.startAngle = chart.primaryXAxis.startAngle;
var axisElement = chart.renderer.createGroup({ id: chart.element.id + 'AxisCollection' });
var axisLineElement = chart.renderer.createGroup({ id: chart.element.id + 'AxisOutsideCollection' });
for (var i = 0, len = chart.axisCollections.length; i < len; i++) {
this.element = chart.renderer.createGroup({ id: chart.element.id + 'AxisGroup' + i });
axis = chart.axisCollections[i];
if (axis.orientation === 'Horizontal') {
if (axis.majorGridLines.width > 0 || axis.majorTickLines.width > 0) {
this.drawXAxisGridLine(axis, i);
}
if (axis.visible && axis.internalVisibility) {
this.drawXAxisLabels(axis, i);
}
}
else {
this.drawYAxisGridLine(axis, i);
if (axis.lineStyle.width > 0) {
this.drawYAxisLine(axis, i);
}
if (axis.visible && axis.internalVisibility) {
this.drawYAxisLabels(axis, i);
}
}
if (!this.chart.enableCanvas) {
axisElement.appendChild(this.element);
}
}
if (!this.chart.enableCanvas) {
axisElement.appendChild(this.element);
}
appendChildElement(chart.enableCanvas, chart.svgObject, axisElement, chart.redraw);
return axisLineElement;
};
PolarRadarPanel.prototype.drawYAxisLine = function (axis, index) {
var chart = this.chart;
var optionsLine = {};
var vector = CoefficientToVector(valueToPolarCoefficient(axis.visibleLabels[0].value, axis), this.startAngle);
var axisLine = 'M ' + this.centerX + ' ' + this.centerY + 'L ' +
(this.centerX + chart.radius * vector.x) + ' ' + (this.centerY + chart.radius * vector.y);
optionsLine = {
'id': chart.element.id + 'AxisLine_' + index,
'd': axisLine,
'stroke-dasharray': axis.lineStyle.dashArray,
'stroke-width': axis.lineStyle.width,
'stroke': axis.lineStyle.color || chart.themeStyle.axisLine
};
/**
* I252450
* When we click the center of the marker which is plotted in the axis line, selection did not work is fixed
* Cause: Instead of marker id, axis line id is obtained while clicking
* Fix: Pointer events set to none for axis lines
*/
var element = chart.renderer.drawPath(optionsLine);
this.setPointerEventNone(element);
if (!this.chart.enableCanvas) {
chart.yAxisElements.appendChild(element);
}
};
PolarRadarPanel.prototype.drawYAxisLabels = function (axis, index) {
var chart = this.chart;
var elementSize;
var options;
var pointX = 0;
var pointY = 0;
var angle = this.startAngle < 0 ? this.startAngle + 360 : this.startAngle;
var anchor = 'middle';
var radius;
var padding = 5;
var isIntersect;
var labelRegions = [];
var isLabelVisible = [];
isLabelVisible[0] = true;
var intersectType = axis.labelIntersectAction;
var labelElement = chart.renderer.createGroup({ id: chart.element.id + 'AxisLabels' + index });
var vector = CoefficientToVector(valueToPolarCoefficient(axis.visibleLabels[0].value, axis), this.startAngle);
//Initializing the label template for yAxis
if (axis.labelTemplate) {
var templateId = chart.element.id + '_YAxisLabelTemplate_Collection';
chart.yAxisLabelTemplate = createElement('div', {
id: templateId
});
}
var labelTemplateHeight = chart.radius / axis.visibleLabels.length;
for (var i = 0, len = axis.visibleLabels.length; i < len; i++) {
var label = axis.visibleLabels[i];
isIntersect = false;
radius = chart.radius * valueToCoefficient(axis.visibleLabels[i].value, axis);
elementSize = axis.visibleLabels[i].size;
radius = chart.radius * valueToCoefficient(axis.visibleLabels[i].value, axis);
pointX = (this.centerX + radius * vector.x) + ((axis.majorTickLines.height + elementSize.width / 2 + padding / 2)
* (Math.cos(angle * Math.PI / 180)) * (axis.labelPosition === 'Inside' && chart.enableRtl ? -1 : axis.labelPosition === 'Inside' ? 1 : axis.labelPosition === 'Outside' && chart.enableRtl ? 1 : -1));
pointY = (this.centerY + radius * vector.y) + ((axis.majorTickLines.height + elementSize.height / 2)
* (Math.sin(angle * Math.PI / 180)) * (axis.labelPosition === 'Inside' && chart.enableRtl ? -1 : axis.labelPosition === 'Inside' ? 1 : axis.labelPosition === 'Outside' && chart.enableRtl ? 1 : -1));
pointY += (elementSize.height / 4);
labelRegions[i] = this.getLabelRegion(pointX, pointY, axis.visibleLabels[i], anchor);
if (!axis.labelTemplate) {
labelRegions[i] = this.getLabelRegion(pointX, pointY, label, anchor);
}
if (i !== 0 && intersectType === 'Hide' && !axis.labelTemplate) {
for (var j = i; j >= 0; j--) {
j = (j === 0) ? 0 : (j === i) ? (j - 1) : j;
if (isLabelVisible[j] && isOverlap(labelRegions[i], labelRegions[j])) {
isIntersect = true;
isLabelVisible[i] = false;
break;
}
else {
isLabelVisible[i] = true;
}
}
if (isIntersect) {
continue; // If the label is intersect, the label render is ignored.
}
// To check Y axis label with visible X axis label
for (var _i = 0, _a = this.visibleAxisLabelRect; _i < _a.length; _i++) {
var rect = _a[_i];
if (isOverlap(labelRegions[i], rect)) {
isIntersect = true;
break;
}
}
}
if (isIntersect) {
continue;
}
if (!axis.labelTemplate) {
this.visibleAxisLabelRect.push(labelRegions[i]);
}
options = new TextOption(chart.element.id + index + '_AxisLabel_' + i, pointX, pointY, anchor, label.text);
if (axis.labelTemplate) {
var templateSize = new Size(label.size.width, label.size.height);
var templatePointX = void 0;
var templatePointY = void 0;
var isOutside = axis.labelPosition === 'Outside';
var cosAngle = Math.cos(angle * Math.PI / 180);
var sinAngle = Math.sin(angle * Math.PI / 180);
var tickOffsetX = axis.majorTickLines.height + templateSize.width + 4.5;
var tickOffsetY = axis.majorTickLines.height + (templateSize.height / 2);
var baseX = this.centerX + (radius * vector.x);
var baseY = this.centerY + (radius * vector.y);
templatePointX = baseX + (isOutside ? -tickOffsetX : tickOffsetX) * cosAngle;
templatePointY = baseY + (isOutside ? -tickOffsetY : tickOffsetY) * sinAngle;
var horizontalShift = templateSize.width * 0.5 * (isOutside ? (1 - cosAngle) : (1 + cosAngle));
templatePointX -= horizontalShift;
var chartAreaX = this.chart.border.width * 0.5;
if (templatePointX < chartAreaX) {
var overflow = chartAreaX - templatePointX;
templateSize.width = Math.max(0, label.size.width - overflow);
templatePointX = chartAreaX;
}
templatePointY -= templateSize.height > labelTemplateHeight ? labelTemplateHeight / 2 : templateSize.height / 2;
var labelTemplateId = chart.element.id + '_YAxisLabelTemplate_' + index + '_' + i;
// Create a container div for template
var labelDiv = createElement('div', {
id: labelTemplateId,
styles: "position:absolute; pointer-events:none; z-index:1;left:" + templatePointX + "px; top:" + templatePointY + "px;width:" + templateSize.width + "px; height:" + templateSize.height + "px;"
});
// Create the template element
var templateElement = createTemplate(labelDiv, i, axis.labelTemplate, chart, label);
chart.yAxisLabelTemplate.appendChild(templateElement);
}
else {
textElement(chart.renderer, options, axis.labelStyle, axis.labelStyle.color || chart.themeStyle.axisLabelFont.color, labelElement, false, chart.redraw, true, true, null, null, null, null, chart.enableCanvas, null, chart.themeStyle.axisLabelFont);
}
}
if (!this.chart.enableCanvas && !axis.labelTemplate) {
chart.yAxisElements.appendChild(labelElement);
}
};
PolarRadarPanel.prototype.drawYAxisGridLine = function (axis, index) {
var chart = this.chart;
var options;
var radius;
var majorTick = '';
var majorGrid = '';
var vector;
var angle = this.startAngle < 0 ? this.startAngle + 360 : this.startAngle;
var x1;
var y1;
var x2;
var y2;
var border = {
color: axis.majorGridLines.color || chart.themeStyle.majorGridLine,
width: axis.majorGridLines.width
};
var previousValue;
var element;
var inversedRadius;
if (axis.majorGridLines.width > 0) {
if (chart.visibleSeries[0].type === 'Polar') {
for (var j = 0; j < axis.visibleLabels.length; j++) {
element = getElement(chart.element.id + '_MajorGridLine_' + index + '_' + j);
previousValue = element ? element.getAttribute('r') : null;
radius = chart.radius * valueToCoefficient(axis.visibleLabels[j].value, axis);
if (axis.isInversed && !inversedRadius) {
inversedRadius = radius;
}
options = new CircleOption(chart.element.id + '_MajorGridLine_' + index + '_' + j, 'transparent', border, axis.majorGridLines.width, this.centerX, this.centerY, radius);
appendChildElement(chart.enableCanvas, this.element, chart.renderer.drawCircle(options), chart.redraw, true, 'r', 'r', new ChartLocation(+previousValue, +previousValue), null, true);
}
if (radius !== chart.radius && (!axis.isInversed || inversedRadius !== chart.radius)) {
options = new CircleOption(chart.element.id + '_MajorGridLine_' + index + '_' + axis.visibleLabels.length + 1, 'transparent', border, axis.majorGridLines.width, this.centerX, this.centerY, chart.radius);
appendChildElement(chart.enableCanvas, this.element, chart.renderer.drawCircle(options), chart.redraw, true, 'r', 'r', new ChartLocation(+previousValue, +previousValue), null, true);
}
}
else {
for (var j = 0; j < axis.visibleLabels.length; j++) {
radius = chart.radius * valueToCoefficient(axis.visibleLabels[j].value, axis);
majorGrid = this.renderRadarGrid(radius, '', chart);
element = getElement(chart.element.id + '_MajorGridLine_' + index + '_' + j);
previousValue = element ? element.getAttribute('d') : null;
options = new PathOption(chart.element.id + '_MajorGridLine_' + index + '_' + j, 'transparent', axis.majorGridLines.width, axis.majorGridLines.color || chart.themeStyle.majorGridLine, null, null, majorGrid);
appendChildElement(chart.enableCanvas, this.element, chart.renderer.drawPath(options), chart.redraw, true, 'x', 'y', null, previousValue, true);
}
if (radius !== chart.radius) {
majorGrid = this.renderRadarGrid(chart.radius, '', chart);
element = getElement(chart.element.id + '_MajorGridLine_' + index + '_' + axis.visibleLabels.length);
previousValue = element ? element.getAttribute('d') : null;
options = new PathOption(chart.element.id + '_MajorGridLine_' + index + '_' + axis.visibleLabels.length, 'transparent', axis.majorGridLines.width, axis.majorGridLines.color || chart.themeStyle.majorGridLine, null, null, majorGrid);
appendChildElement(chart.enableCanvas, this.element, chart.renderer.drawPath(options), chart.redraw, true, 'x', 'y', null, previousValue, true);
}
}
}
if (axis.majorTickLines.width > 0) {
vector = CoefficientToVector(valueToPolarCoefficient(axis.visibleLabels[0].value, axis), this.startAngle);
for (var i = 0; i < axis.visibleLabels.length; i++) {
radius = chart.radius * valueToCoefficient(axis.visibleLabels[i].value, axis);
x1 = this.centerX + radius * vector.x;
y1 = this.centerY + radius * vector.y;
x2 = x1 + (axis.majorTickLines.height * (Math.cos(angle * Math.PI / 180)) * (axis.tickPosition === 'Inside' && chart.enableRtl ? -1 : axis.tickPosition === 'Inside' ? 1 : axis.tickPosition === 'Outside' && chart.enableRtl ? 1 : -1));
y2 = y1 + (axis.majorTickLines.height * (Math.sin(angle * Math.PI / 180)) * (axis.tickPosition === 'Inside' && chart.enableRtl ? -1 : axis.tickPosition === 'Inside' ? 1 : axis.tickPosition === 'Outside' && chart.enableRtl ? 1 : -1));
majorTick = 'M ' + x1 + ' ' + y1 + ' L ' + x2 + ' ' + y2;
this.renderTickLine(axis, index, majorTick, '', i);
}
}
};
PolarRadarPanel.prototype.renderRadarGrid = function (radius, majorGrid, chart) {
var vector;
var vector2;
var x1;
var y1;
var x2;
var y2;
for (var i = 0, len = chart.primaryXAxis.visibleLabels.length; i < len; i++) {
vector = CoefficientToVector(valueToPolarCoefficient(chart.primaryXAxis.visibleLabels[i].value, chart.primaryXAxis), this.startAngle);
if (i + 1 < len) {
vector2 = CoefficientToVector(valueToPolarCoefficient(chart.primaryXAxis.visibleLabels[i + 1].value, chart.primaryXAxis), this.startAngle);
}
else {
vector2 = CoefficientToVector(valueToPolarCoefficient(chart.primaryXAxis.visibleLabels[0].value, chart.primaryXAxis), this.startAngle);
}
x1 = this.centerX + radius * vector.x;
y1 = this.centerY + radius * vector.y;
x2 = this.centerX + radius * vector2.x;
y2 = this.centerY + radius * vector2.y;
majorGrid = majorGrid.concat((i ? 'L ' : 'M ') + x1 + ' ' + y1 + ' ' + 'L ' + x2 + ' ' + y2 + ' ');
}
return majorGrid;
};
PolarRadarPanel.prototype.drawXAxisGridLine = function (axis, index) {
var chart = this.chart;
var tempInterval;
var vector;
var majorGrid = '';
var majorTick = '';
var minorGirdLine = '';
var minorTickLine = '';
var x1 = this.centerX;
var x2;
var y1 = this.centerY;
var y2;
var minorDirection;
var length = axis.visibleLabels.length;
//Gridlines
for (var i = 0; i < length; i++) {
tempInterval = axis.visibleLabels[i].value;
vector = CoefficientToVector(valueToPolarCoefficient(axis.visibleLabels[i].value, axis), this.startAngle);
x2 = this.centerX + chart.radius * vector.x;
y2 = this.centerY + chart.radius * vector.y;
var xLoc = x2 + (axis.majorTickLines.height * vector.x * (axis.tickPosition === 'Inside' ? -1 : 1));
var yLoc = y2 + (axis.majorTickLines.height * vector.y * (axis.tickPosition === 'Inside' ? -1 : 1));
majorGrid = 'M ' + x1 + ' ' + y1 + ' ' + 'L ' + x2 + ' ' + y2;
majorTick = 'M ' + x2 + ' ' + y2 + ' L ' + xLoc + ' ' + yLoc;
if (axis.minorTicksPerInterval > 0 && (axis.minorGridLines.width > 0 || axis.minorTickLines.width > 0)
&& axis.valueType !== 'Category' && chart.visibleSeries[0].type !== 'Radar') {
minorDirection = this.drawAxisMinorLine(axis, tempInterval, minorGirdLine, minorTickLine);
minorGirdLine = minorDirection[0];
minorTickLine = minorDirection[1];
}
this.renderTickLine(axis, index, majorTick, minorTickLine, i);
this.renderGridLine(axis, index, majorGrid, minorGirdLine, i);
}
};
PolarRadarPanel.prototype.drawAxisMinorLine = function (axis, tempInterval, minorGird, minorTick) {
var value = tempInterval;
var x;
var y;
var vector;
var range = axis.visibleRange;
var direction = [];
for (var j = 0; j < axis.minorTicksPerInterval; j++) {
value += (axis.valueType === 'DateTime' ? axis.dateTimeInterval : axis.visibleRange.interval) /
(axis.minorTicksPerInterval + 1);
if (inside(value, range)) {
vector = CoefficientToVector(valueToPolarCoefficient(value, axis), this.startAngle);
x = this.centerX + this.chart.radius * vector.x;
y = this.centerY + this.chart.radius * vector.y;
var tickXSize = x + (axis.minorTickLines.height * vector.x * (axis.tickPosition === 'Inside' ? -1 : 1));
var tickYSize = y + (axis.minorTickLines.height * vector.y * (axis.tickPosition === 'Inside' ? -1 : 1));
minorGird = minorGird.concat('M' + ' ' + this.centerX + ' ' + this.centerY
+ 'L ' + x + ' ' + y);
minorTick = minorTick.concat('M' + ' ' + x + ' ' + y + 'L' + ' ' + (tickXSize) + ' ' +
(tickYSize));
}
}
direction.push(minorGird);
direction.push(minorTick);
return direction;
};
/**
* To render the axis label.
*
* @param {Axis} axis axis
* @param {number} index index
* @returns {void}
* @private
*/
PolarRadarPanel.prototype.drawXAxisLabels = function (axis, index) {
this.visibleAxisLabelRect = [];
var legendRect;
if (this.chart.legendModule) {
legendRect = this.chart.legendModule.legendBounds;
}
var chart = this.chart;
var pointX = 0;
var pointY = 0;
var labelElement = chart.renderer.createGroup({ id: chart.element.id + 'AxisLabels' + index });
var options;
var vector;
var labelText;
var firstLabelX;
var islabelInside = axis.labelPosition === 'Inside';
var padding = 5;
var lastLabelX;
var label;
var textAnchor = '';
var isIntersect;
var labelRegions = [];
var isLabelVisible = [];
isLabelVisible[0] = true;
var intersectType = axis.labelIntersectAction;
var ticksbwtLabel = axis.valueType === 'Category' && axis.labelPlacement === 'BetweenTicks' ? 0.5 : 0;
var radius = chart.radius + axis.majorTickLines.height;
radius = (islabelInside) ? -radius : radius;
//Initializing the label template for xAxis
if (axis.labelTemplate) {
var templateId = chart.element.id + '_XAxisLabelTemplate_Collection';
chart.xAxisLabelTemplate = createElement('div', {
id: templateId
});
}
for (var i = 0, len = axis.visibleLabels.length; i < len; i++) {
isIntersect = false;
vector = CoefficientToVector(valueToPolarCoefficient(axis.visibleLabels[i].value + ticksbwtLabel, axis), this.startAngle);
if (!isNaN(vector.x) && !isNaN(vector.y)) {
pointX = this.centerX + (radius + axis.majorTickLines.height + padding) * vector.x;
pointY = this.centerY + (radius + axis.majorTickLines.height + padding) * vector.y;
textAnchor = parseFloat(pointX.toFixed(1)) === parseFloat(this.centerX.toFixed(1)) ? 'middle' :
((pointX < this.centerX && !islabelInside) || (pointX > this.centerX && islabelInside)) ? 'end' : 'start';
}
label = axis.visibleLabels[i];
labelText = label.text;
// to trim axis labels based on available size
if ((axis.enableTrim || intersectType === 'Trim') && !axis.enableWrap && !axis.labelTemplate) {
var originalText = axis.visibleLabels[i].originalText;
var trimText = void 0;
var size = void 0;
var labelPosition = axis.labelPosition;
var chartWidth = chart.availableSize.width;
var textLength = originalText.length;
for (var i_1 = textLength - 1; i_1 >= 0; --i_1) {
trimText = originalText.substring(0, i_1) + '...';
size = measureText(trimText, axis.labelStyle, this.chart.themeStyle.axisLabelFont).width;
if (pointX === chartWidth / 2 ? (pointX - size / 2 >= 0 && pointX + size / 2 <= chartWidth) :
((labelPosition === 'Outside' && ((pointX >= chartWidth / 2 && pointX + size <= chartWidth) ||
(pointX <= chartWidth / 2 && pointX - size >= 0))) || (labelPosition === 'Inside' &&
(pointX + size <= chartWidth / 2 || pointX - size >= chartWidth / 2)))) {
labelText = i_1 === textLength - 1 ? originalText : trimText;
label.size.width = measureText(labelText, axis.labelStyle, this.chart.themeStyle.axisLabelFont).width;
label.text = labelText;
break;
}
}
}
// fix for label style not working in axisLabelRender event issue
if (!axis.labelTemplate) {
labelRegions[i] = this.getLabelRegion(pointX, pointY, label, textAnchor);
}
if (i === 0) {
firstLabelX = pointX;
}
else if (i === axis.visibleLabels.length - 1 && axis.valueType !== 'Category' && !axis.labelTemplate) {
lastLabelX = measureText(labelText, axis.labelStyle, this.chart.themeStyle.axisLabelFont).height;
lastLabelX += pointX;
labelText = (lastLabelX > firstLabelX) ? '' : labelText;
}
// Label intersect action (Hide) perform here
if (i !== 0 && intersectType === 'Hide' && !axis.labelTemplate) {
for (var j = i; j >= 0; j--) {
j = (j === 0) ? 0 : ((j === i) ? (j - 1) : j);
if (isLabelVisible[j] && isOverlap(labelRegions[i], labelRegions[j])) {
isIntersect = true;
isLabelVisible[i] = false;
break;
}
else {
isLabelVisible[i] = true;
}
}
}
if (!isIntersect && legendRect && !axis.labelTemplate) {
isIntersect = isOverlap(labelRegions[i], legendRect);
if (isIntersect) {
var width = this.getAvailableSpaceToTrim(legendRect, labelRegions[i]);
if (width > 0) {
labelText = textTrim(width, axis.visibleLabels[i].originalText, axis.labelStyle, this.chart.enableRtl, this.chart.themeStyle.axisLabelFont);
isIntersect = false;
}
}
}
options = new TextOption(chart.element.id + index + '_AxisLabel_' + i, pointX, pointY, !chart.enableRtl ? textAnchor : textAnchor === 'end' ? 'start' : textAnchor === 'start' ? 'end' : textAnchor, labelText, '', 'central');
if (isIntersect) {
continue; // If the label is intersect, the label render is ignored.
}
if (!axis.labelTemplate) {
this.visibleAxisLabelRect.push(labelRegions[i]);
}
if (axis.labelTemplate) {
var chartBorderStartX = chart.border.width * 0.5;
var chartBorderEndX = chartBorderStartX + (chart.availableSize.width - chart.border.width);
var templateX = options.x;
var templateY = options.y;
var templateSize = new Size(label.size.width, label.size.height);
// Horizontal alignment
if (textAnchor === 'middle') {
templateX -= templateSize.width / 2;
}
else if (textAnchor === 'end') {
templateX -= templateSize.width;
}
// Boundary checks
if (templateX < chartBorderStartX) {
var overflow = chartBorderStartX - templateX;
templateSize.width = Math.max(0, templateSize.width - overflow);
templateX = chartBorderStartX;
}
else if (textAnchor === 'start' && (templateX + templateSize.width > chartBorderEndX)) {
var overflow = (templateX + templateSize.width) - chartBorderEndX;
templateSize.width = Math.max(0, templateSize.width - overflow);
}
// Vertical alignment
if (vector.y < -0.5) { // Top
templateY -= templateSize.height;
}
else if (vector.y > 0.5) { // Bottom
// No adjustment needed
}
else { // Sides
templateY -= templateSize.height / 2;
}
var labelTemplateId = chart.element.id + '_XAxisLabelTemplate_' + index + '_' + i;
// Create a container div for template
var labelDiv = createElement('div', {
id: labelTemplateId,
styles: "position:absolute; pointer-events:none; z-index:1; left:" + templateX + "px; top:" + templateY + "px; width:" + templateSize.width + "px; height:" + templateSize.height + "px;"
});
// Create the template element
var templateElement = createTemplate(labelDiv, i, axis.labelTemplate, chart, label);
chart.xAxisLabelTemplate.appendChild(templateElement);
}
else {
textElement(chart.renderer, options, label.labelStyle, label.labelStyle.color || chart.themeStyle.axisLabelFont.color, labelElement, false, chart.redraw, true, true, null, null, null, null, chart.enableCanvas, null, chart.themeStyle.axisLabelFont);
}
}
if (!this.chart.enableCanvas && !axis.labelTemplate) {
this.element.appendChild(labelElement);
}
};
/**
* To get available space to trim.
*
* @param {Rect} legendRect legendRect
* @param {Rect} labelRect labelRect
* @returns {number} available space value
*/
PolarRadarPanel.prototype.getAvailableSpaceToTrim = function (legendRect, labelRect) {
var legendX1 = legendRect.x;
var legendX2 = legendX1 + legendRect.width;
var labelX1 = labelRect.x;
var labelX2 = labelX1 + labelRect.width;
var width = 0;
if (labelX1 > legendX1 && labelX1 < legendX2 && labelX2 > legendX2) {
width = labelX2 - legendX2;
}
else if (labelX1 > legendX1 && labelX1 < legendX2 && labelX2 < legendX2) {
width = 0;
}
else if (labelX2 > legendX1 && labelX2 < legendX2 && labelX1 < legendX1) {
width = legendX1 - labelX1;
}
else if (labelX2 > legendX1 && labelX2 > legendX2 && labelX1 < legendX1) {
width = legendX1 - labelX1;
}
return width;
};
/**
* Getting axis label bounds
*
* @param {number} pointX pointX
* @param {number} pointY pointY
* @param {VisibleLabels} label label
* @param {string} anchor anchor
* @returns {Rect} label region
*/
PolarRadarPanel.prototype.getLabelRegion = function (pointX, pointY, label, anchor) {
if (anchor === 'middle') {
pointX -= (label.size.width / 2);
}
else if (anchor === 'end') {
pointX -= label.size.width;
}
pointY -= (label.size.height / 2);
return new Rect(pointX, pointY, label.size.width, label.size.height);
};
PolarRadarPanel.prototype.renderTickLine = function (axis, index, majorTickLine, minorTickLine, gridIndex) {
var tickOptions;
var chart = this.chart;
var direction;
var element;
if (axis.majorTickLines.width > 0) {
element = getElement(chart.element.id + '_MajorTickLine_' + index + '_' + gridIndex);
direction = element ? element.getAttribute('d') : null;
tickOptions = new PathOption(chart.element.id + '_MajorTickLine_' + index + '_' + gridIndex, 'transparent', axis.majorTickLines.width, axis.majorTickLines.color || chart.themeStyle.majorTickLine, null, null, majorTickLine);
/**
* I252450
* When we click the center of the marker which is plotted in the axis, selection did not work is fixed
* Cause: Instead of marker id, axis Tick line id is obtained while clicking
* Fix: Pointer events set to none for tick lines
*/
element = chart.renderer.drawPath(tickOptions);
this.setPointerEventNone(element);
appendChildElement(chart.enableCanvas, chart.yAxisElements, element, chart.redraw, true, 'x', 'y', null, direction);
}
if (axis.minorTickLines.width > 0) {
element = getElement(chart.element.id + '_MinorTickLine_' + index + '_' + gridIndex);
direction = element ? element.getAttribute('d') : null;
tickOptions = new PathOption(chart.element.id + '_MinorTickLine_' + index + '_' + gridIndex, 'transparent', axis.minorTickLines.width, axis.minorTickLines.color || chart.themeStyle.minorTickLine, null, null, minorTickLine);
/**
* I252450
* When we click the center of the marker which is plotted in the axis, selection did not work is fixed
* Cause: Instead of marker id, axis Tick line id is obtained while clicking
* Fix: Pointer events set to none for tick lines
*/
element = chart.renderer.drawPath(tickOptions);
this.setPointerEventNone(element);
appendChildElement(chart.enableCanvas, chart.yAxisElements, element, chart.redraw, true, 'x', 'y', null, direction);
}
};
PolarRadarPanel.prototype.renderGridLine = function (axis, index, majorGrid, minorGird, gridIndex) {
var chart = this.chart;
var gridOptions;
var direction;
var element;
if (axis.majorGridLines.width > 0) {
element = getElement(chart.element.id + '_MajorGridLine_' + index + '_' + gridIndex);
direction = element ? element.getAttribute('d') : null;
gridOptions = new PathOption(chart.element.id + '_MajorGridLine_' + index + '_' + gridIndex, 'transparent', axis.majorGridLines.width, axis.majorGridLines.color || chart.themeStyle.majorGridLine, null, axis.majorGridLines.dashArray, majorGrid);
appendChildElement(chart.enableCanvas, this.element, chart.renderer.drawPath(gridOptions), chart.redraw, true, 'x', 'y', null, direction);
}
if (axis.minorGridLines.width > 0) {
element = getElement(chart.element.id + '_MinorGridLine_' + index + '_' + gridIndex);
direction = element ? element.getAttribute('d') : null;
gridOptions = new PathOption(chart.element.id + '_MinorGridLine_' + index + '_' + gridIndex, 'transparent', axis.minorGridLines.width, axis.minorGridLines.color || chart.themeStyle.minorGridLine, null, axis.minorGridLines.dashArray, minorGird);
appendChildElement(chart.enableCanvas, this.element, chart.renderer.drawPath(gridOptions), chart.redraw, true, 'x', 'y', null, direction);
}
};
PolarRadarPanel.prototype.setPointerEventNone = function (element) {
if (element) {
element.style.pointerEvents = 'none';
}
};
return PolarRadarPanel;
}(LineBase));
export { PolarRadarPanel };