import registry from './core.registry';
import Config, {determineAxis, getIndexAxis} from './core.config';
import {retinaScale} from '../helpers/helpers.dom';
-import {each, callback as callCallback, uid, valueOrDefault, _elementsEqual} from '../helpers/helpers.core';
+import {each, callback as callCallback, uid, valueOrDefault, _elementsEqual, isNullOrUndef} from '../helpers/helpers.core';
import {clearCanvas, clipArea, unclipArea, _isPointInArea} from '../helpers/helpers.canvas';
// @ts-ignore
import {version} from '../../package.json';
this.canvas = canvas;
this.width = width;
this.height = height;
- this.aspectRatio = height ? width / height : null;
this._options = options;
+ // Store the previously used aspect ratio to determine if a resize
+ // is needed during updates. Do this after _options is set since
+ // aspectRatio uses a getter
+ this._aspectRatio = this.aspectRatio;
this._layers = [];
this._metasets = [];
this._stacks = undefined;
}
}
+ get aspectRatio() {
+ const {options: {aspectRatio, maintainAspectRatio}, width, height, _aspectRatio} = this;
+ if (!isNullOrUndef(aspectRatio)) {
+ // If aspectRatio is defined in options, use that.
+ return aspectRatio;
+ }
+
+ if (maintainAspectRatio && _aspectRatio) {
+ // If maintainAspectRatio is truthly and we had previously determined _aspectRatio, use that
+ return _aspectRatio;
+ }
+
+ // Calculate
+ return height ? width / height : null;
+ }
+
get data() {
return this.config.data;
}
me.width = newSize.width;
me.height = newSize.height;
+ me._aspectRatio = me.aspectRatio;
retinaScale(me, newRatio, true);
me.notifyPlugins('resize', {size: newSize});
});
});
+ describe('config.options.aspectRatio', function() {
+ it('should resize the canvas when the aspectRatio option changes', function(done) {
+ var chart = acquireChart({
+ options: {
+ responsive: true,
+ aspectRatio: 1,
+ }
+ }, {
+ canvas: {
+ style: '',
+ width: 400,
+ },
+ });
+
+ expect(chart).toBeChartOfSize({
+ dw: 400, dh: 400,
+ rw: 400, rh: 400,
+ });
+
+ waitForResize(chart, function() {
+ expect(chart).toBeChartOfSize({
+ dw: 400, dh: 200,
+ rw: 400, rh: 200,
+ });
+
+ done();
+ });
+ chart.options.aspectRatio = 2;
+ chart.resize();
+ });
+ });
+
describe('controller.reset', function() {
it('should reset the chart elements', function() {
var chart = acquireChart({