this.chart = instance;
this.config = instance.config;
- this.data = this.config.data;
this.options = this.config.options = helpers.configMerge(Chart.defaults.global, Chart.defaults[this.config.type], this.config.options || {});
this.id = helpers.uid();
+ Object.defineProperty(this, 'data', {
+ get: function() {
+ return this.config.data;
+ },
+ });
+
//Add the chart instance to the global namespace
Chart.instances[this.id] = this;
var scale = new ScaleClass({
ctx: this.chart.ctx,
options: xAxisOptions,
- data: this.data,
+ chart: this,
id: xAxisOptions.id,
});
var scale = new ScaleClass({
ctx: this.chart.ctx,
options: yAxisOptions,
- data: this.data,
+ chart: this,
id: yAxisOptions.id,
});
var scale = new ScaleClass({
ctx: this.chart.ctx,
options: this.options.scale,
- data: this.data,
- chart: this.chart,
+ chart: this,
});
this.scale = scale;
if (!dataset.type) {
dataset.type = this.config.type;
}
+
var type = dataset.type;
types.push(type);
+
if (dataset.controller) {
dataset.controller.updateIndex(datasetIndex);
return;
}
+
dataset.controller = new Chart.controllers[type](this, datasetIndex);
if (resetNewControllers) {
dataset.controller.reset();
}
}, this);
+
if (types.length > 1) {
for (var i = 1; i < types.length; i++) {
if (types[i] != types[i - 1]) {
},
update: function update(animationDuration, lazy) {
+ // In case the entire data object changed
+ this.tooltip._data = this.data;
+
Chart.scaleService.update(this, this.chart.width, this.chart.height);
// Make sure dataset controllers are updated and new controllers are reset
var DatasetScale = Chart.Scale.extend({
buildTicks: function(index) {
- this.ticks = this.data.labels;
+ this.ticks = this.chart.data.labels;
},
getLabelForIndex: function(index, datasetIndex) {
getPixelForValue: function(value, index, datasetIndex, includeOffset) {
if (this.isHorizontal()) {
var innerWidth = this.width - (this.paddingLeft + this.paddingRight);
- var valueWidth = innerWidth / Math.max((this.data.labels.length - ((this.options.gridLines.offsetGridLines) ? 0 : 1)), 1);
+ var valueWidth = innerWidth / Math.max((this.chart.data.labels.length - ((this.options.gridLines.offsetGridLines) ? 0 : 1)), 1);
var widthOffset = (valueWidth * index) + this.paddingLeft;
if (this.options.gridLines.offsetGridLines && includeOffset) {
return this.left + Math.round(widthOffset);
} else {
var innerHeight = this.height - (this.paddingTop + this.paddingBottom);
- var valueHeight = innerHeight / Math.max((this.data.labels.length - ((this.options.gridLines.offsetGridLines) ? 0 : 1)), 1);
+ var valueHeight = innerHeight / Math.max((this.chart.data.labels.length - ((this.options.gridLines.offsetGridLines) ? 0 : 1)), 1);
var heightOffset = (valueHeight * index) + this.paddingTop;
if (this.options.gridLines.offsetGridLines && includeOffset) {
if (this.options.stacked) {
var valuesPerType = {};
- helpers.each(this.data.datasets, function(dataset) {
+ helpers.each(this.chart.data.datasets, function(dataset) {
if (valuesPerType[dataset.type] === undefined) {
valuesPerType[dataset.type] = {
positiveValues: [],
}, this);
} else {
- helpers.each(this.data.datasets, function(dataset) {
+ helpers.each(this.chart.data.datasets, function(dataset) {
if (helpers.isDatasetVisible(dataset) && (this.isHorizontal() ? dataset.xAxisID === this.id : dataset.yAxisID === this.id)) {
helpers.each(dataset.data, function(rawValue, index) {
var value = this.getRightValue(rawValue);
},
getLabelForIndex: function(index, datasetIndex) {
- return this.getRightValue(this.data.datasets[datasetIndex].data[index]);
+ return this.getRightValue(this.chart.data.datasets[datasetIndex].data[index]);
},
// Utils
if (this.options.stacked) {
var valuesPerType = {};
- helpers.each(this.data.datasets, function(dataset) {
+ helpers.each(this.chart.data.datasets, function(dataset) {
if (helpers.isDatasetVisible(dataset) && (this.isHorizontal() ? dataset.xAxisID === this.id : dataset.yAxisID === this.id)) {
if (valuesPerType[dataset.type] === undefined) {
valuesPerType[dataset.type] = [];
}, this);
} else {
- helpers.each(this.data.datasets, function(dataset) {
+ helpers.each(this.chart.data.datasets, function(dataset) {
if (helpers.isDatasetVisible(dataset) && (this.isHorizontal() ? dataset.xAxisID === this.id : dataset.yAxisID === this.id)) {
helpers.each(dataset.data, function(rawValue, index) {
var value = this.getRightValue(rawValue);
},
// Get the correct tooltip label
getLabelForIndex: function(index, datasetIndex) {
- return this.getRightValue(this.data.datasets[datasetIndex].data[index]);
+ return this.getRightValue(this.chart.data.datasets[datasetIndex].data[index]);
},
getPixelForTick: function(index, includeOffset) {
return this.getPixelForValue(this.tickValues[index], null, null, includeOffset);
var LinearRadialScale = Chart.Scale.extend({
getValueCount: function() {
- return this.data.labels.length;
+ return this.chart.data.labels.length;
},
setDimensions: function() {
// Set the unconstrained dimension before label rotation
this.min = null;
this.max = null;
- helpers.each(this.data.datasets, function(dataset) {
+ helpers.each(this.chart.data.datasets, function(dataset) {
if (helpers.isDatasetVisible(dataset)) {
helpers.each(dataset.data, function(rawValue, index) {
var value = this.getRightValue(rawValue);
this.zeroLineIndex = this.ticks.indexOf(0);
},
getLabelForIndex: function(index, datasetIndex) {
- return this.getRightValue(this.data.datasets[datasetIndex].data[index]);
+ return this.getRightValue(this.chart.data.datasets[datasetIndex].data[index]);
},
getCircumference: function() {
return ((Math.PI * 2) / this.getValueCount());
for (i = 0; i < this.getValueCount(); i++) {
// 5px to space the text slightly out - similar to what we do in the draw function.
pointPosition = this.getPointPosition(i, largestPossibleRadius);
- textWidth = this.ctx.measureText(this.options.ticks.callback(this.data.labels[i])).width + 5;
+ textWidth = this.ctx.measureText(this.options.ticks.callback(this.chart.data.labels[i])).width + 5;
if (i === 0 || i === this.getValueCount() / 2) {
// If we're at index zero, or exactly the middle, we're at exactly the top/bottom
// of the radar chart, so text will be aligned centrally, so we'll half it and compare
ctx.font = helpers.fontString(this.options.pointLabels.fontSize, this.options.pointLabels.fontStyle, this.options.pointLabels.fontFamily);
ctx.fillStyle = this.options.pointLabels.fontColor;
- var labelsCount = this.data.labels.length,
- halfLabelsCount = this.data.labels.length / 2,
+ var labelsCount = this.chart.data.labels.length,
+ halfLabelsCount = this.chart.data.labels.length / 2,
quarterLabelsCount = halfLabelsCount / 2,
upperHalf = (i < quarterLabelsCount || i > labelsCount - quarterLabelsCount),
exactQuarter = (i === quarterLabelsCount || i === labelsCount - quarterLabelsCount);
ctx.textBaseline = 'top';
}
- ctx.fillText(this.data.labels[i], pointLabelPosition.x, pointLabelPosition.y);
+ ctx.fillText(this.chart.data.labels[i], pointLabelPosition.x, pointLabelPosition.y);
}
}
}
// Only parse these once. If the dataset does not have data as x,y pairs, we will use
// these
var scaleLabelMoments = [];
- if (this.data.labels && this.data.labels.length > 0) {
- helpers.each(this.data.labels, function(label, index) {
+ if (this.chart.data.labels && this.chart.data.labels.length > 0) {
+ helpers.each(this.chart.data.labels, function(label, index) {
var labelMoment = this.parseTime(label);
if (this.options.time.round) {
labelMoment.startOf(this.options.time.round);
this.lastTick = null;
}
- helpers.each(this.data.datasets, function(dataset, datasetIndex) {
+ helpers.each(this.chart.data.datasets, function(dataset, datasetIndex) {
var momentsForDataset = [];
if (typeof dataset.data[0] === 'object') {
this.lastTick.endOf(this.tickUnit);
this.smallestLabelSeparation = this.width;
- helpers.each(this.data.datasets, function(dataset, datasetIndex) {
+ helpers.each(this.chart.data.datasets, function(dataset, datasetIndex) {
for (var i = 1; i < this.labelMoments[datasetIndex].length; i++) {
this.smallestLabelSeparation = Math.min(this.smallestLabelSeparation, this.labelMoments[datasetIndex][i].diff(this.labelMoments[datasetIndex][i - 1], this.tickUnit, true));
}
},
// Get tooltip label
getLabelForIndex: function(index, datasetIndex) {
- var label = this.data.labels && index < this.data.labels.length ? this.data.labels[index] : '';
+ var label = this.chart.data.labels && index < this.chart.data.labels.length ? this.chart.data.labels[index] : '';
- if (typeof this.data.datasets[datasetIndex].data[0] === 'object') {
- label = this.getRightValue(this.data.datasets[datasetIndex].data[index]);
+ if (typeof this.chart.data.datasets[datasetIndex].data[0] === 'object') {
+ label = this.getRightValue(this.chart.data.datasets[datasetIndex].data[index]);
}
return label;
var yScale = new VerticalScaleConstructor({
ctx: mockContext,
options: verticalScaleConfig,
- data: data,
+ chart: {
+ data: data
+ },
id: 'firstYScaleID'
});
var xScale = new HorizontalScaleConstructor({
ctx: mockContext,
options: horizontalScaleConfig,
- data: data,
+ chart: {
+ data: data
+ },
id: 'firstXScaleID'
});
var yScale = new VerticalScaleConstructor({
ctx: mockContext,
options: verticalScaleConfig,
- data: data,
+ chart: {
+ data: data
+ },
id: 'firstYScaleID'
});
var xScale = new HorizontalScaleConstructor({
ctx: mockContext,
options: horizontalScaleConfig,
- data: data,
+ chart: {
+ data: data
+ },
id: 'firstXScaleID'
});
var yScale = new VerticalScaleConstructor({
ctx: mockContext,
options: verticalScaleConfig,
- data: data,
+ chart: {
+ data: data
+ },
id: 'firstYScaleID'
});
var xScale = new HorizontalScaleConstructor({
ctx: mockContext,
options: horizontalScaleConfig,
- data: data,
+ chart: {
+ data: data
+ },
id: 'firstXScaleID'
});
var yScale = new VerticalScaleConstructor({
ctx: mockContext,
options: verticalScaleConfig,
- data: data,
+ chart: {
+ data: data
+ },
id: 'firstYScaleID'
});
var xScale = new HorizontalScaleConstructor({
ctx: mockContext,
options: horizontalScaleConfig,
- data: data,
+ chart: {
+ data: data
+ },
id: 'firstXScaleID'
});
var yScale = new VerticalScaleConstructor({
ctx: mockContext,
options: verticalScaleConfig,
- data: data,
+ chart: {
+ data: data
+ },
id: 'firstYScaleID'
});
var xScale = new HorizontalScaleConstructor({
ctx: mockContext,
options: horizontalScaleConfig,
- data: data,
+ chart: {
+ data: data
+ },
id: 'firstXScaleID'
});
var yScale = new VerticalScaleConstructor({
ctx: mockContext,
options: verticalScaleConfig,
- data: data,
+ chart: {
+ data: data
+ },
id: 'firstYScaleID'
});
var xScale = new HorizontalScaleConstructor({
ctx: mockContext,
options: horizontalScaleConfig,
- data: data,
+ chart: {
+ data: data
+ },
id: 'firstXScaleID'
});
var yScale = new VerticalScaleConstructor({
ctx: mockContext,
options: verticalScaleConfig,
- data: data,
+ chart: {
+ data: data
+ },
id: 'firstYScaleID'
});
var xScale = new HorizontalScaleConstructor({
ctx: mockContext,
options: horizontalScaleConfig,
- data: data,
+ chart: {
+ data: data
+ },
id: 'firstXScaleID'
});
var yScale = new VerticalScaleConstructor({
ctx: mockContext,
options: verticalScaleConfig,
- data: data,
+ chart: {
+ data: data
+ },
id: 'firstYScaleID'
});
var xScale = new HorizontalScaleConstructor({
ctx: mockContext,
options: horizontalScaleConfig,
- data: data,
+ chart: {
+ data: data
+ },
id: 'firstXScaleID'
});
var xScale = new XConstructor({
ctx: mockContext,
options: xScaleConfig,
- data: mockData,
+ chart: {
+ data: mockData
+ },
id: xScaleID
});
var yScale = new YConstructor({
ctx: mockContext,
options: yScaleConfig,
- data: mockData,
+ chart: {
+ data: mockData
+ },
id: yScaleID
});
var xScale = new XConstructor({
ctx: mockContext,
options: xScaleConfig,
- data: mockData,
+ chart: {
+ data: mockData
+ },
id: xScaleID
});
var yScale = new YConstructor({
ctx: mockContext,
options: yScaleConfig,
- data: mockData,
+ chart: {
+ data: mockData
+ },
id: yScaleID
});
var xScale = new XConstructor({
ctx: mockContext,
options: xScaleConfig,
- data: mockData,
+ chart: {
+ data: mockData
+ },
id: xScaleID
});
var yScale1 = new YConstructor({
ctx: mockContext,
options: yScaleConfig,
- data: mockData,
+ chart: {
+ data: mockData
+ },
id: yScaleID1
});
var yScale2 = new YConstructor({
ctx: mockContext,
options: yScaleConfig,
- data: mockData,
+ chart: {
+ data: mockData
+ },
id: yScaleID2
});
var scale = new ScaleConstructor({
ctx: mockContext,
options: scaleConfig,
- data: mockData,
+ chart: {
+ data: mockData
+ },
id: scaleID
});
var scale = new Constructor({
ctx: {},
options: config,
- data: mockData,
+ chart: {
+ data: mockData
+ },
id: scaleID
});
var scale = new Constructor({
ctx: mockContext,
options: config,
- data: mockData,
+ chart: {
+ data: mockData
+ },
id: scaleID
});
var scale = new Constructor({
ctx: mockContext,
options: config,
- data: mockData,
+ chart: {
+ data: mockData
+ },
id: scaleID
});
var scale = new Constructor({
ctx: {},
options: Chart.scaleService.getScaleDefaults('linear'), // use default config for scale
- data: mockData,
+ chart: {
+ data: mockData
+ },
id: scaleID
});
var scale = new Constructor({
ctx: {},
options: Chart.scaleService.getScaleDefaults('linear'), // use default config for scale
- data: mockData,
+ chart: {
+ data: mockData
+ },
id: scaleID
});
var verticalScale = new Constructor({
ctx: {},
options: config,
- data: mockData,
+ chart: {
+ data: mockData
+ },
id: scaleID
});
var horizontalScale = new Constructor({
ctx: {},
options: horizontalConfig,
- data: mockData,
+ chart: {
+ data: mockData
+ },
id: scaleID,
});
var scale = new Constructor({
ctx: {},
options: config,
- data: mockData,
+ chart: {
+ data: mockData
+ },
id: scaleID
});
var scale = new Constructor({
ctx: {},
options: config,
- data: mockData,
+ chart: {
+ data: mockData
+ },
id: scaleID
});
var scale = new Constructor({
ctx: {},
options: config,
- data: mockData,
+ chart: {
+ data: mockData
+ },
id: scaleID
});
var scale = new Constructor({
ctx: {},
options: config,
- data: mockData,
+ chart: {
+ data: mockData
+ },
id: scaleID
});
var scale = new Constructor({
ctx: {},
options: config,
- data: mockData,
+ chart: {
+ data: mockData
+ },
id: scaleID
});
var scale = new Constructor({
ctx: {},
options: config,
- data: mockData,
+ chart: {
+ data: mockData
+ },
id: scaleID
});
var scale = new Constructor({
ctx: {},
options: config,
- data: mockData,
+ chart: {
+ data: mockData
+ },
id: scaleID
});
var scale = new Constructor({
ctx: mockContext,
options: config,
- data: mockData,
+ chart: {
+ data: mockData
+ },
id: scaleID
});
var scale = new Constructor({
ctx: mockContext,
options: config,
- data: mockData,
+ chart: {
+ data: mockData
+ },
id: scaleID
});
var scale = new Constructor({
ctx: mockContext,
options: config,
- data: mockData,
+ chart: {
+ data: mockData
+ },
id: scaleID
});
var verticalScale = new Constructor({
ctx: mockContext,
options: config,
- data: mockData,
+ chart: {
+ data: mockData
+ },
id: scaleID
});
var horizontalScale = new Constructor({
ctx: mockContext,
options: horizontalConfig,
- data: mockData,
+ chart: {
+ data: mockData
+ },
id: scaleID,
});
var verticalScale = new Constructor({
ctx: mockContext,
options: config,
- data: mockData,
+ chart: {
+ data: mockData
+ },
id: scaleID
});
var horizontalScale = new Constructor({
ctx: mockContext,
options: config,
- data: mockData,
+ chart: {
+ data: mockData
+ },
id: scaleID
});
var horizontalScale = new Constructor({
ctx: mockContext,
options: config,
- data: mockData,
+ chart: {
+ data: mockData
+ },
id: scaleID
});
var verticalScale = new Constructor({
ctx: mockContext,
options: config,
- data: mockData,
+ chart: {
+ data: mockData
+ },
id: scaleID
});
var scale = new Constructor({
ctx: mockContext,
options: Chart.scaleService.getScaleDefaults('logarithmic'), // use default config for scale
- data: mockData,
+ chart: {
+ data: mockData,
+ },
id: scaleID
});
var scale = new Constructor({
ctx: mockContext,
options: Chart.scaleService.getScaleDefaults('logarithmic'), // use default config for scale
- data: mockData,
+ chart: {
+ data: mockData
+ },
id: scaleID
});
var verticalScale = new Constructor({
ctx: mockContext,
options: config,
- data: mockData,
+ chart: {
+ data: mockData
+ },
id: scaleID
});
var horizontalScale = new Constructor({
ctx: mockContext,
options: horizontalConfig,
- data: mockData,
+ chart: {
+ data: mockData
+ },
id: scaleID,
});
var scale = new Constructor({
ctx: mockContext,
options: config,
- data: mockData,
+ chart: {
+ data: mockData
+ },
id: scaleID
});
var scale = new Constructor({
ctx: mockContext,
options: config,
- data: mockData,
+ chart: {
+ data: mockData
+ },
id: scaleID
});
var scale = new Constructor({
ctx: mockContext,
options: config,
- data: mockData,
+ chart: {
+ data: mockData
+ },
id: scaleID
});
var scale = new Constructor({
ctx: {},
options: config,
- data: mockData,
+ chart: {
+ data: mockData
+ },
id: scaleID
});
var scale = new Constructor({
ctx: {},
options: config,
- data: mockData,
+ chart: {
+ data: mockData
+ },
id: scaleID
});
var scale = new Constructor({
ctx: mockContext,
options: config,
- data: mockData,
+ chart: {
+ data: mockData
+ },
id: scaleID
});
var scale = new Constructor({
ctx: mockContext,
options: config,
- data: mockData,
+ chart: {
+ data: mockData
+ },
id: scaleID
});
var verticalScale = new Constructor({
ctx: mockContext,
options: config,
- data: mockData,
+ chart: {
+ data: mockData
+ },
id: scaleID
});
var horizontalScale = new Constructor({
ctx: mockContext,
options: horizontalConfig,
- data: mockData,
+ chart: {
+ data: mockData
+ },
id: scaleID,
});
var scale = new Constructor({
ctx: mockContext,
options: Chart.scaleService.getScaleDefaults('radialLinear'), // use default config for scale
- data: mockData,
+ chart: {
+ data: mockData
+ },
id: scaleID,
});
var scale = new Constructor({
ctx: mockContext,
options: Chart.scaleService.getScaleDefaults('radialLinear'), // use default config for scale
- data: mockData,
+ chart: {
+ data: mockData
+ },
id: scaleID,
});
var scale = new Constructor({
ctx: mockContext,
options: Chart.scaleService.getScaleDefaults('radialLinear'), // use default config for scale
- data: mockData,
+ chart: {
+ data: mockData
+ },
id: scaleID,
});
var scale = new Constructor({
ctx: mockContext,
options: config,
- data: mockData,
+ chart: {
+ data: mockData
+ },
id: scaleID,
});
var scale = new Constructor({
ctx: mockContext,
options: config,
- data: mockData,
+ chart: {
+ data: mockData
+ },
id: scaleID,
});
var scale = new Constructor({
ctx: mockContext,
options: config,
- data: mockData,
+ chart: {
+ data: mockData
+ },
id: scaleID,
});
var scale = new Constructor({
ctx: mockContext,
options: config,
- data: mockData,
+ chart: {
+ data: mockData
+ },
id: scaleID,
});
var scale = new Constructor({
ctx: mockContext,
options: config,
- data: mockData,
+ chart: {
+ data: mockData
+ },
id: scaleID,
});
var scale = new Constructor({
ctx: mockContext,
options: config,
- data: mockData,
+ chart: {
+ data: mockData
+ },
id: scaleID,
});
var scale = new Constructor({
ctx: mockContext,
options: Chart.scaleService.getScaleDefaults('time'), // use default config for scale
- data: mockData,
+ chart: {
+ data: mockData
+ },
id: scaleID
});
var scale = new Constructor({
ctx: mockContext,
options: config, // use default config for scale
- data: mockData,
+ chart: {
+ data: mockData
+ },
id: scaleID
});
var scale = new Constructor({
ctx: mockContext,
options: config, // use default config for scale
- data: mockData,
+ chart: {
+ data: mockData
+ },
id: scaleID
});
var scale = new Constructor({
ctx: mockContext,
options: Chart.scaleService.getScaleDefaults('time'), // use default config for scale
- data: mockData,
+ chart: {
+ data: mockData
+ },
id: scaleID
});
var verticalScale = new Constructor({
ctx: mockContext,
options: verticalScaleConfig,
- data: mockData,
+ chart: {
+ data: mockData
+ },
id: scaleID
});
verticalScale.update(50, 400);