@progress/kendo-charts
Version:
Kendo UI platform-independent Charts library
256 lines (208 loc) • 6.75 kB
JavaScript
import { Chart } from '../chart';
import { BAR, BULLET, PIE, COLUMN, VERTICAL_BULLET } from '../chart/constants';
import { addClass, deepExtend, elementSize, getSpacing, inArray, isArray, isNumber, setDefaultOptions } from '../common';
import SharedTooltip from './shared-tooltip';
var DEAULT_BAR_WIDTH = 150;
var DEAULT_BULLET_WIDTH = 150;
var NO_CROSSHAIR = [ BAR, BULLET ];
function hide(children) {
var state = [];
for (var idx = 0; idx < children.length; idx++) {
var child = children[idx];
state[idx] = child.style.display;
child.style.display = "none";
}
return state;
}
function show(children, state) {
for (var idx = 0; idx < children.length; idx++) {
children[idx].style.display = state[idx];
}
}
function wrapNumber(value) {
return isNumber(value) ? [ value ] : value;
}
var Sparkline = (function (Chart) {
function Sparkline () {
Chart.apply(this, arguments);
}
if ( Chart ) Sparkline.__proto__ = Chart;
Sparkline.prototype = Object.create( Chart && Chart.prototype );
Sparkline.prototype.constructor = Sparkline;
Sparkline.prototype._setElementClass = function _setElementClass (element) {
addClass(element, 'k-sparkline');
};
Sparkline.prototype._initElement = function _initElement (element) {
Chart.prototype._initElement.call(this, element);
this._initialWidth = Math.floor(elementSize(element).width);
};
Sparkline.prototype._resize = function _resize () {
var element = this.element;
var state = hide(element.childNodes);
this._initialWidth = Math.floor(elementSize(element).width);
show(element.childNodes, state);
Chart.prototype._resize.call(this);
};
Sparkline.prototype._modelOptions = function _modelOptions () {
var chartOptions = this.options;
var stage = this._surfaceWrap();
var displayState = hide(stage.childNodes);
var space = document.createElement('span');
space.innerHTML = ' ';
stage.appendChild(space);
var options = deepExtend({
width: this._autoWidth,
height: elementSize(stage).height,
transitions: chartOptions.transitions
}, chartOptions.chartArea, {
inline: true,
align: false
});
elementSize(stage, {
width: options.width,
height: options.height
});
stage.removeChild(space);
show(stage.childNodes, displayState);
if (this.surface) {
this.surface.resize();
}
return options;
};
Sparkline.prototype._surfaceWrap = function _surfaceWrap () {
if (!this.stage) {
var stage = this.stage = document.createElement('span');
this.element.appendChild(stage);
}
return this.stage;
};
Sparkline.prototype._createPlotArea = function _createPlotArea (skipSeries) {
var plotArea = Chart.prototype._createPlotArea.call(this, skipSeries);
this._autoWidth = this._initialWidth || this._calculateWidth(plotArea);
return plotArea;
};
Sparkline.prototype._calculateWidth = function _calculateWidth (plotArea) {
var options = this.options;
var margin = getSpacing(options.chartArea.margin);
var charts = plotArea.charts;
var stage = this._surfaceWrap();
var total = 0;
for (var i = 0; i < charts.length; i++) {
var currentChart = charts[i];
var firstSeries = (currentChart.options.series || [])[0];
if (!firstSeries) {
continue;
}
if (firstSeries.type === BAR) {
return DEAULT_BAR_WIDTH;
}
if (firstSeries.type === BULLET) {
return DEAULT_BULLET_WIDTH;
}
if (firstSeries.type === PIE) {
return elementSize(stage).height;
}
var categoryAxis = currentChart.categoryAxis;
if (categoryAxis) {
var pointsCount = categoryAxis.categoriesCount() *
(!currentChart.options.isStacked && inArray(firstSeries.type, [ COLUMN, VERTICAL_BULLET ]) ? currentChart.seriesOptions.length : 1);
total = Math.max(total, pointsCount);
}
}
var size = total * options.pointWidth;
if (size > 0) {
size += margin.left + margin.right;
}
return size;
};
Sparkline.prototype._createSharedTooltip = function _createSharedTooltip (options) {
return new SharedTooltip(this._plotArea, options);
};
Sparkline.normalizeOptions = function normalizeOptions (userOptions) {
var options = wrapNumber(userOptions);
if (isArray(options)) {
options = { seriesDefaults: { data: options } };
} else {
options = deepExtend({}, options);
}
if (!options.series) {
options.series = [ { data: wrapNumber(options.data) } ];
}
deepExtend(options, {
seriesDefaults: {
type: options.type
}
});
if (inArray(options.series[0].type, NO_CROSSHAIR) ||
inArray(options.seriesDefaults.type, NO_CROSSHAIR)) {
options = deepExtend({}, {
categoryAxis: {
crosshair: {
visible: false
}
}
}, options);
}
return options;
};
return Sparkline;
}(Chart));
setDefaultOptions(Sparkline, {
chartArea: {
margin: 2
},
axisDefaults: {
visible: false,
majorGridLines: {
visible: false
},
valueAxis: {
narrowRange: true
}
},
seriesDefaults: {
type: "line",
area: {
line: {
width: 0.5
}
},
bar: {
stack: true
},
padding: 2,
width: 0.5,
overlay: {
gradient: null
},
highlight: {
visible: false
},
border: {
width: 0
},
markers: {
size: 2,
visible: false
}
},
tooltip: {
visible: true,
shared: true
},
categoryAxis: {
crosshair: {
visible: true,
tooltip: {
visible: false
}
}
},
legend: {
visible: false
},
transitions: false,
pointWidth: 5,
panes: [ { clip: false } ]
});
export default Sparkline;