From 1e296ccf4cb8a853b6e1c733415bd63d031cae79 Mon Sep 17 00:00:00 2001 From: Jukka Kurkela Date: Thu, 11 Mar 2021 23:20:07 +0200 Subject: [PATCH] Clear stacks when data is replaced (#8617) --- src/core/core.datasetController.js | 10 ++-- .../controller.bar/stacking/replace-data.js | 50 ++++++++++++++++++ .../controller.bar/stacking/replace-data.png | Bin 0 -> 9517 bytes 3 files changed, 56 insertions(+), 4 deletions(-) create mode 100644 test/fixtures/controller.bar/stacking/replace-data.js create mode 100644 test/fixtures/controller.bar/stacking/replace-data.png 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 0000000000000000000000000000000000000000..49a442bd01d64b80f4695714e5fbab2990855925 GIT binary patch literal 9517 zcmeHN`%4s26h1QzHg1Vq_Oxg>atpL5C=tn;tu!-ZHQA`JQVM@5a(isK6na-FB1(!L zDiuAXEX#_Dh}v@2qNIc})Qw6VX+tf_+2}Fu&d%QM^bhnyK@j(+`R?K4aygvyo$oSt zf37Vv#t?4+fS9Z$>3IMwfh_P*bVdnc9)z41v0e=UF&*dE?! z1%@+@ORz#z=F0H|k~P~CMZ4?e2{)Fq&a(yQ4b+QaT@mmboEq%2$Rp@kV!S zYwa1MyMN2>8d1Vs{YGruqqUTre zBQ6qAwJ+E4BS%D;r=T*VX@13lONIXG$o}Z?cl|zu_nkE4 z5c)uszPpd?e*3YfRHxSy`o;n0YWDDHM`9YGd-AL3VQ6M(&CqV5IztthjsrRMz<(4;wfn$;1fD!o5!xWDY1onTSdUF}jSjW?6Y9$;3$8&+Q4`;=|twRl*G>d{E*4H;Mz^egHMA?c|J`C_poSpZG#LiePpfSpJAZ`f>wQ;YWkb7^|=>7#Ja zWW6+>;VY9T9oO-N`6OQ=B)(PJT)} z%k!s3dk2|4ALHDutNhD#Y$y0x-nNmDk~`T7iP@EX3E&@Uyqp6IH&kX?2+pm~A@QeK z&}pRyp&6kyLc50Q$nTZ)z_mA>09?QR7J#ZOojY_AQ*ZKry0ySXgBLMLzS?)AcBQqD PXHbxpVN1WZu(0AMzat55 literal 0 HcmV?d00001