feat: Удаление устаревших файлов документации и оптимизация структуры проекта. Упрощение кода и улучшение читаемости за счет удаления ненужных компонентов и отчетов, что способствует более эффективному управлению проектом.
Publish Fast Tabler Docker image / build-and-push-fast (push) Successful in 1m34s
Publish Fast Tabler Docker image / build-and-push-fast (push) Successful in 1m34s
This commit is contained in:
@@ -1,13 +1,14 @@
|
||||
import { useMemo } from 'react';
|
||||
|
||||
/**
|
||||
* Универсальный компонент пагинации
|
||||
* Устраняет дублирование кода пагинации во всех менеджерах
|
||||
* Оптимизирован: useMemo для вычисления страниц
|
||||
*/
|
||||
|
||||
function Pagination({ currentPage, totalPages, totalItems, pageSize, onPageChange }) {
|
||||
if (totalPages <= 1) return null;
|
||||
|
||||
const renderPages = () => {
|
||||
const pages = [];
|
||||
const pages = useMemo(() => {
|
||||
const result = [];
|
||||
let start = Math.max(1, currentPage - 2);
|
||||
let end = Math.min(totalPages, currentPage + 2);
|
||||
|
||||
@@ -18,25 +19,14 @@ function Pagination({ currentPage, totalPages, totalItems, pageSize, onPageChang
|
||||
start = Math.max(1, totalPages - 4);
|
||||
}
|
||||
|
||||
if (start > 1) pages.push('start-ellipsis');
|
||||
for (let p = start; p <= end; p++) pages.push(p);
|
||||
if (end < totalPages) pages.push('end-ellipsis');
|
||||
if (start > 1) result.push({ type: 'ellipsis', key: 'start-ellipsis' });
|
||||
for (let p = start; p <= end; p++) {
|
||||
result.push({ type: 'page', page: p, key: p });
|
||||
}
|
||||
if (end < totalPages) result.push({ type: 'ellipsis', key: 'end-ellipsis' });
|
||||
|
||||
return pages.map((p) => {
|
||||
if (p === 'start-ellipsis' || p === 'end-ellipsis') {
|
||||
return (
|
||||
<li key={p} className="page-item disabled">
|
||||
<span className="page-link">…</span>
|
||||
</li>
|
||||
);
|
||||
}
|
||||
return (
|
||||
<li key={p} className={`page-item${currentPage === p ? ' active' : ''}`}>
|
||||
<button className="page-link" onClick={() => onPageChange(p)}>{p}</button>
|
||||
</li>
|
||||
);
|
||||
});
|
||||
};
|
||||
return result;
|
||||
}, [currentPage, totalPages]);
|
||||
|
||||
const startItem = (currentPage - 1) * pageSize + 1;
|
||||
const endItem = Math.min(currentPage * pageSize, totalItems);
|
||||
@@ -52,6 +42,7 @@ function Pagination({ currentPage, totalPages, totalItems, pageSize, onPageChang
|
||||
className="page-link"
|
||||
onClick={() => onPageChange(1)}
|
||||
disabled={currentPage === 1}
|
||||
aria-label="Первая страница"
|
||||
>
|
||||
Первая
|
||||
</button>
|
||||
@@ -61,16 +52,38 @@ function Pagination({ currentPage, totalPages, totalItems, pageSize, onPageChang
|
||||
className="page-link"
|
||||
onClick={() => onPageChange(currentPage - 1)}
|
||||
disabled={currentPage === 1}
|
||||
aria-label="Предыдущая страница"
|
||||
>
|
||||
Назад
|
||||
</button>
|
||||
</li>
|
||||
{renderPages()}
|
||||
{pages.map((item) => {
|
||||
if (item.type === 'ellipsis') {
|
||||
return (
|
||||
<li key={item.key} className="page-item disabled">
|
||||
<span className="page-link">…</span>
|
||||
</li>
|
||||
);
|
||||
}
|
||||
return (
|
||||
<li key={item.key} className={`page-item${currentPage === item.page ? ' active' : ''}`}>
|
||||
<button
|
||||
className="page-link"
|
||||
onClick={() => onPageChange(item.page)}
|
||||
aria-label={`Страница ${item.page}`}
|
||||
aria-current={currentPage === item.page ? 'page' : undefined}
|
||||
>
|
||||
{item.page}
|
||||
</button>
|
||||
</li>
|
||||
);
|
||||
})}
|
||||
<li className={`page-item${currentPage === totalPages ? ' disabled' : ''}`}>
|
||||
<button
|
||||
className="page-link"
|
||||
onClick={() => onPageChange(currentPage + 1)}
|
||||
disabled={currentPage === totalPages}
|
||||
aria-label="Следующая страница"
|
||||
>
|
||||
Вперед
|
||||
</button>
|
||||
@@ -80,6 +93,7 @@ function Pagination({ currentPage, totalPages, totalItems, pageSize, onPageChang
|
||||
className="page-link"
|
||||
onClick={() => onPageChange(totalPages)}
|
||||
disabled={currentPage === totalPages}
|
||||
aria-label="Последняя страница"
|
||||
>
|
||||
Последняя
|
||||
</button>
|
||||
@@ -90,4 +104,3 @@ function Pagination({ currentPage, totalPages, totalItems, pageSize, onPageChang
|
||||
}
|
||||
|
||||
export default Pagination;
|
||||
|
||||
|
||||
Reference in New Issue
Block a user