This is an automated email from the ASF dual-hosted git repository.
weilee 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 9902eaf3a17 fix: Add auto-refresh functionality to Required Actions
page (#56404) (#57207)
9902eaf3a17 is described below
commit 9902eaf3a1738d2edb4abe705a83fbbd11f6c5f9
Author: Pierre Jeambrun <[email protected]>
AuthorDate: Mon Oct 27 03:08:32 2025 +0100
fix: Add auto-refresh functionality to Required Actions page (#56404)
(#57207)
Co-authored-by: rich7420 <[email protected]>
Co-authored-by: Brent Bovenzi <[email protected]>
---
.../pages/HITLTaskInstances/HITLTaskInstances.tsx | 50 +++++++++++++++-------
1 file changed, 35 insertions(+), 15 deletions(-)
diff --git
a/airflow-core/src/airflow/ui/src/pages/HITLTaskInstances/HITLTaskInstances.tsx
b/airflow-core/src/airflow/ui/src/pages/HITLTaskInstances/HITLTaskInstances.tsx
index 82e43b6aa4f..40d6e7d2eb1 100644
---
a/airflow-core/src/airflow/ui/src/pages/HITLTaskInstances/HITLTaskInstances.tsx
+++
b/airflow-core/src/airflow/ui/src/pages/HITLTaskInstances/HITLTaskInstances.tsx
@@ -32,6 +32,7 @@ import { StateBadge } from "src/components/StateBadge";
import Time from "src/components/Time";
import { TruncatedText } from "src/components/TruncatedText";
import { SearchParamsKeys, type SearchParamsKeysType } from
"src/constants/searchParams";
+import { useAutoRefresh } from "src/utils";
import { getHITLState } from "src/utils/hitl";
import { getTaskInstanceLink } from "src/utils/links";
@@ -127,6 +128,8 @@ export const HITLTaskInstances = () => {
const [sort] = sorting;
const responseReceived = searchParams.get(RESPONSE_RECEIVED_PARAM);
+ const baseRefetchInterval = useAutoRefresh({});
+
const dagIdPattern = searchParams.get(DAG_DISPLAY_NAME_PATTERN) ?? undefined;
const taskIdPattern = searchParams.get(TASK_ID_PATTERN) ?? undefined;
const filterResponseReceived = searchParams.get(RESPONSE_RECEIVED_PARAM) ??
undefined;
@@ -134,21 +137,38 @@ export const HITLTaskInstances = () => {
// Use the filter value if available, otherwise fall back to the old
responseReceived param
const effectiveResponseReceived = filterResponseReceived ?? responseReceived;
- const { data, error, isLoading } = useTaskInstanceServiceGetHitlDetails({
- dagId: dagId ?? "~",
- dagIdPattern,
- dagRunId: runId ?? "~",
- limit: pagination.pageSize,
- offset: pagination.pageIndex * pagination.pageSize,
- orderBy: sort ? [`${sort.desc ? "-" : ""}${sort.id}`] : [],
- responseReceived:
- Boolean(effectiveResponseReceived) && effectiveResponseReceived !== "all"
- ? effectiveResponseReceived === "true"
- : undefined,
- state: effectiveResponseReceived === "false" ? ["deferred"] : undefined,
- taskId,
- taskIdPattern,
- });
+ const { data, error, isLoading } = useTaskInstanceServiceGetHitlDetails(
+ {
+ dagId: dagId ?? "~",
+ dagIdPattern,
+ dagRunId: runId ?? "~",
+ limit: pagination.pageSize,
+ offset: pagination.pageIndex * pagination.pageSize,
+ orderBy: sort ? [`${sort.desc ? "-" : ""}${sort.id}`] : [],
+ responseReceived:
+ Boolean(effectiveResponseReceived) && effectiveResponseReceived !==
"all"
+ ? effectiveResponseReceived === "true"
+ : undefined,
+ state: effectiveResponseReceived === "false" ? ["deferred"] : undefined,
+ taskId,
+ taskIdPattern,
+ },
+ undefined,
+ {
+ // Only continue auto-refetching when filtering for unreceived responses
+ // and at least one TaskInstance is still deferred without a response.
+ refetchInterval: (query) => {
+ const hasDeferredWithoutResponse = Boolean(
+ query.state.data?.hitl_details.some(
+ (detail: HITLDetail) =>
+ detail.responded_at === undefined && detail.task_instance.state
=== "deferred",
+ ),
+ );
+
+ return hasDeferredWithoutResponse ? baseRefetchInterval : false;
+ },
+ },
+ );
const handleResponseChange = useCallback(() => {
setTableURLState({