Skip to content

Clean up Dag Version Tab UX - #75244

Merged
bbovenzi merged 2 commits into
apache:mainfrom
astronomer:dev/dag-version-compare-tab-05e063
Oct 21, 2026
Merged

bbovenzi merged 2 commits into
apache:mainfrom
astronomer:dev/dag-version-compare-tab-05e063

Conversation

@bbovenzi

@bbovenzi bbovenzi commented Oct 20, 2026 •

Copy link
Copy Markdown
Contributor
  • Fix horizontal scrolling
  • Reduce vertical padding that shifts the table down the page
  • Use our RenderedJson component for Before/After
  • Change RenderedJson to only show copy button on hover
  • Remove "-" for empty data
  • Prevent Code component background from clashing with the table row backgrounds
  • Moved components to their own files

Before:
1-before-main
Screenshot 2026-10-20 at 2 09 52 PM

After:
Screenshot 2026-10-20 at 2 35 53 PM
Screenshot 2026-10-20 at 2 37 49 PM


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.

jedcunningham and others added 2 commits October 20, 2026 14:28
The Versions tab compares two Dag versions in a table whose path,
before and after cells show serialized values of up to 120 characters.
These are mostly JSON or long paths with no spaces, so the browser
could not wrap them. The table grew far wider than its container
(2146px in a 1100px window), and since DataTable has no horizontal
scroll, the rightmost After column was clipped out of view. Narrower
windows made it worse.

Let those cells wrap with overflow-wrap: anywhere and
white-space: pre-wrap. overflow-wrap: break-word is not enough: it
does not lower the cell's min-content width, so the table would still
overflow. The trade-off is that short paths can break mid-word in
narrow windows.
A change to a Dag version carries the serialized value on each side, and
a whole task added or removed carries its entire payload. Flattened into
a cell and cut at 120 characters, those values said little more than
that something had changed; as a JSON preview they name the keys that
differ and open in place when the rest matters.

The cells were also set as code, whose surface sits on the table's own
striped rows at nearly the same shade, and a path was free to break
after any character, so a column squeezed by its neighbours read
vertically, one glyph per line. A side the change does not have now
leaves its cell empty, since a dash reads as a value the version holds.

Carrying a preview on each side of a comparison asks two things of the
rendered JSON field that its other callers never did. It sized itself
for one payload per row, where one long entry — a dotted class path, a
URL — could widen its column past the pane whatever bound it was given,
since a badge sets its value on one line. And its copy button, shown
outright, competes with the values for attention on every row it
appears in; waiting for the pointer, or for focus so a keyboard can
still reach it, keeps a list to its content. Both now hold wherever a
JSON field is rendered.

What the comparison says about itself was spread over three stacked
rows above the table, and the warning that a bound had cut it short sat
nowhere near the field that sets that bound — the one control that can
lift it. The summary now heads the table's own header row, beside the
columns menu, and the bound carries its own notice.

The tab's components were sharing two files, which left the table, its
cells and the page's query in the same place as whichever one was being
read.

Co-Authored-By: Claude <noreply@anthropic.com>
@boring-cyborg boring-cyborg Bot added the area:UI Related to UI/UX. For Frontend Developers. label Oct 20, 2026

@ephraimbuddy ephraimbuddy 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.

Approving based on the screens

@eladkal eladkal added this to the Airflow 3.4.0 milestone Oct 21, 2026
@eladkal eladkal added type:misc/internal Changelog: Misc changes that should appear in change log backport-to-v3-4-test Backport to v3-4-test labels Oct 21, 2026
@bbovenzi
bbovenzi merged commit 5c021ce into apache:main Oct 21, 2026
77 of 78 checks passed
@bbovenzi
bbovenzi deleted the dev/dag-version-compare-tab-05e063 branch October 21, 2026 13:11
@github-actions

Copy link
Copy Markdown
Contributor

Backport successfully created: v3-4-test

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 PR Link

vatsrahul1001 pushed a commit that referenced this pull request Oct 22, 2026
* Wrap long values in Dag version diff table so After stays visible

The Versions tab compares two Dag versions in a table whose path,
before and after cells show serialized values of up to 120 characters.
These are mostly JSON or long paths with no spaces, so the browser
could not wrap them. The table grew far wider than its container
(2146px in a 1100px window), and since DataTable has no horizontal
scroll, the rightmost After column was clipped out of view. Narrower
windows made it worse.

