Files
ttstd-infinite-canvas/web/src/components/canvas/canvas-workspace-task-panel.tsx
ddCat e93bf3ca39 feat(canvas): 画布工作区 - 整合侧栏与风格预设并修复提示词回填
选择性整合 #547,保留主分支节点与工具条设计。新增默认折叠的节点、资产、任务和历史面板,风格与预设保留在节点内,移除重复入口。

补齐工具权限、提示词解析、资源引用保护及数据库迁移,修复提示词清空和连续编辑后的生成配置同步。

验证:前端全量 1925 项测试、构建、类型检查及 lint 通过;后端 go test ./... 通过。真实模型、PostgreSQL 实库与登录态页面验收仍待进行。

Refs #547

Co-authored-by: bensharp <bensharp@qq.com>
2026-09-20 16:40:08 +08:00

36 lines
1.9 KiB
TypeScript

import { ListChecks, RefreshCw } from "lucide-react";
import { WorkspaceState } from "@/components/layout/workspace-state";
import type { GenerationTask } from "@/services/api/task-center";
import { TaskListItem } from "./canvas-workspace-task-list-item";
// 任务面板:展示用户直接发起的生成任务;云端 Agent 内部任务由历史面板承载。
export function CanvasWorkspaceTaskPanel({ tasks, refreshing, onRefresh, onCancelTask }: { tasks: GenerationTask[]; refreshing?: boolean; onRefresh?: () => void; onCancelTask?: (task: GenerationTask) => void }) {
return (
<>
<header className="flex h-12 shrink-0 items-center gap-2 border-b border-border px-2.5">
<ListChecks className="size-3.5 shrink-0" />
<span className="truncate text-xs font-semibold">任务</span>
<span className="tabular-nums text-foreground/32">{tasks.length.toLocaleString("zh-CN")}</span>
<span className="ml-auto">
<button type="button" className="icon-btn tip-down" data-tip="刷新" aria-label="刷新" onClick={onRefresh}>
<RefreshCw className={`size-3.5 ${refreshing ? "animate-spin" : ""}`} />
</button>
</span>
</header>
<div className="thin-scrollbar min-h-0 flex-1 overflow-y-auto overscroll-contain py-1">
{tasks.length ? (
<div className="space-y-0.5">
{tasks.map((task) => (
<TaskListItem key={task.id} task={task} onCancelTask={onCancelTask} />
))}
</div>
) : (
<WorkspaceState icon="canvas" compact title="暂无任务" description="点击画布上的生成按钮开始创作。" />
)}
</div>
</>
);
}