]> git.ipfire.org Git - thirdparty/Chart.js.git/commitdiff
Detect stack change (#6947)
authorJukka Kurkela <jukka.kurkela@gmail.com>
Tue, 14 Jan 2020 00:33:25 +0000 (02:33 +0200)
committerEvert Timberg <evert.timberg+github@gmail.com>
Tue, 14 Jan 2020 00:33:24 +0000 (19:33 -0500)
* Detect stack change
* Add test

src/core/core.datasetController.js
test/specs/core.datasetController.tests.js

index c240d7844759c4c8b460b4701a761b5aca5e8af1..db0bcd736018d3ebbf9eccba521e69a905aee4b2 100644 (file)
@@ -443,13 +443,30 @@ helpers.extend(DatasetController.prototype, {
                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);
+               }
        },
 
        /**
index 8d04dbee330be7bd8eed0f51cea4c963299fff9c..b69afb6c5d4c37cbe4f9d4a57e79b3b54d55ac9a 100644 (file)
@@ -388,6 +388,50 @@ describe('Chart.DatasetController', function() {
                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];