feat(web): downloads and organize records open the shared organize wizard (FE-4)

下载详情"整理"按内容路径(经下载器路径映射)换算成登记目录后打开向导;整理记录详情加"重新整理";
整理记录页"手动整理"转到文件管理;删除旧的 downloads/organize-dialog。

Co-Authored-By: Claude Opus 5.5 <[email protected]>
This commit is contained in:
rootandClaude Opus 5.5 committed 2026-09-28 16:26:52 +08:00
1 parent c31df8b69a
commit 563098c77a
4 files changed
+25 -358

No files matched your search

+12 -1
View File
@@ -1,5 +1,5 @@
import type { PublicOrganizationFile, PublicPathRef } from "@umt/contracts";
import { ArrowLeft, ArrowRight, Bot, ChevronRight } from "lucide-react";
import { ArrowLeft, ArrowRight, Bot, ChevronRight, Wand2 } from "lucide-react";
import { useState } from "react";
import { Link, useParams } from "react-router";
import { RECORD_STATUS_LABEL, RECORD_STATUS_TONE, TRIGGER_LABEL, useRecord } from "~/api/records.ts";
@@ -8,6 +8,7 @@ import { ErrorState, LoadingState } from "~/components/console/empty-state.tsx";
import { KvList } from "~/components/console/kv-list.tsx";
import { PageHeader } from "~/components/console/page-header.tsx";
import { StatusBadge, type StatusTone } from "~/components/console/status-badge.tsx";
import { OrganizeWizard } from "~/components/organize-wizard/organize-wizard.tsx";
import { Button } from "~/components/ui/button.tsx";
import { actorTypeLabel } from "~/lib/labels.ts";
import { cn, formatBytes, formatDateTime } from "~/lib/utils.ts";
@@ -118,6 +119,7 @@ export default function OrganizeRecordPage() {
const { id = "" } = useParams();
const rec = useRecord(id);
const r = rec.data;
const [reorganize, setReorganize] = useState(false);
return (
<>
@@ -134,6 +136,12 @@ export default function OrganizeRecordPage() {
全部记录
</Link>
</Button>
{r && (r.action === "copy" || r.action === "move") && r.status !== "queued" && r.status !== "running" ? (
<Button variant="outline" size="sm" onClick={() => setReorganize(true)}>
<Wand2 />
重新整理
</Button>
) : null}
{r && (r.status === "failed" || r.status === "partial") ? (
<Button
variant="outline"
@@ -236,6 +244,9 @@ export default function OrganizeRecordPage() {
</section>
</div>
)}
{reorganize && r ? (
<OrganizeWizard source={{ kind: "record", recordId: r.id }} onClose={() => setReorganize(false)} />
) : null}
</>
);
}
+2 -5
View File
@@ -9,7 +9,6 @@ import { type DataColumn, DataTable } from "~/components/console/data-table.tsx"
import { FilterBar, FilterSelect } from "~/components/console/filter-bar.tsx";
import { PageHeader } from "~/components/console/page-header.tsx";
import { StatusBadge } from "~/components/console/status-badge.tsx";
import { OrganizeDialog } from "~/components/downloads/organize-dialog.tsx";
import { Button } from "~/components/ui/button.tsx";
import { relTime } from "~/components/workbench/release-fields.ts";
import { useSse } from "~/lib/sse.ts";
@@ -89,7 +88,6 @@ export default function OrganizePage() {
const [trigger, setTrigger] = useState("");
const [qInput, setQInput] = useState("");
const [q, setQ] = useState("");
const [organizing, setOrganizing] = useState(false);
const entityId = params.get("mediaEntityId") ?? undefined;
const navigate = useNavigate();
const qc = useQueryClient();
@@ -113,7 +111,7 @@ export default function OrganizePage() {
title="整理记录"
description="每次整理的前后路径与逐文件结果,自动和手动整理都记在这里。"
actions={
<Button size="sm" onClick={() => setOrganizing(true)}>
<Button size="sm" onClick={() => navigate("/console/files")}>
<FolderInput />
手动整理
</Button>
@@ -165,10 +163,9 @@ export default function OrganizePage() {
empty={{
icon: FileStack,
title: filtered ? "没有符合筛选的整理记录" : "还没有整理记录",
description: "下载完成后会自动整理,也可以点“手动整理”。",
description: "下载完成后会自动整理,也可以在文件管理里选中文件整理。",
}}
/>
{organizing ? <OrganizeDialog open onOpenChange={(o) => !o && setOrganizing(false)} /> : null}
</>
);
}