From 50565b6511ab0ee36b0c46dd20fc1d1d70ba796a Mon Sep 17 00:00:00 2001 From: zcx5674 Date: Sat, 25 Jul 2026 14:24:41 +0900 Subject: [PATCH] UI: Hide "run with latest bundle version" clear option for non-versioned bundles --- .../components/Clear/Run/ClearRunDialog.tsx | 19 +++++++++++-------- .../TaskInstance/runOnLatestVersion.test.ts | 4 ++-- .../Clear/TaskInstance/runOnLatestVersion.ts | 2 +- 3 files changed, 14 insertions(+), 11 deletions(-) diff --git a/airflow-core/src/airflow/ui/src/components/Clear/Run/ClearRunDialog.tsx b/airflow-core/src/airflow/ui/src/components/Clear/Run/ClearRunDialog.tsx index 425ce9f82364c..3f64b0d816c21 100644 --- a/airflow-core/src/airflow/ui/src/components/Clear/Run/ClearRunDialog.tsx +++ b/airflow-core/src/airflow/ui/src/components/Clear/Run/ClearRunDialog.tsx @@ -24,6 +24,7 @@ import { CgRedo } from "react-icons/cg"; import { useDagServiceGetDagDetails } from "openapi/queries"; import type { DAGRunResponse } from "openapi/requests/types.gen"; import { ActionAccordion } from "src/components/ActionAccordion"; +import { getRunOnLatestVersionState } from "src/components/Clear/TaskInstance/runOnLatestVersion"; import { useRerunWithLatestVersion } from "src/components/Clear/useRerunWithLatestVersion"; import { Checkbox, Dialog } from "src/components/ui"; import SegmentedControl from "src/components/ui/SegmentedControl"; @@ -91,14 +92,16 @@ const ClearRunDialog = ({ dagRun, onClose, open }: Props) => { onSuccessConfirm: handleClose, }); - // Check if DAG versions differ (works for both bundle-versioned and local bundles) - const latestDagVersionNumber = dagDetails?.latest_dag_version?.version_number; - const dagRunVersionNumber = dagRun.dag_versions.at(-1)?.version_number; - const versionsDiffer = - latestDagVersionNumber !== undefined && - dagRunVersionNumber !== undefined && - latestDagVersionNumber !== dagRunVersionNumber; - const shouldShowBundleVersionOption = versionsDiffer && !onlyNew; + // Non-versioned bundles (e.g. LocalDagBundle) always leave bundle_version null and + // resolve to the latest serialized Dag at run time, so "run on latest" is a no-op there. + // Only offer it when the run is pinned to an older bundle version, where it actually changes the outcome. + const { shouldShowRunOnLatestOption } = getRunOnLatestVersionState({ + latestBundleVersion: dagDetails?.bundle_version, + latestDagVersionNumber: dagDetails?.latest_dag_version?.version_number, + selectedBundleVersion: dagRun.dag_versions.at(-1)?.bundle_version, + selectedDagVersionNumber: dagRun.dag_versions.at(-1)?.version_number, + }); + const shouldShowBundleVersionOption = shouldShowRunOnLatestOption && !onlyNew; return ( { it.each([ { expectedDagVersionsDiffer: true, - expectedShouldShowRunOnLatestOption: true, + expectedShouldShowRunOnLatestOption: false, latestDagVersionNumber: 3, - name: "shows and defaults on when DAG version numbers differ", + name: "does not show when DAG versions differ but no bundle version is present (non-versioned bundle)", selectedDagVersionNumber: 2, }, { diff --git a/airflow-core/src/airflow/ui/src/components/Clear/TaskInstance/runOnLatestVersion.ts b/airflow-core/src/airflow/ui/src/components/Clear/TaskInstance/runOnLatestVersion.ts index 7bbd2daf9040c..0384eccb8ee98 100644 --- a/airflow-core/src/airflow/ui/src/components/Clear/TaskInstance/runOnLatestVersion.ts +++ b/airflow-core/src/airflow/ui/src/components/Clear/TaskInstance/runOnLatestVersion.ts @@ -55,6 +55,6 @@ export const getRunOnLatestVersionState = ({ return { dagVersionsDiffer, - shouldShowRunOnLatestOption: dagVersionsDiffer || shouldShowForBundleVersion, + shouldShowRunOnLatestOption: shouldShowForBundleVersion, }; };