Keep workspace reveals minimal for folders (#21373)

* Keep folder reveals minimal and require filter adjustment

* Clarify minimal reveal test names

* Resolve remote folder hosts during reveal
This commit is contained in:
Neil
2026-09-17 22:46:14 -07:00
committed by GitHub
parent b7d694ff7e
commit 7c7310fc43
4 changed files with 30 additions and 21 deletions
@@ -245,7 +245,6 @@ const WorktreeList = React.memo(function WorktreeList({
worktrees: allWorktrees,
folderWorkspaces,
hasFilters,
clearFilters,
revealWorkspaceFilters
})
@@ -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
@@ -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()
}
@@ -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,