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 1766a9e0d9a Use FilterBar for Asset Event filters (#55522) 1766a9e0d9a is described below commit 1766a9e0d9a42707c4af728f90429c28640efe87 Author: Brent Bovenzi <br...@astronomer.io> AuthorDate: Thu Sep 11 12:44:32 2025 -0600 Use FilterBar for Asset Event filters (#55522) --- .../ui/src/components/Assets/AssetEventsFilter.tsx | 107 +++++---------------- .../src/airflow/ui/src/constants/filterConfigs.tsx | 10 ++ .../src/airflow/ui/src/utils/useFiltersHandler.ts | 2 + 3 files changed, 36 insertions(+), 83 deletions(-) diff --git a/airflow-core/src/airflow/ui/src/components/Assets/AssetEventsFilter.tsx b/airflow-core/src/airflow/ui/src/components/Assets/AssetEventsFilter.tsx index bfa46c9b7df..ceda8443c08 100644 --- a/airflow-core/src/airflow/ui/src/components/Assets/AssetEventsFilter.tsx +++ b/airflow-core/src/airflow/ui/src/components/Assets/AssetEventsFilter.tsx @@ -16,96 +16,37 @@ * specific language governing permissions and limitations * under the License. */ -import { VStack, HStack, Box, Text, Button } from "@chakra-ui/react"; -import { useCallback, useMemo, useState } from "react"; -import { useTranslation } from "react-i18next"; -import { LuX } from "react-icons/lu"; -import { useSearchParams } from "react-router-dom"; +import { useMemo } from "react"; -import { DateTimeInput } from "src/components/DateTimeInput"; -import { SearchBar } from "src/components/SearchBar"; +import { FilterBar } from "src/components/FilterBar"; import { SearchParamsKeys } from "src/constants/searchParams"; +import { useFiltersHandler, type FilterableSearchParamsKeys } from "src/utils/useFiltersHandler"; -const { DAG_ID, END_DATE, START_DATE, TASK_ID } = SearchParamsKeys; -const filterKeys = [START_DATE, END_DATE, DAG_ID, TASK_ID]; +const FILTER_KEYS: Array<FilterableSearchParamsKeys> = [ + SearchParamsKeys.START_DATE, + SearchParamsKeys.END_DATE, + SearchParamsKeys.DAG_ID, + SearchParamsKeys.TASK_ID, +]; export const AssetEventsFilter = () => { - const { t: translate } = useTranslation("common"); - const [searchParams, setSearchParams] = useSearchParams(); - const startDate = searchParams.get(START_DATE) ?? ""; - const endDate = searchParams.get(END_DATE) ?? ""; - const dagId = searchParams.get(DAG_ID) ?? ""; - const taskId = searchParams.get(TASK_ID) ?? ""; - const [resetKey, setResetKey] = useState(0); - const handleFilterChange = useCallback( - (paramKey: string) => (value: string) => { - if (value === "") { - searchParams.delete(paramKey); - } else { - searchParams.set(paramKey, value); + const { filterConfigs, handleFiltersChange, searchParams } = useFiltersHandler(FILTER_KEYS); + + const initialValues = useMemo(() => { + const values: Record<string, string> = {}; + + FILTER_KEYS.forEach((key) => { + const value = searchParams.get(key); + + if (value !== null && value.trim() !== "") { + values[key] = value; } - setSearchParams(searchParams); - }, - [searchParams, setSearchParams], - ); - const filterCount = useMemo( - () => filterKeys.reduce((acc, key) => (searchParams.get(key) === null ? acc : acc + 1), 0), - [searchParams], - ); - const handleResetFilters = useCallback(() => { - filterKeys.forEach((key) => searchParams.delete(key)); - setSearchParams(searchParams); - setResetKey((prev) => prev + 1); - }, [searchParams, setSearchParams]); + }); + + return values; + }, [searchParams]); return ( - <VStack align="start" gap={4} paddingY="4px"> - <HStack flexWrap="wrap" gap={4}> - <Box w="200px"> - <Text fontSize="xs">{translate("common:table.from")}</Text> - <DateTimeInput - onChange={(event) => handleFilterChange(START_DATE)(event.target.value)} - value={startDate} - /> - </Box> - <Box w="200px"> - <Text fontSize="xs">{translate("common:table.to")}</Text> - <DateTimeInput - onChange={(event) => handleFilterChange(END_DATE)(event.target.value)} - value={endDate} - /> - </Box> - <Box w="200px"> - <Text fontSize="xs">{translate("common:filters.dagDisplayNamePlaceholder")}</Text> - <SearchBar - defaultValue={dagId} - hideAdvanced - hotkeyDisabled={true} - key={`dag-id-${resetKey}`} - onChange={handleFilterChange(DAG_ID)} - placeHolder={translate("common:filters.dagDisplayNamePlaceholder")} - /> - </Box> - <Box w="200px"> - <Text fontSize="xs">{translate("common:filters.taskIdPlaceholder")}</Text> - <SearchBar - defaultValue={taskId} - hideAdvanced - hotkeyDisabled={true} - key={`task-id-${resetKey}`} - onChange={handleFilterChange(TASK_ID)} - placeHolder={translate("common:filters.taskIdPlaceholder")} - /> - </Box> - <Box alignSelf="end"> - {filterCount > 0 && ( - <Button onClick={handleResetFilters} size="md" variant="outline"> - <LuX /> - {translate("common:table.filterReset", { count: filterCount })} - </Button> - )} - </Box> - </HStack> - </VStack> + <FilterBar configs={filterConfigs} initialValues={initialValues} onFiltersChange={handleFiltersChange} /> ); }; diff --git a/airflow-core/src/airflow/ui/src/constants/filterConfigs.tsx b/airflow-core/src/airflow/ui/src/constants/filterConfigs.tsx index 5bf8c74a832..0dc09b1fd55 100644 --- a/airflow-core/src/airflow/ui/src/constants/filterConfigs.tsx +++ b/airflow-core/src/airflow/ui/src/constants/filterConfigs.tsx @@ -59,6 +59,11 @@ export const useFilterConfigs = () => { label: translate("common:dagId"), type: FilterTypes.TEXT, }, + [SearchParamsKeys.END_DATE]: { + icon: <MdDateRange />, + label: translate("common:table.to"), + type: FilterTypes.DATE, + }, [SearchParamsKeys.EVENT_TYPE]: { label: translate("browse:auditLog.filters.eventType"), type: FilterTypes.TEXT, @@ -106,6 +111,11 @@ export const useFilterConfigs = () => { label: translate("common:runId"), type: FilterTypes.TEXT, }, + [SearchParamsKeys.START_DATE]: { + icon: <MdDateRange />, + label: translate("common:table.from"), + type: FilterTypes.DATE, + }, [SearchParamsKeys.TASK_ID]: { hotkeyDisabled: true, icon: <TaskIcon />, diff --git a/airflow-core/src/airflow/ui/src/utils/useFiltersHandler.ts b/airflow-core/src/airflow/ui/src/utils/useFiltersHandler.ts index b6b16fe850a..241a6e9287a 100644 --- a/airflow-core/src/airflow/ui/src/utils/useFiltersHandler.ts +++ b/airflow-core/src/airflow/ui/src/utils/useFiltersHandler.ts @@ -29,6 +29,7 @@ export type FilterableSearchParamsKeys = | SearchParamsKeys.BEFORE | SearchParamsKeys.DAG_DISPLAY_NAME_PATTERN | SearchParamsKeys.DAG_ID + | SearchParamsKeys.END_DATE | SearchParamsKeys.EVENT_TYPE | SearchParamsKeys.KEY_PATTERN | SearchParamsKeys.LOGICAL_DATE_GTE @@ -38,6 +39,7 @@ export type FilterableSearchParamsKeys = | SearchParamsKeys.RUN_AFTER_LTE | SearchParamsKeys.RUN_ID | SearchParamsKeys.RUN_ID_PATTERN + | SearchParamsKeys.START_DATE | SearchParamsKeys.TASK_ID | SearchParamsKeys.TASK_ID_PATTERN | SearchParamsKeys.TRY_NUMBER