From 6efe8ddd6cf82d123344ecd9e6f8d32e1bd4ccae Mon Sep 17 00:00:00 2001 From: kurkle Date: Fri, 16 Jul 2021 06:55:32 +0300 Subject: [PATCH] Properly update stacks when datasets index changes --- 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 5842f1e228f..048073a8400 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 00000000000..0853f0b35b8 --- /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 HcmV?d00001