From 87bbf0bd57c8317403e8c7898398eb19fee0ebe6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=99=BD?= <3401797899@qq.com> Date: Mon, 27 Jul 2026 21:25:05 +0800 Subject: [PATCH] =?UTF-8?q?feat(filelib-web):=20=E5=88=B7=E6=96=B0?= =?UTF-8?q?=E9=A1=B5=E9=9D=A2=E6=97=B6=E4=BF=9D=E6=8C=81=E6=A0=91=E5=B1=95?= =?UTF-8?q?=E5=BC=80=E3=80=81=E9=80=89=E4=B8=AD=E8=8A=82=E7=82=B9=E3=80=81?= =?UTF-8?q?tab=20=E4=B8=8E=E6=96=87=E4=BB=B6=E5=A4=B9=E4=BD=8D=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- hub/filelib-web/src/lib/FilesPanel.svelte | 19 ++++++- hub/filelib-web/src/lib/LibraryView.svelte | 21 ++++++-- .../src/lib/NodeDetailPanel.svelte | 29 +++++++++-- hub/filelib-web/src/lib/browser.ts | 51 +++++++++++++++++-- 4 files changed, 108 insertions(+), 12 deletions(-) diff --git a/hub/filelib-web/src/lib/FilesPanel.svelte b/hub/filelib-web/src/lib/FilesPanel.svelte index 839dfde..02b02a3 100644 --- a/hub/filelib-web/src/lib/FilesPanel.svelte +++ b/hub/filelib-web/src/lib/FilesPanel.svelte @@ -39,6 +39,14 @@ let currentDir = $state(""); let viewMode = $state<"list" | "grid">(loadViewMode()); + function restoreCurrentDir(nodeId: string): string { + try { + return sessionStorage.getItem(`filelib.dir.${nodeId}`) ?? ""; + } catch { + return ""; + } + } + function loadViewMode(): "list" | "grid" { try { return localStorage.getItem("filelib.viewMode") === "grid" ? "grid" : "list"; @@ -72,10 +80,17 @@ void loadFiles(); }); - // 切换项目时回到根目录 —— 不同项目的目录结构互不相干。 + // 切换项目时恢复对应项目的目录位置。 $effect(() => { void node.id; - currentDir = ""; + currentDir = restoreCurrentDir(node.id); + }); + + // currentDir 变化时持久化。 + $effect(() => { + try { + sessionStorage.setItem(`filelib.dir.${node.id}`, currentDir); + } catch { /* ignore */ } }); $effect(() => { diff --git a/hub/filelib-web/src/lib/LibraryView.svelte b/hub/filelib-web/src/lib/LibraryView.svelte index 6604f45..74b950c 100644 --- a/hub/filelib-web/src/lib/LibraryView.svelte +++ b/hub/filelib-web/src/lib/LibraryView.svelte @@ -9,8 +9,8 @@ import { api } from "./api.js"; import { me, toastErr, toastOk } from "./stores.js"; import { logout } from "./session.js"; - import { treeVersion, bumpTree, currentNode, selectedFilePath, clearSelectedFile, bumpFiles } from "./browser.js"; - import type { NodeChild } from "./types.js"; + import { treeVersion, bumpTree, currentNode, breadcrumb, selectedFilePath, clearSelectedFile, bumpFiles, restoreNodeId } from "./browser.js"; + import type { NodeChild, NodeDetail, BreadcrumbEntry } from "./types.js"; import TreeNode from "./TreeNode.svelte"; import NodeDetailPanel from "./NodeDetailPanel.svelte"; import FileEditor from "./FileEditor.svelte"; @@ -35,7 +35,22 @@ } } - onMount(loadRoots); + onMount(async () => { + await loadRoots(); + // 刷新后恢复之前选中的节点。 + if (restoreNodeId) { + try { + const [detail, crumb] = await Promise.all([ + api<{ node: NodeDetail }>(`/database/api/nodes/${restoreNodeId}`), + api<{ breadcrumb: BreadcrumbEntry[] }>(`/database/api/nodes/${restoreNodeId}/breadcrumb`), + ]); + currentNode.set(detail.node); + breadcrumb.set(crumb.breadcrumb); + } catch { + // 节点已删除或无权访问,静默忽略。 + } + } + }); $effect(() => { void $treeVersion; void loadRoots(); diff --git a/hub/filelib-web/src/lib/NodeDetailPanel.svelte b/hub/filelib-web/src/lib/NodeDetailPanel.svelte index 97b65b2..8a3a98a 100644 --- a/hub/filelib-web/src/lib/NodeDetailPanel.svelte +++ b/hub/filelib-web/src/lib/NodeDetailPanel.svelte @@ -1,6 +1,6 @@