This is an automated email from the ASF dual-hosted git repository.
bbovenzi pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/airflow.git
The following commit(s) were added to refs/heads/main by this push:
new 421a6da25bc UI: Add a Dag Run ID column to the Task Instances list
(#74316)
421a6da25bc is described below
commit 421a6da25bc9b9af67e659fedccfda9a8f458a1a
Author: Yuseok Jo <[email protected]>
AuthorDate: Wed Oct 7 03:44:17 2026 +0900
UI: Add a Dag Run ID column to the Task Instances list (#74316)
---
.../src/pages/TaskInstances/TaskInstances.test.tsx | 23 ++++++++++++++++++++--
.../ui/src/pages/TaskInstances/TaskInstances.tsx | 11 +++++++++++
2 files changed, 32 insertions(+), 2 deletions(-)
diff --git
a/airflow-core/src/airflow/ui/src/pages/TaskInstances/TaskInstances.test.tsx
b/airflow-core/src/airflow/ui/src/pages/TaskInstances/TaskInstances.test.tsx
index 3c2f36beef0..6882d95e61f 100644
--- a/airflow-core/src/airflow/ui/src/pages/TaskInstances/TaskInstances.test.tsx
+++ b/airflow-core/src/airflow/ui/src/pages/TaskInstances/TaskInstances.test.tsx
@@ -18,6 +18,7 @@
*/
import type { ReactNode } from "react";
+import "@testing-library/jest-dom/vitest";
import { render, screen } from "@testing-library/react";
import type * as ReactI18Next from "react-i18next";
import type * as ReactRouterDom from "react-router-dom";
@@ -84,14 +85,18 @@ vi.mock("src/components/DataTable", () => ({
}>;
readonly data: ReadonlyArray<TaskInstanceResponse>;
}) => {
- const renderedMapIndexColumn = columns.find((column) => column.accessorKey
=== "rendered_map_index");
+ const renderedColumns = columns.filter(
+ (column) => column.accessorKey === "rendered_map_index" ||
column.accessorKey === "dag_run_id",
+ );
return (
<table>
<tbody>
{data.map((taskInstance) => (
<tr key={`${taskInstance.task_id}-${taskInstance.map_index}`}>
- <td>{renderedMapIndexColumn?.cell?.({ row: { original:
taskInstance } })}</td>
+ {renderedColumns.map((column) => (
+ <td key={column.accessorKey}>{column.cell?.({ row: { original:
taskInstance } })}</td>
+ ))}
</tr>
))}
</tbody>
@@ -168,4 +173,18 @@ describe("TaskInstances", () => {
expect(screen.queryByRole("link")).not.toBeInTheDocument();
});
+
+ it("links task instances to their Dag run from the Dag run ID column", () =>
{
+ mockParams = {};
+ vi.mocked(useTaskInstanceServiceGetTaskInstances).mockReturnValue(
+ getTaskInstancesResponse([mappedTaskInstance]),
+ );
+
+ render(<TaskInstances />, { wrapper: Wrapper });
+
+ expect(screen.getByRole("link", { name:
"manual__2026-06-07T00:00:00+00:00" })).toHaveAttribute(
+ "href",
+ "/dags/example_dag/runs/manual__2026-06-07T00:00:00+00:00",
+ );
+ });
});
diff --git
a/airflow-core/src/airflow/ui/src/pages/TaskInstances/TaskInstances.tsx
b/airflow-core/src/airflow/ui/src/pages/TaskInstances/TaskInstances.tsx
index 2e978b13fbb..a6b0d5bbd78 100644
--- a/airflow-core/src/airflow/ui/src/pages/TaskInstances/TaskInstances.tsx
+++ b/airflow-core/src/airflow/ui/src/pages/TaskInstances/TaskInstances.tsx
@@ -140,6 +140,16 @@ const taskInstanceColumns = ({
),
header: translate("dagRun_one"),
},
+ {
+ accessorKey: "dag_run_id",
+ cell: ({ row: { original } }: TaskInstanceRow) => (
+ <RouterLink
to={`/dags/${original.dag_id}/runs/${original.dag_run_id}`}>
+ <TruncatedText text={original.dag_run_id} />
+ </RouterLink>
+ ),
+ enableSorting: false,
+ header: translate("dagRunId"),
+ },
]),
...(Boolean(taskId)
? []
@@ -279,6 +289,7 @@ export const TaskInstances = () => {
const { setTableURLState, tableURLState } = useTableURLState({
columnVisibility: {
+ dag_run_id: false,
dag_version: false,
end_date: false,
executor: false,