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