From 1515d1c5b132ff4bc2437bf47fbfaf7b64e5e904 Mon Sep 17 00:00:00 2001 From: Aaron Trowbridge Date: Thu, 22 Oct 2026 08:38:35 -0400 Subject: [PATCH] fix(session-ui): review file rows are openable regardless of diff renderability (#1841) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Live report 2026-10-22: clicking the file rows in session output (the review accordion — 'files next to edit') did nothing at all. Root cause: the row's open-file affordance was gated on diffCanRender() (additions/deletions !== 0) AND the trigger was disabled for the same condition — any file whose live summary carries no line counts rendered a disabled native button with no open affordance inside, a dead row by construction (Kobalte's disabled trigger swallows descendant clicks). Opening a file requires no renderable diff: the affordance renders whenever onViewFile exists; the trigger stays enabled whenever a handler exists (expansion is already a no-op for non-renderable rows via the null Accordion.Item value). Source-assertion tests RED→GREEN per the repo convention; session-ui component suite 161/0. --- packages/app-bundle/manifest.json | 10 ++++---- .../src/components/session-review.test.ts | 23 +++++++++++++++++++ .../src/components/session-review.tsx | 4 ++-- 3 files changed, 31 insertions(+), 6 deletions(-) create mode 100644 packages/app-bundle/overlay/packages/session-ui/src/components/session-review.test.ts diff --git a/packages/app-bundle/manifest.json b/packages/app-bundle/manifest.json index 2a1c0f58a..9bf0ed071 100644 --- a/packages/app-bundle/manifest.json +++ b/packages/app-bundle/manifest.json @@ -506,7 +506,8 @@ "packages/session-ui/src/components/message-part.tsx": "dda5104168d8b841c5f96bb27737d49375b19f68e64f1f6a7c9e7776ae332164", "packages/session-ui/src/components/session-retry.tsx": "2cb1513d73275a269894f601e8c1d29bc790b14927134fe36177f2b371888721", "packages/session-ui/src/components/session-review.css": "ec8c5b359dd4b7ff80d7fad8906359678adade9ce62c9d74aedc000b646db341", - "packages/session-ui/src/components/session-review.tsx": "d2015c9f7419279f08e84523439a0b73e83bd5d06587ad56b85ea53b66ecaee4", + "packages/session-ui/src/components/session-review.test.ts": "41515bba238b4e60ce3d80e206013e9b43e3b0d0a51be45796028dbae47c99ae", + "packages/session-ui/src/components/session-review.tsx": "8ba032e842c663d1f24bfee513a9da801d257b1390149f0a380ef3cdcc025849", "packages/session-ui/src/components/session-turn.css": "792915f3373134eadf3cd51e1d4bfa88ec347e6b037b6caf60b639ec5e74fbd8", "packages/session-ui/src/components/session-turn.tsx": "42f247b0434a9f52d88d9fb96adff59afe6edeab84dd912b62eb153253b6696f", "packages/session-ui/src/components/summary-patch.test.ts": "84f2b5e5671b991130ce221ed605b214511491c883c683c9099173a4890e5d96", @@ -1010,7 +1011,7 @@ "packages/ui/src/v2/components/text-shimmer-v2.tsx" ], "exceptions": [], - "extracted_at": "2026-10-22T10:48:47.701Z", + "extracted_at": "2026-10-22T12:38:18.375Z", "per_package": { "packages/app": { "A": 254, @@ -1048,7 +1049,7 @@ "D": 0 }, "packages/session-ui": { - "A": 44, + "A": 45, "M": 32, "D": 0 }, @@ -1059,7 +1060,7 @@ } }, "counts": { - "overlay_total": 988, + "overlay_total": 989, "deletions": 7, "server_coupled": 0 }, @@ -1562,6 +1563,7 @@ "packages/session-ui/src/components/message-part.tsx": "M", "packages/session-ui/src/components/session-retry.tsx": "M", "packages/session-ui/src/components/session-review.css": "M", + "packages/session-ui/src/components/session-review.test.ts": "A", "packages/session-ui/src/components/session-review.tsx": "M", "packages/session-ui/src/components/session-turn.css": "M", "packages/session-ui/src/components/session-turn.tsx": "M", diff --git a/packages/app-bundle/overlay/packages/session-ui/src/components/session-review.test.ts b/packages/app-bundle/overlay/packages/session-ui/src/components/session-review.test.ts new file mode 100644 index 000000000..ec21cf1dd --- /dev/null +++ b/packages/app-bundle/overlay/packages/session-ui/src/components/session-review.test.ts @@ -0,0 +1,23 @@ +import { describe, expect, test } from "bun:test" +import { readFileSync } from "node:fs" +import { resolve } from "node:path" + +// #1841 — reported live 2026-10-22: clicking the file rows in session output +// (the review accordion — "files next to edit") did nothing at all. Root cause: +// BOTH the row's open-file affordance and its trigger were gated on +// diffCanRender() (additions/deletions !== 0) — any file whose live summary +// carries no line counts rendered a disabled native button with no open-file +// button, a dead row by construction (Kobalte's disabled trigger swallows +// descendant clicks). Opening a file requires no renderable diff. +// Source assertions per the repo's component-source-assertion convention. +describe("session-review file rows are openable regardless of diff renderability (#1841)", () => { + const source = readFileSync(resolve(__dirname, "session-review.tsx"), "utf8") + + test("the open-file affordance is not gated on diffCanRender", () => { + expect(source).not.toContain("onViewFile && diffCanRender()") + }) + + test("the trigger stays enabled whenever an open-file handler exists", () => { + expect(source).toContain("disabled={!diffCanRender() && !props.onViewFile}") + }) +}) diff --git a/packages/app-bundle/overlay/packages/session-ui/src/components/session-review.tsx b/packages/app-bundle/overlay/packages/session-ui/src/components/session-review.tsx index 2146aaa77..b6c6b6040 100644 --- a/packages/app-bundle/overlay/packages/session-ui/src/components/session-review.tsx +++ b/packages/app-bundle/overlay/packages/session-ui/src/components/session-review.tsx @@ -511,7 +511,7 @@ export const SessionReview = (props: SessionReviewProps) => { data-selected={props.focusedFile === file ? "" : undefined} > - +
@@ -520,7 +520,7 @@ export const SessionReview = (props: SessionReviewProps) => { {`\u202A${getDirectory(file)}\u202C`} {getFilename(file)} - +