Repository navigation
feat: lead pull request and issue pages with a status box, like security alerts - #744
Conversation
…ity alerts The detail pane now reads like a security alert's page. Its header holds the crumbs with an "N of M" stepper (previous, next, open in the browser, close), colored tags for state, priority and branches, and a title that wraps instead of truncating. A status box leads the item's first page (the conversation for a pull request, the description for an issue): one row each for the checks (naming the failing ones), the review decision, the merge state, any blockers, and the newest agent run, with Dispatch, Review, Open agent and Merge in its footer. Merge lists its methods inline under the button instead of in a menu pinned to the old header's geometry. The overview's facts fold into one line above the description. The security page's tag moves to the shared Look so both pages draw it the same way.
… issues An open alert or report took everything but a fixed 320 px list, so its page was much wider than an issue's. The list now keeps the room and the page sits in a 520 px pane whose left edge drags to resize it, or shut, exactly as the Pull requests and Issues sections do. Folding the list away still gives the page the whole section. The pane's width bounds, handle, and drag arithmetic move out of the orchestrator view into a shared `pane` module both sections use.
The same repository checked out on two hosts listed each of its GitHub issues and pull requests twice, and selecting one lit both rows: the selection, the open item, and the repository a page and its actions go to were all looked up by item key, which the copies share. The merged list now keeps one row per item, where its first copy came, as the copy with an agent run when only another has one. Its Project cell says how many hosts list it, and the backend pills count it once. A row's page, Start agent, and dispatch now go to the checkout that row shows rather than the first one holding the key; the dispatch dialog's host tiles still offer every connected host to send the agent to.
…s open The accent lit both the open row and a row the arrow keys moved to, so the last row clicked still looked open after its page closed. The selected row without a page now wears the hover tint, keeping the selection visible without claiming a page.
|
|
[Medium impact] The changes affect item lists and detail pages across the Issues, Pull requests, and Security sections. The PR appears safe to merge, with non-blocking fixes for checkout consistency, child arrows, pane sizing, and skipped-check text. Findings
SummaryAdds status boxes and list navigation to issue and pull request pages, combines duplicate rows across checkouts, and gives security pages a resizable pane. Non-blocking fixes:
Review used source inspection. No tests or native-window captures were run. Diagram%%{init: {'theme': 'neutral'}}%%
flowchart LR
A[Checkout snapshots] --> B[Build and sort rows]
B --> C[Keep one row per item]
C --> D[Choose shown checkout]
D --> E[Status and actions]
A --> F[First matching item]
F --> G[Page text and branch name]
Reviews (1) · Last reviewed commit: "fix: tint a pull request or issue row wi..." · Reviewed by Greptile |
| pub(super) fn repo_of(&self, key: &str) -> Option<usize> { | ||
| self.repos.iter().position(|repo| repo.item(key).is_some()) | ||
| self.lines | ||
| .iter() | ||
| .find_map(|line| match line { | ||
| rows::Line::Row(row) if self.row_item(row).key.canonical() == key => Some(row.repo), | ||
| _ => None, |
There was a problem hiding this comment.
repo_of now selects the checkout shown by the row, but item() still returns the first checkout's copy. If the two hosts have different snapshots and the second host supplies the kept row, its page shows the first host's title, description, and branches. The dispatch dialog also names its branch from that first copy while sending the second copy's prompt. Resolve the item from the chosen checkout too.
| match at.get(&key) { | ||
| Some(&index) => { | ||
| let first = &mut kept[index]; | ||
| if first.run.is_none() && row.run.is_some() { | ||
| // The tree shape stays the first copy's: its children | ||
| // follow it. | ||
| *first = ItemRow { | ||
| depth: first.depth, | ||
| children: first.children, | ||
| ..row |
There was a problem hiding this comment.
Children lack a collapse arrow
dedupe keeps the first parent's children value even when later copies contribute child rows. If one host lists parent P without children and another lists P with child C, the result can show C under P while P.children remains None. Users then have no arrow to collapse that child. Rebuild the child markers after combining the copies, and test copies with different trees.
| .debug_selector(|| "security-pane".into()) | ||
| .flex_none() | ||
| .w(px(self.security.pane_width)) |
There was a problem hiding this comment.
The security pane uses its saved width without checking the current window width. A user can widen it to 1,000 px in a large window, then shrink the window to its supported 640 px minimum. The pane stays 1,000 px wide because Resize::of applies its limit only during a handle drag. The list loses its space and part of the page extends outside the window. Limit the rendered width to the available space while keeping the saved width as the user's preference.
| Some(Outcome::Skipped) | None => Row { | ||
| icon: "icons/pass.svg", | ||
| hue: muted, | ||
| title: "No checks reported".into(), | ||
| detail: None, |
There was a problem hiding this comment.
When every reported check is skipped, checks_outcome() returns None, so this row says "No checks reported" and drops the details. The checks do exist; pr.checks() already describes them as skipped. Distinguish an empty check list from an all-skipped list and show that summary.
Stacked on #736 (single-click open, list-switch reset, Windows native probe fix); review the commits after it.
Summary
orchestrator::panemodule both sections use.QA
cargo test -p herdr-gpui --locked orchestrator— 144 passed, includingtests/status.rs(status box under the title, Next steps and stops at the end, failing checks / review / merge rows from the fixture) andtests/twins.rs(dedupe keeps the copy with a run; two hosts' copies are one row; page goes to the shown checkout)cargo test -p herdr-gpui --locked security::— 59 passed, includingpane_resize.rs(520 px default, list fills the rest, dragging widens by the drag, dragging shut closes)just ci— passed locally (macOS arm64)No screenshots yet: capturing the real window needs input on a shared display. Native visual check pending.