From c05644045f375d601ac51870598f2d2885989599 Mon Sep 17 00:00:00 2001 From: Jin Yi Date: Sat, 21 Feb 2026 13:19:13 +0900 Subject: [PATCH] fix(assets): dismiss context menu on scroll and outside click (#8952) --- .../sidebar/tabs/AssetsSidebarTab.vue | 17 +++++--- .../components/MediaAssetContextMenu.vue | 42 ++++++++++++++----- 2 files changed, 43 insertions(+), 16 deletions(-) diff --git a/src/components/sidebar/tabs/AssetsSidebarTab.vue b/src/components/sidebar/tabs/AssetsSidebarTab.vue index 564958c23..ccf7b9868 100644 --- a/src/components/sidebar/tabs/AssetsSidebarTab.vue +++ b/src/components/sidebar/tabs/AssetsSidebarTab.vue @@ -199,7 +199,8 @@ import { useDebounceFn, useElementHover, useResizeObserver, - useStorage + useStorage, + useTimeoutFn } from '@vueuse/core' import Divider from 'primevue/divider' import { useToast } from 'primevue/usetoast' @@ -483,7 +484,16 @@ function handleAssetSelect(asset: AssetItem, assets?: AssetItem[]) { handleAssetClick(asset, index, assetList) } +const { start: scheduleCleanup, stop: cancelCleanup } = useTimeoutFn( + () => { + contextMenuAsset.value = null + }, + 0, + { immediate: false } +) + function handleAssetContextMenu(event: MouseEvent, asset: AssetItem) { + cancelCleanup() contextMenuAsset.value = asset void nextTick(() => { contextMenuRef.value?.show(event) @@ -491,10 +501,7 @@ function handleAssetContextMenu(event: MouseEvent, asset: AssetItem) { } function handleContextMenuHide() { - // Delay clearing to allow command callbacks to emit before component unmounts - requestAnimationFrame(() => { - contextMenuAsset.value = null - }) + scheduleCleanup() } const handleBulkDownload = (assets: AssetItem[]) => { diff --git a/src/platform/assets/components/MediaAssetContextMenu.vue b/src/platform/assets/components/MediaAssetContextMenu.vue index e78d525b1..f38fe313b 100644 --- a/src/platform/assets/components/MediaAssetContextMenu.vue +++ b/src/platform/assets/components/MediaAssetContextMenu.vue @@ -11,7 +11,7 @@ ) } }" - @hide="emit('hide')" + @hide="onMenuHide" >