Commit e1efea8
authored
feat(review): file comments in the diff + unified click-to-highlight comment UX (#973)
* feat(review): file comments in diff + unified click-to-highlight comment UX
Render file-scoped comments inline in the code review UI and overhaul the
comment-card UX for consistency.
File comments
- Single-file view: a full-text banner below the file path.
- All-files view: rendered in the file header (expanded files only) — Pierre's
virtualized custom header suppresses the body-prefix slot, and its measured
item heights make a taller header safe. Guided-review external annotations can
now drop the line-1 anchor hack.
Click-to-highlight
- Clicking a comment (inline card or sidebar) replays its stored line range as
the controlled selection highlight; clicking it again clears it.
- Scroll/navigate is sidebar- and findings-list-only (token-based signal) so
clicking a comment in the diff never moves the viewport.
Unified comment cards
- Shared CommentMeta identity row (badges + author + relative time) across the
inline, sidebar, and file-banner cards (were three hand-rolled headers).
- Shared FileNameChip (basename, full path on hover) replaces the literal
"file" badge everywhere.
- Force the app sans font on cards (inline was inheriting the diff's monospace),
consistent selected ring, spacing, and absolute hover actions so timestamps
align across surfaces.
Shared helpers: annotationScope (PR-scope / file-scope / line-range projection)
and fileName (basename). Plumbs createdAt through DiffAnnotationMetadata so the
inline cards can show timestamps.
* feat(review): unify comment action row (edit · copy · delete)
Shared CommentActions component used by the inline diff card, the file-comment
banner, and the sidebar — bottom-aligned, hover-revealed, order left→right
edit · copy · delete (delete/close furthest right).
- Inline + banner: actions moved from the top (where they overlapped the
timestamp) to the bottom, and gained the copy button.
- Sidebar: now uses the same component (copy + delete) — same icons, order, and
styling.
- Read-only (externally-sourced) file comments show copy only.
- Extract commentCopyText() so every card's copy produces identical,
self-describing text (location prefix + body + reasoning); drops the format
that was hand-built in the sidebar and the agent-job panel.
- Rename PRCommentsTab's local CommentActions -> PRCommentLinkActions to avoid
the name clash with the shared component.
- Remove the now-dead .review-comment-action(s) CSS and CommentMeta's trailing
slot.
* fix(review): address PR review findings
- all-files: let an active compose own the line highlight (pendingSelection
guard) so clicking/deselecting a comment mid-compose no longer clobbers the
toolbar's range — mirrors single-file's `pendingSelection ?? annotationRange`.
- clear scrollTargetAnnotation on inline select so a remount (Refresh / base
switch) doesn't re-scroll back to a stale sidebar/findings navigate target.
- inline diff cards: hide edit/delete for external (source-set) findings
(matches the file-comment card) and copy with the file:line location prefix
via a precomputed metadata.copyText (commentCopyText), unifying the copy text.
- add decorations + createdAt to the file-comment refresh signature so an
external PATCH changing only those repaints the all-files header.
- wrap finding reasoning text (overflow-wrap/word-break) so long file:line refs
no longer bleed past the card edge.
* refactor(review): dedupe line-annotation projection + close signature gaps
Self-review follow-ups to the PR-feedback fixes:
- Extract lineAnnotationMetadata() — the all-files and single-file diff surfaces
built the identical 14-field DiffAnnotationMetadata; now one source of truth.
- Add reviewProfileLabel + source + createdAt to the LINE-scope refresh
signature: the unified CommentMeta now renders those on inline cards too, so
an external PATCH changing only them must repaint the item (same gap that was
just fixed for the file-comment tuple).
- Wrap the agent-job panel's finding text + reasoning (overflow-wrap) so long
file:line refs don't bleed past the panel edge, matching the inline card fix.
* fix(review): zero inter-file gap + stop file-path descender clipping
- all-files: set CodeView layout gap to 0 (Pierre default was 8) so files sit
flush; sticky headers already mark file boundaries. Keep default edge padding.
- FileHeader: path text leading-none -> leading-normal so the overflow-hidden
ellipsis box has room for descenders (g/y/p were clipped by the box bottom).
* fix(review): address 2nd-pass review — header re-measure, delete, highlight
- all-files file comments: re-measure the CodeView item when a comment
expands/collapses/edits (FileCommentCard -> onHeightChange -> refreshItem) so
Pierre repositions following items instead of overlapping them. Fixes the
dynamic header-height bug; the remaining static sticky-offset drift is bounded
by the new banner cap and stays the accepted trade-off.
- cap the expanded comment body (max-h + overflow) so a long guided-review note
doesn't fill the viewport / inflate the sticky header.
- delete is now available on every surface (inline, banner) including external
source-set findings; edit stays gated on !source.
- restore the line highlight when a compose ends: the all-files pendingSelection
effect now re-derives the selected comment's range instead of clearing
(mirrors single-file's pendingSelection ?? annotationRange).
- add reasoning to the file-comment refresh signature (copyText includes it).
- guard handleNavigateToAnnotation with annotationMatchesPrScope so a stale
sidebar/finding row can't navigate to an out-of-scope annotation.
* refactor(review): share annotation→highlight derivation + smoother re-measure
Self-review follow-ups:
- Extract lineSelectionForAnnotation() — the compose-end restore and the
selection-replay effect built the same annotation→CodeViewLineSelection by
hand; share it so they can't diverge.
- Re-measure file-comment height via useLayoutEffect (before paint) instead of
useEffect, so an expand/collapse lands without a one-frame overlap.
* fix(review): ignore navigate to missing annotation + re-seed on scope switch
- handleNavigateToAnnotation: return early when the annotation id is gone
(deleted) as well as out-of-scope, so a stale row can't leave an orphan
selection (ring with nothing to scroll to). Dismissed agent-panel rows are
already non-clickable; this is the belt-and-suspenders for any other path.
- fileSetKey now includes prUrl/prDiffScope so a pure layer<->full-stack scope
switch (same file set) remounts and re-seeds annotations through the current
scope filter — the incremental sync bails on an unchanged annotations ref and
can't otherwise detect the filter change.
* fix(review): allow editing external/source findings inline again
Drop the editable = !source gate on inline and file-comment cards. main always
showed edit for external findings (it routes through updateExternalAnnotation),
so gating it was a regression. Edit, delete, and copy are now all available on
every comment surface regardless of source.
* refactor(review): drop redundant null-check after navigate guard
annotation is guaranteed non-null past the missing/out-of-scope early return.1 parent 3efd996 commit e1efea8
23 files changed
Lines changed: 757 additions & 231 deletions
File tree
- packages
- review-editor
- components
- dock
- panels
- utils
- ui
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
85 | 85 | | |
86 | 86 | | |
87 | 87 | | |
88 | | - | |
| 88 | + | |
| 89 | + | |
89 | 90 | | |
90 | 91 | | |
91 | 92 | | |
| |||
121 | 122 | | |
122 | 123 | | |
123 | 124 | | |
| 125 | + | |
| 126 | + | |
| 127 | + | |
| 128 | + | |
| 129 | + | |
124 | 130 | | |
125 | 131 | | |
126 | 132 | | |
| |||
1511 | 1517 | | |
1512 | 1518 | | |
1513 | 1519 | | |
| 1520 | + | |
| 1521 | + | |
| 1522 | + | |
1514 | 1523 | | |
| 1524 | + | |
| 1525 | + | |
| 1526 | + | |
| 1527 | + | |
| 1528 | + | |
| 1529 | + | |
| 1530 | + | |
| 1531 | + | |
| 1532 | + | |
| 1533 | + | |
| 1534 | + | |
1515 | 1535 | | |
1516 | 1536 | | |
1517 | 1537 | | |
1518 | 1538 | | |
1519 | | - | |
1520 | | - | |
1521 | 1539 | | |
1522 | | - | |
1523 | | - | |
| 1540 | + | |
| 1541 | + | |
| 1542 | + | |
| 1543 | + | |
1524 | 1544 | | |
1525 | 1545 | | |
1526 | | - | |
1527 | | - | |
1528 | | - | |
1529 | 1546 | | |
1530 | 1547 | | |
1531 | | - | |
1532 | | - | |
1533 | | - | |
| 1548 | + | |
1534 | 1549 | | |
1535 | | - | |
1536 | 1550 | | |
1537 | | - | |
| 1551 | + | |
| 1552 | + | |
1538 | 1553 | | |
1539 | 1554 | | |
1540 | 1555 | | |
| |||
1596 | 1611 | | |
1597 | 1612 | | |
1598 | 1613 | | |
| 1614 | + | |
1599 | 1615 | | |
1600 | 1616 | | |
1601 | 1617 | | |
| |||
1604 | 1620 | | |
1605 | 1621 | | |
1606 | 1622 | | |
| 1623 | + | |
1607 | 1624 | | |
1608 | 1625 | | |
1609 | 1626 | | |
| |||
1654 | 1671 | | |
1655 | 1672 | | |
1656 | 1673 | | |
1657 | | - | |
| 1674 | + | |
1658 | 1675 | | |
1659 | | - | |
| 1676 | + | |
1660 | 1677 | | |
1661 | 1678 | | |
1662 | 1679 | | |
| |||
2575 | 2592 | | |
2576 | 2593 | | |
2577 | 2594 | | |
| 2595 | + | |
2578 | 2596 | | |
2579 | 2597 | | |
2580 | 2598 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
3 | 3 | | |
4 | 4 | | |
5 | 5 | | |
| 6 | + | |
6 | 7 | | |
7 | 8 | | |
8 | 9 | | |
| |||
352 | 353 | | |
353 | 354 | | |
354 | 355 | | |
355 | | - | |
356 | | - | |
357 | | - | |
358 | | - | |
| 356 | + | |
| 357 | + | |
359 | 358 | | |
360 | 359 | | |
361 | 360 | | |
| |||
0 commit comments