Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 3 additions & 2 deletions src/app/dashboard/core-applications/page.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ import { useCallback, useEffect, useMemo, useState } from 'react'
import Link from 'next/link'

import Loader from '@/components/ui/common/Loader'
import { formatMajorLabel } from '@/constant/majorOptions'
import { useAuthenticatedApi } from '@/hooks/useAuthenticatedApi'

type RecruitCoreResultStatus = 'SUBMITTED' | 'IN_REVIEW' | 'ACCEPTED' | 'REJECTED'
Expand Down Expand Up @@ -341,7 +342,7 @@ export default function DashboardCoreApplicationsPage() {
>
<td className="px-4 py-3 typo-pc-b3">{application.name}</td>
<td className="px-4 py-3 typo-pc-b3">{application.studentId}</td>
<td className="px-4 py-3 typo-pc-b3">{application.major}</td>
<td className="px-4 py-3 typo-pc-b3">{formatMajorLabel(application.major)}</td>
<td className="px-4 py-3 typo-pc-b3">{application.team}</td>
<td className="px-4 py-3 typo-pc-b3">{application.resultStatus}</td>
<td className="px-4 py-3 typo-pc-b3">{formatDateTime(application.createdAt)}</td>
Expand Down Expand Up @@ -410,7 +411,7 @@ export default function DashboardCoreApplicationsPage() {
<div className="mt-3 space-y-2 typo-pc-b3">
<p>이름: {detail.snapshot.name}</p>
<p>학번: {detail.snapshot.studentId}</p>
<p>전공: {detail.snapshot.major}</p>
<p>전공: {formatMajorLabel(detail.snapshot.major)}</p>
<p>전화번호: {detail.snapshot.phone}</p>
<p>이메일: {detail.snapshot.email}</p>
<p>지원 팀: {detail.team}</p>
Expand Down
3 changes: 2 additions & 1 deletion src/app/dashboard/members/page.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ import Link from 'next/link'
import Loader from '@/components/ui/common/Loader'
import UserDetailsModal from '@/components/admin/UserDetailsModal'
import { GdgSegmentedButton } from '@/components/ui/design-system'
import { formatMajorLabel } from '@/constant/majorOptions'
import { useAuthenticatedApi } from '@/hooks/useAuthenticatedApi'
import { formatPhoneNumberDisplay } from '@/utils/phoneNumber'

Expand Down Expand Up @@ -264,7 +265,7 @@ export default function DashboardMembersPage() {
members.map((member) => (
<tr key={member.id} className="border-t border-white/10 bg-black">
<td className="px-4 py-3 typo-pc-b3">{member.name}</td>
<td className="px-4 py-3 typo-pc-b3">{member.major}</td>
<td className="px-4 py-3 typo-pc-b3">{formatMajorLabel(member.major)}</td>
<td className="px-4 py-3 typo-pc-b3">{member.studentId}</td>
<td className="px-4 py-3 typo-pc-b3">
{formatPhoneNumberDisplay(member.phoneNumber)}
Expand Down
3 changes: 2 additions & 1 deletion src/app/dashboard/users/page.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ import { useCallback, useEffect, useMemo, useState } from 'react'
import Link from 'next/link'

import Loader from '@/components/ui/common/Loader'
import { formatMajorLabel } from '@/constant/majorOptions'
import { useAuth } from '@/hooks/useAuth'
import { useAuthenticatedApi } from '@/hooks/useAuthenticatedApi'

Expand Down Expand Up @@ -350,7 +351,7 @@ export default function DashboardUsersPage() {
<td className="px-4 py-3 typo-pc-b3">{user.id}</td>
<td className="px-4 py-3 typo-pc-b3">{user.name}</td>
<td className="px-4 py-3 typo-pc-b3">{user.email}</td>
<td className="px-4 py-3 typo-pc-b3">{user.major || '-'}</td>
<td className="px-4 py-3 typo-pc-b3">{formatMajorLabel(user.major)}</td>
<td className="px-4 py-3 typo-pc-b3">{user.studentId || '-'}</td>
<td className="px-4 py-3">
{editable ? (
Expand Down
5 changes: 3 additions & 2 deletions src/app/recruit/core/page.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@ import {
GdgInputField
} from '@/components/ui/design-system'
import { PrivacyPolicyNotice } from '@/components/ui/common/PrivacyPolicyNotice'
import { normalizeMajorCode } from '@/constant/majorOptions'
import { useAuthenticatedApi } from '@/hooks/useAuthenticatedApi'
import { usePhoneNumber } from '@/hooks/usePhoneNumber'
import { unwrapApiResponse } from '@/utils/api/unwrap'
Expand Down Expand Up @@ -272,7 +273,7 @@ export default function RecruitCore() {
name: prev.name || payload.name || '',
studentId: prev.studentId || payload.studentId || '',
email: prev.email || payload.email || '',
major: prev.major || payload.major || '',
major: prev.major || normalizeMajorCode(payload.major) || '',
phone: formatInput(prev.phone || payload.phone || '')
}))
} catch (error: any) {
Expand Down Expand Up @@ -439,7 +440,7 @@ export default function RecruitCore() {
name: formData.name,
studentId: formData.studentId,
phone: toDigits(formData.phone),
major: formData.major,
major: normalizeMajorCode(formData.major),
email: formData.email
},
team: formData.team,
Expand Down
4 changes: 2 additions & 2 deletions src/components/admin/AdminDashboard.tsx
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
'use client';

import React, { useMemo } from 'react';
import { formatMajorLabel } from '@/constant/majorOptions';
import {
ResponsiveContainer,
PieChart,
Expand All @@ -21,7 +22,7 @@ function normalizeMembers(rawMembers = []) {
return rawMembers.map((u) => ({
id: u?.id ?? u?.member?.id,
name: u?.name ?? u?.member?.name ?? '',
major: u?.major ?? u?.member?.major ?? u?.member?.majors?.main ?? '기타',
major: formatMajorLabel(u?.major ?? u?.member?.major ?? u?.member?.majors?.main ?? '기타'),
admissionSemester: u?.admissionSemester ?? u?.member?.admissionSemester ?? '미상',
studentId: String(u?.studentId ?? u?.member?.studentId ?? ''),
isPayed: typeof (u?.isPayed ?? u?.member?.isPayed) === 'boolean' ? (u?.isPayed ?? u?.member?.isPayed) : false,
Expand Down Expand Up @@ -207,4 +208,3 @@ export default function AdminDashboard({ members = [], totalCount }) {
);
}


4 changes: 2 additions & 2 deletions src/components/admin/AdminTableCell.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

import React from 'react';
import { User, Chip, Checkbox } from '@nextui-org/react';
import { formatMajorLabel } from '@/constant/majorOptions';

const statusColorMap = {
true: 'success',
Expand All @@ -28,7 +29,7 @@ export default function AdminTableCell({ user, columnKey, onTogglePay }) {
case 'major':
return (
<div className='flex flex-col'>
<p className='text-white text-bold text-sm capitalize'>{user.major}</p>
<p className='text-white text-bold text-sm capitalize'>{formatMajorLabel(user.major)}</p>
<p className='text-bold text-sm capitalize text-default-400'>{user.studentId}</p>
</div>
);
Expand All @@ -54,4 +55,3 @@ export default function AdminTableCell({ user, columnKey, onTogglePay }) {
}
}


4 changes: 4 additions & 0 deletions src/components/admin/UserDetailsModal.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
import React, { useEffect } from 'react';
import { Button } from '@nextui-org/react';
import clsx from 'clsx';
import { formatMajorLabel } from '@/constant/majorOptions';
import { formatPhoneNumberDisplay } from '@/utils/phoneNumber';

const FIELD_LABELS = {
Expand Down Expand Up @@ -79,6 +80,9 @@ const formatFieldValue = (key, value) => {
if (key === 'isPayed' && typeof value === 'boolean') {
return value ? '입금 완료' : '미입금';
}
if (key === 'major' && typeof value === 'string') {
return formatMajorLabel(value);
}
return formatValue(value);
};

Expand Down
10 changes: 5 additions & 5 deletions src/components/auth/screen/AuthFindId.jsx
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ import axios from 'axios';
import TransparentInput from '@/components/ui/input/TransparentInput';
import { usePhoneNumber } from '@/hooks/usePhoneNumber';

import { majorOptions } from '@/constant/majorOptions';
import { majorOptions, normalizeMajorCode } from '@/constant/majorOptions';

export default function AuthFindId({ handleBackToLogin }) {
const [name, setName] = useState('');
Expand Down Expand Up @@ -92,14 +92,14 @@ export default function AuthFindId({ handleBackToLogin }) {
base: 'bg-[#1c1c1c] text-white',
},
}}
selectedKeys={major}
onSelectionChange={setMajor}
selectedKeys={normalizeMajorCode(major)}
onSelectionChange={(value) => setMajor(String(value ?? ''))}
>
{majorOptions.map((major) => (
<AutocompleteSection title={major.title} key={major.title} showDivider>
{major.items.map((item) => (
<AutocompleteItem key={item.key} aria-label={item.value} value={item.value}>
{item.value}
<AutocompleteItem key={item.code} aria-label={item.label} value={item.code}>
{item.label}
</AutocompleteItem>
))}
</AutocompleteSection>
Expand Down
5 changes: 3 additions & 2 deletions src/components/study/ui/card/ApplicantInfoList.jsx
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

// components
import GreenTextButton from "@/components/ui/button/GreenTextButton";
import { formatMajorLabel } from '@/constant/majorOptions';

export default function ApplicantInfoList({
applications,
Expand Down Expand Up @@ -57,7 +58,7 @@ export default function ApplicantInfoList({
onClick={() => handleApplicantDetailPopup(app.id)}
>
<td className="py-4">{app.name}</td>
<td className="py-4">{app.major}</td>
<td className="py-4">{formatMajorLabel(app.major)}</td>
<td className="py-4">{app.studentId}</td>
<td className="py-4 text-center">
{/* 이미 처리된 지원자가 있으면 상태 뱃지 표시 */}
Expand Down Expand Up @@ -104,4 +105,4 @@ export default function ApplicantInfoList({
</div>
</div>
);
}
}
5 changes: 3 additions & 2 deletions src/components/study/ui/modal/ApplicantDetailModal.jsx
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

import { useEffect } from 'react';
import { Spinner } from "@nextui-org/react";
import { formatMajorLabel } from '@/constant/majorOptions';

// API Services
import { useApplicantDetail } from '@/services/study/useApplicantDetail';
Expand Down Expand Up @@ -58,7 +59,7 @@ export default function ApplicantDetailModal({ apiClient, studyId, selectedAppli
<th className="p-2 bg-gray-200 text-center">학번</th>
</tr>
<tr className="border-b-2 border-gray-400">
<td className="p-2 border-r-2 border-gray-400 text-center">{applicantDetail.major}</td>
<td className="p-2 border-r-2 border-gray-400 text-center">{formatMajorLabel(applicantDetail.major)}</td>
<td className="p-2 text-center">{applicantDetail.studentId}</td>
</tr>
<tr className="border-b-2 border-gray-400">
Expand Down Expand Up @@ -108,4 +109,4 @@ export default function ApplicantDetailModal({ apiClient, studyId, selectedAppli
</div>
)
);
}
}
8 changes: 4 additions & 4 deletions src/components/ui/design-system/GdgMajorDropdown.tsx
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
'use client'

import { majorOptions } from '@/constant/majorOptions'
import { majorOptions, normalizeMajorCode } from '@/constant/majorOptions'
import { GdgDropdown, type GdgDropdownOptionGroup } from './GdgDropdown'

export type GdgMajorDropdownProps = {
Expand All @@ -23,8 +23,8 @@ export function GdgMajorDropdown({
const groupedOptions: GdgDropdownOptionGroup[] = majorOptions.map((group) => ({
title: group.title,
items: group.items.map((item) => ({
id: item.value,
label: item.value
id: item.code,
label: item.label
}))
}))

Expand All @@ -34,7 +34,7 @@ export function GdgMajorDropdown({
size="full"
placeholder="학과를 입력해 주세요."
optionGroups={groupedOptions}
value={value}
value={normalizeMajorCode(value)}
onChange={onChangeAction}
autoFocus={autoFocus}
isInvalid={isInvalid ?? Boolean(errorMessage)}
Expand Down
Loading
Loading