Dashboard: 5-per-page pagination for Runner health + Recent pipelines; frontend-only CI - #34
Conversation
…me; frontend-only CI Both dashboard panels now step through their rows with a compact Prev/Next pager (new PagerControls, same secondary-button + steel-caption language) instead of growing unboundedly: Runner health slices the roster client-side, Recent pipelines pages over the flattened keyset list and fetches the next keyset page on demand when the reader steps past what's loaded. Page indexes clamp when live updates shrink the lists. ci.yml drops the rust matrix and the GHCR runner-image job - CI is now the frontend gate only; Rust stays verified locally (cargo check / clippy -D warnings / test per crate) and the runner image is published manually per the existing runbook. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
✅ Deploy Preview for overup-app ready!
To edit notification comments on pull requests, go to your Netlify project configuration. |
|
The latest updates on your projects. Learn more about Vercel for GitHub.
|
|
Caution Review failedThe pull request is closed. ℹ️ Recent review info⚙️ Run configurationConfiguration used: defaults Review profile: CHILL Plan: Free Run ID: 📒 Files selected for processing (4)
📝 WalkthroughWalkthroughDashboard runner and pipeline lists now use explicit pagination controls. The CI workflow is reduced to the frontend pipeline, removes Rust and runner-image jobs, and no longer overrides the frontend build’s ChangesDashboard pagination
CI workflow scope
Estimated code review effort: 3 (Moderate) | ~25 minutes Sequence Diagram(s)sequenceDiagram
participant User
participant PagerControls
participant DashboardPage
participant PipelineQuery
participant PipelinesTable
User->>PagerControls: Select Next
PagerControls->>DashboardPage: Call onNext
DashboardPage->>PipelineQuery: Fetch more when needed
PipelineQuery-->>DashboardPage: Return loaded pipelines
DashboardPage->>PipelinesTable: Render visible page
Note 🎁 Summarized by CodeRabbit FreeYour organization is on the Free plan. CodeRabbit will generate a high-level summary and a walkthrough for each pull request. For a comprehensive line-by-line review, please upgrade your subscription to CodeRabbit Pro by visiting https://app.coderabbit.ai/login. Comment |
There was a problem hiding this comment.
Review Summary
This PR successfully implements 5-per-page pagination for dashboard panels and simplifies the CI workflow to frontend-only checks. The implementation is mostly solid, but there's one critical logic error that must be fixed before merge.
Critical Issues (1)
- Stale closure in
nextPipelinePage: ThepipelineStartvariable captured in the async callback can become outdated, causing incorrect page advancement logic
Overall Assessment
Once the closure bug is fixed, this change improves UX by replacing infinite scroll with predictable pagination and reduces CI complexity by removing unused Rust jobs. The pagination clamping logic correctly handles edge cases like list shrinkage during live updates.
You can now have the agent implement changes and create commits directly on your pull request's source branch. Simply comment with /q followed by your request in natural language to ask the agent to make changes.
| void fetchNextPipelines().then((result) => { | ||
| const loaded = (result.data?.pages ?? []).reduce( | ||
| (count, page) => count + page.pipelines.length, | ||
| 0, | ||
| ); | ||
| if (pipelineStart + PIPELINES_PAGE_SIZE < loaded) { | ||
| setPipelinePage((current) => current + 1); | ||
| } |
There was a problem hiding this comment.
🛑 Logic Error: pipelineStart is captured in the closure but may be stale when the promise resolves. If the user changes pages during the fetch, the comparison uses an outdated value, potentially advancing to the wrong page.
| void fetchNextPipelines().then((result) => { | |
| const loaded = (result.data?.pages ?? []).reduce( | |
| (count, page) => count + page.pipelines.length, | |
| 0, | |
| ); | |
| if (pipelineStart + PIPELINES_PAGE_SIZE < loaded) { | |
| setPipelinePage((current) => current + 1); | |
| } | |
| void fetchNextPipelines().then((result) => { | |
| const loaded = (result.data?.pages ?? []).reduce( | |
| (count, page) => count + page.pipelines.length, | |
| 0, | |
| ); | |
| const currentStart = pipelinePage * PIPELINES_PAGE_SIZE; | |
| if (currentStart + PIPELINES_PAGE_SIZE < loaded) { | |
| setPipelinePage((current) => current + 1); | |
| } | |
| }); |
Dashboard pagination
Both dashboard panels now page their rows five at a time with a compact Prev/Next pager (new
PagerControlscomponent — same secondary-button and steel-caption language as the rest of the shell), replacing unbounded growth:1–5 of Nand hides entirely when the fleet fits on one page.CI: frontend-only
.github/workflows/ci.ymldrops therustmatrix job and the GHCRrunner-imagepublish job — the workflow is now just the frontend gate (typecheck · test · build). Rust remains verified locally (cargo check/clippy -D warnings/cargo testper crate), and the runner image is published manually perdocs/fix-empty-workspace-stale-runner.md.Verification
npx tsc --noEmit— cleannpm run build— compiles successfully🤖 Generated with Claude Code
Summary by CodeRabbit
New Features
Chores