From 5c79bb69b50c895edf17703396db8d52cc674019 Mon Sep 17 00:00:00 2001 From: t-mangoe Date: Sat, 9 Apr 2022 09:49:43 +0900 Subject: [PATCH 1/2] show only points in chart area --- src/core/core.interaction.js | 4 +++ test/specs/core.interaction.tests.js | 37 ++++++++++++++++++++++++++++ 2 files changed, 41 insertions(+) diff --git a/src/core/core.interaction.js b/src/core/core.interaction.js index 2e18acc9d7e..fab728a4587 100644 --- a/src/core/core.interaction.js +++ b/src/core/core.interaction.js @@ -97,6 +97,10 @@ function getIntersectItems(chart, position, axis, useFinalPosition) { } const evaluationFunc = function(element, datasetIndex, index) { + const chartArea = chart.chartArea; + if (element.x < chartArea.left || chartArea.right < element.x || element.y < chartArea.top || chartArea.bottom < element.y) { + return; + } if (element.inRange(position.x, position.y, useFinalPosition)) { items.push({element, datasetIndex, index}); } diff --git a/test/specs/core.interaction.tests.js b/test/specs/core.interaction.tests.js index 79d9b104894..46a30ec4ab4 100644 --- a/test/specs/core.interaction.tests.js +++ b/test/specs/core.interaction.tests.js @@ -834,4 +834,41 @@ describe('Core.Interaction', function() { expect(elements).toEqual([meta0.data[1], meta1.data[0], meta1.data[1], meta1.data[2]]); }); }); + + describe('tooltip element of scatter chart', function() { + it ('out-of-range datapoints are not shown in tooltip', function() { + let data = []; + for (let i = 0; i < 1000; i++) { + data.push({x: i, y: i}); + } + + const chart = window.acquireChart({ + type: 'scatter', + data: { + datasets: [{data}] + }, + options: { + scales: { + x: { + min: 1 + } + } + } + }); + + const meta0 = chart.getDatasetMeta(0); + const firstElement = meta0.data[0]; + + const evt = { + type: 'click', + chart: chart, + native: true, // needed otherwise things its a DOM event + x: firstElement.x, + y: firstElement.y + }; + + const elements = Chart.Interaction.modes.point(chart, evt, {intersect: true}).map(item => item.element); + expect(elements).not.toContain(firstElement); + }); + }); }); From fca419a471f16ad4c1348aa0ea7346fb06ed5ac3 Mon Sep 17 00:00:00 2001 From: t-mangoe Date: Sat, 7 May 2022 10:08:31 +0900 Subject: [PATCH 2/2] use the _isPointInArea helper function --- src/core/core.interaction.js | 4 ++-- test/specs/core.interaction.tests.js | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/core/core.interaction.js b/src/core/core.interaction.js index fab728a4587..4a8df47fa10 100644 --- a/src/core/core.interaction.js +++ b/src/core/core.interaction.js @@ -1,6 +1,7 @@ import {_lookupByKey, _rlookupByKey} from '../helpers/helpers.collection'; import {getRelativePosition} from '../helpers/helpers.dom'; import {_angleBetween, getAngleFromPoint} from '../helpers/helpers.math'; +import {_isPointInArea} from '../helpers'; /** * @typedef { import("./core.controller").default } Chart @@ -97,8 +98,7 @@ function getIntersectItems(chart, position, axis, useFinalPosition) { } const evaluationFunc = function(element, datasetIndex, index) { - const chartArea = chart.chartArea; - if (element.x < chartArea.left || chartArea.right < element.x || element.y < chartArea.top || chartArea.bottom < element.y) { + if (!_isPointInArea(element, chart.chartArea, 0)) { return; } if (element.inRange(position.x, position.y, useFinalPosition)) { diff --git a/test/specs/core.interaction.tests.js b/test/specs/core.interaction.tests.js index 46a30ec4ab4..34ee6438c27 100644 --- a/test/specs/core.interaction.tests.js +++ b/test/specs/core.interaction.tests.js @@ -850,7 +850,7 @@ describe('Core.Interaction', function() { options: { scales: { x: { - min: 1 + min: 2 } } }