From ba2f158dc6c71ffe7bb92a235dfab6aed69f138d Mon Sep 17 00:00:00 2001 From: Jukka Kurkela Date: Tue, 20 Jul 2021 14:57:56 +0300 Subject: [PATCH] Fix interaction on partially visible bar (#9446) --- src/core/core.interaction.js | 2 +- .../core.interaction/nearest-partial-bar.js | 42 ++++++++++++++++ .../core.interaction/nearest-partial-bar.png | Bin 0 -> 9711 bytes .../nearest-point-behind-scale.js | 45 ++++++++++++++++++ .../nearest-point-behind-scale.png | Bin 0 -> 8191 bytes test/specs/core.interaction.tests.js | 5 +- 6 files changed, 90 insertions(+), 4 deletions(-) create mode 100644 test/fixtures/core.interaction/nearest-partial-bar.js create mode 100644 test/fixtures/core.interaction/nearest-partial-bar.png create mode 100644 test/fixtures/core.interaction/nearest-point-behind-scale.js create mode 100644 test/fixtures/core.interaction/nearest-point-behind-scale.png diff --git a/src/core/core.interaction.js b/src/core/core.interaction.js index fbfaf6ebbd7..5365f6c9108 100644 --- a/src/core/core.interaction.js +++ b/src/core/core.interaction.js @@ -166,7 +166,7 @@ function getNearestItems(chart, position, axis, intersect, useFinalPosition) { } const center = element.getCenterPoint(useFinalPosition); - if (!_isPointInArea(center, chart.chartArea, chart._minPadding)) { + if (!_isPointInArea(center, chart.chartArea, chart._minPadding) && !element.inRange(position.x, position.y, useFinalPosition)) { return; } const distance = distanceMetric(position, center); diff --git a/test/fixtures/core.interaction/nearest-partial-bar.js b/test/fixtures/core.interaction/nearest-partial-bar.js new file mode 100644 index 00000000000..420f849c95f --- /dev/null +++ b/test/fixtures/core.interaction/nearest-partial-bar.js @@ -0,0 +1,42 @@ +module.exports = { + config: { + type: 'bar', + data: { + labels: ['a', 'b', 'c'], + datasets: [ + { + data: [220, 250, 225], + }, + ], + }, + options: { + events: ['click'], + interaction: { + mode: 'nearest' + }, + plugins: { + tooltip: true, + legend: false + }, + scales: { + y: { + beginAtZero: false + } + } + } + }, + options: { + spriteText: true, + canvas: { + width: 256, + height: 256 + }, + async run(chart) { + const point = { + x: chart.chartArea.left + chart.chartArea.width / 2, + y: chart.chartArea.top + chart.chartArea.height / 2, + }; + await jasmine.triggerMouseEvent(chart, 'click', point); + } + } +}; diff --git a/test/fixtures/core.interaction/nearest-partial-bar.png b/test/fixtures/core.interaction/nearest-partial-bar.png new file mode 100644 index 0000000000000000000000000000000000000000..907795294c43f8bc29bc42ad58ce82bd68894f39 GIT binary patch literal 9711 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 literal 0 HcmV?d00001 diff --git a/test/fixtures/core.interaction/nearest-point-behind-scale.js b/test/fixtures/core.interaction/nearest-point-behind-scale.js new file mode 100644 index 00000000000..6dfa25c1a2d --- /dev/null +++ b/test/fixtures/core.interaction/nearest-point-behind-scale.js @@ -0,0 +1,45 @@ +module.exports = { + config: { + type: 'scatter', + data: { + datasets: [{ + data: [{x: 1, y: 1}, {x: 48, y: 1}] + }] + }, + options: { + events: ['click'], + interaction: { + mode: 'nearest', + intersect: false + }, + plugins: { + tooltip: true, + legend: false + }, + scales: { + x: { + min: 5, + max: 50 + }, + y: { + min: 0, + max: 2 + } + }, + layout: { + padding: 50 + } + } + }, + options: { + spriteText: true, + canvas: { + width: 256, + height: 256 + }, + async run(chart) { + const point = chart.getDatasetMeta(0).data[0]; + await jasmine.triggerMouseEvent(chart, 'click', {y: point.y, x: chart.chartArea.left}); + } + } +}; diff --git a/test/fixtures/core.interaction/nearest-point-behind-scale.png b/test/fixtures/core.interaction/nearest-point-behind-scale.png new file mode 100644 index 0000000000000000000000000000000000000000..42d92874d51f35fed9643fd494ce40a533b0a27e GIT binary patch literal 8191 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