Skip to content

Commit 99a2a3e

Browse files
fix: prevent filepath wrapping in diff panel (#1680)
Co-authored-by: reverb256 <reverb256@users.noreply.github.com> Co-authored-by: JonathanLab <jonathanmieloo@gmail.com> Co-authored-by: Jonathan Mieloo <32547391+jonathanlab@users.noreply.github.com>
1 parent d9d701e commit 99a2a3e

2 files changed

Lines changed: 127 additions & 3 deletions

File tree

Lines changed: 109 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,109 @@
1+
import { render } from "@testing-library/react";
2+
import { describe, expect, it, vi } from "vitest";
3+
4+
vi.mock("@renderer/features/code-review/stores/reviewNavigationStore", () => ({
5+
useReviewNavigationStore: vi.fn(),
6+
}));
7+
vi.mock("@features/code-editor/stores/diffViewerStore", () => ({
8+
useDiffViewerStore: vi.fn(),
9+
}));
10+
vi.mock("@features/task-detail/components/ChangesPanel", () => ({
11+
ChangesPanel: () => null,
12+
}));
13+
vi.mock("@features/git-interaction/utils/diffStats", () => ({
14+
computeDiffStats: () => ({ linesAdded: 0, linesRemoved: 0 }),
15+
}));
16+
vi.mock("@stores/themeStore", () => ({
17+
useThemeStore: vi.fn(() => ({ isDarkMode: false })),
18+
}));
19+
vi.mock("@pierre/diffs/react", () => ({
20+
WorkerPoolContextProvider: ({ children }: { children: React.ReactNode }) =>
21+
children,
22+
}));
23+
vi.mock("@pierre/diffs/worker/worker.js?worker&url", () => ({ default: "" }));
24+
vi.mock("@components/ui/FileIcon", () => ({
25+
FileIcon: () => <span data-testid="file-icon" />,
26+
}));
27+
28+
import { DeferredDiffPlaceholder, DiffFileHeader } from "./ReviewShell";
29+
30+
type FileDiffMetadata = import("@pierre/diffs/react").FileDiffMetadata;
31+
32+
function makeFileDiff(name: string): FileDiffMetadata {
33+
return {
34+
name,
35+
prevName: null,
36+
hunks: [{ additionLines: 3, deletionLines: 1 }],
37+
} as unknown as FileDiffMetadata;
38+
}
39+
40+
function findSpan(
41+
container: HTMLElement,
42+
match: (s: HTMLSpanElement) => boolean,
43+
): HTMLSpanElement {
44+
const spans = Array.from(container.querySelectorAll<HTMLSpanElement>("span"));
45+
const found = spans.find(match);
46+
if (!found) throw new Error("span not found");
47+
return found;
48+
}
49+
50+
function renderHeader(path: string) {
51+
const diff = render(
52+
<DiffFileHeader
53+
fileDiff={makeFileDiff(path)}
54+
collapsed={false}
55+
onToggle={() => {}}
56+
/>,
57+
);
58+
const deferred = render(
59+
<DeferredDiffPlaceholder
60+
filePath={path}
61+
linesAdded={10}
62+
linesRemoved={2}
63+
reason="generated"
64+
collapsed={false}
65+
onToggle={() => {}}
66+
/>,
67+
);
68+
return { diff, deferred };
69+
}
70+
71+
describe.each([
72+
["DiffFileHeader", "diff" as const],
73+
["DeferredDiffPlaceholder", "deferred" as const],
74+
])("%s", (_name, which) => {
75+
it("renders the directory path and filename", () => {
76+
const rendered = renderHeader(
77+
"src/renderer/features/code-review/components/ReviewShell.tsx",
78+
)[which];
79+
80+
const text = rendered.container.querySelector("button")?.textContent ?? "";
81+
expect(text).toContain("src/renderer/features/code-review/components/");
82+
expect(text).toContain("ReviewShell.tsx");
83+
});
84+
85+
it("truncates the directory path and keeps the filename intact", () => {
86+
const rendered = renderHeader(
87+
"src/a/very/deeply/nested/structure/ReviewShell.tsx",
88+
)[which];
89+
90+
const dirSpan = findSpan(
91+
rendered.container,
92+
(s) => s.style.color === "var(--gray-9)" && !s.style.fontWeight,
93+
);
94+
const fileSpan = findSpan(
95+
rendered.container,
96+
(s) => s.style.fontWeight === "600",
97+
);
98+
99+
expect(dirSpan.style.overflow).toBe("hidden");
100+
expect(dirSpan.style.textOverflow).toBe("ellipsis");
101+
expect(dirSpan.style.whiteSpace).toBe("nowrap");
102+
103+
expect(fileSpan.style.whiteSpace).toBe("nowrap");
104+
expect(fileSpan.style.flexShrink).toBe("0");
105+
106+
expect(dirSpan.parentElement).toBe(fileSpan.parentElement);
107+
expect(dirSpan.parentElement?.style.display).toBe("flex");
108+
});
109+
});

apps/code/src/renderer/features/code-review/components/ReviewShell.tsx

Lines changed: 18 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -509,9 +509,24 @@ function FileHeaderRow({
509509
}}
510510
/>
511511
<FileIcon filename={fileName} size={14} />
512-
<span style={{ color: "var(--gray-9)" }}>{dirPath}</span>
513-
<span style={{ fontWeight: 600, marginLeft: dirPath ? "-6px" : 0 }}>
514-
{fileName}
512+
<span
513+
style={{ display: "flex", minWidth: 0, flex: 1, gap: "6px" }}
514+
title={dirPath + fileName}
515+
>
516+
<span style={{ fontWeight: 600, whiteSpace: "nowrap", flexShrink: 0 }}>
517+
{fileName}
518+
</span>
519+
<span
520+
style={{
521+
color: "var(--gray-9)",
522+
overflow: "hidden",
523+
textOverflow: "ellipsis",
524+
whiteSpace: "nowrap",
525+
minWidth: 0,
526+
}}
527+
>
528+
{dirPath}
529+
</span>
515530
</span>
516531
<span style={{ fontFamily: "monospace", fontSize: "10px" }}>
517532
{additions > 0 && (

0 commit comments

Comments
 (0)