RPCN - Pipelines listing page speed + UX improvements - #2593
Open
SpicyPete wants to merge 22 commits into
Open
Conversation
* Full-screen page mode for SQL and RPCN editors, console-owned layout - Footer pins to the viewport bottom on short pages (CSS flex chain in standalone, measured min-height in embedded) and keeps centering to the content column; bottom padding 8px -> 16px. - Topics and security-tab pages drop ListLayout's forced min-h-screen (min-h-0 override), removing large dead whitespace. - Embedded Console cancels the Cloud UI host gutters with measured negative margins and owns its page gutter (px-12) — deploy-order-safe with cloud-ui removing its p-10 later. - New expanded-page mode: data-page-expanded on <html> (utils/page-expanded) + useExpandedPageMode hook release every shell's horizontal constraints via global CSS while the page stays in document flow, footer below. The SQL studio's fixed-overlay fullscreen is replaced by this in-flow mode, and the RPCN pipeline editor gains the same toggle; both place the shared ExpandedPageToggle at the top-right of their work surface, clear of Save. - /sql becomes a normal route; new breadcrumbOnlyHeader staticData flag keeps the app header breadcrumb-only for pages with their own title bar. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * Comment reduction pass * some Pr feedback * Code review and cleanup passes * Small improvements from review * More changes from code review * More simplification --------- Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
# Conflicts: # frontend/src/components/layout/header.tsx # frontend/src/components/pages/rp-connect/pipeline/index.tsx
SpicyPete
requested review from
Mateoc,
datamali and
yougotashovel
and removed request for
a team
August 5, 2026 15:00
Contributor
🚨 Registry drift detectedApp:
Components needing attention
🎨 Off-token colours (palette literals)Use semantic tokens (
🔢 Ad-hoc utility classes (arbitrary values)These bypass the design tokens. Prefer a named scale entry or add a new token.
Generated by lookout audit-changes. |
Contributor
Author
|
@claude review |
This comment was marked as resolved.
This comment was marked as resolved.
Contributor
Author
|
@claude review |
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.
Rebuild the Redpanda Connect pipelines list for large clusters
The pipeline list was built for a handful of pipelines. On clusters with hundreds it was slow to
render, offered no way to narrow down what you were looking for, and buried broken pipelines
wherever the server happened to return them. This reworks the page around finding one pipeline in
a long list, and fixes the cost of getting that list in the first place.
How it ships
The page's only mount used to be
isFeatureFlagEnabled('enableRpcnTiles') && isEmbedded(), and#2591 removed that flag as dead code — the flag has been off in LaunchDarkly, so this list has
never actually rendered for a user. It now mounts on a capability instead:
Features.pipelinesApi— i.e. the backend servesredpanda.api.console.v1alpha1.PipelineService.Cloud gets the new list whether or not it's embedded, with no flag to flip.
endpoint_compatibility.go) andkeeps the legacy tabs, including the Redpanda Connect install intro.
probe itself, so waiting there would delay its own multi-page fetch behind an unrelated request —
and a failed
/console/endpointsleaves feature detection pending forever, so falling through tothe legacy path beats parking the page on a spinner that never resolves.
Kafka Connect stays reachable: the new page renders the same
TabKafkaConnectcomponent behind itsown Kafka Connect tab when a cluster is configured, and the
/connect-clusters/$clusterNameroutesare untouched.
List page
with their destination (starting counts as running, stopping as stopped). Counts come from the
status column's faceted row model, so each tab shows what selecting it would yield under the
current search and filters.
Clear filtersappearsonly when something is actually filtered — the status tabs are views, not filters, so they aren't
swept up by it — and it tracks the input directly rather than lagging 200ms behind the debounce.
transitions above healthy pipelines, idle at the bottom), so a broken pipeline lands on page 1 of a
large cluster instead of wherever the server put it.
DataTableuses: clicks on portaledcontent (open menus, the delete-confirm backdrop) and on interactive descendants don't navigate,
and neither does a click that ends a text selection — the pipeline ID is
select-all, so one clickgrabs the whole thing for copying. ⌘/Ctrl/Shift-click and middle-click are left to the browser, so
"open in a new tab" still means that.
redpanda ×2rather than repeating the same logoacross the column.
renders as soon as the first page has rows and streams the rest in behind the table, with a
distinct line for "still loading pages" vs "background refresh failed" — partial data and stale
data read differently now.
keepMounted— Base UIpanels unmount by default).
DataTableFilterstack from this page.Accessibility
panels), so without an
aria-controlstarget a screen reader announced "tab, 1 of 4" with nowhereto move into. Each tab now points at the table region, which is labelled by the active tab.
without user action, so each has an always-mounted
sr-onlylive region (polite for the drain,role="alert"for the failure) — the visible lines animate in and out, and a live region onlyannounces changes made while it's already in the DOM.
tab stop per row would just duplicate it.
Fetch and render cost
MAX_PAGE_SIZE(which is 25) — 20× fewer sequential round trips todrain. The server does the same work per call at any page size: it lists everything and slices.
the next page; when that pipeline is deleted mid-drain, a server resolving the token by exact match
restarts at page one and replays rows we already have.
repeat means the server sent us backwards. The first cut only caught an immediate
A → Arepeat,which a
A → B → Acycle walks straight past — the drain then alternates forever, adding a page tothe query cache every round. Now checked against every prior page param, with a test for each shape.
drain step and poll tick; it's now O(new rows), with a bounded cache that evicts its oldest half.
autoResetPageIndex: false, so streamingpages don't yank you back to page 1 or repaint a shifted window of rows. Filter and sort changes
still reset to page 1, and a shrinking row set is clamped before paint.
and flash on every poll; count the status tabs in a single pass; and memoize the per-row connector
aggregation so cells don't re-derive it on every keystroke.