Skip to content

Add source chain, destination chain and protocol filters to cross-chain tables - #3813

Merged
tom2drum merged 18 commits into
mainfrom
issue-3778
Oct 28, 2026
Merged

tom2drum merged 18 commits into
mainfrom
issue-3778

Conversation

@tom2drum

@tom2drum tom2drum commented Oct 23, 2026 •

Copy link
Copy Markdown
Collaborator

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_ids and bridge_ids on 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.

  • Chain filters are multi-select (shared ChainSelect with "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-derived bridge_ids scope filter for that request.
  • Filter state lives in the URL under the API param names via useApiPaginatedQuery (filterFields), so it survives reload, deep-links, and resets pagination on change.
  • With an active filter the list shows a non-sticky tags row (one closable tag per filter + "Reset all") above the table, and the active-filters empty state when there are no rows. The same FilterTagsRow replaces the advanced-filter page's inline "Filtered by:" row; the tag close icon is 14px inside its 20px click area for the filter tag variant.
  • The advanced-filter column-filter primitives are generalised into shared ColumnFilter / ColumnFilterContent.
  • Table layout changes asked by the designer: Message and Timestamp columns merged on both cross-chain tables, wider token cells on the token-transfers table.
  • New resource interchainIndexer:bridges (GET /api/v1/interchain/bridges) supplies bridge names for the protocol filter and tags.

Spec: .agents/tasks/3778-cross-chain-filters/spec.md

Environment variables

None

Minimum API version

interchain-indexer v1.11.0+ (the /interchain/bridges endpoint 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

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
@tom2drum tom2drum added the enhancement New feature or request label Oct 23, 2026
tom2drum and others added 9 commits October 23, 2026 18:42
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 tom2drum left a comment

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Blocked — 2 major open · 🙋 1 needs human

blocker 0 · major 2 · nit 5 · not anchorable 0

Axes: spec · standards · correctness · jev

— Reviewed by Cursor Grok 4.6

tom2drum and others added 6 commits October 26, 2026 13:10
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 tom2drum left a comment

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🛑 Blocked — 2 major open

blocker 0 · major 2 · nit 0 · not anchorable 0

Axes: spec · standards · correctness · jev

— Reviewed by Cursor Grok 4.6

tom2drum and others added 2 commits October 27, 2026 18:30
…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 tom2drum left a comment

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

✅ Cleared

blocker 0 · major 0 · nit 0 · not anchorable 0

Axes: spec · standards · correctness · jev

— Reviewed by Cursor Grok 4.6

@tom2drum
tom2drum merged commit 707a46e into main Oct 28, 2026
15 checks passed
@tom2drum
tom2drum deleted the issue-3778 branch October 28, 2026 18:09
@github-actions github-actions Bot added the pre-release Tasks in pre-release right now label Nov 4, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

enhancement New feature or request pre-release Tasks in pre-release right now

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Cross-chain views: add filters

1 participant