Repository navigation
Add source chain, destination chain and protocol filters to cross-chain tables - #3813
Merged
Merged
Conversation
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Five tickets: table column merge, column-filter primitives refactor plus the shared active-filter tags row, filter params and the bridges resource, then filters on the token-transfers and transactions surfaces. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
…ain tables Both the cross-chain token-transfers and transactions tables now show the message id with its time on a second line under one "Message" column, with the time-format toggle in that header. Token cells grow to 200px, the bridge name truncates inside a capped Protocol cell, and column widths are retuned to the mockup. Playwright baselines regenerated. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
…shared filter tags row Rename TableColumnFilterWrapper to ColumnFilter (explicit contentProps instead of className/chakra factory) and TableColumnFilter to ColumnFilterContent, which now owns the popover column layout; update every advanced-filter and zeta-chain consumer. Add FilterTagsRow in src/shared/filters: closable filter tags followed by a "Reset all" link, with optional leading and placeholder tags. The advanced-filter page uses it in place of its inline "Filtered by:" / "Reset filters" markup. Address filter tags are middle-truncated and long tags end-truncate within the row. The filter tag variant's close icon is sized through a --close-button-icon-size variable the close button reads, since recipe slot styles sit in @layer recipes and lose to the icon button's unlayered style props. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
…the bridges resource The interchain list resources (messages, transfers and their byAddress / byTx variants) now declare src_chain_ids, dst_chain_ids and bridge_ids as filter fields, so a deep link carries them to the request and useApiPaginatedQuery types them on every list surface. A user-supplied bridge_ids replaces the env-derived scope value; without one the env list is sent as before. Adds the interchainIndexer:bridges resource typed by GetBridgesResponse with a mock sampled from the gnosis instance. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
…ain token-transfers tables Source tx, Dest tx and Protocol headers get a ColumnFilter trigger when the table receives filters. The chain popover is the shared ChainSelect in multi mode with "All chains"; the protocol popover is a checkbox group over the bridges that are enabled on the indexer and configured for the deployment. Selections go through useApiPaginatedQuery's onFilterChange as comma-joined src_chain_ids / dst_chain_ids / bridge_ids, so they live in the URL and reset pagination. Every token-transfers surface (index, address tabs, tx cross-chain tab) renders the shared active-filter tags row above the action bar and the active-filters empty state. The tx page keeps its cross-chain tab when a filter yields no rows. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
The developer confirmed there is no separate mobile mockup; the filters, tags row and empty state behave the same on mobile, with the tags row above the pagination action bar. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
…ain transactions tables Source tx, Dest tx and Protocol headers of the cross-chain transactions table render the same ColumnFilter triggers as the token-transfers table when the table receives filters, reusing the cross-chain filter components unchanged. The transactions index page and the address Cross-chain txns tab (single-chain and multichain) read filter state from useApiPaginatedQuery and write it back through onFilterChange, so it lives in the URL and resets pagination. Every filtered surface renders the shared active-filter tags row above the action bar and the active-filters empty state. On mobile the address tabs pass the pagination action bar through the content's actionBar slot so the tags row sits above it. The home-page latest list passes no filters and keeps plain headers. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
tom2drum
marked this pull request as ready for review
October 26, 2026 11:11
tom2drum
commented
Oct 26, 2026
tom2drum
left a comment
Collaborator
Author
There was a problem hiding this comment.
blocker 0 · major 2 · nit 5 · not anchorable 0
Axes: spec · standards · correctness · jev
— Reviewed by Cursor Grok 4.6
The popover unmounted its body on close, so a selection the user had not yet applied was lost on reopen. The cross-chain column filters now keep the body mounted; the body is keyed on the applied value, so clearing a filter from its tag or "Reset all" still resets the draft. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Per the updated mockup the Source/Destination tx popovers list chains as checkboxes (logo + name) with no "All" entry; an empty selection means no filter. A search field by chain name or ID appears only with 10 or more chains. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Memoise the advanced-filter tags, drop the module-internal exports from the cross-chain filter utils, and delete the unused bridges list mock. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
tom2drum
commented
Oct 27, 2026
tom2drum
left a comment
Collaborator
Author
There was a problem hiding this comment.
🛑 Blocked — 2 major open
blocker 0 · major 2 · nit 0 · not anchorable 0
Axes: spec · standards · correctness · jev
— Reviewed by Cursor Grok 4.6
…the tx-page pagination below them on mobile Each tag now skeletons until its own directory (chains or bridges) resolves instead of hiding the whole row, so the reset affordance is present whenever a filter is active. The transaction token-transfers page passes a pagination action bar into the cross-chain tab on mobile, the same way the address page does. Popover loading states use a spinner instead of a skeleton. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Both popovers already have a Reset control that clears the selection, so the "All" checkbox duplicated it. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
tom2drum
commented
Oct 27, 2026
tom2drum
left a comment
Collaborator
Author
There was a problem hiding this comment.
✅ Cleared
blocker 0 · major 0 · nit 0 · not anchorable 0
Axes: spec · standards · correctness · jev
— Reviewed by Cursor Grok 4.6
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.
Description
Resolves #3778
The cross-chain transactions and token-transfers tables list every message the deployment's bridges carry, with no way to narrow them, although the interchain indexer already accepts
src_chain_ids,dst_chain_idsandbridge_idson every list endpoint. This PR adds column filters for Source tx (source chain), Dest tx (destination chain) and Protocol (bridge) to both tables, on every surface that renders them against a list endpoint: the transactions and token-transfers index pages, the cross-chain tabs on address pages (single-chain and multichain) and the cross-chain token-transfers tab on transaction details. The home-page latest lists stay filter-less.ChainSelectwith "All chains"); the protocol filter is a checkbox group over the bridges that are enabled on the indexer and configured for the deployment, so a user can never widen the deployment's scope. A user protocol selection replaces the env-derivedbridge_idsscope filter for that request.useApiPaginatedQuery(filterFields), so it survives reload, deep-links, and resets pagination on change.FilterTagsRowreplaces the advanced-filter page's inline "Filtered by:" row; the tag close icon is 14px inside its 20px click area for thefiltertag variant.ColumnFilter/ColumnFilterContent.interchainIndexer:bridges(GET /api/v1/interchain/bridges) supplies bridge names for the protocol filter and tags.Spec:
.agents/tasks/3778-cross-chain-filters/spec.mdEnvironment variables
None
Minimum API version
interchain-indexerv1.11.0+ (the/interchain/bridgesendpoint and the chain/bridge filter params).Breaking or incompatible changes
None
Additional information
Mockup: token-transfers table and filter popovers, empty state with tags row. Agreed deviations: no tx-hash input in the chain popovers, protocol popover is a checkbox group, chain selector is multi-select. The transactions table has no mockup and mirrors the token-transfers one.
🤖 Generated with Claude Code