feat : Web-15 신청 부원 조회 페이지#4
Conversation
|
/gemini review |
There was a problem hiding this comment.
Code Review
This pull request integrates Tailwind CSS into the project, updates global styles and fonts, and implements a detailed applicant management view on the Admin page alongside a redesigned Header component. The review feedback highlights two key areas for improvement: adding a visible label to the empty admin navigation link in the Header, and enhancing the Admin page modal UX by allowing users to close it when clicking on the backdrop.
| <NavLink | ||
| to={ROUTES.ADMIN_APPLICANTS} | ||
| className={({ isActive }) => | ||
| isActive ? `${styles.navLink} ${styles.active}` : styles.navLink | ||
| } | ||
| > | ||
|
|
||
| </NavLink> |
There was a problem hiding this comment.
관리자 확인용 임시 메뉴인 NavLink 내부에 텍스트나 자식 요소가 누락되어 있어 화면에 아무것도 표시되지 않습니다. 사용자가 클릭하여 이동할 수 있도록 링크 텍스트(예: <span>지원자 관리</span>)를 추가해 주세요.
| <NavLink | |
| to={ROUTES.ADMIN_APPLICANTS} | |
| className={({ isActive }) => | |
| isActive ? `${styles.navLink} ${styles.active}` : styles.navLink | |
| } | |
| > | |
| </NavLink> | |
| <NavLink | |
| to={ROUTES.ADMIN_APPLICANTS} | |
| className={({ isActive }) => | |
| isActive ? `${styles.navLink} ${styles.active}` : styles.navLink | |
| } | |
| > | |
| <span>지원자 관리</span> | |
| </NavLink> |
| <div className={styles.modalBackdrop} role="presentation"> | ||
| <section | ||
| className={styles.modal} | ||
| role="dialog" | ||
| aria-modal="true" | ||
| aria-label="신청 부원 상세 정보" | ||
| > |
There was a problem hiding this comment.
모달 백드롭(배경) 영역을 클릭했을 때 상세 모달창이 닫히도록 설정하면 사용자 경험(UX)이 향상됩니다. 백드롭에 onClick={handleCloseDetail}을 추가하고, 모달 내부 콘텐츠 영역 클릭 시 이벤트가 상위로 전파되어 모달이 의도치 않게 닫히는 것을 방지하기 위해 onClick={(e) => e.stopPropagation()}을 추가하는 것을 권장합니다.
<div className={styles.modalBackdrop} onClick={handleCloseDetail} role="presentation">
<section
className={styles.modal}
role="dialog"
aria-modal="true"
aria-label="신청 부원 상세 정보"
onClick={(e) => e.stopPropagation()}
>There was a problem hiding this comment.
handleOpenDetail, handleCloseDetail 핸들러 분리 (컨벤션: handle + 동작)
백드롭 클릭 시 모달 닫힘 (onClick={handleCloseDetail})
모달 내부 클릭 시 이벤트 버블링 차단 (stopPropagation)
X 버튼도 인라인 익명 함수 → handleCloseDetail로 교체
수정완료했습니다
This reverts commit 1ae3b0e.
| @@ -1,17 +1,69 @@ | |||
| import { Link } from 'react-router-dom'; | |||
| @@ -0,0 +1,259 @@ | |||
| .page { | |||
There was a problem hiding this comment.
CSS modules 사용하는것이 아닌 tailwind css만 사용해주세요. 파일 삭제 부탁드립니다
|
AdminPage 파일의 내용을 RecruitManagePage 파일로 옮겼고 |
|
|
||
| return ( | ||
| <section className="min-h-[calc(100vh-112px)] bg-brand-soft px-[5.75rem] py-7 max-lg:px-6"> | ||
| <div className="mx-auto min-h-[842px] max-w-[1254px] rounded-card bg-white px-[60px] pt-[52px] pb-[28px] shadow-[0_4px_4px_rgba(0,0,0,0.25)]"> |
There was a problem hiding this comment.
shadow값 하드코딩 금지 tailwind.config.js에서 import해서 사용해주세요.
|
|
||
| {selectedApplicant && ( | ||
| <div | ||
| className="fixed inset-x-0 bottom-0 top-[112px] flex items-center justify-center bg-[rgba(238,238,238,0.78)] p-8" |
There was a problem hiding this comment.
rgb 토큰 이미 EEEEEE(line)으로 tailwind.config.js에 정의되어 있습니다. 수정해 주세요.
| <nav className="mt-8 flex items-center justify-center gap-9"> | ||
| <button type="button" aria-label="이전 페이지"> | ||
| <svg width="24" height="24" viewBox="0 0 24 24" fill="none" aria-hidden="true"> | ||
| <path d="M15 18l-6-6 6-6" stroke="#1A1A1A" strokeWidth="2" strokeLinecap="round" strokeLinejoin="round" /> |
There was a problem hiding this comment.
1A1A1A 토큰 이미 ink로 정의되어있습니다 import해서 사용해주세요
| </p> | ||
| </div> | ||
|
|
||
| <div className="overflow-hidden rounded-[50px] border border-tag max-lg:overflow-x-auto"> |
There was a problem hiding this comment.
rounded-50은 tailwind.config.js에 이미 borderRadius.card 50px 토큰으로 정의되어 있습니다. 수정해 주세요
|
/gemini review |
There was a problem hiding this comment.
Code Review
This pull request introduces a new administrator page, RecruitManagePage, for viewing and managing applicant details, along with corresponding routing configurations, custom SVG icons, and an updated Header component that utilizes NavLink for active state styling. Feedback on these changes focuses on improving routing consistency by renaming the /admin/Memberpage path to a lowercase kebab-case format, fixing indentation and simplifying ternary operators in the Header component, addressing accessibility (a11y) and ESLint concerns regarding static click handlers and close buttons in the modal, and refactoring the hardcoded pagination UI to support dynamic data rendering.
Important
The consumer version of Gemini Code Assist on GitHub is being sunset. Starting June 18, 2026, new organization installations will be blocked, and all code review activity will officially cease on July 17, 2026.
For more details on the timeline and next steps, please review the Help Documentation.
| SCHEDULE: '/schedule', | ||
| ABOUT: '/about', | ||
| ADMIN: '/admin', | ||
| ADMIN_RECRUIT: '/admin/Memberpage', |
There was a problem hiding this comment.
ADMIN_RECRUIT 경로가 /admin/Memberpage로 설정되어 있습니다. 이 설정은 다음과 같은 문제가 있습니다:\n\n1. 일관성 결여: 다른 관리자 경로인 /admin/members 등은 소문자 케밥 케이스를 사용하는 반면, 이 경로는 대소문자가 섞인 Memberpage를 사용하고 있어 URL 컨벤션에 맞지 않습니다.\n2. 의미적 혼동: 이 페이지는 신청 부원을 관리하는 RecruitManagePage인데, URL 경로명이 Memberpage로 되어 있어 실제 역할과 일치하지 않으며 개발자에게 혼동을 줄 수 있습니다.\n\n따라서 경로를 /admin/recruits 또는 /admin/recruit-manage와 같이 소문자 기반의 직관적인 이름으로 변경하는 것을 권장합니다.
| ADMIN_RECRUIT: '/admin/Memberpage', | |
| ADMIN_RECRUIT: '/admin/recruits', |
| <NavLink to={ROUTES.SCHEDULE}> | ||
| {({ isActive }) => ( | ||
| <div className="flex items-center gap-3"> | ||
| <img | ||
| src={ | ||
| isActive | ||
| ? calendarOrangeIcon | ||
| : calendarBlackIcon | ||
| } | ||
| alt="" | ||
| className="h-10 w-10 object-contain" | ||
| /> | ||
|
|
||
| <span | ||
| className="text-xl font-medium" | ||
| style={{ | ||
| color: isActive ? COLORS.orange : '#000000', | ||
| }} | ||
| > | ||
| 연간 계획 | ||
| </span> | ||
| </div> | ||
| )} | ||
| </NavLink> |
There was a problem hiding this comment.
NavLink 내부의 자식 요소들의 들여쓰기(Indentation)가 올바르지 않아 코드 가독성이 떨어집니다. 또한 src 속성 내의 삼항 연산자를 한 줄로 정리하면 코드가 훨씬 깔끔해집니다.\n\n일관된 들여쓰기를 적용하여 가독성을 높이는 것을 권장합니다.
<NavLink to={ROUTES.SCHEDULE}>
{({ isActive }) => (
<div className="flex items-center gap-3">
<img
src={isActive ? calendarOrangeIcon : calendarBlackIcon}
alt=""
className="h-10 w-10 object-contain"
/>
<span
className="text-xl font-medium"
style={{
color: isActive ? COLORS.orange : '#000000',
}}
>
연간 계획
</span>
</div>
)}
</NavLink>| <NavLink to={ROUTES.RECRUIT}> | ||
| {({ isActive }) => ( | ||
| <div className="flex items-center gap-3"> | ||
| <img | ||
| src={ | ||
| isActive | ||
| ? userOrangeIcon | ||
| : userBlackIcon | ||
| } | ||
| alt="" | ||
| className="h-10 w-10 object-contain" | ||
| /> | ||
|
|
||
| <span | ||
| className="text-xl font-medium" | ||
| style={{ | ||
| color: isActive ? COLORS.orange : '#000000', | ||
| }} | ||
| > | ||
| 신입 부원 모집 | ||
| </span> | ||
| </div> | ||
| )} | ||
| </NavLink> |
There was a problem hiding this comment.
위의 '연간 계획' 링크와 마찬가지로, '신입 부원 모집' 링크 부분도 들여쓰기가 올바르지 않습니다. 일관된 코드 스타일과 가독성을 위해 들여쓰기를 수정하고 삼항 연산자를 정리하는 것을 권장합니다.
<NavLink to={ROUTES.RECRUIT}>
{({ isActive }) => (
<div className="flex items-center gap-3">
<img
src={isActive ? userOrangeIcon : userBlackIcon}
alt=""
className="h-10 w-10 object-contain"
/>
<span
className="text-xl font-medium"
style={{
color: isActive ? COLORS.orange : '#000000',
}}
>
신입 부원 모집
</span>
</div>
)}
</NavLink>| <button | ||
| type="button" | ||
| className="absolute right-6 top-6 text-[32px]" | ||
| onClick={handleCloseDetail} | ||
| > | ||
| × | ||
| </button> |
There was a problem hiding this comment.
모달의 닫기 버튼 내부 텍스트로 × (곱하기 기호) 문자가 사용되었습니다. 이 기호는 스크린 리더 등 보조 기기를 사용하는 사용자에게 "곱하기" 또는 "times"로 읽혀 닫기 버튼의 역할을 명확히 전달하지 못할 수 있습니다.\n\n웹 접근성(a11y)을 향상시키기 위해 aria-label="닫기" 속성을 추가하는 것을 권장합니다.
| <button | |
| type="button" | |
| className="absolute right-6 top-6 text-[32px]" | |
| onClick={handleCloseDetail} | |
| > | |
| × | |
| </button> | |
| <button | |
| type="button" | |
| className="absolute right-6 top-6 text-[32px]" | |
| onClick={handleCloseDetail} | |
| aria-label="닫기" | |
| > | |
| × | |
| </button> |
| <div | ||
| className="fixed inset-x-0 bottom-0 top-[112px] flex items-center justify-center bg-line/[0.78] p-8" | ||
| onClick={handleCloseDetail} | ||
| > |
There was a problem hiding this comment.
| <nav className="mt-8 flex items-center justify-center gap-9"> | ||
| <button type="button" aria-label="이전 페이지" className="text-ink"> | ||
| <svg width="24" height="24" viewBox="0 0 24 24" fill="none" aria-hidden="true"> | ||
| <path d="M15 18l-6-6 6-6" stroke="currentColor" strokeWidth="2" strokeLinecap="round" strokeLinejoin="round" /> | ||
| </svg> | ||
| </button> | ||
| <button type="button" className="text-[20px] text-brand">1</button> | ||
| <button type="button" className="text-[20px]">2</button> | ||
| <button type="button" className="text-[20px]">3</button> | ||
| <button type="button" className="text-[20px]">4</button> | ||
| <button type="button" aria-label="다음 페이지" className="text-ink"> | ||
| <svg width="24" height="24" viewBox="0 0 24 24" fill="none" aria-hidden="true"> | ||
| <path d="M9 18l6-6-6-6" stroke="currentColor" strokeWidth="2" strokeLinecap="round" strokeLinejoin="round" /> | ||
| </svg> | ||
| </button> | ||
| </nav> |









📌 작업 내용
신청 부원 조회 페이지 구현
신청자 목록 UI 구성
테이블 레이아웃 및 기본 스타일 적용
CSS Modules를 사용하여 페이지 스타일 분리
🔗 관련 이슈
📸 스크린샷 / 화면 녹화
🧪 테스트 방법
1.http://localhost:5173/admin 로 접근
2.
3.
✅ 체크리스트
npm run lint통과를 확인했습니다npm run format을 적용했습니다console.log를 제거했습니다develop인지 확인했습니다💬 리뷰어에게 한 마디