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 @@