This is an automated email from the ASF dual-hosted git repository.
pierrejeambrun pushed a commit to branch v3-1-test
in repository https://gitbox.apache.org/repos/asf/airflow.git
The following commit(s) were added to refs/heads/v3-1-test by this push:
new d1e938f0466 Fix clear task instance dialog tasks states (#59363)
(#59580)
d1e938f0466 is described below
commit d1e938f046699f6c1c7eb0080a830fb6fa5bbef9
Author: Pierre Jeambrun <[email protected]>
AuthorDate: Thu Dec 18 15:06:55 2025 +0100
Fix clear task instance dialog tasks states (#59363) (#59580)
---
.../airflow/ui/src/components/Clear/Run/ClearRunDialog.tsx | 11 ++++++++++-
.../Clear/TaskInstance/ClearGroupTaskInstanceDialog.tsx | 11 +++++++++--
.../components/Clear/TaskInstance/ClearTaskInstanceDialog.tsx | 9 ++++++++-
3 files changed, 27 insertions(+), 4 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 f7005a290fb..156c11c7a50 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
@@ -22,13 +22,14 @@ import { useTranslation } from "react-i18next";
import { CgRedo } from "react-icons/cg";
import { useDagServiceGetDagDetails } from "openapi/queries";
-import type { DAGRunResponse } from "openapi/requests/types.gen";
+import type { DAGRunResponse, TaskInstanceResponse } from
"openapi/requests/types.gen";
import { ActionAccordion } from "src/components/ActionAccordion";
import { Button, Dialog, Checkbox } from "src/components/ui";
import SegmentedControl from "src/components/ui/SegmentedControl";
import { useClearDagRunDryRun } from "src/queries/useClearDagRunDryRun";
import { useClearDagRun } from "src/queries/useClearRun";
import { usePatchDagRun } from "src/queries/usePatchDagRun";
+import { isStatePending, useAutoRefresh } from "src/utils";
type Props = {
readonly dagRun: DAGRunResponse;
@@ -51,9 +52,17 @@ const ClearRunDialog = ({ dagRun, onClose, open }: Props) =>
{
dagId,
});
+ const refetchInterval = useAutoRefresh({ dagId });
+
const { data: affectedTasks = { task_instances: [], total_entries: 0 } } =
useClearDagRunDryRun({
dagId,
dagRunId,
+ options: {
+ refetchInterval: (query) =>
+ query.state.data?.task_instances.some((ti: TaskInstanceResponse) =>
isStatePending(ti.state))
+ ? refetchInterval
+ : false,
+ },
requestBody: { only_failed: onlyFailed, run_on_latest_version:
runOnLatestVersion },
});
diff --git
a/airflow-core/src/airflow/ui/src/components/Clear/TaskInstance/ClearGroupTaskInstanceDialog.tsx
b/airflow-core/src/airflow/ui/src/components/Clear/TaskInstance/ClearGroupTaskInstanceDialog.tsx
index 7821c3598b6..e8631848560 100644
---
a/airflow-core/src/airflow/ui/src/components/Clear/TaskInstance/ClearGroupTaskInstanceDialog.tsx
+++
b/airflow-core/src/airflow/ui/src/components/Clear/TaskInstance/ClearGroupTaskInstanceDialog.tsx
@@ -23,12 +23,13 @@ import { CgRedo } from "react-icons/cg";
import { useParams } from "react-router-dom";
import { useDagServiceGetDagDetails, useTaskInstanceServiceGetTaskInstances }
from "openapi/queries";
-import type { LightGridTaskInstanceSummary } from "openapi/requests/types.gen";
+import type { LightGridTaskInstanceSummary, TaskInstanceResponse } from
"openapi/requests/types.gen";
import { ActionAccordion } from "src/components/ActionAccordion";
import { Button, Dialog, Checkbox } from "src/components/ui";
import SegmentedControl from "src/components/ui/SegmentedControl";
import { useClearTaskInstances } from "src/queries/useClearTaskInstances";
import { useClearTaskInstancesDryRun } from
"src/queries/useClearTaskInstancesDryRun";
+import { isStatePending, useAutoRefresh } from "src/utils";
type Props = {
readonly onClose: () => void;
@@ -47,7 +48,7 @@ export const ClearGroupTaskInstanceDialog = ({ onClose, open,
taskInstance }: Pr
onSuccessConfirm: onClose,
});
- const [selectedOptions, setSelectedOptions] = useState<Array<string>>([]);
+ const [selectedOptions, setSelectedOptions] =
useState<Array<string>>(["downstream"]);
const onlyFailed = selectedOptions.includes("onlyFailed");
const past = selectedOptions.includes("past");
@@ -76,10 +77,16 @@ export const ClearGroupTaskInstanceDialog = ({ onClose,
open, taskInstance }: Pr
const groupTaskIds = groupTaskInstances?.task_instances.map((ti) =>
ti.task_id) ?? [];
+ const refetchInterval = useAutoRefresh({ dagId });
+
const { data } = useClearTaskInstancesDryRun({
dagId,
options: {
enabled: open && groupTaskIds.length > 0,
+ refetchInterval: (query) =>
+ query.state.data?.task_instances.some((ti: TaskInstanceResponse) =>
isStatePending(ti.state))
+ ? refetchInterval
+ : false,
refetchOnMount: "always",
},
requestBody: {
diff --git
a/airflow-core/src/airflow/ui/src/components/Clear/TaskInstance/ClearTaskInstanceDialog.tsx
b/airflow-core/src/airflow/ui/src/components/Clear/TaskInstance/ClearTaskInstanceDialog.tsx
index 31ac40278df..05403dbacbd 100644
---
a/airflow-core/src/airflow/ui/src/components/Clear/TaskInstance/ClearTaskInstanceDialog.tsx
+++
b/airflow-core/src/airflow/ui/src/components/Clear/TaskInstance/ClearTaskInstanceDialog.tsx
@@ -30,6 +30,7 @@ import SegmentedControl from
"src/components/ui/SegmentedControl";
import { useClearTaskInstances } from "src/queries/useClearTaskInstances";
import { useClearTaskInstancesDryRun } from
"src/queries/useClearTaskInstancesDryRun";
import { usePatchTaskInstance } from "src/queries/usePatchTaskInstance";
+import { isStatePending, useAutoRefresh } from "src/utils";
type Props = {
readonly onClose: () => void;
@@ -51,7 +52,7 @@ const ClearTaskInstanceDialog = ({ onClose, open,
taskInstance }: Props) => {
onSuccessConfirm: onClose,
});
- const [selectedOptions, setSelectedOptions] = useState<Array<string>>([]);
+ const [selectedOptions, setSelectedOptions] =
useState<Array<string>>(["downstream"]);
const onlyFailed = selectedOptions.includes("onlyFailed");
const past = selectedOptions.includes("past");
@@ -73,10 +74,16 @@ const ClearTaskInstanceDialog = ({ onClose, open,
taskInstance }: Props) => {
dagId,
});
+ const refetchInterval = useAutoRefresh({ dagId });
+
const { data } = useClearTaskInstancesDryRun({
dagId,
options: {
enabled: open,
+ refetchInterval: (query) =>
+ query.state.data?.task_instances.some((ti: TaskInstanceResponse) =>
isStatePending(ti.state))
+ ? refetchInterval
+ : false,
refetchOnMount: "always",
},
requestBody: {