admin 페이지들 버튼 커서 변경1
This commit is contained in:
@@ -65,7 +65,7 @@ export default function AdminCertificatesPage() {
|
|||||||
type="button"
|
type="button"
|
||||||
onClick={() => setCurrentPage(1)}
|
onClick={() => setCurrentPage(1)}
|
||||||
aria-label="맨 앞 페이지"
|
aria-label="맨 앞 페이지"
|
||||||
className="flex items-center justify-center rounded-[1000px] p-[8.615px] size-[32px] text-[#333c47] disabled:opacity-40"
|
className="flex items-center justify-center rounded-[1000px] p-[8.615px] size-[32px] text-[#333c47] disabled:opacity-40 cursor-pointer disabled:cursor-not-allowed"
|
||||||
disabled={currentPage === 1}
|
disabled={currentPage === 1}
|
||||||
>
|
>
|
||||||
<div className="relative flex items-center justify-center w-full h-full">
|
<div className="relative flex items-center justify-center w-full h-full">
|
||||||
@@ -79,7 +79,7 @@ export default function AdminCertificatesPage() {
|
|||||||
type="button"
|
type="button"
|
||||||
onClick={() => setCurrentPage((p) => Math.max(1, p - 1))}
|
onClick={() => setCurrentPage((p) => Math.max(1, p - 1))}
|
||||||
aria-label="이전 페이지"
|
aria-label="이전 페이지"
|
||||||
className="flex items-center justify-center rounded-[1000px] p-[8.615px] size-[32px] text-[#333c47] disabled:opacity-40"
|
className="flex items-center justify-center rounded-[1000px] p-[8.615px] size-[32px] text-[#333c47] disabled:opacity-40 cursor-pointer disabled:cursor-not-allowed"
|
||||||
disabled={currentPage === 1}
|
disabled={currentPage === 1}
|
||||||
>
|
>
|
||||||
<ChevronDownSvg width={14.8} height={14.8} className="rotate-90" />
|
<ChevronDownSvg width={14.8} height={14.8} className="rotate-90" />
|
||||||
@@ -95,7 +95,7 @@ export default function AdminCertificatesPage() {
|
|||||||
onClick={() => setCurrentPage(n)}
|
onClick={() => setCurrentPage(n)}
|
||||||
aria-current={active ? 'page' : undefined}
|
aria-current={active ? 'page' : undefined}
|
||||||
className={[
|
className={[
|
||||||
'flex items-center justify-center rounded-[1000px] size-[32px]',
|
'flex items-center justify-center rounded-[1000px] size-[32px] cursor-pointer',
|
||||||
active ? 'bg-[#ecf0ff]' : 'bg-white',
|
active ? 'bg-[#ecf0ff]' : 'bg-white',
|
||||||
].join(' ')}
|
].join(' ')}
|
||||||
>
|
>
|
||||||
@@ -109,7 +109,7 @@ export default function AdminCertificatesPage() {
|
|||||||
type="button"
|
type="button"
|
||||||
onClick={() => setCurrentPage((p) => Math.min(totalPages, p + 1))}
|
onClick={() => setCurrentPage((p) => Math.min(totalPages, p + 1))}
|
||||||
aria-label="다음 페이지"
|
aria-label="다음 페이지"
|
||||||
className="flex items-center justify-center rounded-[1000px] p-[8.615px] size-[32px] text-[#333c47] disabled:opacity-40"
|
className="flex items-center justify-center rounded-[1000px] p-[8.615px] size-[32px] text-[#333c47] disabled:opacity-40 cursor-pointer disabled:cursor-not-allowed"
|
||||||
disabled={currentPage === totalPages}
|
disabled={currentPage === totalPages}
|
||||||
>
|
>
|
||||||
<ChevronDownSvg width={14.8} height={14.8} className="-rotate-90" />
|
<ChevronDownSvg width={14.8} height={14.8} className="-rotate-90" />
|
||||||
@@ -120,7 +120,7 @@ export default function AdminCertificatesPage() {
|
|||||||
type="button"
|
type="button"
|
||||||
onClick={() => setCurrentPage(totalPages)}
|
onClick={() => setCurrentPage(totalPages)}
|
||||||
aria-label="맨 뒤 페이지"
|
aria-label="맨 뒤 페이지"
|
||||||
className="flex items-center justify-center rounded-[1000px] p-[8.615px] size-[32px] text-[#333c47] disabled:opacity-40"
|
className="flex items-center justify-center rounded-[1000px] p-[8.615px] size-[32px] text-[#333c47] disabled:opacity-40 cursor-pointer disabled:cursor-not-allowed"
|
||||||
disabled={currentPage === totalPages}
|
disabled={currentPage === totalPages}
|
||||||
>
|
>
|
||||||
<div className="relative flex items-center justify-center w-full h-full">
|
<div className="relative flex items-center justify-center w-full h-full">
|
||||||
|
|||||||
@@ -193,7 +193,7 @@ export default function CourseRegistrationModal({ open, onClose, onSave, onDelet
|
|||||||
<button
|
<button
|
||||||
type="button"
|
type="button"
|
||||||
onClick={() => setIsDropdownOpen(!isDropdownOpen)}
|
onClick={() => setIsDropdownOpen(!isDropdownOpen)}
|
||||||
className={`w-full h-[40px] px-3 py-2 border rounded-[8px] bg-white flex items-center justify-between text-left focus:outline-none focus:ring-2 ${
|
className={`w-full h-[40px] px-3 py-2 border rounded-[8px] bg-white flex items-center justify-between text-left focus:outline-none focus:ring-2 cursor-pointer ${
|
||||||
errors.instructor
|
errors.instructor
|
||||||
? "border-[#f64c4c] focus:ring-[#f64c4c] focus:border-[#f64c4c]"
|
? "border-[#f64c4c] focus:ring-[#f64c4c] focus:border-[#f64c4c]"
|
||||||
: "border-[#dee1e6] focus:ring-[#1f2b91] focus:border-transparent"
|
: "border-[#dee1e6] focus:ring-[#1f2b91] focus:border-transparent"
|
||||||
@@ -230,7 +230,7 @@ export default function CourseRegistrationModal({ open, onClose, onSave, onDelet
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
}}
|
}}
|
||||||
className={`w-full px-3 py-2 text-left text-[16px] font-normal leading-[1.5] hover:bg-[#f1f3f5] transition-colors ${
|
className={`w-full px-3 py-2 text-left text-[16px] font-normal leading-[1.5] hover:bg-[#f1f3f5] transition-colors cursor-pointer ${
|
||||||
instructorId === instructor.id
|
instructorId === instructor.id
|
||||||
? "bg-[#ecf0ff] text-[#1f2b91] font-semibold"
|
? "bg-[#ecf0ff] text-[#1f2b91] font-semibold"
|
||||||
: "text-[#1b2027]"
|
: "text-[#1b2027]"
|
||||||
@@ -301,7 +301,7 @@ export default function CourseRegistrationModal({ open, onClose, onSave, onDelet
|
|||||||
<button
|
<button
|
||||||
type="button"
|
type="button"
|
||||||
onClick={handleDeleteClick}
|
onClick={handleDeleteClick}
|
||||||
className="h-[48px] px-4 rounded-[10px] bg-[#fef2f2] text-[16px] font-semibold leading-[1.5] text-[#f64c4c] w-[136px] hover:bg-[#fae6e6] transition-colors"
|
className="h-[48px] px-4 rounded-[10px] bg-[#fef2f2] text-[16px] font-semibold leading-[1.5] text-[#f64c4c] w-[136px] hover:bg-[#fae6e6] transition-colors cursor-pointer"
|
||||||
>
|
>
|
||||||
삭제
|
삭제
|
||||||
</button>
|
</button>
|
||||||
@@ -309,14 +309,14 @@ export default function CourseRegistrationModal({ open, onClose, onSave, onDelet
|
|||||||
<button
|
<button
|
||||||
type="button"
|
type="button"
|
||||||
onClick={onClose}
|
onClick={onClose}
|
||||||
className="h-[48px] px-4 rounded-[10px] bg-[#f1f3f5] text-[16px] font-semibold leading-[1.5] text-[#4c5561] w-[136px] hover:bg-[#e5e7eb] transition-colors"
|
className="h-[48px] px-4 rounded-[10px] bg-[#f1f3f5] text-[16px] font-semibold leading-[1.5] text-[#4c5561] w-[136px] hover:bg-[#e5e7eb] transition-colors cursor-pointer"
|
||||||
>
|
>
|
||||||
취소
|
취소
|
||||||
</button>
|
</button>
|
||||||
<button
|
<button
|
||||||
type="button"
|
type="button"
|
||||||
onClick={handleSave}
|
onClick={handleSave}
|
||||||
className="h-[48px] px-4 rounded-[10px] bg-[#1f2b91] text-[16px] font-semibold leading-[1.5] text-white w-[136px] hover:bg-[#1a2478] transition-colors"
|
className="h-[48px] px-4 rounded-[10px] bg-[#1f2b91] text-[16px] font-semibold leading-[1.5] text-white w-[136px] hover:bg-[#1a2478] transition-colors cursor-pointer"
|
||||||
>
|
>
|
||||||
저장
|
저장
|
||||||
</button>
|
</button>
|
||||||
|
|||||||
@@ -107,7 +107,7 @@ export default function AdminCoursesPage() {
|
|||||||
<button
|
<button
|
||||||
type="button"
|
type="button"
|
||||||
onClick={handleRegisterClick}
|
onClick={handleRegisterClick}
|
||||||
className="h-[40px] px-4 rounded-[8px] bg-[#1f2b91] text-[16px] font-semibold leading-[1.5] text-white whitespace-nowrap hover:bg-[#1a2478] transition-colors"
|
className="h-[40px] px-4 rounded-[8px] bg-[#1f2b91] text-[16px] font-semibold leading-[1.5] text-white whitespace-nowrap hover:bg-[#1a2478] transition-colors cursor-pointer"
|
||||||
>
|
>
|
||||||
등록하기
|
등록하기
|
||||||
</button>
|
</button>
|
||||||
@@ -201,7 +201,7 @@ export default function AdminCoursesPage() {
|
|||||||
type="button"
|
type="button"
|
||||||
onClick={() => setCurrentPage(1)}
|
onClick={() => setCurrentPage(1)}
|
||||||
aria-label="맨 앞 페이지"
|
aria-label="맨 앞 페이지"
|
||||||
className="flex items-center justify-center rounded-[1000px] p-[8.615px] size-[32px] text-[#333c47] disabled:opacity-40"
|
className="flex items-center justify-center rounded-[1000px] p-[8.615px] size-[32px] text-[#333c47] disabled:opacity-40 cursor-pointer disabled:cursor-not-allowed"
|
||||||
disabled={currentPage === 1}
|
disabled={currentPage === 1}
|
||||||
>
|
>
|
||||||
<div className="relative flex items-center justify-center w-full h-full">
|
<div className="relative flex items-center justify-center w-full h-full">
|
||||||
@@ -215,7 +215,7 @@ export default function AdminCoursesPage() {
|
|||||||
type="button"
|
type="button"
|
||||||
onClick={() => setCurrentPage((p) => Math.max(1, p - 1))}
|
onClick={() => setCurrentPage((p) => Math.max(1, p - 1))}
|
||||||
aria-label="이전 페이지"
|
aria-label="이전 페이지"
|
||||||
className="flex items-center justify-center rounded-[1000px] p-[8.615px] size-[32px] text-[#333c47] disabled:opacity-40"
|
className="flex items-center justify-center rounded-[1000px] p-[8.615px] size-[32px] text-[#333c47] disabled:opacity-40 cursor-pointer disabled:cursor-not-allowed"
|
||||||
disabled={currentPage === 1}
|
disabled={currentPage === 1}
|
||||||
>
|
>
|
||||||
<ChevronDownSvg width={14.8} height={14.8} className="rotate-90" />
|
<ChevronDownSvg width={14.8} height={14.8} className="rotate-90" />
|
||||||
@@ -231,7 +231,7 @@ export default function AdminCoursesPage() {
|
|||||||
onClick={() => setCurrentPage(n)}
|
onClick={() => setCurrentPage(n)}
|
||||||
aria-current={active ? 'page' : undefined}
|
aria-current={active ? 'page' : undefined}
|
||||||
className={[
|
className={[
|
||||||
'flex items-center justify-center rounded-[1000px] size-[32px]',
|
'flex items-center justify-center rounded-[1000px] size-[32px] cursor-pointer',
|
||||||
active ? 'bg-[#ecf0ff]' : 'bg-white',
|
active ? 'bg-[#ecf0ff]' : 'bg-white',
|
||||||
].join(' ')}
|
].join(' ')}
|
||||||
>
|
>
|
||||||
@@ -245,7 +245,7 @@ export default function AdminCoursesPage() {
|
|||||||
type="button"
|
type="button"
|
||||||
onClick={() => setCurrentPage((p) => Math.min(totalPages, p + 1))}
|
onClick={() => setCurrentPage((p) => Math.min(totalPages, p + 1))}
|
||||||
aria-label="다음 페이지"
|
aria-label="다음 페이지"
|
||||||
className="flex items-center justify-center rounded-[1000px] p-[8.615px] size-[32px] text-[#333c47] disabled:opacity-40"
|
className="flex items-center justify-center rounded-[1000px] p-[8.615px] size-[32px] text-[#333c47] disabled:opacity-40 cursor-pointer disabled:cursor-not-allowed"
|
||||||
disabled={currentPage === totalPages}
|
disabled={currentPage === totalPages}
|
||||||
>
|
>
|
||||||
<ChevronDownSvg width={14.8} height={14.8} className="-rotate-90" />
|
<ChevronDownSvg width={14.8} height={14.8} className="-rotate-90" />
|
||||||
@@ -256,7 +256,7 @@ export default function AdminCoursesPage() {
|
|||||||
type="button"
|
type="button"
|
||||||
onClick={() => setCurrentPage(totalPages)}
|
onClick={() => setCurrentPage(totalPages)}
|
||||||
aria-label="맨 뒤 페이지"
|
aria-label="맨 뒤 페이지"
|
||||||
className="flex items-center justify-center rounded-[1000px] p-[8.615px] size-[32px] text-[#333c47] disabled:opacity-40"
|
className="flex items-center justify-center rounded-[1000px] p-[8.615px] size-[32px] text-[#333c47] disabled:opacity-40 cursor-pointer disabled:cursor-not-allowed"
|
||||||
disabled={currentPage === totalPages}
|
disabled={currentPage === totalPages}
|
||||||
>
|
>
|
||||||
<div className="relative flex items-center justify-center w-full h-full">
|
<div className="relative flex items-center justify-center w-full h-full">
|
||||||
|
|||||||
@@ -186,7 +186,7 @@ export default function AdminIdPage() {
|
|||||||
type="button"
|
type="button"
|
||||||
onClick={() => setActiveTab(tab.id)}
|
onClick={() => setActiveTab(tab.id)}
|
||||||
className={[
|
className={[
|
||||||
"pb-4 px-1 text-[16px] font-medium leading-[1.5] transition-colors relative",
|
"pb-4 px-1 text-[16px] font-medium leading-[1.5] transition-colors relative cursor-pointer",
|
||||||
activeTab === tab.id
|
activeTab === tab.id
|
||||||
? "text-[#1f2b91] font-semibold"
|
? "text-[#1f2b91] font-semibold"
|
||||||
: "text-[#6c7682]",
|
: "text-[#6c7682]",
|
||||||
@@ -269,7 +269,7 @@ export default function AdminIdPage() {
|
|||||||
type="button"
|
type="button"
|
||||||
onClick={() => changeUserRole(user.id, role)}
|
onClick={() => changeUserRole(user.id, role)}
|
||||||
className={[
|
className={[
|
||||||
"w-full px-4 py-2 text-left text-[14px] leading-[1.5] hover:bg-gray-50 transition-colors",
|
"w-full px-4 py-2 text-left text-[14px] leading-[1.5] hover:bg-gray-50 transition-colors cursor-pointer",
|
||||||
user.role === role
|
user.role === role
|
||||||
? "text-[#1f2b91] font-semibold bg-[#ecf0ff]"
|
? "text-[#1f2b91] font-semibold bg-[#ecf0ff]"
|
||||||
: "text-[#1b2027]",
|
: "text-[#1b2027]",
|
||||||
@@ -303,7 +303,7 @@ export default function AdminIdPage() {
|
|||||||
<button
|
<button
|
||||||
type="button"
|
type="button"
|
||||||
onClick={() => toggleAccountStatus(user.id)}
|
onClick={() => toggleAccountStatus(user.id)}
|
||||||
className="text-[12px] text-blue-500 underline underline-offset-[3px] cursor-pointer whitespace-nowrap"
|
className="text-[12px] text-blue-500 underline underline-offset-[3px] cursor-pointer whitespace-nowrap hover:opacity-80"
|
||||||
>
|
>
|
||||||
{user.status === 'active' ? '비활성화 처리' : '활성화 처리'}
|
{user.status === 'active' ? '비활성화 처리' : '활성화 처리'}
|
||||||
</button>
|
</button>
|
||||||
@@ -331,7 +331,7 @@ export default function AdminIdPage() {
|
|||||||
type="button"
|
type="button"
|
||||||
onClick={() => setCurrentPage(1)}
|
onClick={() => setCurrentPage(1)}
|
||||||
aria-label="맨 앞 페이지"
|
aria-label="맨 앞 페이지"
|
||||||
className="flex items-center justify-center rounded-[1000px] p-[8.615px] size-[32px] text-[#333c47] disabled:opacity-40"
|
className="flex items-center justify-center rounded-[1000px] p-[8.615px] size-[32px] text-[#333c47] disabled:opacity-40 cursor-pointer disabled:cursor-not-allowed"
|
||||||
disabled={currentPage === 1}
|
disabled={currentPage === 1}
|
||||||
>
|
>
|
||||||
<div className="relative flex items-center justify-center w-full h-full">
|
<div className="relative flex items-center justify-center w-full h-full">
|
||||||
@@ -345,7 +345,7 @@ export default function AdminIdPage() {
|
|||||||
type="button"
|
type="button"
|
||||||
onClick={() => setCurrentPage((p) => Math.max(1, p - 1))}
|
onClick={() => setCurrentPage((p) => Math.max(1, p - 1))}
|
||||||
aria-label="이전 페이지"
|
aria-label="이전 페이지"
|
||||||
className="flex items-center justify-center rounded-[1000px] p-[8.615px] size-[32px] text-[#333c47] disabled:opacity-40"
|
className="flex items-center justify-center rounded-[1000px] p-[8.615px] size-[32px] text-[#333c47] disabled:opacity-40 cursor-pointer disabled:cursor-not-allowed"
|
||||||
disabled={currentPage === 1}
|
disabled={currentPage === 1}
|
||||||
>
|
>
|
||||||
<ChevronDownSvg width={14.8} height={14.8} className="rotate-90" />
|
<ChevronDownSvg width={14.8} height={14.8} className="rotate-90" />
|
||||||
@@ -361,7 +361,7 @@ export default function AdminIdPage() {
|
|||||||
onClick={() => setCurrentPage(n)}
|
onClick={() => setCurrentPage(n)}
|
||||||
aria-current={active ? 'page' : undefined}
|
aria-current={active ? 'page' : undefined}
|
||||||
className={[
|
className={[
|
||||||
'flex items-center justify-center rounded-[1000px] size-[32px]',
|
'flex items-center justify-center rounded-[1000px] size-[32px] cursor-pointer',
|
||||||
active ? 'bg-[#ecf0ff]' : 'bg-white',
|
active ? 'bg-[#ecf0ff]' : 'bg-white',
|
||||||
].join(' ')}
|
].join(' ')}
|
||||||
>
|
>
|
||||||
@@ -375,7 +375,7 @@ export default function AdminIdPage() {
|
|||||||
type="button"
|
type="button"
|
||||||
onClick={() => setCurrentPage((p) => Math.min(totalPages, p + 1))}
|
onClick={() => setCurrentPage((p) => Math.min(totalPages, p + 1))}
|
||||||
aria-label="다음 페이지"
|
aria-label="다음 페이지"
|
||||||
className="flex items-center justify-center rounded-[1000px] p-[8.615px] size-[32px] text-[#333c47] disabled:opacity-40"
|
className="flex items-center justify-center rounded-[1000px] p-[8.615px] size-[32px] text-[#333c47] disabled:opacity-40 cursor-pointer disabled:cursor-not-allowed"
|
||||||
disabled={currentPage === totalPages}
|
disabled={currentPage === totalPages}
|
||||||
>
|
>
|
||||||
<ChevronDownSvg width={14.8} height={14.8} className="-rotate-90" />
|
<ChevronDownSvg width={14.8} height={14.8} className="-rotate-90" />
|
||||||
@@ -386,7 +386,7 @@ export default function AdminIdPage() {
|
|||||||
type="button"
|
type="button"
|
||||||
onClick={() => setCurrentPage(totalPages)}
|
onClick={() => setCurrentPage(totalPages)}
|
||||||
aria-label="맨 뒤 페이지"
|
aria-label="맨 뒤 페이지"
|
||||||
className="flex items-center justify-center rounded-[1000px] p-[8.615px] size-[32px] text-[#333c47] disabled:opacity-40"
|
className="flex items-center justify-center rounded-[1000px] p-[8.615px] size-[32px] text-[#333c47] disabled:opacity-40 cursor-pointer disabled:cursor-not-allowed"
|
||||||
disabled={currentPage === totalPages}
|
disabled={currentPage === totalPages}
|
||||||
>
|
>
|
||||||
<div className="relative flex items-center justify-center w-full h-full">
|
<div className="relative flex items-center justify-center w-full h-full">
|
||||||
@@ -426,14 +426,14 @@ export default function AdminIdPage() {
|
|||||||
<button
|
<button
|
||||||
type="button"
|
type="button"
|
||||||
onClick={handleActivateCancel}
|
onClick={handleActivateCancel}
|
||||||
className="h-[40px] px-2 rounded-[8px] bg-[#f1f3f5] text-[16px] font-semibold leading-[1.5] text-[#4c5561] w-[80px]"
|
className="h-[40px] px-2 rounded-[8px] bg-[#f1f3f5] text-[16px] font-semibold leading-[1.5] text-[#4c5561] w-[80px] cursor-pointer hover:bg-[#e5e7eb] transition-colors"
|
||||||
>
|
>
|
||||||
취소
|
취소
|
||||||
</button>
|
</button>
|
||||||
<button
|
<button
|
||||||
type="button"
|
type="button"
|
||||||
onClick={handleActivateConfirm}
|
onClick={handleActivateConfirm}
|
||||||
className="h-[40px] px-4 rounded-[8px] bg-[#1f2b91] text-[16px] font-semibold leading-[1.5] text-white"
|
className="h-[40px] px-4 rounded-[8px] bg-[#1f2b91] text-[16px] font-semibold leading-[1.5] text-white cursor-pointer hover:bg-[#1a2478] transition-colors"
|
||||||
>
|
>
|
||||||
활성화하기
|
활성화하기
|
||||||
</button>
|
</button>
|
||||||
@@ -465,14 +465,14 @@ export default function AdminIdPage() {
|
|||||||
<button
|
<button
|
||||||
type="button"
|
type="button"
|
||||||
onClick={handleDeactivateCancel}
|
onClick={handleDeactivateCancel}
|
||||||
className="h-[40px] px-2 rounded-[8px] bg-[#f1f3f5] text-[16px] font-semibold leading-[1.5] text-[#4c5561] w-[80px]"
|
className="h-[40px] px-2 rounded-[8px] bg-[#f1f3f5] text-[16px] font-semibold leading-[1.5] text-[#4c5561] w-[80px] cursor-pointer hover:bg-[#e5e7eb] transition-colors"
|
||||||
>
|
>
|
||||||
취소
|
취소
|
||||||
</button>
|
</button>
|
||||||
<button
|
<button
|
||||||
type="button"
|
type="button"
|
||||||
onClick={handleDeactivateConfirm}
|
onClick={handleDeactivateConfirm}
|
||||||
className="h-[40px] px-4 rounded-[8px] bg-red-50 text-[16px] font-semibold leading-[1.5] text-[#f64c4c]"
|
className="h-[40px] px-4 rounded-[8px] bg-red-50 text-[16px] font-semibold leading-[1.5] text-[#f64c4c] cursor-pointer hover:bg-red-100 transition-colors"
|
||||||
>
|
>
|
||||||
비활성화하기
|
비활성화하기
|
||||||
</button>
|
</button>
|
||||||
|
|||||||
@@ -1,13 +1,25 @@
|
|||||||
'use client';
|
'use client';
|
||||||
|
|
||||||
import { useState, useMemo } from "react";
|
import { useState, useMemo, useRef, useEffect } from "react";
|
||||||
import AdminSidebar from "@/app/components/AdminSidebar";
|
import AdminSidebar from "@/app/components/AdminSidebar";
|
||||||
import ChevronDownSvg from "@/app/svgs/chevrondownsvg";
|
import ChevronDownSvg from "@/app/svgs/chevrondownsvg";
|
||||||
|
import DropdownIcon from "@/app/svgs/dropdownicon";
|
||||||
|
import BackArrowSvg from "@/app/svgs/backarrow";
|
||||||
|
|
||||||
export default function AdminLessonsPage() {
|
export default function AdminLessonsPage() {
|
||||||
// TODO: 나중에 실제 데이터로 교체
|
// TODO: 나중에 실제 데이터로 교체
|
||||||
const items: any[] = [];
|
const items: any[] = [];
|
||||||
const [currentPage, setCurrentPage] = useState(1);
|
const [currentPage, setCurrentPage] = useState(1);
|
||||||
|
const [isRegistrationMode, setIsRegistrationMode] = useState(false);
|
||||||
|
const [isDropdownOpen, setIsDropdownOpen] = useState(false);
|
||||||
|
const dropdownRef = useRef<HTMLDivElement>(null);
|
||||||
|
|
||||||
|
// 등록 폼 상태
|
||||||
|
const [selectedCourse, setSelectedCourse] = useState<string>("");
|
||||||
|
const [lessonName, setLessonName] = useState("");
|
||||||
|
const [learningGoal, setLearningGoal] = useState("");
|
||||||
|
const [courseVideoCount, setCourseVideoCount] = useState(0);
|
||||||
|
const [vrContentCount, setVrContentCount] = useState(0);
|
||||||
|
|
||||||
const totalCount = useMemo(() => items.length, [items]);
|
const totalCount = useMemo(() => items.length, [items]);
|
||||||
|
|
||||||
@@ -19,6 +31,47 @@ export default function AdminLessonsPage() {
|
|||||||
return items.slice(startIndex, endIndex);
|
return items.slice(startIndex, endIndex);
|
||||||
}, [items, currentPage]);
|
}, [items, currentPage]);
|
||||||
|
|
||||||
|
// TODO: 나중에 실제 데이터로 교체
|
||||||
|
const courseOptions = [
|
||||||
|
{ id: "1", name: "교육과정 1" },
|
||||||
|
{ id: "2", name: "교육과정 2" },
|
||||||
|
{ id: "3", name: "교육과정 3" },
|
||||||
|
];
|
||||||
|
|
||||||
|
// 외부 클릭 시 드롭다운 닫기
|
||||||
|
useEffect(() => {
|
||||||
|
const handleClickOutside = (event: MouseEvent) => {
|
||||||
|
if (
|
||||||
|
dropdownRef.current &&
|
||||||
|
!dropdownRef.current.contains(event.target as Node)
|
||||||
|
) {
|
||||||
|
setIsDropdownOpen(false);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
if (isDropdownOpen) {
|
||||||
|
document.addEventListener("mousedown", handleClickOutside);
|
||||||
|
}
|
||||||
|
|
||||||
|
return () => {
|
||||||
|
document.removeEventListener("mousedown", handleClickOutside);
|
||||||
|
};
|
||||||
|
}, [isDropdownOpen]);
|
||||||
|
|
||||||
|
const handleBackClick = () => {
|
||||||
|
setIsRegistrationMode(false);
|
||||||
|
// 폼 초기화
|
||||||
|
setSelectedCourse("");
|
||||||
|
setLessonName("");
|
||||||
|
setLearningGoal("");
|
||||||
|
setCourseVideoCount(0);
|
||||||
|
setVrContentCount(0);
|
||||||
|
};
|
||||||
|
|
||||||
|
const handleRegisterClick = () => {
|
||||||
|
setIsRegistrationMode(true);
|
||||||
|
};
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div className="min-h-screen flex flex-col bg-white">
|
<div className="min-h-screen flex flex-col bg-white">
|
||||||
{/* 메인 레이아웃 */}
|
{/* 메인 레이아웃 */}
|
||||||
@@ -31,6 +84,236 @@ export default function AdminLessonsPage() {
|
|||||||
{/* 메인 콘텐츠 */}
|
{/* 메인 콘텐츠 */}
|
||||||
<main className="flex-1 min-w-0 bg-white">
|
<main className="flex-1 min-w-0 bg-white">
|
||||||
<div className="h-full flex flex-col">
|
<div className="h-full flex flex-col">
|
||||||
|
{isRegistrationMode ? (
|
||||||
|
/* 등록 모드 */
|
||||||
|
<div className="flex flex-col h-full">
|
||||||
|
{/* 헤더 */}
|
||||||
|
<div className="h-[100px] flex items-center px-[32px]">
|
||||||
|
<div className="flex items-center gap-[12px]">
|
||||||
|
<button
|
||||||
|
type="button"
|
||||||
|
onClick={handleBackClick}
|
||||||
|
className="flex items-center justify-center size-[32px] cursor-pointer hover:opacity-80"
|
||||||
|
aria-label="뒤로가기"
|
||||||
|
>
|
||||||
|
<BackArrowSvg width={32} height={32} />
|
||||||
|
</button>
|
||||||
|
<h1 className="text-[24px] font-bold leading-[1.5] text-[#1b2027]">
|
||||||
|
강좌 등록
|
||||||
|
</h1>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
{/* 폼 콘텐츠 */}
|
||||||
|
<div className="flex-1 overflow-y-auto px-[32px] pb-[80px] pt-[32px]">
|
||||||
|
<div className="flex flex-col gap-[40px]">
|
||||||
|
{/* 강좌 정보 */}
|
||||||
|
<div className="flex flex-col gap-[8px]">
|
||||||
|
<h2 className="text-[18px] font-bold leading-[1.5] text-[#1b2027]">
|
||||||
|
강좌 정보
|
||||||
|
</h2>
|
||||||
|
<div className="flex flex-col gap-[24px]">
|
||||||
|
{/* 교육 과정 */}
|
||||||
|
<div className="flex flex-col gap-[8px]">
|
||||||
|
<label className="text-[15px] font-semibold leading-[1.5] text-[#6c7682]">
|
||||||
|
교육 과정
|
||||||
|
</label>
|
||||||
|
<div className="relative" ref={dropdownRef}>
|
||||||
|
<button
|
||||||
|
type="button"
|
||||||
|
onClick={() => setIsDropdownOpen(!isDropdownOpen)}
|
||||||
|
className="w-full h-[40px] px-[12px] py-[8px] border border-[#dee1e6] rounded-[8px] bg-white flex items-center justify-between focus:outline-none focus:ring-2 focus:ring-[#1f2b91] focus:border-transparent cursor-pointer"
|
||||||
|
>
|
||||||
|
<span className={`text-[16px] font-normal leading-[1.5] flex-1 text-left ${
|
||||||
|
selectedCourse ? 'text-[#1b2027]' : 'text-[#6c7682]'
|
||||||
|
}`}>
|
||||||
|
{selectedCourse
|
||||||
|
? courseOptions.find(c => c.id === selectedCourse)?.name
|
||||||
|
: '교육과정을 선택해 주세요.'}
|
||||||
|
</span>
|
||||||
|
<DropdownIcon stroke="#8C95A1" className="shrink-0" />
|
||||||
|
</button>
|
||||||
|
{isDropdownOpen && (
|
||||||
|
<div className="absolute top-full left-0 right-0 mt-1 bg-white border border-[#dee1e6] rounded-[8px] shadow-lg z-20 max-h-[200px] overflow-y-auto">
|
||||||
|
{courseOptions.map((course, index) => (
|
||||||
|
<button
|
||||||
|
key={course.id}
|
||||||
|
type="button"
|
||||||
|
onClick={() => {
|
||||||
|
setSelectedCourse(course.id);
|
||||||
|
setIsDropdownOpen(false);
|
||||||
|
}}
|
||||||
|
className={`w-full px-3 py-2 text-left text-[16px] font-normal leading-[1.5] hover:bg-[#f1f3f5] transition-colors cursor-pointer ${
|
||||||
|
selectedCourse === course.id
|
||||||
|
? "bg-[#ecf0ff] text-[#1f2b91] font-semibold"
|
||||||
|
: "text-[#1b2027]"
|
||||||
|
} ${
|
||||||
|
index === 0 ? "rounded-t-[8px]" : ""
|
||||||
|
} ${
|
||||||
|
index === courseOptions.length - 1 ? "rounded-b-[8px]" : ""
|
||||||
|
}`}
|
||||||
|
>
|
||||||
|
{course.name}
|
||||||
|
</button>
|
||||||
|
))}
|
||||||
|
</div>
|
||||||
|
)}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
{/* 강좌명 */}
|
||||||
|
<div className="flex flex-col gap-[8px]">
|
||||||
|
<label className="text-[15px] font-semibold leading-[1.5] text-[#6c7682]">
|
||||||
|
강좌명
|
||||||
|
</label>
|
||||||
|
<input
|
||||||
|
type="text"
|
||||||
|
value={lessonName}
|
||||||
|
onChange={(e) => setLessonName(e.target.value)}
|
||||||
|
placeholder="강좌명을 입력해 주세요."
|
||||||
|
className="h-[40px] px-[12px] py-[8px] border border-[#dee1e6] rounded-[8px] bg-white text-[16px] font-normal leading-[1.5] text-[#1b2027] placeholder:text-[#b1b8c0] focus:outline-none focus:ring-2 focus:ring-[#1f2b91] focus:border-transparent"
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
{/* 학습 목표 */}
|
||||||
|
<div className="flex flex-col gap-[8px]">
|
||||||
|
<label className="text-[15px] font-semibold leading-[1.5] text-[#6c7682]">
|
||||||
|
학습 목표
|
||||||
|
</label>
|
||||||
|
<div className="relative">
|
||||||
|
<textarea
|
||||||
|
value={learningGoal}
|
||||||
|
onChange={(e) => {
|
||||||
|
if (e.target.value.length <= 1000) {
|
||||||
|
setLearningGoal(e.target.value);
|
||||||
|
}
|
||||||
|
}}
|
||||||
|
placeholder="내용을 입력해 주세요. (최대 1,000자)"
|
||||||
|
className="w-full h-[160px] px-[12px] py-[8px] border border-[#dee1e6] rounded-[8px] bg-white text-[16px] font-normal leading-[1.5] text-[#1b2027] placeholder:text-[#b1b8c0] focus:outline-none focus:ring-2 focus:ring-[#1f2b91] focus:border-transparent resize-none"
|
||||||
|
/>
|
||||||
|
<div className="absolute bottom-[8px] right-[12px]">
|
||||||
|
<p className="text-[13px] font-normal leading-[1.4] text-[#6c7682] text-right">
|
||||||
|
{learningGoal.length}/1000
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
{/* 파일 첨부 */}
|
||||||
|
<div className="flex flex-col gap-[8px]">
|
||||||
|
<h2 className="text-[18px] font-bold leading-[1.5] text-[#1b2027]">
|
||||||
|
파일 첨부
|
||||||
|
</h2>
|
||||||
|
<div className="flex flex-col gap-[24px]">
|
||||||
|
{/* 강좌 영상 */}
|
||||||
|
<div className="flex flex-col gap-[8px]">
|
||||||
|
<div className="flex items-center justify-between h-[32px]">
|
||||||
|
<div className="flex items-center gap-[8px]">
|
||||||
|
<label className="text-[15px] font-semibold leading-[1.5] text-[#6c7682]">
|
||||||
|
강좌 영상 ({courseVideoCount}/10)
|
||||||
|
</label>
|
||||||
|
<span className="text-[13px] font-normal leading-[1.4] text-[#8c95a1]">
|
||||||
|
30MB 미만 파일
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
|
<button
|
||||||
|
type="button"
|
||||||
|
className="h-[32px] px-[4px] py-[3px] border border-[#8c95a1] rounded-[6px] bg-white text-[13px] font-medium leading-[1.4] text-[#4c5561] whitespace-nowrap hover:bg-gray-50 transition-colors cursor-pointer"
|
||||||
|
>
|
||||||
|
첨부
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
<div className="h-[64px] border border-[#dee1e6] rounded-[8px] bg-gray-50 flex items-center justify-center">
|
||||||
|
<p className="text-[14px] font-normal leading-[1.5] text-[#8c95a1] text-center">
|
||||||
|
강좌 주제별 영상 파일을 첨부해주세요.
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
{/* VR 콘텐츠 */}
|
||||||
|
<div className="flex flex-col gap-[8px]">
|
||||||
|
<div className="flex items-center justify-between h-[32px]">
|
||||||
|
<div className="flex items-center gap-[8px]">
|
||||||
|
<label className="text-[15px] font-semibold leading-[1.5] text-[#6c7682]">
|
||||||
|
VR 콘텐츠 <span className="font-normal">({vrContentCount}/10)</span>
|
||||||
|
</label>
|
||||||
|
<span className="text-[13px] font-normal leading-[1.4] text-[#8c95a1]">
|
||||||
|
30MB 미만 파일
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
|
<button
|
||||||
|
type="button"
|
||||||
|
className="h-[32px] px-[4px] py-[3px] border border-[#8c95a1] rounded-[6px] bg-white text-[13px] font-medium leading-[1.4] text-[#4c5561] whitespace-nowrap hover:bg-gray-50 transition-colors cursor-pointer"
|
||||||
|
>
|
||||||
|
첨부
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
<div className="h-[64px] border border-[#dee1e6] rounded-[8px] bg-gray-50 flex items-center justify-center">
|
||||||
|
<p className="text-[14px] font-normal leading-[1.5] text-[#8c95a1] text-center">
|
||||||
|
VR 학습 체험용 콘텐츠 파일을 첨부해주세요.
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
{/* 학습 평가 문제 */}
|
||||||
|
<div className="flex flex-col gap-[8px]">
|
||||||
|
<div className="flex items-center justify-between h-[32px]">
|
||||||
|
<div className="flex items-center gap-[8px]">
|
||||||
|
<label className="text-[15px] font-semibold leading-[1.5] text-[#6c7682]">
|
||||||
|
학습 평가 문제
|
||||||
|
</label>
|
||||||
|
<span className="text-[13px] font-normal leading-[1.4] text-[#8c95a1]">
|
||||||
|
CSV 파일 형식만 첨부 가능
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
|
<div className="flex items-center gap-[8px]">
|
||||||
|
<button
|
||||||
|
type="button"
|
||||||
|
className="h-[32px] px-[16px] py-[3px] border border-[#b1b8c0] rounded-[6px] bg-white text-[13px] font-medium leading-[1.4] text-[#b1b8c0] whitespace-nowrap hover:bg-gray-50 transition-colors cursor-pointer"
|
||||||
|
>
|
||||||
|
다운로드
|
||||||
|
</button>
|
||||||
|
<button
|
||||||
|
type="button"
|
||||||
|
className="h-[32px] px-[4px] py-[3px] border border-[#8c95a1] rounded-[6px] bg-white text-[13px] font-medium leading-[1.4] text-[#4c5561] whitespace-nowrap hover:bg-gray-50 transition-colors cursor-pointer"
|
||||||
|
>
|
||||||
|
첨부
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div className="h-[64px] border border-[#dee1e6] rounded-[8px] bg-gray-50 flex items-center justify-center">
|
||||||
|
<p className="text-[14px] font-normal leading-[1.5] text-[#8c95a1] text-center">
|
||||||
|
학습 평가용 문항 파일을 첨부해주세요.
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
{/* 액션 버튼 */}
|
||||||
|
<div className="flex items-center justify-center gap-[12px]">
|
||||||
|
<button
|
||||||
|
type="button"
|
||||||
|
onClick={handleBackClick}
|
||||||
|
className="h-[48px] px-[8px] rounded-[10px] bg-[#f1f3f5] text-[16px] font-semibold leading-[1.5] text-[#4c5561] min-w-[80px] hover:bg-[#e5e7eb] transition-colors cursor-pointer"
|
||||||
|
>
|
||||||
|
취소
|
||||||
|
</button>
|
||||||
|
<button
|
||||||
|
type="button"
|
||||||
|
className="h-[48px] px-[16px] rounded-[10px] bg-[#1f2b91] text-[16px] font-semibold leading-[1.5] text-white hover:bg-[#1a2478] transition-colors cursor-pointer"
|
||||||
|
>
|
||||||
|
저장하기
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
) : (
|
||||||
|
/* 목록 모드 */
|
||||||
|
<>
|
||||||
{/* 제목 영역 */}
|
{/* 제목 영역 */}
|
||||||
<div className="h-[100px] flex items-center">
|
<div className="h-[100px] flex items-center">
|
||||||
<h1 className="text-[24px] font-bold leading-[1.5] text-[#1b2027]">
|
<h1 className="text-[24px] font-bold leading-[1.5] text-[#1b2027]">
|
||||||
@@ -45,7 +328,8 @@ export default function AdminLessonsPage() {
|
|||||||
</p>
|
</p>
|
||||||
<button
|
<button
|
||||||
type="button"
|
type="button"
|
||||||
className="h-[40px] px-4 rounded-[8px] bg-[#1f2b91] text-[16px] font-semibold leading-[1.5] text-white whitespace-nowrap hover:bg-[#1a2478] transition-colors"
|
onClick={handleRegisterClick}
|
||||||
|
className="h-[40px] px-4 rounded-[8px] bg-[#1f2b91] text-[16px] font-semibold leading-[1.5] text-white whitespace-nowrap hover:bg-[#1a2478] transition-colors cursor-pointer"
|
||||||
>
|
>
|
||||||
등록하기
|
등록하기
|
||||||
</button>
|
</button>
|
||||||
@@ -81,7 +365,7 @@ export default function AdminLessonsPage() {
|
|||||||
type="button"
|
type="button"
|
||||||
onClick={() => setCurrentPage(1)}
|
onClick={() => setCurrentPage(1)}
|
||||||
aria-label="맨 앞 페이지"
|
aria-label="맨 앞 페이지"
|
||||||
className="flex items-center justify-center rounded-[1000px] p-[8.615px] size-[32px] text-[#333c47] disabled:opacity-40"
|
className="flex items-center justify-center rounded-[1000px] p-[8.615px] size-[32px] text-[#333c47] disabled:opacity-40 cursor-pointer disabled:cursor-not-allowed"
|
||||||
disabled={currentPage === 1}
|
disabled={currentPage === 1}
|
||||||
>
|
>
|
||||||
<div className="relative flex items-center justify-center w-full h-full">
|
<div className="relative flex items-center justify-center w-full h-full">
|
||||||
@@ -95,7 +379,7 @@ export default function AdminLessonsPage() {
|
|||||||
type="button"
|
type="button"
|
||||||
onClick={() => setCurrentPage((p) => Math.max(1, p - 1))}
|
onClick={() => setCurrentPage((p) => Math.max(1, p - 1))}
|
||||||
aria-label="이전 페이지"
|
aria-label="이전 페이지"
|
||||||
className="flex items-center justify-center rounded-[1000px] p-[8.615px] size-[32px] text-[#333c47] disabled:opacity-40"
|
className="flex items-center justify-center rounded-[1000px] p-[8.615px] size-[32px] text-[#333c47] disabled:opacity-40 cursor-pointer disabled:cursor-not-allowed"
|
||||||
disabled={currentPage === 1}
|
disabled={currentPage === 1}
|
||||||
>
|
>
|
||||||
<ChevronDownSvg width={14.8} height={14.8} className="rotate-90" />
|
<ChevronDownSvg width={14.8} height={14.8} className="rotate-90" />
|
||||||
@@ -111,7 +395,7 @@ export default function AdminLessonsPage() {
|
|||||||
onClick={() => setCurrentPage(n)}
|
onClick={() => setCurrentPage(n)}
|
||||||
aria-current={active ? 'page' : undefined}
|
aria-current={active ? 'page' : undefined}
|
||||||
className={[
|
className={[
|
||||||
'flex items-center justify-center rounded-[1000px] size-[32px]',
|
'flex items-center justify-center rounded-[1000px] size-[32px] cursor-pointer',
|
||||||
active ? 'bg-[#ecf0ff]' : 'bg-white',
|
active ? 'bg-[#ecf0ff]' : 'bg-white',
|
||||||
].join(' ')}
|
].join(' ')}
|
||||||
>
|
>
|
||||||
@@ -125,7 +409,7 @@ export default function AdminLessonsPage() {
|
|||||||
type="button"
|
type="button"
|
||||||
onClick={() => setCurrentPage((p) => Math.min(totalPages, p + 1))}
|
onClick={() => setCurrentPage((p) => Math.min(totalPages, p + 1))}
|
||||||
aria-label="다음 페이지"
|
aria-label="다음 페이지"
|
||||||
className="flex items-center justify-center rounded-[1000px] p-[8.615px] size-[32px] text-[#333c47] disabled:opacity-40"
|
className="flex items-center justify-center rounded-[1000px] p-[8.615px] size-[32px] text-[#333c47] disabled:opacity-40 cursor-pointer disabled:cursor-not-allowed"
|
||||||
disabled={currentPage === totalPages}
|
disabled={currentPage === totalPages}
|
||||||
>
|
>
|
||||||
<ChevronDownSvg width={14.8} height={14.8} className="-rotate-90" />
|
<ChevronDownSvg width={14.8} height={14.8} className="-rotate-90" />
|
||||||
@@ -136,7 +420,7 @@ export default function AdminLessonsPage() {
|
|||||||
type="button"
|
type="button"
|
||||||
onClick={() => setCurrentPage(totalPages)}
|
onClick={() => setCurrentPage(totalPages)}
|
||||||
aria-label="맨 뒤 페이지"
|
aria-label="맨 뒤 페이지"
|
||||||
className="flex items-center justify-center rounded-[1000px] p-[8.615px] size-[32px] text-[#333c47] disabled:opacity-40"
|
className="flex items-center justify-center rounded-[1000px] p-[8.615px] size-[32px] text-[#333c47] disabled:opacity-40 cursor-pointer disabled:cursor-not-allowed"
|
||||||
disabled={currentPage === totalPages}
|
disabled={currentPage === totalPages}
|
||||||
>
|
>
|
||||||
<div className="relative flex items-center justify-center w-full h-full">
|
<div className="relative flex items-center justify-center w-full h-full">
|
||||||
@@ -151,6 +435,8 @@ export default function AdminLessonsPage() {
|
|||||||
</>
|
</>
|
||||||
)}
|
)}
|
||||||
</div>
|
</div>
|
||||||
|
</>
|
||||||
|
)}
|
||||||
</div>
|
</div>
|
||||||
</main>
|
</main>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -65,7 +65,7 @@ export default function AdminLogsPage() {
|
|||||||
type="button"
|
type="button"
|
||||||
onClick={() => setCurrentPage(1)}
|
onClick={() => setCurrentPage(1)}
|
||||||
aria-label="맨 앞 페이지"
|
aria-label="맨 앞 페이지"
|
||||||
className="flex items-center justify-center rounded-[1000px] p-[8.615px] size-[32px] text-[#333c47] disabled:opacity-40"
|
className="flex items-center justify-center rounded-[1000px] p-[8.615px] size-[32px] text-[#333c47] disabled:opacity-40 cursor-pointer disabled:cursor-not-allowed"
|
||||||
disabled={currentPage === 1}
|
disabled={currentPage === 1}
|
||||||
>
|
>
|
||||||
<div className="relative flex items-center justify-center w-full h-full">
|
<div className="relative flex items-center justify-center w-full h-full">
|
||||||
@@ -79,7 +79,7 @@ export default function AdminLogsPage() {
|
|||||||
type="button"
|
type="button"
|
||||||
onClick={() => setCurrentPage((p) => Math.max(1, p - 1))}
|
onClick={() => setCurrentPage((p) => Math.max(1, p - 1))}
|
||||||
aria-label="이전 페이지"
|
aria-label="이전 페이지"
|
||||||
className="flex items-center justify-center rounded-[1000px] p-[8.615px] size-[32px] text-[#333c47] disabled:opacity-40"
|
className="flex items-center justify-center rounded-[1000px] p-[8.615px] size-[32px] text-[#333c47] disabled:opacity-40 cursor-pointer disabled:cursor-not-allowed"
|
||||||
disabled={currentPage === 1}
|
disabled={currentPage === 1}
|
||||||
>
|
>
|
||||||
<ChevronDownSvg width={14.8} height={14.8} className="rotate-90" />
|
<ChevronDownSvg width={14.8} height={14.8} className="rotate-90" />
|
||||||
@@ -95,7 +95,7 @@ export default function AdminLogsPage() {
|
|||||||
onClick={() => setCurrentPage(n)}
|
onClick={() => setCurrentPage(n)}
|
||||||
aria-current={active ? 'page' : undefined}
|
aria-current={active ? 'page' : undefined}
|
||||||
className={[
|
className={[
|
||||||
'flex items-center justify-center rounded-[1000px] size-[32px]',
|
'flex items-center justify-center rounded-[1000px] size-[32px] cursor-pointer',
|
||||||
active ? 'bg-[#ecf0ff]' : 'bg-white',
|
active ? 'bg-[#ecf0ff]' : 'bg-white',
|
||||||
].join(' ')}
|
].join(' ')}
|
||||||
>
|
>
|
||||||
@@ -109,7 +109,7 @@ export default function AdminLogsPage() {
|
|||||||
type="button"
|
type="button"
|
||||||
onClick={() => setCurrentPage((p) => Math.min(totalPages, p + 1))}
|
onClick={() => setCurrentPage((p) => Math.min(totalPages, p + 1))}
|
||||||
aria-label="다음 페이지"
|
aria-label="다음 페이지"
|
||||||
className="flex items-center justify-center rounded-[1000px] p-[8.615px] size-[32px] text-[#333c47] disabled:opacity-40"
|
className="flex items-center justify-center rounded-[1000px] p-[8.615px] size-[32px] text-[#333c47] disabled:opacity-40 cursor-pointer disabled:cursor-not-allowed"
|
||||||
disabled={currentPage === totalPages}
|
disabled={currentPage === totalPages}
|
||||||
>
|
>
|
||||||
<ChevronDownSvg width={14.8} height={14.8} className="-rotate-90" />
|
<ChevronDownSvg width={14.8} height={14.8} className="-rotate-90" />
|
||||||
@@ -120,7 +120,7 @@ export default function AdminLogsPage() {
|
|||||||
type="button"
|
type="button"
|
||||||
onClick={() => setCurrentPage(totalPages)}
|
onClick={() => setCurrentPage(totalPages)}
|
||||||
aria-label="맨 뒤 페이지"
|
aria-label="맨 뒤 페이지"
|
||||||
className="flex items-center justify-center rounded-[1000px] p-[8.615px] size-[32px] text-[#333c47] disabled:opacity-40"
|
className="flex items-center justify-center rounded-[1000px] p-[8.615px] size-[32px] text-[#333c47] disabled:opacity-40 cursor-pointer disabled:cursor-not-allowed"
|
||||||
disabled={currentPage === totalPages}
|
disabled={currentPage === totalPages}
|
||||||
>
|
>
|
||||||
<div className="relative flex items-center justify-center w-full h-full">
|
<div className="relative flex items-center justify-center w-full h-full">
|
||||||
|
|||||||
@@ -65,7 +65,7 @@ export default function AdminNoticesPage() {
|
|||||||
type="button"
|
type="button"
|
||||||
onClick={() => setCurrentPage(1)}
|
onClick={() => setCurrentPage(1)}
|
||||||
aria-label="맨 앞 페이지"
|
aria-label="맨 앞 페이지"
|
||||||
className="flex items-center justify-center rounded-[1000px] p-[8.615px] size-[32px] text-[#333c47] disabled:opacity-40"
|
className="flex items-center justify-center rounded-[1000px] p-[8.615px] size-[32px] text-[#333c47] disabled:opacity-40 cursor-pointer disabled:cursor-not-allowed"
|
||||||
disabled={currentPage === 1}
|
disabled={currentPage === 1}
|
||||||
>
|
>
|
||||||
<div className="relative flex items-center justify-center w-full h-full">
|
<div className="relative flex items-center justify-center w-full h-full">
|
||||||
@@ -79,7 +79,7 @@ export default function AdminNoticesPage() {
|
|||||||
type="button"
|
type="button"
|
||||||
onClick={() => setCurrentPage((p) => Math.max(1, p - 1))}
|
onClick={() => setCurrentPage((p) => Math.max(1, p - 1))}
|
||||||
aria-label="이전 페이지"
|
aria-label="이전 페이지"
|
||||||
className="flex items-center justify-center rounded-[1000px] p-[8.615px] size-[32px] text-[#333c47] disabled:opacity-40"
|
className="flex items-center justify-center rounded-[1000px] p-[8.615px] size-[32px] text-[#333c47] disabled:opacity-40 cursor-pointer disabled:cursor-not-allowed"
|
||||||
disabled={currentPage === 1}
|
disabled={currentPage === 1}
|
||||||
>
|
>
|
||||||
<ChevronDownSvg width={14.8} height={14.8} className="rotate-90" />
|
<ChevronDownSvg width={14.8} height={14.8} className="rotate-90" />
|
||||||
@@ -95,7 +95,7 @@ export default function AdminNoticesPage() {
|
|||||||
onClick={() => setCurrentPage(n)}
|
onClick={() => setCurrentPage(n)}
|
||||||
aria-current={active ? 'page' : undefined}
|
aria-current={active ? 'page' : undefined}
|
||||||
className={[
|
className={[
|
||||||
'flex items-center justify-center rounded-[1000px] size-[32px]',
|
'flex items-center justify-center rounded-[1000px] size-[32px] cursor-pointer',
|
||||||
active ? 'bg-[#ecf0ff]' : 'bg-white',
|
active ? 'bg-[#ecf0ff]' : 'bg-white',
|
||||||
].join(' ')}
|
].join(' ')}
|
||||||
>
|
>
|
||||||
@@ -109,7 +109,7 @@ export default function AdminNoticesPage() {
|
|||||||
type="button"
|
type="button"
|
||||||
onClick={() => setCurrentPage((p) => Math.min(totalPages, p + 1))}
|
onClick={() => setCurrentPage((p) => Math.min(totalPages, p + 1))}
|
||||||
aria-label="다음 페이지"
|
aria-label="다음 페이지"
|
||||||
className="flex items-center justify-center rounded-[1000px] p-[8.615px] size-[32px] text-[#333c47] disabled:opacity-40"
|
className="flex items-center justify-center rounded-[1000px] p-[8.615px] size-[32px] text-[#333c47] disabled:opacity-40 cursor-pointer disabled:cursor-not-allowed"
|
||||||
disabled={currentPage === totalPages}
|
disabled={currentPage === totalPages}
|
||||||
>
|
>
|
||||||
<ChevronDownSvg width={14.8} height={14.8} className="-rotate-90" />
|
<ChevronDownSvg width={14.8} height={14.8} className="-rotate-90" />
|
||||||
@@ -120,7 +120,7 @@ export default function AdminNoticesPage() {
|
|||||||
type="button"
|
type="button"
|
||||||
onClick={() => setCurrentPage(totalPages)}
|
onClick={() => setCurrentPage(totalPages)}
|
||||||
aria-label="맨 뒤 페이지"
|
aria-label="맨 뒤 페이지"
|
||||||
className="flex items-center justify-center rounded-[1000px] p-[8.615px] size-[32px] text-[#333c47] disabled:opacity-40"
|
className="flex items-center justify-center rounded-[1000px] p-[8.615px] size-[32px] text-[#333c47] disabled:opacity-40 cursor-pointer disabled:cursor-not-allowed"
|
||||||
disabled={currentPage === totalPages}
|
disabled={currentPage === totalPages}
|
||||||
>
|
>
|
||||||
<div className="relative flex items-center justify-center w-full h-full">
|
<div className="relative flex items-center justify-center w-full h-full">
|
||||||
|
|||||||
@@ -65,7 +65,7 @@ export default function AdminQuestionsPage() {
|
|||||||
type="button"
|
type="button"
|
||||||
onClick={() => setCurrentPage(1)}
|
onClick={() => setCurrentPage(1)}
|
||||||
aria-label="맨 앞 페이지"
|
aria-label="맨 앞 페이지"
|
||||||
className="flex items-center justify-center rounded-[1000px] p-[8.615px] size-[32px] text-[#333c47] disabled:opacity-40"
|
className="flex items-center justify-center rounded-[1000px] p-[8.615px] size-[32px] text-[#333c47] disabled:opacity-40 cursor-pointer disabled:cursor-not-allowed"
|
||||||
disabled={currentPage === 1}
|
disabled={currentPage === 1}
|
||||||
>
|
>
|
||||||
<div className="relative flex items-center justify-center w-full h-full">
|
<div className="relative flex items-center justify-center w-full h-full">
|
||||||
@@ -79,7 +79,7 @@ export default function AdminQuestionsPage() {
|
|||||||
type="button"
|
type="button"
|
||||||
onClick={() => setCurrentPage((p) => Math.max(1, p - 1))}
|
onClick={() => setCurrentPage((p) => Math.max(1, p - 1))}
|
||||||
aria-label="이전 페이지"
|
aria-label="이전 페이지"
|
||||||
className="flex items-center justify-center rounded-[1000px] p-[8.615px] size-[32px] text-[#333c47] disabled:opacity-40"
|
className="flex items-center justify-center rounded-[1000px] p-[8.615px] size-[32px] text-[#333c47] disabled:opacity-40 cursor-pointer disabled:cursor-not-allowed"
|
||||||
disabled={currentPage === 1}
|
disabled={currentPage === 1}
|
||||||
>
|
>
|
||||||
<ChevronDownSvg width={14.8} height={14.8} className="rotate-90" />
|
<ChevronDownSvg width={14.8} height={14.8} className="rotate-90" />
|
||||||
@@ -95,7 +95,7 @@ export default function AdminQuestionsPage() {
|
|||||||
onClick={() => setCurrentPage(n)}
|
onClick={() => setCurrentPage(n)}
|
||||||
aria-current={active ? 'page' : undefined}
|
aria-current={active ? 'page' : undefined}
|
||||||
className={[
|
className={[
|
||||||
'flex items-center justify-center rounded-[1000px] size-[32px]',
|
'flex items-center justify-center rounded-[1000px] size-[32px] cursor-pointer',
|
||||||
active ? 'bg-[#ecf0ff]' : 'bg-white',
|
active ? 'bg-[#ecf0ff]' : 'bg-white',
|
||||||
].join(' ')}
|
].join(' ')}
|
||||||
>
|
>
|
||||||
@@ -109,7 +109,7 @@ export default function AdminQuestionsPage() {
|
|||||||
type="button"
|
type="button"
|
||||||
onClick={() => setCurrentPage((p) => Math.min(totalPages, p + 1))}
|
onClick={() => setCurrentPage((p) => Math.min(totalPages, p + 1))}
|
||||||
aria-label="다음 페이지"
|
aria-label="다음 페이지"
|
||||||
className="flex items-center justify-center rounded-[1000px] p-[8.615px] size-[32px] text-[#333c47] disabled:opacity-40"
|
className="flex items-center justify-center rounded-[1000px] p-[8.615px] size-[32px] text-[#333c47] disabled:opacity-40 cursor-pointer disabled:cursor-not-allowed"
|
||||||
disabled={currentPage === totalPages}
|
disabled={currentPage === totalPages}
|
||||||
>
|
>
|
||||||
<ChevronDownSvg width={14.8} height={14.8} className="-rotate-90" />
|
<ChevronDownSvg width={14.8} height={14.8} className="-rotate-90" />
|
||||||
@@ -120,7 +120,7 @@ export default function AdminQuestionsPage() {
|
|||||||
type="button"
|
type="button"
|
||||||
onClick={() => setCurrentPage(totalPages)}
|
onClick={() => setCurrentPage(totalPages)}
|
||||||
aria-label="맨 뒤 페이지"
|
aria-label="맨 뒤 페이지"
|
||||||
className="flex items-center justify-center rounded-[1000px] p-[8.615px] size-[32px] text-[#333c47] disabled:opacity-40"
|
className="flex items-center justify-center rounded-[1000px] p-[8.615px] size-[32px] text-[#333c47] disabled:opacity-40 cursor-pointer disabled:cursor-not-allowed"
|
||||||
disabled={currentPage === totalPages}
|
disabled={currentPage === totalPages}
|
||||||
>
|
>
|
||||||
<div className="relative flex items-center justify-center w-full h-full">
|
<div className="relative flex items-center justify-center w-full h-full">
|
||||||
|
|||||||
@@ -65,7 +65,7 @@ export default function AdminResourcesPage() {
|
|||||||
type="button"
|
type="button"
|
||||||
onClick={() => setCurrentPage(1)}
|
onClick={() => setCurrentPage(1)}
|
||||||
aria-label="맨 앞 페이지"
|
aria-label="맨 앞 페이지"
|
||||||
className="flex items-center justify-center rounded-[1000px] p-[8.615px] size-[32px] text-[#333c47] disabled:opacity-40"
|
className="flex items-center justify-center rounded-[1000px] p-[8.615px] size-[32px] text-[#333c47] disabled:opacity-40 cursor-pointer disabled:cursor-not-allowed"
|
||||||
disabled={currentPage === 1}
|
disabled={currentPage === 1}
|
||||||
>
|
>
|
||||||
<div className="relative flex items-center justify-center w-full h-full">
|
<div className="relative flex items-center justify-center w-full h-full">
|
||||||
@@ -79,7 +79,7 @@ export default function AdminResourcesPage() {
|
|||||||
type="button"
|
type="button"
|
||||||
onClick={() => setCurrentPage((p) => Math.max(1, p - 1))}
|
onClick={() => setCurrentPage((p) => Math.max(1, p - 1))}
|
||||||
aria-label="이전 페이지"
|
aria-label="이전 페이지"
|
||||||
className="flex items-center justify-center rounded-[1000px] p-[8.615px] size-[32px] text-[#333c47] disabled:opacity-40"
|
className="flex items-center justify-center rounded-[1000px] p-[8.615px] size-[32px] text-[#333c47] disabled:opacity-40 cursor-pointer disabled:cursor-not-allowed"
|
||||||
disabled={currentPage === 1}
|
disabled={currentPage === 1}
|
||||||
>
|
>
|
||||||
<ChevronDownSvg width={14.8} height={14.8} className="rotate-90" />
|
<ChevronDownSvg width={14.8} height={14.8} className="rotate-90" />
|
||||||
@@ -95,7 +95,7 @@ export default function AdminResourcesPage() {
|
|||||||
onClick={() => setCurrentPage(n)}
|
onClick={() => setCurrentPage(n)}
|
||||||
aria-current={active ? 'page' : undefined}
|
aria-current={active ? 'page' : undefined}
|
||||||
className={[
|
className={[
|
||||||
'flex items-center justify-center rounded-[1000px] size-[32px]',
|
'flex items-center justify-center rounded-[1000px] size-[32px] cursor-pointer',
|
||||||
active ? 'bg-[#ecf0ff]' : 'bg-white',
|
active ? 'bg-[#ecf0ff]' : 'bg-white',
|
||||||
].join(' ')}
|
].join(' ')}
|
||||||
>
|
>
|
||||||
@@ -109,7 +109,7 @@ export default function AdminResourcesPage() {
|
|||||||
type="button"
|
type="button"
|
||||||
onClick={() => setCurrentPage((p) => Math.min(totalPages, p + 1))}
|
onClick={() => setCurrentPage((p) => Math.min(totalPages, p + 1))}
|
||||||
aria-label="다음 페이지"
|
aria-label="다음 페이지"
|
||||||
className="flex items-center justify-center rounded-[1000px] p-[8.615px] size-[32px] text-[#333c47] disabled:opacity-40"
|
className="flex items-center justify-center rounded-[1000px] p-[8.615px] size-[32px] text-[#333c47] disabled:opacity-40 cursor-pointer disabled:cursor-not-allowed"
|
||||||
disabled={currentPage === totalPages}
|
disabled={currentPage === totalPages}
|
||||||
>
|
>
|
||||||
<ChevronDownSvg width={14.8} height={14.8} className="-rotate-90" />
|
<ChevronDownSvg width={14.8} height={14.8} className="-rotate-90" />
|
||||||
@@ -120,7 +120,7 @@ export default function AdminResourcesPage() {
|
|||||||
type="button"
|
type="button"
|
||||||
onClick={() => setCurrentPage(totalPages)}
|
onClick={() => setCurrentPage(totalPages)}
|
||||||
aria-label="맨 뒤 페이지"
|
aria-label="맨 뒤 페이지"
|
||||||
className="flex items-center justify-center rounded-[1000px] p-[8.615px] size-[32px] text-[#333c47] disabled:opacity-40"
|
className="flex items-center justify-center rounded-[1000px] p-[8.615px] size-[32px] text-[#333c47] disabled:opacity-40 cursor-pointer disabled:cursor-not-allowed"
|
||||||
disabled={currentPage === totalPages}
|
disabled={currentPage === totalPages}
|
||||||
>
|
>
|
||||||
<div className="relative flex items-center justify-center w-full h-full">
|
<div className="relative flex items-center justify-center w-full h-full">
|
||||||
|
|||||||
41
src/app/svgs/backarrow.tsx
Normal file
41
src/app/svgs/backarrow.tsx
Normal file
@@ -0,0 +1,41 @@
|
|||||||
|
import React from "react";
|
||||||
|
|
||||||
|
type BackArrowProps = React.SVGProps<SVGSVGElement>;
|
||||||
|
|
||||||
|
export default function BackArrowSvg(props: BackArrowProps) {
|
||||||
|
return (
|
||||||
|
<svg
|
||||||
|
width="32"
|
||||||
|
height="32"
|
||||||
|
viewBox="0 0 32 32"
|
||||||
|
fill="none"
|
||||||
|
xmlns="http://www.w3.org/2000/svg"
|
||||||
|
{...props}
|
||||||
|
>
|
||||||
|
<path
|
||||||
|
fillRule="evenodd"
|
||||||
|
clipRule="evenodd"
|
||||||
|
d="M16 4V4C22.628 4 28 9.372 28 16V16C28 22.628 22.628 28 16 28V28C9.372 28 4 22.628 4 16V16C4 9.372 9.372 4 16 4Z"
|
||||||
|
fill="#8C95A1"
|
||||||
|
stroke="#8C95A1"
|
||||||
|
strokeWidth="2"
|
||||||
|
strokeLinecap="round"
|
||||||
|
strokeLinejoin="round"
|
||||||
|
/>
|
||||||
|
<path
|
||||||
|
d="M10.6667 16.0002H21.3334"
|
||||||
|
stroke="white"
|
||||||
|
strokeWidth="2"
|
||||||
|
strokeLinecap="round"
|
||||||
|
strokeLinejoin="round"
|
||||||
|
/>
|
||||||
|
<path
|
||||||
|
d="M14.6667 20L10.6667 16L14.6667 12"
|
||||||
|
stroke="white"
|
||||||
|
strokeWidth="2"
|
||||||
|
strokeLinecap="round"
|
||||||
|
strokeLinejoin="round"
|
||||||
|
/>
|
||||||
|
</svg>
|
||||||
|
);
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user