import { Column, ColumnDef, getCoreRowModel, getFilteredRowModel, getPaginationRowModel, getSortedRowModel, PaginationState, SortingState, useReactTable } from '@tanstack/react-table'; import { LoaderCircleIcon, SearchIcon, Settings2, SquarePen } from 'lucide-react'; import React from 'react'; import { useIntl } from 'react-intl'; import { useDebounceSearch } from '@crux-kit/hooks'; import { mapTableStateToListQueryParams } from '#infrastructure/reactQuery'; import { PermissionGate } from '#core/Permission'; import { Button } from '#shared/ui/Button'; import { Card, CardFooter, CardHeader, CardTable, CardTitle, CardToolbar } from '#shared/ui/Card'; import { Input, InputWrapper } from '#shared/ui/Input'; import { ScrollArea, ScrollBar } from '#shared/ui/ScrollArea'; import { Skeleton } from '#shared/ui/Skeleton'; import { DataGrid, DataGridColumnHeader, DataGridColumnVisibility, DataGridPagination, DataGridTable, useDataGrid } from '#shared/widgets/DataGrid'; import { useGetList } from '../../api/list'; import { MODULE_NAME_LABEL, MODULE_PERMISSION_CREATE, MODULE_PERMISSION_DELETE, MODULE_PERMISSION_UPDATE } from '../../config/meta'; import { Entity } from '../../entities/Entity'; import { DeleteTrigger } from './DeleteTrigger'; import { ManageTrigger } from './ManageTrigger'; interface IColumnFilterProps { column: Column; } export const DataTable = () => { const intl = useIntl(); const [pagination, setPagination] = React.useState({ pageIndex: 0, pageSize: 10 }); const [search, setSearch] = React.useState(''); const { handleChange } = useDebounceSearch({ minQueryNumber: 3, delay: 400, initialQuery: search, onTimeOut: setSearch }); const [sorting, setSorting] = React.useState([]); const { list, total, isFetching, isLoading, pagesCount } = useGetList( mapTableStateToListQueryParams(pagination, sorting, search) ); const columns = React.useMemo[]>( () => [ { id: 'id', accessorFn: (row) => row.id, header: ({ column }) => , enableSorting: true, size: 80, meta: { cellClassName: '', skeleton: } }, { id: 'name', accessorFn: (row) => row.name, header: ({ column }) => ( } column={column} /> ), cell: (info) => info.getValue(), enableSorting: true, meta: { cellClassName: '', skeleton: } }, { id: 'name2', accessorFn: (row) => row.name2, header: ({ column }) => ( } column={column} /> ), cell: (info) => info.getValue(), enableSorting: true, meta: { cellClassName: '', skeleton: } }, { id: 'order', accessorFn: (row) => row.order, header: ({ column }) => , cell: (info) => info.getValue(), enableSorting: true, meta: { cellClassName: '', skeleton: } }, { id: 'number', accessorFn: (row) => row.number, header: ({ column }) => , cell: (info) => info.getValue(), enableSorting: true, meta: { cellClassName: '', skeleton: } }, { id: 'action', header: () => intl.formatMessage({ id: 'ACTIONS' }), cell: (info) => { const data = info.row.original; const id = data.id; return (
); }, enableSorting: false, size: 96, meta: { headerClassName: '', skeleton: } } ], [intl] ); const table = useReactTable({ columns, autoResetPageIndex: false, enableMultiSort: false, data: list, manualPagination: true, pageCount: pagesCount, getRowId: (row) => String(row.id), state: { pagination, sorting }, onPaginationChange: setPagination, onSortingChange: setSorting, getCoreRowModel: getCoreRowModel(), getFilteredRowModel: getFilteredRowModel(), getPaginationRowModel: getPaginationRowModel(), getSortedRowModel: getSortedRowModel() }); return ( {search.length > 0 && isFetching ? ( ) : ( )} handleChange(e.target.value)} /> ); }; const Toolbar = () => { const { table } = useDataGrid(); const intl = useIntl(); return (
{intl.formatMessage({ id: 'TABLE.COMMON.COLUMNS' })} } />
); }; const ColumnInputFilter = ({ column }: IColumnFilterProps) => { const intl = useIntl(); return ( column.setFilterValue(event.target.value)} className="h-9 w-full max-w-40" /> ); };