fix(app): show project name in command center workspace search (#2345)
Searching the command center for a branch name like "master" returned a Workspaces list where every row looked identical: the title was the branch and the subtitle read "<hostname> · <branch>". On a single-host machine the hostname repeats on every row, so there was no way to tell which project each "master" workspace belonged to. Add the project name to the workspace subtitle (host · project · branch) and gate the host label behind multi-host, matching the Agents section. The host is dropped on single-host setups, so the subtitle reads "project · branch" and rows are distinguishable. Because searchText is derived from the subtitle, typing a project name now matches its workspaces too. Extract the shared join into joinSubtitleParts() and route both the workspace and agent subtitles through it, removing the duplicated filter/join the Agents section hand-rolled. Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Opus 4.8
parent
055db7454d
commit
19565f6605
@@ -2,6 +2,7 @@ import { describe, expect, it } from "vitest";
|
||||
import type { CommandCenterContribution } from "./contributions";
|
||||
import {
|
||||
buildContributionSections,
|
||||
joinSubtitleParts,
|
||||
moveActiveResultId,
|
||||
preserveActiveResultId,
|
||||
projectCommandCenterRows,
|
||||
@@ -103,3 +104,35 @@ describe("Command Center result projection", () => {
|
||||
expect(projection.offsets[151]).toBe(32 + 150 * 56);
|
||||
});
|
||||
});
|
||||
|
||||
describe("joinSubtitleParts", () => {
|
||||
it("joins all present parts with a middle dot", () => {
|
||||
expect(joinSubtitleParts(["a", "b", "c"])).toBe("a · b · c");
|
||||
});
|
||||
|
||||
it("drops null and undefined parts", () => {
|
||||
expect(joinSubtitleParts(["host", null, "master"])).toBe("host · master");
|
||||
expect(joinSubtitleParts(["host", undefined, "master"])).toBe("host · master");
|
||||
});
|
||||
|
||||
it("drops empty strings (Boolean parity — agents subtitle refactor guard)", () => {
|
||||
expect(joinSubtitleParts(["", "paseo", "master"])).toBe("paseo · master");
|
||||
});
|
||||
|
||||
it("returns an empty string when every part is null or empty", () => {
|
||||
expect(joinSubtitleParts([null, undefined, ""])).toBe("");
|
||||
});
|
||||
|
||||
it("returns a single part unchanged, with no separator", () => {
|
||||
expect(joinSubtitleParts([null, "paseo", null])).toBe("paseo");
|
||||
});
|
||||
|
||||
it("builds the workspace subtitle in host · project · branch order", () => {
|
||||
// Single-host: host gated away, project leads.
|
||||
expect(joinSubtitleParts([null, "paseo", "master"])).toBe("paseo · master");
|
||||
// Multi-host: host first, then project, then branch.
|
||||
expect(joinSubtitleParts(["host", "paseo", "master"])).toBe("host · paseo · master");
|
||||
// No branch: degrades to project (or host · project).
|
||||
expect(joinSubtitleParts([null, "paseo", null])).toBe("paseo");
|
||||
});
|
||||
});
|
||||
|
||||
Reference in New Issue
Block a user