From 320db12209166db43be7e41ba157a2b05a779734 Mon Sep 17 00:00:00 2001 From: t8y2 <1156263951@qq.com> Date: Sat, 16 May 2026 19:52:31 +0800 Subject: [PATCH] fix: prevent repeated menu activations --- .../context-menu/ContextMenuCheckboxItem.vue | 10 ++ .../ui/context-menu/ContextMenuItem.vue | 10 ++ .../ui/context-menu/ContextMenuRadioItem.vue | 10 ++ .../DropdownMenuCheckboxItem.vue | 10 ++ .../ui/dropdown-menu/DropdownMenuItem.vue | 10 ++ .../dropdown-menu/DropdownMenuRadioItem.vue | 10 ++ src/composables/useDataGridExport.ts | 92 +++++++++++-------- src/lib/actionActivation.ts | 42 +++++++++ tests/actionActivation.test.ts | 35 +++++++ 9 files changed, 193 insertions(+), 36 deletions(-) create mode 100644 src/lib/actionActivation.ts create mode 100644 tests/actionActivation.test.ts diff --git a/src/components/ui/context-menu/ContextMenuCheckboxItem.vue b/src/components/ui/context-menu/ContextMenuCheckboxItem.vue index da2174cb85..ab3587e12d 100644 --- a/src/components/ui/context-menu/ContextMenuCheckboxItem.vue +++ b/src/components/ui/context-menu/ContextMenuCheckboxItem.vue @@ -5,6 +5,7 @@ import type { HTMLAttributes } from "vue"; import { reactiveOmit } from "@vueuse/core"; import { CheckIcon } from "lucide-vue-next"; import { ContextMenuCheckboxItem, ContextMenuItemIndicator, useForwardPropsEmits } from "reka-ui"; +import { shouldSuppressRepeatedActivation, suppressEvent, type ActionActivationGuard } from "@/lib/actionActivation"; import { cn } from "@/lib/utils"; const props = defineProps(); @@ -13,12 +14,21 @@ const emits = defineEmits(); const delegatedProps = reactiveOmit(props, "class"); const forwarded = useForwardPropsEmits(delegatedProps, emits); +const activationGuard: ActionActivationGuard = {}; + +function guardRepeatedClick(event: MouseEvent) { + if (props.disabled) return; + if (shouldSuppressRepeatedActivation(activationGuard)) { + suppressEvent(event); + } +}