feat(web): regroup console nav into 7 groups, split downloads/plans/tasks, add legacy redirects

- Sidebar: 概览/资源/订阅/下载/整理/Agent/系统, 18 items (+ 定时任务); single
  active item via findNavItem; 待处理 badge; collapsed rail groups; mobile drawer
  shares NAV_GROUPS.
- New pages: /downloads (queue + cache watermark header), /downloads/plans,
  /downloads/:id, /tasks (business tasks only) + /tasks/:id detail, /rules.
- Legacy links: ?tab= on tasks/subscriptions/sources redirect via clientLoader;
  /tasks/:downloadId falls back to /downloads/:id.
- List filters in URL query; settingsPath() helper for settings deep links.
- Copy per glossary (待处理, 收录策略, 引擎面板, 文件管理, 版本目标).

Co-Authored-By: Claude Opus 5.5 <[email protected]>
This commit is contained in:
rootandClaude Opus 5.5 committed 2026-09-28 02:46:47 +08:00
1 parent 5843527317
commit 909cd2ad49
31 files changed
+1247 -609

No files matched your search

+7 -4
View File
@@ -230,7 +230,7 @@ function CurrentWork({ w }: { w: Dashboard["currentWork"] }) {
];
const idle = counts.every((c) => c.v === 0) && w.items.length === 0 && w.agentRuns.length === 0;
return (
<Section title="当前工作" icon={Activity} to={consolePath("tasks")}>
<Section title="当前工作" icon={Activity} to={consolePath("downloads")}>
<div className="mb-2 flex flex-wrap gap-x-4 gap-y-1 text-meta text-muted-foreground">
{counts.map((c) => (
<span key={c.label}>
@@ -246,7 +246,10 @@ function CurrentWork({ w }: { w: Dashboard["currentWork"] }) {
const s = downloadLabel(it.status);
return (
<Row key={it.downloadTaskId}>
<Link to={consolePath("tasks", it.downloadTaskId)} className="min-w-0 flex-1 truncate hover:underline">
<Link
to={consolePath("downloads", it.downloadTaskId)}
className="min-w-0 flex-1 truncate hover:underline"
>
{it.name}
</Link>
<span className="shrink-0 text-meta text-muted-foreground tabular-nums">
@@ -300,7 +303,7 @@ function NeedsAttention({ n }: { n: Dashboard["needsAttention"] }) {
function CacheSection({ c }: { c: Dashboard["cache"] }) {
return (
<Section title="缓存与保留" icon={HardDrive} to={consolePath("settings")}>
<Section title="缓存水位" icon={HardDrive} to={consolePath("downloads")}>
{c.volumes.length === 0 ? (
<EmptyState
plain
@@ -402,7 +405,7 @@ function SourcesSection({ s }: { s: Dashboard["sources"] }) {
plain
icon={Radio}
title="还没有来源"
description="在系统设置或来源页登记站点、Feed 与实例。"
description="在站点工作台登记站点,在来源健康新建 Feed。"
className="py-6"
/>
) : (