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 <[email protected]>
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