const labelsChanged = me._labelCheck();
const scaleChanged = me._scaleCheck();
const meta = me._cachedMeta;
+ const dataset = me.getDataset();
+ let stackChanged = false;
// make sure cached _stacked status is current
meta._stacked = isStacked(meta.vScale, meta);
+ // detect change in stack option
+ if (meta.stack !== dataset.stack) {
+ stackChanged = true;
+ // remove values from old stack
+ meta._parsed.forEach(function(parsed) {
+ delete parsed._stacks[meta.vScale.id][meta.index];
+ });
+ meta.stack = dataset.stack;
+ }
+
// Re-sync meta data in case the user replaced the data array or if we missed
// any updates and so make sure that we handle number of datapoints changing.
- me.resyncElements(dataChanged | labelsChanged | scaleChanged);
+ me.resyncElements(dataChanged | labelsChanged | scaleChanged | stackChanged);
+
+ // if stack changed, update stack values for the whole dataset
+ if (stackChanged) {
+ updateStacks(me, meta._parsed);
+ }
},
/**
expect(meta.yAxisID).toBe('secondYScaleID');
});
+ it('should re-synchronize stacks when stack is changed', function() {
+ var chart = acquireChart({
+ type: 'bar',
+ data: {
+ labels: ['a', 'b'],
+ datasets: [{
+ data: [1, 10],
+ stack: '1'
+ }, {
+ data: [2, 20],
+ stack: '2'
+ }, {
+ data: [3, 30],
+ stack: '1'
+ }]
+ }
+ });
+
+ expect(chart._stacks).toEqual({
+ 'x.y.1.bar': {
+ 0: {0: 1, 2: 3},
+ 1: {0: 10, 2: 30}
+ },
+ 'x.y.2.bar': {
+ 0: {1: 2},
+ 1: {1: 20}
+ }
+ });
+
+ chart.data.datasets[2].stack = '2';
+ chart.update();
+
+ expect(chart._stacks).toEqual({
+ 'x.y.1.bar': {
+ 0: {0: 1},
+ 1: {0: 10}
+ },
+ 'x.y.2.bar': {
+ 0: {1: 2, 2: 3},
+ 1: {1: 20, 2: 30}
+ }
+ });
+ });
+
it('should cleanup attached properties when the reference changes or when the chart is destroyed', function() {
var data0 = [0, 1, 2, 3, 4, 5];
var data1 = [6, 7, 8];