mirror of
https://github.com/stablyai/orca.git
synced 2026-09-22 00:02:31 +00:00
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:
@@ -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
|
||||
|
||||
+6
-15
@@ -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,
|
||||
|
||||
Reference in New Issue
Block a user