From: Jukka Kurkela Date: Fri, 16 Jul 2021 11:15:54 +0000 (+0300) Subject: Properly update stacks when datasets index changes (#9425) X-Git-Tag: v3.5.0~17 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=0094a58ef1544e37b6455ef90fabf03185ff8544;p=thirdparty%2FChart.js.git Properly update stacks when datasets index changes (#9425) --- 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 000000000..2ca99579b Binary files /dev/null and b/test/fixtures/controller.line/stacking/updates.png differ