From: Jukka Kurkela Date: Wed, 24 Feb 2021 22:31:17 +0000 (+0200) Subject: Fix stacking bug when a dataset is removed (#8520) X-Git-Tag: v3.0.0-beta.12~9 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=8796a1ba1d83878995fa64ad6a48b8342d597b44;p=thirdparty%2FChart.js.git Fix stacking bug when a dataset is removed (#8520) --- diff --git a/src/core/core.controller.js b/src/core/core.controller.js index 7997acbda..45890e054 100644 --- a/src/core/core.controller.js +++ b/src/core/core.controller.js @@ -107,6 +107,7 @@ class Chart { this._options = options; this._layers = []; this._metasets = []; + this._stacks = undefined; this.boxes = []; this.currentDevicePixelRatio = undefined; this.chartArea = undefined; @@ -370,8 +371,11 @@ class Chart { */ _removeUnreferencedMetasets() { const me = this; - const datasets = me.data.datasets; - me._metasets.forEach((meta, index) => { + const {_metasets: metasets, data: {datasets}} = me; + if (metasets.length > datasets.length) { + delete me._stacks; + } + metasets.forEach((meta, index) => { if (datasets.filter(x => x === meta._dataset).length === 0) { me._destroyDatasetMeta(index); } diff --git a/test/fixtures/controller.bar/stacking/remove-dataset.js b/test/fixtures/controller.bar/stacking/remove-dataset.js new file mode 100644 index 000000000..a0ca8db1c --- /dev/null +++ b/test/fixtures/controller.bar/stacking/remove-dataset.js @@ -0,0 +1,102 @@ +var barChartData = { + labels: [0, 1, 2, 3, 4, 5, 6], + datasets: [ + { + backgroundColor: 'red', + data: [ + // { x: 0, y: 0 }, + {x: 1, y: 5}, + {x: 2, y: 5}, + {x: 3, y: 5}, + {x: 4, y: 5}, + {x: 5, y: 5}, + {x: 6, y: 5} + ] + }, + { + backgroundColor: 'blue', + data: [ + {x: 0, y: 5}, + // { x: 1, y: 0 }, + {x: 2, y: 5}, + {x: 3, y: 5}, + {x: 4, y: 5}, + {x: 5, y: 5}, + {x: 6, y: 5} + ] + }, + { + backgroundColor: 'green', + data: [ + {x: 0, y: 5}, + {x: 1, y: 5}, + // { x: 2, y: 0 }, + {x: 3, y: 5}, + {x: 4, y: 5}, + {x: 5, y: 5}, + {x: 6, y: 5} + ] + }, + { + backgroundColor: 'yellow', + data: [ + {x: 0, y: 5}, + {x: 1, y: 5}, + {x: 2, y: 5}, + // {x: 3, y: 0 }, + {x: 4, y: 5}, + {x: 5, y: 5}, + {x: 6, y: 5} + ] + }, + { + backgroundColor: 'purple', + data: [ + {x: 0, y: 5}, + {x: 1, y: 5}, + {x: 2, y: 5}, + {x: 3, y: 5}, + // { x: 4, y: 0 }, + {x: 5, y: 5}, + {x: 6, y: 5} + ] + }, + { + backgroundColor: 'grey', + data: [ + {x: 0, y: 5}, + {x: 1, y: 5}, + {x: 2, y: 5}, + {x: 3, y: 5}, + {x: 4, y: 5}, + // { x: 5, y: 0 }, + {x: 6, y: 5} + ] + } + ] +}; + +module.exports = { + config: { + type: 'bar', + data: barChartData, + options: { + scales: { + x: { + display: false, + stacked: true + }, + y: { + display: false, + stacked: true + } + } + } + }, + options: { + run(chart) { + chart.data.datasets.splice(0, 1); + chart.update(); + } + } +}; diff --git a/test/fixtures/controller.bar/stacking/remove-dataset.png b/test/fixtures/controller.bar/stacking/remove-dataset.png new file mode 100644 index 000000000..12c6767c8 Binary files /dev/null and b/test/fixtures/controller.bar/stacking/remove-dataset.png differ