Skip to content

Commit 8e82b74

Browse files
committed
fix: full screen
1 parent 8f45387 commit 8e82b74

File tree

2 files changed

+74
-8
lines changed

2 files changed

+74
-8
lines changed

apps/dashboard/components/table/data-table.tsx

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -266,6 +266,8 @@ export function DataTable<TData extends { name: string | number }, TValue>({
266266
>
267267
<FullScreenModal
268268
activeTab={activeTab}
269+
columns={tableColumns}
270+
data={tableData}
269271
description={description}
270272
expandable={expandable}
271273
getSubRows={getSubRows}
@@ -277,7 +279,6 @@ export function DataTable<TData extends { name: string | number }, TValue>({
277279
onTabChange={handleTabChange}
278280
renderSubRow={renderSubRow}
279281
searchValue={globalFilter}
280-
table={table}
281282
tabs={tabs}
282283
title={title}
283284
/>

apps/dashboard/components/table/fullscreen-modal.tsx

Lines changed: 72 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,13 @@
11
import { 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';
311
import { Input } from '@/components/ui/input';
412
import { TableContent } from './table-content';
513
import { 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

1523
interface 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

3746
export 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

Comments
 (0)