import classNames from 'classnames'; import React, { useState, useEffect } from 'react'; import PropTypes from 'prop-types'; import { FaAngleDown, FaAngleUp, FaArrowLeft, FaArrowRight } from 'react-icons/fa'; import { Wrapper as MenuWrapper, Button as MenuButton, Menu, MenuItem } from 'react-aria-menubutton'; import { getPageCount } from '../../data-entry/utils'; import * as d3 from 'd3'; import './Paginator.css'; interface Props { rowsPerPage: number; rowCount: number; onChangePage: (page: number) => any; onChangeRowsPerPage?: (rowsPerPage: number) => any; currentPage: number; isTop?: boolean; } export const Paginator: React.FC = ({ rowsPerPage, rowCount, onChangePage, onChangeRowsPerPage, currentPage, isTop }) => { const [pageCount, setPageCount] = useState(getPageCount(rowCount, rowsPerPage)); const getPaginationItem = (pageNumber: number) => { const isCurrent = currentPage === pageNumber; return (
  • onChangePage(pageNumber)} > {d3.format(',')(pageNumber)}
  • ); }; const pageIsUnderFour = ( ); const pageIsFourOrMore = ( ); const pageIsWithinFourOfLast = ( ); let paginationItems = pageIsFourOrMore; if (pageCount < 6) { let listItems: JSX.Element[] = []; for (let index = 0; index < pageCount; index++) { listItems.push(getPaginationItem(index + 1)); } paginationItems = ; } else if (currentPage < 4) { paginationItems = pageIsUnderFour; } else if (currentPage > pageCount - 3) { paginationItems = pageIsWithinFourOfLast; } const resultsPerPageOptions = [10, 15, 30, 50, 75]; const resultsPerPageMenu = (
    {rowsPerPage} / page {isTop ? : }
      {resultsPerPageOptions.map((d, i) => (
    • {d}
    • ))}
    ); let jumpToPageOptions: number[] = []; for (let i: number = 0; i < pageCount; i++) { jumpToPageOptions.push(i + 1); } const jumpToPageMenu = (
    Jump to {isTop ? : }
      {jumpToPageOptions.map((d, i) => (
    • {d}
    • ))}
    ); /** * This effect handles changes to rowsPerPage prop * that occur outside this component */ useEffect(() => { setPageCount(getPageCount(rowCount, rowsPerPage)); }, [rowsPerPage]); return (
    {jumpToPageMenu} {resultsPerPageMenu}
    ); };