Skip to content

[FEAT] 면접 진행 여부에 따른 지원자 목록 컬럼 조건부 노출 (#420)#423

Merged
kanghaeun merged 10 commits intodevelopfrom
feat/interview-required-column#420
Feb 7, 2026
Merged

[FEAT] 면접 진행 여부에 따른 지원자 목록 컬럼 조건부 노출 (#420)#423
kanghaeun merged 10 commits intodevelopfrom
feat/interview-required-column#420

Conversation

@kanghaeun
Copy link
Contributor

#️⃣연관된 이슈

closes #420

📝작업 내용

모든 동아리가 면접 전형을 진행하지 않는다는 점을 고려하여, 면접 전형이 있는 동아리에게만 면접 시간 컬럼을 노출합니다

1. 테이블 칼럼 조건부 렌더링 적용

  • TableHeader와 TableBody 컴포넌트 내부에서 interviewRequired 값에 따른 조건부 렌더링 로직 추가

2. 레이아웃 및 너비 스타일 최적화

  • 컬럼 누락 시 발생할 수 있는 너비 불균형 방지

@kanghaeun kanghaeun requested a review from ganimjeong February 6, 2026 13:41
@kanghaeun kanghaeun self-assigned this Feb 6, 2026
@kanghaeun kanghaeun added ✨ Feature 기능 구현 이슈 🎨 UI UI 그리기 labels Feb 6, 2026
@gemini-code-assist
Copy link
Contributor

Summary of Changes

Hello @kanghaeun, I'm Gemini Code Assist1! I'm currently reviewing this pull request and will post my feedback shortly. In the meantime, here's a summary to help you and other reviewers quickly get up to speed!

이 PR은 동아리 대시보드에서 지원자 목록을 표시할 때, 해당 동아리가 면접 전형을 진행하는지 여부에 따라 '면접 시간' 관련 컬럼과 기능을 조건부로 제공하도록 개선합니다. 이를 통해 불필요한 정보 노출을 줄이고, 사용자 인터페이스의 유연성을 높여 다양한 동아리 전형 방식에 대응할 수 있도록 합니다.

Highlights

  • 면접 진행 여부에 따른 컬럼 조건부 노출: 모든 동아리가 면접 전형을 진행하지 않는다는 점을 고려하여, 면접 전형이 있는 동아리에만 '면접 시간' 컬럼이 노출되도록 조건부 렌더링 로직을 추가했습니다.
  • 테이블 레이아웃 및 너비 스타일 최적화: 면접 컬럼의 노출 여부에 따라 테이블 헤더와 아이템의 grid-template-columns 속성을 동적으로 조정하여 컬럼 누락 시 발생할 수 있는 너비 불균형을 방지했습니다.
  • 면접 시간 모달 기능 활성화 및 개선: 주석 처리되어 있던 면접 시간 확인 모달(InterviewTimeContentModal)을 활성화하고, 면접 일정이나 지원자 희망 시간이 없을 경우 사용자에게 안내 메시지를 표시하도록 개선했습니다.
  • 데이터 구조 및 API 응답 타입 변경: 백엔드 API 응답에 interviewRequired 필드를 추가하고, useApplicants 훅에서 이 값을 활용하도록 업데이트했습니다. 또한, ApplicantData 타입에서 interviewSchedule 필드를 제거하고 confirmedTimeinterviewInfo 필드의 타입을 명확히 했습니다.

🧠 New Feature in Public Preview: You can now enable Memory to help Gemini Code Assist learn from your team's feedback. This makes future code reviews more consistent and personalized to your project's style. Click here to enable Memory in your admin console.

Changelog
  • src/app/mocks/repositories/dashboard.ts
    • 목업 데이터에서 ApplicantDatainterviewSchedule 필드를 제거했습니다.
    • confirmedTime 필드의 값을 undefined에서 null로 변경했습니다.
    • ApplicantsApiResponseinterviewRequired: true 필드를 추가하여 면접 필요 여부를 나타내도록 했습니다.
  • src/pages/admin/Dashboard/components/ApplicantListSection/List/ApplicantList/index.styled.ts
    • ApplicantInfoCategoryList 컴포넌트에 hasInterview prop을 추가하고, 이 값에 따라 grid-template-columns 스타일을 조건부로 적용하도록 변경했습니다.
    • 미디어 쿼리 내에서도 hasInterview 값에 따라 grid-template-columns를 동적으로 설정하도록 업데이트했습니다.
  • src/pages/admin/Dashboard/components/ApplicantListSection/List/ApplicantList/index.tsx
    • 하드코딩된 INFO_CATEGORY 배열을 제거하고, interviewRequired 값에 따라 '면접 시간' 컬럼을 포함할지 결정하는 categories() 함수를 도입했습니다.
    • ApplicantInfoCategoryList 컴포넌트에 hasInterview prop으로 interviewRequired 값을 전달하도록 수정했습니다.
    • ApplicantListItem 컴포넌트에 interviewScheduleinterviewRequired prop을 추가로 전달하도록 변경했습니다.
  • src/pages/admin/Dashboard/components/ApplicantListSection/List/ApplicantListItem/InterviewTimeContentModal.tsx
    • Text 컴포넌트를 임포트했습니다.
    • interviewInfointerviewSchedule prop을 필수로 변경했습니다.
    • 면접 일정(interviewSchedule)이나 지원자 희망 시간(interviewInfo)이 없을 경우, 각각 '면접 일정을 먼저 등록해주세요' 또는 '지원자가 선택한 시간이 없습니다'라는 안내 메시지를 표시하도록 조건부 렌더링을 추가했습니다.
  • src/pages/admin/Dashboard/components/ApplicantListSection/List/ApplicantListItem/index.styled.ts
    • ItemWrapper 컴포넌트에 hasInterview prop을 추가하고, 이 값에 따라 grid-template-columns 스타일을 조건부로 적용하도록 변경했습니다.
    • 미디어 쿼리 내에서도 hasInterview 값에 따라 grid-template-columns를 동적으로 설정하도록 업데이트했습니다.
  • src/pages/admin/Dashboard/components/ApplicantListSection/List/ApplicantListItem/index.tsx
    • 주석 처리되어 있던 Modal 컴포넌트와 useModal 훅의 임포트를 활성화했습니다.
    • ApplicantListItem prop에 interviewScheduleinterviewRequired를 추가했습니다.
    • ItemWrapperhasInterview prop으로 interviewRequired 값을 전달하도록 수정했습니다.
    • 면접 시간 모달을 트리거하는 handleTimeSetterClick 함수를 활성화했습니다.
    • 면접이 필요한 경우(interviewRequired)에만 '면접 시간' 컬럼과 모달 트리거가 렌더링되도록 조건부 로직을 추가했습니다.
  • src/pages/admin/Dashboard/hooks/useApplicants.ts
    • ExtendedUseApiQueryResult 인터페이스에 interviewRequired: booleaninterviewSchedule: InterviewSchedule[] 필드를 추가했습니다.
    • useApplicants 훅에서 API 응답으로부터 interviewRequiredinterviewSchedule 값을 추출하여 반환하도록 업데이트했습니다.
  • src/pages/admin/Dashboard/types/dashboard.ts
    • ApplicantData 타입에서 interviewSchedule 필드를 제거했습니다.
    • ApplicantData 타입의 confirmedTimestring | null로, interviewInfoInterviewInfo[]로 변경하여 타입을 명확히 했습니다.
    • ApplicantsApiResponse 타입에 interviewRequired: boolean 필드를 추가했습니다.
Using Gemini Code Assist

The full guide for Gemini Code Assist can be found on our documentation page, here are some quick tips.

Invoking Gemini

You can request assistance from Gemini at any point by creating a comment using either /gemini <command> or @gemini-code-assist <command>. Below is a summary of the supported commands on the current page.

Feature Command Description
Code Review /gemini review Performs a code review for the current pull request in its current state.
Pull Request Summary /gemini summary Provides a summary of the current pull request in its current state.
Comment @gemini-code-assist Responds in comments when explicitly tagged, both in pull request comments and review comments.
Help /gemini help Displays a list of available commands.

Customization

To customize Gemini Code Assist for GitHub experience, repository maintainers can create a configuration file and/or provide a custom code review style guide (such as PEP-8 for Python) by creating and adding files to a .gemini/ folder in the base of the repository. Detailed instructions can be found here.

Limitations & Feedback

Gemini Code Assist may make mistakes. Please leave feedback on any instances where its feedback is incorrect or counter productive. You can react with 👍 and 👎 on @gemini-code-assist comments. If you're interested in giving your feedback about your experience with Gemini Code Assist for Github and other Google products, sign up here.

You can also get AI-powered code generation, chat, as well as code reviews directly in the IDE at no cost with the Gemini Code Assist IDE Extension.

Footnotes

  1. Review the Privacy Notices, Generative AI Prohibited Use Policy, Terms of Service, and learn how to configure Gemini Code Assist in GitHub here. Gemini can make mistakes, so double check it and use code with caution.

Copy link
Contributor

@gemini-code-assist gemini-code-assist bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Code Review

이 PR은 면접 진행 여부에 따라 지원자 목록의 '면접 시간' 컬럼을 조건부로 노출하도록 변경하는 내용을 담고 있습니다. 전반적으로 기능 구현이 잘 이루어졌습니다. useApplicants 훅에서 interviewRequiredinterviewSchedule을 제공하고, 이를 통해 UI 컴포넌트들이 동적으로 렌더링되도록 수정한 점이 좋습니다. 몇 가지 코드 가독성 및 성능 개선을 위한 제안 사항을 리뷰 코멘트로 남겼습니다. 확인 부탁드립니다.

Comment on lines 9 to 10
grid-template-columns: ${({ hasInterview }) =>
hasInterview ? '1fr 1fr 1fr 1.2fr 1.5fr 1fr 1.2fr' : '1fr 1fr 1fr 1.2fr 1.5fr 1fr'};
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

medium

grid-template-columns를 설정하는 로직이 여러 미디어 쿼리에서 반복되고 있습니다. 이로 인해 코드가 장황해지고 유지보수가 어려워질 수 있습니다. 기본 컬럼 문자열에 인터뷰 컬럼을 조건부로 추가하는 방식으로 리팩토링하면 코드를 더 간결하고 명확하게 만들 수 있습니다. 아래 제안을 이 파일의 다른 미디어 쿼리들과 src/pages/admin/Dashboard/components/ApplicantListSection/List/ApplicantListItem/index.styled.ts 파일에도 동일하게 적용하는 것을 고려해보세요.

Suggested change
grid-template-columns: ${({ hasInterview }) =>
hasInterview ? '1fr 1fr 1fr 1.2fr 1.5fr 1fr 1.2fr' : '1fr 1fr 1fr 1.2fr 1.5fr 1fr'};
grid-template-columns: ${({ hasInterview }) =>
'1fr 1fr 1fr 1.2fr 1.5fr 1fr' + (hasInterview ? ' 1.2fr' : '')};

Comment on lines 33 to 36
const categories = () => {
const base: ApplicateInfoCategory[] = ['이름', '학번', '학과', '전화번호', '이메일', '결과'];
return interviewRequired ? [...base, '면접 시간'] : base;
};
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

medium

categories 함수는 컴포넌트가 렌더링될 때마다 재생성됩니다. 사소한 성능 저하일 수 있지만, useMemo 훅을 사용하여 interviewRequired 값이 변경될 때만 categories 배열이 재생성되도록 메모이제이션하는 것이 좋습니다.

이 제안을 적용하려면 react에서 useMemo를 import하고, JSX 내부의 categories().map 호출을 categories.map으로 변경해야 합니다.

Suggested change
const categories = () => {
const base: ApplicateInfoCategory[] = ['이름', '학번', '학과', '전화번호', '이메일', '결과'];
return interviewRequired ? [...base, '면접 시간'] : base;
};
const categories = useMemo(() => {
const base: ApplicateInfoCategory[] = ['이름', '학번', '학과', '전화번호', '이메일', '결과'];
return interviewRequired ? [...base, '면접 시간'] : base;
}, [interviewRequired]);

@kanghaeun kanghaeun merged commit 82d5870 into develop Feb 7, 2026
5 checks passed
@kanghaeun kanghaeun deleted the feat/interview-required-column#420 branch February 7, 2026 09:58
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

✨ Feature 기능 구현 이슈 🎨 UI UI 그리기

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[FEAT] 면접 진행 여부에 따른 지원자 목록 컬럼 조건부 노출

2 participants