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

This commit is contained in:
2025-10-03 02:08:23 +07:00
parent b80bd402a2
commit a4bd1ab1d4
10 changed files with 922 additions and 190 deletions
+93
View File
@@ -0,0 +1,93 @@
/**
* Универсальный компонент пагинации
* Устраняет дублирование кода пагинации во всех менеджерах
*/
function Pagination({ currentPage, totalPages, totalItems, pageSize, onPageChange }) {
if (totalPages <= 1) return null;
const renderPages = () => {
const pages = [];
let start = Math.max(1, currentPage - 2);
let end = Math.min(totalPages, currentPage + 2);
if (currentPage <= 3) {
end = Math.min(totalPages, 5);
}
if (currentPage >= totalPages - 2) {
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');
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>
);
});
};
const startItem = (currentPage - 1) * pageSize + 1;
const endItem = Math.min(currentPage * pageSize, totalItems);
return (
<div className="card-footer d-flex align-items-center justify-content-between">
<div className="text-muted">
Показано {startItem} - {endItem} из {totalItems}
</div>
<ul className="pagination m-0">
<li className={`page-item${currentPage === 1 ? ' disabled' : ''}`}>
<button
className="page-link"
onClick={() => onPageChange(1)}
disabled={currentPage === 1}
>
Первая
</button>
</li>
<li className={`page-item${currentPage === 1 ? ' disabled' : ''}`}>
<button
className="page-link"
onClick={() => onPageChange(currentPage - 1)}
disabled={currentPage === 1}
>
Назад
</button>
</li>
{renderPages()}
<li className={`page-item${currentPage === totalPages ? ' disabled' : ''}`}>
<button
className="page-link"
onClick={() => onPageChange(currentPage + 1)}
disabled={currentPage === totalPages}
>
Вперед
</button>
</li>
<li className={`page-item${currentPage === totalPages ? ' disabled' : ''}`}>
<button
className="page-link"
onClick={() => onPageChange(totalPages)}
disabled={currentPage === totalPages}
>
Последняя
</button>
</li>
</ul>
</div>
);
}
export default Pagination;