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

97 lines
3.1 KiB
TypeScript
Raw Normal View History

'use client';
2023-09-10 20:17:18 +03:00
import { Table } from '@tanstack/react-table';
import clsx from 'clsx';
2023-09-10 20:17:18 +03:00
import { useCallback } from 'react';
2023-12-16 19:20:26 +03:00
import { BiChevronLeft, BiChevronRight, BiFirstPage, BiLastPage } from 'react-icons/bi';
2023-09-10 20:17:18 +03:00
import { prefixes } from '@/utils/constants';
2023-09-10 20:17:18 +03:00
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={clsx(
'flex justify-end items-center',
2023-12-18 20:45:33 +03:00
'my-2',
'text-sm',
'clr-text-controls',
'select-none'
)}>
2023-12-18 20:45:33 +03:00
<span className='mr-3'>
{`${table.getState().pagination.pageIndex * table.getState().pagination.pageSize + 1}
-
${Math.min(table.getFilteredRowModel().rows.length, (table.getState().pagination.pageIndex + 1) * table.getState().pagination.pageSize)}
из
${table.getFilteredRowModel().rows.length}`}
</span>
<div className='flex'>
<button type='button'
className='clr-hover clr-text-controls'
onClick={() => table.setPageIndex(0)}
disabled={!table.getCanPreviousPage()}
>
2023-12-16 19:20:26 +03:00
<BiFirstPage size='1.5rem' />
</button>
<button type='button'
className='clr-hover clr-text-controls'
onClick={() => table.previousPage()}
disabled={!table.getCanPreviousPage()}
>
2023-12-16 19:20:26 +03:00
<BiChevronLeft size='1.5rem' />
</button>
<input
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 clr-text-controls'
onClick={() => table.nextPage()}
disabled={!table.getCanNextPage()}
>
2023-12-16 19:20:26 +03:00
<BiChevronRight size='1.5rem' />
</button>
<button type='button'
className='clr-hover clr-text-controls'
onClick={() => table.setPageIndex(table.getPageCount() - 1)}
disabled={!table.getCanNextPage()}
>
2023-12-16 19:20:26 +03:00
<BiLastPage size='1.5rem' />
</button>
</div>
<select
value={table.getState().pagination.pageSize}
onChange={handlePaginationOptionsChange}
className='mx-2 cursor-pointer clr-app'
2023-09-10 20:17:18 +03:00
>
{paginationOptions.map(
(pageSize) => (
<option key={`${prefixes.page_size}${pageSize}`} value={pageSize}>
{pageSize} на стр
</option>
))}
</select>
2023-09-10 20:17:18 +03:00
</div>);
}
2023-12-26 14:23:51 +03:00
export default PaginationTools;