@@ -1027,16 +1027,33 @@ function handleGlobalTouchend (event) {
1027
1027
}
1028
1028
1029
1029
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 -- ) {
1032
1033
const popper = shownPoppers [ i ]
1033
1034
try {
1034
1035
const contains = popper . $_containsGlobalTarget = isContainingEventTarget ( popper , event )
1035
1036
popper . $_pendingHide = false
1037
+
1038
+ // Delay so that close directive has time to set values (closeAllPopover, closePopover)
1036
1039
requestAnimationFrame ( ( ) => {
1040
+ popper . $_pendingHide = false
1041
+ if ( preventClose [ popper . randomId ] ) return
1042
+
1037
1043
if ( shouldAutoHide ( popper , contains , event ) ) {
1038
1044
popper . $_handleGlobalClose ( event , touch )
1039
1045
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
1040
1057
let parent = popper . parentPopper
1041
1058
while ( parent ) {
1042
1059
if ( shouldAutoHide ( parent , parent . $_containsGlobalTarget , event ) ) {
0 commit comments