Skip to content

[v3-4-test] Let plugins add their own actions to Dag, run and task instance rows (#75229) - #75427

Merged
bbovenzi merged 1 commit into
apache:v3-4-testfrom
astronomer:backport-75229-v3-4-test
Oct 22, 2026
Merged

bbovenzi merged 1 commit into
apache:v3-4-testfrom
astronomer:backport-75229-v3-4-test

Conversation

@bbovenzi

Copy link
Copy Markdown
Contributor

Backport of #75229 to v3-4-test.

The automatic backport workflow failed on a transient GitHub API error in its "Get PR information" step (run 39811753215), so it never attempted the cherry-pick. Picked by hand from c510e4d — it applied with no conflicts, and the resulting diff matches the original commit line for line.


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

…pache#75229)

Airflow draws a fixed set of actions beside a Dag, a Dag Run and a Task
Instance -- trigger, clear, mark state -- and a plugin had no way to put
anything next to them. A plugin could add a whole page as a tab, but not a
single button on the row or header card where the user already is, so the
work it offers for one entity had to be reached by navigating away from that
entity.

An action is either a `link`, which opens a URL templated with the entity's
context, or `react`, which mounts the plugin's own component behind a trigger
button. The React kind is handed `open`, `onClose` and `triggerRef` and
portals whatever surface it wants -- a popover, a dialog, a drawer -- rather
than being given a modal to fill, because the right surface depends on what
the plugin is showing.

Actions are scoped by the same `applies_to` field paths as tabs and panels,
through the same matchers, so a button can be offered only where it applies:
only on failed task instances, only on Dags of a given team. That is the
reason the two were designed together.

A React action's `name` is the global its bundle registers under, so it
cannot share one with a React App or another React action -- the second to
load would silently win. Such an action is refused rather than loaded.

(cherry picked from commit c510e4d)
@boring-cyborg boring-cyborg Bot added area:airflow-ctl area:API Airflow's REST/HTTP API area:CLI area:plugins area:UI Related to UI/UX. For Frontend Developers. kind:documentation labels Oct 22, 2026
@bbovenzi
bbovenzi merged commit a9afa0d into apache:v3-4-test Oct 22, 2026
125 of 126 checks passed
@bbovenzi
bbovenzi deleted the backport-75229-v3-4-test branch October 22, 2026 22:26
@github-actions github-actions Bot added this to the Airflow 3.4.1 milestone Oct 22, 2026
@github-actions

Copy link
Copy Markdown
Contributor

Hi maintainer, this PR was merged without a milestone set.
We've automatically set the milestone to Airflow 3.4.1 based on: merged to version branch
If this milestone is not correct, please update it to the appropriate milestone.

This comment was generated by Milestone Tag Assistant.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

area:airflow-ctl area:API Airflow's REST/HTTP API area:CLI area:plugins area:UI Related to UI/UX. For Frontend Developers. kind:documentation

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants