Repository navigation
Show project and thread on board rows; group, sort, fold, desk filter (#175, #158) - #203
Merged
Merged
Conversation
#175, #158) Wide rows (78+ columns) end with a dim #thread · project label that omits whatever the view already says and drops rather than truncating the title. Bare g groups the live sections by project or thread, s sorts by recent, project, thread, or title, f folds the cursor's group, and Shift+F folds or unfolds every group. Sub-groups fold like the inbox, Shift+M on a folded sub-header marks the group, and t on the desk opens a threads/projects filter. All session-only; no store change.
…, mirror grouping in the web demo The desk peek still names only the project and a project board's peek only the thread; row labels are computed separately. Group by, sort by, and fold leave the palette while a task page owns input. The web demo gains row labels, group/sort pickers, sub-group folding, and the tabbed desk filter.
|
The latest updates on your projects. Learn more about Vercel for GitHub.
|
…t+M inside multi-select, archived labels - Project groups key on path identity, so spellings of one repository share a group. - Grouping drops its dimension only in sections that group; the inbox, done drawer, and archived rows keep it. Archived rows carry the same label as done rows. - Shift+M on a folded sub-header adds the group to an active multi-select set. - Tests: header layout and desk-filter tab/option clicks, painted desk filter chip, the all-folded seed fallback, and sync_from_domain under grouping.
…s fold - The `#thread · project` label follows the title two cells after its last word at every width, or starts the next line at the title's indent; nothing is truncated. A peek's closing line carries the same full label. - Every group sub-header is a cursor stop. Enter or a double-click opens the sub-header's project board, the desk, or its thread's cross-project view; a preview seat hands that request to the outer board. - Left/h folds and right/l unfolds the fold header under the cursor (a sub-group, the inbox, archived), ahead of the peek and the wide slider; with nothing to do the key keeps its usual meaning. Enter no longer folds.
…ss the slide - Rail rows beside an open task page carry the inline label too. - The status row on a fold header offers `enter open` (when the sub-header opens something) and `← fold` / `→ unfold`, instead of the stale `enter expand` / `enter collapse`; its arrow seat clicks like the key. - A Projects-preview sub-header double-click survives the Split-to-Rail slide, using the same reflow gesture task rows use. - Enter on the desk's own `desk` sub-header on the desk changes nothing, so a pinned search and marks stay. - Tests for the dirty-preview refusal through the outer hop, a label that itself wraps, and stale comments fixed. The PTY smoke expects the full `#thread · project` peek line.
The desk sub-header on the desk is already open, so its bar no longer shows `enter open`; the bar and Enter share one condition.
…ens nothing A single click on a sub-header, the inbox, or archived now only selects it. A double-click opens a sub-header's board; on a header that opens nothing it folds or unfolds instead. The header's own second press no longer disarms its double-click.
A left press used to disarm only the outer board's pending double-clicks, so a header click in the focused Rail preview stayed armed across a press elsewhere in the preview. Disarm both seats, keeping only the arm the press itself continues. The demo resets its header double-click on any other click.
This branch was successfully deployed
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Closes T216 (#175, #158; also covers T217). Base
main, no store change, all state per board session (no config defaults: those are T238 on dispatch).What ships
#thread · project(deskfor desk tasks), omitting what the view already says (project board → no project; thread filter/grouping → no thread; project filter/grouping → no project). It flows inline two cells after the title's last word, on the title's last line; when it doesn't fit there it starts the next line at the title's indent and wraps like the title. No right-aligned column, no width switch, nothing truncated (a selected narrow row no longer collapses to…). The narrow board rail beside an open task page (110+) carries the label too.└─closing line shows the row's full label (└─ #release · tsk, same omission rules), so the thread doesn't vanish when a row is peeked; the row itself drops its inline label while peeked, so it paints once.ggroup by (desknone · project · thread, project boardnone · thread, thread Viewnone · project), baressort by (recent · project · thread · title, own dimension hidden), bareffold/unfold the cursor's group (sub-group, inbox, or archived),Shift+Ffold/unfold all.ctrl+s/ctrl+funchanged (same letter, different modifier class, liked/ctrl+d). Palette:group by…,sort by…,fold / unfold group.Shift+Mon a sub-header unfolds it and marks the whole group as one set.Enteror a double-click on a project sub-header opens that project's board;deskopens the desk; a#threadsub-header opens that thread's cross-project view (same as choosing it withv).no threadopens nothing.no thread,deskon the desk, inbox, archived) a double-click folds/unfolds instead. Otherwise folding is keyboard-only (←/→, h/l,f,Shift+F). Fix: a header's own second press used to wipe its armed double-click (every left press that was not an index-row click disarmed both double-clicks), so double-click never opened; each target's own second press now keeps its arm (BoardModel::cancel_other_double_clicks, both the plain and the wide-focus mouse paths). A left press disarms both seats (outer board and preview), keeping only the arm the press continues on the seat it lands on, so a press elsewhere in the focused Rail preview disarms the preview's header double-click. In the Split preview the first click slides to Rail and can move the header; the second click is kept on the header the user saw by the same reflow gesture task rows use. In the Projects-tab preview, a thread sub-header hands the request to the outer board (the preview can't show a thread view itself), which closes the preview; an unsaved preview draft refuses, like the other project-switch paths.→unfolds a folded one and←folds an open one, cursor stays on the header (tree-view). With nothing to do (→on an open header,←on a folded one) the key keeps its normal meaning: wide stage slider, peek open/close. The intercept sits before the slider route, so the slider is never blocked.Enteron the inbox/archived heading does nothing now.f/Shift+Funchanged. Help readsclose / peek · fold / unfold a headerandh/l close/peek/fold. With the cursor on a fold header the status row showsenter open(only when the sub-header opens something) and← fold/→ unfold; the arrow seat clicks like the key.←on a task row inside a group keeps its peek-close/slider meaning (header-only folding, coordinator's call).t(or the new desk chip) opensthreads · projectstabs (←/→), choices combine (alpha #ship), narrows every section incl. the drawer and counts.group: none ▾andsort: recent ▾beside the filter chip, always shown (click → that picker). Desk and project boards: on the tab row. Thread View: beside its View control. Projects-tab preview: on its own header row beside the project name, with its own thread filter chip (Split and Rail; a Split click slides to Rail and opens the picker, like the preview's other controls).g:none ▾ s:recent ▾, (3) only the controls not at their own default (group ≠ none, sort ≠ recent, desk filter ≠ all) in full words, (4) the same keyed. The first that fits beside the tabs wins. If even (4) doesn't fit, the non-default controls take their own row under the tabs and defaults rejoin them there if the row has room; when every control is at its default, nothing costs a row (a 40×10 board keeps every row it had on main until you group/sort/filter). Only when the non-default set alone overflows a row do controls drop from the left, filter last. Preview header (one row): the name shortens to ≥8 cells, then the same tiers, then left-drop. So a choseng:threadnever disappears while a defaults:recentstays.Calls beyond the brief (please check)
g→ project/thread applies inside the inbox like ON DECK;f,Shift+F,Shift+M, ←/→, click/double-click and Enter work on its sub-headers.finside a grouped inbox folds the cursor's sub-group (←/→ on the inbox heading folds the whole inbox);Shift+Ffolds the inbox with everything else and a hidden row lands on the inbox heading. The desk inbox ignores project grouping, likeON DECK · desk(desk tasks only).none · threadand sort withoutproject; thread View offers groupnone · projectand sort withoutthread; the Projects overview lists projects, so it shows only its View chip; done drawer/archived never group.ON DECK · deskand the desk inbox omit thedesklabel (section already says it).Shift+Mon a folded sub-header unfolds it before marking, so marks never rest on hidden rows; inside multi-select it adds the group to the existing set.Shift+Ftreats inbox and archived as groups.Nnotices still lead.tstays inert on the thread View.tis nowfilter; oldgfold moved tof/Shift+F(CHANGELOGChanged).ggroup,Shift+Ssort,Shift+Ffold all, ←/→ to fold, click to select, Enter/double-click to open (double-click folds a header that opens nothing);fstays archive.desksub-header opens the desk; on the desk itselfEnterthere changes nothing (search, marks and fold stay).no threadopens nothing (silent, no status message).Enter/double-click guards the preview seat (the same guard tab switches use). A parked draft on the outer board is not refused here, as it isn't for tab switches either; it stays parked.Before / after (80×24 desk golden,
main→ this PR)desk_group_project_sort_thread_78x24 (grouped dimension dropped from the label)
desk_group_project_sort_thread_40x24 (labels at 40 columns, wrapping to the title indent)
Peek, live in t216-after (88 columns)
project_inbox_group_thread_78x24
projects_preview_split_110x30
How to test
Isolated store (main has no
config.toml, so onlyTSK_STATE_DIRmatters). Labels show at any width; narrow the pane to watch them wrap.On the board:
#thread · projecttwo spaces after its title; the long beta title wraps and its label follows on the last line or the next one at the title indent.ON DECK · desk/ inbox rows show only#ship. Narrow to 40 columns: labels stay, wrapping; nothing ends in….1a.
→(below 110 cols) peeks a row: the└─line reads#ship · alphaand the row's inline label disappears.g→ project: sub-headers▾ alpha · 2etc. in NEEDS YOU / IN MOTION; header showsgroup: project; grouped rows drop the project. The desk inbox stays flat under project grouping (desk tasks only).s→ title: rows reorder inside each group; headergroup: project · sort: title.fon an alpha row folds alpha (▸ alpha · 2), cursor on the header.→unfolds it (cursor stays),←folds it again;←once more does nothing new (at 110+ cols it's the slider's left end).↑/↓stop on open sub-headers too.4a.
Enteron▾ alphaopens the alpha board (tab 2). Back on the desk (1),g→ thread,Enteron▾ #shipopens the#shipthread view;Enteron▾ no threaddoes nothing. Single-click a sub-header: selects it, no fold. Double-click▾ alpha: opens the alpha board, no fold. Double-click▾ no thread(ordeskon the desk, the inbox heading, archived in the drawer): folds it; again: unfolds.4b. At 110+ cols, on an open sub-header
→slides the stage as usual; on a folded one→unfolds first, a second→slides.Shift+Ffolds every group incl. the inbox; again unfolds all.Enteron the inbox heading does nothing;←/→fold/unfold it.Shift+Mon its header → alpha unfolds, both rows marked; with multi-select already on, it adds to the set.t→←/→tabs: projects →alpha, then threads →#ship: chip readsalpha #ship ▾, only T1 left; done drawer (d) narrows too.2(pick alpha):goffersnone · thread,shas noproject; project board state is separate from the desk.group: … ▾ sort: … ▾beside the filter (desk,2project board,3thread View); click each → its picker. Click a sub-header → selects it (no fold).g→ thread: the inbox shows▾ #ship · 1/▾ no thread · 1under▾ inbox · 2;fon an inbox row folds its sub-group;Shift+Mon the folded sub-header marks it;Shift+Ffolds everything incl. the inbox.3) at 110+ columns: the preview's header row showsgroup: none ▾ sort: recent ▾ all ▾next to the project name; clicking one slides to the preview and opens that picker, and the choice is the preview's own. In the Rail preview,g→ thread,Enteron▾ #shipleaves the preview for the#shipthread view.g:none ▾ s:recent ▾; at 40 cols default controls disappear, and afterg→ thread they come back on their own row. With a long thread filter (t→ a long thread) plusg→ project, narrowing dropssort: recentfirst;group: projectshortens tog:projectbut stays.Verification
cargo fmt --check && cargo clippy --all-targets -- -D warnings && cargo test: green. Every new regression test was watched failing with its fix reverted by hand: labels (re-adding the 78-column gate), the…fix (keeping the head line's padding), always-selectable sub-headers (oldpush_group_rows), ←/→ routing (removing the key intercept), Enter-to-open (old no-op), double-click, and the preview→outer request (not draining it). The peek test replaces one that asserted the old project-only└─line. Earlier rounds: inbox grouping, header controls, per-control drop order, preview controls through Rail and the Split handoff.scripts/parity-pty-smoke.pynow expects the full#release · tsk-paritypeek line and passes at 40/78/109/110.app::tests::arrows_fold_a_header_in_place_and_otherwise_keep_their_slider_and_peek_meaningchecks→on an open header →StageRight(wide) /PeekDetail(narrow),←on a folded one → inert at the slider's left end /CollapseDetail, and h/l the same.site/:npm test49/49,npm run buildok, prettier clean. Playwright parity (npm run test:parity) 49/49 locally plus new demo tests for inline labels at 40/78 and header ←/→/Enter. The parity reference frames are now 40 rows tall: the browser demo never scrolls, and with labels on every row the 24-row app frame grew a scrollbar that narrowed its wrap.└─ #perf · beacon; desk grouped by thread:←folds▾ #perf, a second←does nothing,→unfolds, a second→falls through,Enteropens the#perfthread view; grouped by project,Enteron▾ beaconopens the beacon board. Not run live: the 110+ slider fall-through (the pane is 88 wide; covered by the app routing test), the preview thread hand-off (covered by a dispatch test), and a sub-header double-click inside a Herdr pane. Real-terminal double-click was checked instead on the release binary in a pyte PTY (SGR presses 80 ms apart, isolated copy of the t216-after store, 100×30): a single click on▾ herdr-file-viewer-longleaves it open; a double-click opens its board; a double-click on▾ deskon the desk folds it.a_real_double_click_on_a_sub_header_opens_or_folds_it_at_every_widthdrives two real presses throughboard_mouse_click_intent_after_focusat 80 and 120 columns (#shipopens the thread view;no threadfolds); it fails with the old disarm. New integration tests: single click selects only (sub-header, inbox, archived), double-click opens without folding, double-click foldsno thread,deskon the desk, the inbox, and archived.ToggleArchivedGroup/ToggleInboxGroupno longer have a key or click; they stay as documented test-fixture intents. Parity: new spec for click-selects/double-click opens-or-folds; the archived drawer spec now double-clicks.a_press_elsewhere_another_header_or_the_window_disarms_a_header_double_click(full board) anda_press_elsewhere_in_the_rail_preview_disarms_its_header_double_click(focused Rail preview) cover a press on a task row, a click on another header, and window expiry, through the app's mouse handler; the preview test fails with only the outer seat disarmed. The demo resets its header double-click on any non-header click, and the demo spec covers it (fails without the reset; its gestures now wait out the 350 ms window, since Playwright's back-to-back click and double-click were themselves forming a double-click).Draft replies (not posted; owner approves wording first)
#175: Board rows now show their thread and project: every task row carries a dim
#thread · projectlabel after its title, at any width, that leaves out whatever the view already says, andg/sgroup and sort the board by project or thread (withf/Shift+Fto fold groups). Thanks for the push on this.#158: We went with threads rather than multi-repo projects: a thread name can span repositories and the desk, so an initiative is one thread. The desk now has a filter (
t) with threads and projects tabs that combine, andggroups the desk by thread, so you can see one initiative across every repo at a glance.