Files
agent/apps/web_v1/src/pages/workspace-home.tsx

152 lines
4.8 KiB
TypeScript
Raw Normal View History

2026-07-20 10:50:42 +08:00
import { Layout } from '@arco-design/web-react'
import { WorkspacePage, type WorkspaceTaskUpdate } from './workspace-body'
import { WorkspaceExplorePage } from './workspace-explore'
2026-07-20 12:26:21 +08:00
import { ProjectChannelPage } from './projects/project-channel-page'
2026-07-21 01:18:06 +08:00
import type { ProjectTaskUpdate } from './projects/project-task-edit-modal'
2026-07-20 10:53:26 +08:00
import { ProjectRail } from './projects/project-rail'
import { ProjectSidebar, type ProjectSettingsUpdate } from './projects/project-sidebar'
2026-07-20 10:53:26 +08:00
import { ProjectStatusbar } from './projects/project-statusbar'
import { ProjectTopbar } from './projects/project-topbar'
import type { SearchResultDTO } from '../api/search'
import type { ChannelKey, Project, ProjectWorkspace, Theme, WorkbenchView } from './projects/project-types'
2026-07-20 10:50:42 +08:00
const { Content } = Layout
export function ProjectPage({
2026-07-20 11:40:45 +08:00
activeView,
activeWorkspace,
workspaces,
2026-07-20 10:50:42 +08:00
activeChannel,
activeTaskID,
2026-07-20 10:50:42 +08:00
theme,
onSelectProject,
2026-07-20 11:40:45 +08:00
onSelectWorkspace,
onSelectWorkspaceExplore,
2026-07-20 10:50:42 +08:00
onSelectChannel,
onSelectItem,
onOpenTask,
onCloseTask,
2026-07-20 10:50:42 +08:00
onToggleTheme,
onCreateProject,
onCreateTask,
onUploadSource,
onCreateCronPlan,
onUpdateWorkspaceTask,
onUpdateProject,
onCreateProjectTag,
searchQuery,
searchLoading,
searchSearched,
searchResults,
onSearchQueryChange,
onSearch,
onSelectSearchResult,
2026-07-20 10:50:42 +08:00
}: {
2026-07-20 11:40:45 +08:00
activeView: WorkbenchView
activeWorkspace: ProjectWorkspace
workspaces: ProjectWorkspace[]
2026-07-20 10:50:42 +08:00
activeChannel: ChannelKey
activeTaskID: string | null
2026-07-20 10:50:42 +08:00
theme: Theme
onSelectProject: (project: Project) => void
2026-07-20 11:40:45 +08:00
onSelectWorkspace: () => void
onSelectWorkspaceExplore: () => void
2026-07-20 10:50:42 +08:00
onSelectChannel: (key: ChannelKey) => void
onSelectItem: (title: string) => void
onOpenTask: (project: Project, taskID: string) => void
onCloseTask: () => void
2026-07-20 10:50:42 +08:00
onToggleTheme: () => void
onCreateProject: () => void
onCreateTask: () => void
onUploadSource: () => void
onCreateCronPlan: () => void
onUpdateWorkspaceTask: (update: WorkspaceTaskUpdate) => void
onUpdateProject: (update: ProjectSettingsUpdate) => Promise<void>
onCreateProjectTag: (name: string) => void
searchQuery: string
searchLoading: boolean
searchSearched: boolean
searchResults: SearchResultDTO[]
onSearchQueryChange: (value: string) => void
onSearch: () => void
onSelectSearchResult: (result: SearchResultDTO) => void
2026-07-20 10:50:42 +08:00
}) {
const isProject = activeView === 'project'
const projects = workspaces.map((workspace) => workspace.project)
2026-07-21 01:18:06 +08:00
const updateActiveProjectTask = (update: ProjectTaskUpdate) => {
onUpdateWorkspaceTask({
originalProjectId: activeWorkspace.project.id,
nextProjectId: activeWorkspace.project.id,
taskId: update.taskId,
title: update.title,
summary: update.summary,
tag: update.tag,
completed: update.completed,
})
}
2026-07-20 11:49:01 +08:00
2026-07-20 10:50:42 +08:00
return (
<Layout className="workbench-shell">
<ProjectTopbar
theme={theme}
onToggleTheme={onToggleTheme}
query={searchQuery}
loading={searchLoading}
searched={searchSearched}
results={searchResults}
onQueryChange={onSearchQueryChange}
onSearch={onSearch}
onSelectSearchResult={onSelectSearchResult}
/>
2026-07-20 10:50:42 +08:00
2026-07-20 11:03:27 +08:00
<Layout className="workbench-main" hasSider>
2026-07-20 11:40:45 +08:00
<ProjectRail
activeProject={activeWorkspace.project}
projects={projects}
2026-07-20 11:40:45 +08:00
activeView={activeView}
onSelectWorkspace={onSelectWorkspace}
onSelectWorkspaceExplore={onSelectWorkspaceExplore}
2026-07-20 11:40:45 +08:00
onSelectProject={onSelectProject}
onCreateProject={onCreateProject}
2026-07-20 11:40:45 +08:00
/>
2026-07-20 10:50:42 +08:00
{isProject && (
2026-07-20 11:49:01 +08:00
<ProjectSidebar
activeView={activeView}
activeWorkspace={activeWorkspace}
2026-07-20 11:49:01 +08:00
activeChannel={activeChannel}
onSelectChannel={onSelectChannel}
onSelectItem={onSelectItem}
onUpdateProject={onUpdateProject}
2026-07-20 11:49:01 +08:00
/>
)}
2026-07-20 10:50:42 +08:00
<Content className="stage">
{activeView === 'workspace' ? (
<WorkspacePage workspaces={workspaces} onOpenTask={onOpenTask} onUpdateTask={onUpdateWorkspaceTask} />
) : activeView === 'workspace-explore' ? (
<WorkspaceExplorePage workspaces={workspaces} onSelectItem={onSelectItem} />
2026-07-20 11:40:45 +08:00
) : (
2026-07-20 12:26:21 +08:00
<ProjectChannelPage
activeChannel={activeChannel}
activeWorkspace={activeWorkspace}
activeTaskID={activeTaskID}
2026-07-20 12:26:21 +08:00
onSelectItem={onSelectItem}
onOpenTask={(taskID) => onOpenTask(activeWorkspace.project, taskID)}
onCloseTask={onCloseTask}
onCreateTask={onCreateTask}
onUploadSource={onUploadSource}
onCreateCronPlan={onCreateCronPlan}
onCreateProjectTag={onCreateProjectTag}
2026-07-21 01:18:06 +08:00
onUpdateTask={updateActiveProjectTask}
2026-07-20 12:26:21 +08:00
/>
2026-07-20 11:40:45 +08:00
)}
2026-07-20 10:50:42 +08:00
</Content>
</Layout>
<ProjectStatusbar />
</Layout>
)
}