From 27b91b7458d34caabf5ed50cb08ff2f5f4c6dd1e Mon Sep 17 00:00:00 2001 From: Evert Timberg Date: Sat, 10 Jul 2021 18:36:46 -0400 Subject: [PATCH] Adjust legend hitboxes when RTL and each item has a different size (#9353) * Adjust legend hitboxes when RTL and each item has a different size * Add test for RTL legend hitboxes --- src/plugins/plugin.legend.js | 23 +------- .../plugin.legend/horizontal-rtl-hitbox.js | 52 ++++++++++++++++++ .../plugin.legend/horizontal-rtl-hitbox.png | Bin 0 -> 17072 bytes 3 files changed, 55 insertions(+), 20 deletions(-) create mode 100644 test/fixtures/plugin.legend/horizontal-rtl-hitbox.js create mode 100644 test/fixtures/plugin.legend/horizontal-rtl-hitbox.png diff --git a/src/plugins/plugin.legend.js b/src/plugins/plugin.legend.js index 5f431c10c..87108b881 100644 --- a/src/plugins/plugin.legend.js +++ b/src/plugins/plugin.legend.js @@ -234,6 +234,7 @@ export class Legend extends Element { } const titleHeight = me._computeTitleHeight(); const {legendHitBoxes: hitboxes, options: {align, labels: {padding}, rtl}} = me; + const rtlHelper = getRtlAdapter(rtl, me.left, me.width); if (this.isHorizontal()) { let row = 0; let left = _alignStartEnd(align, me.left + padding, me.right - me.lineWidths[row]); @@ -243,28 +244,9 @@ export class Legend extends Element { left = _alignStartEnd(align, me.left + padding, me.right - me.lineWidths[row]); } hitbox.top += me.top + titleHeight + padding; - hitbox.left = left; + hitbox.left = rtlHelper.leftForLtr(rtlHelper.x(left), hitbox.width); left += hitbox.width + padding; } - - if (rtl) { - // When the legend is in RTL mode, each row starts at the right - // To ensure that click handling works correctly, we need to ensure that the items in the - // hitboxes array line up with how the legend items are drawn (this hack is required until V4) - const boxMap = hitboxes.reduce((map, box) => { - map[box.row] = map[box.row] || []; - map[box.row].push(box); - return map; - }, {}); - - const newBoxes = []; - Object.keys(boxMap).forEach(key => { - boxMap[key].reverse(); - newBoxes.push(...boxMap[key]); - }); - - me.legendHitBoxes = newBoxes; - } } else { let col = 0; let top = _alignStartEnd(align, me.top + titleHeight + padding, me.bottom - me.columnSizes[col].height); @@ -275,6 +257,7 @@ export class Legend extends Element { } hitbox.top = top; hitbox.left += me.left + padding; + hitbox.left = rtlHelper.leftForLtr(rtlHelper.x(hitbox.left), hitbox.width); top += hitbox.height + padding; } } diff --git a/test/fixtures/plugin.legend/horizontal-rtl-hitbox.js b/test/fixtures/plugin.legend/horizontal-rtl-hitbox.js new file mode 100644 index 000000000..99218cec2 --- /dev/null +++ b/test/fixtures/plugin.legend/horizontal-rtl-hitbox.js @@ -0,0 +1,52 @@ +module.exports = { + description: 'https://github.com/chartjs/Chart.js/issues/9278', + config: { + type: 'pie', + data: { + labels: ['aaa', 'bb', 'c'], + datasets: [{ + data: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11], + backgroundColor: 'red' + }] + }, + options: { + plugins: { + legend: { + position: 'top', + rtl: 'true', + } + }, + layout: { + padding: { + top: 50, + left: 30, + right: 30, + bottom: 50 + } + } + }, + plugins: [{ + id: 'legend-hit-box', + afterDraw(chart) { + const ctx = chart.ctx; + ctx.save(); + ctx.strokeStyle = 'green'; + ctx.lineWidth = 1; + + const legend = chart.legend; + legend.legendHitBoxes.forEach(box => { + ctx.strokeRect(box.left, box.top, box.width, box.height); + }); + + ctx.restore(); + } + }] + }, + options: { + spriteText: true, + canvas: { + width: 400, + height: 300 + }, + } +}; diff --git a/test/fixtures/plugin.legend/horizontal-rtl-hitbox.png b/test/fixtures/plugin.legend/horizontal-rtl-hitbox.png new file mode 100644 index 0000000000000000000000000000000000000000..a2ae13e45cb1d592b2555d9e1db5a6686e1d42a6 GIT binary patch literal 17072 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
0## zS2%~&bEcoJcz3(|ZIA9`Vi-yD%b9M*c*ohp29({I1C@5{_K4yzp?Hq_(PsVSvGkGes?M5F{cAeR zc+~D?2C$^Kf@h*sFs$JqQXW&NmI<3$9~&!>oD85Ju$`I#a?^k%;)h|7TGKy0GS%@?@ZzA?oqrS00|2OBBmOLt|2GOr_}X!AjLU=c?+OvhixZ%)|8Ep>2)c{{w6bFUf0NOi zuT#M=dk3nogVM@~ucIbfQlsLpSMe}VZ$T5&{QhqSoAdPpR5znF`oAkQD19?Pb2HBC xfMzlblr^D-iu1p5?f<{T{9n=jZ;JLP`muMx{T4kr6#)H_lTwtd{Ad*P{{UY7piTe) literal 0 Hc-jL100001 -- 2.47.2