Let those cells wrap with overflow-wrap: anywhere and
white-space: pre-wrap. overflow-wrap: break-word is not enough: it
does not lower the cell's min-content width, so the table would still
overflow. The trade-off is that short paths can break mid-word in
narrow windows.

* UI: Read a Dag version diff's values as JSON, not as a cut string

A change to a Dag version carries the serialized value on each side, and
a whole task added or removed carries its entire payload. Flattened into
a cell and cut at 120 characters, those values said little more than
that something had changed; as a JSON preview they name the keys that
differ and open in place when the rest matters.

The cells were also set as code, whose surface sits on the table's own
striped rows at nearly the same shade, and a path was free to break
after any character, so a column squeezed by its neighbours read
vertically, one glyph per line. A side the change does not have now
leaves its cell empty, since a dash reads as a value the version holds.

Carrying a preview on each side of a comparison asks two things of the
rendered JSON field that its other callers never did. It sized itself
for one payload per row, where one long entry — a dotted class path, a
URL — could widen its column past the pane whatever bound it was given,
since a badge sets its value on one line. And its copy button, shown
outright, competes with the values for attention on every row it
appears in; waiting for the pointer, or for focus so a keyboard can
still reach it, keeps a list to its content. Both now hold wherever a
JSON field is rendered.

What the comparison says about itself was spread over three stacked
rows above the table, and the warning that a bound had cut it short sat
nowhere near the field that sets that bound — the one control that can
lift it. The summary now heads the table's own header row, beside the
columns menu, and the bound carries its own notice.

The tab's components were sharing two files, which left the table, its
cells and the page's query in the same place as whichever one was being
read.

Co-Authored-By: Claude <noreply@anthropic.com>

---------
(cherry picked from commit 5c021ce)

Co-authored-by: Brent Bovenzi <brent@astronomer.io>
Co-authored-by: jedcunningham <66968678+jedcunningham@users.noreply.github.com>
Co-authored-by: Claude <noreply@anthropic.com>
bbovenzi added a commit that referenced this pull request Oct 22, 2026
* Wrap long values in Dag version diff table so After stays visible

The Versions tab compares two Dag versions in a table whose path,
before and after cells show serialized values of up to 120 characters.
These are mostly JSON or long paths with no spaces, so the browser
could not wrap them. The table grew far wider than its container
(2146px in a 1100px window), and since DataTable has no horizontal
scroll, the rightmost After column was clipped out of view. Narrower
windows made it worse.

Let those cells wrap with overflow-wrap: anywhere and
white-space: pre-wrap. overflow-wrap: break-word is not enough: it
does not lower the cell's min-content width, so the table would still
overflow. The trade-off is that short paths can break mid-word in
narrow windows.

* UI: Read a Dag version diff's values as JSON, not as a cut string

A change to a Dag version carries the serialized value on each side, and
a whole task added or removed carries its entire payload. Flattened into
a cell and cut at 120 characters, those values said little more than
that something had changed; as a JSON preview they name the keys that
differ and open in place when the rest matters.

The cells were also set as code, whose surface sits on the table's own
striped rows at nearly the same shade, and a path was free to break
after any character, so a column squeezed by its neighbours read
vertically, one glyph per line. A side the change does not have now
leaves its cell empty, since a dash reads as a value the version holds.

Carrying a preview on each side of a comparison asks two things of the
rendered JSON field that its other callers never did. It sized itself
for one payload per row, where one long entry — a dotted class path, a
URL — could widen its column past the pane whatever bound it was given,
since a badge sets its value on one line. And its copy button, shown
outright, competes with the values for attention on every row it
appears in; waiting for the pointer, or for focus so a keyboard can
still reach it, keeps a list to its content. Both now hold wherever a
JSON field is rendered.

What the comparison says about itself was spread over three stacked
rows above the table, and the warning that a bound had cut it short sat
nowhere near the field that sets that bound — the one control that can
lift it. The summary now heads the table's own header row, beside the
columns menu, and the bound carries its own notice.

The tab's components were sharing two files, which left the table, its
cells and the page's query in the same place as whichever one was being
read.



---------
(cherry picked from commit 5c021ce)

Co-authored-by: Brent Bovenzi <brent@astronomer.io>
Co-authored-by: jedcunningham <66968678+jedcunningham@users.noreply.github.com>
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:UI Related to UI/UX. For Frontend Developers. backport-to-v3-4-test Backport to v3-4-test type:misc/internal Changelog: Misc changes that should appear in change log

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants