mirror of
https://github.com/chartjs/Chart.js.git
synced 2024-10-08 05:09:08 +02:00
165 lines
4.6 KiB
JavaScript
165 lines
4.6 KiB
JavaScript
"use strict";
|
|
|
|
module.exports = function(Chart) {
|
|
|
|
var helpers = Chart.helpers;
|
|
var noop = helpers.noop;
|
|
|
|
// Base class for all dataset controllers (line, bar, etc)
|
|
Chart.DatasetController = function(chart, datasetIndex) {
|
|
this.initialize.call(this, chart, datasetIndex);
|
|
};
|
|
|
|
helpers.extend(Chart.DatasetController.prototype, {
|
|
|
|
/**
|
|
* Element type used to generate a meta dataset (e.g. Chart.element.Line).
|
|
* @type {Chart.core.element}
|
|
*/
|
|
datasetElementType: null,
|
|
|
|
/**
|
|
* Element type used to generate a meta data (e.g. Chart.element.Point).
|
|
* @type {Chart.core.element}
|
|
*/
|
|
dataElementType: null,
|
|
|
|
initialize: function(chart, datasetIndex) {
|
|
var me = this;
|
|
me.chart = chart;
|
|
me.index = datasetIndex;
|
|
me.linkScales();
|
|
me.addElements();
|
|
},
|
|
|
|
updateIndex: function(datasetIndex) {
|
|
this.index = datasetIndex;
|
|
},
|
|
|
|
linkScales: function() {
|
|
var me = this;
|
|
var meta = me.getMeta();
|
|
var dataset = me.getDataset();
|
|
|
|
if (meta.xAxisID === null) {
|
|
meta.xAxisID = dataset.xAxisID || me.chart.options.scales.xAxes[0].id;
|
|
}
|
|
if (meta.yAxisID === null) {
|
|
meta.yAxisID = dataset.yAxisID || me.chart.options.scales.yAxes[0].id;
|
|
}
|
|
},
|
|
|
|
getDataset: function() {
|
|
return this.chart.data.datasets[this.index];
|
|
},
|
|
|
|
getMeta: function() {
|
|
return this.chart.getDatasetMeta(this.index);
|
|
},
|
|
|
|
getScaleForId: function(scaleID) {
|
|
return this.chart.scales[scaleID];
|
|
},
|
|
|
|
reset: function() {
|
|
this.update(true);
|
|
},
|
|
|
|
createMetaDataset: function() {
|
|
var me = this;
|
|
var type = me.datasetElementType;
|
|
return type && new type({
|
|
_chart: me.chart.chart,
|
|
_datasetIndex: me.index
|
|
});
|
|
},
|
|
|
|
createMetaData: function(index) {
|
|
var me = this;
|
|
var type = me.dataElementType;
|
|
return type && new type({
|
|
_chart: me.chart.chart,
|
|
_datasetIndex: me.index,
|
|
_index: index
|
|
});
|
|
},
|
|
|
|
addElements: function() {
|
|
var me = this;
|
|
var meta = me.getMeta();
|
|
var data = me.getDataset().data || [];
|
|
var metaData = meta.data;
|
|
var i, ilen;
|
|
|
|
for (i=0, ilen=data.length; i<ilen; ++i) {
|
|
metaData[i] = metaData[i] || me.createMetaData(meta, i);
|
|
}
|
|
|
|
meta.dataset = meta.dataset || me.createMetaDataset();
|
|
},
|
|
|
|
addElementAndReset: function(index) {
|
|
var me = this;
|
|
var element = me.createMetaData(index);
|
|
me.getMeta().data.splice(index, 0, element);
|
|
me.updateElement(element, index, true);
|
|
},
|
|
|
|
buildOrUpdateElements: function() {
|
|
// Handle the number of data points changing
|
|
var meta = this.getMeta(),
|
|
md = meta.data,
|
|
numData = this.getDataset().data.length,
|
|
numMetaData = md.length;
|
|
|
|
// Make sure that we handle number of datapoints changing
|
|
if (numData < numMetaData) {
|
|
// Remove excess bars for data points that have been removed
|
|
md.splice(numData, numMetaData - numData);
|
|
} else if (numData > numMetaData) {
|
|
// Add new elements
|
|
for (var index = numMetaData; index < numData; ++index) {
|
|
this.addElementAndReset(index);
|
|
}
|
|
}
|
|
},
|
|
|
|
update: noop,
|
|
|
|
draw: function(ease) {
|
|
var easingDecimal = ease || 1;
|
|
helpers.each(this.getMeta().data, function(element) {
|
|
element.transition(easingDecimal).draw();
|
|
});
|
|
},
|
|
|
|
removeHoverStyle: function(element, elementOpts) {
|
|
var dataset = this.chart.data.datasets[element._datasetIndex],
|
|
index = element._index,
|
|
custom = element.custom || {},
|
|
valueOrDefault = helpers.getValueAtIndexOrDefault,
|
|
model = element._model;
|
|
|
|
model.backgroundColor = custom.backgroundColor ? custom.backgroundColor : valueOrDefault(dataset.backgroundColor, index, elementOpts.backgroundColor);
|
|
model.borderColor = custom.borderColor ? custom.borderColor : valueOrDefault(dataset.borderColor, index, elementOpts.borderColor);
|
|
model.borderWidth = custom.borderWidth ? custom.borderWidth : valueOrDefault(dataset.borderWidth, index, elementOpts.borderWidth);
|
|
},
|
|
|
|
setHoverStyle: function(element) {
|
|
var dataset = this.chart.data.datasets[element._datasetIndex],
|
|
index = element._index,
|
|
custom = element.custom || {},
|
|
valueOrDefault = helpers.getValueAtIndexOrDefault,
|
|
getHoverColor = helpers.getHoverColor,
|
|
model = element._model;
|
|
|
|
model.backgroundColor = custom.hoverBackgroundColor ? custom.hoverBackgroundColor : valueOrDefault(dataset.hoverBackgroundColor, index, getHoverColor(model.backgroundColor));
|
|
model.borderColor = custom.hoverBorderColor ? custom.hoverBorderColor : valueOrDefault(dataset.hoverBorderColor, index, getHoverColor(model.borderColor));
|
|
model.borderWidth = custom.hoverBorderWidth ? custom.hoverBorderWidth : valueOrDefault(dataset.hoverBorderWidth, index, model.borderWidth);
|
|
}
|
|
|
|
});
|
|
|
|
|
|
Chart.DatasetController.extend = helpers.inherits;
|
|
}; |