import React, { useEffect, useState } from 'react'; import { ArrowRightIcon, ArrowLeftIcon, ChevronRightIcon, ChevronLeftIcon } from '@chakra-ui/icons'; import { Table, Tbody, Td, Th, Thead, Tooltip, Tr, Flex, IconButton, Text, Select, NumberInput, NumberInputField, NumberInputStepper, NumberIncrementStepper, NumberDecrementStepper, useColorModeValue, Box, Center, Spinner, Heading, useBreakpoint, } from '@chakra-ui/react'; import { useTranslation } from 'react-i18next'; import { useTable, usePagination, useSortBy, Row } from 'react-table'; import { v4 as uuid } from 'uuid'; // @ts-ignore import SortIcon from './SortIcon'; import LoadingOverlay from 'components/LoadingOverlay'; import { Column, PageInfo } from 'models/Table'; interface Props { columns: Column[]; data: object[]; count?: number; setPageInfo?: React.Dispatch>; isLoading?: boolean; obj?: string; sortBy?: { id: string; desc: boolean }[]; hiddenColumns?: string[]; hideControls?: boolean; minHeight?: string; fullScreen?: boolean; isManual?: boolean; saveSettingsId?: string; } const defaultProps = { count: undefined, setPageInfo: undefined, isLoading: false, minHeight: undefined, fullScreen: false, sortBy: [], hiddenColumns: [], hideControls: false, isManual: false, saveSettingsId: undefined, }; const DataTable: React.FC = ({ columns, data, isLoading, obj, minHeight, fullScreen, sortBy, hiddenColumns, hideControls, count, setPageInfo, isManual, saveSettingsId, }) => { const { t } = useTranslation(); const breakpoint = useBreakpoint(); const textColor = useColorModeValue('gray.700', 'white'); const getPageSize = () => { const saved = saveSettingsId ? localStorage.getItem(saveSettingsId) : undefined; if (saved) return Number.parseInt(saved, 10); return 10; }; const [queryPageSize, setQueryPageSize] = useState(getPageSize()); const { getTableProps, getTableBodyProps, headerGroups, prepareRow, page, canPreviousPage, canNextPage, pageOptions, pageCount, gotoPage, nextPage, previousPage, setPageSize, setHiddenColumns, state: { pageIndex, pageSize }, } = useTable( { columns, data, initialState: { sortBy, pagination: !hideControls, pageSize: queryPageSize }, manualPagination: isManual, pageCount: isManual && count !== undefined ? Math.ceil(count / queryPageSize) : undefined, }, useSortBy, usePagination, ); useEffect(() => { if (setPageInfo && pageIndex !== undefined) setPageInfo({ index: pageIndex, limit: queryPageSize }); }, [queryPageSize, pageIndex]); useEffect(() => { if (saveSettingsId) localStorage.setItem(saveSettingsId, pageSize); setQueryPageSize(pageSize); }, [pageSize]); useEffect(() => { if (hiddenColumns) setHiddenColumns(hiddenColumns); }, [hiddenColumns]); // If this is a manual DataTable, with a page index that is higher than 0 and higher than the max possible page, we send to index 0 useEffect(() => { if ( isManual && setPageInfo && data && isManual && pageIndex > 0 && count !== undefined && Math.ceil(count / queryPageSize) - 1 < pageIndex ) { gotoPage(0); setPageInfo({ index: 0, limit: queryPageSize }); } }, [count, queryPageSize, page, data]); const computedMinHeight = () => { if (fullScreen) return { base: 'calc(100vh - 360px)', md: 'calc(100vh - 288px)' }; return minHeight; }; if (isLoading && data.length === 0) { return (
); } // Render the UI for your table return ( <> { // @ts-ignore headerGroups.map((group) => ( { // @ts-ignore group.headers.map((column) => ( )) } )) } {data.length > 0 && ( {page.map((row: Row) => { prepareRow(row); return ( { // @ts-ignore row.cells.map((cell) => ( )) } ); })} )}
{column.render('Header')}
{cell.render('Cell')}
{!isLoading && data.length === 0 && (
{obj ? ( {t('common.no_obj_found', { obj })} ) : ( {t('common.empty_list')} )}
)}
{!hideControls && ( gotoPage(0)} isDisabled={!canPreviousPage} icon={} mr={4} /> } /> {breakpoint !== 'base' && ( <> {t('table.page')}{' '} {pageIndex + 1} {' '} {t('common.of')}{' '} {pageOptions.length} {t('table.go_to_page')}{' '} { const newPage = numberValue ? numberValue - 1 : 0; gotoPage(newPage); }} defaultValue={pageIndex + 1} > )} } /> gotoPage(pageCount - 1)} isDisabled={!canNextPage} icon={} ml={4} /> )} ); }; DataTable.defaultProps = defaultProps; export default DataTable;