From: Jukka Kurkela Date: Fri, 15 Oct 2021 12:00:14 +0000 (+0300) Subject: Fix stacked fill with lines over multiple scales (#9767) X-Git-Tag: v3.6.0~7 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=18fc9760e1945b535cec5673fcbc6dbf89b73443;p=thirdparty%2FChart.js.git Fix stacked fill with lines over multiple scales (#9767) --- 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 000000000..cb9c5bb79 Binary files /dev/null and b/test/fixtures/plugin.filler/line/stack-multiple-scales.png differ