feat(desktop): Linear-style Workspaces list (views, filter chips, Display menu, virtualised rows)
Merged
HA
3d ago+4105+4105+0123456789012345678901234567890123456789-1061-1061-0123456789012345678901234567890123456789
What
The desktop Workspaces page reworked to read like Linear's issues list.
- Views row: built-in All · Needs me · Working · Cloud plus saved views (filters pinned to a name). Editing a view's chips offers Save view / Reset; from a built-in, Save as view. Cap of 20, UUID ids, sanitised on rehydration.
- Filter row: one chip per active filter ("Status is Needs attention"), a single + Filter menu (Host / Project / Creator / Status), Clear, and Display at the right end.
- Display: layout (list / board), grouping (status, project, host, creator, none), ordering (last agent message, created, name), show archived. Default: no grouping, ordered by last agent message. Choices persist per profile.
- Rows: title → creator avatar → place mark (cloud / other device / offline device) | PR pill → project → trailing cell = live status glyph or compact age (
formatAge), the old cloud tab's rule and glyph set. - List is virtualised (
@tanstack/react-virtual) with the active section header pinned. - Deep links:
tab,status,group,order(unknowntab→ All, filters kept). WindowControlsInsetsubtractstitlebar-area-x, so headers stop reserving a phantom right margin when the OS draws controls on the left (also affects Tasks / Cloud Workspaces headers on Linux).
Walkthrough with live-app screenshots, decisions and gaps vs the old cloud tab:
https://app.superset.sh/page/workspaces-list-rework-walkthrough-gcfi5t
Design history (mockup, 7 versions): https://app.superset.sh/page/workspaces-list-linear-style-ajahyk
Verification
bun run --filter @superset/desktop typecheck✓bun testforv2-workspaces+ persisted-keys: 67 pass (new: groupWorkspaces, store views/cap/sanitise, URL parsing, pinned-header range, sort comparators, hasLiveWorkspaceState)biome check✓ ·bun run check:i18n✓ (27 new strings translated in all 16 locales)- Driven in the running dev app (display :1): header rails measured to the pixel, views/filter/Display menus, Save-as-view flow, flat default, grouping, sticky headers while scrolling under virtualisation, glyph-or-age cell. An independent review pass (unanchored sub-agent) was applied in full.
- Not verified: a Windows build (rows 2–3 reserve the window-controls inset for alignment); the device/offline place marks (this dev org is cloud-only; the code path mirrors the previous row).
Follow-ups (not in this PR)
Counts in the view tabs, keyboard j/k + multi-select + bulk bar, peek panel, group by time, labels filter, "Needs me" currently = attention + finished-unread buckets.
Summary by cubic
Reworks the desktop Workspaces page into a Linear-style list with saved views, filter chips, a Display menu, and virtualised rows, replacing the old header and cloud tab.
- Views row: built-in All, Needs me, Working, Cloud, plus saved views that pin a filter set to a name. Editing a view's chips offers Save view / Reset; built-ins offer Save as view. Max 20 views with UUID ids, own-property checked and sanitised on rehydration. The rows form a real tablist (ids, aria-controls, roving tabIndex) with the list or board as the tabpanel; delete (with confirmation) and New view sit beside the tablist. Clear resets to All rather than leaving a built-in tab selected with no filters.
- Filter row: one chip per active filter (host, project, creator, status), a single Add filter menu, Clear, and a Display menu at the right end.
- Display menu: list or board layout, grouping by status, project, host, creator, or none (hidden in board layout, whose columns are always status buckets), ordering by last agent message, created, or name, and show archived. Default is no grouping, ordered by last agent message; choices persist per profile.
- Rows: title, creator avatar, place mark (cloud, other device, offline device), PR pill, project, then a trailing cell with the live status glyph or compact age, reusing the old cloud tab's rules and glyph set. Row age keeps
formatAge(compact, no "ago") after merging main. - List is virtualised with
@tanstack/react-virtual; the active section header stays pinned while scrolling. - Deep links carry tab, status, group, and order; a tab link starts from the view's own filters before URL overrides, and an unknown tab (view id checked as own property) falls back to All but keeps filters. The no-cloud fallback keeps the filters the link carried. Archived rows sit in a trailing Archived section under any grouping and are never shown as live; Clear lands on All.
WindowControlsInsetsubtractstitlebar-area-x, so headers stop reserving a phantom right margin when the OS draws window controls on the left.
Verification
bun run --filter @superset/desktop typecheck,bun test,biome check, andcheck:i18nall pass; 67 tests cover the new grouping, sorting, URL parsing, store persistence, and pinned-header logic.- 27 new strings translated across all 16 locales; four existing translations corrected (German, Dutch, Polish "Archived shown", Japanese "Needs me").
- Not verified on a Windows build or with device/offline place marks (dev org is cloud-only).
Summary by CodeRabbit
- New Features
- Browse workspaces with built-in or saved views and filters for location, project, creator, status, and archived workspaces.
- Save, reset, and delete views; switch between list and board layouts; group workspaces in different ways; and sort by activity, creation date, or name.
- Workspace selections and display settings are reflected in the page URL. Grouped lists support collapsible sections and pinned headers.
- Improvements
- Updated status indicators and workspace row details make activity and location easier to scan.
- Translations
- Added localized interface text for workspace views and controls.