Skip to content

Add Map Index search to dag breadcrumb - #74763

Merged
bbovenzi merged 6 commits into
apache:mainfrom
astronomer:breadcrumb-search-options
Oct 16, 2026
Merged

bbovenzi merged 6 commits into
apache:mainfrom
astronomer:breadcrumb-search-options

Conversation

@bbovenzi

Copy link
Copy Markdown
Contributor

Add a dropdown to search and select for a rendered map index from the breadcrumb.

Screenshot 2026-10-14 at 10 56 04 AM
Was generative AI tooling used to co-author this PR?
  • Yes (please specify the tool below)
    Claude Opus 5

  • Read the Pull Request Guidelines for more information. Note: commit author/co-author name and email in commits become permanently public when merged.
  • For fundamental code changes, an Airflow Improvement Proposal (AIP) is needed.
  • When adding dependency, check compliance with the ASF 3rd Party License Policy.
  • For significant user-facing changes create newsfragment: {pr_number}.significant.rst, in airflow-core/newsfragments. You can add this file in a follow-up commit after the PR is created so you know the PR number.

@yuseok89 yuseok89 left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Thanks! I left one question about the search toggle inline.

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.
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".
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.
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.
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.
…n 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.
@bbovenzi
bbovenzi force-pushed the breadcrumb-search-options branch from 443fbbd to 1e81f62 Compare October 16, 2026 13:50
@bbovenzi
bbovenzi merged commit 028a4da into apache:main Oct 16, 2026
91 checks passed
@bbovenzi
bbovenzi deleted the breadcrumb-search-options branch October 16, 2026 14:51
@github-actions

Copy link
Copy Markdown
Contributor

Backport failed to create: v3-4-test. View the failure log Run details

Note: As of Merging PRs targeted for Airflow 3.X
the committer who merges the PR is responsible for backporting the PRs that are bug fixes (generally speaking) to the maintenance branches.

In matter of doubt please ask in #release-management Slack channel.

Status Branch Result
❌ v3-4-test Commit Link

You can attempt to backport this manually by running:

cherry_picker 028a4da v3-4-test

This should apply the commit to the v3-4-test branch and leave the commit in conflict state marking
the files that need manual conflict resolution.

After you have resolved the conflicts, you can continue the backport process by running:

cherry_picker --continue

If you don't have cherry-picker installed, see the installation guide.

vatsrahul1001 pushed a commit that referenced this pull request Oct 17, 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>
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>
SameerMesiah97 pushed a commit to SameerMesiah97/airflow-oss-sm97 that referenced this pull request Oct 27, 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.
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. backport-to-v3-4-test Backport to v3-4-test translation:default

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants