diff --git a/airflow-core/src/airflow/ui/src/layouts/Details/Gantt/GanttTimeline.tsx b/airflow-core/src/airflow/ui/src/layouts/Details/Gantt/GanttTimeline.tsx index 43c28dba56b52..940a80854e29b 100644 --- a/airflow-core/src/airflow/ui/src/layouts/Details/Gantt/GanttTimeline.tsx +++ b/airflow-core/src/airflow/ui/src/layouts/Details/Gantt/GanttTimeline.tsx @@ -85,7 +85,7 @@ const toTooltipSummary = ( return { child_states: null, - max_end_date: dayjs(segment.x[1]).toISOString(), + max_end_date: segment.end_when ?? dayjs(segment.x[1]).toISOString(), min_start_date: segment.start_when ?? dayjs(segment.x[0]).toISOString(), state: segment.state ?? null, task_display_name: segment.y, diff --git a/airflow-core/src/airflow/ui/src/layouts/Details/Gantt/utils.test.ts b/airflow-core/src/airflow/ui/src/layouts/Details/Gantt/utils.test.ts index d725dfc8be60d..92708a49c3875 100644 --- a/airflow-core/src/airflow/ui/src/layouts/Details/Gantt/utils.test.ts +++ b/airflow-core/src/airflow/ui/src/layouts/Details/Gantt/utils.test.ts @@ -257,6 +257,14 @@ describe("transformGanttData", () => { }); expect(result).toHaveLength(2); + expect(result[0]).toMatchObject({ + end_when: "2024-03-14T10:05:00+00:00", + state: "queued", + }); + expect(result[1]).toMatchObject({ + end_when: "2024-03-14T10:05:00+00:00", + state: "success", + }); expect(result[0]?.state).toBe("queued"); expect(result[1]?.state).toBe("success"); }); diff --git a/airflow-core/src/airflow/ui/src/layouts/Details/Gantt/utils.ts b/airflow-core/src/airflow/ui/src/layouts/Details/Gantt/utils.ts index 9502cd31e7843..62b9fff84b432 100644 --- a/airflow-core/src/airflow/ui/src/layouts/Details/Gantt/utils.ts +++ b/airflow-core/src/airflow/ui/src/layouts/Details/Gantt/utils.ts @@ -28,6 +28,8 @@ import { renderDuration } from "src/utils/datetimeUtils"; import { buildTaskInstanceUrl } from "src/utils/links"; export type GanttDataItem = { + /** Actual task execution end_date — consistent across all segments of the same try. */ + end_when?: string | null; isGroup?: boolean | null; isMapped?: boolean | null; /** Source try times for tooltips (matches TaskInstance `*_when` fields). */ @@ -140,6 +142,7 @@ export const transformGanttData = ({ ...(scheduledMs === undefined ? {} : { scheduled_when: scheduledDttm }), ...(queuedMs === undefined ? {} : { queued_when: queuedDttm }), ...(startDate === null ? {} : { start_when: startDate }), + ...(endDate === null ? {} : { end_when: endDate }), }; let endMs: number;