import { useMemo, useEffect, useState } from "react" // react-table components import { useTable, usePagination, useGlobalFilter, useAsyncDebounce, useSortBy, } from "react-table" // @mui material components import Table from "@mui/material/Table" import TableBody from "@mui/material/TableBody" import TableContainer from "@mui/material/TableContainer" import TableRow from "@mui/material/TableRow" import Icon from "@mui/material/Icon" import Autocomplete from "@mui/material/Autocomplete" // ThreeD Garden components import MDBox from "~/components/mui/MDBox" import MDTypography from "~/components/mui/MDTypography" import MDInput from "~/components/mui/MDInput" import MDPagination from "~/components/mui/MDPagination" // ThreeD Garden examples components import DataTableHeadCell from "~/components/elements/Tables/DataTable/DataTableHeadCell" import DataTableBodyCell from "~/components/elements/Tables/DataTable/DataTableBodyCell" // UUID import { v4 as newUUID } from 'uuid' // Declaring props types for DataTable interface Props { entriesPerPage?: | false | { defaultValue: number entries: number[] } canSearch?: boolean showTotalEntries?: boolean table: { columns: { [key: string]: any }[] rows: { [key: string]: any }[] } pagination?: { variant: "contained" | "gradient" color: | "primary" | "secondary" | "info" | "success" | "warning" | "error" | "dark" | "light" } isSorted?: boolean noEndBorder?: boolean } function DataTable({ entriesPerPage, canSearch, showTotalEntries, table, pagination, isSorted, noEndBorder, }: Props): JSX.Element { let defaultValue: any let entries: any[] if (entriesPerPage) { defaultValue = entriesPerPage.defaultValue ? entriesPerPage.defaultValue : "10" entries = entriesPerPage.entries ? entriesPerPage.entries : ["10", "25", "50", "100"] } const columns = useMemo(() => table.columns, [table]) const data = useMemo(() => table.rows, [table]) const tableInstance = useTable( { columns, data, initialState: { pageIndex: 0 } }, useGlobalFilter, useSortBy, usePagination ) const { getTableProps, getTableBodyProps, headerGroups, prepareRow, rows, page, pageOptions, canPreviousPage, canNextPage, gotoPage, nextPage, previousPage, setPageSize, setGlobalFilter, state: { pageIndex, pageSize, globalFilter }, }: any = tableInstance // Set the default value for the entries per page when component mounts useEffect(() => setPageSize(defaultValue || 10), [defaultValue]) // Set the entries per page value based on the select value const setEntriesPerPage = (value: any) => setPageSize(value) // Render the paginations const renderPagination = pageOptions.map((option: any) => ( gotoPage(Number(option))} active={pageIndex === option}> {option + 1} )) // Handler for the input to set the pagination index const handleInputPagination = ({ target: { value } }: any) => value > pageOptions.length || value < 0 ? gotoPage(0) : gotoPage(Number(value)) // Customized page options starting from 1 const customizedPageOptions = pageOptions.map((option: any) => option + 1) // Setting value for the pagination input const handleInputPaginationValue = ({ target: value }: any) => gotoPage(Number(value.value - 1)) // Search input value state const [search, setSearch] = useState(globalFilter) // Search input state handle // const onSearchChange = useAsyncDebounce((value) => { // setGlobalFilter(value || undefined) // }, 100) // A function that sets the sorted value for the table const setSortedValue = (column: any) => { let sortedValue if (isSorted && column.isSorted) { sortedValue = column.isSortedDesc ? "desc" : "asce" } else if (isSorted) { sortedValue = "none" } else { sortedValue = false } return sortedValue } // Setting the entries starting point const entriesStart = pageIndex === 0 ? pageIndex + 1 : pageIndex * pageSize + 1 // Setting the entries ending point let entriesEnd if (pageIndex === 0) { entriesEnd = pageSize } else if (pageIndex === pageOptions.length - 1) { entriesEnd = rows.length } else { entriesEnd = pageSize * (pageIndex + 1) } return ( {entriesPerPage || canSearch ? ( {entriesPerPage && ( { setEntriesPerPage(parseInt(newValue, 10)) }} size="small" sx={{ width: "5rem" }} renderInput={(params) => } />   entries per page )} {canSearch && ( { setSearch(search) // onSearchChange(currentTarget.value) }} /> )} ) : null} {headerGroups.map((headerGroup: any) => ( {headerGroup.headers.map((column: any) => ( {column.render("Header")} ))} ))} {page.map((row: any, key: any) => { prepareRow(row) return ( {row.cells.map((cell: any) => ( {cell.render("Cell")} ))} ) })}
{showTotalEntries && ( Showing {entriesStart} to {entriesEnd} of {rows.length} entries )} {pageOptions.length > 1 && ( {canPreviousPage && ( previousPage()}> chevron_left )} {renderPagination.length > 6 ? ( { handleInputPagination(event) handleInputPaginationValue(event) }} /> ) : ( renderPagination )} {canNextPage && ( nextPage()}> chevron_right )} )}
) } // Declaring default props for DataTable DataTable.defaultProps = { entriesPerPage: { defaultValue: 10, entries: ["5", "10", "15", "20", "25"] }, canSearch: false, showTotalEntries: true, pagination: { variant: "gradient", color: "info" }, isSorted: true, noEndBorder: false, } export default DataTable