refactor(explorer): optimize openFolder (#148)

This commit is contained in:
Hayden
2025-02-22 18:10:11 +08:00
committed by GitHub
parent 759865e8ea
commit 450072e49d
7 changed files with 62 additions and 51 deletions

View File

@@ -138,8 +138,9 @@ class ModelManager:
stat = entry.stat()
return {
"type": folder if is_file else "folder",
"type": folder,
"subFolder": sub_folder,
"isFolder": not is_file,
"basename": basename,
"extension": extension,
"pathIndex": path_index,

View File

@@ -20,7 +20,6 @@
v-show="!showToolbar"
class="h-10 flex-1"
:items="folderPaths"
@item-click="(item, index) => openFolder(index, item.name, item.icon)"
></ResponseBreadcrumb>
</div>
@@ -211,7 +210,7 @@ const currentDataList = computed(() => {
const modelItems: ModelTreeNode[] = []
for (const item of renderedList) {
if (item.type === 'folder') {
if (item.isFolder) {
folderItems.push(item)
} else {
modelItems.push(item)
@@ -281,8 +280,9 @@ const confirmName = ref('')
const openItem = (item: ModelTreeNode, e: Event) => {
menu.value.hide(e)
if (item.type === 'folder') {
openFolder(folderPaths.value.length, item.basename)
if (item.isFolder) {
searchContent.value = undefined
openFolder(item)
} else {
openModelDetail(item)
}

View File

@@ -216,7 +216,7 @@ const cols = computed(() => {
const list = computed(() => {
const mergedList = Object.values(data.value).flat()
const pureModels = mergedList.filter((item) => {
return item.type !== 'folder'
return !item.isFolder
})
const filterList = pureModels.filter((model) => {

View File

@@ -5,7 +5,7 @@
>
<div data-card-main class="flex h-full w-full flex-col">
<div data-card-preview class="flex-1 overflow-hidden">
<div v-if="model.type === 'folder'" class="h-full w-full">
<div v-if="model.isFolder" class="h-full w-full">
<svg
class="icon"
viewBox="0 0 1024 1024"
@@ -39,7 +39,7 @@
</div>
<div
v-if="model.type !== 'folder'"
v-if="!model.isFolder"
data-draggable-overlay
class="absolute left-0 top-0 h-full w-full"
draggable="true"
@@ -47,7 +47,7 @@
></div>
<div
v-if="model.type !== 'folder'"
v-if="!model.isFolder"
data-mode-type
class="pointer-events-none absolute left-2 top-2"
:style="{

View File

@@ -1,7 +1,7 @@
import { genModelFullName, useModels } from 'hooks/model'
import { cloneDeep, filter, find } from 'lodash'
import { BaseModel, Model, SelectOptions } from 'types/typings'
import { computed, ref, watchEffect } from 'vue'
import { computed, ref } from 'vue'
export interface FolderPathItem {
name: string
@@ -11,7 +11,6 @@ export interface FolderPathItem {
}
export type ModelFolder = BaseModel & {
type: 'folder'
children: ModelTreeNode[]
}
@@ -31,18 +30,23 @@ export const useModelExplorer = () => {
const folderPaths = ref<FolderPathItem[]>([])
const genFolderItem = (basename: string, subFolder: string): ModelFolder => {
const genFolderItem = (
basename: string,
folder?: string,
subFolder?: string,
): ModelFolder => {
return {
id: basename,
basename: basename,
subFolder: subFolder,
subFolder: subFolder ?? '',
pathIndex: 0,
sizeBytes: 0,
extension: '',
description: '',
metadata: {},
preview: '',
type: 'folder',
type: folder ?? '',
isFolder: true,
children: [],
}
}
@@ -52,7 +56,7 @@ export const useModelExplorer = () => {
for (const folder in folders.value) {
if (Object.prototype.hasOwnProperty.call(folders.value, folder)) {
const folderItem = genFolderItem(folder, '')
const folderItem = genFolderItem(folder)
const folderModels = cloneDeep(data.value[folder]) ?? []
@@ -82,58 +86,63 @@ export const useModelExplorer = () => {
}
}
const root: ModelTreeNode = genFolderItem('root', '')
const root: ModelTreeNode = genFolderItem('root')
root.children = rootChildren
return [root]
})
function findFolder(list: ModelTreeNode[], name: string) {
return find(list, { type: 'folder', basename: name }) as
return find(list, { isFolder: true, basename: name }) as
| ModelFolder
| undefined
}
function findFolders(list: ModelTreeNode[]) {
return filter(list, { type: 'folder' }) as ModelFolder[]
return filter(list, { isFolder: true }) as ModelFolder[]
}
async function openFolder(level: number, name: string, icon?: string) {
if (folderPaths.value.length >= level) {
folderPaths.value.splice(level)
async function openFolder(item: BaseModel) {
const folderItems: FolderPathItem[] = []
const folder = item.type
const subFolderParts = item.subFolder.split('/').filter(Boolean)
const pathParts: string[] = []
if (folder) {
pathParts.push(folder, ...subFolderParts)
}
pathParts.push(item.basename)
if (pathParts[0] !== 'root') {
pathParts.unshift('root')
}
let currentLevel = dataTreeList.value
for (const folderItem of folderPaths.value) {
const found = findFolder(currentLevel, folderItem.name)
currentLevel = found?.children || []
let levelFolders = findFolders(dataTreeList.value)
for (const [index, part] of pathParts.entries()) {
const currentFolder = findFolder(levelFolders, part)
if (!currentFolder) {
break
}
const folderItem = findFolder(currentLevel, name)
const folderItemChildren = folderItem?.children ?? []
const subFolders = findFolders(folderItemChildren)
folderPaths.value.push({
name,
icon,
levelFolders = findFolders(currentFolder.children ?? [])
folderItems.push({
name: currentFolder.basename,
icon: index === 0 ? 'pi pi-desktop' : '',
onClick: () => {
openFolder(level, name, icon)
openFolder(currentFolder)
},
children: subFolders.map((item) => {
const name = item.basename
children: levelFolders.map((child) => {
const name = child.basename
return {
value: name,
label: name,
command: () => openFolder(level + 1, name),
command: () => openFolder(child),
}
}),
})
}
watchEffect(() => {
if (Object.keys(folders.value).length > 0 && folderPaths.value.length < 2) {
openFolder(0, 'root', 'pi pi-desktop')
folderPaths.value = folderItems
}
}, {})
return {
folders,

View File

@@ -446,7 +446,7 @@ export const useModelFolder = (
}
const folderItems = cloneDeep(models.value[type]) ?? []
const pureFolders = folderItems.filter((item) => item.type === 'folder')
const pureFolders = folderItems.filter((item) => item.isFolder)
pureFolders.sort((a, b) => a.basename.localeCompare(b.basename))
const folders = modelFolders.value[type] ?? []

View File

@@ -9,6 +9,7 @@ export interface BaseModel {
type: string
subFolder: string
pathIndex: number
isFolder: boolean
preview: string | string[]
description: string
metadata: Record<string, string>