/* eslint-disable jsx-a11y/no-static-element-interactions */ /* eslint-disable jsx-a11y/click-events-have-key-events */ 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'; // @ts-ignore import { useTranslation } from 'react-i18next'; import { useTable, usePagination, useSortBy, Row, UsePaginationInstanceProps, UseSortByInstanceProps, UsePaginationState, TableInstance, } from 'react-table'; import { v4 as uuid } from 'uuid'; import SortIcon from './SortIcon'; import { isColumnSorted, isSortedDesc, onSortClick } from './utils'; import { LoadingOverlay } from 'components/LoadingOverlay'; import { Column, PageInfo, SortInfo } from 'models/Table'; interface Props { columns: Column[]; data: object[]; count?: number; setPageInfo?: React.Dispatch>; sortInfo: SortInfo; setSortInfo: React.Dispatch>; isLoading?: boolean; obj: string; sortBy?: { id: string; desc: boolean }[]; hiddenColumns?: string[]; hideControls?: boolean; minHeight?: string; fullScreen?: boolean; isManual?: boolean; saveSettingsId?: string; } type TableInstanceWithHooks = TableInstance & UsePaginationInstanceProps & UseSortByInstanceProps & { state: UsePaginationState; }; const defaultProps = { count: undefined, setPageInfo: undefined, isLoading: false, minHeight: undefined, fullScreen: false, sortBy: [], hiddenColumns: [], hideControls: false, isManual: false, saveSettingsId: undefined, }; const SortableDataTable: React.FC = ({ columns, data, isLoading, obj, minHeight, fullScreen, sortBy, hiddenColumns, hideControls, count, sortInfo, setSortInfo, 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( { // @ts-ignore columns, data, // @ts-ignore initialState: { sortBy, pagination: !hideControls, pageSize: queryPageSize }, manualPagination: isManual, pageCount: isManual && count !== undefined ? Math.ceil(count / queryPageSize) : undefined, }, useSortBy, usePagination, ) as TableInstanceWithHooks; useEffect(() => { if (setPageInfo && pageIndex !== undefined) setPageInfo({ index: pageIndex, limit: queryPageSize }); }, [queryPageSize, pageIndex]); useEffect(() => { // @ts-ignore 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 ( <> {headerGroups.map((group) => ( {group.headers.map((column) => ( ))} ))} {data.length > 0 && ( {page.map((row: Row) => { prepareRow(row); return ( { // @ts-ignore row.cells.map((cell) => ( )) } ); })} )}
onSortClick(column.id, sortInfo, setSortInfo)} style={{ alignContent: 'center', overflow: 'hidden', whiteSpace: 'nowrap' }} > {column.render('Header')}
{cell.render('Cell')}
{!isLoading && data.length === 0 && (
{t('common.no_obj_found', { obj })}
)}
{!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} /> )} ); }; SortableDataTable.defaultProps = defaultProps; export default SortableDataTable;