More refactor

This commit is contained in:
huchenlei
2024-08-31 17:54:06 -04:00
committed by Chenlei Hu
parent bc3ec65967
commit 488f0d82b4
2 changed files with 14 additions and 44 deletions

View File

@@ -18,32 +18,12 @@
}" }"
> >
<template #folder="{ node }"> <template #folder="{ node }">
<slot <slot name="folder" :node="node">
name="folder" <TreeFolder :node="node" />
v-bind="{
...nodeSlotProps,
node
}"
>
<TreeFolder :node="node" @itemDropped="handleItemDropped">
<template #folder-label="{ node }">
<EditableText
:modelValue="node.label"
:isEditing="renameEditingNode?.key === node.key"
@edit="(newName: string) => handleRename(node, newName)"
/>
</template>
</TreeFolder>
</slot> </slot>
</template> </template>
<template #node="{ node }"> <template #node="{ node }">
<slot <slot name="node" :node="node">
name="node"
v-bind="{
...nodeSlotProps,
node: node.data
}"
>
<TreeNode :node="node.data" /> <TreeNode :node="node.data" />
</slot> </slot>
</template> </template>
@@ -51,19 +31,18 @@
<ContextMenu ref="menu" :model="menuItems" /> <ContextMenu ref="menu" :model="menuItems" />
</template> </template>
<script setup lang="ts"> <script setup lang="ts">
import { ref, computed } from 'vue' import { ref, computed, provide } from 'vue'
import Tree from 'primevue/tree' import Tree from 'primevue/tree'
import ContextMenu from 'primevue/contextmenu' import ContextMenu from 'primevue/contextmenu'
import EditableText from '@/components/common/EditableText.vue'
import TreeFolder from '@/components/common/treeExplorer/TreeFolder.vue' import TreeFolder from '@/components/common/treeExplorer/TreeFolder.vue'
import TreeNode from '@/components/common/treeExplorer/TreeNode.vue' import TreeNode from '@/components/common/treeExplorer/TreeNode.vue'
import type { import type {
RenderedTreeExplorerNode, RenderedTreeExplorerNode,
TreeExplorerNode, TreeExplorerNode
TreeExplorerNodeSlotProps
} from '@/types/treeExplorerTypes' } from '@/types/treeExplorerTypes'
import type { MenuItem } from 'primevue/menuitem' import type { MenuItem } from 'primevue/menuitem'
import { useTreeExpansion } from '@/hooks/treeHooks' import { useTreeExpansion } from '@/hooks/treeHooks'
const props = defineProps<{ const props = defineProps<{
roots: TreeExplorerNode[] roots: TreeExplorerNode[]
class?: string class?: string
@@ -79,9 +58,9 @@ const renderedRoots = computed<RenderedTreeExplorerNode[]>(() => {
return props.roots.map(fillNodeInfo) return props.roots.map(fillNodeInfo)
}) })
const getTreeNodeIcon = (node: TreeExplorerNode) => { const getTreeNodeIcon = (node: TreeExplorerNode) => {
if (typeof node.icon === 'function') { if (node.getIcon) {
return node.icon(node) return node.getIcon(node)
} else if (typeof node.icon === 'string') { } else if (node.icon) {
return node.icon return node.icon
} }
// node.icon is undefined // node.icon is undefined
@@ -103,9 +82,6 @@ const fillNodeInfo = (node: TreeExplorerNode): RenderedTreeExplorerNode => {
: children.reduce((acc, child) => acc + child.totalLeaves, 0) : children.reduce((acc, child) => acc + child.totalLeaves, 0)
} }
} }
const handleItemDropped = (node: TreeExplorerNode) => {
expandedKeys.value[node.key] = true
}
const onNodeContentClick = (e: MouseEvent, node: RenderedTreeExplorerNode) => { const onNodeContentClick = (e: MouseEvent, node: RenderedTreeExplorerNode) => {
if (!node.key) return if (!node.key) return
if (node.type === 'folder') { if (node.type === 'folder') {
@@ -115,7 +91,9 @@ const onNodeContentClick = (e: MouseEvent, node: RenderedTreeExplorerNode) => {
} }
const menu = ref(null) const menu = ref(null)
const menuTargetNode = ref<TreeExplorerNode | null>(null) const menuTargetNode = ref<TreeExplorerNode | null>(null)
provide('menuTargetNode', menuTargetNode)
const renameEditingNode = ref<TreeExplorerNode | null>(null) const renameEditingNode = ref<TreeExplorerNode | null>(null)
provide('renameEditingNode', renameEditingNode)
const menuItems = computed<MenuItem[]>(() => [ const menuItems = computed<MenuItem[]>(() => [
{ {
label: 'Rename', label: 'Rename',
@@ -131,17 +109,8 @@ const handleContextMenu = (node: RenderedTreeExplorerNode, e: MouseEvent) => {
emit('contextMenu', node, e) emit('contextMenu', node, e)
menu.value?.show(e) menu.value?.show(e)
} }
const handleRename = (node: RenderedTreeExplorerNode, newName: string) => {
emit('nodeRename', node, newName)
renameEditingNode.value = null
}
const nodeSlotProps: TreeExplorerNodeSlotProps = {
node: {} as TreeExplorerNode, // This will be overwritten by v-bind in the template
handleItemDropped,
renameEditingNode,
handleRename
}
</script> </script>
<style scoped> <style scoped>
.tree-explorer-node-label { .tree-explorer-node-label {
display: flex; display: flex;

View File

@@ -6,7 +6,8 @@ export interface TreeExplorerNode<T = any> {
data: T data: T
leaf: boolean leaf: boolean
children?: TreeExplorerNode<T>[] children?: TreeExplorerNode<T>[]
icon?: string | ((node: TreeExplorerNode<T>) => string) icon?: string
getIcon?: (node: TreeExplorerNode<T>) => string
} }
export interface RenderedTreeExplorerNode<T = any> extends TreeExplorerNode<T> { export interface RenderedTreeExplorerNode<T = any> extends TreeExplorerNode<T> {