Skip to content

feat: Multi-view enhancements — Branches search+tags, Network date axis, PR CI+reviewers+filters#23

Merged
homeles merged 11 commits into
mainfrom
feat/multi-view-enhancements
Apr 15, 2026
Merged

feat: Multi-view enhancements — Branches search+tags, Network date axis, PR CI+reviewers+filters#23
homeles merged 11 commits into
mainfrom
feat/multi-view-enhancements

Conversation

@lupita-hom

Copy link
Copy Markdown
Collaborator

Summary

Three view enhancements in one PR (+969/-64 lines across 7 files).


1. Branches View — Search + Tags

  • Search bar at top filters branches/tags by name (client-side)
  • Tabs: 🌿 Branches / 🏷️ Tags — tags lazy-fetched on first click
  • Tag rows: tag name (monospace/blue), commit message, author avatar, date, abbreviated SHA
  • New endpoint: GET /api/repos/:owner/:repo/tags with GraphQL query supporting both annotated and lightweight tags

2. Network Graph — Date Axis

  • d3 time axis at bottom of the SVG, zooms/pans with the graph
  • d3.scaleTime mapping min/max commit dates to x-positions
  • Adaptive tick format: '%b %d' for ≤1 year, '%b %Y' for longer

3. Pull Requests — CI Status + Reviewers + Filters

  • CI status: ✅/❌/⏳/⚪ per PR with hover tooltip showing all check names, states, and links
  • Reviewer avatars: 22px with colored status rings — green (APPROVED), red (CHANGES_REQUESTED), yellow (COMMENTED), gray (pending)
  • Author filter dropdown: populated from unique PR authors
  • Reviewer filter dropdown: populated from unique reviewers + requested reviewers
  • Sort dropdown: replaces button row to save toolbar space
  • GraphQL query expanded: commits(last:1).statusCheckRollup, reviews(first:20), reviewRequests(first:10)

TypeScript

Both client and server pass tsc -b cleanly (noUnusedLocals: true).

Branches View:
- Search bar to filter by branch/tag name
- Tabs: Branches / Tags with lazy-loaded tag details
- New server endpoint GET /api/repos/:owner/:repo/tags
- Tags show name, commit message, author, date, SHA

Network Graph View:
- Date axis on x-axis (bottom), zooms/pans with graph
- Adaptive tick format based on date span

Pull Requests View:
- CI/CD status icons (✅/❌/⏳/⚪) with hover tooltip showing all checks
- Reviewer avatars with status rings (green/red/yellow/gray)
- Author and Reviewer filter dropdowns
- Sort moved to dropdown to save toolbar space
- GraphQL query updated with statusCheckRollup, reviews, reviewRequests
The network graph uses evenly-spaced x-positions (not proportional to
time), but the date axis was using d3.scaleTime which assumes linear
time-to-position mapping. This caused:
- Dates misaligned with commit nodes (e.g. Nov commit shown at Oct)
- Labels overlapping when commits are clustered

Fix: sample actual commit positions and label them with their dates.
Ticks are placed at real commit x-coordinates, not interpolated time
positions. Labels are spaced at least 60px apart to prevent overlap.
The tooltip was opening upward (bottom: calc(100% + 6px)) which caused
it to get clipped by the scroll container on the first PR row. Changed
to open downward (top: calc(100% + 6px)) so it stays within the
scrollable content area.
- New 'All' tab shows Open + Closed + Merged PRs together
- Tab order: All | Open | Closed | Merged (Open still default)
- Server handles state=ALL by passing all three states to GraphQL
- Empty state message adapts for All tab
Small GitHub octocat SVG icon appears after the repo dropdown when a
repo is selected. Links to github.com/{owner}/{repo} in a new tab.
Hover: turns white with subtle blue background. Tooltip on hover.
The date picker was filtering PRs by createdAt, showing '12 of 50 shown'
which was confusing. PRs have their own filtering (state tabs + author +
reviewer) and the date range doesn't apply meaningfully.

Removed: useDateRange hook, DateRangePicker component, date-based
filtering from the PR filter logic. The 'N of M shown' badge now only
appears when author or reviewer filters are active.
- Reverted removal of date picker from PRs
- Badge now says 'Showing 12 of 50 PRs' (clearer wording)
- Badge only appears when filteredCount < totalCount (hidden when
  all PRs match, avoiding confusing '50 of 50 shown')
- Date picker filters PRs by createdAt as intended
The GraphQL query was limited to 'first: 50' with no pagination, so
repos with 100+ PRs were cut off. Now:
- Bumped page size to 100
- Added cursor-based pagination loop to fetch ALL PRs
- Added pageInfo { hasNextPage, endCursor } to the query
Removed 'Load more commits' and 'Load more branches' buttons from both
Commit Graph and Network Graph views. The date range picker now controls
how much data is loaded — everything within the selected range is
fetched automatically.

Changes:
- GraphPage: autoFetchAll=true, removed load-more button, shows loading indicator
- NetworkPage: autoFetchAll=true, auto-loads remaining branches after main commits,
  removed both load-more buttons, shows loading indicator
- Both views show a subtle 'Loading… N commits' indicator while fetching
Date range presets now: 1 week | 2 weeks | 1 month | 3 months | 6 months | 1 year | All time | Custom
Default changed from 'Last month' to 'Last week' for faster initial loads.
@homeles homeles merged commit 7daf50f into main Apr 15, 2026
1 check passed
@homeles homeles deleted the feat/multi-view-enhancements branch April 16, 2026 18:53
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants