diff --git a/hub/filelib-web/src/lib/GridLibraryView.svelte b/hub/filelib-web/src/lib/GridLibraryView.svelte index 8e9c90a..4385d6a 100644 --- a/hub/filelib-web/src/lib/GridLibraryView.svelte +++ b/hub/filelib-web/src/lib/GridLibraryView.svelte @@ -515,7 +515,7 @@ {#if modal === "detail" && detailNode} (modal = null)}> - + { modal = null; refresh(); }} /> {/if} diff --git a/hub/filelib-web/src/lib/OverviewPanel.svelte b/hub/filelib-web/src/lib/OverviewPanel.svelte index 694bf02..82881e9 100644 --- a/hub/filelib-web/src/lib/OverviewPanel.svelte +++ b/hub/filelib-web/src/lib/OverviewPanel.svelte @@ -6,15 +6,32 @@ import type { ExportJob, NodeDetail } from "./types.js"; import Modal from "./Modal.svelte"; - let { node }: { node: NodeDetail } = $props(); + let { node, ondeleted }: { node: NodeDetail; ondeleted?: () => void } = $props(); let showEditDesc = $state(false); let descDraft = $state(""); let exportJob = $state(null); + let deleting = $state(false); const canEdit = $derived(node.role === "MANAGE" || node.role === "EDIT"); + const canManage = $derived(node.role === "MANAGE"); const roleLabel = $derived(ROLE_LABEL[node.role]); + /** 删除(进回收站,可恢复;ADR-0031)。MANAGE 专属,与右键菜单同语义。 */ + async function deleteNode(): Promise { + if (!confirm(`删除「${node.name}」?移入回收站,可在回收站恢复。`)) return; + deleting = true; + try { + await api(`/database/api/nodes/${node.id}`, { method: "DELETE" }); + toastOk("已移入回收站"); + ondeleted?.(); + } catch (e) { + toastErr(e instanceof Error ? e.message : String(e)); + } finally { + deleting = false; + } + } + $effect(() => { void node.id; exportJob = null; @@ -113,6 +130,17 @@ {/if} {/if} + + {#if canManage} +
+ +
+ 删除后移入回收站,可恢复 + +
+ {/if} {#if showEditDesc}