Keep main workspace first in project groups

This commit is contained in:
Neil
2026-05-29 07:39:21 -07:00
parent 6c553ef4b3
commit 17f1edf2d9
2 changed files with 45 additions and 1 deletions
@@ -395,6 +395,39 @@ describe('buildRows project grouping order', () => {
])
})
it('keeps the main workspace first inside its project group', () => {
const main = {
...wA,
id: 'wt-a-main',
displayName: 'main',
isMainWorktree: true
}
const freshChild = {
...wA,
id: 'wt-a-fresh-child',
displayName: 'fresh-child',
isMainWorktree: false
}
const rows = buildRows(
'repo',
[freshChild, wB, main],
map,
null,
new Set(),
undefined,
undefined,
'visible-worktree-order'
)
expect(rows).toMatchObject([
{ type: 'header', key: 'repo:repo-a' },
{ type: 'item', worktree: { id: 'wt-a-main' } },
{ type: 'item', worktree: { id: 'wt-a-fresh-child' } },
{ type: 'header', key: 'repo:repo-b' },
{ type: 'item', worktree: { id: 'wt-b' } }
])
})
it('keeps repoOrder for manual project group ordering', () => {
const repoOrder = new Map([
[repoB.id, 0],
@@ -344,6 +344,16 @@ function appendWorktreeRows(
}
}
function orderMainWorktreeFirst(worktrees: Worktree[]): Worktree[] {
const mainWorktrees = worktrees.filter((worktree) => worktree.isMainWorktree)
if (mainWorktrees.length === 0) {
return worktrees
}
// Why: project groups are scanned by repo; keep the repo's canonical
// workspace anchored even when dynamic sorts rank a child workspace first.
return [...mainWorktrees, ...worktrees.filter((worktree) => !worktree.isMainWorktree)]
}
/**
* Build the flat row list consumed by the virtualizer.
* Extracted here to keep WorktreeList.tsx under the line-count lint limit.
@@ -527,7 +537,8 @@ export function buildRows(
result.push(header)
if (!isCollapsed) {
appendWorktreeRows(result, group.items, repoMap, lineageById, worktreeMap, {
const items = groupBy === 'repo' ? orderMainWorktreeFirst(group.items) : group.items
appendWorktreeRows(result, items, repoMap, lineageById, worktreeMap, {
nestLineage,
collapsedGroups
})