From 13f91f27816f79c2d8dd21ae2535f80783c218e5 Mon Sep 17 00:00:00 2001 From: Pierre Date: Tue, 14 Jul 2026 13:32:08 +0200 Subject: [PATCH] fix: polish dashboard workflow and controls --- .env.example | 2 + dashboard/src/v2/BrowserPage.tsx | 19 ++- dashboard/src/v2/FileBrowserPage.tsx | 19 +-- dashboard/src/v2/KnowledgePage.tsx | 30 ++-- dashboard/src/v2/LiveSessionPage.tsx | 3 +- dashboard/src/v2/SchedulerPage.tsx | 15 +- dashboard/src/v2/SettingsPage.tsx | 2 +- dashboard/src/v2/components/LiveTaskCard.tsx | 5 +- dashboard/src/v2/components/TasksList.tsx | 17 +- .../browser/LaunchContainerPanel.tsx | 23 +-- .../__tests__/ChatPage.accessibility.test.tsx | 6 +- .../chat/cinematic/CinematicStage.tsx | 18 +- .../chat/cinematic/StageActivityStrip.tsx | 5 +- .../CustomDashboardCredentialSlotsPanel.tsx | 25 +-- .../__tests__/CustomDashboardsPage.test.tsx | 33 ++-- .../v2/components/memory/AddMemoryModal.tsx | 15 +- .../v2/components/memory/MemoryFilters.tsx | 44 ++--- .../src/v2/components/memory/ModelBrowser.tsx | 51 ++++-- .../MemoryFilters.accessibility.test.tsx | 10 +- .../memory/__tests__/ModelBrowser.test.tsx | 9 +- .../v2/components/nodes/NodeFlowInspector.tsx | 19 ++- .../src/v2/components/nodes/NodeInspector.tsx | 47 +++--- .../v2/components/nodes/NodeWidgetField.tsx | 22 ++- .../settings/AutomationCredentialManager.tsx | 16 +- .../settings/SettingsFormFields.tsx | 4 +- .../__tests__/SettingsControls.test.tsx | 4 + .../settings/panels/AIModelCatalogPanel.tsx | 31 +++- .../settings/panels/SettingsMemoryPanel.tsx | 75 +++++---- .../src/v2/components/sprints/SprintCell.tsx | 25 ++- .../sprints/SprintIssueImportModal.tsx | 36 ++-- .../sprints/SprintJiraImportModal.tsx | 69 +++----- .../v2/components/sprints/SprintLedgerRow.tsx | 1 + .../SprintProjectManagementImportModal.tsx | 9 +- .../__tests__/SprintCell.visual.test.tsx | 22 ++- .../sprints/importer/IssueImportFields.tsx | 39 +++-- .../v2/components/tasks/KanbanTaskCard.tsx | 3 +- .../src/v2/components/ui/AddTaskModal.tsx | 24 +-- .../src/v2/components/ui/AvantgardeSelect.tsx | 82 ++++++++-- .../src/v2/components/ui/TaskComposer.tsx | 20 +-- dashboard/src/v2/components/ui/TaskRow.tsx | 8 +- .../v2/components/ui/WorkflowStatusBadge.tsx | 21 ++- .../__tests__/cinematic-quick-actions.test.ts | 43 ++++- .../src/v2/lib/cinematic-quick-actions.ts | 38 ++++- .../src/v2/lib/dashboard-feature-flags.ts | 28 ++-- .../src/v2/lib/live-session-view-model.ts | 9 + dashboard/src/v2/lib/overview-streams.ts | 106 ++++++++++++ .../src/v2/lib/tasks/task-board-view-model.ts | 17 +- .../src/v2/lib/tasks/task-card-view-model.ts | 4 + .../v2/lib/workflow-status-presentation.ts | 82 +++++++++- .../architecture/card-ci-status-projection.md | 4 +- .../architecture/dashboard-architecture.md | 2 + ...architecture-card-ci-status-projection.mdx | 4 +- .../architecture-dashboard-architecture.mdx | 2 + .../content/docs/developer-feature-flags.mdx | 16 +- .../docs/developer-settings-reference.mdx | 2 +- docs-web/content/docs/user-dashboard-chat.mdx | 12 +- .../docs/user-dashboard-live-session.mdx | 6 +- .../content/docs/user-dashboard-overview.mdx | 4 +- .../content/docs/user-dashboard-projects.mdx | 4 +- .../content/docs/user-dashboard-settings.mdx | 2 +- .../content/docs/user-dashboard-sprints.mdx | 10 +- ...-dashboard-styleguides-and-tech-stacks.mdx | 4 +- .../content/docs/user-dashboard-tasks.mdx | 6 +- docs-web/developer/feature-flags.md | 16 +- docs-web/developer/settings-reference.md | 2 +- docs-web/user/dashboard/chat.md | 12 +- docs-web/user/dashboard/live-session.md | 6 +- docs-web/user/dashboard/overview.md | 4 +- docs-web/user/dashboard/projects.md | 4 +- docs-web/user/dashboard/settings.md | 2 +- docs-web/user/dashboard/sprints.md | 10 +- .../dashboard/styleguides-and-tech-stacks.md | 4 +- docs-web/user/dashboard/tasks.md | 6 +- .../architecture/card-ci-status-projection.md | 4 +- docs/dashboard/dashboard-guide.md | 5 +- docs/dashboard/design-system-chat.md | 10 +- docs/dashboard/design-system-overview.md | 1 + docs/dashboard/design-system-settings.md | 2 +- .../design-system-shared-primitives.md | 2 +- docs/dashboard/design-system-sprints.md | 4 +- docs/dashboard/design-system-tasks.md | 2 +- docs/dashboard/feature-flags.md | 14 +- docs/dashboard/interaction-patterns.md | 4 +- docs/dashboard/project-initialization.md | 1 + docs/dashboard/styleguides-and-tech-stacks.md | 6 +- docs/settings/configuration-and-storage.md | 2 +- src/domain/projects/project-initializer.ts | 22 ++- .../projects/project-initializer.test.ts | 62 ++++++- .../lib/dashboard-feature-flags.test.ts | 41 ++++- tests/dashboard/lib/overview-streams.test.ts | 154 +++++++++++++++++- tests/dashboard/v2/avantgarde-select.test.tsx | 29 ++++ .../v2/browser-page-components.test.tsx | 2 +- tests/dashboard/v2/browser-page.test.tsx | 3 +- tests/dashboard/v2/chat-page-shell.test.tsx | 70 +++++++- .../sprints/SprintIssueImportModal.test.tsx | 12 +- .../sprints/SprintJiraImportModal.test.tsx | 32 ++-- ...printProjectManagementImportModal.test.tsx | 6 +- .../ui/WorkflowStatusBadge.test.tsx | 46 ++++++ tests/dashboard/v2/file-browser-page.test.tsx | 2 +- .../lib/workflow-status-presentation.test.ts | 88 ++++++++++ .../v2/live-page-status-regression.test.tsx | 38 +++++ tests/dashboard/v2/memory-filters.test.tsx | 18 +- tests/dashboard/v2/nodes-inspector.test.tsx | 3 +- tests/dashboard/v2/nodes-page.test.tsx | 16 +- .../v2/qa-ci-card-status.integration.test.tsx | 26 +++ .../dashboard/v2/settings-page-state.test.tsx | 5 +- tests/dashboard/v2/tasks-list.test.tsx | 37 +++++ 107 files changed, 1589 insertions(+), 579 deletions(-) diff --git a/.env.example b/.env.example index d038b612b6..6ec9c673fb 100644 --- a/.env.example +++ b/.env.example @@ -11,3 +11,5 @@ DASHBOARD_PORT=4444 # Set to true in a production build only when the surface is ready to expose. # VITE_CODEUX_FEATURE_NODES=true # VITE_CODEUX_FEATURE_CUSTOM_DASHBOARDS=true +# VITE_CODEUX_FEATURE_CHAT_NODES_WORKFLOW_QUICK_ACTION=true +# VITE_CODEUX_FEATURE_CHAT_CUSTOM_DASHBOARD_QUICK_ACTION=true diff --git a/dashboard/src/v2/BrowserPage.tsx b/dashboard/src/v2/BrowserPage.tsx index 6b8030e753..713690fb31 100644 --- a/dashboard/src/v2/BrowserPage.tsx +++ b/dashboard/src/v2/BrowserPage.tsx @@ -51,6 +51,7 @@ import { CollapsiblePanel } from "./components/ui/CollapsiblePanel.js"; import { PageContainer } from "./components/layout/PageContainer.js"; import { PageHeader } from "./components/layout/PageHeader.js"; import { getSafeUrl } from "./lib/safe-url.js"; +import { AvantgardeSelect } from "./components/ui/AvantgardeSelect.js"; const PREVIEW_MESSAGE_TYPE = "sprint-preview:state"; const PREVIEW_NAVIGATION_TYPE = "sprint-preview:navigate"; @@ -1015,7 +1016,7 @@ export const BrowserPage: FunctionComponent = () => {

