]> git.ipfire.org Git - thirdparty/Chart.js.git/commitdiff
Fix stacking bug when a dataset is removed (#8520)
authorJukka Kurkela <jukka.kurkela@gmail.com>
Wed, 24 Feb 2021 22:31:17 +0000 (00:31 +0200)
committerGitHub <noreply@github.com>
Wed, 24 Feb 2021 22:31:17 +0000 (17:31 -0500)
src/core/core.controller.js
test/fixtures/controller.bar/stacking/remove-dataset.js [new file with mode: 0644]
test/fixtures/controller.bar/stacking/remove-dataset.png [new file with mode: 0644]

index 7997acbda5fccba7010bc4f8d0033834571c5d34..45890e0542e5ed2fecffa9fa984047330b5915ef 100644 (file)
@@ -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 (file)
index 0000000..a0ca8db
--- /dev/null
@@ -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 (file)
index 0000000..12c6767
Binary files /dev/null and b/test/fixtures/controller.bar/stacking/remove-dataset.png differ