From 31e3b9c315fcfdd1f4bc9eb02128c48e080a7eaa Mon Sep 17 00:00:00 2001 From: dante01yoon Date: Sun, 10 May 2026 09:31:48 +0900 Subject: [PATCH] fix(dialog): treat PrimeVue overlay clicks as inside the search dialog MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Filter panel is a nested PrimeVue Dialog teleported to body. With Reka modal disabled, the outer dialog stays interactive but Reka's pointer-down-outside still fires for clicks inside the teleported PrimeVue panel — which would auto-dismiss the outer search box and tear down the panel mid-interaction (filter type/value clicks then timeout because the elements are gone). Block dismissal whenever the original pointer-down target is inside any PrimeVue overlay (.p-dialog, .p-overlay, .p-autocomplete-overlay, .p-select-overlay, .p-popover and their masks). The 300ms initial-open guard is preserved. Refs FE-574 --- .../searchbox/NodeSearchBoxPopover.vue | 19 +++++++++++++++++-- 1 file changed, 17 insertions(+), 2 deletions(-) diff --git a/src/components/searchbox/NodeSearchBoxPopover.vue b/src/components/searchbox/NodeSearchBoxPopover.vue index ab64967ab3..e4422e0d72 100644 --- a/src/components/searchbox/NodeSearchBoxPopover.vue +++ b/src/components/searchbox/NodeSearchBoxPopover.vue @@ -131,8 +131,23 @@ function onOpenChange(open: boolean) { visible.value = open if (!open) clearFilters() } -function onPointerDownOutside(event: Event) { - if (!dismissable.value) event.preventDefault() +// PrimeVue overlays (filter Dialog, AutoComplete dropdown, Select panel) +// teleport to body, so Reka treats clicks on them as "outside" and would +// dismiss the outer dialog. Treat clicks on any PrimeVue overlay as inside. +const PRIMEVUE_OVERLAY_SELECTORS = + '.p-dialog-mask, .p-dialog, .p-overlay-mask, .p-overlay, .p-autocomplete-overlay, .p-select-overlay, .p-popover' + +function onPointerDownOutside( + event: CustomEvent<{ originalEvent: PointerEvent }> +) { + if (!dismissable.value) { + event.preventDefault() + return + } + const target = event.detail.originalEvent.target + if (target instanceof Element && target.closest(PRIMEVUE_OVERLAY_SELECTORS)) { + event.preventDefault() + } } const canvasStore = useCanvasStore()