Skip to content

Commit

Permalink
feat: v-close-popper only close closest nested popper
Browse files Browse the repository at this point in the history
  • Loading branch information
Akryum committed Mar 23, 2022
1 parent 980e42b commit 81af5e5
Showing 1 changed file with 19 additions and 2 deletions.
21 changes: 19 additions & 2 deletions packages/floating-vue/src/components/Popper.ts
Original file line number Diff line number Diff line change
Expand Up @@ -1027,16 +1027,33 @@ function handleGlobalTouchend (event) {
}

function handleGlobalClose (event, touch = false) {
// Delay so that close directive has time to set values
for (let i = 0; i < shownPoppers.length; i++) {
const preventClose: Record<string, true> = {}

for (let i = shownPoppers.length - 1; i >= 0; i--) {
const popper = shownPoppers[i]
try {
const contains = popper.$_containsGlobalTarget = isContainingEventTarget(popper, event)
popper.$_pendingHide = false

// Delay so that close directive has time to set values (closeAllPopover, closePopover)
requestAnimationFrame(() => {
popper.$_pendingHide = false
if (preventClose[popper.randomId]) return

if (shouldAutoHide(popper, contains, event)) {
popper.$_handleGlobalClose(event, touch)

// Only close child popper
if (!event.closeAllPopover && event.closePopover && contains) {
let parent = popper.parentPopper
while (parent) {
preventClose[parent.randomId] = true
parent = parent.parentPopper
}
return
}

// Auto hide parents
let parent = popper.parentPopper
while (parent) {
if (shouldAutoHide(parent, parent.$_containsGlobalTarget, event)) {
Expand Down

0 comments on commit 81af5e5

Please sign in to comment.