Default workspace list to repo grouping (#2657)

Co-authored-by: Orca <help@stably.ai>
This commit is contained in:
Brennan Benson 2026-05-22 20:14:45 -07:00 committed by GitHub
parent c1723477d4
commit e8837275fe
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
8 changed files with 16 additions and 16 deletions

View File

@ -322,12 +322,12 @@ export default function HostScreen() {
const [lastKnownWorktrees, setLastKnownWorktrees] = useState<Worktree[]>(initialCache ?? [])
const [search, setSearch] = useState('')
const [showSearch, setShowSearch] = useState(false)
const [sortMode, setSortMode] = useState<SortMode>('smart')
const [sortMode, setSortMode] = useState<SortMode>('recent')
const [filters, setFilters] = useState<FilterState>({
activeOnly: false,
selectedRepos: new Set()
})
const [groupMode, setGroupMode] = useState<GroupMode>('none')
const [groupMode, setGroupMode] = useState<GroupMode>('repo')
// Modals
const [showSortPicker, setShowSortPicker] = useState(false)

View File

@ -32,15 +32,15 @@ export type HostPreferences = {
}
const DEFAULT_PREFS: HostPreferences = {
sortMode: 'smart',
sortMode: 'recent',
filterMode: 'all',
groupMode: 'none',
groupMode: 'repo',
collapsedGroups: [],
selectedRepos: []
}
const SORT_MODES = new Set(['smart', 'recent', 'name'])
const SORT_MODES = new Set(['smart', 'recent', 'name', 'repo'])
const FILTER_MODES = new Set(['all', 'active'])
const GROUP_MODES = new Set(['none', 'repo', 'prStatus'])
const GROUP_MODES = new Set(['none', 'workspaceStatus', 'repo', 'prStatus'])
function stringArray(value: unknown): string[] {
return Array.isArray(value)

View File

@ -257,7 +257,7 @@ describe('Store', () => {
const store = await createStore()
const ui = store.getUI()
expect(ui.sidebarWidth).toBe(280)
expect(ui.groupBy).toBe('workspace-status')
expect(ui.groupBy).toBe('repo')
expect(ui.lastActiveRepoId).toBeNull()
expect(ui.dismissedUpdateVersion).toBeNull()
expect(ui.lastUpdateCheckAt).toBeNull()
@ -1650,7 +1650,7 @@ describe('Store', () => {
store.updateUI({ sidebarWidth: 400 })
const ui = store.getUI()
expect(ui.sidebarWidth).toBe(400)
expect(ui.groupBy).toBe('workspace-status') // default preserved
expect(ui.groupBy).toBe('repo') // default preserved
expect(ui.dismissedUpdateVersion).toBeNull()
})

View File

@ -33,12 +33,12 @@ export function WorktreeListSlide({ tapping }: { tapping: boolean }): React.JSX.
Filter
</button>
<button type="button" className="mp-wl-button">
<SmartIcon />
Smart
<SortIcon />
Recent
</button>
<button type="button" className="mp-wl-button">
<GroupIcon />
Group
Repo
</button>
<span className="mp-wl-spacer" />
<span className="mp-wl-icon">
@ -218,7 +218,7 @@ function FilterIcon(): React.JSX.Element {
)
}
function SmartIcon(): React.JSX.Element {
function SortIcon(): React.JSX.Element {
return (
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor">
<line x1="21" y1="4" x2="14" y2="4" />

View File

@ -52,7 +52,7 @@ describe('startup UI hydration fallback', () => {
expect(hydratePersistedUI).toHaveBeenCalledTimes(1)
expect(hydratePersistedUI.mock.calls[0][0].sidebarWidth).toBe(280)
expect(hydratePersistedUI.mock.calls[0][0].groupBy).toBe('workspace-status')
expect(hydratePersistedUI.mock.calls[0][0].groupBy).toBe('repo')
expect(hydratePersistedUI.mock.calls[0][0].sortBy).toBe('name')
expect(hydratePersistedUI.mock.calls[0][0].hideSleepingWorkspaces).toBe(false)
expect(hydratePersistedUI.mock.calls[0][0].showSleepingWorkspaces).toBe(true)

View File

@ -36,7 +36,7 @@ export function getStartupErrorFallbackUI(uiHydrated: boolean): PersistedUIState
lastActiveWorktreeId: null,
sidebarWidth: 280,
rightSidebarWidth: 350,
groupBy: 'workspace-status',
groupBy: 'repo',
sortBy: 'name',
showActiveOnly: false,
hideSleepingWorkspaces: DEFAULT_HIDE_SLEEPING_WORKSPACES,

View File

@ -943,7 +943,7 @@ export const createUISlice: StateCreator<AppState, [], [], UISlice> = (set, get)
return { setupScriptPromptDismissedRepoIds: next }
}),
groupBy: 'workspace-status',
groupBy: 'repo',
// Why: group keys are mode-specific (e.g. repo id vs PR status), so
// collapsed state from one mode is meaningless in another. Clearing
// also prevents unbounded accumulation of stale keys across mode switches.

View File

@ -350,7 +350,7 @@ export function getDefaultUIState(): PersistedUIState {
lastActiveWorktreeId: null,
sidebarWidth: 280,
rightSidebarWidth: 350,
groupBy: 'workspace-status',
groupBy: 'repo',
sortBy: 'recent',
showActiveOnly: false,
hideSleepingWorkspaces: DEFAULT_HIDE_SLEEPING_WORKSPACES,