import React, { useState } from 'react' import classnames from 'classnames' import { __, _n, _x, sprintf } from '@wordpress/i18n' import { buildUrl, updateQueryParams } from '../../../utils/urls' import { Button } from '../Button' import type { ListTablePaginationProps } from './ListTable' import type { ReactNode } from 'react' interface NavigationButtonProps { icon: ReactNode newPage: number className?: string disabled?: boolean helperText?: string renderAsLinks?: boolean setCurrentPage: (page: number) => void } const NavigationButton: React.FC = ({ icon, newPage, disabled, className, helperText, renderAsLinks, setCurrentPage }) => renderAsLinks ? <> { event.preventDefault() setCurrentPage(newPage) }} > {helperText} {icon} {'\n'} : interface NavigationButtonsProps { currentPage: number disabled?: boolean renderAsLinks?: boolean setCurrentPage: (page: number) => void } const BackwardNavigationButtons: React.FC = ({ currentPage, ...buttonProps }) => 1 === currentPage ? <> {'\n'} {'\n'} : <> «} newPage={1} className="first-page" /* translators: Hidden accessibility text. */ helperText={__('First page', 'code-snippets')} {...buttonProps} />{'\n'} ‹} newPage={Math.max(1, currentPage - 1)} className="prev-page" /* translators: Hidden accessibility text. */ helperText={__('Previous page', 'code-snippets')} {...buttonProps} />{'\n'} interface ForwardNavigationButtonsProps extends NavigationButtonsProps { totalPages: number } const ForwardNavigationButtons: React.FC = ({ currentPage, totalPages, ...buttonProps }) => totalPages === currentPage ? <> {'\n'} : <> ›} newPage={Math.min(totalPages, currentPage + 1)} className="next-page" /* translators: Hidden accessibility text. */ helperText={__('Next page', 'code-snippets')} {...buttonProps} />{'\n'} »} newPage={totalPages} className="last-page" /* translators: Hidden accessibility text. */ helperText={__('Last page', 'code-snippets')} {...buttonProps} />{'\n'} interface PagingInputProps { which: 'top' | 'bottom' totalPages: number disabled?: boolean inputValue: number setInputValue: (value: number) => void confirmInputValue: VoidFunction } const PagingInput: React.FC = ({ which, totalPages, disabled, inputValue, setInputValue, confirmInputValue }) => { const value = Number(event.target.value) if (value) { setInputValue(value) } }} /> interface CurrentPageProps extends PagingInputProps { currentPage: number } const CurrentPage: React.FC = ({ which, totalPages, currentPage, ...inputProps }) => 'bottom' === which ? <> {/* translators: Hidden accessibility text. */} {__('Current Page', 'code-snippets')} {/* translators: 1: Current page. */ sprintf(_x('%s of ', 'paging', 'code-snippets'), currentPage)} {totalPages} : {/* translators: 1: Current page. */ _x(' of ', 'paging', 'code-snippets')} {totalPages} interface PaginationControlsProps { which: 'top' | 'bottom' inputValue: number totalPages: number totalItems: number currentPage: number disabled?: boolean useQueryVars?: boolean setInputValue: (value: number) => void setCurrentPage: (page: number) => void } type NavigationLinksProps = Omit const NavigationLinks: React.FC = ({ which, disabled, totalPages, inputValue, currentPage, useQueryVars, setCurrentPage, setInputValue }) => ( setCurrentPage(inputValue)} />{'\n'} ) const PaginationControls: React.FC = ({ which, disabled, totalPages, totalItems, inputValue, currentPage, useQueryVars, setCurrentPage, setInputValue }) => { const navLabel = 'top' === which ? __('Pagination, before the table', 'code-snippets') : __('Pagination, after the table', 'code-snippets') return ( ) } export interface TablePaginationProps extends Omit, Required> { which: 'top' | 'bottom' totalItems: number disabled?: boolean currentPage: number setCurrentPage: (page: number) => void } export const TablePagination: React.FC = ({ which, disabled, totalItems, currentPage, totalPages, useQueryVars, setCurrentPage }) => { const [inputValue, setInputValue] = useState(currentPage) const setCurrentPageSafe = (page: number) => { if (page) { const validPage = Math.max(1, Math.min(page, totalPages)) setInputValue(validPage) setCurrentPage(validPage) if (useQueryVars) { updateQueryParams({ paged: 1 === validPage ? undefined : validPage }) } } } return ( ) }