Skip to content

Commit acf2863

Browse files
committed
fix: prevent closing parents on hide
1 parent e3ffe00 commit acf2863

File tree

2 files changed

+29
-5
lines changed

2 files changed

+29
-5
lines changed

docs/.vitepress/components/SubMenuExample.vue

Lines changed: 23 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@
4747
Click me
4848
</button>
4949

50-
<template #popper>
50+
<template #popper="{ hide }">
5151
<div class="px-4 py-1">
5252
Sub menus:
5353
</div>
@@ -62,7 +62,7 @@
6262
Sub menu >
6363
</button>
6464

65-
<template #popper>
65+
<template #popper="{ hide: hideLevel2 }">
6666
<VDropdown
6767
v-for="m in 5"
6868
:key="m"
@@ -73,14 +73,33 @@
7373
Option {{ m }} >
7474
</button>
7575

76-
<template #popper>
77-
<div class="px-6 py-2">
76+
<template #popper="{ hide: hideLevel3 }">
77+
<div class="px-6 py-2 text-center">
7878
Hello
79+
<button
80+
class="rounded hover:bg-red-100 px-4 py-2 w-full mt-2"
81+
@click="hideLevel3"
82+
>
83+
Hide
84+
</button>
7985
</div>
8086
</template>
8187
</VDropdown>
88+
<button
89+
class="rounded hover:bg-red-100 px-4 py-2 w-full text-left"
90+
@click="hideLevel2"
91+
>
92+
Hide
93+
</button>
8294
</template>
8395
</VDropdown>
96+
97+
<button
98+
class="rounded hover:bg-red-100 px-4 py-2 w-full text-left"
99+
@click="hide"
100+
>
101+
Hide
102+
</button>
84103
</template>
85104
</VDropdown>
86105
</div>

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

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1090,7 +1090,12 @@ function handleGlobalClose (event: PopperEvent, touch: boolean) {
10901090
for (let i = shownPoppers.length - 1; i >= 0; i--) {
10911091
const popper = shownPoppers[i]
10921092
try {
1093-
const contains = popper.containsGlobalTarget = popper.mouseDownContains || popper.popperNode().contains(event.target)
1093+
const childrenContains = Array.from(popper.shownChildren).some(id => {
1094+
const child = shownPoppers.find(p => p.randomId === id)
1095+
return child && child.popperNode().contains(event.target)
1096+
})
1097+
1098+
const contains = popper.containsGlobalTarget = popper.mouseDownContains || popper.popperNode().contains(event.target) || childrenContains
10941099
popper.pendingHide = false
10951100

10961101
// Delay so that close directive has time to set values (closeAllPopover, closePopover)

0 commit comments

Comments
 (0)