diff --git a/airflow/www/static/js/api/useClearRun.ts b/airflow/www/static/js/api/useClearRun.ts index b2fa85eea2303..c7b32b79fb2a0 100644 --- a/airflow/www/static/js/api/useClearRun.ts +++ b/airflow/www/static/js/api/useClearRun.ts @@ -42,17 +42,18 @@ export default function useClearRun(dagId: string, runId: string) { dag_run_id: runId, }).toString(); - return axios.post(clearRunUrl, params, { + return axios.post(clearRunUrl, params, { headers: { 'Content-Type': 'application/x-www-form-urlencoded', }, }); }, { - onSuccess: () => { - // Invalidating the query will force a new API request - queryClient.invalidateQueries('gridData'); - startRefresh(); + onSuccess: (_, { confirmed }) => { + if (confirmed) { + queryClient.invalidateQueries('gridData'); + startRefresh(); + } }, onError: (error: Error) => errorToast({ error }), }, diff --git a/airflow/www/static/js/api/useClearTask.ts b/airflow/www/static/js/api/useClearTask.ts index 279bc7458868d..b6c10f1637e83 100644 --- a/airflow/www/static/js/api/useClearTask.ts +++ b/airflow/www/static/js/api/useClearTask.ts @@ -74,17 +74,19 @@ export default function useClearTask({ params.append('map_index', mi.toString()); }); - return axios.post(clearUrl, params.toString(), { + return axios.post(clearUrl, params.toString(), { headers: { 'Content-Type': 'application/x-www-form-urlencoded', }, }); }, { - onSuccess: () => { - queryClient.invalidateQueries('gridData'); - queryClient.invalidateQueries(['mappedInstances', dagId, runId, taskId]); - startRefresh(); + onSuccess: (_, { confirmed }) => { + if (confirmed) { + queryClient.invalidateQueries('gridData'); + queryClient.invalidateQueries(['mappedInstances', dagId, runId, taskId]); + startRefresh(); + } }, onError: (error: Error) => errorToast({ error }), }, diff --git a/airflow/www/static/js/api/useMarkFailedRun.ts b/airflow/www/static/js/api/useMarkFailedRun.ts index 9e58381da2896..e1b7f2a21efaa 100644 --- a/airflow/www/static/js/api/useMarkFailedRun.ts +++ b/airflow/www/static/js/api/useMarkFailedRun.ts @@ -42,16 +42,18 @@ export default function useMarkFailedRun(dagId: string, runId: string) { dag_run_id: runId, }).toString(); - return axios.post(markFailedUrl, params, { + return axios.post(markFailedUrl, params, { headers: { 'Content-Type': 'application/x-www-form-urlencoded', }, }); }, { - onSuccess: () => { - queryClient.invalidateQueries('gridData'); - startRefresh(); + onSuccess: (_, { confirmed }) => { + if (confirmed) { + queryClient.invalidateQueries('gridData'); + startRefresh(); + } }, onError: (error: Error) => errorToast({ error }), }, diff --git a/airflow/www/static/js/api/useMarkSuccessRun.ts b/airflow/www/static/js/api/useMarkSuccessRun.ts index 062326cca4ed9..545e42e9173bd 100644 --- a/airflow/www/static/js/api/useMarkSuccessRun.ts +++ b/airflow/www/static/js/api/useMarkSuccessRun.ts @@ -41,16 +41,18 @@ export default function useMarkSuccessRun(dagId: string, runId: string) { dag_run_id: runId, }).toString(); - return axios.post(markSuccessUrl, params, { + return axios.post(markSuccessUrl, params, { headers: { 'Content-Type': 'application/x-www-form-urlencoded', }, }); }, { - onSuccess: () => { - queryClient.invalidateQueries('gridData'); - startRefresh(); + onSuccess: (_, { confirmed }) => { + if (confirmed) { + queryClient.invalidateQueries('gridData'); + startRefresh(); + } }, onError: (error: Error) => errorToast({ error }), }, diff --git a/airflow/www/static/js/api/useQueueRun.ts b/airflow/www/static/js/api/useQueueRun.ts index 71d4027b5f09b..6438d2856874e 100644 --- a/airflow/www/static/js/api/useQueueRun.ts +++ b/airflow/www/static/js/api/useQueueRun.ts @@ -40,16 +40,18 @@ export default function useQueueRun(dagId: string, runId: string) { dag_id: dagId, dag_run_id: runId, }).toString(); - return axios.post(queuedUrl, params, { + return axios.post(queuedUrl, params, { headers: { 'Content-Type': 'application/x-www-form-urlencoded', }, }); }, { - onSuccess: () => { - queryClient.invalidateQueries('gridData'); - startRefresh(); + onSuccess: (_, { confirmed }) => { + if (confirmed) { + queryClient.invalidateQueries('gridData'); + startRefresh(); + } }, onError: (error: Error) => errorToast({ error }), }, diff --git a/airflow/www/static/js/components/ConfirmDialog.tsx b/airflow/www/static/js/components/ConfirmDialog.tsx index 5501627de3e8c..055186e6a2e68 100644 --- a/airflow/www/static/js/components/ConfirmDialog.tsx +++ b/airflow/www/static/js/components/ConfirmDialog.tsx @@ -37,13 +37,13 @@ interface Props extends PropsWithChildren { onClose: () => void; title?: string; description: string; - body?: string[] | string; + affectedTasks: string[]; onConfirm: () => void; isLoading?: boolean; } const ConfirmDialog = ({ - isOpen, onClose, title = 'Wait a minute', description, body = [], onConfirm, isLoading = false, children, + isOpen, onClose, title = 'Wait a minute', description, affectedTasks, onConfirm, isLoading = false, children, }: Props) => { const initialFocusRef = useRef(null); const containerRef = useContainerRef(); @@ -67,7 +67,12 @@ const ConfirmDialog = ({ {children} {description} - {Array.isArray(body) && body.map((ti) => ({ti}))} + {affectedTasks.map((ti) => ( + {ti} + ))} + {!affectedTasks.length && ( + No task instances to change. + )} diff --git a/airflow/www/static/js/dag/details/dagRun/ClearRun.tsx b/airflow/www/static/js/dag/details/dagRun/ClearRun.tsx index 5666dbc84a863..bd0a7d92346b1 100644 --- a/airflow/www/static/js/dag/details/dagRun/ClearRun.tsx +++ b/airflow/www/static/js/dag/details/dagRun/ClearRun.tsx @@ -32,7 +32,7 @@ interface Props { } const ClearRun = ({ dagId, runId }: Props) => { - const [affectedTasks, setAffectedTasks] = useState(''); + const [affectedTasks, setAffectedTasks] = useState([]); const { isOpen, onOpen, onClose } = useDisclosure(); const { mutateAsync: onClear, isLoading } = useClearRun(dagId, runId); @@ -44,7 +44,7 @@ const ClearRun = ({ dagId, runId }: Props) => { const onConfirm = async () => { await onClear({ confirmed: true }); - setAffectedTasks(''); + setAffectedTasks([]); onClose(); }; @@ -63,7 +63,7 @@ const ClearRun = ({ dagId, runId }: Props) => { onConfirm={onConfirm} isLoading={isLoading} description="Task instances you are about to clear:" - body={affectedTasks} + affectedTasks={affectedTasks} /> ); diff --git a/airflow/www/static/js/dag/details/dagRun/MarkFailedRun.tsx b/airflow/www/static/js/dag/details/dagRun/MarkFailedRun.tsx index 26bdce8fb815f..7096c10790a5c 100644 --- a/airflow/www/static/js/dag/details/dagRun/MarkFailedRun.tsx +++ b/airflow/www/static/js/dag/details/dagRun/MarkFailedRun.tsx @@ -32,7 +32,7 @@ interface Props { } const MarkFailedRun = ({ dagId, runId }: Props) => { - const [affectedTasks, setAffectedTasks] = useState(''); + const [affectedTasks, setAffectedTasks] = useState([]); const { isOpen, onOpen, onClose } = useDisclosure(); const { mutateAsync: markFailed, isLoading } = useMarkFailedRun(dagId, runId); @@ -44,7 +44,7 @@ const MarkFailedRun = ({ dagId, runId }: Props) => { const onConfirm = () => { markFailed({ confirmed: true }); - setAffectedTasks(''); + setAffectedTasks([]); onClose(); }; @@ -57,7 +57,7 @@ const MarkFailedRun = ({ dagId, runId }: Props) => { onConfirm={onConfirm} isLoading={isLoading} description="Task instances you are about to mark as failed or skipped:" - body={affectedTasks} + affectedTasks={affectedTasks} /> ); diff --git a/airflow/www/static/js/dag/details/dagRun/MarkSuccessRun.tsx b/airflow/www/static/js/dag/details/dagRun/MarkSuccessRun.tsx index 79a894b7a9ee0..38392e76fd0b1 100644 --- a/airflow/www/static/js/dag/details/dagRun/MarkSuccessRun.tsx +++ b/airflow/www/static/js/dag/details/dagRun/MarkSuccessRun.tsx @@ -32,7 +32,7 @@ interface Props { } const MarkSuccessRun = ({ dagId, runId }: Props) => { - const [affectedTasks, setAffectedTasks] = useState(''); + const [affectedTasks, setAffectedTasks] = useState([]); const { isOpen, onOpen, onClose } = useDisclosure(); const { mutateAsync: markSuccess, isLoading } = useMarkSuccessRun(dagId, runId); @@ -44,7 +44,7 @@ const MarkSuccessRun = ({ dagId, runId }: Props) => { const onConfirm = async () => { await markSuccess({ confirmed: true }); - setAffectedTasks(''); + setAffectedTasks([]); onClose(); }; @@ -57,7 +57,7 @@ const MarkSuccessRun = ({ dagId, runId }: Props) => { onConfirm={onConfirm} isLoading={isLoading} description="Task instances you are about to mark as success:" - body={affectedTasks} + affectedTasks={affectedTasks} /> ); diff --git a/airflow/www/static/js/dag/details/dagRun/QueueRun.tsx b/airflow/www/static/js/dag/details/dagRun/QueueRun.tsx index a973e0ddac0dc..e48187761a861 100644 --- a/airflow/www/static/js/dag/details/dagRun/QueueRun.tsx +++ b/airflow/www/static/js/dag/details/dagRun/QueueRun.tsx @@ -32,7 +32,7 @@ interface Props { } const QueueRun = ({ dagId, runId }: Props) => { - const [affectedTasks, setAffectedTasks] = useState(''); + const [affectedTasks, setAffectedTasks] = useState([]); const { isOpen, onOpen, onClose } = useDisclosure(); const { mutateAsync: onQueue, isLoading } = useQueueRun(dagId, runId); @@ -46,7 +46,7 @@ const QueueRun = ({ dagId, runId }: Props) => { // Confirm changes const onConfirm = async () => { await onQueue({ confirmed: true }); - setAffectedTasks(''); + setAffectedTasks([]); onClose(); }; @@ -67,7 +67,7 @@ const QueueRun = ({ dagId, runId }: Props) => { onConfirm={onConfirm} isLoading={isLoading} description="Task instances you are about to queue:" - body={affectedTasks} + affectedTasks={affectedTasks} /> ); diff --git a/airflow/www/static/js/dag/details/taskInstance/taskActions/Clear.tsx b/airflow/www/static/js/dag/details/taskInstance/taskActions/Clear.tsx index d6066c89bfe39..4d7a50f2f0bb0 100644 --- a/airflow/www/static/js/dag/details/taskInstance/taskActions/Clear.tsx +++ b/airflow/www/static/js/dag/details/taskInstance/taskActions/Clear.tsx @@ -44,7 +44,7 @@ const Run = ({ mapIndexes, isGroup, }: CommonActionProps) => { - const [affectedTasks, setAffectedTasks] = useState(''); + const [affectedTasks, setAffectedTasks] = useState([]); // Options check/unchecked const [past, setPast] = useState(false); @@ -98,7 +98,7 @@ const Run = ({ confirmed: true, mapIndexes, }); - setAffectedTasks(''); + setAffectedTasks([]); onClose(); }; @@ -127,7 +127,7 @@ const Run = ({ onConfirm={onConfirm} isLoading={isLoading} description={`Task instances you are about to clear (${affectedTasks.length}):`} - body={affectedTasks} + affectedTasks={affectedTasks} > { isGroup && (past || future) && ( diff --git a/airflow/www/static/js/dag/details/taskInstance/taskActions/MarkFailed.tsx b/airflow/www/static/js/dag/details/taskInstance/taskActions/MarkFailed.tsx index f3537369e89ab..bcada11089d97 100644 --- a/airflow/www/static/js/dag/details/taskInstance/taskActions/MarkFailed.tsx +++ b/airflow/www/static/js/dag/details/taskInstance/taskActions/MarkFailed.tsx @@ -116,7 +116,7 @@ const MarkFailed = ({ onConfirm={onConfirm} isLoading={isLoading} description="Task instances you are about to mark as failed:" - body={affectedTasks} + affectedTasks={affectedTasks} /> ); diff --git a/airflow/www/static/js/dag/details/taskInstance/taskActions/MarkSuccess.tsx b/airflow/www/static/js/dag/details/taskInstance/taskActions/MarkSuccess.tsx index 767ccbaa160be..79e6a07726100 100644 --- a/airflow/www/static/js/dag/details/taskInstance/taskActions/MarkSuccess.tsx +++ b/airflow/www/static/js/dag/details/taskInstance/taskActions/MarkSuccess.tsx @@ -111,7 +111,7 @@ const MarkSuccess = ({ onConfirm={onConfirm} isLoading={isLoading} description="Task instances you are about to mark as success:" - body={affectedTasks} + affectedTasks={affectedTasks} /> );