feat: Удаление устаревших файлов документации и оптимизация структуры проекта. Упрощение кода и улучшение читаемости за счет удаления ненужных компонентов и отчетов, что способствует более эффективному управлению проектом.
Publish Fast Tabler Docker image / build-and-push-fast (push) Successful in 1m34s

This commit is contained in:
2025-10-03 09:30:53 +07:00
parent a4bd1ab1d4
commit 2ae26801c4
18 changed files with 417 additions and 6528 deletions
+37 -24
View File
@@ -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;