From 40a1b27c5d86fe45db5685a485c2676389903188 Mon Sep 17 00:00:00 2001 From: neverland Date: Mon, 15 Mar 2021 20:05:45 +0800 Subject: [PATCH] fix(Popover): close-on-click-outside not work (#8352) --- src/popover/Popover.tsx | 9 ++++++++- src/popover/test/index.spec.tsx | 12 ++++++++++++ src/utils/deep-clone.ts | 6 ++++-- 3 files changed, 24 insertions(+), 3 deletions(-) diff --git a/src/popover/Popover.tsx b/src/popover/Popover.tsx index ac2c03e0d..dac244f19 100644 --- a/src/popover/Popover.tsx +++ b/src/popover/Popover.tsx @@ -85,6 +85,10 @@ export default defineComponent({ type: Boolean, default: true, }, + closeOnClickOutside: { + type: Boolean, + default: true, + }, }, emits: ['select', 'touchstart', 'update:show'], @@ -158,7 +162,10 @@ export default defineComponent({ }; const onClickAway = () => { - if (!props.overlay || props.closeOnClickOverlay) { + if ( + props.closeOnClickOutside && + (!props.overlay || props.closeOnClickOverlay) + ) { updateShow(false); } }; diff --git a/src/popover/test/index.spec.tsx b/src/popover/test/index.spec.tsx index 3a9701b0b..7f41d2f19 100644 --- a/src/popover/test/index.spec.tsx +++ b/src/popover/test/index.spec.tsx @@ -175,3 +175,15 @@ test('should not close Popover when overlay is clicked and close-on-click-overla trigger(overlay, 'touchstart'); expect(wrapper.emitted('update:show')).toBeFalsy(); }); + +test('should not close Popover when outside is clicked and close-on-click-outside is false', () => { + const wrapper = mount(Popover, { + props: { + show: true, + closeOnClickOutside: false, + }, + }); + + trigger(document.body, 'touchstart'); + expect(wrapper.emitted('update:show')).toBeFalsy(); +}); diff --git a/src/utils/deep-clone.ts b/src/utils/deep-clone.ts index bc2b88e2d..f5cdff87d 100644 --- a/src/utils/deep-clone.ts +++ b/src/utils/deep-clone.ts @@ -1,6 +1,8 @@ -import {isDef} from "./base"; +import { isDef } from './base'; -export function deepClone | null | undefined>(obj: T): T { +export function deepClone | null | undefined>( + obj: T +): T { if (!isDef(obj)) { return obj; }