Browse Source

fix: refactor context-menu.vue for improved structure

pull/7858/head
mew 5 months ago
committed by GitHub
parent
commit
80552cb994
No known key found for this signature in database GPG Key ID: B5690EEEBB952194
  1. 110
      packages/@core/ui-kit/shadcn-ui/src/components/context-menu/context-menu.vue

110
packages/@core/ui-kit/shadcn-ui/src/components/context-menu/context-menu.vue

@ -3,15 +3,15 @@ import type {
ContextMenuContentProps, ContextMenuContentProps,
ContextMenuRootEmits, ContextMenuRootEmits,
ContextMenuRootProps, ContextMenuRootProps,
} from 'reka-ui'; } from "reka-ui";
import type { ClassType } from '@vben-core/typings'; import type { ClassType } from "@vben-core/typings";
import type { IContextMenuItem } from './interface'; import type { IContextMenuItem } from "./interface";
import { computed } from 'vue'; import { computed, onMounted, onUnmounted, ref } from "vue";
import { useForwardPropsEmits } from 'reka-ui'; import { useForwardPropsEmits } from "reka-ui";
import { import {
ContextMenu, ContextMenu,
@ -20,7 +20,7 @@ import {
ContextMenuSeparator, ContextMenuSeparator,
ContextMenuShortcut, ContextMenuShortcut,
ContextMenuTrigger, ContextMenuTrigger,
} from '../../ui/context-menu'; } from "../../ui/context-menu";
const props = defineProps< const props = defineProps<
ContextMenuRootProps & { ContextMenuRootProps & {
@ -36,12 +36,12 @@ const props = defineProps<
const emits = defineEmits<ContextMenuRootEmits>(); const emits = defineEmits<ContextMenuRootEmits>();
const NATIVE_CONTEXT_SELECTORS = [ const NATIVE_CONTEXT_SELECTORS = [
'input', "input",
'textarea', "textarea",
'select', "select",
'[contenteditable="true"]', '[contenteditable="true"]',
'.allow-native-context', ".allow-native-context",
].join(', '); ].join(", ");
const delegatedProps = computed(() => { const delegatedProps = computed(() => {
const { const {
@ -75,42 +75,62 @@ function handleContextMenuCapture(e: MouseEvent) {
e.stopPropagation(); e.stopPropagation();
} }
} }
const triggerRef = ref<HTMLElement | null>(null);
function onContextMenuCapture(e: MouseEvent) {
if ((e.target as HTMLElement).closest(NATIVE_CONTEXT_SELECTORS)) {
e.stopPropagation();
}
}
onMounted(() => {
triggerRef.value?.addEventListener("contextmenu", onContextMenuCapture, {
capture: true,
});
});
onUnmounted(() => {
triggerRef.value?.removeEventListener("contextmenu", onContextMenuCapture, {
capture: true,
});
});
</script> </script>
<template> <template>
<div @contextmenu.capture="handleContextMenuCapture"> <ContextMenu v-bind="forwarded">
<ContextMenu v-bind="forwarded"> <ContextMenuTrigger as-child>
<ContextMenuTrigger as-child> <div ref="triggerRef">
<slot></slot> <slot></slot>
</ContextMenuTrigger> </div>
<ContextMenuContent </ContextMenuTrigger>
:class="contentClass" <ContextMenuContent
v-bind="contentProps" :class="contentClass"
class="side-content z-popup" v-bind="contentProps"
> class="side-content z-popup"
<template v-for="menu in menusView" :key="menu.key"> >
<ContextMenuItem <template v-for="menu in menusView" :key="menu.key">
v-if="!menu.hidden" <ContextMenuItem
:class="itemClass" v-if="!menu.hidden"
:disabled="menu.disabled" :class="itemClass"
:inset="menu.inset || !menu.icon" :disabled="menu.disabled"
class="cursor-pointer" :inset="menu.inset || !menu.icon"
@click="handleClick(menu)" class="cursor-pointer"
> @click="handleClick(menu)"
<component >
:is="menu.icon" <component
v-if="menu.icon" :is="menu.icon"
class="mr-2 size-4 text-lg" v-if="menu.icon"
/> class="mr-2 size-4 text-lg"
/>
{{ menu.text }}
<ContextMenuShortcut v-if="menu.shortcut"> {{ menu.text }}
{{ menu.shortcut }} <ContextMenuShortcut v-if="menu.shortcut">
</ContextMenuShortcut> {{ menu.shortcut }}
</ContextMenuItem> </ContextMenuShortcut>
<ContextMenuSeparator v-if="menu.separator" /> </ContextMenuItem>
</template> <ContextMenuSeparator v-if="menu.separator" />
</ContextMenuContent> </template>
</ContextMenu> </ContextMenuContent>
<div> </ContextMenu>
</template> </template>

Loading…
Cancel
Save