Skip to content

Commit 81af5e5

Browse files
committed
feat: v-close-popper only close closest nested popper
1 parent 980e42b commit 81af5e5

File tree

1 file changed

+19
-2
lines changed
  • packages/floating-vue/src/components

1 file changed

+19
-2
lines changed

packages/floating-vue/src/components/Popper.ts

+19-2
Original file line numberDiff line numberDiff line change
@@ -1027,16 +1027,33 @@ function handleGlobalTouchend (event) {
10271027
}
10281028

10291029
function handleGlobalClose (event, touch = false) {
1030-
// Delay so that close directive has time to set values
1031-
for (let i = 0; i < shownPoppers.length; i++) {
1030+
const preventClose: Record<string, true> = {}
1031+
1032+
for (let i = shownPoppers.length - 1; i >= 0; i--) {
10321033
const popper = shownPoppers[i]
10331034
try {
10341035
const contains = popper.$_containsGlobalTarget = isContainingEventTarget(popper, event)
10351036
popper.$_pendingHide = false
1037+
1038+
// Delay so that close directive has time to set values (closeAllPopover, closePopover)
10361039
requestAnimationFrame(() => {
1040+
popper.$_pendingHide = false
1041+
if (preventClose[popper.randomId]) return
1042+
10371043
if (shouldAutoHide(popper, contains, event)) {
10381044
popper.$_handleGlobalClose(event, touch)
10391045

1046+
// Only close child popper
1047+
if (!event.closeAllPopover && event.closePopover && contains) {
1048+
let parent = popper.parentPopper
1049+
while (parent) {
1050+
preventClose[parent.randomId] = true
1051+
parent = parent.parentPopper
1052+
}
1053+
return
1054+
}
1055+
1056+
// Auto hide parents
10401057
let parent = popper.parentPopper
10411058
while (parent) {
10421059
if (shouldAutoHide(parent, parent.$_containsGlobalTarget, event)) {

0 commit comments

Comments
 (0)