"use client"; import { ColumnDef, flexRender, getCoreRowModel, useReactTable, getPaginationRowModel, ColumnFiltersState, getFilteredRowModel, Table as TableType, } from "@tanstack/react-table" import { ReactNode, useEffect, useRef, useState } from "react"; import Image from "next/image"; import { icons } from "#/assets/icons"; import clsx from "clsx"; interface DataTableProps { columns: ColumnDef[] data: TData[], pageSize?: number, header?: ReactNode | ((table: TableType) => ReactNode), isDataLoading?: boolean } export default function Table({ columns, data, pageSize = 10, header, isDataLoading = true }: DataTableProps) { const [rowSelection, setRowSelection] = useState({}) const [columnFilters, setColumnFilters] = useState( [] ) const table = useReactTable({ data, columns, getCoreRowModel: getCoreRowModel(), getPaginationRowModel: getPaginationRowModel(), state: { rowSelection, columnFilters, }, initialState: { pagination: { pageSize: pageSize, } }, enableRowSelection: true, getFilteredRowModel: getFilteredRowModel(), onRowSelectionChange: setRowSelection, onColumnFiltersChange: setColumnFilters, }) const headerCheckboxRef = useRef(null); useEffect(() => { if (headerCheckboxRef.current) { headerCheckboxRef.current.indeterminate = table.getIsSomePageRowsSelected() && !table.getIsAllPageRowsSelected(); } const selectedRows = table.getSelectedRowModel().rows; const filteredSelectedRows = table .getRowModel() .rows.filter((row) => row.getIsSelected()) .map((row) => row.original); console.log("SELECTED ALL = ", selectedRows); console.log("SELECTED = ", filteredSelectedRows); }, [ table ]); const totalPages = table.getPageCount() const currentPage = table.getState().pagination.pageIndex + 1 const getPageNumbers = () => { const pages = [] for (let i = 1; i <= totalPages; i++) { pages.push(i) } return pages } const render = () => { if(!header) return null return(
{typeof header === 'function' ? header(table) : header}
) } return(
{render()}
{table.getHeaderGroups().map((headerGroup) => ( {header ? : } {headerGroup.headers.map((header) => { return( ) })} ))} {table.getRowModel().rows.length ? ( table.getRowModel().rows.map((row) => ( {row.getVisibleCells().map((cell) => ( ))} )) ) : isDataLoading ? ( ) : ( )}
table.toggleAllPageRowsSelected(e.target.checked)} type="checkbox" name="" id="" /> {flexRender( header.column.columnDef.header, header.getContext() )}
row.toggleSelected(e.target.checked)} type="checkbox" name="" id="" /> {flexRender(cell.column.columnDef.cell, cell.getContext())}
Chargement...
Aucun résultats
{getPageNumbers().map((pageNumber) => ( ))}
) }