From c2e19709ed2849bd96baeb041de6c2f80bf7b589 Mon Sep 17 00:00:00 2001 From: Evert Timberg Date: Fri, 15 Apr 2022 18:49:47 -0400 Subject: [PATCH] Trigger legend onLeave when the mouse leaves the canvas --- src/plugins/plugin.legend.js | 4 ++-- test/specs/plugin.legend.tests.js | 40 +++++++++++++++++++++++++++++++ 2 files changed, 42 insertions(+), 2 deletions(-) diff --git a/src/plugins/plugin.legend.js b/src/plugins/plugin.legend.js index 7388bc714f1..02fa12ae1a8 100644 --- a/src/plugins/plugin.legend.js +++ b/src/plugins/plugin.legend.js @@ -524,7 +524,7 @@ export class Legend extends Element { // Chart event already has relative position in it const hoveredItem = this._getLegendItemAt(e.x, e.y); - if (e.type === 'mousemove') { + if (e.type === 'mousemove' || e.type === 'mouseout') { const previous = this._hoveredItem; const sameItem = itemsEqual(previous, hoveredItem); if (previous && !sameItem) { @@ -543,7 +543,7 @@ export class Legend extends Element { } function isListened(type, opts) { - if (type === 'mousemove' && (opts.onHover || opts.onLeave)) { + if ((type === 'mousemove' || type === 'mouseout') && (opts.onHover || opts.onLeave)) { return true; } if (opts.onClick && (type === 'click' || type === 'mouseup')) { diff --git a/test/specs/plugin.legend.tests.js b/test/specs/plugin.legend.tests.js index b8d1fba6d84..9c7f340f13e 100644 --- a/test/specs/plugin.legend.tests.js +++ b/test/specs/plugin.legend.tests.js @@ -997,6 +997,46 @@ describe('Legend block tests', function() { expect(leaveItem).toBe(chart.legend.legendItems[0]); }); + it('should call onLeave when the mouse leaves the canvas', async function() { + var hoverItem = null; + var leaveItem = null; + + var chart = acquireChart({ + type: 'line', + data: { + labels: ['A', 'B', 'C', 'D'], + datasets: [{ + data: [10, 20, 30, 100] + }] + }, + options: { + plugins: { + legend: { + onHover: function(_, item) { + hoverItem = item; + }, + onLeave: function(_, item) { + leaveItem = item; + } + } + } + } + }); + + var hb = chart.legend.legendHitBoxes[0]; + var el = { + x: hb.left + (hb.width / 2), + y: hb.top + (hb.height / 2) + }; + + await jasmine.triggerMouseEvent(chart, 'mousemove', el); + expect(hoverItem).toBe(chart.legend.legendItems[0]); + + await jasmine.triggerMouseEvent(chart, 'mouseout'); + expect(leaveItem).toBe(chart.legend.legendItems[0]); + }); + + it('should call onClick for the correct item when in RTL mode', async function() { var clickItem = null;