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 f7005a290fba8..156c11c7a50ab 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 7821c3598b6d0..e8631848560e3 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>([]); + const [selectedOptions, setSelectedOptions] = useState>(["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 31ac40278df36..05403dbacbdca 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>([]); + const [selectedOptions, setSelectedOptions] = useState>(["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: {