import { useEffect, useMemo, useState } from 'react' import { Card, Empty, Grid, Input, Modal, Select, Space, Switch, Tag, Typography } from '@arco-design/web-react' import { IconCalendar, IconCheckCircleFill, IconDashboard, IconFile, IconRobot, } from '@arco-design/web-react/icon' import type { Project, ProjectWorkspace, TaskItem } from './projects/project-types' const { Row, Col } = Grid const { Title, Text, Paragraph } = Typography const { TextArea } = Input export type WorkspaceTaskUpdate = { originalProjectId: string nextProjectId: string taskId: string title: string summary: string tag: string completed: boolean } type WorkspaceTask = TaskItem & { project: Project } type TaskDraft = { title: string summary: string projectId: string tag: string completed: boolean } export function WorkspacePage({ workspaces, onUpdateTask, }: { workspaces: ProjectWorkspace[] onOpenTask: (project: Project, taskID: string) => void onUpdateTask: (update: WorkspaceTaskUpdate) => void }) { const projects = workspaces.map((workspace) => workspace.project) const projectOptions = useMemo(() => workspaces.map((workspace) => workspace.project), [workspaces]) const unfinishedTasks: WorkspaceTask[] = workspaces.flatMap((workspace) => workspace.tasks .filter((task) => !task.completed) .map((task) => ({ ...task, project: workspace.project, })), ) const [editingTask, setEditingTask] = useState(null) const [draft, setDraft] = useState({ title: '', summary: '', projectId: '', tag: '', completed: false }) const tagOptions = useMemo(() => { const selectedWorkspace = workspaces.find((workspace) => workspace.project.id === draft.projectId) return selectedWorkspace?.tags.filter((tag) => tag !== 'all' && tag !== '全部') ?? [] }, [draft.projectId, workspaces]) useEffect(() => { if (!editingTask) return setDraft({ title: editingTask.title, summary: editingTask.summary, projectId: editingTask.project.id, tag: editingTask.tag, completed: editingTask.completed, }) }, [editingTask]) useEffect(() => { if (!draft.tag || tagOptions.includes(draft.tag)) return setDraft((value) => ({ ...value, tag: '' })) }, [draft.tag, tagOptions]) const aiSessions = workspaces.flatMap((workspace) => workspace.aiSessions) const notes = workspaces.flatMap((workspace) => workspace.notes) const urgentProjects = projects.filter((project) => project.urgent).length const workspaceMetrics = [ { title: '项目总数', value: projects.length, delta: `${urgentProjects} 个高优先级`, icon: , color: 'arcoblue' }, { title: '未完成计划', value: unfinishedTasks.length, delta: '跨项目聚合', icon: , color: 'green' }, { title: 'AI 对话', value: aiSessions.length, delta: '项目内上下文', icon: , color: 'purple' }, { title: '知识资料', value: notes.length, delta: '笔记与资料合计', icon: , color: 'cyan' }, ] return (
工作台 所有项目的统一工作台,汇总项目任务、AI 对话和知识资产。
{workspaceMetrics.map((metric) => ( {metric.icon}
{metric.title} {metric.value} {metric.delta}
))}
未完成的计划 {unfinishedTasks.length}
{unfinishedTasks.length ? (
{unfinishedTasks.map((task) => ( ))}
) : ( )}
setEditingTask(null)} onOk={() => { if (!editingTask) return onUpdateTask({ originalProjectId: editingTask.project.id, nextProjectId: draft.projectId, taskId: editingTask.id, title: draft.title.trim() || editingTask.title, summary: draft.summary.trim(), tag: draft.tag.trim(), completed: draft.completed, }) setEditingTask(null) }} >