feat(desktop): filter the Issues page by priority and creator, and hide settled issues gone quiet
Merged
DA
11d ago+670+670+012345678901234567890123456789-62-62-01234567890123456789
Plan item "Filter and group" of Improve Issues board: filter the Issues page by priority and by creator, and hide Done/Canceled issues that went quiet over a week ago.
What changed
- View options (
issues-page.tsx'sViewOptions) gains three groups under Board / List, following the sidebar's tasks View options:- Priority submenu: Any priority (default), or any set of priorities. Picking a priority from "any" narrows to it, picking another adds it, and picking a checked one removes it. Removing the last one, or picking all five, goes back to Any priority.
- Created by submenu: Anyone, Me, or a member by face. It reuses the sidebar's
createdByEntries(now exported and no longer tied to the task view) and@luke/ui/actor-model. As in the sidebar, it shows only in a shared workspace, or while it is filtering. - Show completed switch ("Done or canceled over a week ago"). It is off by default, as on Linear's board, so Done and Canceled issues last updated over 7 days ago are left off the board and the List until it is switched on. Recent settled issues always show.
- While the filter differs from the default, View options gets the sidebar's dot and
aria-description="Filtered". A fresh reader sees no dot. - When a filter leaves no issue in a workspace that has some, either layout shows "No issues match" with Clear filters, not #3659's "No issues yet" + New issue. Clear filters goes back to the default filter. If the default itself shows nothing (every issue is settled and quiet), it turns Show completed on instead, so the press always brings something back.
- Model:
filteredIssues,issueFilterChanged,clearedIssueFilter,issueFilterToggledPriority,issueFilterAnyPriority,issueFilterCreatedByandDEFAULT_ISSUE_FILTERlive in@luke/features'issue-list-model.ts. The model has no DOM code and takes "now" from its caller, so its tests use a fixed time. - Kept like the layout: the filter is stored per reader and per workspace with
readKept/writeKept, underluke.issuesFilters(issue-filter-view.ts), the way the sidebar keeps its task views. Keying by the reader's account means a Me chosen by one account never filters another account on the same Mac. It is not a synced setting and has no Settings row. - No
@luke/uichange is left. My earlier CollectionPage/EmptyState spacing fix was dropped in the rebase because #3659 fixed the same clipping.
Tests
issue-list-model.test.ts:- The default filter hides only quiet settled issues and counts as no change.
- Clear filters falls back to showing everything when the default would show nothing.
- Priority narrow, add and remove; picking all priorities equals none.
- Creator filter, including a creator who is gone.
- Quiet settled issues as of a fixed time (8, 7 and 6 days, and old open work).
- Combined filters; the helpers leave the other fields alone.
issues-page.test.ts(each fails without this change):- A priority filter hides the others on the board and in the List, the page says it is filtered, and the filter survives a remount.
- Created by → Me shows only the reader's issues; Ada shows Ada's; Anyone shows everyone's again.
- An old Done or Canceled issue is hidden at first while a recent one stays, on the board and in the List; Show completed brings it back and turns the dot on.
- With every issue settled and quiet, the page says no issue matches, and Clear filters shows them.
- A filter that matches nothing shows "No issues match", and Clear filters restores every issue and removes the dot.
- One account's filter doesn't apply to another account.
- Most tests in the file now pin the clock at a day past the epoch, so the synthetic issues (stamped in its first seconds) count as recent and the existing board and list tests are unaffected by the new default.
Screenshots
Drawn from the real components in a browser harness over synthetic issues (dark theme).
| View options, Priority submenu | ![]() |
| Default board: settled issues quiet over a week hidden, no dot | ![]() |
| Filtered board (Urgent + High), with the dot | ![]() |
| No issue matches, board | ![]() |
| No issue matches, List | ![]() |
| Empty workspace, board (#3659) | ![]() |
| Empty workspace, List (#3659) | ![]() |
| Factory, empty | ![]() |
| Factory, failed | ![]() |
Out of scope / notes
- Grouping beyond status comes next as its own PR ("Group by: Status / Priority" for the List only).
- No server-side filtering: the page filters the at most 500 issues the list already reads.
- No
run.sh --previewMac run is needed: this is renderer-only, with no new act, setting or main-process code.








