From 18fc9760e1945b535cec5673fcbc6dbf89b73443 Mon Sep 17 00:00:00 2001 From: Jukka Kurkela Date: Fri, 15 Oct 2021 15:00:14 +0300 Subject: [PATCH] Fix stacked fill with lines over multiple scales (#9767) --- src/plugins/plugin.filler.js | 14 ++-- .../line/stack-multiple-scales.js | 76 ++++++++++++++++++ .../line/stack-multiple-scales.png | Bin 0 -> 11526 bytes 3 files changed, 82 insertions(+), 8 deletions(-) create mode 100644 test/fixtures/plugin.filler/line/stack-multiple-scales.js create mode 100644 test/fixtures/plugin.filler/line/stack-multiple-scales.png diff --git a/src/plugins/plugin.filler.js b/src/plugins/plugin.filler.js index 9e3e3b8f5..28a1df2ee 100644 --- a/src/plugins/plugin.filler.js +++ b/src/plugins/plugin.filler.js @@ -206,11 +206,11 @@ function pointsFromSegments(boundary, line) { * @return {LineElement} */ function buildStackLine(source) { - const {chart, scale, index, line} = source; + const {scale, index, line} = source; const points = []; const segments = line.segments; const sourcePoints = line.points; - const linesBelow = getLinesBelow(chart, index); + const linesBelow = getLinesBelow(scale, index); linesBelow.push(createBoundaryLine({x: null, y: scale.bottom}, line)); for (let i = 0; i < segments.length; i++) { @@ -222,23 +222,21 @@ function buildStackLine(source) { return new LineElement({points, options: {}}); } -const isLineAndNotInHideAnimation = (meta) => meta.type === 'line' && !meta.hidden; - /** - * @param {Chart} chart + * @param {Scale} scale * @param {number} index * @return {LineElement[]} */ -function getLinesBelow(chart, index) { +function getLinesBelow(scale, index) { const below = []; - const metas = chart.getSortedVisibleDatasetMetas(); + const metas = scale.getMatchingVisibleMetas('line'); for (let i = 0; i < metas.length; i++) { const meta = metas[i]; if (meta.index === index) { break; } - if (isLineAndNotInHideAnimation(meta)) { + if (!meta.hidden) { below.unshift(meta.dataset); } } diff --git a/test/fixtures/plugin.filler/line/stack-multiple-scales.js b/test/fixtures/plugin.filler/line/stack-multiple-scales.js new file mode 100644 index 000000000..8ba2d44ac --- /dev/null +++ b/test/fixtures/plugin.filler/line/stack-multiple-scales.js @@ -0,0 +1,76 @@ +module.exports = { + config: { + type: 'line', + data: { + labels: ['0', '1', '2', '3'], + datasets: [{ + backgroundColor: 'rgba(255, 0, 0, 0.5)', + data: [null, 1, 1, 1], + fill: 'stack' + }, { + backgroundColor: 'rgba(0, 255, 0, 0.5)', + data: [null, 2, 2, 2], + fill: 'stack' + }, { + backgroundColor: 'rgba(0, 0, 255, 0.5)', + data: [null, 3, 3, 3], + fill: 'stack' + }, { + backgroundColor: 'rgba(255, 0, 255, 0.5)', + data: [0.5, 0.5, 0.5, null], + fill: 'stack', + yAxisID: 'y2' + }, { + backgroundColor: 'rgba(0, 0, 0, 0.5)', + data: [1.5, 1.5, 1.5, null], + fill: 'stack', + yAxisID: 'y2' + }, { + backgroundColor: 'rgba(255, 255, 0, 0.5)', + data: [2.5, 2.5, 2.5, null], + fill: 'stack', + yAxisID: 'y2' + }] + }, + options: { + responsive: false, + spanGaps: false, + scales: { + x: { + display: false + }, + y: { + position: 'right', + stacked: true, + min: 0 + }, + y2: { + position: 'left', + stacked: true, + min: 0 + } + }, + elements: { + point: { + radius: 0 + }, + line: { + borderColor: 'transparent', + tension: 0 + } + }, + plugins: { + legend: false, + title: false, + tooltip: false + } + } + }, + options: { + spriteText: true, + canvas: { + height: 256, + width: 512 + } + } +}; diff --git a/test/fixtures/plugin.filler/line/stack-multiple-scales.png b/test/fixtures/plugin.filler/line/stack-multiple-scales.png new file mode 100644 index 0000000000000000000000000000000000000000..cb9c5bb79f9a83ca48ceb62d8f62195e64f7fa7f GIT binary patch literal 11526 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 q=D5{&lz8