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 9c4b81d71f Add support to filter by last dagrun state in UI. (#42779)
9c4b81d71f is described below

commit 9c4b81d71f3caee3a3b1c6d9c626ee5d16f0db7c
Author: Karthikeyan Singaravelan <[email protected]>
AuthorDate: Wed Oct 9 13:45:14 2024 +0530

    Add support to filter by last dagrun state in UI. (#42779)
    
    * Add support to filter by last dagrun state in UI.
    
    * Fix lint errors.
    
    * Fix lint errors.
    
    * Fix PR comments over null checks and query parameter to be 
last_dag_run_state.
---
 airflow/ui/src/pages/DagsList/DagsFilters.tsx | 55 +++++++++++++++++++++++++--
 airflow/ui/src/pages/DagsList/DagsList.tsx    |  5 ++-
 2 files changed, 55 insertions(+), 5 deletions(-)

diff --git a/airflow/ui/src/pages/DagsList/DagsFilters.tsx 
b/airflow/ui/src/pages/DagsList/DagsFilters.tsx
index cb2be8322e..6316816f48 100644
--- a/airflow/ui/src/pages/DagsList/DagsFilters.tsx
+++ b/airflow/ui/src/pages/DagsList/DagsFilters.tsx
@@ -25,11 +25,17 @@ import { useTableURLState } from 
"src/components/DataTable/useTableUrlState";
 import { QuickFilterButton } from "src/components/QuickFilterButton";
 
 const PAUSED_PARAM = "paused";
+const STATE_PARAM = "last_dag_run_state";
 
 export const DagsFilters = () => {
   const [searchParams, setSearchParams] = useSearchParams();
 
   const showPaused = searchParams.get(PAUSED_PARAM);
+  const state = searchParams.get(STATE_PARAM);
+  const isAll = state === null;
+  const isRunning = state === "running";
+  const isFailed = state === "failed";
+  const isSuccess = state === "success";
 
   const { setTableURLState, tableURLState } = useTableURLState();
   const { pagination, sorting } = tableURLState;
@@ -51,6 +57,23 @@ export const DagsFilters = () => {
       [pagination, searchParams, setSearchParams, setTableURLState, sorting],
     );
 
+  const handleStateChange: React.MouseEventHandler<HTMLButtonElement> =
+    useCallback(
+      ({ currentTarget: { value } }) => {
+        if (value === "all") {
+          searchParams.delete(STATE_PARAM);
+        } else {
+          searchParams.set(STATE_PARAM, value);
+        }
+        setSearchParams(searchParams);
+        setTableURLState({
+          pagination: { ...pagination, pageIndex: 0 },
+          sorting,
+        });
+      },
+      [pagination, searchParams, setSearchParams, setTableURLState, sorting],
+    );
+
   return (
     <HStack justifyContent="space-between">
       <HStack spacing={4}>
@@ -59,10 +82,34 @@ export const DagsFilters = () => {
             State:
           </Text>
           <HStack>
-            <QuickFilterButton isActive>All</QuickFilterButton>
-            <QuickFilterButton isDisabled>Failed</QuickFilterButton>
-            <QuickFilterButton isDisabled>Running</QuickFilterButton>
-            <QuickFilterButton isDisabled>Successful</QuickFilterButton>
+            <QuickFilterButton
+              isActive={isAll}
+              onClick={handleStateChange}
+              value="all"
+            >
+              All
+            </QuickFilterButton>
+            <QuickFilterButton
+              isActive={isFailed}
+              onClick={handleStateChange}
+              value="failed"
+            >
+              Failed
+            </QuickFilterButton>
+            <QuickFilterButton
+              isActive={isRunning}
+              onClick={handleStateChange}
+              value="running"
+            >
+              Running
+            </QuickFilterButton>
+            <QuickFilterButton
+              isActive={isSuccess}
+              onClick={handleStateChange}
+              value="success"
+            >
+              Successful
+            </QuickFilterButton>
           </HStack>
         </Box>
         <Box>
diff --git a/airflow/ui/src/pages/DagsList/DagsList.tsx 
b/airflow/ui/src/pages/DagsList/DagsList.tsx
index 7b87e8d253..178663baf7 100644
--- a/airflow/ui/src/pages/DagsList/DagsList.tsx
+++ b/airflow/ui/src/pages/DagsList/DagsList.tsx
@@ -29,7 +29,7 @@ import { type ChangeEventHandler, useCallback, useState } 
from "react";
 import { useSearchParams } from "react-router-dom";
 
 import { useDagServiceGetDags } from "openapi/queries";
-import type { DAGResponse } from "openapi/requests/types.gen";
+import type { DAGResponse, DagRunState } from "openapi/requests/types.gen";
 import { DataTable } from "src/components/DataTable";
 import { ToggleTableDisplay } from 
"src/components/DataTable/ToggleTableDisplay";
 import type { CardDef } from "src/components/DataTable/types";
@@ -97,12 +97,14 @@ const cardDef: CardDef<DAGResponse> = {
 };
 
 const PAUSED_PARAM = "paused";
+const STATE_PARAM = "last_dag_run_state";
 
 export const DagsList = () => {
   const [searchParams] = useSearchParams();
   const [display, setDisplay] = useState<"card" | "table">("card");
 
   const showPaused = searchParams.get(PAUSED_PARAM);
+  const lastDagRunState = searchParams.get(STATE_PARAM) as DagRunState;
 
   const { setTableURLState, tableURLState } = useTableURLState();
   const { pagination, sorting } = tableURLState;
@@ -112,6 +114,7 @@ export const DagsList = () => {
   const orderBy = sort ? `${sort.desc ? "-" : ""}${sort.id}` : undefined;
 
   const { data, isFetching, isLoading } = useDagServiceGetDags({
+    lastDagRunState,
     limit: pagination.pageSize,
     offset: pagination.pageIndex * pagination.pageSize,
     onlyActive: true,

Reply via email to