Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
pterodactyl
GitHub Repository: pterodactyl/panel
Path: blob/1.0-develop/resources/scripts/components/elements/table/PaginationFooter.tsx
10263 views
1
import React from 'react';
2
import { PaginationDataSet } from '@/api/http';
3
import classNames from 'classnames';
4
import { Button } from '@/components/elements/button/index';
5
import { ChevronDoubleLeftIcon, ChevronDoubleRightIcon } from '@heroicons/react/solid';
6
7
interface Props {
8
className?: string;
9
pagination: PaginationDataSet;
10
onPageSelect: (page: number) => void;
11
}
12
13
const PaginationFooter = ({ pagination, className, onPageSelect }: Props) => {
14
const start = (pagination.currentPage - 1) * pagination.perPage;
15
const end = (pagination.currentPage - 1) * pagination.perPage + pagination.count;
16
17
const { currentPage: current, totalPages: total } = pagination;
18
19
const pages = { previous: [] as number[], next: [] as number[] };
20
for (let i = 1; i <= 2; i++) {
21
if (current - i >= 1) {
22
pages.previous.push(current - i);
23
}
24
if (current + i <= total) {
25
pages.next.push(current + i);
26
}
27
}
28
29
if (pagination.total === 0) {
30
return null;
31
}
32
33
const buttonProps = (page: number) => ({
34
size: Button.Sizes.Small,
35
shape: Button.Shapes.IconSquare,
36
variant: Button.Variants.Secondary,
37
onClick: () => onPageSelect(page),
38
});
39
40
return (
41
<div className={classNames('flex items-center justify-between my-2', className)}>
42
<p className={'text-sm text-neutral-500'}>
43
Showing&nbsp;
44
<span className={'font-semibold text-neutral-400'}>
45
{Math.max(start, Math.min(pagination.total, 1))}
46
</span>
47
&nbsp;to&nbsp;
48
<span className={'font-semibold text-neutral-400'}>{end}</span> of&nbsp;
49
<span className={'font-semibold text-neutral-400'}>{pagination.total}</span> results.
50
</p>
51
{pagination.totalPages > 1 && (
52
<div className={'flex space-x-1'}>
53
<Button.Text {...buttonProps(1)} disabled={pages.previous.length !== 2}>
54
<ChevronDoubleLeftIcon className={'w-3 h-3'} />
55
</Button.Text>
56
{pages.previous.reverse().map((value) => (
57
<Button.Text key={`previous-${value}`} {...buttonProps(value)}>
58
{value}
59
</Button.Text>
60
))}
61
<Button size={Button.Sizes.Small} shape={Button.Shapes.IconSquare}>
62
{current}
63
</Button>
64
{pages.next.map((value) => (
65
<Button.Text key={`next-${value}`} {...buttonProps(value)}>
66
{value}
67
</Button.Text>
68
))}
69
<Button.Text {...buttonProps(total)} disabled={pages.next.length !== 2}>
70
<ChevronDoubleRightIcon className={'w-3 h-3'} />
71
</Button.Text>
72
</div>
73
)}
74
</div>
75
);
76
};
77
78
export default PaginationFooter;
79
80