diff --git a/src/renderer/src/components/sidebar/WorktreeList.tsx b/src/renderer/src/components/sidebar/WorktreeList.tsx index d2f13e524ce..f7ae7295b90 100644 --- a/src/renderer/src/components/sidebar/WorktreeList.tsx +++ b/src/renderer/src/components/sidebar/WorktreeList.tsx @@ -245,7 +245,6 @@ const WorktreeList = React.memo(function WorktreeList({ worktrees: allWorktrees, folderWorkspaces, hasFilters, - clearFilters, revealWorkspaceFilters }) diff --git a/src/renderer/src/components/sidebar/worktree-list/listing/use-filters.ts b/src/renderer/src/components/sidebar/worktree-list/listing/use-filters.ts index 37bc57be8de..857b59205ea 100644 --- a/src/renderer/src/components/sidebar/worktree-list/listing/use-filters.ts +++ b/src/renderer/src/components/sidebar/worktree-list/listing/use-filters.ts @@ -10,11 +10,13 @@ import { isSleepingSweepExemptWorkspace } from '../../visible-worktrees' import type { Worktree } from '../../../../../../shared/worktree/types' +import { parseWorkspaceKey } from '../../../../../../shared/workspace-scope' import { getWorktreeExecutionHostId, getSettingsFocusedExecutionHostId } from '../../../../../../shared/execution-host' import { isDefaultBranchWorkspace } from '../../default-branch-workspace' +import { getFolderWorkspaceExecutionHostIdForRows } from './host-filtering' import { getPairedDeviceIdsByEnvironment, isWorkspaceFromOtherDevice @@ -58,13 +60,33 @@ export function useSidebarWorktreeFilters() { const revealWorkspaceFilters = useCallback((worktree: Worktree) => { const state = useAppStore.getState() const repo = state.repos.find((candidate) => candidate.id === worktree.repoId) - const targetHostId = getWorktreeExecutionHostId( + let targetHostId = getWorktreeExecutionHostId( worktree, repo, getSettingsFocusedExecutionHostId(state.settings) ) + const workspaceScope = parseWorkspaceKey(worktree.id) + if (workspaceScope?.type === 'folder') { + const folderWorkspace = state.folderWorkspaces.find( + (candidate) => candidate.id === workspaceScope.folderWorkspaceId + ) + const projectGroup = folderWorkspace + ? state.projectGroups.find((candidate) => candidate.id === folderWorkspace.projectGroupId) + : undefined + if (folderWorkspace) { + targetHostId = getFolderWorkspaceExecutionHostIdForRows({ + folderWorkspace, + projectGroup, + defaultHostId: getSettingsFocusedExecutionHostId(state.settings) + }) + } + } - if (state.filterRepoIds.length > 0 && !state.filterRepoIds.includes(worktree.repoId)) { + if ( + !worktree.id.startsWith('folder:') && + state.filterRepoIds.length > 0 && + !state.filterRepoIds.includes(worktree.repoId) + ) { state.setFilterRepoIds([...state.filterRepoIds, worktree.repoId]) } const visibleHostIds = state.visibleWorkspaceHostIds diff --git a/src/renderer/src/components/sidebar/worktree-list/navigation/use-reveal-requests.test.tsx b/src/renderer/src/components/sidebar/worktree-list/navigation/use-reveal-requests.test.tsx index 36b86ab0e9a..da4d68e1534 100644 --- a/src/renderer/src/components/sidebar/worktree-list/navigation/use-reveal-requests.test.tsx +++ b/src/renderer/src/components/sidebar/worktree-list/navigation/use-reveal-requests.test.tsx @@ -79,7 +79,7 @@ beforeEach(() => { sortOrder: 1, lastActivityAt: 1 } - const clearFilters = vi.fn() + const revealWorkspaceFilters = vi.fn() args = { groupBy: 'repo', renderedSidebarRowKeys: new Set(), @@ -91,8 +91,7 @@ beforeEach(() => { worktrees: [worktree], folderWorkspaces: [], hasFilters: true, - clearFilters, - revealWorkspaceFilters: clearFilters + revealWorkspaceFilters } }) @@ -108,10 +107,8 @@ describe('revealing a filtered workspace', () => { expect(document.body.textContent).toContain( 'Revealing it will adjust only the filters hiding it.' ) - expect(args.clearFilters).not.toHaveBeenCalled() expect(state.revealWorktreeInSidebar).not.toHaveBeenCalled() await click('Keep filters') - expect(args.clearFilters).not.toHaveBeenCalled() expect(state.revealWorktreeInSidebar).not.toHaveBeenCalled() }) @@ -122,17 +119,16 @@ describe('revealing a filtered workspace', () => { await act(async () => requestScrollToCurrentWorkspaceReveal()) await click('Adjust filters and reveal') expect(revealWorkspaceFilters).toHaveBeenCalledWith(args.worktrees[0]) - expect(args.clearFilters).not.toHaveBeenCalled() }) - it('clears filters and reveals on the original execution host only after confirmation', async () => { + it('adjusts blocking filters and reveals on the original execution host only after confirmation', async () => { await render() await act(async () => { requestScrollToCurrentWorkspaceReveal() requestScrollToCurrentWorkspaceReveal() }) await click('Adjust filters and reveal') - expect(args.clearFilters).toHaveBeenCalledTimes(1) + expect(args.revealWorkspaceFilters).toHaveBeenCalledTimes(1) expect(state.revealWorktreeInSidebar).toHaveBeenCalledWith('wt-1', { behavior: 'smooth', highlight: true, @@ -143,7 +139,7 @@ describe('revealing a filtered workspace', () => { }) it.each([true, false])( - 'reveals immediately when clearing filters is unnecessary (%s)', + 'reveals immediately when filter adjustment is unnecessary (%s)', async (visible) => { args = { ...args, @@ -153,7 +149,6 @@ describe('revealing a filtered workspace', () => { await render() await act(async () => requestScrollToCurrentWorkspaceReveal()) expect(document.querySelector('[role="dialog"]')).toBeNull() - expect(args.clearFilters).not.toHaveBeenCalled() expect(state.revealWorktreeInSidebar).toHaveBeenCalledTimes(1) } ) @@ -169,7 +164,6 @@ describe('revealing a filtered workspace', () => { await render() await act(async () => requestScrollToCurrentWorkspaceReveal()) expect(document.querySelector('[role="dialog"]')).toBeNull() - expect(args.clearFilters).not.toHaveBeenCalled() expect(state.revealWorktreeInSidebar).toHaveBeenCalledTimes(1) } ) @@ -189,7 +183,6 @@ describe('revealing a filtered workspace', () => { args = { ...args, visibleWorktrees: args.worktrees } await render() await click('Adjust filters and reveal') - expect(args.clearFilters).not.toHaveBeenCalled() expect(state.revealWorktreeInSidebar).toHaveBeenCalledTimes(1) }) @@ -199,7 +192,6 @@ describe('revealing a filtered workspace', () => { args = { ...args, currentSidebarWorktreeId: 'wt-2' } await render() await click('Adjust filters and reveal') - expect(args.clearFilters).not.toHaveBeenCalled() expect(state.revealWorktreeInSidebar).not.toHaveBeenCalled() }) @@ -231,10 +223,9 @@ describe('revealing a filtered workspace', () => { args.visibleFolderWorkspaces = filtered ? [] : args.folderWorkspaces await render() await act(async () => requestScrollToCurrentWorkspaceRevealAndRename()) - expect(args.clearFilters).not.toHaveBeenCalled() if (filtered) { await click('Adjust filters and reveal') - expect(args.clearFilters).toHaveBeenCalledTimes(1) + expect(args.revealWorkspaceFilters).toHaveBeenCalledTimes(1) } else { expect(document.querySelector('[role="dialog"]')).toBeNull() } diff --git a/src/renderer/src/components/sidebar/worktree-list/navigation/use-reveal-requests.ts b/src/renderer/src/components/sidebar/worktree-list/navigation/use-reveal-requests.ts index ebe5d695b6d..67232d6fd81 100644 --- a/src/renderer/src/components/sidebar/worktree-list/navigation/use-reveal-requests.ts +++ b/src/renderer/src/components/sidebar/worktree-list/navigation/use-reveal-requests.ts @@ -40,7 +40,6 @@ export function useSidebarRevealRequests(args: { worktrees: readonly Worktree[] folderWorkspaces: readonly FolderWorkspace[] hasFilters: boolean - clearFilters: () => void revealWorkspaceFilters: (worktree: Worktree) => void }): void { const { @@ -54,7 +53,6 @@ export function useSidebarRevealRequests(args: { worktrees, folderWorkspaces, hasFilters, - clearFilters, revealWorkspaceFilters } = args const setGroupBy = useAppStore((s) => s.setGroupBy) @@ -94,7 +92,6 @@ export function useSidebarRevealRequests(args: { } } }, [ - clearFilters, groupBy, hasFilters, currentSidebarExecutionHostId,