From: Jukka Kurkela Date: Thu, 11 Mar 2021 21:20:07 +0000 (+0200) Subject: Clear stacks when data is replaced (#8617) X-Git-Tag: v3.0.0-beta.14~29 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=1e296ccf4cb8a853b6e1c733415bd63d031cae79;p=thirdparty%2FChart.js.git Clear stacks when data is replaced (#8617) --- diff --git a/src/core/core.datasetController.js b/src/core/core.datasetController.js index f33cb6da9..e4c5b0574 100644 --- a/src/core/core.datasetController.js +++ b/src/core/core.datasetController.js @@ -178,12 +178,13 @@ function createDataContext(parent, index, point, raw, element) { function clearStacks(meta, items) { items = items || meta._parsed; - items.forEach((parsed) => { - if (parsed._stacks[meta.vScale.id] === undefined || parsed._stacks[meta.vScale.id][meta.index] === undefined) { + for (const parsed of items) { + const stacks = parsed._stacks; + if (!stacks || stacks[meta.vScale.id] === undefined || stacks[meta.vScale.id][meta.index] === undefined) { return; } - delete parsed._stacks[meta.vScale.id][meta.index]; - }); + delete stacks[meta.vScale.id][meta.index]; + } } const isDirectUpdateMode = (mode) => mode === 'reset' || mode === 'none'; @@ -311,6 +312,7 @@ export default class DatasetController { if (me._data) { // This case happens when the user replaced the data array instance. unlistenArrayEvents(me._data, me); + clearStacks(me._cachedMeta); } if (data && Object.isExtensible(data)) { listenArrayEvents(data, me); diff --git a/test/fixtures/controller.bar/stacking/replace-data.js b/test/fixtures/controller.bar/stacking/replace-data.js new file mode 100644 index 000000000..2fbea1318 --- /dev/null +++ b/test/fixtures/controller.bar/stacking/replace-data.js @@ -0,0 +1,50 @@ +var barChartData = { + labels: ['January', 'February', 'March'], + datasets: [ + { + label: 'Dataset 1', + backgroundColor: 'red', + data: [5, 5, 5] + }, + { + label: 'Dataset 2', + backgroundColor: 'blue', + data: [5, 5, 5] + }, + { + label: 'Dataset 3', + backgroundColor: 'green', + data: [5, 5, 5] + } + ] +}; + +module.exports = { + description: 'https://github.com/chartjs/Chart.js/issues/8614', + config: { + type: 'bar', + data: barChartData, + options: { + scales: { + x: { + display: false, + stacked: true + }, + y: { + display: false, + stacked: true + } + } + } + }, + options: { + run(chart) { + chart.data.datasets[1].data = [ + {x: 'January', y: 5}, + // Februay missing + {x: 'March', y: 5} + ]; + chart.update(); + } + } +}; diff --git a/test/fixtures/controller.bar/stacking/replace-data.png b/test/fixtures/controller.bar/stacking/replace-data.png new file mode 100644 index 000000000..49a442bd0 Binary files /dev/null and b/test/fixtures/controller.bar/stacking/replace-data.png differ