Skip to content

[v3-4-test] Add Map Index search to dag breadcrumb (#74763) - #74893

Merged
vatsrahul1001 merged 1 commit into
apache:v3-4-testfrom
astronomer:backport-028a4da-v3-4-test
Oct 17, 2026
Merged

vatsrahul1001 merged 1 commit into
apache:v3-4-testfrom
astronomer:backport-028a4da-v3-4-test

Conversation

@bbovenzi

Copy link
Copy Markdown
Contributor

Backport of #74763 to v3-4-test.

The breadcrumb's iteration (loop pass) level does not exist on v3-4-test, so only the map index level is backported. The optional panel-width prop that level relies on comes from a later change to CrumbSwitcher on main and is carried along here, since a map index needs a narrower panel than a run id.


Was generative AI tooling used to co-author this PR?
  • Yes — Claude Code (Opus 5)

Generated-by: Claude Code (Opus 5) following the guidelines

🤖 Generated with Claude Code

* UI: Search Dag names anywhere, and switch map index from the breadcrumb

The Dag search only ever matched the start of a name, which is the wrong default
for anyone who names Dags by team or domain and remembers the end of the name
rather than its beginning. The Dags list already offers the choice, so the
breadcrumb now offers the same one, on its own key: turning it on here is not a
reason to change what that page does.

An expanded task's instances were the one level of the breadcrumb that named
where you were without letting you go anywhere else from it, even though a task
with hundreds of instances is exactly where moving between them by hand is worst.

* UI: Keep the map index level on an expanded task's summary

The level only appeared once an instance was picked, so the one page listing
every instance of a task was the one page with no way to jump to one. It now
stands on "all map indexes" there, the way the run level stands on "all runs".

* UI: Re-run a breadcrumb search when the match changes, not only the text

Turning match-anywhere on left the results from the prefix search on screen until
the text was edited, which read as the option doing nothing. react-select's async
mode only reloads from its own input handler, so nothing outside the text could
ask it for a new answer.

The caller now owns the input and what is listed for it, which is also what lets
a search in flight leave the previous answer up rather than emptying the panel,
and makes the "no results" case say so.

The panel width that was added here in passing is now upstream, so this uses that
instead.

* UI: Bound the map index search to the expansion set the page is in

A looped task is expanded once per iteration, so the same map indexes exist
several times over in a run. Listing them unscoped offered the user two rows
called "0" and two called "1", and picking one led to a path that could not say
which of them was meant.

A task's expansions share one region and a loop mints one per iteration, so the
region alone bounds the list to the instances the page is actually among —
pinning the index as well would narrow it to the single instance already on
screen. Each option carries its own coordinate so the link names an instance
rather than a map index.

* UI: Offer every map index once, and seat the match toggle in the input

The map index level had been bounded to one pass, which the iteration level
already decides; all this level owes the user is each index once, whichever pass
expanded it. The row kept for an index is the one from the pass on screen, so
moving between indexes stays where the user is rather than quietly moving them.

The match-anywhere control also sat as a loose button beside the text instead of
filling the end of the input, which is where the Dags list puts the same control.

* UI: Stop the map index level navigating, and offer the whole expansion in its panel

Clicking the level led to the page it was already on, and got there without the
region the url carries, so a looped task arrived unable to say which pass it
meant. Nothing was gained for it to cost that, so the naming half no longer
navigates.

Leaving the expansion was the one trip that click was good for, so the panel now
offers it: it keeps the pass and lets go only of the instance within it.
Backport notes: v3-4-test has no iteration level in the breadcrumb, so the loop
pass crumb is left out and only the map index level is backported. The panel
width prop the original relied on came from a later main-only change to
CrumbSwitcher and is carried along here, since the map index panel sizes itself
to a map index rather than a run id.

(cherry picked from commit 028a4da)

Co-Authored-By: Claude <noreply@anthropic.com>
@vatsrahul1001 vatsrahul1001 added this to the Airflow 3.4.0 milestone Oct 17, 2026
@vatsrahul1001
vatsrahul1001 merged commit a219bf5 into apache:v3-4-test Oct 17, 2026
90 checks passed
@vatsrahul1001
vatsrahul1001 deleted the backport-028a4da-v3-4-test branch October 17, 2026 13:22
vatsrahul1001 pushed a commit that referenced this pull request Oct 20, 2026
* UI: Search Dag names anywhere, and switch map index from the breadcrumb

The Dag search only ever matched the start of a name, which is the wrong default
for anyone who names Dags by team or domain and remembers the end of the name
rather than its beginning. The Dags list already offers the choice, so the
breadcrumb now offers the same one, on its own key: turning it on here is not a
reason to change what that page does.

An expanded task's instances were the one level of the breadcrumb that named
where you were without letting you go anywhere else from it, even though a task
with hundreds of instances is exactly where moving between them by hand is worst.

* UI: Keep the map index level on an expanded task's summary

The level only appeared once an instance was picked, so the one page listing
every instance of a task was the one page with no way to jump to one. It now
stands on "all map indexes" there, the way the run level stands on "all runs".

* UI: Re-run a breadcrumb search when the match changes, not only the text

Turning match-anywhere on left the results from the prefix search on screen until
the text was edited, which read as the option doing nothing. react-select's async
mode only reloads from its own input handler, so nothing outside the text could
ask it for a new answer.

The caller now owns the input and what is listed for it, which is also what lets
a search in flight leave the previous answer up rather than emptying the panel,
and makes the "no results" case say so.

The panel width that was added here in passing is now upstream, so this uses that
instead.

* UI: Bound the map index search to the expansion set the page is in

A looped task is expanded once per iteration, so the same map indexes exist
several times over in a run. Listing them unscoped offered the user two rows
called "0" and two called "1", and picking one led to a path that could not say
which of them was meant.

A task's expansions share one region and a loop mints one per iteration, so the
region alone bounds the list to the instances the page is actually among —
pinning the index as well would narrow it to the single instance already on
screen. Each option carries its own coordinate so the link names an instance
rather than a map index.

* UI: Offer every map index once, and seat the match toggle in the input

The map index level had been bounded to one pass, which the iteration level
already decides; all this level owes the user is each index once, whichever pass
expanded it. The row kept for an index is the one from the pass on screen, so
moving between indexes stays where the user is rather than quietly moving them.

The match-anywhere control also sat as a loose button beside the text instead of
filling the end of the input, which is where the Dags list puts the same control.

* UI: Stop the map index level navigating, and offer the whole expansion in its panel

Clicking the level led to the page it was already on, and got there without the
region the url carries, so a looped task arrived unable to say which pass it
meant. Nothing was gained for it to cost that, so the naming half no longer
navigates.

Leaving the expansion was the one trip that click was good for, so the panel now
offers it: it keeps the pass and lets go only of the instance within it.
Backport notes: v3-4-test has no iteration level in the breadcrumb, so the loop
pass crumb is left out and only the map index level is backported. The panel
width prop the original relied on came from a later main-only change to
CrumbSwitcher and is carried along here, since the map index panel sizes itself
to a map index rather than a run id.

(cherry picked from commit 028a4da)

Co-authored-by: Claude <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

area:translations area:UI Related to UI/UX. For Frontend Developers. translation:default

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants