From 9826b163a97cd48ac4c14584e7e276219fb52407 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=9B=B7=E7=94=B5=E8=8A=BD=E8=A1=A3?= Date: Fri, 9 Oct 2026 03:08:57 -0400 Subject: [PATCH] Q163: the goal progress view is called Progress, not Timeline Co-Authored-By: Claude Opus 5.5 --- src/renderer/src/i18n/zh.ts | 2 +- src/renderer/src/pages/WorkPage.tsx | 10 +++++----- .../pages/work/{TimelineView.tsx => ProgressView.tsx} | 8 ++------ tests/e2e/ceo-chat.spec.ts | 3 +++ 4 files changed, 11 insertions(+), 12 deletions(-) rename src/renderer/src/pages/work/{TimelineView.tsx => ProgressView.tsx} (94%) diff --git a/src/renderer/src/i18n/zh.ts b/src/renderer/src/i18n/zh.ts index 1e82307f..98a4ef8f 100644 --- a/src/renderer/src/i18n/zh.ts +++ b/src/renderer/src/i18n/zh.ts @@ -571,7 +571,7 @@ export const zh: Record = { "Tests": "测试", "Theme": "主题", "Thinking": "思考中", - "Timeline": "时间线", + "Progress": "进度", "Title": "标题", "Today": "今天", "Token usage": "Token 用量", diff --git a/src/renderer/src/pages/WorkPage.tsx b/src/renderer/src/pages/WorkPage.tsx index a696deb7..d3d69956 100644 --- a/src/renderer/src/pages/WorkPage.tsx +++ b/src/renderer/src/pages/WorkPage.tsx @@ -19,13 +19,13 @@ import { ProjectDialog } from "./work/ProjectDialog"; import { TaskDetailDialog } from "./work/TaskDetailDialog"; import { ProjectOverview } from "./work/ProjectOverview"; import { ListView } from "./work/ListView"; -import { TimelineView } from "./work/TimelineView"; +import { ProgressView } from "./work/ProgressView"; import { isBusinessTask, latestTaskRun, nextStatus, prettyRunState, providerFor, runBlocker, runTone } from "./work/task-helpers"; import type { PageProps } from "./types"; import { activeOrgId, type Focus } from "./types"; import { t } from "../i18n/i18n"; -type View = "board" | "list" | "timeline"; +type View = "board" | "list" | "progress"; const COLUMNS: ReadonlyArray<{ id: TaskStatus; label: string; tone: string }> = [ { id: TASK_STATUS.BACKLOG, label: t("Backlog"), tone: "var(--text-4)" }, @@ -37,7 +37,7 @@ const COLUMNS: ReadonlyArray<{ id: TaskStatus; label: string; tone: string }> = const VIEW_OPTIONS: ReadonlyArray<{ id: View; label: string }> = [ { id: "board", label: t("Board") }, { id: "list", label: t("List") }, - { id: "timeline", label: t("Timeline") }, + { id: "progress", label: t("Progress") }, ]; export function WorkPage({ snapshot, actions, navigate, focus }: PageProps) { @@ -153,9 +153,9 @@ export function WorkPage({ snapshot, actions, navigate, focus }: PageProps) { /> )} - {view === "timeline" && ( + {view === "progress" && (
- +
)} diff --git a/src/renderer/src/pages/work/TimelineView.tsx b/src/renderer/src/pages/work/ProgressView.tsx similarity index 94% rename from src/renderer/src/pages/work/TimelineView.tsx rename to src/renderer/src/pages/work/ProgressView.tsx index 8795819c..896c356a 100644 --- a/src/renderer/src/pages/work/TimelineView.tsx +++ b/src/renderer/src/pages/work/ProgressView.tsx @@ -8,12 +8,8 @@ const SEGMENTS: ReadonlyArray<{ id: TaskStatus; label: string; tone: string }> = { id: TASK_STATUS.BACKLOG, label: t("Backlog"), tone: "var(--panel-3)" }, ]; -/** - * Execution timeline by goal: each goal carries a segmented bar of its tasks - * by status (done → review → in progress → backlog), then one row per - * project with the same bar at project scope. - */ -export function TimelineView({ tasks, goals, projects }: { tasks: TaskRecord[]; goals: GoalRecord[]; projects: ProjectRecord[] }) { +/** How far work is per goal and project, as bars of task status; it shows progress, not dates. */ +export function ProgressView({ tasks, goals, projects }: { tasks: TaskRecord[]; goals: GoalRecord[]; projects: ProjectRecord[] }) { const unlinked = tasks.filter((task) => !task.goalId); return (
diff --git a/tests/e2e/ceo-chat.spec.ts b/tests/e2e/ceo-chat.spec.ts index 00ae81a3..c878c4a3 100644 --- a/tests/e2e/ceo-chat.spec.ts +++ b/tests/e2e/ceo-chat.spec.ts @@ -81,6 +81,9 @@ test("the pinned CEO conversation is the Messages front door", async () => { // From a task, its goal, run and back are one click each. await page.getByRole("button", { name: "Work" }).click(); + // The goal view says what it shows: progress, not a timeline without dates. + await expect(page.getByText("Progress", { exact: true })).toBeVisible(); + await expect(page.getByText("Timeline", { exact: true })).toHaveCount(0); // The CEO's reply to the founder is a chat vehicle, not work: it stays off the board. await expect(page.getByRole("button", { name: /Reply to Yang/ })).toHaveCount(0); await page.getByRole("button", { name: /Operationalize goal: Ship the FlowPilot MVP\./ }).first().click();