"use client"; import * as React from "react"; import { ColumnDef, ColumnFiltersState, SortingState, VisibilityState, flexRender, getCoreRowModel, getFilteredRowModel, getPaginationRowModel, getSortedRowModel, useReactTable, } from "@tanstack/react-table"; import { Eraser, Funnel, Search } from "lucide-react"; import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow, } from "@/components/ui/table"; import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue, } from "@/components/ui/select"; import { Button } from "@/components/ui/button"; import { Input } from "@/components/ui/input"; interface DataTableProps { columns: ColumnDef[]; data: TData[]; } // Search input placeholders function getPlaceholderText(column: string): string { const placeholders = { email: "Filtreeri emaile...", firstName: "Filtreeri eesnimesid...", ticketType: "Filtreeri pileti tüüpi...", team: "Filtreeri tiimi nimesid...", }; return placeholders[column as keyof typeof placeholders] || "Otsi..."; } export function DataTable({ columns, data, }: DataTableProps) { const [sorting, setSorting] = React.useState([]); const [columnFilters, setColumnFilters] = React.useState( [], ); const [columnVisibility, setColumnVisibility] = React.useState({}); const [rowSelection, setRowSelection] = React.useState({}); const [searchColumn, setSearchColumn] = React.useState("email"); const [searchValue, setSearchValue] = React.useState(""); const table = useReactTable({ data, columns, onSortingChange: setSorting, onColumnFiltersChange: setColumnFilters, getCoreRowModel: getCoreRowModel(), getPaginationRowModel: getPaginationRowModel(), getSortedRowModel: getSortedRowModel(), getFilteredRowModel: getFilteredRowModel(), onColumnVisibilityChange: setColumnVisibility, onRowSelectionChange: setRowSelection, state: { sorting, columnFilters, columnVisibility, rowSelection, }, }); return (
{ const value = event.target.value; setSearchValue(value); // Clear all column filters first table.getColumn("email")?.setFilterValue(""); table.getColumn("firstName")?.setFilterValue(""); table.getColumn("ticketType")?.setFilterValue(""); table.getColumn("team")?.setFilterValue(""); // Set filter for selected column table.getColumn(searchColumn)?.setFilterValue(value); }} className="max-w-sm rounded-r-none" /> {searchValue && ( )}
{table.getHeaderGroups().map((headerGroup) => ( {headerGroup.headers.map((header) => { return ( {header.isPlaceholder ? null : flexRender( header.column.columnDef.header, header.getContext(), )} ); })} ))} {table.getRowModel().rows?.length ? ( table.getRowModel().rows.map((row) => ( {row.getVisibleCells().map((cell) => ( {flexRender( cell.column.columnDef.cell, cell.getContext(), )} ))} )) ) : ( Tulemusi ei leitud. )}
Näidatakse {table.getFilteredRowModel().rows.length} rida(de) kokku{" "} {data.length} reast.
Lehekülg {table.getState().pagination.pageIndex + 1} /{" "} {table.getPageCount()}
); }