From 870912a094300cb86e024723f5d4ed4fed3a87cf Mon Sep 17 00:00:00 2001 From: GUAN MING Date: Sun, 10 Aug 2025 22:57:55 +0800 Subject: [PATCH] Refactor HITL details fetching to use exact dagId and taskId --- .../src/airflow/ui/src/pages/Dag/Dag.tsx | 6 +++--- .../HITLTaskInstances/HITLTaskInstances.tsx | 20 ++++++------------- .../src/airflow/ui/src/pages/Run/Run.tsx | 2 +- .../src/airflow/ui/src/pages/Task/Task.tsx | 16 +++++---------- .../src/pages/TaskInstance/TaskInstance.tsx | 7 +++---- 5 files changed, 18 insertions(+), 33 deletions(-) diff --git a/airflow-core/src/airflow/ui/src/pages/Dag/Dag.tsx b/airflow-core/src/airflow/ui/src/pages/Dag/Dag.tsx index 455dbc2e7941a..ae7e7bceea3ae 100644 --- a/airflow-core/src/airflow/ui/src/pages/Dag/Dag.tsx +++ b/airflow-core/src/airflow/ui/src/pages/Dag/Dag.tsx @@ -74,7 +74,7 @@ export const Dag = () => { const { data: hitlData } = useHumanInTheLoopServiceGetHitlDetails( { - dagIdPattern: dagId, + dagId, }, undefined, { @@ -82,14 +82,14 @@ export const Dag = () => { }, ); - const hasHitlTasks = (hitlData?.total_entries ?? 0) > 0; + const hasHitlTaskInstances = (hitlData?.total_entries ?? 0) > 0; const displayTabs = tabs.filter((tab) => { if (dag?.timetable_summary === null && tab.value === "backfills") { return false; } - if (tab.value === "required_actions" && !hasHitlTasks) { + if (tab.value === "required_actions" && !hasHitlTaskInstances) { return false; } 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 403d7b2d17469..a20175d2c5486 100644 --- a/airflow-core/src/airflow/ui/src/pages/HITLTaskInstances/HITLTaskInstances.tsx +++ b/airflow-core/src/airflow/ui/src/pages/HITLTaskInstances/HITLTaskInstances.tsx @@ -133,9 +133,11 @@ export const HITLTaskInstances = () => { const { data, error, isLoading } = useHumanInTheLoopServiceGetHitlDetails( { - dagIdPattern: dagId, + dagId, dagRunId: runId, responseReceived: Boolean(responseReceived) ? responseReceived === "true" : undefined, + taskId: Boolean(groupId) ? undefined : taskId, + taskIdPattern: groupId, }, undefined, { @@ -144,21 +146,11 @@ export const HITLTaskInstances = () => { }, ); - const filteredData = data?.hitl_details.filter((hitl) => { - if (taskId !== undefined) { - return hitl.task_instance.task_id === taskId; - } else if (groupId !== undefined) { - return hitl.task_instance.task_id.includes(groupId); - } - - return true; - }); - return ( {!Boolean(dagId) && !Boolean(runId) && !Boolean(taskId) ? ( - {filteredData?.length} {translate("requiredAction", { count: filteredData?.length })} + {data?.total_entries} {translate("requiredAction", { count: data?.total_entries })} ) : undefined} { taskId: Boolean(groupId) ? undefined : taskId, translate, })} - data={filteredData ?? []} + data={data?.hitl_details ?? []} errorMessage={} initialState={tableURLState} isLoading={isLoading} modelName={translate("requiredAction_other")} onStateChange={setTableURLState} - total={filteredData?.length} + total={data?.total_entries} /> ); diff --git a/airflow-core/src/airflow/ui/src/pages/Run/Run.tsx b/airflow-core/src/airflow/ui/src/pages/Run/Run.tsx index 79dd15a307a8f..d37db5729796f 100644 --- a/airflow-core/src/airflow/ui/src/pages/Run/Run.tsx +++ b/airflow-core/src/airflow/ui/src/pages/Run/Run.tsx @@ -65,7 +65,7 @@ export const Run = () => { const { data: hitlData } = useHumanInTheLoopServiceGetHitlDetails( { - dagIdPattern: dagId, + dagId, dagRunId: runId, }, undefined, diff --git a/airflow-core/src/airflow/ui/src/pages/Task/Task.tsx b/airflow-core/src/airflow/ui/src/pages/Task/Task.tsx index 282f5df4176cb..cfeb856d82dc5 100644 --- a/airflow-core/src/airflow/ui/src/pages/Task/Task.tsx +++ b/airflow-core/src/airflow/ui/src/pages/Task/Task.tsx @@ -59,11 +59,12 @@ export const Task = () => { const groupTask = getGroupTask(dagStructure, groupId); - // Check if this task has any HITL details const { data: hitlData } = useHumanInTheLoopServiceGetHitlDetails( { - dagIdPattern: dagId, + dagId, dagRunId: runId, + taskId: Boolean(groupId) ? undefined : taskId, + taskIdPattern: groupId, }, undefined, { @@ -71,17 +72,10 @@ export const Task = () => { }, ); - const hasHitlForTask = - (hitlData?.hitl_details.filter((hitl) => hitl.task_instance.task_id === taskId).length ?? 0) > 0; + const hasHitlForTask = (hitlData?.total_entries ?? 0) > 0; const displayTabs = (groupId === undefined ? tabs : tabs.filter((tab) => tab.value !== "events")).filter( - (tab) => { - if (tab.value === "required_actions" && !hasHitlForTask) { - return false; - } - - return true; - }, + (tab) => tab.value !== "required_actions" || hasHitlForTask, ); return ( diff --git a/airflow-core/src/airflow/ui/src/pages/TaskInstance/TaskInstance.tsx b/airflow-core/src/airflow/ui/src/pages/TaskInstance/TaskInstance.tsx index 9a432a1f571bd..d14bceb2b50cc 100644 --- a/airflow-core/src/airflow/ui/src/pages/TaskInstance/TaskInstance.tsx +++ b/airflow-core/src/airflow/ui/src/pages/TaskInstance/TaskInstance.tsx @@ -81,8 +81,9 @@ export const TaskInstance = () => { const { data: hitlDetails } = useHumanInTheLoopServiceGetHitlDetails( { - dagIdPattern: dagId, + dagId, dagRunId: runId, + taskId, }, undefined, { @@ -91,9 +92,7 @@ export const TaskInstance = () => { }, ); - const hasHitlForTask = Boolean( - hitlDetails?.hitl_details.find((hitl) => hitl.task_instance.task_id === taskId), - ); + const hasHitlForTask = (hitlDetails?.total_entries ?? 0) > 0; const taskInstanceSummary = gridTISummaries?.task_instances.find((ti) => ti.task_id === taskId); const taskCount = useMemo(