+
+ {colDef?.headerName ?? colDef?.field ?? 'Filter'}
+
+
+
+
+ );
+}
diff --git a/apps/statgpt-admin-frontend/src/components/GridView/CustomFilters/EnumSelectFloatingFilter.tsx b/apps/statgpt-admin-frontend/src/components/GridView/CustomFilters/EnumSelectFloatingFilter.tsx
new file mode 100644
index 0000000..b9a90da
--- /dev/null
+++ b/apps/statgpt-admin-frontend/src/components/GridView/CustomFilters/EnumSelectFloatingFilter.tsx
@@ -0,0 +1,42 @@
+'use client';
+
+import { EnumSelectFilterModel } from '@/src/models/grid';
+import { normalizeEnumValues } from '@/src/utils/client/grid';
+import React, { useMemo } from 'react';
+
+export interface EnumSelectFloatingFilterProps {
+ model: EnumSelectFilterModel;
+ onModelChange: (model: EnumSelectFilterModel) => void;
+ values: readonly string[];
+ allLabel?: string;
+ formatValue?: (v: string) => string;
+}
+
+export function EnumSelectFloatingFilter({
+ model,
+ onModelChange,
+ values,
+ allLabel = 'All',
+ formatValue,
+}: EnumSelectFloatingFilterProps) {
+ const options = useMemo(() => normalizeEnumValues(values), [values]);
+ const selected = model?.value ?? '';
+
+ return (
+