gitscope
← marzneshin / v0.7.0 / dashboard/src/libs/entity-table/components/data-table.tsx
https://dev.kronoz.win/r/marzneshin.git
dashboard/src/libs/entity-table/components/data-table.tsx · TypeScript
Blame Raw
 1import {
 2    ColumnDef,
 3    ColumnFiltersState,
 4    OnChangeFn,
 5    RowSelectionState,
 6    SortingState,
 7    VisibilityState,
 8    getCoreRowModel,
 9    getFilteredRowModel,
10    getPaginationRowModel,
11    getSortedRowModel,
12    useReactTable,
13} from "@tanstack/react-table"
14
15import {
16    Button,
17} from "@marzneshin/common/components"
18
19import { useTranslation } from "react-i18next"
20import { DataTablePagination } from "./table-pagination"
21import { useState } from "react"
22import { DataTableViewOptions } from "./table-view-option"
23import { TableSearch } from "./table-filtering"
24import { EntityDataTable } from "./table";
25
26interface DataTableProps<TData, TValue> {
27    columns: ColumnDef<TData, TValue>[]
28    data: TData[]
29    filteredColumn: string
30    onCreate?: () => void
31    onOpen?: (object: TData) => void
32    setSelectedRow?: OnChangeFn<RowSelectionState> | undefined
33    selectedRow?: RowSelectionState | undefined
34}
35
36export function DataTable<TData, TValue>({
37    columns,
38    data,
39    onCreate,
40    onOpen,
41    selectedRow,
42    setSelectedRow,
43}: DataTableProps<TData, TValue>) {
44    const [sorting, setSorting] = useState<SortingState>([])
45    const [columnFilters, setColumnFilters] = useState<ColumnFiltersState>(
46        []
47    )
48    const [columnVisibility, setColumnVisibility] =
49        useState<VisibilityState>({})
50    const table = useReactTable({
51        data,
52        columns,
53        onSortingChange: setSorting,
54        onColumnFiltersChange: setColumnFilters,
55        getCoreRowModel: getCoreRowModel(),
56        getPaginationRowModel: getPaginationRowModel(),
57        getSortedRowModel: getSortedRowModel(),
58        getFilteredRowModel: getFilteredRowModel(),
59        onColumnVisibilityChange: setColumnVisibility,
60        onRowSelectionChange: setSelectedRow,
61        state: {
62            sorting,
63            columnFilters,
64            columnVisibility,
65            rowSelection: selectedRow !== undefined ? selectedRow : {},
66        },
67    })
68    const { t } = useTranslation();
69    return (
70        <div>
71            <div className="flex items-center py-4">
72                <TableSearch />
73                <DataTableViewOptions table={table} />
74                {onCreate && (<Button onClick={onCreate}>{t('create')}</Button>)}
75            </div>
76            <div className="rounded-md border">
77                <EntityDataTable columns={columns} onRowClick={onOpen} />
78                <DataTablePagination table={table} />
79            </div>
80        </div>
81    )
82}