20260728173026

This commit is contained in:
oneao committed 2026-07-28 17:30:27 +08:00
1 parent 63588bd217
commit 5ec7aadef9
25 files changed
+627 -462

No files matched your search

+57 -2
View File
@@ -1,16 +1,71 @@
<script setup>
import { computed, ref } from "vue";
defineOptions({ inheritAttrs: false });
defineProps({
const props = defineProps({
blockNode: { type: Boolean, default: true },
virtual: { type: Boolean, default: true },
// 右键菜单生成函数:(node) => { items: [...] }
contextMenu: { type: Function, default: null },
contextMenuDisabled: { type: Boolean, default: false },
});
const emit = defineEmits(["menuClick"]);
const contextNode = ref(null);
function onTreeRightClick({ node }) {
contextNode.value = node;
}
const contextMenuItems = computed(() => {
if (!props.contextMenu || !contextNode.value) return undefined;
const result = props.contextMenu(contextNode.value);
if (!result) return undefined;
return { ...result, onClick: onMenuClick };
});
function onMenuClick({ key }) {
const node = contextNode.value;
contextNode.value = null;
if (node) emit("menuClick", { key, node });
}
</script>
<template>
<a-tree v-bind="$attrs" :block-node="blockNode" :virtual="virtual">
<a-dropdown
v-if="contextMenu"
:trigger="['contextmenu']"
:menu="contextMenuItems"
:disabled="contextMenuDisabled"
>
<div class="fms-tree-wrapper">
<a-tree
v-bind="$attrs"
:block-node="blockNode"
:virtual="virtual"
@right-click="onTreeRightClick"
>
<template v-for="(_, name) in $slots" :key="name" #[name]="slotProps">
<slot :name="name" v-bind="slotProps || {}" />
</template>
</a-tree>
</div>
</a-dropdown>
<a-tree v-else v-bind="$attrs" :block-node="blockNode" :virtual="virtual">
<template v-for="(_, name) in $slots" :key="name" #[name]="slotProps">
<slot :name="name" v-bind="slotProps || {}" />
</template>
</a-tree>
</template>
<style scoped lang="scss">
.fms-tree-wrapper {
display: flex;
flex: 1;
min-height: 0;
overflow: hidden;
flex-direction: column;
}
</style>