From 6dd448b9337842b5c2f597306c28fccdfef6d3c6 Mon Sep 17 00:00:00 2001 From: Nikolai Iakovlev Date: Thu, 24 Oct 2024 18:55:58 +0300 Subject: [PATCH] Fix: applyStack() returned the sum of all values for hidden dataset indices, which resulted in wrong show animations (#11938) --- src/core/core.datasetController.js | 7 +++++ test/specs/controller.bar.tests.js | 43 ++++++++++++++++++++++++++++++ 2 files changed, 50 insertions(+) diff --git a/src/core/core.datasetController.js b/src/core/core.datasetController.js index 8753cab650d..9b7126a93fd 100644 --- a/src/core/core.datasetController.js +++ b/src/core/core.datasetController.js @@ -76,9 +76,11 @@ function applyStack(stack, value, dsIndex, options = {}) { return; } + let found = false; for (i = 0, ilen = keys.length; i < ilen; ++i) { datasetIndex = +keys[i]; if (datasetIndex === dsIndex) { + found = true; if (options.all) { continue; } @@ -89,6 +91,11 @@ function applyStack(stack, value, dsIndex, options = {}) { value += otherValue; } } + + if (!found && !options.all) { + return 0; + } + return value; } diff --git a/test/specs/controller.bar.tests.js b/test/specs/controller.bar.tests.js index a64af1a878b..128ef241d00 100644 --- a/test/specs/controller.bar.tests.js +++ b/test/specs/controller.bar.tests.js @@ -1613,6 +1613,49 @@ describe('Chart.controllers.bar', function() { expect(data[0].y).toBeCloseToPixel(512); }); + it('should hide bar dataset beneath the chart for correct animations', function() { + var chart = window.acquireChart({ + type: 'bar', + data: { + datasets: [{ + data: [1, 2, 3, 4] + }, { + data: [1, 2, 3, 4] + }], + labels: ['A', 'B', 'C', 'D'] + }, + options: { + plugins: { + legend: false, + title: false + }, + scales: { + x: { + type: 'category', + display: false, + stacked: true, + }, + y: { + type: 'linear', + display: false, + stacked: true, + } + } + } + }); + + var data = chart.getDatasetMeta(0).data; + expect(data[0].base).toBeCloseToPixel(512); + expect(data[0].y).toBeCloseToPixel(448); + + chart.setDatasetVisibility(0, false); + chart.update(); + + data = chart.getDatasetMeta(0).data; + expect(data[0].base).toBeCloseToPixel(640); + expect(data[0].y).toBeCloseToPixel(512); + }); + describe('Float bar', function() { it('Should return correct values from getMinMax', function() { var chart = window.acquireChart({