Repository navigation
feat(web): page, filter, and restyle the SubmitQueue UI - #969
Merged
Merged
Conversation
behinddwalls
marked this pull request as ready for review
October 28, 2026 02:42
behinddwalls
force-pushed
the
ui-fixes
branch
from
October 28, 2026 02:43
e5df6d3 to
e18101f
Compare
mnoah1
approved these changes
Oct 28, 2026
behinddwalls
force-pushed
the
ui-fixes
branch
from
October 28, 2026 18:01
e18101f to
53e48bd
Compare
## Summary ### Why? Queue activity only showed the last 24 hours, so a quiet queue looked empty even when it had history; paging meant clicking through snapshot pages, and there was no way to see only requests in a given status or when each last changed. Queue names also sat at the root of the URL space, where a queue named `api` or `healthz` would collide with host routes, and the move to BaseUI (#888) had replaced SubmitQueue's original centered look with full-width defaults that read worse. ### What? - **Queue activity**: starts at the newest request however old and loads older pages automatically near the bottom (Load more button, retry on failure); loaded rows and scroll position survive request visits, and refreshes update statuses in place behind "Show latest requests". Stovepipe's infinite-scroll list moves to `web/platform` as `PagedRequests` / `RequestPagesProvider` and both modules use it. - **Status filter and Updated column**: a status multi-select restricts the list through the gateway's `statuses` filter, shareable as repeated `?status=` parameters; an Updated column and summary fact show `updated_at_ms`. - **URLs**: pages live under `/queue/<queue>`, `/queue/<queue>/request/<sqid>`, and `/queue/<queue>/change/…`. Continuations read `GET /api/queue/<queue>/requests?status=…&page=…`, a thin host route over the module's new `queueRequests` entry, which shares the queue page's authorization, filter canonicalization, and loader. - **Look**: header, page, and footer share a centered `min(1200px, 100% - 48px)` column with an 80px ruled header and dark SQ badge; links use the theme's `accent500` without underline until hover, change URIs are monospace, and secondary text is muted. The queue directory is a card grid. Request history is a two-column timeline with the time since the previous event. All styling uses BaseUI theme tokens and `withStyle`, so host themes still apply; Stovepipe is unchanged apart from the shared list. - Removed: the read-only labels, the displayed-page search box, and bullets in the Changes column. ## Test Plan ✅ `bazel test //web/platform/... //web/submitqueue/... //web/stovepipe/... //web/service/submitqueue:all //web/service/stovepipe:all //web/test/package/...` ✅ `bazel test //web/test/e2e/submitqueue:web_test` (status filter, JSON API authentication and filtering, layout, accessibility scans) ✅ Locally: `make local-submitqueue-start`, `make demo-requests COUNT=1000 WATCH=false`, then open the printed Web UX URL (user `test`), scroll `/queue/demo-queue`, and filter by status.
behinddwalls
force-pushed
the
ui-fixes
branch
from
October 28, 2026 18:04
53e48bd to
e249728
Compare
behinddwalls
enabled stacked auto-merge
October 28, 2026 18:05
Tmwakalasya
pushed a commit
to Tmwakalasya/submitqueue
that referenced
this pull request
Oct 29, 2026
## Summary ### Why? The web UI's queue activity needs to show when each request last changed and to narrow the list to statuses such as `landed`. `RequestSummary` carried no update time, and `List` could only page through every receipt, so a status view would have had to download unfiltered pages until it found enough matches. ### What? - `RequestSummary.updated_at_ms` exposes the stored time of the current status; it equals `received_at_ms` until the status first changes. - `ListRequest.statuses` restricts results to the given current statuses. The controller already reads each receipt's summary, so it skips non-matches and keeps reading until the page fills, the range ends, or 500 receipts have been read. The cursor resumes after the last receipt read, so a filtered page may be short or empty while `next_page_token` is set. - The page token carries the canonical (sorted, deduplicated) filter; a continuation that omits `statuses` takes the token's, and one that supplies a different set is invalid. Tokens without a filter decode as before, and unfiltered calls make the same single `pageSize+1` receipt read as today. - No new index: filtering stays a scan over the receipt key range plus get-by-key summary reads. ## Test Plan ✅ `bazel test //submitqueue/gateway/... //service/submitqueue/gateway/... //submitqueue/client/...` ✅ `bazel test //test/integration/submitqueue/gateway:go_default_test` (filtered paging and `updated_at_ms` over the wire against MySQL) ## Stack 1. @ uber#968 1. uber#969 🤖 Generated with [Claude Code](https://claude.com/claude-code)
DivyanshGarg380
pushed a commit
to DivyanshGarg380/submitqueue
that referenced
this pull request
Oct 31, 2026
## Summary ### Why? The header auto-refresh e2e tests install Playwright's fake clock at `now` and then call `pauseAt(now)`. The installed clock keeps running between the two calls, so when even a millisecond passes, `pauseAt` targets the past and throws `Cannot fast-forward to the past`. This failed the Stovepipe suite on uber#969 while the same test passed locally and on rerun. ### What? - The Stovepipe and SubmitQueue specs pause the clock one minute after the install time, so `pauseAt` always jumps forward. Auto-refresh is still off at that point and the Live indicator depends only on fetch failures, so the jump changes nothing the tests assert. ## Test Plan ✅ `bazel test //web/test/e2e/stovepipe:web_test //web/test/e2e/submitqueue:web_test --sandbox_writable_path=$HOME/.docker --local_test_jobs=1` 🤖 Generated with [Claude Code](https://claude.com/claude-code)
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.
Summary
Why?
Queue activity only showed the last 24 hours, so a quiet queue looked empty even when it had history; paging meant clicking through snapshot pages, and there was no way to see only requests in a given status or when each last changed. Queue names also sat at the root of the URL space, where a queue named
apiorhealthzwould collide with host routes, and the move to BaseUI (#888) had replaced SubmitQueue's original centered look with full-width defaults that read worse.What?
web/platformasPagedRequests/RequestPagesProviderand both modules use it.statusesfilter, shareable as repeated?status=parameters; an Updated column and summary fact showupdated_at_ms./queue/<queue>,/queue/<queue>/request/<sqid>, and/queue/<queue>/change/…. Continuations readGET /api/queue/<queue>/requests?status=…&page=…, a thin host route over the module's newqueueRequestsentry, which shares the queue page's authorization, filter canonicalization, and loader.min(1200px, 100% - 48px)column with an 80px ruled header and dark SQ badge; links use the theme'saccent500without underline until hover, change URIs are monospace, and secondary text is muted. The queue directory is a card grid. Request history is a two-column timeline with the time since the previous event. All styling uses BaseUI theme tokens andwithStyle, so host themes still apply; Stovepipe is unchanged apart from the shared list.Test Plan
✅
bazel test //web/platform/... //web/submitqueue/... //web/stovepipe/... //web/service/submitqueue:all //web/service/stovepipe:all //web/test/package/...✅
bazel test //web/test/e2e/submitqueue:web_test(status filter, JSON API authentication and filtering, layout, accessibility scans)✅ Locally:
make local-submitqueue-start,make demo-requests COUNT=1000 WATCH=false, then open the printed Web UX URL (usertest), scroll/queue/demo-queue, and filter by status.UI
Stack
🤖 Generated with Claude Code