From 31be6100015fbca3b639bcd63f9d03b52f21e171 Mon Sep 17 00:00:00 2001 From: Jukka Kurkela Date: Mon, 12 Jul 2021 14:45:03 +0300 Subject: [PATCH] Fix stacked box dimension calculation with weights (#9394) * Fix stacked box dimension calculation with weights * Fix typo in filename --- src/core/core.layouts.js | 6 +- .../core.layouts/stacked-boxes-with-weight.js | 112 ++++++++++++++++++ .../stacked-boxes-with-weight.png | Bin 0 -> 17650 bytes 3 files changed, 115 insertions(+), 3 deletions(-) create mode 100644 test/fixtures/core.layouts/stacked-boxes-with-weight.js create mode 100644 test/fixtures/core.layouts/stacked-boxes-with-weight.png diff --git a/src/core/core.layouts.js b/src/core/core.layouts.js index d5c1e20b3..fd830ffc3 100644 --- a/src/core/core.layouts.js +++ b/src/core/core.layouts.js @@ -223,9 +223,9 @@ function placeBoxes(boxes, chartArea, params, stacks) { for (const layout of boxes) { const box = layout.box; const stack = stacks[layout.stack] || {count: 1, placed: 0, weight: 1}; - const weight = (stack.weight * layout.stackWeight) || 1; + const weight = (layout.stackWeight / stack.weight) || 1; if (layout.horizontal) { - const width = chartArea.w / weight; + const width = chartArea.w * weight; const height = stack.size || box.height; if (defined(stack.start)) { y = stack.start; @@ -239,7 +239,7 @@ function placeBoxes(boxes, chartArea, params, stacks) { stack.placed += width; y = box.bottom; } else { - const height = chartArea.h / weight; + const height = chartArea.h * weight; const width = stack.size || box.width; if (defined(stack.start)) { x = stack.start; diff --git a/test/fixtures/core.layouts/stacked-boxes-with-weight.js b/test/fixtures/core.layouts/stacked-boxes-with-weight.js new file mode 100644 index 000000000..cbbb87545 --- /dev/null +++ b/test/fixtures/core.layouts/stacked-boxes-with-weight.js @@ -0,0 +1,112 @@ +module.exports = { + config: { + type: 'line', + data: { + datasets: [ + {data: [{x: 1, y: 1}, {x: 2, y: 2}, {x: 3, y: 3}], borderColor: 'red'}, + {data: [{x: 1, y: 1}, {x: 2, y: 2}, {x: 3, y: 3}], yAxisID: 'y1', xAxisID: 'x1', borderColor: 'green'}, + {data: [{x: 1, y: 1}, {x: 2, y: 2}, {x: 3, y: 3}], yAxisID: 'y2', xAxisID: 'x2', borderColor: 'blue'}, + ], + labels: ['tick1', 'tick2', 'tick3'] + }, + options: { + plugins: false, + scales: { + x: { + type: 'linear', + position: 'bottom', + stack: '1', + stackWeight: 2, + offset: true, + bounds: 'data', + grid: { + borderColor: 'red' + }, + ticks: { + autoSkip: false, + maxRotation: 0, + count: 3 + } + }, + x1: { + type: 'linear', + position: 'bottom', + stack: '1', + stackWeight: 2, + offset: true, + bounds: 'data', + grid: { + borderColor: 'green' + }, + ticks: { + autoSkip: false, + maxRotation: 0, + count: 3 + } + }, + x2: { + type: 'linear', + position: 'bottom', + stack: '1', + stackWeight: 6, + offset: true, + bounds: 'data', + grid: { + borderColor: 'blue' + }, + ticks: { + autoSkip: false, + maxRotation: 0, + count: 3 + } + }, + y: { + type: 'linear', + position: 'left', + stack: '1', + stackWeight: 2, + offset: true, + grid: { + borderColor: 'red' + }, + ticks: { + precision: 0 + } + }, + y1: { + type: 'linear', + position: 'left', + stack: '1', + offset: true, + stackWeight: 2, + grid: { + borderColor: 'green' + }, + ticks: { + precision: 0 + } + }, + y2: { + type: 'linear', + position: 'left', + stack: '1', + stackWeight: 3, + offset: true, + grid: { + borderColor: 'blue' + }, + ticks: { + precision: 0 + } + } + } + } + }, + options: { + spriteText: true, + canvas: { + height: 384, + width: 384 + } + } +}; diff --git a/test/fixtures/core.layouts/stacked-boxes-with-weight.png b/test/fixtures/core.layouts/stacked-boxes-with-weight.png new file mode 100644 index 0000000000000000000000000000000000000000..320e50284d69d6b905823830f9e0be583c72e683 GIT binary patch literal 17650 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 TW{=4s@JIEchH}Yyli>dYeCQQ6 literal 0 HcmV?d00001