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 8df64a7dd3c UI: Refresh Dag cards after Dag run changes (#76274)
8df64a7dd3c is described below

commit 8df64a7dd3c1d450844644285986b302d7f65936
Author: Yuseok Jo <[email protected]>
AuthorDate: Wed Nov 4 04:09:43 2026 +0900

    UI: Refresh Dag cards after Dag run changes (#76274)
---
 .../ui/src/queries/dagListQueryKeys.test.tsx       | 134 +++++++++++++++++++++
 .../airflow/ui/src/queries/gridViewQueryKeys.ts    |  10 ++
 .../airflow/ui/src/queries/useBulkClearDagRuns.ts  |   3 +-
 .../airflow/ui/src/queries/useBulkDeleteDagRuns.ts |   9 +-
 .../airflow/ui/src/queries/useBulkPatchDagRun.ts   |   5 +-
 .../src/airflow/ui/src/queries/useClearRun.ts      |   3 +-
 .../ui/src/queries/useClearTaskInstances.ts        |   3 +-
 .../ui/src/queries/useCreateBackfill.test.tsx      |   9 +-
 .../airflow/ui/src/queries/useCreateBackfill.ts    |   6 +-
 .../src/airflow/ui/src/queries/useDeleteDagRun.ts  |   9 +-
 .../src/airflow/ui/src/queries/usePatchDagRun.ts   |   3 +-
 .../src/airflow/ui/src/queries/useTrigger.ts       |  15 +--
 12 files changed, 169 insertions(+), 40 deletions(-)

diff --git a/airflow-core/src/airflow/ui/src/queries/dagListQueryKeys.test.tsx 
b/airflow-core/src/airflow/ui/src/queries/dagListQueryKeys.test.tsx
new file mode 100644
index 00000000000..b91eeff3738
--- /dev/null
+++ b/airflow-core/src/airflow/ui/src/queries/dagListQueryKeys.test.tsx
@@ -0,0 +1,134 @@
+/*!
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+import { QueryClient } from "@tanstack/react-query";
+import { renderHook } from "@testing-library/react";
+import { afterEach, beforeEach, describe, expect, it, vi } from "vitest";
+
+import type * as OpenapiQueries from "openapi/queries";
+
+import { Wrapper } from "src/utils/Wrapper";
+
+import { useBulkClearDagRuns } from "./useBulkClearDagRuns";
+import { useBulkPatchDagRun } from "./useBulkPatchDagRun";
+import { useClearDagRun } from "./useClearRun";
+import { useClearTaskInstances } from "./useClearTaskInstances";
+import { useCreateBackfill } from "./useCreateBackfill";
+import { usePatchDagRun } from "./usePatchDagRun";
+import { useTrigger } from "./useTrigger";
+
+vi.mock("openapi/queries", async (importOriginal) => {
+  const actual = await importOriginal<typeof OpenapiQueries>();
+
+  return {
+    ...actual,
+    useBackfillServiceCreateBackfill: vi.fn(),
+    useDagRunServiceBulkDagRuns: vi.fn(),
+    useDagRunServiceClearDagRun: vi.fn(),
+    useDagRunServiceClearDagRuns: vi.fn(),
+    useDagRunServicePatchDagRun: vi.fn(),
+    useDagRunServiceTriggerDagRun: vi.fn(),
+    useTaskInstanceServicePostClearTaskInstances: vi.fn(),
+  };
+});
+
+const queries = await import("openapi/queries");
+
+type OnSuccess = (...args: Array<unknown>) => Promise<void>;
+
+const getOnSuccess = (generatedHook: unknown) =>
+  vi.mocked(generatedHook as (options: { onSuccess: OnSuccess }) => 
unknown).mock.calls.at(-1)?.[0].onSuccess;
+
+const dagRun = { dag_id: "dag", dag_run_id: "run" };
+
+describe.each([
+  {
+    args: [dagRun, { dagId: "dag", requestBody: { logical_date: null } }],
+    generatedHook: queries.useDagRunServiceTriggerDagRun,
+    operation: "triggering a Dag",
+    useMutation: () => useTrigger({ dagId: "dag", onSuccessConfirm: vi.fn() }),
+  },
+  {
+    args: [{ dag_id: "dag" }, { requestBody: { drain_dag: false } }],
+    generatedHook: queries.useBackfillServiceCreateBackfill,
+    operation: "creating a backfill",
+    useMutation: () => useCreateBackfill({ onSuccessConfirm: vi.fn() }),
+  },
+  {
+    args: [],
+    generatedHook: queries.useDagRunServicePatchDagRun,
+    operation: "marking a run",
+    useMutation: () => usePatchDagRun({ dagId: "dag", dagRunId: "run" }),
+  },
+  {
+    args: [{ update: { errors: [], success: ["dag.run"] } }],
+    generatedHook: queries.useDagRunServiceBulkDagRuns,
+    operation: "marking runs in bulk",
+    useMutation: () => useBulkPatchDagRun({ deselectKeys: vi.fn(), 
onSuccessConfirm: vi.fn() }),
+  },
+  {
+    args: [],
+    generatedHook: queries.useDagRunServiceClearDagRun,
+    operation: "clearing a run",
+    useMutation: () => useClearDagRun({ dagId: "dag", dagRunId: "run", 
onSuccessConfirm: vi.fn() }),
+  },
+  {
+    args: [{ dag_runs: [dagRun], total_entries: 1 }],
+    generatedHook: queries.useDagRunServiceClearDagRuns,
+    operation: "clearing runs in bulk",
+    useMutation: () => useBulkClearDagRuns({ deselectKeys: vi.fn(), 
onSuccessConfirm: vi.fn() }),
+  },
+  {
+    args: [
+      { task_instances: [], total_entries: 0 },
+      { dagId: "dag", requestBody: { dag_run_id: "run" } },
+    ],
+    generatedHook: queries.useTaskInstanceServicePostClearTaskInstances,
+    operation: "clearing task instances",
+    useMutation: () => useClearTaskInstances({ dagRunId: "run", 
onSuccessConfirm: vi.fn() }),
+  },
+])("Dag cards after $operation", ({ args, generatedHook, useMutation }) => {
+  beforeEach(() => {
+    vi.mocked(generatedHook as () => unknown).mockReturnValue({
+      isPending: false,
+      mutate: vi.fn(),
+      reset: vi.fn(),
+    });
+  });
+  afterEach(() => vi.restoreAllMocks());
+
+  it("invalidates the Dag list and its run and task state counts", async () => 
{
+    const invalidateSpy = vi.spyOn(QueryClient.prototype, 
"invalidateQueries").mockResolvedValue();
+
+    renderHook(
+      () => {
+        useMutation();
+      },
+      { wrapper: Wrapper },
+    );
+    await getOnSuccess(generatedHook)?.(...args);
+
+    expect(invalidateSpy).toHaveBeenCalledWith({ queryKey: 
[queries.useDagServiceGetDagsUiKey] });
+    expect(invalidateSpy).toHaveBeenCalledWith({
+      queryKey: [queries.useDagServiceGetDagRunStateCountsUiKey],
+    });
+    expect(invalidateSpy).toHaveBeenCalledWith({
+      queryKey: [queries.useDagServiceGetRecentTaskInstanceStateCountsUiKey],
+    });
+  });
+});
diff --git a/airflow-core/src/airflow/ui/src/queries/gridViewQueryKeys.ts 
b/airflow-core/src/airflow/ui/src/queries/gridViewQueryKeys.ts
index b975ef9c0d5..21b2bd2b844 100644
--- a/airflow-core/src/airflow/ui/src/queries/gridViewQueryKeys.ts
+++ b/airflow-core/src/airflow/ui/src/queries/gridViewQueryKeys.ts
@@ -19,7 +19,10 @@
 import {
   UseDagRunServiceGetDagRunsKeyFn,
   UseDagServiceGetDagDetailsKeyFn,
+  useDagServiceGetDagRunStateCountsUiKey,
+  useDagServiceGetDagsUiKey,
   UseDagServiceGetLatestRunInfoKeyFn,
+  useDagServiceGetRecentTaskInstanceStateCountsUiKey,
   UseGridServiceGetDagStructureKeyFn,
   UseGridServiceGetGridRunsKeyFn,
   UseGridServiceGetLoopHistoryKeyFn,
@@ -43,6 +46,13 @@ export const gridQueryKeys = (dagId: string) =>
     UseTaskInstanceServiceGetTaskInstancesKeyFn({ dagId, dagRunId: "~" }, [{ 
dagId, dagRunId: "~" }]),
   ] as const;
 
+/** Prefix keys for the Dag cards on the Dags list, which a change to a Dag 
run leaves stale. */
+export const dagListQueryKeys = [
+  [useDagServiceGetDagsUiKey],
+  [useDagServiceGetDagRunStateCountsUiKey],
+  [useDagServiceGetRecentTaskInstanceStateCountsUiKey],
+] as const;
+
 /** Prefix keys for per-attempt TI caches that become stale after any 
mutation. */
 export const tiPerAttemptQueryKeys = [
   [useTaskInstanceServiceGetLogKey],
diff --git a/airflow-core/src/airflow/ui/src/queries/useBulkClearDagRuns.ts 
b/airflow-core/src/airflow/ui/src/queries/useBulkClearDagRuns.ts
index 0bf20879641..03a29635fff 100644
--- a/airflow-core/src/airflow/ui/src/queries/useBulkClearDagRuns.ts
+++ b/airflow-core/src/airflow/ui/src/queries/useBulkClearDagRuns.ts
@@ -32,7 +32,7 @@ import type { ClearDagRunsResponse, DAGRunResponse } from 
"openapi/requests/type
 
 import { toaster } from "src/system-components";
 
-import { gridQueryKeys, tiPerAttemptQueryKeys } from "./gridViewQueryKeys";
+import { dagListQueryKeys, gridQueryKeys, tiPerAttemptQueryKeys } from 
"./gridViewQueryKeys";
 import { useBulkClearDagRunsDryRunKey } from "./useBulkClearDagRunsDryRun";
 import { useClearDagRunDryRunKey } from "./useClearDagRunDryRun";
 
@@ -62,6 +62,7 @@ export const useBulkClearDagRuns = ({ deselectKeys, 
onSuccessConfirm }: Props) =
       [useTaskInstanceServiceGetMappedTaskInstanceKey],
       [useBulkClearDagRunsDryRunKey],
       ...tiPerAttemptQueryKeys,
+      ...dagListQueryKeys,
       ...[...dagIds].flatMap((dagId) => [...gridQueryKeys(dagId), 
[useClearDagRunDryRunKey, dagId]]),
       ...clearedRuns.flatMap((dagRun) => [
         UseDagRunServiceGetDagRunKeyFn({ dagId: dagRun.dag_id, dagRunId: 
dagRun.dag_run_id }),
diff --git a/airflow-core/src/airflow/ui/src/queries/useBulkDeleteDagRuns.ts 
b/airflow-core/src/airflow/ui/src/queries/useBulkDeleteDagRuns.ts
index ced786d71c4..12da451d6b6 100644
--- a/airflow-core/src/airflow/ui/src/queries/useBulkDeleteDagRuns.ts
+++ b/airflow-core/src/airflow/ui/src/queries/useBulkDeleteDagRuns.ts
@@ -24,16 +24,13 @@ import { useTranslation } from "react-i18next";
 import {
   useDagRunServiceBulkDagRuns,
   useDagRunServiceGetDagRunsKey,
-  useDagServiceGetDagRunStateCountsUiKey,
-  useDagServiceGetDagsUiKey,
-  useDagServiceGetRecentTaskInstanceStateCountsUiKey,
   useTaskInstanceServiceGetTaskInstancesKey,
 } from "openapi/queries";
 import type { BulkBody_BulkDAGRunBody_, BulkResponse } from 
"openapi/requests/types.gen";
 
 import { toaster } from "src/system-components";
 
-import { gridQueryKeys, tiPerAttemptQueryKeys } from "./gridViewQueryKeys";
+import { dagListQueryKeys, gridQueryKeys, tiPerAttemptQueryKeys } from 
"./gridViewQueryKeys";
 
 type Props = {
   readonly deselectKeys: (keys: Array<string>) => void;
@@ -48,11 +45,9 @@ export const useBulkDeleteDagRuns = ({ deselectKeys, 
onSuccessConfirm }: Props)
   const onSuccess = async (responseData: BulkResponse) => {
     await Promise.all([
       queryClient.invalidateQueries({ queryKey: 
[useDagRunServiceGetDagRunsKey] }),
-      queryClient.invalidateQueries({ queryKey: [useDagServiceGetDagsUiKey] }),
-      queryClient.invalidateQueries({ queryKey: 
[useDagServiceGetDagRunStateCountsUiKey] }),
-      queryClient.invalidateQueries({ queryKey: 
[useDagServiceGetRecentTaskInstanceStateCountsUiKey] }),
       queryClient.invalidateQueries({ queryKey: 
[useTaskInstanceServiceGetTaskInstancesKey] }),
       ...tiPerAttemptQueryKeys.map((key) => queryClient.invalidateQueries({ 
queryKey: key })),
+      ...dagListQueryKeys.map((key) => queryClient.invalidateQueries({ 
queryKey: key })),
       ...[...affectedDagIds.current].flatMap((dagId) =>
         gridQueryKeys(dagId).map((key) => queryClient.invalidateQueries({ 
queryKey: key })),
       ),
diff --git a/airflow-core/src/airflow/ui/src/queries/useBulkPatchDagRun.ts 
b/airflow-core/src/airflow/ui/src/queries/useBulkPatchDagRun.ts
index d884aef7211..e5200ec7c7c 100644
--- a/airflow-core/src/airflow/ui/src/queries/useBulkPatchDagRun.ts
+++ b/airflow-core/src/airflow/ui/src/queries/useBulkPatchDagRun.ts
@@ -34,7 +34,7 @@ import type { BulkBody_BulkDAGRunBody_, BulkResponse } from 
"openapi/requests/ty
 
 import { toaster } from "src/system-components";
 
-import { gridQueryKeys, tiPerAttemptQueryKeys } from "./gridViewQueryKeys";
+import { dagListQueryKeys, gridQueryKeys, tiPerAttemptQueryKeys } from 
"./gridViewQueryKeys";
 import { useClearDagRunDryRunKey } from "./useClearDagRunDryRun";
 
 type Props = {
@@ -50,7 +50,7 @@ export const useBulkPatchDagRun = ({ deselectKeys, 
onSuccessConfirm }: Props) =>
   const onSuccess = async (responseData: BulkResponse) => {
     // Marking runs changes run + task instance states, so invalidate the same 
surfaces the
     // single-run mark (usePatchDagRun) does: run/TI lists, run + 
single/mapped TI details, gantt,
-    // grid, and the clear dry-run preview.
+    // grid, the Dags list cards and the clear dry-run preview.
     await Promise.all([
       queryClient.invalidateQueries({ queryKey: 
[useDagRunServiceGetDagRunsKey] }),
       queryClient.invalidateQueries({ queryKey: [useDagRunServiceGetDagRunKey] 
}),
@@ -59,6 +59,7 @@ export const useBulkPatchDagRun = ({ deselectKeys, 
onSuccessConfirm }: Props) =>
       queryClient.invalidateQueries({ queryKey: 
[useTaskInstanceServiceGetMappedTaskInstanceKey] }),
       queryClient.invalidateQueries({ queryKey: 
[useGanttServiceGetGanttDataKey] }),
       ...tiPerAttemptQueryKeys.map((key) => queryClient.invalidateQueries({ 
queryKey: key })),
+      ...dagListQueryKeys.map((key) => queryClient.invalidateQueries({ 
queryKey: key })),
       ...[...affectedDagIds.current].flatMap((dagId) => [
         ...gridQueryKeys(dagId).map((key) => queryClient.invalidateQueries({ 
queryKey: key })),
         queryClient.invalidateQueries({ queryKey: [useClearDagRunDryRunKey, 
dagId] }),
diff --git a/airflow-core/src/airflow/ui/src/queries/useClearRun.ts 
b/airflow-core/src/airflow/ui/src/queries/useClearRun.ts
index 4cc5478d017..2ec29fc0421 100644
--- a/airflow-core/src/airflow/ui/src/queries/useClearRun.ts
+++ b/airflow-core/src/airflow/ui/src/queries/useClearRun.ts
@@ -29,7 +29,7 @@ import {
 
 import { createErrorToaster } from "src/utils";
 
-import { gridQueryKeys, tiPerAttemptQueryKeys } from "./gridViewQueryKeys";
+import { dagListQueryKeys, gridQueryKeys, tiPerAttemptQueryKeys } from 
"./gridViewQueryKeys";
 import { useClearDagRunDryRunKey } from "./useClearDagRunDryRun";
 
 export const useClearDagRun = ({
@@ -63,6 +63,7 @@ export const useClearDagRun = ({
       [useClearDagRunDryRunKey, dagId],
       UseGanttServiceGetGanttDataKeyFn({ dagId, runId: dagRunId }),
       ...tiPerAttemptQueryKeys,
+      ...dagListQueryKeys,
     ];
 
     await Promise.all([
diff --git a/airflow-core/src/airflow/ui/src/queries/useClearTaskInstances.ts 
b/airflow-core/src/airflow/ui/src/queries/useClearTaskInstances.ts
index 5dfc76dd10e..b4e3e74050b 100644
--- a/airflow-core/src/airflow/ui/src/queries/useClearTaskInstances.ts
+++ b/airflow-core/src/airflow/ui/src/queries/useClearTaskInstances.ts
@@ -33,7 +33,7 @@ import type { ClearTaskInstancesBody, 
TaskInstanceCollectionResponse } from "ope
 
 import { toaster } from "src/system-components";
 
-import { gridQueryKeys, tiPerAttemptQueryKeys } from "./gridViewQueryKeys";
+import { dagListQueryKeys, gridQueryKeys, tiPerAttemptQueryKeys } from 
"./gridViewQueryKeys";
 import { useClearTaskInstancesDryRunKey } from "./useClearTaskInstancesDryRun";
 import { usePatchTaskInstanceDryRunKey } from "./usePatchTaskInstanceDryRun";
 
@@ -103,6 +103,7 @@ export const useClearTaskInstances = ({
       [usePatchTaskInstanceDryRunKey, dagId, runId],
       UseGanttServiceGetGanttDataKeyFn({ dagId, runId }),
       ...tiPerAttemptQueryKeys,
+      ...dagListQueryKeys,
     ];
 
     await Promise.all([
diff --git a/airflow-core/src/airflow/ui/src/queries/useCreateBackfill.test.tsx 
b/airflow-core/src/airflow/ui/src/queries/useCreateBackfill.test.tsx
index 9a7122d19c5..2abc9a8019d 100644
--- a/airflow-core/src/airflow/ui/src/queries/useCreateBackfill.test.tsx
+++ b/airflow-core/src/airflow/ui/src/queries/useCreateBackfill.test.tsx
@@ -33,12 +33,8 @@ vi.mock("openapi/queries", async (importOriginal) => {
   return { ...actual, useBackfillServiceCreateBackfill: vi.fn() };
 });
 
-const {
-  useBackfillServiceCreateBackfill,
-  UseDagServiceGetDagDetailsKeyFn,
-  UseDagServiceGetDagKeyFn,
-  useDagServiceGetDagsUiKey,
-} = await import("openapi/queries");
+const { useBackfillServiceCreateBackfill, UseDagServiceGetDagDetailsKeyFn, 
UseDagServiceGetDagKeyFn } =
+  await import("openapi/queries");
 
 const DAG_ID = "paused_dag";
 const mutate = vi.fn();
@@ -87,7 +83,6 @@ describe("useCreateBackfill", () => {
     for (const queryKey of [
       UseDagServiceGetDagKeyFn({ dagId: DAG_ID }, [{ dagId: DAG_ID }]),
       UseDagServiceGetDagDetailsKeyFn({ dagId: DAG_ID }, [{ dagId: DAG_ID }]),
-      [useDagServiceGetDagsUiKey],
     ]) {
       if (drainDag) {
         expect(invalidateSpy).toHaveBeenCalledWith({ queryKey });
diff --git a/airflow-core/src/airflow/ui/src/queries/useCreateBackfill.ts 
b/airflow-core/src/airflow/ui/src/queries/useCreateBackfill.ts
index d03b105ef3f..35cebf3224c 100644
--- a/airflow-core/src/airflow/ui/src/queries/useCreateBackfill.ts
+++ b/airflow-core/src/airflow/ui/src/queries/useCreateBackfill.ts
@@ -26,12 +26,13 @@ import {
   UseDagServiceGetDagKeyFn,
   useBackfillServiceCreateBackfill,
   useBackfillServiceListBackfillsUiKey,
-  useDagServiceGetDagsUiKey,
 } from "openapi/queries";
 import type { BackfillResponse, CreateBackfillData } from 
"openapi/requests/types.gen";
 
 import { toaster } from "src/system-components";
 
+import { dagListQueryKeys } from "src/queries/gridViewQueryKeys";
+
 export const useCreateBackfill = ({ onSuccessConfirm }: { onSuccessConfirm: () 
=> void }) => {
   const [dateValidationError, setDateValidationError] = 
useState<unknown>(undefined);
   const queryClient = useQueryClient();
@@ -43,12 +44,11 @@ export const useCreateBackfill = ({ onSuccessConfirm }: { 
onSuccessConfirm: () =
       ? [
           UseDagServiceGetDagKeyFn({ dagId }, [{ dagId }]),
           UseDagServiceGetDagDetailsKeyFn({ dagId }, [{ dagId }]),
-          [useDagServiceGetDagsUiKey],
         ]
       : [];
 
     await Promise.all(
-      [[useBackfillServiceListBackfillsUiKey], ...drainKeys].map((queryKey) =>
+      [[useBackfillServiceListBackfillsUiKey], ...dagListQueryKeys, 
...drainKeys].map((queryKey) =>
         queryClient.invalidateQueries({ queryKey }),
       ),
     );
diff --git a/airflow-core/src/airflow/ui/src/queries/useDeleteDagRun.ts 
b/airflow-core/src/airflow/ui/src/queries/useDeleteDagRun.ts
index 0cb9fc84135..43fdaa2d661 100644
--- a/airflow-core/src/airflow/ui/src/queries/useDeleteDagRun.ts
+++ b/airflow-core/src/airflow/ui/src/queries/useDeleteDagRun.ts
@@ -23,9 +23,6 @@ import {
   useDagRunServiceDeleteDagRun,
   useDagRunServiceGetDagRunsKey,
   UseDagRunServiceGetDagRunKeyFn,
-  useDagServiceGetDagRunStateCountsUiKey,
-  useDagServiceGetDagsUiKey,
-  useDagServiceGetRecentTaskInstanceStateCountsUiKey,
   UseGanttServiceGetGanttDataKeyFn,
   useTaskInstanceServiceGetHitlDetailsKey,
   useTaskInstanceServiceGetMappedTaskInstanceKey,
@@ -34,7 +31,7 @@ import {
 
 import { toaster } from "src/system-components";
 
-import { gridQueryKeys, tiPerAttemptQueryKeys } from 
"src/queries/gridViewQueryKeys";
+import { dagListQueryKeys, gridQueryKeys, tiPerAttemptQueryKeys } from 
"src/queries/gridViewQueryKeys";
 import { createErrorToaster } from "src/utils";
 
 type DeleteDagRunParams = {
@@ -62,9 +59,7 @@ export const useDeleteDagRun = ({ dagId, dagRunId, 
onSuccessConfirm }: DeleteDag
     const queryKeys = [
       UseDagRunServiceGetDagRunKeyFn({ dagId, dagRunId }),
       [useDagRunServiceGetDagRunsKey],
-      [useDagServiceGetDagsUiKey],
-      [useDagServiceGetDagRunStateCountsUiKey],
-      [useDagServiceGetRecentTaskInstanceStateCountsUiKey],
+      ...dagListQueryKeys,
       [useTaskInstanceServiceGetTaskInstancesKey],
       [useTaskInstanceServiceGetHitlDetailsKey],
       UseGanttServiceGetGanttDataKeyFn({ dagId, runId: dagRunId }),
diff --git a/airflow-core/src/airflow/ui/src/queries/usePatchDagRun.ts 
b/airflow-core/src/airflow/ui/src/queries/usePatchDagRun.ts
index 1db0f18c446..1faaacea810 100644
--- a/airflow-core/src/airflow/ui/src/queries/usePatchDagRun.ts
+++ b/airflow-core/src/airflow/ui/src/queries/usePatchDagRun.ts
@@ -31,7 +31,7 @@ import {
 
 import { createErrorToaster } from "src/utils";
 
-import { gridQueryKeys, tiPerAttemptQueryKeys } from "./gridViewQueryKeys";
+import { dagListQueryKeys, gridQueryKeys, tiPerAttemptQueryKeys } from 
"./gridViewQueryKeys";
 import { useClearDagRunDryRunKey } from "./useClearDagRunDryRun";
 
 export const usePatchDagRun = ({
@@ -67,6 +67,7 @@ export const usePatchDagRun = ({
       [useClearDagRunDryRunKey, dagId],
       UseGanttServiceGetGanttDataKeyFn({ dagId, runId: dagRunId }),
       ...tiPerAttemptQueryKeys,
+      ...dagListQueryKeys,
     ];
 
     await Promise.all([
diff --git a/airflow-core/src/airflow/ui/src/queries/useTrigger.ts 
b/airflow-core/src/airflow/ui/src/queries/useTrigger.ts
index eccb38608fd..a653ad3b30e 100644
--- a/airflow-core/src/airflow/ui/src/queries/useTrigger.ts
+++ b/airflow-core/src/airflow/ui/src/queries/useTrigger.ts
@@ -20,11 +20,7 @@ import { useQueryClient } from "@tanstack/react-query";
 import { useTranslation } from "react-i18next";
 import { useLocation, useNavigate, useParams } from "react-router-dom";
 
-import {
-  UseDagServiceGetDagKeyFn,
-  useDagRunServiceTriggerDagRun,
-  useDagServiceGetDagsUiKey,
-} from "openapi/queries";
+import { UseDagServiceGetDagKeyFn, useDagRunServiceTriggerDagRun } from 
"openapi/queries";
 import type { TriggerDagRunData, TriggerDagRunResponse } from 
"openapi/requests/types.gen";
 
 import { toaster } from "src/system-components";
@@ -32,7 +28,7 @@ import { toaster } from "src/system-components";
 import type { DagRunTriggerParams } from "src/components/TriggerDag/types";
 
 import { SearchParamsKeys } from "src/constants/searchParams";
-import { gridQueryKeys } from "src/queries/gridViewQueryKeys";
+import { dagListQueryKeys, gridQueryKeys } from 
"src/queries/gridViewQueryKeys";
 import { createErrorToaster, toNullablePartitionKey } from "src/utils";
 
 export const useTrigger = ({ dagId, onSuccessConfirm }: { dagId: string; 
onSuccessConfirm: () => void }) => {
@@ -47,12 +43,11 @@ export const useTrigger = ({ dagId, onSuccessConfirm }: { 
dagId: string; onSucce
       ? [UseDagServiceGetDagKeyFn({ dagId }, [{ dagId }])]
       : [];
 
-    await Promise.all([
-      queryClient.invalidateQueries({ queryKey: [useDagServiceGetDagsUiKey] }),
-      ...[...gridQueryKeys(dagId), ...drainKeys].map((key) =>
+    await Promise.all(
+      [...dagListQueryKeys, ...gridQueryKeys(dagId), ...drainKeys].map((key) =>
         queryClient.invalidateQueries({ queryKey: key }),
       ),
-    ]);
+    );
 
     toaster.create({
       description: translate("triggerDag.toaster.success.description"),

Reply via email to