From 0094a58ef1544e37b6455ef90fabf03185ff8544 Mon Sep 17 00:00:00 2001 From: Jukka Kurkela Date: Fri, 16 Jul 2021 14:15:54 +0300 Subject: [PATCH] Properly update stacks when datasets index changes (#9425) --- src/core/core.datasetController.js | 6 ++- .../controller.line/stacking/updates.js | 40 ++++++++++++++++++ .../controller.line/stacking/updates.png | Bin 0 -> 13362 bytes 3 files changed, 44 insertions(+), 2 deletions(-) create mode 100644 test/fixtures/controller.line/stacking/updates.js create mode 100644 test/fixtures/controller.line/stacking/updates.png diff --git a/src/core/core.datasetController.js b/src/core/core.datasetController.js index 5842f1e22..048073a84 100644 --- a/src/core/core.datasetController.js +++ b/src/core/core.datasetController.js @@ -193,6 +193,8 @@ function createDataContext(parent, index, element) { } function clearStacks(meta, items) { + // Not using meta.index here, because it might be already updated if the dataset changed location + const datasetIndex = meta.controller.index; const axis = meta.vScale && meta.vScale.axis; if (!axis) { return; @@ -201,10 +203,10 @@ function clearStacks(meta, items) { items = items || meta._parsed; for (const parsed of items) { const stacks = parsed._stacks; - if (!stacks || stacks[axis] === undefined || stacks[axis][meta.index] === undefined) { + if (!stacks || stacks[axis] === undefined || stacks[axis][datasetIndex] === undefined) { return; } - delete stacks[axis][meta.index]; + delete stacks[axis][datasetIndex]; } } diff --git a/test/fixtures/controller.line/stacking/updates.js b/test/fixtures/controller.line/stacking/updates.js new file mode 100644 index 000000000..0853f0b35 --- /dev/null +++ b/test/fixtures/controller.line/stacking/updates.js @@ -0,0 +1,40 @@ +module.exports = { + description: 'https://github.com/chartjs/Chart.js/issues/9424', + config: { + type: 'line', + data: { + labels: [0, 1, 2], + datasets: [ + { + data: [1, 1, 1], + stack: 's1', + borderColor: '#ff0000', + }, + { + data: [2, 2, 2], + stack: 's1', + borderColor: '#00ff00', + }, + { + data: [3, 3, 3], + stack: 's1', + borderColor: '#0000ff', + } + ] + }, + options: { + borderWidth: 5, + scales: { + x: {display: false}, + y: {display: true, stacked: true} + } + } + }, + options: { + spriteText: true, + run(chart) { + chart.data.datasets.splice(1, 0, {data: [1.5, 1.5, 1.5], stack: 's2', borderColor: '#000000'}); + chart.update(); + } + } +}; diff --git a/test/fixtures/controller.line/stacking/updates.png b/test/fixtures/controller.line/stacking/updates.png new file mode 100644 index 0000000000000000000000000000000000000000..2ca99579bf1e6f89ab87c262138010e68f03c235 GIT binary patch literal 13362 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 literal 0 Hc-jL100001 -- 2.47.2