Skip to content

Commit f0d2e1b

Browse files
authored
fix: only close popover on mouseleave if it is the last one (#7664)
1 parent aed2f31 commit f0d2e1b

File tree

2 files changed

+52
-0
lines changed

2 files changed

+52
-0
lines changed

packages/popover/src/vaadin-popover.js

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -728,6 +728,12 @@ class Popover extends PopoverPositionMixin(
728728

729729
/** @private */
730730
__onTargetMouseLeave(event) {
731+
// Do not close the popover on target focusout if the overlay is not the last one.
732+
// This happens e.g. when opening the nested popover that uses non-modal overlay.
733+
if (!isLastOverlay(this._overlayElement)) {
734+
return;
735+
}
736+
731737
if (this._overlayElement.contains(event.relatedTarget)) {
732738
return;
733739
}
@@ -794,6 +800,13 @@ class Popover extends PopoverPositionMixin(
794800

795801
/** @private */
796802
__onOverlayMouseLeave(event) {
803+
// Do not close the popover on overlay focusout if it's not the last one.
804+
// This happens when opening the nested component that uses "modal" overlay
805+
// setting `pointer-events: none` on the body (combo-box, date-picker etc).
806+
if (!isLastOverlay(this._overlayElement)) {
807+
return;
808+
}
809+
797810
if (event.relatedTarget === this.target) {
798811
return;
799812
}

packages/popover/test/nested.test.js

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ import { expect } from '@vaadin/chai-plugins';
22
import { esc, fixtureSync, nextRender, nextUpdate, outsideClick } from '@vaadin/testing-helpers';
33
import './not-animated-styles.js';
44
import '../vaadin-popover.js';
5+
import { mouseenter, mouseleave } from './helpers.js';
56

67
describe('nested popover', () => {
78
let popover, target, secondPopover, secondTarget;
@@ -122,4 +123,42 @@ describe('nested popover', () => {
122123
expect(popover.opened).to.be.true;
123124
});
124125
});
126+
127+
describe('hover', () => {
128+
beforeEach(async () => {
129+
popover.trigger = ['hover'];
130+
await nextUpdate(popover);
131+
});
132+
133+
it('should not close when mouse leaves the target if popover is not the last one', async () => {
134+
mouseenter(target);
135+
await nextRender();
136+
137+
mouseleave(target, secondTarget);
138+
secondTarget.click();
139+
await nextRender();
140+
141+
mouseleave(secondTarget, target);
142+
143+
mouseenter(target);
144+
mouseleave(target);
145+
await nextUpdate(popover);
146+
147+
expect(popover.opened).to.be.true;
148+
});
149+
150+
it('should not close when mouse leaves the overlay if popover is not the last one', async () => {
151+
mouseenter(target);
152+
await nextRender();
153+
154+
mouseleave(target, secondTarget);
155+
secondTarget.click();
156+
await nextRender();
157+
158+
mouseleave(secondTarget);
159+
await nextUpdate(popover);
160+
161+
expect(popover.opened).to.be.true;
162+
});
163+
});
125164
});

0 commit comments

Comments
 (0)