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"),