diff --git a/src/app/(private)/admin/layout.tsx b/src/app/(private)/admin/layout.tsx index 4190c74..0797ccc 100644 --- a/src/app/(private)/admin/layout.tsx +++ b/src/app/(private)/admin/layout.tsx @@ -1,7 +1,20 @@ +import { Header } from '@/components/admin/layout/Header'; +import { LNB } from '@/components/admin/layout/LNB'; + export default function AdminLayout({ children, }: Readonly<{ children: React.ReactNode; }>) { - return
{children}
; + return ( +
+
+ +
+
+ {children} +
+
+
+ ); } diff --git a/src/assets/icons/admin/ic_admin_absence.svg b/src/assets/icons/admin/ic_admin_absence.svg new file mode 100644 index 0000000..6971867 --- /dev/null +++ b/src/assets/icons/admin/ic_admin_absence.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/assets/icons/admin/ic_admin_attendance.svg b/src/assets/icons/admin/ic_admin_attendance.svg new file mode 100644 index 0000000..837e944 --- /dev/null +++ b/src/assets/icons/admin/ic_admin_attendance.svg @@ -0,0 +1,4 @@ + + + + diff --git a/src/assets/icons/admin/ic_admin_backarrow.svg b/src/assets/icons/admin/ic_admin_backarrow.svg new file mode 100644 index 0000000..e1a3abb --- /dev/null +++ b/src/assets/icons/admin/ic_admin_backarrow.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/assets/icons/admin/ic_admin_cardinal.svg b/src/assets/icons/admin/ic_admin_cardinal.svg new file mode 100644 index 0000000..45ce06c --- /dev/null +++ b/src/assets/icons/admin/ic_admin_cardinal.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/assets/icons/admin/ic_admin_change.svg b/src/assets/icons/admin/ic_admin_change.svg new file mode 100644 index 0000000..d4b91eb --- /dev/null +++ b/src/assets/icons/admin/ic_admin_change.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/assets/icons/admin/ic_admin_check.svg b/src/assets/icons/admin/ic_admin_check.svg new file mode 100644 index 0000000..a0e539c --- /dev/null +++ b/src/assets/icons/admin/ic_admin_check.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/assets/icons/admin/ic_admin_checkbox.svg b/src/assets/icons/admin/ic_admin_checkbox.svg new file mode 100644 index 0000000..8eaed53 --- /dev/null +++ b/src/assets/icons/admin/ic_admin_checkbox.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/assets/icons/admin/ic_admin_circle_check.svg b/src/assets/icons/admin/ic_admin_circle_check.svg new file mode 100644 index 0000000..ff37652 --- /dev/null +++ b/src/assets/icons/admin/ic_admin_circle_check.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/assets/icons/admin/ic_admin_close.svg b/src/assets/icons/admin/ic_admin_close.svg new file mode 100644 index 0000000..7b5e0c6 --- /dev/null +++ b/src/assets/icons/admin/ic_admin_close.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/assets/icons/admin/ic_admin_column_meatball.svg b/src/assets/icons/admin/ic_admin_column_meatball.svg new file mode 100644 index 0000000..66882c4 --- /dev/null +++ b/src/assets/icons/admin/ic_admin_column_meatball.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/src/assets/icons/admin/ic_admin_due.svg b/src/assets/icons/admin/ic_admin_due.svg new file mode 100644 index 0000000..82bf746 --- /dev/null +++ b/src/assets/icons/admin/ic_admin_due.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/assets/icons/admin/ic_admin_manual.svg b/src/assets/icons/admin/ic_admin_manual.svg new file mode 100644 index 0000000..a02c343 --- /dev/null +++ b/src/assets/icons/admin/ic_admin_manual.svg @@ -0,0 +1,4 @@ + + + + diff --git a/src/assets/icons/admin/ic_admin_meatball.svg b/src/assets/icons/admin/ic_admin_meatball.svg new file mode 100644 index 0000000..d1fd6b1 --- /dev/null +++ b/src/assets/icons/admin/ic_admin_meatball.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/src/assets/icons/admin/ic_admin_penalty.svg b/src/assets/icons/admin/ic_admin_penalty.svg new file mode 100644 index 0000000..265f55f --- /dev/null +++ b/src/assets/icons/admin/ic_admin_penalty.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/assets/icons/admin/ic_admin_plus.svg b/src/assets/icons/admin/ic_admin_plus.svg new file mode 100644 index 0000000..6303263 --- /dev/null +++ b/src/assets/icons/admin/ic_admin_plus.svg @@ -0,0 +1,4 @@ + + + + diff --git a/src/assets/icons/admin/ic_admin_receipt.svg b/src/assets/icons/admin/ic_admin_receipt.svg new file mode 100644 index 0000000..299c1f4 --- /dev/null +++ b/src/assets/icons/admin/ic_admin_receipt.svg @@ -0,0 +1,4 @@ + + + + diff --git a/src/assets/icons/admin/ic_admin_search.svg b/src/assets/icons/admin/ic_admin_search.svg new file mode 100644 index 0000000..b050748 --- /dev/null +++ b/src/assets/icons/admin/ic_admin_search.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/src/assets/icons/admin/ic_admin_service_transfer.svg b/src/assets/icons/admin/ic_admin_service_transfer.svg new file mode 100644 index 0000000..137d4a4 --- /dev/null +++ b/src/assets/icons/admin/ic_admin_service_transfer.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/assets/icons/admin/ic_admin_uncheckbox.svg b/src/assets/icons/admin/ic_admin_uncheckbox.svg new file mode 100644 index 0000000..b4719e6 --- /dev/null +++ b/src/assets/icons/admin/ic_admin_uncheckbox.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/assets/icons/admin/ic_admin_user.svg b/src/assets/icons/admin/ic_admin_user.svg new file mode 100644 index 0000000..7f44dd9 --- /dev/null +++ b/src/assets/icons/admin/ic_admin_user.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/assets/icons/logo/logo_full_Origin.svg b/src/assets/icons/logo/logo_full_Origin.svg new file mode 100644 index 0000000..f8b3470 --- /dev/null +++ b/src/assets/icons/logo/logo_full_Origin.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/src/assets/icons/logo/logo_full_Spring.svg b/src/assets/icons/logo/logo_full_Spring.svg new file mode 100644 index 0000000..ba06971 --- /dev/null +++ b/src/assets/icons/logo/logo_full_Spring.svg @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/src/assets/icons/logo/logo_full_Xmas.svg b/src/assets/icons/logo/logo_full_Xmas.svg new file mode 100644 index 0000000..3b7b2ef --- /dev/null +++ b/src/assets/icons/logo/logo_full_Xmas.svg @@ -0,0 +1,59 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/icons/logo/logo_initial_Origin.svg b/src/assets/icons/logo/logo_initial_Origin.svg new file mode 100644 index 0000000..7732b01 --- /dev/null +++ b/src/assets/icons/logo/logo_initial_Origin.svg @@ -0,0 +1,4 @@ + + + + diff --git a/src/assets/icons/logo/logo_initial_Xmas.svg b/src/assets/icons/logo/logo_initial_Xmas.svg new file mode 100644 index 0000000..64b9768 --- /dev/null +++ b/src/assets/icons/logo/logo_initial_Xmas.svg @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/src/components/admin/layout/Header.tsx b/src/components/admin/layout/Header.tsx new file mode 100644 index 0000000..f99c920 --- /dev/null +++ b/src/components/admin/layout/Header.tsx @@ -0,0 +1,48 @@ +'use client'; + +import { usePathname } from 'next/navigation'; + +const PAGE_METADATA: Record = { + '/admin/member': { + title: '멤버 관리', + description: + '가입 승인 등 멤버를 관리하는 페이지입니다. 정기모임을 모두 입력하신 후에 가입 승인을 해주시길 바랍니다.', + }, + '/admin/attendance': { + title: '출석 관리', + description: '기수를 선택하고, 해당 모임에 대한 출석을 수정하는 페이지입니다.', + }, + '/admin/penalty': { + title: '페널티 관리', + description: '기수를 선택하고, 해당 멤버에 대한 페널티를 수정하는 페이지입니다.', + }, + '/admin/dues': { + title: '회비 관리', + description: + '기수 시작시 이월된 회비와 해당 기수 회비를 종합해 회비를 등록해주시기 바랍니다. 회비 등록은 기수당 한 번만 가능합니다.', + }, +}; + +export function Header() { + const pathname = usePathname(); + + const metadata = Object.entries(PAGE_METADATA).find(([path]) => pathname.startsWith(path))?.[1]; + + return ( +
+ {metadata && ( + <> +
+ {metadata.title} + + {metadata.description} + + + )} + + +
+ ); +} diff --git a/src/components/admin/layout/LNB.tsx b/src/components/admin/layout/LNB.tsx new file mode 100644 index 0000000..46b39d5 --- /dev/null +++ b/src/components/admin/layout/LNB.tsx @@ -0,0 +1,139 @@ +'use client'; + +import Link from 'next/link'; +import type { StaticImageData } from 'next/image'; +import { usePathname } from 'next/navigation'; + +import logoIcon from '@/assets/icons/logo/logo_initial_Origin.svg'; +import userIcon from '@/assets/icons/admin/ic_admin_user.svg'; +import checkIcon from '@/assets/icons/admin/ic_admin_attendance.svg'; +import penaltyIcon from '@/assets/icons/admin/ic_admin_penalty.svg'; +// import dueIcon from '@/assets/icons/admin/ic_admin_due.svg'; +import arrowIcon from '@/assets/icons/admin/ic_admin_service_transfer.svg'; +import manualIcon from '@/assets/icons/admin/ic_admin_manual.svg'; + +import { cn } from '@/lib/cn'; + +const mainNavItems = [ + { id: 'member', icon: userIcon, label: '멤버 관리', path: '/admin/member' }, + { id: 'attendance', icon: checkIcon, label: '출석 관리', path: '/admin/attendance' }, + { id: 'penalty', icon: penaltyIcon, label: '페널티 관리', path: '/admin/penalty' }, + // { id: 'dues', icon: dueIcon, label: '회비 관리', path: '/admin/dues' }, +]; + +const moveNavItems = [ + { id: 'service', icon: arrowIcon, label: 'WEETH로 이동', path: 'https://weeth.kr' }, + { + id: 'manual', + icon: manualIcon, + label: '관리자 매뉴얼', + path: 'https://weeth-develop-2.s3.ap-northeast-2.amazonaws.com/Weeth_%E1%84%80%E1%85%AA%E1%86%AB%E1%84%85%E1%85%B5%E1%84%8C%E1%85%A1_%E1%84%86%E1%85%A6%E1%84%82%E1%85%B2%E1%84%8B%E1%85%A5%E1%86%AF_v3.pdf', + }, +]; + +function NavIcon({ src, isActive }: { src: StaticImageData | string; isActive: boolean }) { + const url = typeof src === 'string' ? src : (src as StaticImageData).src; + return ( + + ); +} + +const navItemClass = + 'typo-sub1 flex h-12 items-center gap-300 px-300 transition-colors text-text-alternative hover:bg-container-neutral-interaction'; + +export function LNB() { + const pathname = usePathname(); + + return ( + + ); +}