2026-07-20 10:50:42 +08:00
|
|
|
import { Layout } from '@arco-design/web-react'
|
2026-07-21 00:46:09 +08:00
|
|
|
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-20 10:53:26 +08:00
|
|
|
import { ProjectRail } from './projects/project-rail'
|
2026-07-21 00:46:09 +08:00
|
|
|
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'
|
2026-07-20 13:02:26 +08:00
|
|
|
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,
|
2026-07-20 13:02:26 +08:00
|
|
|
activeWorkspace,
|
|
|
|
|
workspaces,
|
2026-07-20 10:50:42 +08:00
|
|
|
activeChannel,
|
2026-07-20 18:25:04 +08:00
|
|
|
activeTaskID,
|
2026-07-20 10:50:42 +08:00
|
|
|
theme,
|
|
|
|
|
onSelectProject,
|
2026-07-20 11:40:45 +08:00
|
|
|
onSelectWorkspace,
|
2026-07-21 00:46:09 +08:00
|
|
|
onSelectWorkspaceExplore,
|
2026-07-20 10:50:42 +08:00
|
|
|
onSelectChannel,
|
|
|
|
|
onSelectItem,
|
2026-07-20 18:25:04 +08:00
|
|
|
onOpenTask,
|
|
|
|
|
onCloseTask,
|
2026-07-20 10:50:42 +08:00
|
|
|
onToggleTheme,
|
2026-07-20 21:45:36 +08:00
|
|
|
onCreateProject,
|
|
|
|
|
onCreateTask,
|
|
|
|
|
onUploadSource,
|
|
|
|
|
onCreateCronPlan,
|
2026-07-21 00:46:09 +08:00
|
|
|
onUpdateWorkspaceTask,
|
|
|
|
|
onUpdateProject,
|
|
|
|
|
onCreateProjectTag,
|
2026-07-20 10:50:42 +08:00
|
|
|
}: {
|
2026-07-20 11:40:45 +08:00
|
|
|
activeView: WorkbenchView
|
2026-07-20 13:02:26 +08:00
|
|
|
activeWorkspace: ProjectWorkspace
|
|
|
|
|
workspaces: ProjectWorkspace[]
|
2026-07-20 10:50:42 +08:00
|
|
|
activeChannel: ChannelKey
|
2026-07-20 18:25:04 +08:00
|
|
|
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
|
2026-07-21 00:46:09 +08:00
|
|
|
onSelectWorkspaceExplore: () => void
|
2026-07-20 10:50:42 +08:00
|
|
|
onSelectChannel: (key: ChannelKey) => void
|
|
|
|
|
onSelectItem: (title: string) => void
|
2026-07-20 18:25:04 +08:00
|
|
|
onOpenTask: (project: Project, taskID: string) => void
|
|
|
|
|
onCloseTask: () => void
|
2026-07-20 10:50:42 +08:00
|
|
|
onToggleTheme: () => void
|
2026-07-20 21:45:36 +08:00
|
|
|
onCreateProject: () => void
|
|
|
|
|
onCreateTask: () => void
|
|
|
|
|
onUploadSource: () => void
|
|
|
|
|
onCreateCronPlan: () => void
|
2026-07-21 00:46:09 +08:00
|
|
|
onUpdateWorkspaceTask: (update: WorkspaceTaskUpdate) => void
|
|
|
|
|
onUpdateProject: (update: ProjectSettingsUpdate) => void
|
|
|
|
|
onCreateProjectTag: (name: string) => void
|
2026-07-20 10:50:42 +08:00
|
|
|
}) {
|
2026-07-20 18:25:04 +08:00
|
|
|
const isProject = activeView === 'project'
|
2026-07-20 13:02:26 +08:00
|
|
|
const projects = workspaces.map((workspace) => workspace.project)
|
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} />
|
|
|
|
|
|
2026-07-20 11:03:27 +08:00
|
|
|
<Layout className="workbench-main" hasSider>
|
2026-07-20 11:40:45 +08:00
|
|
|
<ProjectRail
|
2026-07-20 13:02:26 +08:00
|
|
|
activeProject={activeWorkspace.project}
|
|
|
|
|
projects={projects}
|
2026-07-20 11:40:45 +08:00
|
|
|
activeView={activeView}
|
|
|
|
|
onSelectWorkspace={onSelectWorkspace}
|
2026-07-21 00:46:09 +08:00
|
|
|
onSelectWorkspaceExplore={onSelectWorkspaceExplore}
|
2026-07-20 11:40:45 +08:00
|
|
|
onSelectProject={onSelectProject}
|
2026-07-20 21:45:36 +08:00
|
|
|
onCreateProject={onCreateProject}
|
2026-07-20 11:40:45 +08:00
|
|
|
/>
|
2026-07-20 10:50:42 +08:00
|
|
|
|
2026-07-20 18:25:04 +08:00
|
|
|
{isProject && (
|
2026-07-20 11:49:01 +08:00
|
|
|
<ProjectSidebar
|
|
|
|
|
activeView={activeView}
|
2026-07-20 13:02:26 +08:00
|
|
|
activeWorkspace={activeWorkspace}
|
2026-07-20 11:49:01 +08:00
|
|
|
activeChannel={activeChannel}
|
|
|
|
|
onSelectChannel={onSelectChannel}
|
|
|
|
|
onSelectItem={onSelectItem}
|
2026-07-21 00:46:09 +08:00
|
|
|
onUpdateProject={onUpdateProject}
|
2026-07-20 11:49:01 +08:00
|
|
|
/>
|
|
|
|
|
)}
|
2026-07-20 10:50:42 +08:00
|
|
|
|
|
|
|
|
<Content className="stage">
|
2026-07-20 18:25:04 +08:00
|
|
|
{activeView === 'workspace' ? (
|
2026-07-21 00:46:09 +08:00
|
|
|
<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}
|
2026-07-20 13:02:26 +08:00
|
|
|
activeWorkspace={activeWorkspace}
|
2026-07-20 18:25:04 +08:00
|
|
|
activeTaskID={activeTaskID}
|
2026-07-20 12:26:21 +08:00
|
|
|
onSelectItem={onSelectItem}
|
2026-07-20 18:25:04 +08:00
|
|
|
onOpenTask={(taskID) => onOpenTask(activeWorkspace.project, taskID)}
|
|
|
|
|
onCloseTask={onCloseTask}
|
2026-07-20 21:45:36 +08:00
|
|
|
onCreateTask={onCreateTask}
|
|
|
|
|
onUploadSource={onUploadSource}
|
|
|
|
|
onCreateCronPlan={onCreateCronPlan}
|
2026-07-21 01:00:27 +08:00
|
|
|
onCreateProjectTag={onCreateProjectTag}
|
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>
|
|
|
|
|
)
|
|
|
|
|
}
|