Default workspace list to repo grouping (#2657)
Co-authored-by: Orca <help@stably.ai>
This commit is contained in:
parent
c1723477d4
commit
e8837275fe
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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()
|
||||
})
|
||||
|
||||
|
|
|
|||
|
|
@ -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" />
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
|
|
|
|||
|
|
@ -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.
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
|
|
|
|||
Loading…
Reference in New Issue