Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
25 commits
Select commit Hold shift + click to select a range
8a0330e
feat: 新增项目概览页,整合信息/需求/任务 Tab
safe1ine Mar 13, 2026
e9c6d62
refactor: 项目概览页优化
safe1ine Mar 13, 2026
6055793
refactor: 移除项目子菜单及独立页面,统一使用概览页
safe1ine Mar 13, 2026
7525d4c
feat: 余额移至 header、智能任务改名为新任务、overview 任务卡片样式统一
safe1ine Mar 13, 2026
f804017
feat: 侧边栏开发项目多项优化
safe1ine Mar 13, 2026
af84763
refactor: 移除 task/view 页面,创建任务后直接跳转到 task/develop
safe1ine Mar 13, 2026
77fb3fa
fix: 使用 quick_start 参数获取快速启动任务,替代 project_id 空值判断
safe1ine Mar 13, 2026
ce8a698
feat(task-detail): 重构任务详情页底部面板
safe1ine Mar 13, 2026
69b5a18
feat(task-detail): 路由、面包屑与侧边栏配套
safe1ine Mar 13, 2026
8206f9e
refactor(task-detail): 抽离 TaskChatSection,预览空状态撑满剩余高度
safe1ine Mar 13, 2026
fa1d5e6
feat(task-detail): 任务详情页面板优化
safe1ine Mar 13, 2026
e1379e2
style(task-terminal-panel): tab 样式优化与加载状态移除
safe1ine Mar 13, 2026
1d5adc4
feat(settings): 设置改为弹框形式,优化布局和空状态
safe1ine Mar 15, 2026
7bd9afe
refactor: 任务入口改为 /console/task/:id,使用路由切换替代新窗口打开
safe1ine Mar 15, 2026
d9c0ed1
feat(nav-project): 选中时自动展开二级菜单、支持手动折叠、默认项添加加号按钮
safe1ine Mar 15, 2026
0c1d90b
更新控制台组件:项目、任务、问题相关页面
safe1ine Mar 15, 2026
b11f86d
fix(task-terminal): 无终端时 tab 栏加号按钮贴边,有终端时保持原高度
safe1ine Mar 15, 2026
de76cc4
feat(task-changes): 文件列表单行展示,增删行数右对齐,添加可拖拽分隔条
safe1ine Mar 15, 2026
23b3961
refactor(task-file-explorer): 优化文件浏览器样式与交互
safe1ine Mar 15, 2026
0735ad1
refactor(task): 统一任务面板样式与 Empty 组件
safe1ine Mar 15, 2026
df3f4cd
feat(task-detail): 底部 toggle 左对齐,右侧展示 token 消耗;小屏仅显示总数
safe1ine Mar 15, 2026
66969da
feat(task-detail): 实现真实聊天框并修复 taskId 切换时的状态重置
safe1ine Mar 15, 2026
4f64b17
feat(task-detail): 聊天面板优化与续期功能
safe1ine Mar 15, 2026
5bdf576
fix: 面包屑任务名称过长时省略显示,防止页面被撑宽
safe1ine Mar 15, 2026
3579799
feat: 预览和修改按钮显示数量
safe1ine Mar 15, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
14 changes: 4 additions & 10 deletions frontend/src/App.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,6 @@ import LoginPage from "@/pages/login"
import WelcomePage from "@/pages/welcome"
import UserConsolePage from "@/pages/console/user/page"
import ManagerConsolePage from "@/pages/console/manager/page"
import SettingsPage from "@/pages/console/user/settings"
import TasksPage from "@/pages/console/user/tasks"
import IDEIDE from "@/pages/console/user/ide-ide"
import GitBotsPage from "@/pages/console/user/git-bots"
Expand All @@ -22,15 +21,13 @@ import ResetPasswordPage from "./pages/resetpassword"
import FindPasswordPage from "./pages/findpassword"
import TeamManagerManager from "./pages/console/manager/manager"
import TeamManagerOtherSettings from "./pages/console/manager/other-settings"
import ProjectPage from "./pages/console/user/project/project"
import PlaygroundPage from "./pages/playground"
import PlaygroundDetailPage from "./pages/playground-detail"
import PublicTaskPage from "./pages/public-task"
import PostCreatePage from "./pages/post-create"
import ProjectIssuesPage from "./pages/console/user/project/issues"
import ProjectTasksPage from "./pages/console/user/project/tasks"
import ProjectOverviewPage from "./pages/console/user/project/overview"
import TaskDevelopPage from "./pages/console/user/task/task-dev"
import TaskViewPage from "./pages/console/user/task/task-view"
import TaskDetailPage from "./pages/console/user/task/task-detail"

