refactor(client): remove dead sidebar ordering surfaces

This commit is contained in:
_Kerman
2026-08-11 17:51:18 +08:00
parent ed39516c20
commit 7222a99e33
29 changed files with 71 additions and 123 deletions

View File

@@ -38,19 +38,6 @@
background: var(--dsw-alias-interactive-bg-hover);
}
.viewOptionLabel {
display: flex;
align-items: center;
justify-content: space-between;
gap: 8px;
width: 100%;
}
.viewOptionCheck {
flex: none;
color: var(--dsw-alias-label-primary);
}
/* Section header: title, an inline search control, and the two trailing
actions. Expanding search collapses the action cluster and takes its room. */
.sectionHeader {

View File

@@ -12,7 +12,7 @@
import { useEffect, useMemo, useRef, useState } from 'react'
import clsx from 'clsx'
import {
Button, IconCheckOutline16, IconCloseFill14, IconPersonalizationOutline16,
Button, IconCloseFill14, IconPersonalizationOutline16,
IconProjectAddOutline16, IconSearchOutline16, Menu, Modal, Tooltip,
} from '@deepseek-ai/dsh-client-ui-primitives'
import type {
@@ -89,24 +89,19 @@ function ViewOptionsMenu({ groupBy, orderBy, onGroupPick, onOrderPick, t }: {
t: WorkspaceBrowserProps['t']
}) {
const [open, setOpen] = useState(false)
const optionLabel = (label: string, selected: boolean) => (
<span className={css.viewOptionLabel}>
<span>{label}</span>
{selected && <IconCheckOutline16 className={css.viewOptionCheck} />}
</span>
)
return (
<Menu
open={open}
onClose={() => { setOpen(false) }}
items={[
{ type: 'label' as const, id: 'group-by', text: t('groupBy.label') },
{ id: 'workspace', label: optionLabel(t('groupBy.workspace'), groupBy === 'workspace') },
{ id: 'flat', label: optionLabel(t('groupBy.flat'), groupBy === 'flat') },
{ id: 'workspace', label: t('groupBy.workspace') },
{ id: 'flat', label: t('groupBy.flat') },
{ type: 'label' as const, id: 'order-by', text: t('orderBy.label') },
{ id: 'manual', label: optionLabel(t('orderBy.manual'), orderBy === 'manual'), disabled: groupBy !== 'workspace' },
{ id: 'updated', label: optionLabel(t('orderBy.updated'), orderBy === 'updated') },
{ id: 'manual', label: t('orderBy.manual'), disabled: groupBy !== 'workspace' },
{ id: 'updated', label: t('orderBy.updated') },
]}
selectedIds={[groupBy, orderBy]}
onSelect={(id) => {
if (id === 'workspace' || id === 'flat') onGroupPick(id)
else if (id === 'manual' || id === 'updated') onOrderPick(id)
@@ -280,7 +275,7 @@ function SessionTree({
})
}, [recentSessionOrder, workspaces])
const groups = useMemo(
() => deriveGroups(list, orderedWorkspaces, archivedSessionIds, { expandedProjects }, 'manual'),
() => deriveGroups(list, orderedWorkspaces, archivedSessionIds, { expandedProjects }),
[list, orderedWorkspaces, archivedSessionIds, expandedProjects],
)
const now = Date.now()
@@ -684,12 +679,12 @@ export function WorkspaceBrowser({
const onClick = (event: MouseEvent): void => {
if (!(event.target instanceof Node) || searchRoot.current?.contains(event.target) === true) return
searchInput.current?.blur()
if (query !== '') return
if (normalizedQuery !== '') return
setSearchExpanded(false)
}
document.addEventListener('click', onClick)
return () => { document.removeEventListener('click', onClick) }
}, [query, wide, searchExpanded])
}, [normalizedQuery, wide, searchExpanded])
useEffect(() => {
if (normalizedQuery === '') {

View File

@@ -29,7 +29,6 @@ export interface SessionNode {
runningSubagentCount: number
/** Finished running while not selected and not yet opened (the green "done" reminder dot). */
completed: boolean
createdAt: number
updatedAt: number
}
@@ -108,10 +107,6 @@ function byRecency(a: SessionSummary, b: SessionSummary): number {
return a.id < b.id ? -1 : 1
}
function sortSessions(sessions: SessionSummary[]): void {
sessions.sort(byRecency)
}
/**
* Ordinary sessions are visible; among blank sessions, only the current one
* is visible. Subagent children use their parent header catalog; archived
@@ -141,10 +136,12 @@ function buildGroup(
createdAt: number | undefined,
label: string,
members: readonly SessionSummary[],
orderBy: SessionOrderBy,
order: 'account' | 'recency',
): Group {
const sessions = [...members]
if (orderBy !== 'manual') sortSessions(sessions)
// Workspace order is the caller-selected sessionIds; only Ungrouped lacks
// an account order and therefore falls back to recency.
if (order === 'recency') sessions.sort(byRecency)
return { key, workspaceId, cwd, createdAt, label, sessions }
}
@@ -157,7 +154,6 @@ function groupByWorkspace(
list: SessionListState,
workspaces: readonly WorkspaceView[],
archived: ReadonlySet<SessionId>,
orderBy: SessionOrderBy,
): Group[] {
const groups: Group[] = []
const accounted = new Set<SessionId>()
@@ -172,7 +168,7 @@ function groupByWorkspace(
}
groups.push(buildGroup(
workspace.workspaceId, workspace.workspaceId, workspace.path,
Date.parse(workspace.createdAt), workspace.title, members, orderBy,
Date.parse(workspace.createdAt), workspace.title, members, 'account',
))
}
const stray = list.ids
@@ -180,10 +176,7 @@ function groupByWorkspace(
.filter((s): s is SessionSummary =>
s !== undefined && !accounted.has(s.id) && sessionVisible(s, list.current, archived))
if (stray.length > 0) {
groups.push(buildGroup(
UNGROUPED_KEY, undefined, undefined, undefined, UNGROUPED_LABEL, stray,
orderBy === 'manual' ? 'updated' : orderBy,
))
groups.push(buildGroup(UNGROUPED_KEY, undefined, undefined, undefined, UNGROUPED_LABEL, stray, 'recency'))
}
return groups
}
@@ -199,7 +192,6 @@ function sessionNode(
running: s.running,
runningSubagentCount: descendants.get(s.id)?.runningCount ?? 0,
completed: s.completed === true,
createdAt: s.createdAt,
updatedAt: s.updatedAt,
...(s.pendingInteraction === undefined ? {} : { pendingInteraction: s.pendingInteraction }),
}
@@ -217,7 +209,6 @@ function sessionNode(
* @param workspaces - real workspaces in stable Host order.
* @param archivedSessionIds - registry-global archive set.
* @param view - local expansion arrays.
* @param orderBy - local session ordering mode.
* @returns group sections in render order.
*/
export function deriveGroups(
@@ -225,7 +216,6 @@ export function deriveGroups(
workspaces: readonly WorkspaceView[],
archivedSessionIds: readonly SessionId[],
view: TreeView,
orderBy: SessionOrderBy = 'manual',
): GroupNode[] {
const archived = new Set(archivedSessionIds)
const expandedProjects = new Set(view.expandedProjects)
@@ -235,7 +225,7 @@ export function deriveGroups(
: (workspaces.find(w => w.sessionIds.includes(list.current as SessionId))?.workspaceId as string | undefined)
?? UNGROUPED_KEY
const groups: GroupNode[] = []
for (const g of groupByWorkspace(list, workspaces, archived, orderBy)) {
for (const g of groupByWorkspace(list, workspaces, archived)) {
const expanded = expandedProjects.has(g.key)
groups.push({
key: g.key,
@@ -273,7 +263,7 @@ export function deriveFlat(
if (s === undefined || !sessionVisible(s, list.current, archived)) continue
rows.push(s)
}
sortSessions(rows)
rows.sort(byRecency)
return rows.map(session => sessionNode(session, descendants))
}