页面结构修改

This commit is contained in:
fengxiangdebaozi committed 2026-05-13 18:18:05 +08:00
1 parent efc4d89fdf
commit 2e4bdf122e
21 files changed
+1266 -133

No files matched your search

+2 -2
View File
@@ -66,7 +66,7 @@ export default function AgentChatPage() {
history.replaceState(
null,
"",
`${window.location.pathname}${window.location.search}#/workspace/agents/${agent_id}/chats/${createdThreadId}`,
`${window.location.pathname}${window.location.search}#/page/workspace/agents/${agent_id}/chats/${createdThreadId}`,
);
},
onFinish: (state) => {
@@ -137,7 +137,7 @@ export default function AgentChatPage() {
size="sm"
variant="secondary"
onClick={() => {
router.push(`/workspace/agents/${agent_id}/chats/new`);
router.push(`/page/workspace/agents/${agent_id}/chats/new`);
}}
>
<PlusSquare /> {t.agents.newChat}
+1 -1
View File
@@ -64,7 +64,7 @@ export default function ChatPage() {
history.replaceState(
null,
"",
`${window.location.pathname}${window.location.search}#/workspace/chats/${createdThreadId}`,
`${window.location.pathname}${window.location.search}#/page/workspace/chats/${createdThreadId}`,
);
},
onFinish: (state) => {
+1 -1
View File
@@ -33,7 +33,7 @@ export default function LoginPage() {
}
setStoredAuth(auth);
setStatus("success");
router.replace("/workspace/chats/new");
router.replace("/page/workspace/chats/new");
} catch (error) {
if (cancelled) {
return;
+3 -3
View File
@@ -317,7 +317,7 @@ export default function NewAgentPage() {
<Button
variant="ghost"
size="icon-sm"
onClick={() => router.push("/workspace/agents")}
onClick={() => router.push("/page/workspace/agents")}
>
<ArrowLeftIcon className="h-4 w-4" />
</Button>
@@ -478,7 +478,7 @@ export default function NewAgentPage() {
<Button
onClick={() =>
router.push(
`/workspace/agents/${agentId}/chats/new`,
`/page/workspace/agents/${agentId}/chats/new`,
)
}
>
@@ -486,7 +486,7 @@ export default function NewAgentPage() {
</Button>
<Button
variant="outline"
onClick={() => router.push("/workspace/agents")}
onClick={() => router.push("/page/workspace/agents")}
>
{t.agents.backToGallery}
</Button>
+1 -1
View File
@@ -10,7 +10,7 @@ export function NotFoundPage() {
dedicated migration pass.
</p>
<Link
to="/workspace/chats/new"
to="/page/workspace/chats/new"
className="bg-primary text-primary-foreground rounded-md px-4 py-2 text-sm font-medium"
>
Open workspace
+20
View File
@@ -0,0 +1,20 @@
import { Navigate, Route, Routes } from "react-router-dom";
import WorkspaceRoutes from "./WorkspaceRoutes";
// 根路由容器,统一承接 /page/* 下的所有子系统路由
export default function PageRoutes() {
return (
<Routes>
<Route index element={<Navigate to="workspace" replace />} />
{/* 现有系统:DeerFlow Workspace */}
<Route path="workspace/*" element={<WorkspaceRoutes />} />
{/* TODO: 引入外部系统路由
import AnotherSystemRoutes from "外部系统路径";
<Route path="other/*" element={<AnotherSystemRoutes />} />
*/}
</Routes>
);
}
+1 -1
View File
@@ -12,7 +12,7 @@ export default function ScheduledChatPage() {
const { data, isLoading, error } = useSchedulerThread();
if (data?.thread_id) {
return <Navigate to={`/workspace/chats/${data.thread_id}`} replace />;
return <Navigate to={`/page/workspace/chats/${data.thread_id}`} replace />;
}
return (
@@ -174,7 +174,7 @@ export default function ScheduledTaskRunDetailPage() {
try {
await actions.removeRun.mutateAsync(run.id);
toast.success("执行记录已删除");
navigate("/workspace/scheduled/tasks");
navigate("/page/workspace/scheduled/tasks");
} catch (error) {
toast.error(error instanceof Error ? error.message : "删除失败");
}
@@ -198,7 +198,7 @@ export default function ScheduledTaskRunDetailPage() {
<ChevronDown className={cn("size-3 transition-transform", showMeta && "rotate-180")} />
执行信息
</Button>
<Button variant="ghost" size="sm" className="h-7 px-2 text-xs" onClick={() => navigate("/workspace/scheduled/tasks")}>
<Button variant="ghost" size="sm" className="h-7 px-2 text-xs" onClick={() => navigate("/page/workspace/scheduled/tasks")}>
<ListChecks className="size-3" />
返回记录
</Button>
@@ -686,7 +686,7 @@ export default function ScheduledTasksPage() {
<Button
size="sm"
variant="outline"
onClick={() => navigate(`/workspace/scheduled/runs/${run.id}`)}
onClick={() => navigate(`/page/workspace/scheduled/runs/${run.id}`)}
>
<Eye className="size-4" />
查看结果
@@ -0,0 +1,94 @@
import { Navigate, Route, Routes } from "react-router-dom";
import { SidebarInset, SidebarProvider } from "@/components/ui/sidebar";
import { PromptInputProvider } from "@/components/ai-elements/prompt-input";
import { WorkspaceSidebar } from "@/components/workspace/workspace-sidebar";
import { CommandPalette } from "@/components/workspace/command-palette";
import { Toaster } from "sonner";
import { SubtasksProvider } from "@/core/tasks/context";
import { ArtifactsProvider } from "@/components/workspace/artifacts";
import ChatsPage from "./ChatsPage";
import ChatPage from "./ChatPage";
import AgentsPage from "./AgentsPage";
import AgentChatPage from "./AgentChatPage";
import NewAgentPage from "./NewAgentPage";
import ScheduledTaskRunDetailPage from "./ScheduledTaskRunDetailPage";
import ScheduledTasksPage from "./ScheduledTasksPage";
function WorkspaceLayout({ children }: { children: React.ReactNode }) {
return (
<SidebarProvider className="h-screen" defaultOpen>
<WorkspaceSidebar />
<SidebarInset className="min-w-0">{children}</SidebarInset>
<CommandPalette />
<Toaster position="top-center" />
</SidebarProvider>
);
}
function ChatRuntime({ children }: { children: React.ReactNode }) {
return (
<SubtasksProvider>
<ArtifactsProvider>
<PromptInputProvider>{children}</PromptInputProvider>
</ArtifactsProvider>
</SubtasksProvider>
);
}
export default function WorkspaceRoutes() {
return (
<Routes>
<Route index element={<Navigate to="chats/new" replace />} />
<Route
path="chats"
element={<WorkspaceLayout><ChatsPage /></WorkspaceLayout>}
/>
<Route
path="chats/:thread_id"
element={
<WorkspaceLayout>
<ChatRuntime>
<ChatPage />
</ChatRuntime>
</WorkspaceLayout>
}
/>
<Route
path="agents"
element={<WorkspaceLayout><AgentsPage /></WorkspaceLayout>}
/>
<Route
path="agents/new"
element={<WorkspaceLayout><NewAgentPage /></WorkspaceLayout>}
/>
<Route
path="agents/:agent_id/chats"
element={<Navigate to="/page/workspace/agents" replace />}
/>
<Route
path="agents/:agent_id/chats/:thread_id"
element={
<WorkspaceLayout>
<ChatRuntime>
<AgentChatPage />
</ChatRuntime>
</WorkspaceLayout>
}
/>
<Route
path="scheduled"
element={<Navigate to="/page/workspace/scheduled/tasks" replace />}
/>
<Route
path="scheduled/tasks"
element={<WorkspaceLayout><ScheduledTasksPage /></WorkspaceLayout>}
/>
<Route
path="scheduled/runs/:run_id"
element={<WorkspaceLayout><ScheduledTaskRunDetailPage /></WorkspaceLayout>}
/>
</Routes>
);
}