]> git.ipfire.org Git - thirdparty/Chart.js.git/commitdiff
Clear stacks when data is replaced (#8617)
authorJukka Kurkela <jukka.kurkela@gmail.com>
Thu, 11 Mar 2021 21:20:07 +0000 (23:20 +0200)
committerGitHub <noreply@github.com>
Thu, 11 Mar 2021 21:20:07 +0000 (16:20 -0500)
src/core/core.datasetController.js
test/fixtures/controller.bar/stacking/replace-data.js [new file with mode: 0644]
test/fixtures/controller.bar/stacking/replace-data.png [new file with mode: 0644]

index f33cb6da93ad5fb1fbabb66cdf889e57a1515903..e4c5b0574e339fcdf2cbe5426b954565d4825155 100644 (file)
@@ -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 (file)
index 0000000..2fbea13
--- /dev/null
@@ -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 (file)
index 0000000..49a442b
Binary files /dev/null and b/test/fixtures/controller.bar/stacking/replace-data.png differ