11import { MagnifyingGlassIcon , XIcon } from '@phosphor-icons/react' ;
2- import type { Table } from '@tanstack/react-table' ;
2+ import {
3+ type ColumnDef ,
4+ getCoreRowModel ,
5+ getFilteredRowModel ,
6+ getSortedRowModel ,
7+ type SortingState ,
8+ useReactTable ,
9+ } from '@tanstack/react-table' ;
10+ import { useMemo , useState } from 'react' ;
311import { Input } from '@/components/ui/input' ;
412import { TableContent } from './table-content' ;
513import { TableTabs } from './table-tabs' ;
@@ -8,12 +16,13 @@ interface TabConfig<TData> {
816 id : string ;
917 label : string ;
1018 data : TData [ ] ;
11- columns : any [ ] ;
19+ columns : ColumnDef < TData , unknown > [ ] ;
1220 getFilter ?: ( row : TData ) => { field : string ; value : string } ;
1321}
1422
1523interface FullScreenModalProps < TData extends { name : string | number } > {
16- table : Table < TData > ;
24+ data ?: TData [ ] ;
25+ columns ?: ColumnDef < TData , unknown > [ ] ;
1726 title ?: string ;
1827 description ?: string ;
1928 onClose : ( ) => void ;
@@ -35,7 +44,8 @@ interface FullScreenModalProps<TData extends { name: string | number }> {
3544}
3645
3746export function FullScreenModal < TData extends { name : string | number } > ( {
38- table,
47+ data,
48+ columns,
3949 title,
4050 description,
4151 onClose,
@@ -51,6 +61,58 @@ export function FullScreenModal<TData extends { name: string | number }>({
5161 onRowAction,
5262 onRowClick,
5363} : FullScreenModalProps < TData > ) {
64+ const [ sorting , setSorting ] = useState < SortingState > ( [ ] ) ;
65+ const [ globalFilter , setGlobalFilter ] = useState ( searchValue || '' ) ;
66+
67+ // Update global filter when searchValue prop changes
68+ useMemo ( ( ) => {
69+ setGlobalFilter ( searchValue || '' ) ;
70+ } , [ searchValue ] ) ;
71+
72+ const currentTabData = tabs ?. find ( ( tab ) => tab . id === activeTab ) ;
73+ const tableData = useMemo (
74+ ( ) => currentTabData ?. data || data || [ ] ,
75+ [ currentTabData ?. data , data ]
76+ ) ;
77+ const tableColumns = useMemo (
78+ ( ) => currentTabData ?. columns || columns || [ ] ,
79+ [ currentTabData ?. columns , columns ]
80+ ) ;
81+
82+ const table = useReactTable ( {
83+ data : tableData ,
84+ columns : tableColumns ,
85+ getRowId : ( row , index ) => {
86+ if ( ( row as any ) . _uniqueKey ) {
87+ return ( row as any ) . _uniqueKey ;
88+ }
89+ return activeTab ? `${ activeTab } -${ index } ` : `row-${ index } ` ;
90+ } ,
91+ state : {
92+ sorting,
93+ globalFilter,
94+ } ,
95+ onSortingChange : setSorting ,
96+ onGlobalFilterChange : ( value ) => {
97+ setGlobalFilter ( value ) ;
98+ onSearchChange ?.( value ) ;
99+ } ,
100+ getCoreRowModel : getCoreRowModel ( ) ,
101+ getFilteredRowModel : getFilteredRowModel ( ) ,
102+ getSortedRowModel : getSortedRowModel ( ) ,
103+ globalFilterFn : 'includesString' ,
104+ } ) ;
105+
106+ const handleTabChange = ( tabId : string ) => {
107+ if ( tabId === activeTab ) {
108+ return ;
109+ }
110+
111+ setSorting ( [ ] ) ;
112+ setGlobalFilter ( '' ) ;
113+ onSearchChange ?.( '' ) ;
114+ onTabChange ?.( tabId ) ;
115+ } ;
54116 return (
55117 < div className = "relative flex h-full w-full flex-col bg-sidebar" >
56118 < div className = "flex items-start justify-between border-sidebar-border border-b bg-sidebar px-3 pt-3 pb-2" >
@@ -72,10 +134,13 @@ export function FullScreenModal<TData extends { name: string | number }>({
72134 < MagnifyingGlassIcon className = "-translate-y-1/2 absolute top-1/2 left-2.5 h-4 w-4 text-muted-foreground" />
73135 < Input
74136 className = "h-8 w-64 pl-8 text-sm"
75- onChange = { ( e ) => onSearchChange ( e . target . value ) }
137+ onChange = { ( e ) => {
138+ setGlobalFilter ( e . target . value ) ;
139+ onSearchChange ( e . target . value ) ;
140+ } }
76141 placeholder = "Search..."
77142 type = "search"
78- value = { searchValue }
143+ value = { globalFilter }
79144 />
80145 </ div >
81146 ) }
@@ -97,7 +162,7 @@ export function FullScreenModal<TData extends { name: string | number }>({
97162 < div className = "mt-2" >
98163 < TableTabs
99164 activeTab = { activeTab || '' }
100- onTabChange = { onTabChange || ( ( ) => { } ) }
165+ onTabChange = { handleTabChange }
101166 tabs = { tabs }
102167 />
103168 </ div >
0 commit comments