CHORE(merge): merge from develop
- Initial setup and all features from develop branch - Includes: auth, deploy, docker, style fixes - K3S deployment configuration
This commit is contained in:
87
nextjs/components/Pagination.tsx
Normal file
87
nextjs/components/Pagination.tsx
Normal file
@@ -0,0 +1,87 @@
|
||||
interface PaginationProps {
|
||||
currentPage: number;
|
||||
totalPages: number;
|
||||
onPageChange: (page: number) => void;
|
||||
}
|
||||
|
||||
export default function Pagination({
|
||||
currentPage,
|
||||
totalPages,
|
||||
onPageChange,
|
||||
}: PaginationProps) {
|
||||
if (totalPages <= 1) return null;
|
||||
|
||||
const getPageNumbers = () => {
|
||||
const pages: (number | string)[] = [];
|
||||
const maxVisible = 5;
|
||||
|
||||
if (totalPages <= maxVisible) {
|
||||
for (let i = 1; i <= totalPages; i++) pages.push(i);
|
||||
} else {
|
||||
if (currentPage <= 3) {
|
||||
for (let i = 1; i <= 4; i++) pages.push(i);
|
||||
pages.push('...');
|
||||
pages.push(totalPages);
|
||||
} else if (currentPage >= totalPages - 2) {
|
||||
pages.push(1);
|
||||
pages.push('...');
|
||||
for (let i = totalPages - 3; i <= totalPages; i++) pages.push(i);
|
||||
} else {
|
||||
pages.push(1);
|
||||
pages.push('...');
|
||||
for (let i = currentPage - 1; i <= currentPage + 1; i++) pages.push(i);
|
||||
pages.push('...');
|
||||
pages.push(totalPages);
|
||||
}
|
||||
}
|
||||
return pages;
|
||||
};
|
||||
|
||||
return (
|
||||
<div className="flex justify-center items-center gap-2 mt-8">
|
||||
<button
|
||||
onClick={() => onPageChange(currentPage - 1)}
|
||||
disabled={currentPage === 1}
|
||||
className={`px-3 py-2 rounded-lg border transition-colors disabled:opacity-50 disabled:cursor-not-allowed ${
|
||||
currentPage === 1
|
||||
? 'border-gray-300 text-gray-400'
|
||||
: 'border-[#94b7d6] text-[#6d96c5] hover:bg-[#a9c6e1]'
|
||||
}`}
|
||||
>
|
||||
이전
|
||||
</button>
|
||||
|
||||
{getPageNumbers().map((page, idx) =>
|
||||
typeof page === 'number' ? (
|
||||
<button
|
||||
key={idx}
|
||||
onClick={() => onPageChange(page)}
|
||||
className={`w-10 h-10 flex items-center justify-center rounded-lg transition-colors ${
|
||||
currentPage === page
|
||||
? 'bg-[#6d96c5] text-white'
|
||||
: 'border border-[#94b7d6] text-[#6d96c5] hover:bg-[#a9c6e1]'
|
||||
}`}
|
||||
>
|
||||
{page}
|
||||
</button>
|
||||
) : (
|
||||
<span key={idx} className="px-2">
|
||||
{page}
|
||||
</span>
|
||||
)
|
||||
)}
|
||||
|
||||
<button
|
||||
onClick={() => onPageChange(currentPage + 1)}
|
||||
disabled={currentPage === totalPages}
|
||||
className={`px-3 py-2 rounded-lg border transition-colors disabled:opacity-50 disabled:cursor-not-allowed ${
|
||||
currentPage === totalPages
|
||||
? 'border-gray-300 text-gray-400'
|
||||
: 'border-[#94b7d6] text-[#6d96c5] hover:bg-[#a9c6e1]'
|
||||
}`}
|
||||
>
|
||||
다음
|
||||
</button>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
Reference in New Issue
Block a user