@@ -194,7 +194,7 @@ export const AutoQueryGrid = forwardRef<AutoQueryGridRef, AutoQueryGridComponent
194194 } , [ props . rowClass , props . tableStyle , editId ] )
195195
196196 const { metadataApi, typeOf, apiOf, filterDefinitions } = useMetadata ( )
197- const { invalidAccessMessage } = useAuth ( )
197+ const { invalidAccessMessage, user } = useAuth ( )
198198
199199 const typeName = useMemo ( ( ) => getTypeName ( props . type ) , [ props . type ] )
200200
@@ -285,13 +285,13 @@ export const AutoQueryGrid = forwardRef<AutoQueryGridRef, AutoQueryGridComponent
285285 return null
286286 } , [ metadataApi , props . apis , apis , apiOf ] )
287287
288- const invalidAccess = useMemo ( ( ) => apis . AnyQuery && invalidAccessMessage ( apis . AnyQuery ) , [ apis . AnyQuery , invalidAccessMessage ] )
289- const invalidCreateAccess = useMemo ( ( ) => apis . Create && invalidAccessMessage ( apis . Create ) , [ apis . Create , invalidAccessMessage ] )
290- const invalidUpdateAccess = useMemo ( ( ) => apis . AnyUpdate && invalidAccessMessage ( apis . AnyUpdate ) , [ apis . AnyUpdate , invalidAccessMessage ] )
288+ const invalidAccess = useMemo ( ( ) => apis . AnyQuery && invalidAccessMessage ( apis . AnyQuery ) , [ apis . AnyQuery , invalidAccessMessage , user ] )
289+ const invalidCreateAccess = useMemo ( ( ) => apis . Create && invalidAccessMessage ( apis . Create ) , [ apis . Create , invalidAccessMessage , user ] )
290+ const invalidUpdateAccess = useMemo ( ( ) => apis . AnyUpdate && invalidAccessMessage ( apis . AnyUpdate ) , [ apis . AnyUpdate , invalidAccessMessage , user ] )
291291
292- const canCreate = useMemo ( ( ) => canAccess ( apis . Create ) , [ apis . Create ] )
293- const canUpdate = useMemo ( ( ) => canAccess ( apis . AnyUpdate ) , [ apis . AnyUpdate ] )
294- const canDelete = useMemo ( ( ) => canAccess ( apis . Delete ) , [ apis . Delete ] )
292+ const canCreate = useMemo ( ( ) => canAccess ( apis . Create ) , [ apis . Create , user ] )
293+ const canUpdate = useMemo ( ( ) => canAccess ( apis . AnyUpdate ) , [ apis . AnyUpdate , user ] )
294+ const canDelete = useMemo ( ( ) => canAccess ( apis . Delete ) , [ apis . Delete , user ] )
295295
296296 // Helper functions
297297 const prefsCacheKey = useCallback ( ( ) =>
@@ -388,21 +388,6 @@ export const AutoQueryGrid = forwardRef<AutoQueryGridRef, AutoQueryGridComponent
388388 setShowFilters ( null )
389389 } , [ ] )
390390
391- const onFilterSave = useCallback ( async ( settings : ColumnSettings ) => {
392- let column = showFilters ?. column
393- if ( column ) {
394- column . settings = settings
395- storage . setItem ( columnCacheKey ( column . name ) , JSON . stringify ( column . settings ) )
396- await update ( )
397- }
398- setShowFilters ( null )
399- } , [ showFilters , columnCacheKey , storage ] )
400-
401- const filtersChanged = useCallback ( async ( column : Column ) => {
402- storage . setItem ( columnCacheKey ( column . name ) , JSON . stringify ( column . settings ) )
403- await update ( )
404- } , [ columnCacheKey , storage ] )
405-
406391 const saveApiPrefs = useCallback ( async ( prefs : ApiPrefs ) => {
407392 setShowQueryPrefs ( false )
408393 setApiPrefs ( prefs )
@@ -535,6 +520,39 @@ export const AutoQueryGrid = forwardRef<AutoQueryGridRef, AutoQueryGridComponent
535520 await update ( )
536521 } , [ update ] )
537522
523+ const onFilterSave = useCallback ( async ( settings : ColumnSettings ) => {
524+ let column = showFilters ?. column
525+ if ( column ) {
526+ // Update the column object directly first (for immediate use in createRequestArgs)
527+ column . settings = settings
528+ storage . setItem ( columnCacheKey ( column . name ) , JSON . stringify ( settings ) )
529+
530+ // Then update the columns state immutably to trigger re-render
531+ setColumns ( prevColumns => prevColumns . map ( col =>
532+ col . name === column . name
533+ ? { ...col , settings }
534+ : col
535+ ) )
536+
537+ await update ( )
538+ }
539+ setShowFilters ( null )
540+ } , [ showFilters , columnCacheKey , storage , update ] )
541+
542+ const filtersChanged = useCallback ( async ( column : Column ) => {
543+ // Column is already mutated by the caller, just save to storage
544+ storage . setItem ( columnCacheKey ( column . name ) , JSON . stringify ( column . settings ) )
545+
546+ // Update the columns state immutably to trigger re-render
547+ setColumns ( prevColumns => prevColumns . map ( col =>
548+ col . name === column . name
549+ ? { ...col , settings : column . settings }
550+ : col
551+ ) )
552+
553+ await update ( )
554+ } , [ columnCacheKey , storage , update ] )
555+
538556 const downloadCsv = useCallback ( ( ) => {
539557 const apiUrl = createApiUrl ( "csv" )
540558 copyText ( apiUrl )
@@ -559,14 +577,22 @@ export const AutoQueryGrid = forwardRef<AutoQueryGridRef, AutoQueryGridComponent
559577 } , [ createRequestArgs , apis , client . baseUrl ] )
560578
561579 const resetPreferences = useCallback ( async ( ) => {
580+ // Mutate columns directly first (for immediate use in createRequestArgs)
562581 columns . forEach ( column => {
563582 column . settings = { filters : [ ] }
564583 storage . removeItem ( columnCacheKey ( column . name ) )
565584 } )
585+
586+ // Then update columns state immutably to trigger re-render
587+ setColumns ( prevColumns => prevColumns . map ( column => ( {
588+ ...column ,
589+ settings : { filters : [ ] }
590+ } ) ) )
591+
566592 setApiPrefs ( { take : defaultTake } )
567593 storage . removeItem ( prefsCacheKey ( ) )
568594 await update ( )
569- } , [ columns , columnCacheKey , prefsCacheKey , storage , update ] )
595+ } , [ columns , columnCacheKey , prefsCacheKey , storage , update , defaultTake ] )
570596
571597 const onShowNewItem = useCallback ( ( ) => {
572598 setCreate ( true )
@@ -1060,15 +1086,32 @@ export const AutoQueryGrid = forwardRef<AutoQueryGridRef, AutoQueryGridComponent
10601086 headerTitles = { props . headerTitles }
10611087 visibleFrom = { props . visibleFrom }
10621088 onHeaderSelected = { handleHeaderSelected }
1089+ slots = { {
1090+ header : ( { column, label } : { column : string , label : string } ) => {
1091+ if ( allow ( 'filtering' ) && canFilter ( column ) ) {
1092+ const col = columns . find ( ( x : Column ) => x . name . toLowerCase ( ) === column . toLowerCase ( ) )
1093+ const isOpen = showFilters ?. column . name === column
1094+ return (
1095+ < div className = "cursor-pointer flex justify-between items-center hover:text-gray-900 dark:hover:text-gray-50" >
1096+ < span className = "mr-1 select-none" >
1097+ { label }
1098+ </ span >
1099+ < SettingsIcons column = { col } isOpen = { isOpen } />
1100+ </ div >
1101+ )
1102+ } else {
1103+ return (
1104+ < div className = "flex justify-between items-center" >
1105+ < span className = "mr-1 select-none" > { label } </ span >
1106+ </ div >
1107+ )
1108+ }
1109+ } ,
1110+ ...headerSlots ,
1111+ ...columnSlots
1112+ } }
10631113 >
1064- { columnSlots && Object . keys ( columnSlots ) . map ( slotName => {
1065- const slotFn = columnSlots [ slotName ]
1066- return (
1067- < React . Fragment key = { slotName } >
1068- { slotFn ( { } ) }
1069- </ React . Fragment >
1070- )
1071- } ) }
1114+ { children }
10721115 </ DataGrid >
10731116 ) }
10741117 </ div >
0 commit comments