backgroundColor: color(window.chartColors.red).alpha(0.2).rgbString(),
borderColor: window.chartColors.red,
data: [
- randomScalingFactor(),
- randomScalingFactor(),
- randomScalingFactor(),
- randomScalingFactor(),
randomScalingFactor(),
- randomScalingFactor(),
+ randomScalingFactor(),
+ randomScalingFactor(),
+ randomScalingFactor(),
+ randomScalingFactor(),
+ randomScalingFactor(),
randomScalingFactor()
]
}, {
backgroundColor: color(window.chartColors.blue).alpha(0.2).rgbString(),
borderColor: window.chartColors.blue,
data: [
- randomScalingFactor(),
- randomScalingFactor(),
- randomScalingFactor(),
- randomScalingFactor(),
randomScalingFactor(),
- randomScalingFactor(),
+ randomScalingFactor(),
+ randomScalingFactor(),
+ randomScalingFactor(),
+ randomScalingFactor(),
+ randomScalingFactor(),
randomScalingFactor()
]
}, {
backgroundColor: color(window.chartColors.green).alpha(0.2).rgbString(),
borderColor: window.chartColors.green,
data: [
- randomScalingFactor(),
- randomScalingFactor(),
- randomScalingFactor(),
- randomScalingFactor(),
randomScalingFactor(),
- randomScalingFactor(),
+ randomScalingFactor(),
+ randomScalingFactor(),
+ randomScalingFactor(),
+ randomScalingFactor(),
+ randomScalingFactor(),
randomScalingFactor()
]
}]
Chart.plugins.register({
afterDatasetsDraw: function(chartInstance, easing) {
// To only draw at the end of animation, check for easing === 1
- var ctx = chartInstance.chart.ctx;
+ var ctx = chartInstance.ctx;
chartInstance.data.datasets.forEach(function (dataset, i) {
var meta = chartInstance.getDatasetMeta(i);
document.getElementById('randomizeData').addEventListener('click', function() {
barChartData.datasets.forEach(function(dataset) {
- dataset.data = dataset.data.map(function() {
+ dataset.data = dataset.data.map(function() {
return randomScalingFactor();
})
});
var xScale = me.getScaleForId(meta.xAxisID);
var stackCount = me.getStackCount();
- var tickWidth = xScale.width / xScale.ticks.length;\r
+ var tickWidth = xScale.width / xScale.ticks.length;
var categoryWidth = tickWidth * xScale.options.categoryPercentage;
var categorySpacing = (tickWidth - (tickWidth * xScale.options.categoryPercentage)) / 2;
var fullBarWidth = categoryWidth / stackCount;
if (xScale.options.barThickness) {
return xScale.options.barThickness;
}
- return ruler.barWidth;\r
+ return ruler.barWidth;
},
// Get stack index from the given dataset index accounting for stacks and the fact that not all bars are visible
(yScale.options.stacked === undefined && meta.stack !== undefined)) {
var base = yScale.getBaseValue();
var sumPos = base,
- sumNeg = base;\r
+ sumNeg = base;
for (var i = 0; i < datasetIndex; i++) {
var ds = me.chart.data.datasets[i];
draw: function(ease) {
var me = this;
+ var chart = me.chart;
var easingDecimal = ease || 1;
var metaData = me.getMeta().data;
var dataset = me.getDataset();
var i, len;
- Chart.canvasHelpers.clipArea(me.chart.chart.ctx, me.chart.chartArea);
+ Chart.canvasHelpers.clipArea(chart.ctx, chart.chartArea);
for (i = 0, len = metaData.length; i < len; ++i) {
var d = dataset.data[i];
if (d !== null && d !== undefined && !isNaN(d)) {
metaData[i].transition(easingDecimal).draw();
}
}
- Chart.canvasHelpers.unclipArea(me.chart.chart.ctx);
+ Chart.canvasHelpers.unclipArea(chart.ctx);
},
setHoverStyle: function(rectangle) {
}
}
- return stacks.length - 1;\r
+ return stacks.length - 1;
},
calculateBarX: function(index, datasetIndex) {
(xScale.options.stacked === undefined && meta.stack !== undefined)) {
var base = xScale.getBaseValue();
var sumPos = base,
- sumNeg = base;\r
+ sumNeg = base;
for (var i = 0; i < datasetIndex; i++) {
var ds = me.chart.data.datasets[i];
draw: function(ease) {
var me = this;
+ var chart = me.chart;
var meta = me.getMeta();
var points = meta.data || [];
var easingDecimal = ease || 1;
points[i].transition(easingDecimal);
}
- Chart.canvasHelpers.clipArea(me.chart.chart.ctx, me.chart.chartArea);
+ Chart.canvasHelpers.clipArea(chart.ctx, chart.chartArea);
// Transition and Draw the line
- if (lineEnabled(me.getDataset(), me.chart.options)) {
+ if (lineEnabled(me.getDataset(), chart.options)) {
meta.dataset.transition(easingDecimal).draw();
}
- Chart.canvasHelpers.unclipArea(me.chart.chart.ctx);
+ Chart.canvasHelpers.unclipArea(chart.ctx);
// Draw the points
for (i=0, ilen=points.length; i<ilen; ++i) {
- points[i].draw(me.chart.chartArea);
+ points[i].draw(chart.chartArea);
}
},
// Before init plugin notification
plugins.notify(me, 'beforeInit');
- helpers.retinaScale(me.chart);
+ helpers.retinaScale(me);
me.bindEvents();
},
clear: function() {
- helpers.clear(this.chart);
+ helpers.clear(this);
return this;
},
resize: function(silent) {
var me = this;
- var chart = me.chart;
var options = me.options;
- var canvas = chart.canvas;
- var aspectRatio = (options.maintainAspectRatio && chart.aspectRatio) || null;
+ var canvas = me.canvas;
+ var aspectRatio = (options.maintainAspectRatio && me.aspectRatio) || null;
// the canvas render width and height will be casted to integers so make sure that
// the canvas display style uses the same integer values to avoid blurring effect.
var newWidth = Math.floor(helpers.getMaximumWidth(canvas));
var newHeight = Math.floor(aspectRatio? newWidth / aspectRatio : helpers.getMaximumHeight(canvas));
- if (chart.width === newWidth && chart.height === newHeight) {
+ if (me.width === newWidth && me.height === newHeight) {
return;
}
- canvas.width = chart.width = newWidth;
- canvas.height = chart.height = newHeight;
+ canvas.width = me.width = newWidth;
+ canvas.height = me.height = newHeight;
canvas.style.width = newWidth + 'px';
canvas.style.height = newHeight + 'px';
- helpers.retinaScale(chart);
+ helpers.retinaScale(me);
if (!silent) {
// Notify any plugins about the resize
var scale = new scaleClass({
id: scaleOptions.id,
options: scaleOptions,
- ctx: me.chart.ctx,
+ ctx: me.ctx,
chart: me
});
return;
}
- Chart.layoutService.update(this, this.chart.width, this.chart.height);
+ Chart.layoutService.update(this, this.width, this.height);
/**
* Provided for backward compatibility, use `afterLayout` instead.
destroy: function() {
var me = this;
- var canvas = me.chart.canvas;
+ var canvas = me.canvas;
var meta, i, ilen;
me.stop();
if (canvas) {
me.unbindEvents();
- helpers.clear(me.chart);
- platform.releaseContext(me.chart.ctx);
- me.chart.canvas = null;
- me.chart.ctx = null;
+ helpers.clear(me);
+ platform.releaseContext(me.ctx);
+ me.canvas = null;
+ me.ctx = null;
}
plugins.notify(me, 'destroy');
},
toBase64Image: function() {
- return this.chart.canvas.toDataURL.apply(this.chart.canvas, arguments);
+ return this.canvas.toDataURL.apply(this.canvas, arguments);
},
initToolTip: function() {
var me = this;
me.tooltip = new Chart.Tooltip({
- _chart: me.chart,
+ _chart: me,
_chartInstance: me,
_data: me.data,
_options: me.options.tooltips
var me = this;
var type = me.datasetElementType;
return type && new type({
- _chart: me.chart.chart,
+ _chart: me.chart,
_datasetIndex: me.index
});
},
var me = this;
var type = me.dataElementType;
return type && new type({
- _chart: me.chart.chart,
+ _chart: me.chart,
_datasetIndex: me.index,
_index: index
});
}
function indexMode(chart, e, options) {
- var position = getRelativePosition(e, chart.chart);
+ var position = getRelativePosition(e, chart);
var distanceMetric = function(pt1, pt2) {
return Math.abs(pt1.x - pt2.x);
};
// Helper function for different modes
modes: {
single: function(chart, e) {
- var position = getRelativePosition(e, chart.chart);
+ var position = getRelativePosition(e, chart);
var elements = [];
parseVisibleItems(chart, function(element) {
* @return {Chart.Element[]} Array of elements that are under the point. If none are found, an empty array is returned
*/
dataset: function(chart, e, options) {
- var position = getRelativePosition(e, chart.chart);
+ var position = getRelativePosition(e, chart);
var items = options.intersect ? getIntersectItems(chart, position) : getNearestItems(chart, position, false);
if (items.length > 0) {
* @return {Chart.Element[]} Array of elements that are under the point. If none are found, an empty array is returned
*/
point: function(chart, e) {
- var position = getRelativePosition(e, chart.chart);
+ var position = getRelativePosition(e, chart);
return getIntersectItems(chart, position);
},
* @return {Chart.Element[]} Array of elements that are under the point. If none are found, an empty array is returned
*/
nearest: function(chart, e, options) {
- var position = getRelativePosition(e, chart.chart);
+ var position = getRelativePosition(e, chart);
var nearestItems = getNearestItems(chart, position, options.intersect);
// We have multiple items at the same distance from the event. Now sort by smallest
* @return {Chart.Element[]} Array of elements that are under the point. If none are found, an empty array is returned
*/
x: function(chart, e, options) {
- var position = getRelativePosition(e, chart.chart);
+ var position = getRelativePosition(e, chart);
var items = [];
var intersectsItem = false;
* @return {Chart.Element[]} Array of elements that are under the point. If none are found, an empty array is returned
*/
y: function(chart, e, options) {
- var position = getRelativePosition(e, chart.chart);
+ var position = getRelativePosition(e, chart);
var items = [];
var intersectsItem = false;
function createNewLegendAndAttach(chartInstance, legendOpts) {
var legend = new Chart.Legend({
- ctx: chartInstance.chart.ctx,
+ ctx: chartInstance.ctx,
options: legendOpts,
chart: chartInstance
});
function createNewTitleBlockAndAttach(chartInstance, titleOpts) {
var title = new Chart.Title({
- ctx: chartInstance.chart.ctx,
+ ctx: chartInstance.ctx,
options: titleOpts,
chart: chartInstance
});
},
addEventListener: function(chart, type, listener) {
- var canvas = chart.chart.canvas;
+ var canvas = chart.canvas;
if (type === 'resize') {
// Note: the resize event is not supported on all browsers.
- addResizeListener(canvas.parentNode, listener, chart.chart);
+ addResizeListener(canvas.parentNode, listener, chart);
return;
}
var stub = listener._chartjs || (listener._chartjs = {});
var proxies = stub.proxies || (stub.proxies = {});
var proxy = proxies[chart.id + '_' + type] = function(event) {
- listener(fromNativeEvent(event, chart.chart));
+ listener(fromNativeEvent(event, chart));
};
helpers.addEvent(canvas, type, proxy);
},
removeEventListener: function(chart, type, listener) {
- var canvas = chart.chart.canvas;
+ var canvas = chart.canvas;
if (type === 'resize') {
// Note: the resize event is not supported on all browsers.
removeResizeListener(canvas.parentNode, listener);
describe('Chart.Controller', function() {
function waitForResize(chart, callback) {
- var resizer = chart.chart.canvas.parentNode._chartjs.resizer;
+ var resizer = chart.canvas.parentNode._chartjs.resizer;
var content = resizer.contentWindow || resizer;
var state = content.document.readyState || 'complete';
var handler = function() {
}
});
- var wrapper = chart.chart.canvas.parentNode;
+ var wrapper = chart.canvas.parentNode;
expect(wrapper.childNodes.length).toBe(1);
expect(wrapper.firstChild.tagName).toBe('CANVAS');
});
rw: 300, rh: 350,
});
- var wrapper = chart.chart.canvas.parentNode;
+ var wrapper = chart.canvas.parentNode;
wrapper.style.width = '455px';
waitForResize(chart, function() {
expect(chart).toBeChartOfSize({
rw: 300, rh: 350,
});
- var wrapper = chart.chart.canvas.parentNode;
+ var wrapper = chart.canvas.parentNode;
wrapper.style.height = '455px';
waitForResize(chart, function() {
expect(chart).toBeChartOfSize({
rw: 320, rh: 350,
});
- var wrapper = chart.chart.canvas.parentNode;
+ var wrapper = chart.canvas.parentNode;
wrapper.style.height = '355px';
wrapper.style.width = '455px';
waitForResize(chart, function() {
}
});
- var canvas = chart.chart.canvas;
+ var canvas = chart.canvas;
canvas.style.display = 'block';
waitForResize(chart, function() {
expect(chart).toBeChartOfSize({
}
});
- var wrapper = chart.chart.canvas.parentNode;
+ var wrapper = chart.canvas.parentNode;
wrapper.style.display = 'block';
waitForResize(chart, function() {
expect(chart).toBeChartOfSize({
rw: 320, rh: 350,
});
- var wrapper = chart.chart.canvas.parentNode;
+ var wrapper = chart.canvas.parentNode;
var parent = wrapper.parentNode;
parent.removeChild(wrapper);
parent.appendChild(wrapper);
rw: 300, rh: 150,
});
- var wrapper = chart.chart.canvas.parentNode;
+ var wrapper = chart.canvas.parentNode;
wrapper.style.width = '450px';
waitForResize(chart, function() {
expect(chart).toBeChartOfSize({
rw: 320, rh: 160,
});
- var wrapper = chart.chart.canvas.parentNode;
+ var wrapper = chart.canvas.parentNode;
wrapper.style.height = '455px';
waitForResize(chart, function() {
expect(chart).toBeChartOfSize({
}
});
- var wrapper = chart.chart.canvas.parentNode;
+ var wrapper = chart.canvas.parentNode;
var resizer = wrapper.firstChild;
expect(wrapper.childNodes.length).toBe(2);
}
});
- chart.chart.canvas.parentNode.style.width = '400px';
+ chart.canvas.parentNode.style.width = '400px';
waitForResize(chart, function() {
chart.destroy();
var meta1 = chartInstance.getDatasetMeta(1);
var point = meta0.data[1];
- var node = chartInstance.chart.canvas;
+ var node = chartInstance.canvas;
var rect = node.getBoundingClientRect();
var evt = {
});
// Trigger an event at (0, 0)
- var node = chartInstance.chart.canvas;
+ var node = chartInstance.canvas;
var evt = {
view: window,
bubbles: true,
var meta1 = chartInstance.getDatasetMeta(1);
var point = meta0.data[1];
- var node = chartInstance.chart.canvas;
+ var node = chartInstance.canvas;
var rect = node.getBoundingClientRect();
var evt = {
var meta0 = chartInstance.getDatasetMeta(0);
var meta1 = chartInstance.getDatasetMeta(1);
- var node = chartInstance.chart.canvas;
+ var node = chartInstance.canvas;
var rect = node.getBoundingClientRect();
var evt = {
var meta = chartInstance.getDatasetMeta(0);
var point = meta.data[1];
- var node = chartInstance.chart.canvas;
+ var node = chartInstance.canvas;
var rect = node.getBoundingClientRect();
var evt = {
}
});
- var node = chartInstance.chart.canvas;
+ var node = chartInstance.canvas;
var rect = node.getBoundingClientRect();
var evt = {
// Trigger an event over top of the
var meta = chartInstance.getDatasetMeta(1);
- var node = chartInstance.chart.canvas;
+ var node = chartInstance.canvas;
var evt = {
view: window,
bubbles: true,
y: (meta0.data[1]._view.y + meta1.data[1]._view.y) / 2
};
- var node = chartInstance.chart.canvas;
+ var node = chartInstance.canvas;
var rect = node.getBoundingClientRect();
var evt = {
view: window,
y: (meta0.data[1]._view.y + meta1.data[1]._view.y) / 2
};
- var node = chartInstance.chart.canvas;
+ var node = chartInstance.canvas;
var rect = node.getBoundingClientRect();
var evt = {
view: window,
var meta = chartInstance.getDatasetMeta(1);
var point = meta.data[1];
- var node = chartInstance.chart.canvas;
+ var node = chartInstance.canvas;
var rect = node.getBoundingClientRect();
var evt = {
view: window,
y: meta0.data[1]._view.y
};
- var node = chartInstance.chart.canvas;
+ var node = chartInstance.canvas;
var rect = node.getBoundingClientRect();
var evt = {
view: window,
y: meta0.data[1]._view.y
};
- var node = chartInstance.chart.canvas;
+ var node = chartInstance.canvas;
var rect = node.getBoundingClientRect();
var evt = {
view: window,
y: meta0.data[1]._view.y
};
- var node = chartInstance.chart.canvas;
+ var node = chartInstance.canvas;
var rect = node.getBoundingClientRect();
var evt = {
view: window,
y: meta0.data[1]._view.y
};
- var node = chartInstance.chart.canvas;
+ var node = chartInstance.canvas;
var rect = node.getBoundingClientRect();
var evt = {
view: window,
y: meta0.data[1]._view.y
};
- var node = chartInstance.chart.canvas;
+ var node = chartInstance.canvas;
var rect = node.getBoundingClientRect();
var evt = {
view: window,
y: meta0.data[1]._view.y
};
- var node = chartInstance.chart.canvas;
+ var node = chartInstance.canvas;
var rect = node.getBoundingClientRect();
var evt = {
view: window,
y: meta0.data[1]._view.y
};
- var node = chartInstance.chart.canvas;
+ var node = chartInstance.canvas;
var rect = node.getBoundingClientRect();
var evt = {
view: window,
var meta = chartInstance.getDatasetMeta(0);
var point = meta.data[1];
- var node = chartInstance.chart.canvas;
+ var node = chartInstance.canvas;
var rect = node.getBoundingClientRect();
var evt = new MouseEvent('mousemove', {
var meta = chartInstance.getDatasetMeta(0);
var point = meta.data[1];
- var node = chartInstance.chart.canvas;
+ var node = chartInstance.canvas;
var rect = node.getBoundingClientRect();
var evt = new MouseEvent('mousemove', {
var meta = chartInstance.getDatasetMeta(0);
var point = meta.data[1];
- var node = chartInstance.chart.canvas;
+ var node = chartInstance.canvas;
var rect = node.getBoundingClientRect();
var evt = new MouseEvent('mousemove', {
var meta = chartInstance.getDatasetMeta(0);
var point = meta.data[1];
- var node = chartInstance.chart.canvas;
+ var node = chartInstance.canvas;
var rect = node.getBoundingClientRect();
var evt = new MouseEvent('mousemove', {
var meta0 = chartInstance.getDatasetMeta(0);
var point0 = meta0.data[1];
- var node = chartInstance.chart.canvas;
+ var node = chartInstance.canvas;
var rect = node.getBoundingClientRect();
var evt = new MouseEvent('mousemove', {
var meta0 = chartInstance.getDatasetMeta(0);
var point0 = meta0.data[1];
- var node = chartInstance.chart.canvas;
+ var node = chartInstance.canvas;
var rect = node.getBoundingClientRect();
var evt = new MouseEvent('mousemove', {
var datasetIndex = 0;
var meta = chartInstance.getDatasetMeta(datasetIndex);
var point = meta.data[pointIndex];
- var node = chartInstance.chart.canvas;
+ var node = chartInstance.canvas;
var rect = node.getBoundingClientRect();
var evt = new MouseEvent('mousemove', {
view: window,
function toBeValidChart() {
return {
compare: function(actual) {
- var chart = actual && actual.chart;
var message = null;
- if (!(actual instanceof Chart.Controller)) {
- message = 'Expected ' + actual + ' to be an instance of Chart.Controller';
- } else if (!(chart instanceof Chart)) {
- message = 'Expected chart to be an instance of Chart';
- } else if (!(chart.canvas instanceof HTMLCanvasElement)) {
+ if (!(actual instanceof Chart)) {
+ message = 'Expected ' + actual + ' to be an instance of Chart';
+ } else if (!(actual.canvas instanceof HTMLCanvasElement)) {
message = 'Expected canvas to be an instance of HTMLCanvasElement';
- } else if (!(chart.ctx instanceof CanvasRenderingContext2D)) {
+ } else if (!(actual.ctx instanceof CanvasRenderingContext2D)) {
message = 'Expected context to be an instance of CanvasRenderingContext2D';
- } else if (typeof chart.height !== 'number' || !isFinite(chart.height)) {
+ } else if (typeof actual.height !== 'number' || !isFinite(actual.height)) {
message = 'Expected height to be a strict finite number';
- } else if (typeof chart.width !== 'number' || !isFinite(chart.width)) {
+ } else if (typeof actual.width !== 'number' || !isFinite(actual.width)) {
message = 'Expected width to be a strict finite number';
}
}
var message = null;
- var chart = actual.chart;
- var canvas = chart.ctx.canvas;
+ var canvas = actual.ctx.canvas;
var style = getComputedStyle(canvas);
var pixelRatio = window.devicePixelRatio;
var dh = parseInt(style.height, 10);
var orw = rw / pixelRatio;
// sanity checks
- if (chart.height !== orh) {
- message = 'Expected chart height ' + chart.height + ' to be equal to original render height ' + orh;
- } else if (chart.width !== orw) {
- message = 'Expected chart width ' + chart.width + ' to be equal to original render width ' + orw;
+ if (actual.height !== orh) {
+ message = 'Expected chart height ' + actual.height + ' to be equal to original render height ' + orh;
+ } else if (actual.width !== orw) {
+ message = 'Expected chart width ' + actual.width + ' to be equal to original render width ' + orw;
}
// validity checks
describe('Platform.dom', function() {
function waitForResize(chart, callback) {
- var resizer = chart.chart.canvas.parentNode._chartjs.resizer;
+ var resizer = chart.canvas.parentNode._chartjs.resizer;
var content = resizer.contentWindow || resizer;
var state = content.document.readyState || 'complete';
var handler = function() {
var chart = new Chart(canvasId);
expect(chart).toBeValidChart();
- expect(chart.chart.canvas).toBe(canvas);
- expect(chart.chart.ctx).toBe(canvas.getContext('2d'));
+ expect(chart.canvas).toBe(canvas);
+ expect(chart.ctx).toBe(canvas.getContext('2d'));
chart.destroy();
});
var chart = new Chart(canvas);
expect(chart).toBeValidChart();
- expect(chart.chart.canvas).toBe(canvas);
- expect(chart.chart.ctx).toBe(canvas.getContext('2d'));
+ expect(chart.canvas).toBe(canvas);
+ expect(chart.ctx).toBe(canvas.getContext('2d'));
chart.destroy();
});
var chart = new Chart(context);
expect(chart).toBeValidChart();
- expect(chart.chart.canvas).toBe(canvas);
- expect(chart.chart.ctx).toBe(context);
+ expect(chart.canvas).toBe(canvas);
+ expect(chart.ctx).toBe(context);
chart.destroy();
});
var chart = new Chart([canvas]);
expect(chart).toBeValidChart();
- expect(chart.chart.canvas).toBe(canvas);
- expect(chart.chart.ctx).toBe(canvas.getContext('2d'));
+ expect(chart.canvas).toBe(canvas);
+ expect(chart.ctx).toBe(canvas.getContext('2d'));
chart.destroy();
});
describe('controller.destroy', function() {
it('should reset context to default values', function() {
var chart = acquireChart({});
- var context = chart.chart.ctx;
+ var context = chart.ctx;
chart.destroy();
}
});
- var canvas = chart.chart.canvas;
+ var canvas = chart.canvas;
var wrapper = canvas.parentNode;
wrapper.style.width = '475px';
waitForResize(chart, function() {
plugins: [plugin]
});
- var node = chart.chart.canvas;
+ var node = chart.canvas;
var rect = node.getBoundingClientRect();
var clientX = (rect.left + rect.right) / 2;
var clientY = (rect.top + rect.bottom) / 2;
expect(notifiedEvent.type).toBe(evt.type);
// Relative Position
- expect(notifiedEvent.x).toBe(chart.chart.width / 2);
- expect(notifiedEvent.y).toBe(chart.chart.height / 2);
+ expect(notifiedEvent.x).toBe(chart.width / 2);
+ expect(notifiedEvent.y).toBe(chart.height / 2);
});
});
});