function App() {
return (
Expand All @@ -49,16 +46,13 @@ function App() {
<Route path="/console" element={<UserConsolePage />}>
<Route index element={<Navigate to="/console/tasks" replace />} />
<Route path="tasks" element={<TasksPage />} />
<Route path="project/:projectId/info" element={<ProjectPage />} />
<Route path="project/:projectId/issues" element={<ProjectIssuesPage />} />
<Route path="project/:projectId/tasks" element={<ProjectTasksPage />} />
<Route path="task/:taskId" element={<TaskDetailPage />} />
<Route path="project/:projectId" element={<ProjectOverviewPage />} />
<Route path="gitbot" element={<GitBotsPage />} />
<Route path="ide" element={<IDEIDE />} />
<Route path="settings" element={<SettingsPage />} />
</Route>
<Route path="/console/terminal" element={<TerminalPage />} />
<Route path="/console/files" element={<FileManagerPage />} />
<Route path="/console/task/view" element={<TaskViewPage />} />
<Route path="/console/task/develop/:taskId" element={<TaskDevelopPage />} />
<Route path="/sharedterminal" element={<SharedTerminalPage />} />
<Route path="/manager" element={<ManagerConsolePage />}>
Expand Down
7 changes: 5 additions & 2 deletions frontend/src/api/Api.ts
Original file line number Diff line number Diff line change
Expand Up @@ -866,12 +866,12 @@ export interface DomainProject {
issues?: DomainProjectIssue[];
/** 项目名 */
name?: string;
/** 未解决问题数量 */
open_issue_count?: number;
/** 项目平台 */
platform?: ConstsGitPlatform;
/** 项目仓库URL */
repo_url?: string;
/** 项目相关的任务 */
tasks?: DomainProjectTask[];
/** 更新时间 */
updated_at?: number;
/** 用户信息 */
Expand Down Expand Up @@ -5320,7 +5320,10 @@ export class Api<SecurityDataType extends unknown> extends HttpClient<SecurityDa
next_token?: string;
/** 分页 */
page?: number;
/** 用于筛选项目相关的任务 */
project_id?: string;
/** 只筛选快速启动的项目无关任务 */
quick_start?: boolean;
/** 每页多少条记录 */
size?: number;
},
Expand Down
22 changes: 22 additions & 0 deletions frontend/src/components/console/breadcrumb-task-context.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
import React, { createContext, useContext, useState } from "react"

interface BreadcrumbTaskContextValue {
taskName: string | null
setTaskName: (name: string | null) => void
}

const BreadcrumbTaskContext = createContext<BreadcrumbTaskContextValue | null>(null)

export function BreadcrumbTaskProvider({ children }: { children: React.ReactNode }) {
const [taskName, setTaskName] = useState<string | null>(null)
return (
<BreadcrumbTaskContext.Provider value={{ taskName, setTaskName }}>
{children}
</BreadcrumbTaskContext.Provider>
)
}

export function useBreadcrumbTask() {
const ctx = useContext(BreadcrumbTaskContext)
return ctx
}
30 changes: 29 additions & 1 deletion frontend/src/components/console/data-provider.tsx
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { ConstsGitPlatform, ConstsOwnerType, type DomainGitIdentity, type DomainHost, type DomainImage, type DomainModel, type DomainProject, type DomainUser, type DomainVirtualMachine } from '@/api/Api';
import { ConstsGitPlatform, ConstsOwnerType, type DomainGitIdentity, type DomainHost, type DomainImage, type DomainModel, type DomainProject, type DomainProjectTask, type DomainUser, type DomainVirtualMachine } from '@/api/Api';
import { getImageShortName } from '@/utils/common';
import { apiRequest } from '@/utils/requestUtils';
import React, { createContext, useContext, useEffect, useMemo, useState } from 'react';
Expand Down Expand Up @@ -37,6 +37,11 @@ type CommonData = {
projects: DomainProject[];
loadingProjects: boolean;
reloadProjects: () => void;

/** 未关联项目的任务(quick_start),用于侧边栏「默认」分组展示 */
unlinkedTasks: DomainProjectTask[];
loadingUnlinkedTasks: boolean;
reloadUnlinkedTasks: () => void;
};

const DataContext = createContext<CommonData | null>(null);
Expand Down Expand Up @@ -66,6 +71,8 @@ export const DataProvider: React.FC<{ children: React.ReactNode }> = ({ children
const [projects, setProjects] = useState<DomainProject[]>([]);
const [loadingProjects, setLoadingProjects] = useState(true);

const [unlinkedTasks, setUnlinkedTasks] = useState<DomainProjectTask[]>([]);
const [loadingUnlinkedTasks, setLoadingUnlinkedTasks] = useState(true);

const fetchUserInfo = () => {
apiRequest('v1UsersStatusList', {}, [], (resp) => {
Expand Down Expand Up @@ -255,6 +262,22 @@ export const DataProvider: React.FC<{ children: React.ReactNode }> = ({ children
setLoadingProjects(false)
}

const UNLINKED_TASKS_LIMIT = 5
const UNLINKED_TASKS_FETCH_SIZE = 50

const fetchUnlinkedTasks = async () => {
setLoadingUnlinkedTasks(true)
await apiRequest('v1UsersTasksList', { page: 1, size: UNLINKED_TASKS_FETCH_SIZE, quick_start: true }, [], (resp) => {
if (resp.code === 0) {
const allTasks = resp.data?.tasks || []
const unlinked = allTasks
.sort((a: DomainProjectTask, b: DomainProjectTask) => (b.created_at || 0) - (a.created_at || 0))
.slice(0, UNLINKED_TASKS_LIMIT)
setUnlinkedTasks(unlinked)
}
setLoadingUnlinkedTasks(false)
}, () => setLoadingUnlinkedTasks(false))
}

useEffect(() => {
fetchUserInfo();
Expand All @@ -265,6 +288,7 @@ export const DataProvider: React.FC<{ children: React.ReactNode }> = ({ children
fetchWallet();
fetchMembers();
fetchProjects();
fetchUnlinkedTasks();
}, []);

return (
Expand Down Expand Up @@ -301,6 +325,10 @@ export const DataProvider: React.FC<{ children: React.ReactNode }> = ({ children
projects: projects,
loadingProjects: loadingProjects,
reloadProjects: fetchProjects,

unlinkedTasks: unlinkedTasks,
loadingUnlinkedTasks: loadingUnlinkedTasks,
reloadUnlinkedTasks: fetchUnlinkedTasks,
}}>
{children}
</DataContext.Provider>
Expand Down
34 changes: 25 additions & 9 deletions frontend/src/components/console/nav/nav-balance.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,11 @@ import { cn } from "@/lib/utils";
import { Tooltip, TooltipContent, TooltipTrigger } from "@/components/ui/tooltip";
import { useCommonData } from "../data-provider";

export default function NavBalance() {
interface NavBalanceProps {
variant?: "sidebar" | "header";
}

export default function NavBalance({ variant = "sidebar" }: NavBalanceProps) {
const [transcations, setTranscations] = useState<DomainTransactionLog[]>([]);
const [exchangeCode, setExchangeCode] = useState("");
const [isLoading, setIsLoading] = useState(false);
Expand Down Expand Up @@ -110,17 +114,29 @@ export default function NavBalance() {
toast.success("邀请链接已复制到剪贴板");
}

const triggerContent = (
<>
<IconWallet className={variant === "header" ? "h-[1.2rem] w-[1.2rem]" : "size-5"} />
余额: {Math.ceil(balance + bonus).toLocaleString()} 点
</>
);

return (
<Dialog onOpenChange={handleOpenChange}>
<DialogTrigger asChild>
<SidebarMenu>
<SidebarMenuItem>
<SidebarMenuButton className="cursor-pointer">
<IconWallet className="size-5" />
余额: {Math.ceil(balance + bonus).toLocaleString()} 点
</SidebarMenuButton>
</SidebarMenuItem>
</SidebarMenu>
{variant === "header" ? (
<Button className="hidden lg:flex" variant="ghost" size="sm">
{triggerContent}
</Button>
) : (
<SidebarMenu>
<SidebarMenuItem>
<SidebarMenuButton className="cursor-pointer">
{triggerContent}
</SidebarMenuButton>
</SidebarMenuItem>
</SidebarMenu>
)}
</DialogTrigger>
<DialogContent>
<DialogHeader>
Expand Down
16 changes: 1 addition & 15 deletions frontend/src/components/console/nav/nav-main.tsx
Original file line number Diff line number Diff line change
@@ -1,7 +1,4 @@
import {
Bot,
Github,
} from "lucide-react"
import { Github } from "lucide-react"
import { Link, useLocation } from "react-router-dom"

import {
Expand All @@ -17,17 +14,6 @@ export default function NavMain() {
return (
<SidebarGroup>
<SidebarMenu>
<SidebarMenuItem>
<SidebarMenuButton
isActive={location.pathname === "/console/tasks"}
asChild
>
<Link to="/console/tasks">
<Bot />
<span>智能任务</span>
</Link>
</SidebarMenuButton>
</SidebarMenuItem>
<SidebarMenuItem>
<SidebarMenuButton
isActive={location.pathname === "/console/gitbot"}
Expand Down
Loading
Loading