Repository navigation
UI: Fix XCom list crash when a value request fails - #74131
Merged
Merged
Conversation
|
Congratulations on your first Pull Request and welcome to the Apache Airflow community! If you have any issues or are unsure about any anything please check our Contributors' Guide
|
Jonghyun-An
marked this pull request as ready for review
October 3, 2026 12:59
Jonghyun-An
requested review from
bbovenzi,
choo121600,
guan404ming,
pierrejeambrun,
ryanahamilton,
shubhamraj-git and
vatsrahul1001
as code owners
October 3, 2026 12:59
bbovenzi
reviewed
Oct 5, 2026
A failed XCom value request takes down the entire list, hiding entries whose values are still available. Those entries should remain readable and copyable when an individual value cannot be fetched.
Keep only the status code and alert-circle icon in each failed XCom cell. Use a shared ErrorModal for full XCom and Dag import errors. Reset the details state when an error clears so a later failed refetch does not reopen the modal automatically. Cover modal interactions, structured errors, network failures, and recovery in the UI tests.
Jonghyun-An
force-pushed
the
fix/xcom-entry-query-errors
branch
from
October 6, 2026 05:29
2b79ead to
08911f2
Compare
bbovenzi
approved these changes
Oct 6, 2026
|
Awesome work, congrats on your first merged pull request! You are invited to check our Issue Tracker for additional contributions. |
bbovenzi
added a commit
to astronomer/airflow
that referenced
this pull request
Oct 14, 2026
Dag, Dag-run and task-instance headers had accumulated full-width banners that stack on each other and repeat across pages. Draining and the pending review indicator each had two separate implementations, so the same concept rendered differently depending on which page you were on. The approach follows review feedback on apache#74131: keep the short status inline and put the detail behind the control that reports it. Each status now sits where it can be read without crowding what it qualifies -- the deactivation marker ahead of the breadcrumb, the backfill notice beside the Dag's name, the retry reason among the task instance's own facts. Reparse was previously hidden on a Dag that had failed to parse, which is the state where it is most useful. A plugin that fails to load no longer replaces the page with an error. Co-Authored-By: Claude <noreply@anthropic.com>
bbovenzi
added a commit
to astronomer/airflow
that referenced
this pull request
Oct 19, 2026
Dag, Dag-run and task-instance headers had accumulated full-width banners that stack on each other and repeat across pages. Draining and the pending review indicator each had two separate implementations, so the same concept rendered differently depending on which page you were on. The approach follows review feedback on apache#74131: keep the short status inline and put the detail behind the control that reports it. Each status now sits where it can be read without crowding what it qualifies -- the deactivation marker ahead of the breadcrumb, the backfill notice beside the Dag's name, the retry reason among the task instance's own facts. Reparse was previously hidden on a Dag that had failed to parse, which is the state where it is most useful. A plugin that fails to load no longer replaces the page with an error. Co-Authored-By: Claude <noreply@anthropic.com>
bbovenzi
added a commit
that referenced
this pull request
Oct 19, 2026
Dag, Dag-run and task-instance headers had accumulated full-width banners that stack on each other and repeat across pages. Draining and the pending review indicator each had two separate implementations, so the same concept rendered differently depending on which page you were on. The approach follows review feedback on #74131: keep the short status inline and put the detail behind the control that reports it. Each status now sits where it can be read without crowding what it qualifies -- the deactivation marker ahead of the breadcrumb, the backfill notice beside the Dag's name, the retry reason among the task instance's own facts. Reparse was previously hidden on a Dag that had failed to parse, which is the state where it is most useful. A plugin that fails to load no longer replaces the page with an error. Co-authored-by: Claude <noreply@anthropic.com>
github-actions Bot
pushed a commit
to aws-mwaa/upstream-to-airflow
that referenced
this pull request
Oct 19, 2026
…apache#74516) Dag, Dag-run and task-instance headers had accumulated full-width banners that stack on each other and repeat across pages. Draining and the pending review indicator each had two separate implementations, so the same concept rendered differently depending on which page you were on. The approach follows review feedback on apache#74131: keep the short status inline and put the detail behind the control that reports it. Each status now sits where it can be read without crowding what it qualifies -- the deactivation marker ahead of the breadcrumb, the backfill notice beside the Dag's name, the retry reason among the task instance's own facts. Reparse was previously hidden on a Dag that had failed to parse, which is the state where it is most useful. A plugin that fails to load no longer replaces the page with an error. (cherry picked from commit 7fbcfee) Co-authored-by: Brent Bovenzi <brent@astronomer.io> Co-authored-by: Claude <noreply@anthropic.com>
aws-airflow-bot
pushed a commit
to aws-mwaa/upstream-to-airflow
that referenced
this pull request
Oct 19, 2026
…apache#74516) Dag, Dag-run and task-instance headers had accumulated full-width banners that stack on each other and repeat across pages. Draining and the pending review indicator each had two separate implementations, so the same concept rendered differently depending on which page you were on. The approach follows review feedback on apache#74131: keep the short status inline and put the detail behind the control that reports it. Each status now sits where it can be read without crowding what it qualifies -- the deactivation marker ahead of the breadcrumb, the backfill notice beside the Dag's name, the retry reason among the task instance's own facts. Reparse was previously hidden on a Dag that had failed to parse, which is the state where it is most useful. A plugin that fails to load no longer replaces the page with an error. (cherry picked from commit 7fbcfee) Co-authored-by: Brent Bovenzi <brent@astronomer.io> Co-authored-by: Claude <noreply@anthropic.com>
bbovenzi
added a commit
that referenced
this pull request
Oct 19, 2026
…#74516) (#75125) Dag, Dag-run and task-instance headers had accumulated full-width banners that stack on each other and repeat across pages. Draining and the pending review indicator each had two separate implementations, so the same concept rendered differently depending on which page you were on. The approach follows review feedback on #74131: keep the short status inline and put the detail behind the control that reports it. Each status now sits where it can be read without crowding what it qualifies -- the deactivation marker ahead of the breadcrumb, the backfill notice beside the Dag's name, the retry reason among the task instance's own facts. Reparse was previously hidden on a Dag that had failed to parse, which is the state where it is most useful. A plugin that fails to load no longer replaces the page with an error. (cherry picked from commit 7fbcfee) Co-authored-by: Brent Bovenzi <brent@astronomer.io> Co-authored-by: Claude <noreply@anthropic.com>
vatsrahul1001
pushed a commit
that referenced
this pull request
Oct 20, 2026
…#74516) (#75125) Dag, Dag-run and task-instance headers had accumulated full-width banners that stack on each other and repeat across pages. Draining and the pending review indicator each had two separate implementations, so the same concept rendered differently depending on which page you were on. The approach follows review feedback on #74131: keep the short status inline and put the detail behind the control that reports it. Each status now sits where it can be read without crowding what it qualifies -- the deactivation marker ahead of the breadcrumb, the backfill notice beside the Dag's name, the retry reason among the task instance's own facts. Reparse was previously hidden on a Dag that had failed to parse, which is the state where it is most useful. A plugin that fails to load no longer replaces the page with an error. (cherry picked from commit 7fbcfee) Co-authored-by: Brent Bovenzi <brent@astronomer.io> Co-authored-by: Claude <noreply@anthropic.com>
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.
An XCom entry can disappear between loading the list and fetching its value. The value request then returns 404, but
XComEntrystill tries to formatundefinedand throwsCannot read properties of undefined (reading 'match'). This replaces the entire list with an error page.Handle the query error in the affected value cell so the other entries remain visible and can still be copied. The cell shows only the status code and alert-circle icon. Errors without an HTTP status show the translated Error label. Clicking it opens the full error in a shared
ErrorModalbased onDagImportErrorModal. Both XCom and Dag import errors use the same scrollable modal without custom height or width limits at the call site. Failed refetches also replace the stale value and its copy button with the error. Once a refetch succeeds, a later error stays closed until the user opens it.I tested this change with Node.js 24.21.0 and pnpm 10.28.1 after rebasing on 2026-10-06. I ran
corepack pnpm test --maxWorkers=4, which reported 1,609 passed across 182 test files with no unhandled errors. The default parallel run timed out insrc/queryClient.test.ts. I reproduced the same timeout on main without this change. I rancorepack pnpm lintandcorepack pnpm build. Both passed. Regular and manual prek checks passed on the six changed files.I checked the production-compiled UI in Chromium with mocked HTTP responses for 404, 403, 500, structured 422 details and a network error. The failed and healthy rows stayed at 57 pixels. I checked Enter and Space activation, Escape and close-button dismissal, and focus returning to the error button. A long error remained scrollable and within both a 1440-pixel desktop viewport and a 390-pixel mobile viewport. These browser checks use local HTTP mocks and do not exercise an Airflow backend.
Screenshots
Original error that replaced the XCom list
Shared error modal
Long error · Mobile view
Was generative AI tooling used to co-author this PR?
Generated-by: GPT-6.1-Sol, OpenAI Codex following the guidelines