Override Docker access for {visibleSelectedSession?.sprintName || "the selected preview container"}.

- + className="mt-3 w-full" + options={[ + { value: "inherit", label: `Use project default (${projectDockerAccessEnabled ? "enabled" : "disabled"})` }, + { value: "enabled", label: "Enable for this container" }, + { value: "disabled", label: "Disable for this container" }, + ]} + />
diff --git a/dashboard/src/v2/FileBrowserPage.tsx b/dashboard/src/v2/FileBrowserPage.tsx index 8ca58aba04..867c91bd45 100644 --- a/dashboard/src/v2/FileBrowserPage.tsx +++ b/dashboard/src/v2/FileBrowserPage.tsx @@ -41,6 +41,7 @@ import { FileTree } from "./components/file-browser/FileTree.js"; import { FileViewer } from "./components/file-browser/FileViewer.js"; import { ChangesList } from "./components/file-browser/ChangesList.js"; import { DiffViewer } from "./components/file-browser/DiffViewer.js"; +import { AvantgardeSelect } from "./components/ui/AvantgardeSelect.js"; type BrowserMode = "files" | "changes"; type FileBrowserAction = "rebuild" | "stop"; @@ -726,22 +727,18 @@ const LaunchPanel: FunctionComponent = ({
- + className="flex-1" + options={sprints.length === 0 + ? [{ value: "", label: "No sprints available" }] + : sprints.map((sprint) => ({ value: sprint.id, label: sprint.name }))} + />
- + onChange={setAgentId} + className="min-w-[12rem]" + aria-label="Knowledge owner" + options={[ + { value: "", label: "Whole library" }, + ...agentPresets.map((preset) => ({ value: preset.id, label: `${preset.name}'s docs` })), + ]} + />
- + className="w-full" + options={sprints.length === 0 + ? [{ value: "", label: "No sprints available" }] + : sprints.map((sprint) => ({ value: sprint.id, label: sprint.name }))} + />