From 786c5e158026dfca1796852a9fc46c947edf63c7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9rgio=20Rafael=20Siqueira?= Date: Tue, 18 Nov 2025 22:56:29 -0300 Subject: [PATCH] update table --- .../app/components/data-table/data-table.tsx | 168 +++++++++++------- 1 file changed, 104 insertions(+), 64 deletions(-) diff --git a/apps/admin.saladeaula.digital/app/components/data-table/data-table.tsx b/apps/admin.saladeaula.digital/app/components/data-table/data-table.tsx index fd72c33..d0589b5 100644 --- a/apps/admin.saladeaula.digital/app/components/data-table/data-table.tsx +++ b/apps/admin.saladeaula.digital/app/components/data-table/data-table.tsx @@ -13,8 +13,10 @@ import { } from '@tanstack/react-table' import { createContext, + useCallback, useContext, useEffect, + useMemo, useState, type ReactNode } from 'react' @@ -41,7 +43,7 @@ interface DataTableProps { sort: SortingState pageSize: number rowCount: number - hiddenColumn?: string[] + columnInvisibilityInit?: string[] } interface TableContextProps { @@ -69,88 +71,126 @@ export function DataTable({ pageSize, rowCount, setSelectedRows, - hiddenColumn = [] + columnInvisibilityInit = [] }: DataTableProps) { const [dataTable, setDataTable] = useState(data) - const columnVisibilityInit = Object.fromEntries( - hiddenColumn.map((column) => [column, false]) + const columnInvisibility = useMemo( + () => + Object.fromEntries( + columnInvisibilityInit.map((column) => [column, false]) + ), + [columnInvisibilityInit] ) const [searchParams, setSearchParams] = useSearchParams() const [columnVisibility, setColumnVisibility] = - useState(columnVisibilityInit) + useState(columnInvisibility) const [rowSelection, setRowSelection] = useState({}) - const sortParam = searchParams.get('sort') - const sorting = sortParam - ? sortParam.split(',').map((s) => { - const [id, dir] = s.split(':') - return { id, desc: dir === 'desc' } + + const sorting = useMemo(() => { + const sortParam = searchParams.get('sort') + + if (!sortParam) { + return sort + } + + return sortParam.split(',').map((s) => { + const [id, dir] = s.split(':') + return { id, desc: dir === 'desc' } + }) + }, [searchParams, sort]) + + const setPagination = useCallback( + (updater: any) => { + const newState = + typeof updater === 'function' + ? updater({ pageIndex, pageSize }) + : updater + + setRowSelection({}) + setSearchParams((prev) => { + prev.set('p', newState?.pageIndex.toString()) + prev.set('perPage', newState?.pageSize.toString()) + return prev }) - : sort + }, + [pageIndex, pageSize, setSearchParams] + ) - const setPagination = (updater: any) => { - const newState = - typeof updater === 'function' ? updater({ pageIndex, pageSize }) : updater - - setRowSelection({}) - setSearchParams((searchParams) => { - searchParams.set('p', newState?.pageIndex.toString()) - searchParams.set('perPage', newState?.pageSize.toString()) - return searchParams - }) - } - - const setSorting = (updater: any) => { - const newSorting = - typeof updater === 'function' ? updater(sorting) : updater - - setSearchParams((searchParams) => { - if (newSorting.length) { - const sort = newSorting - .map((s: ColumnSort) => `${s.id}:${s.desc ? 'desc' : 'asc'}`) - .join(',') - searchParams.set('sort', sort) - } - return searchParams - }) - } + const setSorting = useCallback( + (updater: any) => { + const newSorting = + typeof updater === 'function' ? updater(sorting) : updater + setSearchParams((prev) => { + if (newSorting.length) { + const sort = newSorting + .map((s: ColumnSort) => `${s.id}:${s.desc ? 'desc' : 'asc'}`) + .join(',') + prev.set('sort', sort) + } else { + prev.delete('sort') + } + return prev + }) + }, + [sorting, setSearchParams] + ) useEffect(() => { setDataTable(data) }, [data]) - const table = useReactTable({ - data: dataTable, - columns, - rowCount, - state: { + const tableConfig = useMemo( + () => ({ + data: dataTable, + columns, + rowCount, + state: { + sorting, + rowSelection, + columnVisibility, + pagination: { + pageIndex, + pageSize + } + }, + manualSorting: true, + manualPagination: true, + enableRowSelection: true, + getRowId: (row: any) => row.id, + getCoreRowModel: getCoreRowModel(), + onRowSelectionChange: setRowSelection, + onSortingChange: setSorting, + onColumnVisibilityChange: setColumnVisibility, + onPaginationChange: setPagination, + meta: { + removeRow: (rowId: string) => { + setDataTable((rows) => rows.filter((row: any) => row?.id !== rowId)) + } + } + }), + [ + dataTable, + columns, + rowCount, sorting, rowSelection, columnVisibility, - pagination: { - pageIndex, - pageSize - } - }, - manualSorting: true, - manualPagination: true, - enableRowSelection: true, - getRowId: (row: any) => row.id, - getCoreRowModel: getCoreRowModel(), - onRowSelectionChange: setRowSelection, - onSortingChange: setSorting, - onColumnVisibilityChange: setColumnVisibility, - onPaginationChange: setPagination, - meta: { - removeRow: (rowId: string) => { - setDataTable((rows) => rows.filter((row: any) => row?.id !== rowId)) - } - } - }) + setColumnVisibility, + pageIndex, + pageSize, + setSorting, + setPagination + ] + ) + + const table = useReactTable(tableConfig) useEffect(() => { + if (!setSelectedRows) return + const selected = table.getSelectedRowModel().flatRows.map((r) => r.original) - setSelectedRows?.(selected) - }, [rowSelection]) + setSelectedRows(selected) + }, [rowSelection, setSelectedRows, table]) return (