Skip to content

Commit bfe705b

Browse files
committed
refactor(webui): inline deployment creation & rename schedule → deployment
- Move deployment creation from /schedule page into an inline popover on the DeploymentButton, so users never leave the composer context - /deployments route is now a pure management page (list, pause, run, delete) - Rename all schedule references to deployment: - ScheduleButton → DeploymentButton, ScheduleCenter → DeploymentCenter - lib/schedule.ts → lib/deployment.ts, CSS schedule-* → deploy-* - Route /schedule → /deployments, TopBar label '定时' → '定时任务' - Add success state with 'go to deployments' navigation after creation - Improve run button: Play icon + label + hover tooltip on all actions - Fix: useId() for unique form element ids (two instances in DOM) - Fix: try/catch/finally on API calls to prevent stuck busy state - Fix: mobile popover animation vs transform conflict Change-Id: I99e7ae5bc3256fe558675aaa4fb6bb1d301c7854 Co-developed-by: OpenCode <noreply@opencode.ai>
1 parent 316bfba commit bfe705b

16 files changed

Lines changed: 608 additions & 624 deletions

apps/webui/src/App.tsx

Lines changed: 5 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -2,13 +2,13 @@ import { useCallback, useEffect, useReducer, useRef, useState } from "react";
22
import BottomBar, { type BottomBarHandle } from "@/components/BottomBar";
33
import Composer, { type ComposerHandle } from "@/components/Composer";
44
import ConfirmDialog from "@/components/ConfirmDialog";
5+
import DeploymentCenter from "@/components/DeploymentCenter";
56
import GlobalToastHost from "@/components/GlobalToastHost";
67
import HeroGreeting from "@/components/HeroGreeting";
78
import PromptDialog from "@/components/PromptDialog";
89
import { PromptEditorProvider } from "@/components/prompt-editor/PromptEditorProvider";
910
import RoleCards from "@/components/RoleCards";
1011
import ResourceCenter from "@/components/resource-center";
11-
import ScheduleCenter from "@/components/ScheduleCenter";
1212
import SettingsDialog from "@/components/SettingsDialog";
1313
import Showcase from "@/components/Showcase";
1414
import TopBar from "@/components/TopBar";
@@ -19,7 +19,6 @@ import { useAgentsConfigReady } from "@/lib/hooks/useAgentsConfigReady";
1919
import { getRoleCards } from "@/lib/playbooks";
2020
import type { RoleCard } from "@/lib/playbooks/types";
2121
import { isPlaygroundMode } from "@/lib/runtime-mode";
22-
import type { SchedulePreset } from "@/lib/schedule";
2322
import { useProviderConfigRevision } from "@/lib/store/provider-config-store";
2423
import { useTopBarView } from "@/lib/use-topbar-view";
2524

@@ -75,12 +74,6 @@ export default function Home() {
7574
const [models, setModels] = useState<UiModel[]>([]);
7675
const [selectedModelsByAgent, setSelectedModelsByAgent] = useState<Record<string, string>>({});
7776
const [warmProgress, setWarmProgress] = useState<WarmProgress | null>(null);
78-
const [scheduleDraft, setScheduleDraft] = useState<{
79-
key: number;
80-
preset?: SchedulePreset;
81-
prompt: string;
82-
playbookId: string;
83-
}>({ key: 0, prompt: "", playbookId: "" });
8477
// Only read inside handlers (top composer vs. bottom bar routing), never rendered — a ref avoids
8578
// re-rendering the whole page each time the bar scrolls in or out of view.
8679
const bottomBarVisibleRef = useRef(false);
@@ -185,24 +178,10 @@ export default function Home() {
185178
[activeAgentSlug],
186179
);
187180

188-
const handleOpenSchedule = useCallback(
189-
(preset?: SchedulePreset) => {
190-
setScheduleDraft((current) => ({
191-
key: current.key + 1,
192-
preset,
193-
prompt: inputValue,
194-
playbookId: activeAgentSlug,
195-
}));
196-
setView("schedule");
197-
window.scrollTo({ top: 0, behavior: "smooth" });
198-
},
199-
[activeAgentSlug, inputValue, setView],
200-
);
201-
202181
return (
203182
<PromptEditorProvider inputValue={inputValue} onInputChange={setInputValue}>
204183
<GlobalToastHost />
205-
{view === "resources" || view === "schedule" ? (
184+
{view === "resources" || view === "deployments" ? (
206185
<>
207186
<div className="page-shell">
208187
<WarmBanner progress={warmProgress} />
@@ -213,7 +192,7 @@ export default function Home() {
213192
settingsOpen={settingsOpen}
214193
onOpenSettings={() => setSettingsOpen(true)}
215194
/>
216-
{view === "resources" ? <ResourceCenter /> : <ScheduleCenter draft={scheduleDraft} />}
195+
{view === "resources" ? <ResourceCenter /> : <DeploymentCenter />}
217196
</div>
218197
<ConfirmDialog />
219198
<PromptDialog />
@@ -261,7 +240,7 @@ export default function Home() {
261240
models={models}
262241
onModelChange={handleModelChange}
263242
onMakeSame={handleMakeSame}
264-
onOpenSchedule={handleOpenSchedule}
243+
onNavigate={setView}
265244
canSubmit={canSubmit}
266245
/>
267246
</div>
@@ -282,7 +261,7 @@ export default function Home() {
282261
composerRef={composerRef as React.RefObject<HTMLElement | null>}
283262
onVisibilityChange={handleBottomBarVisibility}
284263
onMakeSame={handleMakeSame}
285-
onOpenSchedule={handleOpenSchedule}
264+
onNavigate={setView}
286265
canSubmit={canSubmit}
287266
/>
288267

0 commit comments

Comments
 (0)