1- import { useState , useMemo } from "react" ;
1+ import { useState , useMemo , type CSSProperties } from "react" ;
22import { cn } from "@/lib/utils" ;
33import {
44 Table ,
@@ -35,13 +35,21 @@ export interface ItemGridProp<T = unknown> {
3535 onRowClick ?: ( item : TypedAgentData < T > ) => void ;
3636 // Other configurations
3737 defaultPageSize ?: number ;
38+ // Optional root filter passed through directly to the search API
39+ filter ?: Record < string , FilterOperation > ;
40+ // Styling (outermost container only)
41+ className ?: string ;
42+ style ?: CSSProperties ;
3843}
3944
4045// Main Business Component
4146export function ItemGrid < T = unknown > ( {
4247 customColumns = [ ] ,
4348 onRowClick,
4449 defaultPageSize = 20 ,
50+ filter,
51+ className,
52+ style,
4553} : ItemGridProp < T > ) {
4654 const [ paginationState , setPaginationState ] = useState < PaginationState > ( {
4755 page : 0 ,
@@ -54,7 +62,7 @@ export function ItemGrid<T = unknown>({
5462 direction : "desc" ,
5563 } ) ;
5664
57- const [ filters , setFilters ] = useState < Record < string , string [ ] > > ( { } ) ;
65+ const [ uiFilters , setUiFilters ] = useState < Record < string , string [ ] > > ( { } ) ;
5866
5967 // Generate final columns array
6068 const columns = useMemo ( ( ) => {
@@ -67,17 +75,19 @@ export function ItemGrid<T = unknown>({
6775 } , [ customColumns ] ) ;
6876
6977 // Convert frontend filter state to API format
70- const apiFilters = useMemo ( ( ) => {
71- const result : Record < string , FilterOperation > = { } ;
78+ const searchFilter = useMemo ( ( ) => {
79+ const result : Record < string , FilterOperation > = {
80+ ...( filter || { } ) ,
81+ } ;
7282
73- Object . entries ( filters ) . forEach ( ( [ columnKey , filterValues ] ) => {
83+ Object . entries ( uiFilters ) . forEach ( ( [ columnKey , filterValues ] ) => {
7484 if ( filterValues . length > 0 ) {
7585 result [ columnKey ] = { includes : filterValues } ;
7686 }
7787 } ) ;
7888
7989 return result ;
80- } , [ filters ] ) ;
90+ } , [ uiFilters , filter ] ) ;
8191
8292 // Convert frontend sort state to API format
8393 const apiSort = useMemo ( ( ) => {
@@ -91,7 +101,7 @@ export function ItemGrid<T = unknown>({
91101 } , [ sortState ] ) ;
92102
93103 const { data, loading, error, totalSize, deleteItem, fetchData } =
94- useItemGridData < T > ( paginationState , apiFilters , apiSort ) ;
104+ useItemGridData < T > ( paginationState , searchFilter , apiSort ) ;
95105
96106 // Create hooks object for passing to renderCell
97107 const hooks = useMemo (
@@ -122,7 +132,7 @@ export function ItemGrid<T = unknown>({
122132
123133 // Handle filtering
124134 const handleFilterChange = ( columnKey : string , values : string [ ] ) => {
125- setFilters ( ( prev ) => ( {
135+ setUiFilters ( ( prev ) => ( {
126136 ...prev ,
127137 [ columnKey ] : values ,
128138 } ) ) ;
@@ -168,7 +178,7 @@ export function ItemGrid<T = unknown>({
168178 }
169179
170180 return (
171- < div className = "w-full space-y-4" >
181+ < div className = { cn ( "w-full space-y-4" , className ) } style = { style } >
172182 < div className = "rounded-md border" >
173183 < Table className = "table-fixed" >
174184 < TableHeader >
@@ -186,7 +196,7 @@ export function ItemGrid<T = unknown>({
186196 sortState = { sortState }
187197 onSort = { handleSort }
188198 filterOptions = { getFilterOptions ( column . key ) }
189- selectedFilters = { filters [ column . key ] }
199+ selectedFilters = { uiFilters [ column . key ] }
190200 onFilterChange = { handleFilterChange }
191201 />
192202 </ TableHead >
0 commit comments