ConceptPortal-public/rsconcept/frontend/src/components/DataTable/PaginationTools.tsx

91 lines
2.9 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import { Table } from '@tanstack/react-table';
import { useCallback } from 'react';
import { prefixes } from '../../utils/constants';
import { GotoFirstIcon, GotoLastIcon, GotoNextIcon, GotoPrevIcon } from '../Icons';
interface PaginationToolsProps<TData> {
table: Table<TData>
paginationOptions: number[]
onChangePaginationOption?: (newValue: number) => void
}
function PaginationTools<TData>({ table, paginationOptions, onChangePaginationOption }: PaginationToolsProps<TData>) {
const handlePaginationOptionsChange = useCallback(
(event: React.ChangeEvent<HTMLSelectElement>) => {
const perPage = Number(event.target.value);
table.setPageSize(perPage);
if (onChangePaginationOption) {
onChangePaginationOption(perPage);
}
}, [onChangePaginationOption, table]);
return (
<div className='flex items-center justify-end w-full my-2 text-sm select-none text-controls'>
<div className='flex items-center gap-1 mr-3'>
<div className=''>
{table.getState().pagination.pageIndex * table.getState().pagination.pageSize + 1}
-
{Math.min(table.getFilteredRowModel().rows.length, (table.getState().pagination.pageIndex + 1) * table.getState().pagination.pageSize)}
</div>
<span>из</span>
<div className=''>{table.getFilteredRowModel().rows.length}</div>
</div>
<div className='flex'>
<button type='button'
className='clr-hover text-controls'
onClick={() => table.setPageIndex(0)}
disabled={!table.getCanPreviousPage()}
>
<GotoFirstIcon />
</button>
<button type='button'
className='clr-hover text-controls'
onClick={() => table.previousPage()}
disabled={!table.getCanPreviousPage()}
>
<GotoPrevIcon />
</button>
<input type='text'
title='Номер страницы. Выделите для ручного ввода'
className='w-6 text-center clr-app'
value={table.getState().pagination.pageIndex + 1}
onChange={event => {
const page = event.target.value ? Number(event.target.value) - 1 : 0;
if (page + 1 <= table.getPageCount()) {
table.setPageIndex(page);
}
}}
/>
<button type='button'
className='clr-hover text-controls'
onClick={() => table.nextPage()}
disabled={!table.getCanNextPage()}
>
<GotoNextIcon />
</button>
<button type='button'
className='clr-hover text-controls'
onClick={() => table.setPageIndex(table.getPageCount() - 1)}
disabled={!table.getCanNextPage()}
>
<GotoLastIcon />
</button>
</div>
<select
value={table.getState().pagination.pageSize}
onChange={handlePaginationOptionsChange}
className='mx-2 cursor-pointer clr-app'
>
{paginationOptions.map(
(pageSize) => (
<option key={`${prefixes.page_size}${pageSize}`} value={pageSize}>
{pageSize} на стр
</option>
))}
</select>
</div>);
}
export default PaginationTools;