From 5e6fb37646d7d04465c3cd094f724228e2078639 Mon Sep 17 00:00:00 2001 From: Jukka Kurkela Date: Tue, 14 Jan 2020 02:33:25 +0200 Subject: [PATCH] Detect stack change (#6947) * Detect stack change * Add test --- src/core/core.datasetController.js | 19 +++++++++- test/specs/core.datasetController.tests.js | 44 ++++++++++++++++++++++ 2 files changed, 62 insertions(+), 1 deletion(-) diff --git a/src/core/core.datasetController.js b/src/core/core.datasetController.js index c240d7844..db0bcd736 100644 --- a/src/core/core.datasetController.js +++ b/src/core/core.datasetController.js @@ -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); + } }, /** diff --git a/test/specs/core.datasetController.tests.js b/test/specs/core.datasetController.tests.js index 8d04dbee3..b69afb6c5 100644 --- a/test/specs/core.datasetController.tests.js +++ b/test/specs/core.datasetController.tests.js @@ -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]; -- 2.47.2