import React, { useState, useMemo, useRef } from 'react' import { flexRender, getCoreRowModel, getSortedRowModel, useReactTable, ColumnFiltersState, TableOptions, } from '@tanstack/react-table' import { DndContext, MouseSensor, closestCenter, type DragEndEvent, type UniqueIdentifier, useSensor, useSensors, TouchSensor, KeyboardSensor, } from '@dnd-kit/core' import { restrictToVerticalAxis } from '@dnd-kit/modifiers' import { arrayMove, SortableContext, verticalListSortingStrategy } from '@dnd-kit/sortable' import useClickOutside from '../../hooks/useClickOutside' import { Pagination, Header, SimpleRow, DraggableRow, RowDragHandleCell } from './components' import { UncontrolledTableProps } from './interface' import * as S from './UncontrolledTable.style' const UncontrolledTable = (props: UncontrolledTableProps) => { const { data, columns, pagination, totalPages, labels, tableClassName, sticky, draggable, buttons, configs, hideColumns, } = props const { onClick, onMouseOver, onMouseOut, onChangePage, onFilterClick, onSortClick, onDragEnd, onColumnVisibilityChange, } = props const [openFilterDialog, setOpenFilterDialog] = useState('') const [sorting, setSorting] = useState([]) const [filterByColumn, setFilterByColumn] = useState([]) const _columns: any[] = useMemo(() => { return draggable ? [ { id: 'drag', header: '', cell: ({ row }: { row: any }) => , disableMenu: true, }, ...columns.map((column) => ({ ...column, disableMenu: true, })), ] : columns }, [columns]) const reactTableConfig = useMemo(() => { const config: TableOptions = { data, columns: _columns, state: { sorting: sorting, columnFilters: filterByColumn, pagination: pagination, }, rowCount: totalPages, manualPagination: true, debugTable: true, debugHeaders: true, debugColumns: true, getRowId: (row: any) => row.id, getCoreRowModel: getCoreRowModel(), getSortedRowModel: getSortedRowModel(), onSortingChange: setSorting, onColumnFiltersChange: setFilterByColumn, } return config }, [data, sorting, filterByColumn, _columns, pagination]) const table = useReactTable(reactTableConfig) const filterRef = useRef(null) useClickOutside(filterRef, () => setOpenFilterDialog('')) const handleDragEnd = (event: DragEndEvent) => { const { active, over } = event if (active && over && active.id !== over.id && onDragEnd) { const oldIndex = dataIds.indexOf(active.id) const newIndex = dataIds.indexOf(over.id) const _data = arrayMove(data, oldIndex, newIndex) onDragEnd(_data) } } const sensors = useSensors( useSensor(MouseSensor, {}), useSensor(TouchSensor, {}), useSensor(KeyboardSensor, {}), ) const dataIds = useMemo( () => data?.map((item: { id: UniqueIdentifier }) => item.id) || [], [data], ) return (
{table.getHeaderGroups().map((headerGroup: any) => ( {headerGroup.headers.map((header: any) => ( { if (!header?.column?.columnDef?.disableMenu) setOpenFilterDialog(header.column.columnDef.accessorKey) }} > {!header.isPlaceholder && flexRender(header.column.columnDef.header, header.getContext())} {!header?.column?.columnDef?.disableMenu && ( )} {openFilterDialog === header.column.columnDef.accessorKey && ( { onSortClick && onSortClick(header.column.columnDef.accessorKey, 'asc') setOpenFilterDialog('') }} >

{labels?.orderAsc || 'Menor primeiro'}

{ onSortClick && onSortClick(header.column.columnDef.accessorKey, 'desc') setOpenFilterDialog('') }} >

{labels?.orderDesc || 'Maior primeiro'}

{!header?.column?.columnDef?.nofilter && ( { onFilterClick && onFilterClick(header.column.columnDef.accessorKey) setOpenFilterDialog('') }} >

{labels?.filter || 'Filtrar por'}

)}
)}
))}
))}
{table.getRowModel().rows.map((row: any) => { return draggable ? ( ) : ( ) })}
{pagination && ( onChangePage?.({ ...pagination, pageIndex: page })} /> )} ) } export default UncontrolledTable