@progress/kendo-charts
Version:
Kendo UI platform-independent Charts library
218 lines (177 loc) • 6.9 kB
JavaScript
import { geometry as geo, drawing } from '@progress/kendo-drawing';
import { setDefaultOptions, deepExtend, defined } from '../../common';
import { BLACK } from '../../common/constants';
import { NumericAxis } from '../../core';
import { DEFAULT_LINE_WIDTH, INSIDE } from '../constants';
import { autoMajorUnit } from '../../core';
import { buildLabelElement, getRange } from '../utils';
var Path = drawing.Path;
var Group = drawing.Group;
var Point = geo.Point;
function renderAxisTick(tickRenderOptions, tickOptions) {
var position = tickRenderOptions.position;
var tickX = tickRenderOptions.tickX;
var tickY = tickRenderOptions.tickY;
var start, end;
if (tickRenderOptions.vertical) {
start = new Point(tickX, position);
end = new Point(tickX + tickOptions.size, position);
} else {
start = new Point(position, tickY);
end = new Point(position, tickY + tickOptions.size);
}
var tickPath = new Path({
stroke: {
color: tickOptions.color,
width: tickOptions.width
}
}).moveTo(start).lineTo(end);
return tickPath;
}
function renderTicks(tickGroup, tickPositions, tickRenderOptions, tickOptions) {
var count = tickPositions.length;
if (tickOptions.visible) {
var mirror = tickRenderOptions.mirror;
var lineBox = tickRenderOptions.lineBox;
for (var i = tickOptions.skip; i < count; i += tickOptions.step) {
if (i % tickOptions.skipUnit === 0) {
continue;
}
tickRenderOptions.tickX = mirror ? lineBox.x2 : lineBox.x2 - tickOptions.size;
tickRenderOptions.tickY = mirror ? lineBox.y1 - tickOptions.size : lineBox.y1;
tickRenderOptions.position = tickPositions[i];
tickGroup.append(renderAxisTick(tickRenderOptions, tickOptions));
}
}
}
var LinearScale = (function (NumericAxis) {
function LinearScale(options, service) {
var scaleOptions = options || {};
if (!defined(scaleOptions.reverse) && scaleOptions.vertical === false && (service || {}).rtl) {
scaleOptions = Object.assign({}, scaleOptions, {
reverse: true
});
}
NumericAxis.call(this, 0, 1, scaleOptions, service);
this.options.minorUnit = this.options.minorUnit || this.options.majorUnit / 10;
}
if ( NumericAxis ) LinearScale.__proto__ = NumericAxis;
LinearScale.prototype = Object.create( NumericAxis && NumericAxis.prototype );
LinearScale.prototype.constructor = LinearScale;
LinearScale.prototype.initUserOptions = function initUserOptions (options) {
var scaleOptions = deepExtend({}, this.options, options);
scaleOptions = deepExtend({}, scaleOptions , { labels: { mirror: scaleOptions.mirror } });
scaleOptions.majorUnit = scaleOptions.majorUnit || autoMajorUnit(scaleOptions.min, scaleOptions.max);
return scaleOptions;
};
LinearScale.prototype.initFields = function initFields () {
};
LinearScale.prototype.render = function render () {
var elements = this.elements = new Group();
var labels = this.renderLabels();
var scaleLine = this.renderLine();
var scaleTicks = this.renderTicks();
var ranges = this.renderRanges();
elements.append(scaleLine, labels, scaleTicks, ranges);
return elements;
};
LinearScale.prototype.renderRanges = function renderRanges () {
var this$1 = this;
var options = this.options;
var min = options.min;
var max = options.max;
var vertical = options.vertical;
var mirror = options.labels.mirror;
var ranges = options.ranges || [];
var elements = new Group();
var count = ranges.length;
var rangeSize = options.rangeSize || options.minorTicks.size / 2;
for (var i = 0; i < count; i++) {
var range = getRange(ranges[i], min, max);
var slot = this$1.getSlot(range.from, range.to);
var slotX = vertical ? this$1.lineBox() : slot;
var slotY = vertical ? slot : this$1.lineBox();
if (vertical) {
slotX.x1 -= rangeSize * (mirror ? -1 : 1);
} else {
slotY.y2 += rangeSize * (mirror ? -1 : 1);
}
elements.append(Path.fromRect(new geo.Rect([ slotX.x1, slotY.y1 ], [ slotX.x2 - slotX.x1, slotY.y2 - slotY.y1 ]), {
fill: { color: range.color, opacity: range.opacity },
stroke: { }
}));
}
return elements;
};
LinearScale.prototype.renderLabels = function renderLabels () {
var ref = this;
var labels = ref.labels;
var options = ref.options;
var elements = new Group();
for (var i = 0; i < labels.length; i++) {
elements.append(buildLabelElement(labels[i], options.labels));
}
return elements;
};
LinearScale.prototype.renderLine = function renderLine () {
var line = this.options.line;
var lineBox = this.lineBox();
var elements = new Group();
if (line.width > 0 && line.visible) {
var linePath = new Path({
stroke: {
color: line.color,
dashType: line.dashType,
width: line.width
}
});
linePath.moveTo(lineBox.x1, lineBox.y1).lineTo(lineBox.x2, lineBox.y2);
elements.append(linePath);
}
return elements;
};
LinearScale.prototype.renderTicks = function renderTicks$1 () {
var ticks = new Group();
var options = this.options;
var majorUnit = options.majorTicks.visible ? options.majorUnit : 0;
var tickRenderOptions = {
vertical: options.vertical,
mirror: options.labels.mirror,
lineBox: this.lineBox()
};
renderTicks(ticks, this.getMajorTickPositions(), tickRenderOptions, options.majorTicks);
renderTicks(ticks, this.getMinorTickPositions(), tickRenderOptions, deepExtend({}, {
skipUnit: majorUnit / options.minorUnit
}, options.minorTicks));
return ticks;
};
return LinearScale;
}(NumericAxis));
setDefaultOptions(LinearScale, {
min: 0,
max: 50,
majorTicks: {
size: 15,
align: INSIDE,
color: BLACK,
width: DEFAULT_LINE_WIDTH,
visible: true
},
minorTicks: {
size: 10,
align: INSIDE,
color: BLACK,
width: DEFAULT_LINE_WIDTH,
visible: true
},
line: {
width: DEFAULT_LINE_WIDTH
},
labels: {
position: INSIDE,
padding: 2
},
mirror: false,
_alignLines: false
});
export default LinearScale;