mirror of
https://github.com/directus/directus.git
synced 2026-01-28 00:57:55 -05:00
Fix deeply nested folder event and overflow (#445)
* Fix deeply nested folder event and overflow * Fix code smell
This commit is contained in:
@@ -1,7 +1,7 @@
|
||||
<template>
|
||||
<div class="v-list-group">
|
||||
<v-list-item :active="active" class="activator" :to="to" @click="onClick">
|
||||
<slot name="activator" />
|
||||
<slot name="activator" :active="groupActive" />
|
||||
|
||||
<v-list-item-icon class="activator-icon" :class="{ active: groupActive }">
|
||||
<v-icon name="chevron_left" @click.stop.prevent="toggle" />
|
||||
|
||||
@@ -1,13 +1,13 @@
|
||||
<template>
|
||||
<v-list-item
|
||||
v-if="folder.children === undefined"
|
||||
@click="$emit('click', folder.id)"
|
||||
@click="clickHandler(folder.id)"
|
||||
:active="currentFolder === folder.id"
|
||||
>
|
||||
<v-list-item-icon><v-icon name="folder" /></v-list-item-icon>
|
||||
<v-list-item-content>{{ folder.name }}</v-list-item-content>
|
||||
</v-list-item>
|
||||
<v-list-group v-else @click="$emit('click', folder.id)" :active="currentFolder === folder.id">
|
||||
<v-list-group v-else @click="clickHandler(folder.id)" :active="currentFolder === folder.id">
|
||||
<template #activator="{ active }">
|
||||
<v-list-item-icon>
|
||||
<v-icon :name="active ? 'folder_open' : 'folder'" />
|
||||
@@ -19,7 +19,7 @@
|
||||
:key="childFolder.id"
|
||||
:folder="childFolder"
|
||||
:current-folder="currentFolder"
|
||||
@click="$emit('click', childFolder.id)"
|
||||
:click-handler="clickHandler"
|
||||
/>
|
||||
</v-list-group>
|
||||
</template>
|
||||
@@ -39,6 +39,10 @@ export default defineComponent({
|
||||
type: Number,
|
||||
default: null,
|
||||
},
|
||||
clickHandler: {
|
||||
type: Function,
|
||||
default: () => undefined,
|
||||
},
|
||||
},
|
||||
});
|
||||
</script>
|
||||
|
||||
@@ -13,13 +13,16 @@
|
||||
</v-list-item>
|
||||
</template>
|
||||
|
||||
<navigation-folder
|
||||
@click="$emit('filter', $event)"
|
||||
v-for="folder in folders"
|
||||
:key="folder.id"
|
||||
:folder="folder"
|
||||
:current-folder="currentFolder"
|
||||
/>
|
||||
<div class="folders">
|
||||
<navigation-folder
|
||||
@click="$emit('filter', $event)"
|
||||
v-for="folder in folders"
|
||||
:key="folder.id"
|
||||
:folder="folder"
|
||||
:current-folder="currentFolder"
|
||||
:click-handler="(id) => $emit('filter', id)"
|
||||
/>
|
||||
</div>
|
||||
</v-list>
|
||||
</template>
|
||||
|
||||
@@ -52,4 +55,15 @@ export default defineComponent({
|
||||
::v-deep .v-skeleton-loader {
|
||||
--v-skeleton-loader-background-color: var(--background-normal-alt);
|
||||
}
|
||||
|
||||
.folders {
|
||||
width: 100%;
|
||||
overflow-x: hidden;
|
||||
|
||||
::v-deep .v-list-item-content {
|
||||
overflow: hidden;
|
||||
white-space: nowrap;
|
||||
text-overflow: ellipsis;
|
||||
}
|
||||
}
|
||||
</style>
|
||||
|
||||
@@ -58,18 +58,20 @@ export default function useFolders() {
|
||||
|
||||
export function nestFolders(rawFolders: FolderRaw[]) {
|
||||
return rawFolders
|
||||
.map((folderRaw) => {
|
||||
const folder: FolderRaw & Folder = { ...folderRaw };
|
||||
|
||||
const children = rawFolders.filter(
|
||||
(childFolder) => childFolder.parent_folder === folderRaw.id
|
||||
);
|
||||
|
||||
if (children.length > 0) {
|
||||
folder.children = children;
|
||||
}
|
||||
|
||||
return folder;
|
||||
})
|
||||
.map((rawFolder) => nestChildren(rawFolder, rawFolders))
|
||||
.filter((folder) => folder.parent_folder === null);
|
||||
}
|
||||
|
||||
export function nestChildren(rawFolder: FolderRaw, rawFolders: FolderRaw[]) {
|
||||
const folder: FolderRaw & Folder = { ...rawFolder };
|
||||
|
||||
const children = rawFolders
|
||||
.filter((childFolder) => childFolder.parent_folder === rawFolder.id)
|
||||
.map((childRawFolder) => nestChildren(childRawFolder, rawFolders));
|
||||
|
||||
if (children.length > 0) {
|
||||
folder.children = children;
|
||||
}
|
||||
|
||||
return folder;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user