From ef11f6e335499b11e35040cc7cb66c72a211754e Mon Sep 17 00:00:00 2001 From: Jesse_Chen Date: Wed, 2 Sep 2026 04:53:59 +0000 Subject: [PATCH] feat(rectification): confirm the tap on the choice card and show the declared minute on the empty board MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The selected option carries a check and 已选择, and a card whose tap is being recorded shows one inline-spinner row 正在记录… (the timeline row's shape, not a new vocabulary). Before any candidate exists the board's clock shows the profile's declared birth minute with two lines of copy, the peek reads 当前盘面 · 填报 HH:MM, and the column narrows until a result arrives. The snapshot API has no declared-time house table, so none is invented. BUG-482, BUG-483 Co-Authored-By: Claude Fable 5.1 Claude-Session: https://claude.ai/code/session_01JUei7K13cYxLHE3Axe4A45 --- .../src/components/rectification-board.tsx | 23 +++++++++++++++---- .../components/rectification-choice-card.tsx | 22 ++++++++++++++++++ frontend/src/lib/rectification-board-model.ts | 9 ++++++-- 3 files changed, 47 insertions(+), 7 deletions(-) diff --git a/frontend/src/components/rectification-board.tsx b/frontend/src/components/rectification-board.tsx index cd06bc43..5414a752 100644 --- a/frontend/src/components/rectification-board.tsx +++ b/frontend/src/components/rectification-board.tsx @@ -17,6 +17,7 @@ import { windowScanLayerLabel, type WindowScanLayer, } from "@/lib/rectification-agentic/v9/refinement-packet"; +import { rectificationBoardEmptyCopy } from "@/lib/rectification-surface-state"; import { RectificationHouseTableView } from "./rectification-house-table"; import { ConfirmationGateDisclosure, TechniqueAuditDisclosure } from "./technique-audit-disclosure"; @@ -35,6 +36,7 @@ function LayerChips({ layers }: Readonly<{ layers: readonly WindowScanLayer[] }> function RectificationBoardBody({ result, + declaredTime, savedStatus, diff, compact, @@ -42,6 +44,7 @@ function RectificationBoardBody({ onClose, }: Readonly<{ result: RectificationCandidateResult | null; + declaredTime: string | null; savedStatus: "accepted" | "confirmed" | null; diff: RectificationBoardDiff; compact: boolean; @@ -50,6 +53,7 @@ function RectificationBoardBody({ }>) { const table = result ? workingRectificationHouseTable(result) : null; const workingTime = workingRectificationTime(result); + const emptyCopy = rectificationBoardEmptyCopy(declaredTime); const grouped = result ? groupWindowTransitions(result.windowTransitions) : []; const scoringMinutes = grouped.filter((row) => row.scoringLayers.length > 0); const displayMinutes = grouped.filter((row) => row.displayLayers.length > 0); @@ -69,7 +73,11 @@ function RectificationBoardBody({

当前盘面

- {workingTime ? {workingTime} : null} + {workingTime + ? {workingTime} + : emptyCopy.clock + ? {emptyCopy.clock} + : null} {compact && ( ))}
diff --git a/frontend/src/lib/rectification-board-model.ts b/frontend/src/lib/rectification-board-model.ts index 13493b5e..29e829a8 100644 --- a/frontend/src/lib/rectification-board-model.ts +++ b/frontend/src/lib/rectification-board-model.ts @@ -160,13 +160,18 @@ export function diffRectificationBoard( }; } -export function rectificationBoardPeekCopy(result: RectificationCandidateResult | null): Readonly<{ +export function rectificationBoardPeekCopy( + result: RectificationCandidateResult | null, + declaredTime: string | null = null, +): Readonly<{ title: string; detail: string | null; }> { const table = result ? workingRectificationHouseTable(result) : null; if (!table) { - return { title: "当前盘面", detail: "补充经历后会在这里更新" }; + // Before any candidate exists the board still has a time to show: the one + // the reader declared (BUG-483). Without one, say what fills it later. + return { title: "当前盘面", detail: declaredTime ? `填报 ${declaredTime}` : "补充经历后会在这里更新" }; } return { title: "当前盘面", detail: `${table.time} · 上升${table.lagna}` }; }