import React, { useState, useMemo } from 'react' import * as S from "./styles" import { flexRender, getCoreRowModel, getSortedRowModel, useReactTable, getFilteredRowModel, ColumnFiltersState, getPaginationRowModel } from '@tanstack/react-table' import { format, isAfter, isBefore } from "date-fns" import { Button } from "@mui/material"; import { TablePropos } from './interface'; import { Pagination, Header, TBody } from "./components" const Table:React.FC = ({ data, columns, onClick, onMouseOver, onMouseOut, showTotalResults, showSettings, pagination, rowCount, onChangePage, customTotalResult }) => { const [openFilterDialog, setOpenFilterDialog] = useState('') const [sorting, setSorting] = useState([]) const [openFilterOptions, setOpenFilterOptions] = useState(false) const [filterByColumn, setFilterByColumn] = useState([]) const [filterInputSelected, setFilterInputSelected] = useState() const [globalFilters, setGlobalFilters] = useState([]) const [value, setValue] = useState() const [orderSmallest, setOrderSmallest] = useState(false) const [orderLargest, setOrderLargest] = useState(false) const customFilterText = (row: any, value: string) => { const itensFinded = globalFilters.map((item: any) => { if (item.type === 'Horario Igual a') { return item.value === row.original[item.acessor] } if (item.type === 'Horario maior que') { const date = new Date() const rowDate = new Date() const hourSplited = item?.value?.split(':') const rowDateSplited = row.original[item.acessor].split(':') date.setHours(Number(hourSplited[0]), Number(hourSplited[1]), 0, 0) rowDate.setHours(Number(rowDateSplited[0]), Number(rowDateSplited[1]), 0 ,0) return isAfter(rowDate, date) } if (item.type === 'Horario menor que') { const date = new Date() const rowDate = new Date() const hourSplited = item?.value?.split(':') const rowDateSplited = row.original[item.acessor].split(':') date.setHours(Number(hourSplited[0]), Number(hourSplited[1]), 0, 0) rowDate.setHours(Number(rowDateSplited[0]), Number(rowDateSplited[1]), 0 ,0) return isBefore(rowDate, date) } if (item.type === 'Data Igual a') { const dateSplited = item?.value?.split('-') return row.original[item.acessor] === format(new Date(dateSplited[0], dateSplited[1] - 1, dateSplited[2], 0 , 0), "dd/MM/yyyy") } if (item.type === 'Data maior que') { const dateSplited = item?.value?.split('-') const rowDateSplited = row.original[item.acessor].split('/') return isAfter(new Date(rowDateSplited[2], rowDateSplited[1], rowDateSplited[0]), new Date(dateSplited[0], dateSplited[1], dateSplited[2])) } if (item.type === 'Data menor que') { const dateSplited = item?.value?.split('-') const rowDateSplited = row.original[item.acessor].split('/') return isBefore(new Date(rowDateSplited[2], rowDateSplited[1], rowDateSplited[0]), new Date(dateSplited[0], dateSplited[1], dateSplited[2])) } if (item.type === 'Igual a' && typeof value === 'number') { return row.original[item.acessor] === item.value } if (item.type === 'Igual a') { return row.original[item.acessor] === item.value } if (item.type === 'Contém') { return !!row.original[item.acessor].includes(item.value) } if (item.type === 'Não é igual a') { return row.original[item.acessor] !== item.value } if (item.type === 'Maior que') { return row.original[item.acessor] > item.value } if (item.type === 'Menor que') { return row.original[item.acessor] < item.value } }) const result = itensFinded.every((item: any) => item) return result } const reactTableConfig = useMemo(() => { const config:any = { data, columns, filterFns:{ 'customFilterText': customFilterText }, state: { sorting: sorting, columnFilters: filterByColumn, }, rowCount: rowCount || 10, getCoreRowModel: getCoreRowModel(), getSortedRowModel: getSortedRowModel(), getFilteredRowModel: getFilteredRowModel(), onSortingChange: setSorting, onColumnFiltersChange: setFilterByColumn } config.rowCount = rowCount || 10 if(!pagination) { config.getPaginationRowModel = getPaginationRowModel() } else { config.state.pagination = pagination config.manualPagination = true config.pageCount = pagination.totalPages } return config }, [data, sorting, filterByColumn, columns, pagination]) const table = useReactTable(reactTableConfig) return (
{table.getHeaderGroups().map((headerGroup: any) => ( {headerGroup.headers.map((header: any) => (
{header.isPlaceholder ? null : flexRender( header.column.columnDef.header, header.getContext() )} { setOpenFilterDialog(header.column.columnDef.accessorKey) }}> { openFilterDialog === header.column.columnDef.accessorKey ? ( <> { setOpenFilterDialog('') setOpenFilterOptions(false) }}> { openFilterOptions ? (

Selecione um filtro

{ header.column.getCanFilter() ? filterInputSelected === 'Igual a' || filterInputSelected === 'Não é igual a' || filterInputSelected === 'Contém' || filterInputSelected === 'Maior que' || filterInputSelected === 'Menor que' || filterInputSelected === 'Data Igual a' || filterInputSelected === 'Data maior que' || filterInputSelected === 'Data menor que' || filterInputSelected === 'Horario Igual a' || filterInputSelected === 'Horario maior que' || filterInputSelected === 'Horario menor que' ? (

Valor

{ if (header?.headerGroup?.headers[header.index].column.columnDef.type === 'number') { setValue(Number(event.target.value)) return } if (header?.headerGroup?.headers[header.index].column.columnDef.type === 'date') { setValue(event.target.value) return } setValue(event.target.value) }} />
) : null : null }
) : (

{ header.column.toggleSorting() setOrderSmallest(true) setOrderLargest(false) }}>Menor primeiro

{ header.column.toggleSorting() setOrderLargest(true) setOrderSmallest(false) }}>Maior primeiro

setOpenFilterOptions(true)}>Filtrar por

) }
) : null }
))} ))}
) } export default Table