* feat(ui): start assist stats * feat(ui): design mock up for stats * feat(ui): naming... * feat(ui): types, api service, some changes for recs and loaders * feat(ui): csv export button/request * feat(ui): csv export button/request * feat(ui): format dates * feat(ui): some fixes for stats requests * fix(tracker): fix test * fix(tracker): fix ci build * fix(tracker): fix assist tests * fix(tracker): bump test coverage, fix minor bug * fix(ui): more cypress fixes * fix(ui): add proj id to socket connection * fix(ui): remove console log * fix(ui): update filters * feat(ui):fix some api keys for stats * feat(ui): fix type * feat(ui): remove unused * feat(ui): some fixes * feat(ui): some fixes 2 * fix(ui): some search fixes * fix(ui): change api keys * fix(ui): change api keys * fix(ui): pdf button fix * fix(ui): pdf button fix * fix(ui): some ui fixes after review * fix(ui): fix csv export * fix(ui): change header for pds export for stats * fix(ui): change header width for exports
64 lines
2.2 KiB
TypeScript
64 lines
2.2 KiB
TypeScript
import React from 'react';
|
|
import { Icon, Tooltip } from 'UI';
|
|
import cn from 'classnames';
|
|
import { debounce } from 'App/utils';
|
|
import { numberWithCommas } from 'App/utils';
|
|
interface Props {
|
|
page: number;
|
|
totalPages: number;
|
|
onPageChange: (page: number) => void;
|
|
limit?: number;
|
|
debounceRequest?: number;
|
|
}
|
|
export default function Pagination(props: Props) {
|
|
const { page, totalPages, onPageChange, limit = 5, debounceRequest = 0 } = props;
|
|
const [currentPage, setCurrentPage] = React.useState(page);
|
|
React.useMemo(() => setCurrentPage(page), [page]);
|
|
|
|
const debounceChange = React.useCallback(debounce(onPageChange, debounceRequest), []);
|
|
|
|
const changePage = (page: number) => {
|
|
if (page > 0 && page <= totalPages) {
|
|
setCurrentPage(page);
|
|
debounceChange(page);
|
|
}
|
|
};
|
|
|
|
const isFirstPage = currentPage <= 1;
|
|
const isLastPage = currentPage === totalPages;
|
|
return (
|
|
<div className="flex items-center">
|
|
<Tooltip title="Previous Page">
|
|
<button
|
|
className={cn('py-2 px-3', { 'opacity-50 cursor-default': isFirstPage })}
|
|
disabled={isFirstPage}
|
|
onClick={() => changePage(currentPage - 1)}
|
|
>
|
|
<Icon name="chevron-left" size="18" color={isFirstPage ? 'gray-medium' : 'teal'} />
|
|
</button>
|
|
</Tooltip>
|
|
<span className="mr-2 color-gray-medium">Page</span>
|
|
<input
|
|
type="number"
|
|
className={cn('py-1 px-2 bg-white border border-gray-light rounded w-16', {
|
|
'opacity-50 cursor-default': totalPages === 1,
|
|
})}
|
|
value={currentPage}
|
|
min={1}
|
|
max={totalPages ? totalPages : 1}
|
|
onChange={(e) => changePage(parseInt(e.target.value))}
|
|
/>
|
|
<span className="mx-3 color-gray-medium">of</span>
|
|
<span>{numberWithCommas(totalPages)}</span>
|
|
<Tooltip title="Next Page">
|
|
<button
|
|
className={cn('py-2 px-3', { 'opacity-50 cursor-default': isLastPage })}
|
|
disabled={isLastPage}
|
|
onClick={() => changePage(currentPage + 1)}
|
|
>
|
|
<Icon name="chevron-right" size="18" color={isLastPage ? 'gray-medium' : 'teal'} />
|
|
</button>
|
|
</Tooltip>
|
|
</div>
|
|
);
|
|
}
|