@progress/kendo-charts
Version:
Kendo UI platform-independent Charts library
251 lines (197 loc) • 8.07 kB
JavaScript
import { geometry as geom, drawing as draw } from '@progress/kendo-drawing';
import GridLinesMixin from './mixins/grid-lines-mixin';
import CategoryAxis from './category-axis';
import ShapeBuilder from './shape-builder';
import Ring from './ring';
import Box from './box';
import { COORD_PRECISION, ARC } from '../common/constants';
import { deepExtend, getSpacing, inArray, limitValue, map, rad, round, setDefaultOptions } from '../common';
var RadarCategoryAxis = (function (CategoryAxis) {
function RadarCategoryAxis () {
CategoryAxis.apply(this, arguments);
}
if ( CategoryAxis ) RadarCategoryAxis.__proto__ = CategoryAxis;
RadarCategoryAxis.prototype = Object.create( CategoryAxis && CategoryAxis.prototype );
RadarCategoryAxis.prototype.constructor = RadarCategoryAxis;
RadarCategoryAxis.prototype.range = function range () {
return { min: 0, max: this.options.categories.length };
};
RadarCategoryAxis.prototype.reflow = function reflow (box) {
this.box = box;
this.reflowLabels();
};
RadarCategoryAxis.prototype.lineBox = function lineBox () {
return this.box;
};
RadarCategoryAxis.prototype.reflowLabels = function reflowLabels () {
var this$1 = this;
var ref = this;
var labels = ref.labels;
var labelOptions = ref.options.labels;
var skip = labelOptions.skip || 0;
var step = labelOptions.step || 1;
var measureBox = new Box();
for (var i = 0; i < labels.length; i++) {
labels[i].reflow(measureBox);
var labelBox = labels[i].box;
labels[i].reflow(this$1.getSlot(skip + i * step).adjacentBox(
0, labelBox.width(), labelBox.height()
));
}
};
RadarCategoryAxis.prototype.intervals = function intervals (size, skipOption, stepOption, skipAngles) {
if ( skipAngles === void 0 ) skipAngles = false;
var options = this.options;
var categories = options.categories.length;
var divCount = categories / size || 1;
var divAngle = 360 / divCount;
var skip = skipOption || 0;
var step = stepOption || 1;
var divs = [];
var angle = 0;
for (var i = skip; i < divCount; i += step) {
if (options.reverse) {
angle = 360 - i * divAngle;
} else {
angle = i * divAngle;
}
angle = round(angle, COORD_PRECISION) % 360;
if (!(skipAngles && inArray(angle, skipAngles))) {
divs.push(angle);
}
}
return divs;
};
RadarCategoryAxis.prototype.majorIntervals = function majorIntervals () {
return this.intervals(1);
};
RadarCategoryAxis.prototype.minorIntervals = function minorIntervals () {
return this.intervals(0.5);
};
RadarCategoryAxis.prototype.intervalAngle = function intervalAngle (interval) {
return (360 + interval + this.options.startAngle) % 360;
};
RadarCategoryAxis.prototype.majorAngles = function majorAngles () {
var this$1 = this;
return map(this.majorIntervals(), function (interval) { return this$1.intervalAngle(interval); });
};
RadarCategoryAxis.prototype.createLine = function createLine () {
return [];
};
RadarCategoryAxis.prototype.majorGridLineAngles = function majorGridLineAngles (altAxis) {
var majorGridLines = this.options.majorGridLines;
return this.gridLineAngles(altAxis, 1, majorGridLines.skip, majorGridLines.step);
};
RadarCategoryAxis.prototype.minorGridLineAngles = function minorGridLineAngles (altAxis, skipMajor) {
var ref = this.options;
var minorGridLines = ref.minorGridLines;
var majorGridLines = ref.majorGridLines;
var majorGridLineAngles = skipMajor ? this.intervals(1, majorGridLines.skip, majorGridLines.step) : null;
return this.gridLineAngles(altAxis, 0.5, minorGridLines.skip, minorGridLines.step, majorGridLineAngles);
};
RadarCategoryAxis.prototype.radiusCallback = function radiusCallback (radius, altAxis, skipMajor) {
if (altAxis.options.type !== ARC) {
var minorAngle = rad(360 / (this.options.categories.length * 2));
var minorRadius = Math.cos(minorAngle) * radius;
var majorAngles = this.majorAngles();
var radiusCallback = function(angle) {
if (!skipMajor && inArray(angle, majorAngles)) {
return radius;
}
return minorRadius;
};
return radiusCallback;
}
};
RadarCategoryAxis.prototype.createPlotBands = function createPlotBands () {
var this$1 = this;
var plotBands = this.options.plotBands || [];
var group = this._plotbandGroup = new draw.Group({
zIndex: -1
});
for (var i = 0; i < plotBands.length; i++) {
var band = plotBands[i];
var slot = this$1.plotBandSlot(band);
var singleSlot = this$1.getSlot(band.from);
var head = band.from - Math.floor(band.from);
slot.startAngle += head * singleSlot.angle;
var tail = Math.ceil(band.to) - band.to;
slot.angle -= (tail + head) * singleSlot.angle;
var ring = ShapeBuilder.current.createRing(slot, {
fill: {
color: band.color,
opacity: band.opacity
},
stroke: {
opacity: band.opacity
}
});
group.append(ring);
}
this.appendVisual(group);
};
RadarCategoryAxis.prototype.plotBandSlot = function plotBandSlot (band) {
return this.getSlot(band.from, band.to - 1);
};
RadarCategoryAxis.prototype.getSlot = function getSlot (from, to) {
var options = this.options;
var justified = options.justified;
var box = this.box;
var divs = this.majorAngles();
var totalDivs = divs.length;
var slotAngle = 360 / totalDivs;
var fromValue = from;
if (options.reverse && !justified) {
fromValue = (fromValue + 1) % totalDivs;
}
fromValue = limitValue(Math.floor(fromValue), 0, totalDivs - 1);
var slotStart = divs[fromValue];
if (justified) {
slotStart = slotStart - slotAngle / 2;
if (slotStart < 0) {
slotStart += 360;
}
}
var toValue = limitValue(Math.ceil(to || fromValue), fromValue, totalDivs - 1);
var slots = toValue - fromValue + 1;
var angle = slotAngle * slots;
return new Ring(box.center(), 0, box.height() / 2, slotStart, angle);
};
RadarCategoryAxis.prototype.slot = function slot (from, to) {
var slot = this.getSlot(from, to);
var startAngle = slot.startAngle + 180;
var endAngle = startAngle + slot.angle;
return new geom.Arc([ slot.center.x, slot.center.y ], {
startAngle: startAngle,
endAngle: endAngle,
radiusX: slot.radius,
radiusY: slot.radius
});
};
RadarCategoryAxis.prototype.pointCategoryIndex = function pointCategoryIndex (point) {
var this$1 = this;
var length = this.options.categories.length;
var index = null;
for (var i = 0; i < length; i++) {
var slot = this$1.getSlot(i);
if (slot.containsPoint(point)) {
index = i;
break;
}
}
return index;
};
return RadarCategoryAxis;
}(CategoryAxis));
setDefaultOptions(RadarCategoryAxis, {
startAngle: 90,
labels: {
margin: getSpacing(10)
},
majorGridLines: {
visible: true
},
justified: true
});
deepExtend(RadarCategoryAxis.prototype, GridLinesMixin);
export default RadarCategoryAxis;