From fae82700ea308f07be71b91b6ba1bb9beddf4ad7 Mon Sep 17 00:00:00 2001 From: Marcelino Coll Date: Thu, 21 May 2026 11:52:12 +0000 Subject: [PATCH 1/2] fix(sidebar): preselect clicked cloud repo when creating new task Clicking "+ new task" on a cloud-only repository row in the sidebar called navigateToTaskInput() with no arguments, so TaskInput fell back to lastUsedCloudRepository (the previously used repo) instead of the clicked one. Pass the group's repo id as initialCloudRepository when there is no local folder to pre-select the right repository. Generated-By: PostHog Code Task-Id: 0d29b421-c014-4392-adbc-fbc5b8da014e --- .../sidebar/components/TaskListView.tsx | 11 +++-- .../sidebar/utils/getNewTaskTarget.test.ts | 49 +++++++++++++++++++ .../sidebar/utils/getNewTaskTarget.ts | 12 +++++ .../src/renderer/stores/navigationStore.ts | 2 +- 4 files changed, 70 insertions(+), 4 deletions(-) create mode 100644 apps/code/src/renderer/features/sidebar/utils/getNewTaskTarget.test.ts create mode 100644 apps/code/src/renderer/features/sidebar/utils/getNewTaskTarget.ts diff --git a/apps/code/src/renderer/features/sidebar/components/TaskListView.tsx b/apps/code/src/renderer/features/sidebar/components/TaskListView.tsx index b8cec1f3e..cbc994d35 100644 --- a/apps/code/src/renderer/features/sidebar/components/TaskListView.tsx +++ b/apps/code/src/renderer/features/sidebar/components/TaskListView.tsx @@ -30,6 +30,7 @@ import { Fragment, useCallback, useEffect, useMemo } from "react"; import type { TaskData, TaskGroup } from "../hooks/useSidebarData"; import { useTaskPrStatus } from "../hooks/useTaskPrStatus"; import { useSidebarStore } from "../stores/sidebarStore"; +import { getNewTaskTarget } from "../utils/getNewTaskTarget"; import { DraggableFolder } from "./DraggableFolder"; import { TaskItem } from "./items/TaskItem"; import { SidebarSection } from "./SidebarSection"; @@ -418,10 +419,14 @@ export function TaskListView({ addSpacingBefore={false} tooltipContent={folder?.path ?? group.id} onNewTask={() => { - if (groupFolderId) { - navigateToTaskInput(groupFolderId); - } else { + const target = getNewTaskTarget({ + groupFolderId, + groupId: group.id, + }); + if (target === undefined) { navigateToTaskInput(); + } else { + navigateToTaskInput(target); } }} newTaskTooltip={`Start new task in ${folder?.name ?? group.name}`} diff --git a/apps/code/src/renderer/features/sidebar/utils/getNewTaskTarget.test.ts b/apps/code/src/renderer/features/sidebar/utils/getNewTaskTarget.test.ts new file mode 100644 index 000000000..b975646bf --- /dev/null +++ b/apps/code/src/renderer/features/sidebar/utils/getNewTaskTarget.test.ts @@ -0,0 +1,49 @@ +import { describe, expect, it } from "vitest"; +import { getNewTaskTarget } from "./getNewTaskTarget"; + +describe("getNewTaskTarget", () => { + it("returns the folder id when the group has a matching local folder", () => { + expect( + getNewTaskTarget({ + groupFolderId: "folder-1", + groupId: "posthog/code", + }), + ).toBe("folder-1"); + }); + + it("returns initialCloudRepository for a cloud-only group with no local folder", () => { + expect( + getNewTaskTarget({ + groupFolderId: undefined, + groupId: "posthog/code", + }), + ).toEqual({ initialCloudRepository: "posthog/code" }); + }); + + it("returns undefined for the catch-all 'other' group with no folder id", () => { + expect( + getNewTaskTarget({ + groupFolderId: undefined, + groupId: "other", + }), + ).toBeUndefined(); + }); + + it("returns undefined when groupId is empty and no folder id is set", () => { + expect( + getNewTaskTarget({ + groupFolderId: undefined, + groupId: "", + }), + ).toBeUndefined(); + }); + + it("prefers the folder id even when groupId looks like a cloud repo", () => { + expect( + getNewTaskTarget({ + groupFolderId: "folder-7", + groupId: "posthog/posthog", + }), + ).toBe("folder-7"); + }); +}); diff --git a/apps/code/src/renderer/features/sidebar/utils/getNewTaskTarget.ts b/apps/code/src/renderer/features/sidebar/utils/getNewTaskTarget.ts new file mode 100644 index 000000000..b102ca882 --- /dev/null +++ b/apps/code/src/renderer/features/sidebar/utils/getNewTaskTarget.ts @@ -0,0 +1,12 @@ +import type { TaskInputNavigationOptions } from "@stores/navigationStore"; + +export function getNewTaskTarget(args: { + groupFolderId?: string; + groupId: string; +}): string | TaskInputNavigationOptions | undefined { + if (args.groupFolderId) return args.groupFolderId; + if (args.groupId && args.groupId !== "other") { + return { initialCloudRepository: args.groupId }; + } + return undefined; +} diff --git a/apps/code/src/renderer/stores/navigationStore.ts b/apps/code/src/renderer/stores/navigationStore.ts index 47ca4f1f9..ada0146ed 100644 --- a/apps/code/src/renderer/stores/navigationStore.ts +++ b/apps/code/src/renderer/stores/navigationStore.ts @@ -27,7 +27,7 @@ export interface TaskInputReportAssociation { title: string; } -interface TaskInputNavigationOptions { +export interface TaskInputNavigationOptions { folderId?: string; initialPrompt?: string; initialCloudRepository?: string; From 7aa57858c1afd3f21d706f37d57738862f32211c Mon Sep 17 00:00:00 2001 From: Marce Coll Date: Fri, 22 May 2026 12:13:45 +0200 Subject: [PATCH 2/2] refactor(sidebar): apply Greptile review feedback - Collapse superfluous if/else around navigateToTaskInput now that we pass the result of getNewTaskTarget through directly (the param is optional). - Convert the 5 getNewTaskTarget tests to a single it.each block to match the codebase's parameterised-test convention. Generated-By: PostHog Code Task-Id: 0d29b421-c014-4392-adbc-fbc5b8da014e --- .../sidebar/components/TaskListView.tsx | 15 ++-- .../sidebar/utils/getNewTaskTarget.test.ts | 71 ++++++++----------- 2 files changed, 34 insertions(+), 52 deletions(-) diff --git a/apps/code/src/renderer/features/sidebar/components/TaskListView.tsx b/apps/code/src/renderer/features/sidebar/components/TaskListView.tsx index cbc994d35..83ed3b892 100644 --- a/apps/code/src/renderer/features/sidebar/components/TaskListView.tsx +++ b/apps/code/src/renderer/features/sidebar/components/TaskListView.tsx @@ -419,15 +419,12 @@ export function TaskListView({ addSpacingBefore={false} tooltipContent={folder?.path ?? group.id} onNewTask={() => { - const target = getNewTaskTarget({ - groupFolderId, - groupId: group.id, - }); - if (target === undefined) { - navigateToTaskInput(); - } else { - navigateToTaskInput(target); - } + navigateToTaskInput( + getNewTaskTarget({ + groupFolderId, + groupId: group.id, + }), + ); }} newTaskTooltip={`Start new task in ${folder?.name ?? group.name}`} > diff --git a/apps/code/src/renderer/features/sidebar/utils/getNewTaskTarget.test.ts b/apps/code/src/renderer/features/sidebar/utils/getNewTaskTarget.test.ts index b975646bf..dbe2dc7e8 100644 --- a/apps/code/src/renderer/features/sidebar/utils/getNewTaskTarget.test.ts +++ b/apps/code/src/renderer/features/sidebar/utils/getNewTaskTarget.test.ts @@ -2,48 +2,33 @@ import { describe, expect, it } from "vitest"; import { getNewTaskTarget } from "./getNewTaskTarget"; describe("getNewTaskTarget", () => { - it("returns the folder id when the group has a matching local folder", () => { - expect( - getNewTaskTarget({ - groupFolderId: "folder-1", - groupId: "posthog/code", - }), - ).toBe("folder-1"); - }); - - it("returns initialCloudRepository for a cloud-only group with no local folder", () => { - expect( - getNewTaskTarget({ - groupFolderId: undefined, - groupId: "posthog/code", - }), - ).toEqual({ initialCloudRepository: "posthog/code" }); - }); - - it("returns undefined for the catch-all 'other' group with no folder id", () => { - expect( - getNewTaskTarget({ - groupFolderId: undefined, - groupId: "other", - }), - ).toBeUndefined(); - }); - - it("returns undefined when groupId is empty and no folder id is set", () => { - expect( - getNewTaskTarget({ - groupFolderId: undefined, - groupId: "", - }), - ).toBeUndefined(); - }); - - it("prefers the folder id even when groupId looks like a cloud repo", () => { - expect( - getNewTaskTarget({ - groupFolderId: "folder-7", - groupId: "posthog/posthog", - }), - ).toBe("folder-7"); + it.each([ + { + name: "returns the folder id when the group has a matching local folder", + args: { groupFolderId: "folder-1", groupId: "posthog/code" }, + expected: "folder-1", + }, + { + name: "returns initialCloudRepository for a cloud-only group with no local folder", + args: { groupFolderId: undefined, groupId: "posthog/code" }, + expected: { initialCloudRepository: "posthog/code" }, + }, + { + name: "returns undefined for the catch-all 'other' group with no folder id", + args: { groupFolderId: undefined, groupId: "other" }, + expected: undefined, + }, + { + name: "returns undefined when groupId is empty and no folder id is set", + args: { groupFolderId: undefined, groupId: "" }, + expected: undefined, + }, + { + name: "prefers the folder id even when groupId looks like a cloud repo", + args: { groupFolderId: "folder-7", groupId: "posthog/posthog" }, + expected: "folder-7", + }, + ])("$name", ({ args, expected }) => { + expect(getNewTaskTarget(args)).toEqual(expected); }); });