diff --git a/apps/Admission-LTS/package.json b/apps/Admission-LTS/package.json index fa2eb46..1c55b8c 100644 --- a/apps/Admission-LTS/package.json +++ b/apps/Admission-LTS/package.json @@ -4,7 +4,7 @@ "private": true, "dependencies": { "react-device-detect": "^2.2.3", - "react-pdf": "^7.7.1", - "pdfjs-dist": "^3.11.174" + "react-pdf": "^10.2.0", + "pdfjs-dist": "5.4.296" } } diff --git a/apps/Admission-LTS/src/apis/admission/index.ts b/apps/Admission-LTS/src/apis/admission/index.ts index 289990f..a46ade0 100644 --- a/apps/Admission-LTS/src/apis/admission/index.ts +++ b/apps/Admission-LTS/src/apis/admission/index.ts @@ -15,7 +15,7 @@ const sendErrorReport = async ( const errorReport = { sessionId, pageType: "ADMISSION", - endpoint: "/api/v1/applications", + endpoint: "/application", httpMethod: "POST", httpStatus: error.response?.status || 0, errorCategory: "SERVER_ERROR", @@ -44,7 +44,7 @@ export const useAdmissionSubmitPost = () => { mutationFn: async (data: T) => { const startTime = Date.now() try { - const response = await AdmissionUserInstance.post('/api/v1/applications', data) + const response = await AdmissionUserInstance.post('/application', data) return response.data } catch (error) { const responseTime = Date.now() - startTime diff --git a/apps/Admission-LTS/src/apis/admission/types.ts b/apps/Admission-LTS/src/apis/admission/types.ts index 7d6471a..c9a117f 100644 --- a/apps/Admission-LTS/src/apis/admission/types.ts +++ b/apps/Admission-LTS/src/apis/admission/types.ts @@ -1,69 +1,77 @@ export interface IAdmissionRequest { - applicantName: string, //applicant-info, 지원자 성명 - applicantTel: string, //applicant-info, 지원자 연락처 - applicationType: string | null, //application-classification, 전형 선택 - educationalStatus: string | null, //application-classification, 졸업 구분 - birthDate: string, //applicant-info, 생년월일 - applicantGender: string | null, //applicant-info, 지원자 성별 - streetAddress: string, //guardian-info, 기본주소 - postalCode: string, //guardian-info, 우편번호 - detailAddress: string, //guardian-info, 상세주소 - isDaejeon: boolean, //application-classification, 지역 선택 - parentName: string, //guardian-info, 보호자 성명 - parentTel: string, //guardian-info, 보호자 연락처 - parentRelation: string, //guardian-info, 지원자와의 관계 - guardianGender: string | null, //guardian-info, 성별 - schoolCode: string | null, //middle-school-info, 학교 코드 - schoolName: string | null, //middle-school-info, 학교 이름 - studentId: number | null, //middle-school-info, 중학교 학번 - schoolPhone: string | null, //middle-school-info, 중학교 전화번호 - teacherName: string | null, //middle-school-info, 중학교 교사 성명 - nationalMeritChild: boolean, //applicant-info, 국가 유공자 체크 - specialAdmissionTarget: boolean, //applicant-info, 특례입학 대상 - graduationDate: string | null, //application-classification, 졸업 예정 연월 - studyPlan: string, //personal-statements, 학업계획서 - selfIntroduce: string, //personal-statements, 자기소개 - korean_3_1: number | null, - social_3_1: number | null, - history_3_1: number | null, - math_3_1: number | null, - science_3_1: number | null, - tech_3_1: number | null, - english_3_1: number | null, - korean_3_2: number | null, - social_3_2: number | null, - history_3_2: number | null, - math_3_2: number | null, - science_3_2: number | null, - tech_3_2: number | null, - english_3_2: number | null, - korean_2_2: number | null, - social_2_2: number | null, - history_2_2: number | null, - math_2_2: number | null, - science_2_2: number | null, - tech_2_2: number | null, - english_2_2: number | null, - korean_2_1: number | null, - social_2_1: number | null, - history_2_1: number | null, - math_2_1: number | null, - science_2_1: number | null, - tech_2_1: number | null, - english_2_1: number | null, - gedKorean: number | null, - gedSocial: number | null, - gedHistory: number | null, - gedMath: number | null, - gedScience: number | null, - gedTech: number | null, - gedEnglish: number | null, - absence: number | null, //결석 - tardiness: number | null, //지각 - earlyLeave: number | null, //조퇴 - classExit: number | null, //결과 - // unexcused: number | null, //미인정 - volunteer: number | null, //봉사 - algorithmAward: boolean, + applicantInfo: IApplicantInfo + addressInfo: IAddressInfo + applicationInfo: IApplicationInfo + schoolInfo: ISchoolInfo + gradeInfo: IGradeInfo + attendanceInfo: IAttendanceInfo + awardAndCertificateInfo: IAwardAndCertificateInfo +} + +interface IApplicantInfo { + applicantName: string // applicant-info, 지원자 성명 + applicantTel: string // applicant-info, 지원자 연락처 + birthDate: string // applicant-info, 생년월일 + applicantGender: string // applicant-info, 지원자 성별 + + parentName: string // guardian-info, 보호자 성명 + parentTel: string // guardian-info, 보호자 연락처 + parentRelation: string // guardian-info, 지원자와의 관계 + +} + +interface IAddressInfo { + isDaejeon: boolean // application-classification, 지역 선택 + streetAddress: string // guardian-info, 기본주소 + detailAddress: string // guardian-info, 상세주소 + postalCode: string // guardian-info, 우편번호 +} + +interface IApplicationInfo { + applicationType: string | null // application-classification, 전형 선택 + educationalStatus: string | null // application-classification, 졸업 구분 + studentNumber: string | null // middle-school-info, 중학교 학번 + graduationDate: string | null // application-classification, 졸업 예정 연월 + + studyPlan: string // personal-statements, 학업계획서 + selfIntroduce: string // personal-statements, 자기소개 + + applicationRemark: string // applicant-info, 특기사항 +} + +interface ISchoolInfo { + schoolCode: string | null // middle-school-info, 학교 코드 + schoolName: string | null // middle-school-info, 학교 이름 + schoolPhone: string | null // middle-school-info, 중학교 전화번호 + teacherName: string | null // middle-school-info, 중학교 교사 성명 +} + +interface IGradeInfo { + koreanGrade: string | null + socialGrade: string | null + historyGrade: string | null + mathGrade: string | null + scienceGrade: string | null + englishGrade: string | null + techAndHomeGrade: string | null + + gedKorean: number | null + gedSocial: number | null + gedMath: number | null + gedScience: number | null + gedEnglish: number | null + gedHistory: number | null +} + +interface IAttendanceInfo { + absence: number | null // 결석 + tardiness: number | null // 지각 + earlyLeave: number | null // 조퇴 + classExit: number | null // 결과 + volunteer: number | null // 봉사 +} + +interface IAwardAndCertificateInfo { + algorithmAward: boolean infoProcessingCert: boolean } diff --git a/apps/Admission-LTS/src/apis/pdfPreview/index.ts b/apps/Admission-LTS/src/apis/pdfPreview/index.ts index b9ce082..e930b9c 100644 --- a/apps/Admission-LTS/src/apis/pdfPreview/index.ts +++ b/apps/Admission-LTS/src/apis/pdfPreview/index.ts @@ -7,7 +7,7 @@ import { AxiosError } from "axios" export const usePdfPreviewPost = () => { return useMutation({ mutationFn: async(data : T) => { - const response = await AdmissionUserInstance.post('/api/v1/application/pdf/preview', data, { + const response = await AdmissionUserInstance.post('/pdf/preview', data, { responseType: 'blob' }); return response.data diff --git a/apps/Admission-LTS/src/apis/pdfPreview/types.ts b/apps/Admission-LTS/src/apis/pdfPreview/types.ts index ece4c86..e9ab592 100644 --- a/apps/Admission-LTS/src/apis/pdfPreview/types.ts +++ b/apps/Admission-LTS/src/apis/pdfPreview/types.ts @@ -1,69 +1,3 @@ -export interface IPdfPreviewRequest { - applicantName: string, //applicant-info, 지원자 성명 - applicantTel: string, //applicant-info, 지원자 연락처 - applicationType: string | null, //application-classification, 전형 선택 - educationalStatus: string | null, //application-classification, 졸업 구분 - birthDate: string, //applicant-info, 생년월일 - applicantGender: string | null, //applicant-info, 지원자 성별 - streetAddress: string, //guardian-info, 기본주소 - postalCode: string, //guardian-info, 우편번호 - detailAddress: string, //guardian-info, 상세주소 - isDaejeon: boolean, //application-classification, 지역 선택 - parentName: string, //guardian-info, 보호자 성명 - parentTel: string, //guardian-info, 보호자 연락처 - parentRelation: string, //guardian-info, 지원자와의 관계 - guardianGender: string | null, //guardian-info, 성별 - schoolCode: string | null, //middle-school-info, 학교 코드 - schoolName: string | null, //middle-school-info, 학교 이름 - studentId: number | null, //middle-school-info, 중학교 학번 - schoolPhone: string | null, //middle-school-info, 중학교 전화번호 - teacherName: string | null, //middle-school-info, 중학교 교사 성명 - nationalMeritChild: boolean, //applicant-info, 국가 유공자 체크 - specialAdmissionTarget: boolean, //applicant-info, 특례입학 대상 - graduationDate: string | null, //application-classification, 졸업 예정 연월 - studyPlan: string, //personal-statements, 학업계획서 - selfIntroduce: string, //personal-statements, 자기소개 - korean_3_1: number | null, - social_3_1: number | null, - history_3_1: number | null, - math_3_1: number | null, - science_3_1: number | null, - tech_3_1: number | null, - english_3_1: number | null, - korean_3_2: number | null, - social_3_2: number | null, - history_3_2: number | null, - math_3_2: number | null, - science_3_2: number | null, - tech_3_2: number | null, - english_3_2: number | null, - korean_2_2: number | null, - social_2_2: number | null, - history_2_2: number | null, - math_2_2: number | null, - science_2_2: number | null, - tech_2_2: number | null, - english_2_2: number | null, - korean_2_1: number | null, - social_2_1: number | null, - history_2_1: number | null, - math_2_1: number | null, - science_2_1: number | null, - tech_2_1: number | null, - english_2_1: number | null, - gedKorean: number | null, - gedSocial: number | null, - gedHistory: number | null, - gedMath: number | null, - gedScience: number | null, - gedTech: number | null, - gedEnglish: number | null, - absence: number | null, //결석 - tardiness: number | null, //지각 - earlyLeave: number | null, //조퇴 - classExit: number | null, //결과 - // unexcused: number | null, //미인정 - volunteer: number | null, //봉사 - algorithmAward: boolean, - infoProcessingCert: boolean -} +import { IAdmissionRequest } from "../admission/types" + +export type IPdfPreviewRequest = IAdmissionRequest diff --git a/apps/Admission-LTS/src/components/ApplicationNav.tsx b/apps/Admission-LTS/src/components/ApplicationNav.tsx index 828f000..469f4c4 100644 --- a/apps/Admission-LTS/src/components/ApplicationNav.tsx +++ b/apps/Admission-LTS/src/components/ApplicationNav.tsx @@ -1,11 +1,21 @@ import { colors, Flex, Text } from '@entry/design-token'; import styled from '@emotion/styled'; import { useLocation, useNavigate } from 'react-router-dom'; -import { useApplicationData, useCheckPageData, usePageData, PreviousButton, previousDataRef, performSave, hasChanged, serializeStateWithFiles } from '@entry/ui'; +import { + useApplicationData, + useCheckPageData, + usePageData, + PreviousButton, + previousDataRef, + performSave, + hasChanged, + serializeStateWithFiles, +} from '@entry/ui'; import { useEffect, useState, useRef } from 'react'; import { toast } from 'react-toastify'; import { useAdmissionSubmitPost } from '../apis'; import { convertGradeToScore } from '../hooks'; +import { getApplicationRemark } from '../utils/applicationRemark'; import { GlobalLoader } from './'; interface IApplicationNavType { @@ -13,7 +23,10 @@ interface IApplicationNavType { currentPage: number; setCurrentPage: (page: number) => void; graduationType?: string; - validateCurrentPage?: (page: number) => { canProceed: boolean; message?: string }; + validateCurrentPage?: (page: number) => { + canProceed: boolean; + message?: string; + }; // toast?: (message: string) => void; // 외부에서 toast 전달 } @@ -25,8 +38,8 @@ export const ApplicationNav = ({ setCurrentPage, graduationType, validateCurrentPage, - // toast = (msg: string) => window.alert(msg), -}: IApplicationNavType) => { +}: // toast = (msg: string) => window.alert(msg), +IApplicationNavType) => { const [datas] = usePageData('applicationClassification'); const [isSubmitBlocked, setIsSubmitBlocked] = useState(true); const [_, setHasUnsavedChanges] = useState(false); @@ -99,14 +112,20 @@ export const ApplicationNav = ({ const handleNextPage = async () => { if (!state) return toast.success('데이터를 불러오는 중입니다.'); - if (currentPage === 1 && (!datas.graduationType || !datas.graduationType.trim())) { + if ( + currentPage === 1 && + (!datas.graduationType || !datas.graduationType.trim()) + ) { return toast.error('졸업 구분은 필수값입니다.'); } // ✅ validation 먼저 체크 if (validateCurrentPage) { const validation = validateCurrentPage(currentPage); - if (!validation.canProceed) return toast.error(validation.message || '필수 항목을 모두 입력해주세요.'); + if (!validation.canProceed) + return toast.error( + validation.message || '필수 항목을 모두 입력해주세요.' + ); } await saveBeforeNavigation(); if (currentPage < totalPages) setCurrentPage(currentPage + 1); @@ -116,44 +135,73 @@ export const ApplicationNav = ({ if (targetPage === currentPage) return; if (!state) return toast.success('데이터를 불러오는 중입니다.'); - // ✅ validation 먼저 체크 if (validateCurrentPage) { const validation = validateCurrentPage(currentPage); - if (!validation.canProceed) return toast.error(validation.message || '필수 항목을 모두 입력해주세요.'); + if (!validation.canProceed) + return toast.error( + validation.message || '필수 항목을 모두 입력해주세요.' + ); } await saveBeforeNavigation(); setCurrentPage(targetPage); }; - const formatDate = (arr: (number|string)[], graduationType: string) => { + const formatDate = (arr: (number | string)[], graduationType: string) => { // 검정고시는 null 반환 - if (graduationType === "검정고시 (중학교 졸업 학력)") { - return null; + if (graduationType === '검정고시 (중학교 졸업 학력)') { + return 'XXXX'; } // 배열이 비어있거나 값이 없으면 오늘 날짜를 기본값으로 사용 const today = new Date(); - const [year = today.getFullYear(), month = today.getMonth() + 1, day = today.getDate()] = arr; + const [ + year = today.getFullYear(), + month = today.getMonth() + 1, + day = today.getDate(), + ] = arr; - const y = String(year).padStart(4, "0"); - const m = String(month).padStart(2, "0"); + const y = String(year).padStart(4, '0'); + const m = String(month).padStart(2, '0'); // 졸업 예정: 년-월-00, 졸업: 년-월-일 - if (graduationType === "졸업 예정") { + if (graduationType === '졸업 예정') { return `${y}-${m}-00`; } else { - const d = String(day).padStart(2, "0"); + const d = String(day).padStart(2, '0'); return `${y}-${m}-${d}`; } - } + }; + + const toGraduationDateDto = ( + arr: (number | string)[], + graduationType: string + ) => { + if (graduationType === '검정고시 (중학교 졸업 학력)') { + return '2026-01'; + } + + const today = new Date(); + const [year = today.getFullYear(), month = today.getMonth() + 1] = arr; + const yearValue = Number(year); + const monthValue = Number(month); + + if (!Number.isFinite(yearValue) || !Number.isFinite(monthValue)) + return null; + + const yyyy = String(yearValue).padStart(4, '0'); + const mm = String(Math.max(1, Math.min(12, monthValue))).padStart(2, '0'); + return `${yyyy}-${mm}`; + }; - const typeSelectionFormat = (type: string): "COMMON" | "MEISTER" | "SOCIAL" | null => { - const map: Record = { - "일반": "COMMON", - "마이스터 인재": "MEISTER", - "사회통합": "SOCIAL", + const typeSelectionFormat = ( + type: string + ): 'COMMON' | 'MEISTER' | 'SOCIAL' | null => { + const map: Record = { + 일반: 'COMMON', + '마이스터 인재': 'MEISTER', + 사회통합: 'SOCIAL', }; return map[type] ?? null; @@ -161,28 +209,31 @@ export const ApplicationNav = ({ const graduationTypeFormat = ( status: string - ): "PROSPECTIVE_GRADUATE" | "GRADUATE" | "QUALIFICATION_EXAM" | null => { - const map: Record = { - "졸업 예정": "PROSPECTIVE_GRADUATE", - "졸업": "GRADUATE", - "검정고시 (중학교 졸업 학력)": "QUALIFICATION_EXAM", + ): 'PROSPECTIVE_GRADUATE' | 'GRADUATE' | 'QUALIFICATION_EXAM' | null => { + const map: Record< + string, + 'PROSPECTIVE_GRADUATE' | 'GRADUATE' | 'QUALIFICATION_EXAM' + > = { + '졸업 예정': 'PROSPECTIVE_GRADUATE', + 졸업: 'GRADUATE', + '검정고시 (중학교 졸업 학력)': 'QUALIFICATION_EXAM', }; return map[status] ?? null; }; - const genderFormat = ( - status: string - ): "MALE" | "FEMALE" | null => { - const map: Record = { - "남성": "MALE", - "여성": "FEMALE", + const genderFormat = (status: string): 'MALE' | 'FEMALE' | null => { + const map: Record = { + 남성: 'MALE', + 여성: 'FEMALE', }; return map[status] ?? null; }; - const convertToNumber = (value: string | number | null | undefined): number | null => { + const convertToNumber = ( + value: string | number | null | undefined + ): number | null => { if (value === null || value === undefined || value === '') { return null; } @@ -190,237 +241,210 @@ export const ApplicationNav = ({ return isNaN(num) ? null : num; }; - - const submitApi = useAdmissionSubmitPost() + const isQualificationExam = + state?.applicationClassification.graduationType === '검정고시 (중학교 졸업 학력)' || + state?.applicationClassification.graduationType?.includes('검정고시'); + + // 성적 등급을 4글자 문자열로 변환 (2-1, 2-2, 3-1, 3-2 순서) + const buildGradeString = ( + subject: 'kor' | 'soc' | 'his' | 'math' | 'sci' | 'tech' | 'eng' + ): string | null => { + if (!state) return null; + + const graduationType = state.applicationClassification.graduationType; + + if (isQualificationExam) { + return 'XXXX'; + } + + const toGrade = (val: string | null | undefined): string => { + if (!val || val.trim() === '') return 'X'; + return val.toUpperCase(); + }; + + if (graduationType === '졸업') { + const g1 = toGrade(state.firstGraduate[subject]); + const g2 = toGrade(state.secondGraduate[subject]); + const g3 = toGrade(state.thirdGraduate[subject]); + const g4 = toGrade(state.fourthGraduate[subject]); + return `${g1}${g2}${g3}${g4}`; + } else if (graduationType === '졸업 예정') { + const g1 = toGrade(state.firstGraduateProspective[subject]); + const g2 = toGrade(state.secondGraduateProspective[subject]); + const g3 = toGrade(state.thirdGraduateProspective[subject]); + return `${g1}${g2}${g3}X`; + } + + return null; + }; + + const submitApi = useAdmissionSubmitPost(); const handleSubmit = async () => { if (!state) return; - setIsLoading(true) - submitApi.mutate({ - applicantName: state.applicantInfo.applicantName, - applicantTel: state.applicantInfo.applicantNumber, - applicationType: typeSelectionFormat(state.applicationClassification.typeSelection),//포맷 - educationalStatus: graduationTypeFormat(state.applicationClassification.graduationType),//포맷 - birthDate: formatDate(state.applicantInfo.dateOfBirth, "졸업"),//date 포맷 (배열 -> YYYY-MM-DD) - applicantGender: genderFormat(state.applicantInfo.gender), - streetAddress: state.guardianInfo.address, - postalCode: state.guardianInfo.postalCode, - detailAddress: state.guardianInfo.addressDetail, - isDaejeon: state.applicationClassification.regionSelection === "대전" ? true : false, - parentName: state.guardianInfo.guardianName, - parentTel: state.guardianInfo.guardianNumber, - parentRelation: state.guardianInfo.relationship[0], //배열이니까 0번째 값을 넣어야함 - guardianGender: genderFormat(state.guardianInfo.gender), - schoolCode: state.applicationClassification.graduationType === "검정고시 (중학교 졸업 학력)" ? null : state.middleSchoolInfo.schoolCode, - schoolName: state.applicationClassification.graduationType === "검정고시 (중학교 졸업 학력)" ? null : state.middleSchoolInfo.schoolName, - studentId: state.applicationClassification.graduationType === "검정고시 (중학교 졸업 학력)" ? null : state.middleSchoolInfo.studentId, - schoolPhone: state.applicationClassification.graduationType === "검정고시 (중학교 졸업 학력)" ? null : state.middleSchoolInfo.schoolPhone, - teacherName: state.applicationClassification.graduationType === "검정고시 (중학교 졸업 학력)" ? null : state.middleSchoolInfo.teacherName, - nationalMeritChild: state.applicantInfo.specialNotes === "국가 유공자" ? true : false, - specialAdmissionTarget: state.applicantInfo.specialNotes === "특례 입학 대상" ? true : false, - graduationDate: formatDate(state.applicationClassification.graduationDate, state.applicationClassification.graduationType),//날짜 포맷 (졸업구분에 따라 다르게) - studyPlan: state.personalStatements.studyPlan, - selfIntroduce: state.personalStatements.personalStmt, - - //성적 - korean_3_1: - state.applicationClassification.graduationType === "졸업 예정" - ? convertGradeToScore(state.firstGraduateProspective.kor) - : state.applicationClassification.graduationType === "졸업" - ? convertGradeToScore(state.secondGraduate.kor) - : null, - social_3_1: - state.applicationClassification.graduationType === "졸업 예정" - ? convertGradeToScore(state.firstGraduateProspective.soc) - : state.applicationClassification.graduationType === "졸업" - ? convertGradeToScore(state.secondGraduate.soc) - : null, - history_3_1: - state.applicationClassification.graduationType === "졸업 예정" - ? convertGradeToScore(state.firstGraduateProspective.his) - : state.applicationClassification.graduationType === "졸업" - ? convertGradeToScore(state.secondGraduate.his) - : null, - math_3_1: - state.applicationClassification.graduationType === "졸업 예정" - ? convertGradeToScore(state.firstGraduateProspective.math) - : state.applicationClassification.graduationType === "졸업" - ? convertGradeToScore(state.secondGraduate.math) - : null, - science_3_1: - state.applicationClassification.graduationType === "졸업 예정" - ? convertGradeToScore(state.firstGraduateProspective.sci) - : state.applicationClassification.graduationType === "졸업" - ? convertGradeToScore(state.secondGraduate.sci) - : null, - tech_3_1: - state.applicationClassification.graduationType === "졸업 예정" - ? convertGradeToScore(state.firstGraduateProspective.tech) - : state.applicationClassification.graduationType === "졸업" - ? convertGradeToScore(state.secondGraduate.tech) - : null, - english_3_1: - state.applicationClassification.graduationType === "졸업 예정" - ? convertGradeToScore(state.firstGraduateProspective.eng) - : state.applicationClassification.graduationType === "졸업" - ? convertGradeToScore(state.secondGraduate.eng) - : null, - korean_3_2: state.applicationClassification.graduationType === "졸업" ? convertGradeToScore(state.firstGraduate.kor) : null, - social_3_2: state.applicationClassification.graduationType === "졸업" ? convertGradeToScore(state.firstGraduate.soc) : null, - history_3_2: state.applicationClassification.graduationType === "졸업" ? convertGradeToScore(state.firstGraduate.his) : null, - math_3_2: state.applicationClassification.graduationType === "졸업" ? convertGradeToScore(state.firstGraduate.math) : null, - science_3_2: state.applicationClassification.graduationType === "졸업" ? convertGradeToScore(state.firstGraduate.sci) : null, - tech_3_2: state.applicationClassification.graduationType === "졸업" ? convertGradeToScore(state.firstGraduate.tech) : null, - english_3_2: state.applicationClassification.graduationType === "졸업" ? convertGradeToScore(state.firstGraduate.eng) : null, - korean_2_2: - state.applicationClassification.graduationType === "졸업 예정" - ? convertGradeToScore(state.secondGraduateProspective.kor) - : state.applicationClassification.graduationType === "졸업" - ? convertGradeToScore(state.thirdGraduate.kor) - : null, - social_2_2: - state.applicationClassification.graduationType === "졸업 예정" - ? convertGradeToScore(state.secondGraduateProspective.soc) - : state.applicationClassification.graduationType === "졸업" - ? convertGradeToScore(state.thirdGraduate.soc) - : null, - history_2_2: - state.applicationClassification.graduationType === "졸업 예정" - ? convertGradeToScore(state.secondGraduateProspective.his) - : state.applicationClassification.graduationType === "졸업" - ? convertGradeToScore(state.thirdGraduate.his) - : null, - math_2_2: - state.applicationClassification.graduationType === "졸업 예정" - ? convertGradeToScore(state.secondGraduateProspective.math) - : state.applicationClassification.graduationType === "졸업" - ? convertGradeToScore(state.thirdGraduate.math) - : null, - science_2_2: - state.applicationClassification.graduationType === "졸업 예정" - ? convertGradeToScore(state.secondGraduateProspective.sci) - : state.applicationClassification.graduationType === "졸업" - ? convertGradeToScore(state.thirdGraduate.sci) - : null, - tech_2_2: - state.applicationClassification.graduationType === "졸업 예정" - ? convertGradeToScore(state.secondGraduateProspective.tech) - : state.applicationClassification.graduationType === "졸업" - ? convertGradeToScore(state.thirdGraduate.tech) - : null, - english_2_2: - state.applicationClassification.graduationType === "졸업 예정" - ? convertGradeToScore(state.secondGraduateProspective.eng) - : state.applicationClassification.graduationType === "졸업" - ? convertGradeToScore(state.thirdGraduate.eng) - : null, - korean_2_1: - state.applicationClassification.graduationType === "졸업 예정" - ? convertGradeToScore(state.thirdGraduateProspective.kor) - : state.applicationClassification.graduationType === "졸업" - ? convertGradeToScore(state.fourthGraduate.kor) - : null, - social_2_1: - state.applicationClassification.graduationType === "졸업 예정" - ? convertGradeToScore(state.thirdGraduateProspective.soc) - : state.applicationClassification.graduationType === "졸업" - ? convertGradeToScore(state.fourthGraduate.soc) - : null, - history_2_1: - state.applicationClassification.graduationType === "졸업 예정" - ? convertGradeToScore(state.thirdGraduateProspective.his) - : state.applicationClassification.graduationType === "졸업" - ? convertGradeToScore(state.fourthGraduate.his) - : null, - math_2_1: - state.applicationClassification.graduationType === "졸업 예정" - ? convertGradeToScore(state.thirdGraduateProspective.math) - : state.applicationClassification.graduationType === "졸업" - ? convertGradeToScore(state.fourthGraduate.math) - : null, - science_2_1: - state.applicationClassification.graduationType === "졸업 예정" - ? convertGradeToScore(state.thirdGraduateProspective.sci) - : state.applicationClassification.graduationType === "졸업" - ? convertGradeToScore(state.fourthGraduate.sci) - : null, - tech_2_1: - state.applicationClassification.graduationType === "졸업 예정" - ? convertGradeToScore(state.thirdGraduateProspective.tech) - : state.applicationClassification.graduationType === "졸업" - ? convertGradeToScore(state.fourthGraduate.tech) - : null, - english_2_1: - state.applicationClassification.graduationType === "졸업 예정" - ? convertGradeToScore(state.thirdGraduateProspective.eng) - : state.applicationClassification.graduationType === "졸업" - ? convertGradeToScore(state.fourthGraduate.eng) - : null, - gedKorean: state.applicationClassification.graduationType === "검정고시 (중학교 졸업 학력)" ? convertToNumber(state.gedScore.kor) : null, - gedSocial: state.applicationClassification.graduationType === "검정고시 (중학교 졸업 학력)" ? convertToNumber(state.gedScore.soc) : null, - gedHistory: state.applicationClassification.graduationType === "검정고시 (중학교 졸업 학력)" ? convertToNumber(state.gedScore.his) : null, - gedMath: state.applicationClassification.graduationType === "검정고시 (중학교 졸업 학력)" ? convertToNumber(state.gedScore.math) : null, - gedScience: state.applicationClassification.graduationType === "검정고시 (중학교 졸업 학력)" ? convertToNumber(state.gedScore.sci) : null, - gedTech: state.applicationClassification.graduationType === "검정고시 (중학교 졸업 학력)" ? convertToNumber(state.gedScore.tech) : null, - gedEnglish: state.applicationClassification.graduationType === "검정고시 (중학교 졸업 학력)" ? convertToNumber(state.gedScore.eng) : null, - //출결 - absence: - state.applicationClassification.graduationType === "졸업 예정" - ? Number(state.activityGraduateProspective.absence) - : state.applicationClassification.graduationType === "졸업" - ? Number(state.activityGraduate.absence) - : null, - tardiness: - state.applicationClassification.graduationType === "졸업 예정" - ? Number(state.activityGraduateProspective.tardiness) - : state.applicationClassification.graduationType === "졸업" - ? Number(state.activityGraduate.tardiness) - : null, - earlyLeave: - state.applicationClassification.graduationType === "졸업 예정" - ? Number(state.activityGraduateProspective.earlyLeave) - : state.applicationClassification.graduationType === "졸업" - ? Number(state.activityGraduate.earlyLeave) - : null, - classExit: - state.applicationClassification.graduationType === "졸업 예정" - ? Number(state.activityGraduateProspective.classExit) - : state.applicationClassification.graduationType === "졸업" - ? Number(state.activityGraduate.classExit) - : null, - // unexcused: - // state.applicationClassification.graduationType === "졸업 예정" - // ? Number(state.activityGraduateProspective.unexcused) - // : state.applicationClassification.graduationType === "졸업" - // ? Number(state.activityGraduate.unexcused) - // : null, - volunteer: - state.applicationClassification.graduationType === "졸업 예정" - ? Number(state.activityGraduateProspective.volunteer) - : state.applicationClassification.graduationType === "졸업" - ? Number(state.activityGraduate.volunteer) - : null, - algorithmAward: - state.applicationClassification.graduationType === "졸업 예정" - ? state.activityGraduateProspective.dsmAlgorithm === "O" ? true : false - : state.applicationClassification.graduationType === "졸업" - ? state.activityGraduate.dsmAlgorithm === "O" ? true : false - : state.attendanceVolunteer.dsmAlgorithm === "O" ? true : false, - infoProcessingCert: - state.applicationClassification.graduationType === "졸업 예정" - ? state.activityGraduateProspective.certificate === "O" ? true : false - : state.applicationClassification.graduationType === "졸업" - ? state.activityGraduate.certificate === "O" ? true : false - : state.attendanceVolunteer.certificate === "O" ? true : false, - }, { - onSuccess: () => { - setIsLoading(false); - navigate('/submitted'); - window.indexedDB.deleteDatabase('ApplicationFormDB'); //db 초기화 + setIsLoading(true); + submitApi.mutate( + { + applicantInfo: { + applicantName: state.applicantInfo.applicantName, + applicantTel: state.applicantInfo.applicantNumber.replace(/-/g, ''), + birthDate: formatDate(state.applicantInfo.dateOfBirth, '졸업'), + applicantGender: genderFormat(state.applicantInfo.gender), + parentName: state.guardianInfo.guardianName, + parentTel: state.guardianInfo.guardianNumber.replace(/-/g, ''), + parentRelation: state.guardianInfo.relationship[0], + }, + addressInfo: { + isDaejeon: + state.applicationClassification.regionSelection === '대전' + ? true + : false, + streetAddress: state.guardianInfo.address, + detailAddress: state.guardianInfo.addressDetail, + postalCode: state.guardianInfo.postalCode, + }, + applicationInfo: { + applicationType: typeSelectionFormat( + state.applicationClassification.typeSelection + ), + educationalStatus: graduationTypeFormat( + state.applicationClassification.graduationType + ), + studentNumber: + state.applicationClassification.graduationType === + '검정고시 (중학교 졸업 학력)' + ? null + : state.middleSchoolInfo.studentId, + graduationDate: isQualificationExam + ? '2026-01' + : toGraduationDateDto( + state.applicationClassification.graduationDate, + state.applicationClassification.graduationType + ), + studyPlan: state.personalStatements.studyPlan, + selfIntroduce: state.personalStatements.personalStmt, + applicationRemark: getApplicationRemark( + state.applicantInfo.specialNotes + ), + }, + schoolInfo: { + schoolCode: + state.applicationClassification.graduationType === + '검정고시 (중학교 졸업 학력)' + ? null + : state.middleSchoolInfo.schoolCode, + schoolName: + state.applicationClassification.graduationType === + '검정고시 (중학교 졸업 학력)' + ? null + : state.middleSchoolInfo.schoolName, + schoolPhone: + state.applicationClassification.graduationType === + '검정고시 (중학교 졸업 학력)' + ? null + : state.middleSchoolInfo.schoolPhone, + teacherName: + state.applicationClassification.graduationType === + '검정고시 (중학교 졸업 학력)' + ? null + : state.middleSchoolInfo.teacherName, + }, + gradeInfo: { + koreanGrade: isQualificationExam ? 'XXXX' : buildGradeString('kor'), + socialGrade: isQualificationExam ? 'XXXX' : buildGradeString('soc'), + historyGrade: isQualificationExam ? 'XXXX' : buildGradeString('his'), + mathGrade: isQualificationExam ? 'XXXX' : buildGradeString('math'), + scienceGrade: isQualificationExam ? 'XXXX' : buildGradeString('sci'), + englishGrade: isQualificationExam ? 'XXXX' : buildGradeString('eng'), + techAndHomeGrade: isQualificationExam ? 'XXXX' : buildGradeString('tech'), + gedKorean: + state.applicationClassification.graduationType === + '검정고시 (중학교 졸업 학력)' + ? convertToNumber(state.gedScore.kor) + : 0, + gedSocial: + state.applicationClassification.graduationType === + '검정고시 (중학교 졸업 학력)' + ? convertToNumber(state.gedScore.soc) + : 0, + gedMath: + state.applicationClassification.graduationType === + '검정고시 (중학교 졸업 학력)' + ? convertToNumber(state.gedScore.math) + : 0, + gedScience: + state.applicationClassification.graduationType === + '검정고시 (중학교 졸업 학력)' + ? convertToNumber(state.gedScore.sci) + : 0, + gedEnglish: + state.applicationClassification.graduationType === + '검정고시 (중학교 졸업 학력)' + ? convertToNumber(state.gedScore.eng) + : 0, + gedHistory: + state.applicationClassification.graduationType === + '검정고시 (중학교 졸업 학력)' + ? convertToNumber(state.gedScore.his) + : 0, + }, + attendanceInfo: { + absence: + state.applicationClassification.graduationType === '졸업 예정' + ? Number(state.activityGraduateProspective.absence) + : state.applicationClassification.graduationType === '졸업' + ? Number(state.activityGraduate.absence) + : null, + tardiness: + state.applicationClassification.graduationType === '졸업 예정' + ? Number(state.activityGraduateProspective.tardiness) + : state.applicationClassification.graduationType === '졸업' + ? Number(state.activityGraduate.tardiness) + : null, + earlyLeave: + state.applicationClassification.graduationType === '졸업 예정' + ? Number(state.activityGraduateProspective.earlyLeave) + : state.applicationClassification.graduationType === '졸업' + ? Number(state.activityGraduate.earlyLeave) + : null, + classExit: + state.applicationClassification.graduationType === '졸업 예정' + ? Number(state.activityGraduateProspective.classExit) + : state.applicationClassification.graduationType === '졸업' + ? Number(state.activityGraduate.classExit) + : null, + volunteer: + state.applicationClassification.graduationType === '졸업 예정' + ? Number(state.activityGraduateProspective.volunteer) + : state.applicationClassification.graduationType === '졸업' + ? Number(state.activityGraduate.volunteer) + : null, + }, + awardAndCertificateInfo: { + algorithmAward: + state.applicationClassification.graduationType === '졸업 예정' + ? state.activityGraduateProspective.dsmAlgorithm === 'O' + : state.applicationClassification.graduationType === '졸업' + ? state.activityGraduate.dsmAlgorithm === 'O' + : state.attendanceVolunteer.dsmAlgorithm === 'O', + infoProcessingCert: + state.applicationClassification.graduationType === '졸업 예정' + ? state.activityGraduateProspective.certificate === 'O' + : state.applicationClassification.graduationType === '졸업' + ? state.activityGraduate.certificate === 'O' + : state.attendanceVolunteer.certificate === 'O', + }, }, - onError: () => { - // window.indexedDB.deleteDatabase('ApplicationFormDB'); //db 초기화 + { + onSuccess: () => { + setIsLoading(false); + navigate('/submitted'); + window.indexedDB.deleteDatabase('ApplicationFormDB'); //db 초기화 + }, + onError: () => { + // window.indexedDB.deleteDatabase('ApplicationFormDB'); //db 초기화 + }, } - }) + ); // try { // setIsLoading(true); // await new Promise(resolve => setTimeout(resolve, 4000)); //예시 api -> 연동 시 삭제 @@ -429,11 +453,21 @@ export const ApplicationNav = ({ // } }; - const isGraduationTypeSelected = Boolean(graduationType && graduationType.trim()); + const isGraduationTypeSelected = Boolean( + graduationType && graduationType.trim() + ); return ( <> - + 제출 + + 제출 + ) : ( 다음 ) @@ -467,7 +503,8 @@ export const ApplicationNav = ({ // 페이징 계산 function calculatePaginationInfo(currentPage: number, totalPages: number) { - const groupStart = Math.floor((currentPage - 1) / PAGES_PER_GROUP) * PAGES_PER_GROUP + 1; + const groupStart = + Math.floor((currentPage - 1) / PAGES_PER_GROUP) * PAGES_PER_GROUP + 1; const groupEnd = Math.min(groupStart + PAGES_PER_GROUP - 1, totalPages); return { groupStart, groupEnd }; } @@ -482,7 +519,13 @@ function renderPageIndicators( const pageCount = groupEnd - groupStart + 1; return Array.from({ length: pageCount }, (_, index) => { const pageNumber = groupStart + index; - return onPageClick(pageNumber)} />; + return ( + onPageClick(pageNumber)} + /> + ); }); } @@ -490,12 +533,14 @@ const PageIndicator = styled.nav<{ isActive: boolean }>` cursor: pointer; width: 54px; height: 4px; - background-color: ${({ isActive }) => (isActive ? colors.orange[800] : colors.gray[200])}; + background-color: ${({ isActive }) => + isActive ? colors.orange[800] : colors.gray[200]}; display: flex; align-items: center; justify-content: center; transition: background-color 0.2s ease-in-out; &:hover { - background-color: ${({ isActive }) => (isActive ? colors.orange[800] : colors.orange[400])}; + background-color: ${({ isActive }) => + isActive ? colors.orange[800] : colors.orange[400]}; } `; diff --git a/apps/Admission-LTS/src/pages/applicationCheck/ApplicationPreview.tsx b/apps/Admission-LTS/src/pages/applicationCheck/ApplicationPreview.tsx index cede6bc..001c5c0 100644 --- a/apps/Admission-LTS/src/pages/applicationCheck/ApplicationPreview.tsx +++ b/apps/Admission-LTS/src/pages/applicationCheck/ApplicationPreview.tsx @@ -5,21 +5,24 @@ import styled from '@emotion/styled'; import { usePdfPreviewPost } from '../../apis'; import { sendPdfPreviewSuccess, sendPdfPreviewFailed } from '../../apis/pdfLogging'; import { useApplicationData } from '@entry/ui'; -import { convertGradeToScore } from '../../hooks'; import { toast } from 'react-toastify'; import { Document, Page, pdfjs } from 'react-pdf'; -import workerUrl from 'pdfjs-dist/build/pdf.worker.min.js?url'; +import workerUrl from 'pdfjs-dist/build/pdf.worker.min.mjs?url'; +import { getApplicationRemark } from '../../utils/applicationRemark'; export const ApplicationPreview = () => { const [isLoading, setIsLoading] = useState(false); const [pdfUrl, setPdfUrl] = useState(null); const [numPages, setNumPages] = useState(null); const hasFetched = useRef(false); + const pdfPreviewApi = usePdfPreviewPost() + const { state } = useApplicationData(); + const sessionIdRef = useRef(crypto.randomUUID()); const formatDate = (arr: (number|string)[], graduationType: string) => { // 검정고시는 null 반환 if (graduationType === "검정고시 (중학교 졸업 학력)") { - return null; + return "XXXX"; } // 배열이 비어있거나 값이 없으면 오늘 날짜를 기본값으로 사용 @@ -71,9 +74,57 @@ export const ApplicationPreview = () => { return map[status] ?? null; }; - const pdfPreviewApi = usePdfPreviewPost() - const { saveToStorage, state } = useApplicationData(); - const sessionIdRef = useRef(crypto.randomUUID()); + const toGraduationDateDto = (arr: (number | string)[], graduationType: string) => { + if (graduationType === "검정고시 (중학교 졸업 학력)") { + return "2026-01"; + } + + const today = new Date(); + const [year = today.getFullYear(), month = today.getMonth() + 1] = arr; + const yearValue = Number(year); + const monthValue = Number(month); + + if (!Number.isFinite(yearValue) || !Number.isFinite(monthValue)) return null; + + const yyyy = String(yearValue).padStart(4, "0"); + const mm = String(Math.max(1, Math.min(12, monthValue))).padStart(2, "0"); + return `${yyyy}-${mm}`; + }; + + const isQualificationExam = + state.applicationClassification.graduationType === "검정고시 (중학교 졸업 학력)" || + state.applicationClassification.graduationType?.includes("검정고시"); + + // 성적 등급을 4글자 문자열로 변환 (2-1, 2-2, 3-1, 3-2 순서) + const buildGradeString = ( + subject: "kor" | "soc" | "his" | "math" | "sci" | "tech" | "eng" + ): string | null => { + const graduationType = state.applicationClassification.graduationType; + + if (isQualificationExam) { + return "XXXX"; + } + + const toGrade = (val: string | null | undefined): string => { + if (!val || val.trim() === "") return "X"; + return val.toUpperCase(); + }; + + if (graduationType === "졸업") { + const g1 = toGrade(state.firstGraduate[subject]); + const g2 = toGrade(state.secondGraduate[subject]); + const g3 = toGrade(state.thirdGraduate[subject]); + const g4 = toGrade(state.fourthGraduate[subject]); + return `${g1}${g2}${g3}${g4}`; + } else if (graduationType === "졸업 예정") { + const g1 = toGrade(state.firstGraduateProspective[subject]); + const g2 = toGrade(state.secondGraduateProspective[subject]); + const g3 = toGrade(state.thirdGraduateProspective[subject]); + return `${g1}${g2}${g3}X`; + } + + return null; + }; useEffect(() => { return () => { @@ -102,217 +153,118 @@ export const ApplicationPreview = () => { setIsLoading(true); const data = await pdfPreviewApi.mutateAsync({ - applicantName: state.applicantInfo.applicantName, - applicantTel: state.applicantInfo.applicantNumber, - applicationType: typeSelectionFormat(state.applicationClassification.typeSelection),//포맷 - educationalStatus: graduationTypeFormat(state.applicationClassification.graduationType),//포맷 - birthDate: formatDate(state.applicantInfo.dateOfBirth, "졸업"),//date 포맷 (배열 -> YYYY-MM-DD) - applicantGender: genderFormat(state.applicantInfo.gender), - streetAddress: state.guardianInfo.address, - postalCode: state.guardianInfo.postalCode, - detailAddress: state.guardianInfo.addressDetail, - isDaejeon: state.applicationClassification.regionSelection === "대전" ? true : false, - parentName: state.guardianInfo.guardianName, - parentTel: state.guardianInfo.guardianNumber, - parentRelation: state.guardianInfo.relationship[0], //배열이니까 0번째 값을 넣어야함 - guardianGender: genderFormat(state.guardianInfo.gender), - schoolCode: state.applicationClassification.graduationType === "검정고시 (중학교 졸업 학력)" ? null : state.middleSchoolInfo.schoolCode, - schoolName: state.applicationClassification.graduationType === "검정고시 (중학교 졸업 학력)" ? null : state.middleSchoolInfo.schoolName, - studentId: state.applicationClassification.graduationType === "검정고시 (중학교 졸업 학력)" ? null : state.middleSchoolInfo.studentId, - schoolPhone: state.applicationClassification.graduationType === "검정고시 (중학교 졸업 학력)" ? null : state.middleSchoolInfo.schoolPhone, - teacherName: state.applicationClassification.graduationType === "검정고시 (중학교 졸업 학력)" ? null : state.middleSchoolInfo.teacherName, - nationalMeritChild: state.applicantInfo.specialNotes === "국가 유공자" ? true : false, - specialAdmissionTarget: state.applicantInfo.specialNotes === "특례 입학 대상" ? true : false, - graduationDate: formatDate(state.applicationClassification.graduationDate, state.applicationClassification.graduationType),//날짜 포맷 (졸업구분에 따라 다르게) - studyPlan: state.personalStatements.studyPlan, - selfIntroduce: state.personalStatements.personalStmt, - - //성적 - korean_3_1: - state.applicationClassification.graduationType === "졸업 예정" - ? convertGradeToScore(state.firstGraduateProspective.kor) - : state.applicationClassification.graduationType === "졸업" - ? convertGradeToScore(state.secondGraduate.kor) - : null, - social_3_1: - state.applicationClassification.graduationType === "졸업 예정" - ? convertGradeToScore(state.firstGraduateProspective.soc) - : state.applicationClassification.graduationType === "졸업" - ? convertGradeToScore(state.secondGraduate.soc) - : null, - history_3_1: - state.applicationClassification.graduationType === "졸업 예정" - ? convertGradeToScore(state.firstGraduateProspective.his) - : state.applicationClassification.graduationType === "졸업" - ? convertGradeToScore(state.secondGraduate.his) - : null, - math_3_1: - state.applicationClassification.graduationType === "졸업 예정" - ? convertGradeToScore(state.firstGraduateProspective.math) - : state.applicationClassification.graduationType === "졸업" - ? convertGradeToScore(state.secondGraduate.math) - : null, - science_3_1: - state.applicationClassification.graduationType === "졸업 예정" - ? convertGradeToScore(state.firstGraduateProspective.sci) - : state.applicationClassification.graduationType === "졸업" - ? convertGradeToScore(state.secondGraduate.sci) - : null, - tech_3_1: - state.applicationClassification.graduationType === "졸업 예정" - ? convertGradeToScore(state.firstGraduateProspective.tech) - : state.applicationClassification.graduationType === "졸업" - ? convertGradeToScore(state.secondGraduate.tech) - : null, - english_3_1: - state.applicationClassification.graduationType === "졸업 예정" - ? convertGradeToScore(state.firstGraduateProspective.eng) - : state.applicationClassification.graduationType === "졸업" - ? convertGradeToScore(state.secondGraduate.eng) - : null, - korean_3_2: state.applicationClassification.graduationType === "졸업" ? convertGradeToScore(state.firstGraduate.kor) : null, - social_3_2: state.applicationClassification.graduationType === "졸업" ? convertGradeToScore(state.firstGraduate.soc) : null, - history_3_2: state.applicationClassification.graduationType === "졸업" ? convertGradeToScore(state.firstGraduate.his) : null, - math_3_2: state.applicationClassification.graduationType === "졸업" ? convertGradeToScore(state.firstGraduate.math) : null, - science_3_2: state.applicationClassification.graduationType === "졸업" ? convertGradeToScore(state.firstGraduate.sci) : null, - tech_3_2: state.applicationClassification.graduationType === "졸업" ? convertGradeToScore(state.firstGraduate.tech) : null, - english_3_2: state.applicationClassification.graduationType === "졸업" ? convertGradeToScore(state.firstGraduate.eng) : null, - korean_2_2: - state.applicationClassification.graduationType === "졸업 예정" - ? convertGradeToScore(state.secondGraduateProspective.kor) - : state.applicationClassification.graduationType === "졸업" - ? convertGradeToScore(state.thirdGraduate.kor) - : null, - social_2_2: - state.applicationClassification.graduationType === "졸업 예정" - ? convertGradeToScore(state.secondGraduateProspective.soc) - : state.applicationClassification.graduationType === "졸업" - ? convertGradeToScore(state.thirdGraduate.soc) - : null, - history_2_2: - state.applicationClassification.graduationType === "졸업 예정" - ? convertGradeToScore(state.secondGraduateProspective.his) - : state.applicationClassification.graduationType === "졸업" - ? convertGradeToScore(state.thirdGraduate.his) - : null, - math_2_2: - state.applicationClassification.graduationType === "졸업 예정" - ? convertGradeToScore(state.secondGraduateProspective.math) - : state.applicationClassification.graduationType === "졸업" - ? convertGradeToScore(state.thirdGraduate.math) - : null, - science_2_2: - state.applicationClassification.graduationType === "졸업 예정" - ? convertGradeToScore(state.secondGraduateProspective.sci) - : state.applicationClassification.graduationType === "졸업" - ? convertGradeToScore(state.thirdGraduate.sci) - : null, - tech_2_2: - state.applicationClassification.graduationType === "졸업 예정" - ? convertGradeToScore(state.secondGraduateProspective.tech) - : state.applicationClassification.graduationType === "졸업" - ? convertGradeToScore(state.thirdGraduate.tech) - : null, - english_2_2: - state.applicationClassification.graduationType === "졸업 예정" - ? convertGradeToScore(state.secondGraduateProspective.eng) - : state.applicationClassification.graduationType === "졸업" - ? convertGradeToScore(state.thirdGraduate.eng) - : null, - korean_2_1: - state.applicationClassification.graduationType === "졸업 예정" - ? convertGradeToScore(state.thirdGraduateProspective.kor) - : state.applicationClassification.graduationType === "졸업" - ? convertGradeToScore(state.fourthGraduate.kor) - : null, - social_2_1: - state.applicationClassification.graduationType === "졸업 예정" - ? convertGradeToScore(state.thirdGraduateProspective.soc) - : state.applicationClassification.graduationType === "졸업" - ? convertGradeToScore(state.fourthGraduate.soc) - : null, - history_2_1: - state.applicationClassification.graduationType === "졸업 예정" - ? convertGradeToScore(state.thirdGraduateProspective.his) - : state.applicationClassification.graduationType === "졸업" - ? convertGradeToScore(state.fourthGraduate.his) - : null, - math_2_1: - state.applicationClassification.graduationType === "졸업 예정" - ? convertGradeToScore(state.thirdGraduateProspective.math) - : state.applicationClassification.graduationType === "졸업" - ? convertGradeToScore(state.fourthGraduate.math) - : null, - science_2_1: - state.applicationClassification.graduationType === "졸업 예정" - ? convertGradeToScore(state.thirdGraduateProspective.sci) - : state.applicationClassification.graduationType === "졸업" - ? convertGradeToScore(state.fourthGraduate.sci) - : null, - tech_2_1: - state.applicationClassification.graduationType === "졸업 예정" - ? convertGradeToScore(state.thirdGraduateProspective.tech) - : state.applicationClassification.graduationType === "졸업" - ? convertGradeToScore(state.fourthGraduate.tech) - : null, - english_2_1: - state.applicationClassification.graduationType === "졸업 예정" - ? convertGradeToScore(state.thirdGraduateProspective.eng) - : state.applicationClassification.graduationType === "졸업" - ? convertGradeToScore(state.fourthGraduate.eng) - : null, - gedKorean: state.applicationClassification.graduationType === "검정고시 (중학교 졸업 학력)" ? convertToNumber(state.gedScore.kor) : null, - gedSocial: state.applicationClassification.graduationType === "검정고시 (중학교 졸업 학력)" ? convertToNumber(state.gedScore.soc) : null, - gedHistory: state.applicationClassification.graduationType === "검정고시 (중학교 졸업 학력)" ? convertToNumber(state.gedScore.his) : null, - gedMath: state.applicationClassification.graduationType === "검정고시 (중학교 졸업 학력)" ? convertToNumber(state.gedScore.math) : null, - gedScience: state.applicationClassification.graduationType === "검정고시 (중학교 졸업 학력)" ? convertToNumber(state.gedScore.sci) : null, - gedTech: state.applicationClassification.graduationType === "검정고시 (중학교 졸업 학력)" ? convertToNumber(state.gedScore.tech) : null, - gedEnglish: state.applicationClassification.graduationType === "검정고시 (중학교 졸업 학력)" ? convertToNumber(state.gedScore.eng) : null, - //출결 - absence: - state.applicationClassification.graduationType === "졸업 예정" - ? Number(state.activityGraduateProspective.absence) - : state.applicationClassification.graduationType === "졸업" - ? Number(state.activityGraduate.absence) - : null, - tardiness: - state.applicationClassification.graduationType === "졸업 예정" - ? Number(state.activityGraduateProspective.tardiness) - : state.applicationClassification.graduationType === "졸업" - ? Number(state.activityGraduate.tardiness) - : null, - earlyLeave: - state.applicationClassification.graduationType === "졸업 예정" - ? Number(state.activityGraduateProspective.earlyLeave) - : state.applicationClassification.graduationType === "졸업" - ? Number(state.activityGraduate.earlyLeave) - : null, - classExit: - state.applicationClassification.graduationType === "졸업 예정" - ? Number(state.activityGraduateProspective.classExit) - : state.applicationClassification.graduationType === "졸업" - ? Number(state.activityGraduate.classExit) - : null, - // unexcused: - // null, - volunteer: - state.applicationClassification.graduationType === "졸업 예정" - ? Number(state.activityGraduateProspective.volunteer) - : state.applicationClassification.graduationType === "졸업" - ? Number(state.activityGraduate.volunteer) - : null, - algorithmAward: - state.applicationClassification.graduationType === "졸업 예정" - ? state.activityGraduateProspective.dsmAlgorithm === "O" ? true : false - : state.applicationClassification.graduationType === "졸업" - ? state.activityGraduate.dsmAlgorithm === "O" ? true : false - : state.attendanceVolunteer.dsmAlgorithm === "O" ? true : false, - infoProcessingCert: - state.applicationClassification.graduationType === "졸업 예정" - ? state.activityGraduateProspective.certificate === "O" ? true : false - : state.applicationClassification.graduationType === "졸업" - ? state.activityGraduate.certificate === "O" ? true : false - : state.attendanceVolunteer.certificate === "O" ? true : false, + applicantInfo: { + applicantName: state.applicantInfo.applicantName, + applicantTel: state.applicantInfo.applicantNumber.replace(/-/g, ""), + birthDate: formatDate(state.applicantInfo.dateOfBirth, "졸업"), + applicantGender: genderFormat(state.applicantInfo.gender), + parentName: state.guardianInfo.guardianName, + parentTel: state.guardianInfo.guardianNumber.replace(/-/g, ""), + parentRelation: state.guardianInfo.relationship[0], + }, + addressInfo: { + isDaejeon: state.applicationClassification.regionSelection === "대전" ? true : false, + streetAddress: state.guardianInfo.address, + detailAddress: state.guardianInfo.addressDetail, + postalCode: state.guardianInfo.postalCode, + }, + applicationInfo: { + applicationType: typeSelectionFormat(state.applicationClassification.typeSelection), + educationalStatus: graduationTypeFormat(state.applicationClassification.graduationType), + studentNumber: state.applicationClassification.graduationType === "검정고시 (중학교 졸업 학력)" + ? null + : state.middleSchoolInfo.studentId, + graduationDate: isQualificationExam + ? "2026-01" + : toGraduationDateDto( + state.applicationClassification.graduationDate, + state.applicationClassification.graduationType + ), + studyPlan: state.personalStatements.studyPlan, + selfIntroduce: state.personalStatements.personalStmt, + applicationRemark: getApplicationRemark( + state.applicantInfo.specialNotes + ), + }, + schoolInfo: { + schoolCode: state.applicationClassification.graduationType === "검정고시 (중학교 졸업 학력)" ? null : state.middleSchoolInfo.schoolCode, + schoolName: state.applicationClassification.graduationType === "검정고시 (중학교 졸업 학력)" ? null : state.middleSchoolInfo.schoolName, + schoolPhone: state.applicationClassification.graduationType === "검정고시 (중학교 졸업 학력)" ? null : state.middleSchoolInfo.schoolPhone, + teacherName: state.applicationClassification.graduationType === "검정고시 (중학교 졸업 학력)" ? null : state.middleSchoolInfo.teacherName, + }, + gradeInfo: { + koreanGrade: isQualificationExam ? "XXXX" : buildGradeString("kor"), + socialGrade: isQualificationExam ? "XXXX" : buildGradeString("soc"), + historyGrade: isQualificationExam ? "XXXX" : buildGradeString("his"), + mathGrade: isQualificationExam ? "XXXX" : buildGradeString("math"), + scienceGrade: isQualificationExam ? "XXXX" : buildGradeString("sci"), + englishGrade: isQualificationExam ? "XXXX" : buildGradeString("eng"), + techAndHomeGrade: isQualificationExam ? "XXXX" : buildGradeString("tech"), + gedKorean: state.applicationClassification.graduationType === "검정고시 (중학교 졸업 학력)" + ? convertToNumber(state.gedScore.kor) + : 0, + gedSocial: state.applicationClassification.graduationType === "검정고시 (중학교 졸업 학력)" + ? convertToNumber(state.gedScore.soc) + : 0, + gedMath: state.applicationClassification.graduationType === "검정고시 (중학교 졸업 학력)" + ? convertToNumber(state.gedScore.math) + : 0, + gedScience: state.applicationClassification.graduationType === "검정고시 (중학교 졸업 학력)" + ? convertToNumber(state.gedScore.sci) + : 0, + gedEnglish: state.applicationClassification.graduationType === "검정고시 (중학교 졸업 학력)" + ? convertToNumber(state.gedScore.eng) + : 0, + gedHistory: state.applicationClassification.graduationType === "검정고시 (중학교 졸업 학력)" + ? convertToNumber(state.gedScore.his) + : 0, + }, + attendanceInfo: { + absence: + state.applicationClassification.graduationType === "졸업 예정" + ? Number(state.activityGraduateProspective.absence) + : state.applicationClassification.graduationType === "졸업" + ? Number(state.activityGraduate.absence) + : null, + tardiness: + state.applicationClassification.graduationType === "졸업 예정" + ? Number(state.activityGraduateProspective.tardiness) + : state.applicationClassification.graduationType === "졸업" + ? Number(state.activityGraduate.tardiness) + : null, + earlyLeave: + state.applicationClassification.graduationType === "졸업 예정" + ? Number(state.activityGraduateProspective.earlyLeave) + : state.applicationClassification.graduationType === "졸업" + ? Number(state.activityGraduate.earlyLeave) + : null, + classExit: + state.applicationClassification.graduationType === "졸업 예정" + ? Number(state.activityGraduateProspective.classExit) + : state.applicationClassification.graduationType === "졸업" + ? Number(state.activityGraduate.classExit) + : null, + volunteer: + state.applicationClassification.graduationType === "졸업 예정" + ? Number(state.activityGraduateProspective.volunteer) + : state.applicationClassification.graduationType === "졸업" + ? Number(state.activityGraduate.volunteer) + : null, + }, + awardAndCertificateInfo: { + algorithmAward: + state.applicationClassification.graduationType === "졸업 예정" + ? state.activityGraduateProspective.dsmAlgorithm === "O" + : state.applicationClassification.graduationType === "졸업" + ? state.activityGraduate.dsmAlgorithm === "O" + : state.attendanceVolunteer.dsmAlgorithm === "O", + infoProcessingCert: + state.applicationClassification.graduationType === "졸업 예정" + ? state.activityGraduateProspective.certificate === "O" + : state.applicationClassification.graduationType === "졸업" + ? state.activityGraduate.certificate === "O" + : state.attendanceVolunteer.certificate === "O", + }, }); const blob = new Blob([data], { type: 'application/pdf' }); @@ -362,7 +314,10 @@ export const ApplicationPreview = () => { file={pdfUrl} loading={PDF 로딩중...} error={PDF 로딩 실패} - onLoadError={() => toast.error('PDF 로딩 실패')} + onLoadError={(err) => { + console.error('PDF load error:', err); + toast.error('PDF 로딩 실패'); + }} onLoadSuccess={(info: { numPages: number }) => setNumPages(info.numPages)} > {Array.from(new Array(numPages || 0), (_el, index) => ( diff --git a/apps/Admission-LTS/src/utils/applicationRemark.ts b/apps/Admission-LTS/src/utils/applicationRemark.ts new file mode 100644 index 0000000..09a08b5 --- /dev/null +++ b/apps/Admission-LTS/src/utils/applicationRemark.ts @@ -0,0 +1,12 @@ +export type ApplicationRemark = + | 'PRIVILEGED_ADMISSION' + | 'NATIONAL_MERIT' + | 'NOTHING'; + +export const getApplicationRemark = ( + specialNotes?: string +): ApplicationRemark => { + if (specialNotes === '특례 입학 대상') return 'PRIVILEGED_ADMISSION'; + if (specialNotes === '국가 유공자') return 'NATIONAL_MERIT'; + return 'NOTHING'; +}; diff --git a/apps/entry-admin/src/apis/application/index.ts b/apps/entry-admin/src/apis/application/index.ts index 841a66f..b3cd1d3 100644 --- a/apps/entry-admin/src/apis/application/index.ts +++ b/apps/entry-admin/src/apis/application/index.ts @@ -17,7 +17,7 @@ export const useGetApplicationAllList = ( queryFn: async () => { const { data } = await AdmissionAdminInstance.get( - '/api/v1/applications', + '/admin/application/applicants', params ? { params } : {} ); return data; @@ -28,17 +28,17 @@ export const useGetApplicationAllList = ( }; // 상세 조회 -export const useGetApplicationDetail = (applicationId?: string) => { +export const useGetApplicationDetail = (receiptCode?: number) => { return useQuery({ - queryKey: ['applicationDetail', applicationId], + queryKey: ['applicationDetail', receiptCode], queryFn: async () => { const { data } = await AdmissionAdminInstance.get( - `/api/v1/applications/${applicationId}` + `/admin/application/${receiptCode}` ); - return data.data; + return data; }, - enabled: !!applicationId, // id 있을 때만 요청 + enabled: !!receiptCode, // receiptCode 있을 때만 요청 meta: { onError: () => { toast.error('원서 상세 조회 중 오류가 발생했습니다.'); @@ -50,7 +50,7 @@ export const useGetApplicationDetail = (applicationId?: string) => { // 수험번호 일괄 부여 export const usePostExamNumber = () => { return useMutation({ - mutationFn: () => AdmissionAdminInstance.post('/exam-code'), + mutationFn: () => AdmissionAdminInstance.patch('/admin/application/exam-code'), onSuccess: () => toast.success('수험번호가 일괄 부여되었습니다.'), onError: () => toast.error('수험번호 부여 중 오류가 발생했습니다.'), }); diff --git a/apps/entry-admin/src/apis/application/types.ts b/apps/entry-admin/src/apis/application/types.ts index ae001e0..c0e6ecc 100644 --- a/apps/entry-admin/src/apis/application/types.ts +++ b/apps/entry-admin/src/apis/application/types.ts @@ -9,81 +9,75 @@ export interface IApplicationAllListRequest { // 원서 전체 조회 export interface IApplicationAllListResponse { - success: boolean; - data: { - applications: IApplicationType[]; - total: number; - page: number; - size: number; - totalPages: number; - }; + applicants: IApplicationType[]; + total: number; + page: number; + size: number; + totalPages: number; } // 원서 전체 조회 Applicant export interface IApplicationType { - applicationId: string; receiptCode: number; applicantName: string; applicationType: string; educationalStatus: string; - status: string; - submittedAt: string; isDaejeon: boolean; isArrived: boolean; } // 원서 상세 조회 타입 export interface IApplicationDetailRequest { - applicationId: string; + receiptCode: number; } export interface IApplicationDetailResponse { - success: boolean; - data: { - applicationId: string; - userId: string; - receiptCode: number; - applicantName: string; - applicantTel: string; + commonInformation: { + name: string; parentName: string; parentTel: string; - birthDate: string; - applicationType: string; - educationalStatus: string; - status: string; - submittedAt: string; - reviewedAt: string; - createdAt: string; - updatedAt: string; + }; + moreInformation: { photoUrl: string; - studyPlan: string; - selfIntroduce: string; + birthDay: string; + applicationStatus: string; + educationalStatus: string; + applicationType: string; isDaejeon: boolean; - scores: { - totalScore: number; - subjectScore: number; - attendanceScore: number; - volunteerScore: number; - bonusScore: number; - }; - }; + } | null; + evaluation: { + totalScore: number; + totalGradeScore: number; + attendanceScore: number; + volunteerScore: number; + extraScore: number; + selfIntroduce?: string | null; + studyPlan?: string | null; + } | null; } // 상세 정보 export interface IApplicationDetail { - applicationId: string; - userId: string; - receiptCode: number; - applicantName: string; - applicantTel: string; - parentName: string; - parentTel: string; - birthDate: string; - applicationType: string; - educationalStatus: string; - status: string; - submittedAt: string; - reviewedAt: string; - createdAt: string; - updatedAt: string; + commonInformation: { + name: string; + parentName: string; + parentTel: string; + }; + moreInformation: { + photoUrl: string; + birthDay: string; + applicationStatus: string; + educationalStatus: string; + applicationType: string; + isDaejeon: boolean; + } | null; + evaluation: { + totalScore: number; + totalGradeScore: number; + attendanceScore: number; + volunteerScore: number; + extraScore: number; + selfIntroduce?: string | null; + studyPlan?: string | null; + } | null; } diff --git a/apps/entry-admin/src/apis/excel/index.ts b/apps/entry-admin/src/apis/excel/index.ts index c9d96a1..520cdd8 100644 --- a/apps/entry-admin/src/apis/excel/index.ts +++ b/apps/entry-admin/src/apis/excel/index.ts @@ -24,7 +24,7 @@ export const useDownloadCheckListExcel = () => { try { const response = await AdmissionAdminInstance.get( - '/api/v1/admin/excel/check-list', + '/admin/application/excel/applicants/check-list', { responseType: 'blob' } ); @@ -86,7 +86,7 @@ export const useDownloadApplicationInfoExcel = () => { try { const response = await AdmissionAdminInstance.get( - '/api/v1/admin/excel/application-info', + '/admin/application/excel/applicants', { responseType: 'blob' } ); @@ -151,7 +151,7 @@ export const useDownloadApplicantCodesExcel = () => { try { const response = await AdmissionAdminInstance.get( - '/api/v1/admin/excel/applicant-codes', + '/admin/application/excel/applicants/code', { responseType: 'blob' } ); @@ -217,7 +217,7 @@ export const useDownloadAdmissionTicketExcel = () => { try { const response = await AdmissionAdminInstance.get( - '/api/v1/admin/excel/admission-ticket', + '/admin/application/excel/admission-ticket', { responseType: 'blob' } ); diff --git a/apps/entry-admin/src/apis/statistics/index.ts b/apps/entry-admin/src/apis/statistics/index.ts index a1c5a52..57b9dcf 100644 --- a/apps/entry-admin/src/apis/statistics/index.ts +++ b/apps/entry-admin/src/apis/statistics/index.ts @@ -9,7 +9,7 @@ export const useGetRegionStatistics = () => { queryKey: ['statistics', 'region'], queryFn: async () => { const { data } = await AdmissionAdminInstance.get( - '/api/v1/admin/statistics/region' + '/admin/application/region-status' ); return data; }, @@ -21,7 +21,7 @@ export const useGetGenderStatistics = () => { queryKey: ['statistics', 'gender'], queryFn: async () => { const { data } = await AdmissionAdminInstance.get( - '/api/v1/admin/statistics/gender' + '/admin/application/gender-status' ); return data; }, @@ -33,7 +33,7 @@ export const useGetCompetitionRate = () => { queryKey: ['statistics', 'competition-rate'], queryFn: async () => { const { data } = await AdmissionAdminInstance.get( - '/api/v1/admin/statistics/competition-rate' + '/admin/application/statics/count' ); return data; }, diff --git a/apps/entry-admin/src/apis/statistics/types.ts b/apps/entry-admin/src/apis/statistics/types.ts index 0075149..ea8a5ba 100644 --- a/apps/entry-admin/src/apis/statistics/types.ts +++ b/apps/entry-admin/src/apis/statistics/types.ts @@ -1,50 +1,16 @@ -export interface IRegionStatistics { - region: string; +export interface IRegionStatisticsItem { regionName: string; count: number; - percentage: number; } -export interface IRegionStatisticsResponse { - success: boolean; - data: { - total: number; - byRegion: IRegionStatistics[]; - }; -} +export type IRegionStatisticsResponse = Record; -export interface ICompetitionRateByType { +export interface ICompetitionRateItem { applicationType: string; - applicants: number; - capacity: number; - rate: number; -} - -export interface ICompetitionRateTotal { - applicants: number; - capacity: number; - rate: number; -} - -export interface ICompetitionRateResponse { - success: boolean; - data: { - total: ICompetitionRateTotal; - byType: ICompetitionRateByType[]; - }; -} - -export interface IGenderStatisticsItem { - gender: string; - genderName: string; + isDaejeon: boolean; count: number; - percentage: number; } -export interface IGenderStatisticsResponse { - success: boolean; - data: { - total: number; - byGender: IGenderStatisticsItem[]; - }; -} \ No newline at end of file +export type ICompetitionRateResponse = ICompetitionRateItem[]; + +export type IGenderStatisticsResponse = Record; diff --git a/apps/entry-admin/src/components/Applicant.tsx b/apps/entry-admin/src/components/Applicant.tsx index 427fefe..14291f2 100644 --- a/apps/entry-admin/src/components/Applicant.tsx +++ b/apps/entry-admin/src/components/Applicant.tsx @@ -9,7 +9,6 @@ type IApplicationComponentType = IApplicationType & { }; export const Applicant = ({ - applicationId, receiptCode, applicantName, applicationType, @@ -41,7 +40,7 @@ export const Applicant = ({ ); return ( - + {receiptCode || '-'} {applicantName} diff --git a/apps/entry-admin/src/components/ApplicantDetailModal.tsx b/apps/entry-admin/src/components/ApplicantDetailModal.tsx index 6e8b690..6ed9e77 100644 --- a/apps/entry-admin/src/components/ApplicantDetailModal.tsx +++ b/apps/entry-admin/src/components/ApplicantDetailModal.tsx @@ -5,13 +5,13 @@ import { cancel } from '../assets'; import { useGetApplicationDetail } from '../apis'; interface IApplicantDetailModalType { - applicationId: string; + receiptCode: number; isOpen: boolean; onClose: () => void; } export const ApplicantDetailModal = ({ - applicationId, + receiptCode, isOpen, onClose, }: IApplicantDetailModalType) => { @@ -20,7 +20,7 @@ export const ApplicantDetailModal = ({ data: application, isLoading, isError, - } = useGetApplicationDetail(applicationId); + } = useGetApplicationDetail(receiptCode); useEffect(() => { if (isOpen) { @@ -57,7 +57,7 @@ export const ApplicantDetailModal = ({ RESULT_ANNOUNCED: '합격 여부 확인', }; - if (!isOpen || !applicationId) return null; + if (!isOpen || !receiptCode) return null; if (isLoading) return ( @@ -92,9 +92,9 @@ export const ApplicantDetailModal = ({ - {application?.photoUrl ? ( + {application?.moreInformation?.photoUrl ? ( 지원자 사진 @@ -106,32 +106,34 @@ export const ApplicantDetailModal = ({ 접수 번호 - {application?.receiptCode ?? '-'} + {receiptCode ?? '-'} 이름 - {application?.applicantName ?? '-'} + {application?.commonInformation.name ?? '-'} 생년월일 - {application?.birthDate ?? '-'} + {application?.moreInformation?.birthDay ?? '-'} 지역 - {application?.isDaejeon ? '대전' : '전국'} + + {application?.moreInformation?.isDaejeon ? '대전' : '전국'} + 전형 - {application?.applicationType === 'SOCIAL' + {application?.moreInformation?.applicationType === 'SOCIAL' ? '사회통합' - : application?.applicationType === 'MEISTER' + : application?.moreInformation?.applicationType === 'MEISTER' ? '마이스터전형' - : application?.applicationType === 'COMMON' + : application?.moreInformation?.applicationType === 'COMMON' ? '일반' : '-'} @@ -140,11 +142,11 @@ export const ApplicantDetailModal = ({ 학력 - {application?.educationalStatus === 'PROSPECTIVE_GRADUATE' + {application?.moreInformation?.educationalStatus === 'PROSPECTIVE_GRADUATE' ? '졸업 예정' - : application?.educationalStatus === 'GRADUATE' + : application?.moreInformation?.educationalStatus === 'GRADUATE' ? '졸업' - : application?.educationalStatus === 'QUALIFICATION_EXAM' + : application?.moreInformation?.educationalStatus === 'QUALIFICATION_EXAM' ? '검정고시' : '-'} @@ -153,12 +155,12 @@ export const ApplicantDetailModal = ({ 성적 - {application?.scores?.totalScore ?? 0}/ - {application?.applicationType === 'SOCIAL' + {application?.evaluation?.totalScore ?? 0}/ + {application?.moreInformation?.applicationType === 'SOCIAL' ? 110 - : application?.applicationType === 'MEISTER' + : application?.moreInformation?.applicationType === 'MEISTER' ? 110 - : application?.applicationType === 'COMMON' + : application?.moreInformation?.applicationType === 'COMMON' ? 170 : '-'} @@ -167,8 +169,9 @@ export const ApplicantDetailModal = ({ 상태 - {application?.status - ? statusMap[application.status] ?? application.status + {application?.moreInformation?.applicationStatus + ? statusMap[application.moreInformation.applicationStatus] ?? + application.moreInformation.applicationStatus : '-'} @@ -178,7 +181,7 @@ export const ApplicantDetailModal = ({ 자기소개서 - {formatTextWithLineBreaks(application?.selfIntroduce) ?? + {formatTextWithLineBreaks(application?.evaluation?.selfIntroduce ?? undefined) ?? '작성된 자기소개서가 없습니다.'} @@ -186,7 +189,7 @@ export const ApplicantDetailModal = ({ 학업 계획서 - {formatTextWithLineBreaks(application?.studyPlan) ?? + {formatTextWithLineBreaks(application?.evaluation?.studyPlan ?? undefined) ?? '작성된 학업 계획서가 없습니다.'} @@ -195,15 +198,15 @@ export const ApplicantDetailModal = ({ 점수 상세 - 과목 점수: {application?.scores?.subjectScore ?? 0} + 과목 점수: {application?.evaluation?.totalGradeScore ?? 0} - 출결 점수: {application?.scores?.attendanceScore ?? 0} + 출결 점수: {application?.evaluation?.attendanceScore ?? 0} - 봉사 점수: {application?.scores?.volunteerScore ?? 0} + 봉사 점수: {application?.evaluation?.volunteerScore ?? 0} - 가산점: {application?.scores?.bonusScore ?? 0} + 가산점: {application?.evaluation?.extraScore ?? 0} @@ -212,11 +215,11 @@ export const ApplicantDetailModal = ({ 부모님 성명 - {application?.parentName ?? '-'} + {application?.commonInformation.parentName ?? '-'} 부모님 연락처 - {application?.parentTel ?? '-'} + {application?.commonInformation.parentTel ?? '-'} diff --git a/apps/entry-admin/src/pages/ApplicantsList.tsx b/apps/entry-admin/src/pages/ApplicantsList.tsx index 996d8e3..1f1c1d4 100644 --- a/apps/entry-admin/src/pages/ApplicantsList.tsx +++ b/apps/entry-admin/src/pages/ApplicantsList.tsx @@ -98,6 +98,7 @@ export const ApplicantsList = () => { }; const handleApplicantClick = (applicant: IApplicationType) => { + if (!applicant.receiptCode) return; setSelectedApplicant(applicant); open(); }; @@ -127,8 +128,8 @@ export const ApplicantsList = () => { const { data, isLoading, refetch } = useGetApplicationAllList(filterParams); useEffect(() => { - if (data?.data.applications) { - setApplicantsList(data.data.applications); + if (data?.applicants) { + setApplicantsList(data.applicants); } }, [data]); @@ -201,7 +202,7 @@ export const ApplicantsList = () => { const totalPage = hasClientFilters ? Math.max(1, Math.ceil(filteredApplicants.length / 20)) - : (data?.data.totalPages ?? 1); + : (data?.totalPages ?? 1); // 클라이언트 필터가 있으면 페이지별로 데이터 자르기 const paginatedApplicants = useMemo(() => { @@ -328,14 +329,11 @@ export const ApplicantsList = () => { ) : ( paginatedApplicants.map((applicant) => ( handleApplicantClick(applicant)} @@ -344,9 +342,9 @@ export const ApplicantsList = () => { )} - {selectedApplicant && ( + {selectedApplicant?.receiptCode && ( diff --git a/apps/entry-admin/src/pages/StatisticsLandingPage.tsx b/apps/entry-admin/src/pages/StatisticsLandingPage.tsx index 139b664..19db0ee 100644 --- a/apps/entry-admin/src/pages/StatisticsLandingPage.tsx +++ b/apps/entry-admin/src/pages/StatisticsLandingPage.tsx @@ -43,10 +43,50 @@ const calculateDday = (dateString: string) => { // 성별 통계는 API와 연동한다 export const StatisticsLandingPage = () => { + const TOTAL_CAPACITY = 128; const { data: scheduleData, isLoading } = useGetAllSchedule(); const { data: regionData, isLoading: isRegionLoading } = useGetRegionStatistics(); const { data: competitionData, isLoading: isCompetitionLoading } = useGetCompetitionRate(); const { data: genderData, isLoading: isGenderLoading } = useGetGenderStatistics(); + const regionItems = React.useMemo(() => { + if (!regionData) return []; + return Object.entries(regionData).map(([regionName, count]) => ({ + regionName, + count, + })); + }, [regionData]); + + const genderItems = React.useMemo(() => { + if (!genderData) return []; + return Object.entries(genderData).map(([genderName, count]) => ({ + genderName, + count, + })); + }, [genderData]); + + const competitionSummary = React.useMemo(() => { + const byTypeMap = new Map(); + let totalApplicants = 0; + + if (!competitionData) { + return { totalApplicants: 0, byType: [] as { applicationType: string; applicants: number }[] }; + } + + competitionData.forEach((item) => { + totalApplicants += item.count; + byTypeMap.set( + item.applicationType, + (byTypeMap.get(item.applicationType) ?? 0) + item.count + ); + }); + + const byType = Array.from(byTypeMap.entries()).map(([applicationType, applicants]) => ({ + applicationType, + applicants, + })); + + return { totalApplicants, byType }; + }, [competitionData]); // 스케줄 데이터에서 날짜 찾기 const findDate = (type: string) => @@ -118,7 +158,7 @@ export const StatisticsLandingPage = () => { currentDeadlineDate = finalAnnouncement; currentDeadline = dday === null ? '--일' : dday > 0 ? `${dday}일` : dday === 0 ? '오늘' : '마감'; } else { - currentDeadline = '--일'; + currentDeadline = '0일'; } const displayDeadline = isLoading ? '' : currentDeadline; @@ -173,7 +213,7 @@ export const StatisticsLandingPage = () => { ) : ( - {competitionData?.data?.total?.applicants || 0}명 /{competitionData?.data?.total?.capacity || 0}명 + {competitionSummary.totalApplicants}명 /{TOTAL_CAPACITY}명 )} @@ -189,7 +229,9 @@ export const StatisticsLandingPage = () => { ) : ( - {competitionData?.data?.total?.rate?.toFixed(1) || 0} : 1 + {(TOTAL_CAPACITY > 0 + ? (competitionSummary.totalApplicants / TOTAL_CAPACITY).toFixed(1) + : '0.0')} : 1 )} @@ -240,7 +282,7 @@ export const StatisticsLandingPage = () => { ) : ( - competitionData?.data?.byType?.map((item, index) => { + competitionSummary.byType.map((item, index) => { const typeColors: { [key: string]: string } = { 'GENERAL': '#1DB954', 'COMMON': '#1DB954', // COMMON도 일반 전형 색상 사용 @@ -253,14 +295,17 @@ export const StatisticsLandingPage = () => { 'MEISTER': '마이스터 전형', 'SOCIAL': '사회 통합 전형', }; - const progressPercentage = item.capacity > 0 ? (item.applicants / item.capacity) * 100 : 0; - const percentage = item.capacity > 0 ? ((item.applicants / item.capacity) * 100).toFixed(2) : '0.00'; + const progressPercentage = + competitionSummary.totalApplicants > 0 + ? (item.applicants / competitionSummary.totalApplicants) * 100 + : 0; + const percentage = progressPercentage.toFixed(2); return ( {typeNames[item.applicationType] || item.applicationType} - {item.applicants}/{item.capacity} + {item.applicants}명 @@ -288,16 +333,15 @@ export const StatisticsLandingPage = () => { ) : ( - genderData?.data?.byGender?.slice(0, 2).map((item, index) => { - const rawPercentage = typeof item.percentage === 'number' ? item.percentage : 0; - // 백엔드가 0~1 또는 0~100 둘 다 반환할 수 있으므로 정규화 - const normalizedPercentage = rawPercentage <= 1 ? rawPercentage * 100 : rawPercentage; + genderItems.slice(0, 2).map((item, index) => { + const total = genderItems.reduce((sum, current) => sum + current.count, 0); + const normalizedPercentage = total > 0 ? (item.count / total) * 100 : 0; const displayPercentage = `${normalizedPercentage.toFixed(2)}%`; const color = index === 0 ? '#4F46E5' : '#EC4899'; return ( - - {item.genderName ?? item.gender} + + {item.genderName} {item.count}명 @@ -324,7 +368,7 @@ export const StatisticsLandingPage = () => { ))} ) : ( - regionData?.data?.byRegion?.map((item, index) => ( + regionItems.map((item, index) => ( {item.regionName} {item.count}명 @@ -353,7 +397,7 @@ export const StatisticsLandingPage = () => { ))} ) : ( - regionData?.data?.byRegion?.slice(0, 4).map((item, index) => ( + regionItems.slice(0, 4).map((item, index) => ( {item.regionName} {item.count}명 diff --git a/apps/entry-auth/src/apis/auth/adminAuth.ts b/apps/entry-auth/src/apis/auth/adminAuth.ts index d549e66..62f98d6 100644 --- a/apps/entry-auth/src/apis/auth/adminAuth.ts +++ b/apps/entry-auth/src/apis/auth/adminAuth.ts @@ -16,16 +16,13 @@ export const loginAdmin = async ( export const refreshAdminToken = async ( refreshToken: string ): Promise => { - const adminId = getAdminId(); - + const { data } = await AdmissionAdminInstance.put( '/admin/auth', {}, { headers: { 'X-Refresh-Token': refreshToken, - 'Request-User-Id': adminId, - 'Request-User-Role': 'ADMIN', }, } ); diff --git a/apps/entry-user/src/apis/application/application.ts b/apps/entry-user/src/apis/application/application.ts index d2daf0a..4bb3b7e 100644 --- a/apps/entry-user/src/apis/application/application.ts +++ b/apps/entry-user/src/apis/application/application.ts @@ -6,7 +6,7 @@ import { DeleteApplicationResponse, IApplicationStatusResponse } from './types'; * GET /api/v1/application/pdf/final */ export const getFinalApplicationPdf = async (): Promise => { - const { data } = await AdmissionUserInstance.get('/api/v1/application/pdf/final', { + const { data } = await AdmissionUserInstance.get('/pdf/final', { responseType: 'blob', }); return data; @@ -14,11 +14,11 @@ export const getFinalApplicationPdf = async (): Promise => { /** * 원서 접수 취소 - * DELETE /api/v1/applications + * DELETE /application */ export const deleteApplication = async (): Promise => { const { data } = await AdmissionUserInstance.delete( - '/api/v1/applications' + '/application' ); return data; }; diff --git a/apps/entry-user/src/apis/calculator/calculator.ts b/apps/entry-user/src/apis/calculator/calculator.ts index a4afda0..33a5dcc 100644 --- a/apps/entry-user/src/apis/calculator/calculator.ts +++ b/apps/entry-user/src/apis/calculator/calculator.ts @@ -4,6 +4,6 @@ import { CalculatorScoreRequest, CalculatorScoreResponse } from './types'; export const calculateScore = async ( data: CalculatorScoreRequest ): Promise => { - const res = await AdmissionPublicInstance.post('/api/v1/public/calculator/score', data); + const res = await AdmissionPublicInstance.post('/calculator', data); return res.data; }; diff --git a/apps/entry-user/src/apis/calculator/types.ts b/apps/entry-user/src/apis/calculator/types.ts index 76743cd..bb5531b 100644 --- a/apps/entry-user/src/apis/calculator/types.ts +++ b/apps/entry-user/src/apis/calculator/types.ts @@ -1,21 +1,38 @@ export interface CalculatorScoreRequest { - admissionType: string; - scores: { - [key: string]: string; + applicationType: string; + educationalStatus: string; + gradeInfo: { + koreanGrade: string; + socialGrade: string; + historyGrade: string; + mathGrade: string; + scienceGrade: string; + englishGrade: string; + techAndHomeGrade: string; + gedKorean: number; + gedSocial: number; + gedMath: number; + gedScience: number; + gedEnglish: number; + gedHistory: number; }; - bonus: { - dsmAlgorithm?: boolean; - infoProcessing?: boolean; + attendanceInfo: { + absence: number; + tardiness: number; + earlyLeave: number; + classExit: number; + volunteer: number; + }; + awardAndCertificateInfo: { + algorithmAward: boolean; + infoProcessingCert: boolean; }; } export interface CalculatorScoreResponse { - success: boolean; - data: { - subjectScore: number; - attendanceScore: number; - volunteerScore: number; - bonusScore: number; - totalScore: number; - }; + totalGradeScore: number; + attendanceScore: number; + extraScore: number; + volunteerScore: number; + totalScore: number; } diff --git a/apps/entry-user/src/components/ScoreResultModal.tsx b/apps/entry-user/src/components/ScoreResultModal.tsx index 2bdfeae..bd20b08 100644 --- a/apps/entry-user/src/components/ScoreResultModal.tsx +++ b/apps/entry-user/src/components/ScoreResultModal.tsx @@ -61,17 +61,17 @@ export const ScoreResultModal = ({ const newResults: ScoreResult[] = [ { name: ADMISSION_TYPE_LABEL.COMMON, - score: commonResponse.data.totalScore.toFixed(3), + score: commonResponse.totalScore.toFixed(3), total: maxScore.COMMON.toString(), }, { name: ADMISSION_TYPE_LABEL.SOCIAL, - score: socialResponse.data.totalScore.toFixed(3), + score: socialResponse.totalScore.toFixed(3), total: maxScore.SOCIAL.toString(), }, { name: ADMISSION_TYPE_LABEL.MEISTER, - score: meisterResponse.data.totalScore.toFixed(3), + score: meisterResponse.totalScore.toFixed(3), total: maxScore.MEISTER.toString(), }, ]; diff --git a/apps/entry-user/src/pages/MyPage.tsx b/apps/entry-user/src/pages/MyPage.tsx index 63816e6..e199b5d 100644 --- a/apps/entry-user/src/pages/MyPage.tsx +++ b/apps/entry-user/src/pages/MyPage.tsx @@ -217,6 +217,7 @@ export const MyPage = () => { // 1차 발표 기간이 아닌 경우 if ( scheduleData?.currentStatus !== 'FIRST_ANNOUNCEMENT' && + scheduleData?.currentStatus !== 'BEFORE_INTERVIEW' && scheduleData?.currentStatus !== 'INTERVIEW' ) { toast.error('1차 합격자 발표 기간이 아닙니다.'); diff --git a/apps/entry-user/src/pages/calculate/GraduatedCalculationPage.tsx b/apps/entry-user/src/pages/calculate/GraduatedCalculationPage.tsx index f54e2d9..eb48f8a 100644 --- a/apps/entry-user/src/pages/calculate/GraduatedCalculationPage.tsx +++ b/apps/entry-user/src/pages/calculate/GraduatedCalculationPage.tsx @@ -27,7 +27,7 @@ export const GraduatedCalculationPage = () => { { name: string; type: AdmissionType; - data: CalculatorScoreResponse['data']; + data: CalculatorScoreResponse; }[] >([]); const [isLoading, setIsLoading] = useState(false); @@ -66,17 +66,17 @@ export const GraduatedCalculationPage = () => { { name: ADMISSION_TYPE_LABEL.COMMON, type: 'COMMON', - data: commonResponse.data, + data: commonResponse, }, { name: ADMISSION_TYPE_LABEL.SOCIAL, type: 'SOCIAL', - data: socialResponse.data, + data: socialResponse, }, { name: ADMISSION_TYPE_LABEL.MEISTER, type: 'MEISTER', - data: meisterResponse.data, + data: meisterResponse, }, ]); setShowResultModal(true); diff --git a/apps/entry-user/src/pages/calculate/PrimaryCalculationPage.tsx b/apps/entry-user/src/pages/calculate/PrimaryCalculationPage.tsx index 9a8d2a4..0754a7b 100644 --- a/apps/entry-user/src/pages/calculate/PrimaryCalculationPage.tsx +++ b/apps/entry-user/src/pages/calculate/PrimaryCalculationPage.tsx @@ -26,7 +26,7 @@ export const PrimaryCalculationPage = () => { { name: string; type: AdmissionType; - data: CalculatorScoreResponse['data']; + data: CalculatorScoreResponse; }[] >([]); const [isLoading, setIsLoading] = useState(false); @@ -65,17 +65,17 @@ export const PrimaryCalculationPage = () => { { name: ADMISSION_TYPE_LABEL.COMMON, type: 'COMMON', - data: commonResponse.data, + data: commonResponse, }, { name: ADMISSION_TYPE_LABEL.SOCIAL, type: 'SOCIAL', - data: socialResponse.data, + data: socialResponse, }, { name: ADMISSION_TYPE_LABEL.MEISTER, type: 'MEISTER', - data: meisterResponse.data, + data: meisterResponse, }, ]); setShowResultModal(true); diff --git a/apps/entry-user/src/pages/calculate/QECalculationPage.tsx b/apps/entry-user/src/pages/calculate/QECalculationPage.tsx index af5ea8d..6d1f666 100644 --- a/apps/entry-user/src/pages/calculate/QECalculationPage.tsx +++ b/apps/entry-user/src/pages/calculate/QECalculationPage.tsx @@ -26,7 +26,7 @@ export const QECalculationPage = () => { { name: string; type: AdmissionType; - data: CalculatorScoreResponse['data']; + data: CalculatorScoreResponse; }[] >([]); const [isLoading, setIsLoading] = useState(false); @@ -98,17 +98,17 @@ export const QECalculationPage = () => { { name: ADMISSION_TYPE_LABEL.COMMON, type: 'COMMON', - data: commonResponse.data, + data: commonResponse, }, { name: ADMISSION_TYPE_LABEL.SOCIAL, type: 'SOCIAL', - data: socialResponse.data, + data: socialResponse, }, { name: ADMISSION_TYPE_LABEL.MEISTER, type: 'MEISTER', - data: meisterResponse.data, + data: meisterResponse, }, ]); setShowResultModal(true); diff --git a/apps/entry-user/src/utils/apiDataTransformer.ts b/apps/entry-user/src/utils/apiDataTransformer.ts index cf996a4..2b45ca7 100644 --- a/apps/entry-user/src/utils/apiDataTransformer.ts +++ b/apps/entry-user/src/utils/apiDataTransformer.ts @@ -47,19 +47,14 @@ interface CalculationState { qeActivity: IActivityType; } -const gradeToNumber: { [key: string]: number } = { - 'A': 5, - 'B': 4, - 'C': 3, - 'D': 2, - 'E': 1, - '✕': 0 +const normalizeGradeChar = (grade: string | null | undefined): string => { + if (!grade) return 'X'; + if (grade === '✕') return 'X'; + return grade.toUpperCase(); }; -const convertGradeToNumber = (grade: string | null): number | undefined => { - if (!grade) return undefined; - return gradeToNumber[grade]; -}; +const buildGradeString = (grades: Array) => + grades.map(normalizeGradeChar).join(''); // Preserve 0 as a valid value; return undefined only when not a number const safeParseInt = (value: string | null | undefined): number | undefined => { @@ -98,20 +93,32 @@ export const transformCalculationDataToAPI = ( return { applicationType, educationalStatus, - scores: { - // 검정고시는 검정고시 점수만 보냄 (출석 및 봉사 제외) - qualificationKorean: safeParseFloat(state.qeScore.korean), - qualificationSocial: safeParseFloat(state.qeScore.social), - qualificationHistory: safeParseFloat(state.qeScore.history), - qualificationMath: safeParseFloat(state.qeScore.math), - qualificationScience: safeParseFloat(state.qeScore.science), - qualificationEnglish: safeParseFloat(state.qeScore.english), - qualificationTech: safeParseFloat(state.qeScore.technology), + gradeInfo: { + koreanGrade: 'XXXX', + socialGrade: 'XXXX', + historyGrade: 'XXXX', + mathGrade: 'XXXX', + scienceGrade: 'XXXX', + englishGrade: 'XXXX', + techAndHomeGrade: 'XXXX', + gedKorean: safeParseFloat(state.qeScore.korean) ?? 0, + gedSocial: safeParseFloat(state.qeScore.social) ?? 0, + gedMath: safeParseFloat(state.qeScore.math) ?? 0, + gedScience: safeParseFloat(state.qeScore.science) ?? 0, + gedEnglish: safeParseFloat(state.qeScore.english) ?? 0, + gedHistory: safeParseFloat(state.qeScore.history) ?? 0, + }, + attendanceInfo: { + absence: safeParseInt(activity.absences) ?? 0, + tardiness: safeParseInt(activity.lateArrivals) ?? 0, + earlyLeave: safeParseInt(activity.earlyLeaves) ?? 0, + classExit: safeParseInt(activity.resultMissing) ?? 0, + volunteer: safeParseInt(activity.volunteerHours) ?? 0, + }, + awardAndCertificateInfo: { + algorithmAward: activity.dsmAlgorithm === 'O', + infoProcessingCert: activity.infoProcessing === 'O', }, - bonus: { - dsmAlgorithm: activity.dsmAlgorithm === 'O', - infoProcessing: activity.infoProcessing === 'O', - } }; } @@ -123,40 +130,67 @@ export const transformCalculationDataToAPI = ( return { applicationType, educationalStatus, - scores: { - // 3학년 1학기 (primaryThird) - korean_3_1: convertGradeToNumber(state.primaryThird.kor), - social_3_1: convertGradeToNumber(state.primaryThird.soc), - history_3_1: convertGradeToNumber(state.primaryThird.his), - math_3_1: convertGradeToNumber(state.primaryThird.math), - science_3_1: convertGradeToNumber(state.primaryThird.sci), - tech_3_1: convertGradeToNumber(state.primaryThird.tech), - english_3_1: convertGradeToNumber(state.primaryThird.eng), - // 직전 학기 (primarySecond) - korean_2_2: convertGradeToNumber(state.primarySecond.kor), - social_2_2: convertGradeToNumber(state.primarySecond.soc), - history_2_2: convertGradeToNumber(state.primarySecond.his), - math_2_2: convertGradeToNumber(state.primarySecond.math), - science_2_2: convertGradeToNumber(state.primarySecond.sci), - tech_2_2: convertGradeToNumber(state.primarySecond.tech), - english_2_2: convertGradeToNumber(state.primarySecond.eng), - // 직직전 학기 (primaryFirst) - korean_2_1: convertGradeToNumber(state.primaryFirst.kor), - social_2_1: convertGradeToNumber(state.primaryFirst.soc), - history_2_1: convertGradeToNumber(state.primaryFirst.his), - math_2_1: convertGradeToNumber(state.primaryFirst.math), - science_2_1: convertGradeToNumber(state.primaryFirst.sci), - tech_2_1: convertGradeToNumber(state.primaryFirst.tech), - english_2_1: convertGradeToNumber(state.primaryFirst.eng), - // 출석 및 봉사 (0도 전송되도록 안전 파싱) - absence: safeParseInt(activity.absences), - tardiness: safeParseInt(activity.lateArrivals), - earlyLeave: safeParseInt(activity.earlyLeaves), - classExit: safeParseInt(activity.resultMissing), - volunteer: safeParseInt(activity.volunteerHours), + gradeInfo: { + koreanGrade: buildGradeString([ + 'X', + state.primaryThird.kor, + state.primarySecond.kor, + state.primaryFirst.kor, + ]), + socialGrade: buildGradeString([ + 'X', + state.primaryThird.soc, + state.primarySecond.soc, + state.primaryFirst.soc, + ]), + historyGrade: buildGradeString([ + 'X', + state.primaryThird.his, + state.primarySecond.his, + state.primaryFirst.his, + ]), + mathGrade: buildGradeString([ + 'X', + state.primaryThird.math, + state.primarySecond.math, + state.primaryFirst.math, + ]), + scienceGrade: buildGradeString([ + 'X', + state.primaryThird.sci, + state.primarySecond.sci, + state.primaryFirst.sci, + ]), + englishGrade: buildGradeString([ + 'X', + state.primaryThird.eng, + state.primarySecond.eng, + state.primaryFirst.eng, + ]), + techAndHomeGrade: buildGradeString([ + 'X', + state.primaryThird.tech, + state.primarySecond.tech, + state.primaryFirst.tech, + ]), + gedKorean: 0, + gedSocial: 0, + gedMath: 0, + gedScience: 0, + gedEnglish: 0, + gedHistory: 0, + }, + attendanceInfo: { + absence: safeParseInt(activity.absences) ?? 0, + tardiness: safeParseInt(activity.lateArrivals) ?? 0, + earlyLeave: safeParseInt(activity.earlyLeaves) ?? 0, + classExit: safeParseInt(activity.resultMissing) ?? 0, + volunteer: safeParseInt(activity.volunteerHours) ?? 0, + }, + awardAndCertificateInfo: { algorithmAward: activity.dsmAlgorithm === 'O', infoProcessingCert: activity.infoProcessing === 'O', - } + }, }; } @@ -167,47 +201,66 @@ export const transformCalculationDataToAPI = ( return { applicationType, educationalStatus, - scores: { - // 3학년 2학기 - korean_3_2: convertGradeToNumber(state.graduatedThird2.kor), - social_3_2: convertGradeToNumber(state.graduatedThird2.soc), - history_3_2: convertGradeToNumber(state.graduatedThird2.his), - math_3_2: convertGradeToNumber(state.graduatedThird2.math), - science_3_2: convertGradeToNumber(state.graduatedThird2.sci), - tech_3_2: convertGradeToNumber(state.graduatedThird2.tech), - english_3_2: convertGradeToNumber(state.graduatedThird2.eng), - // 3학년 1학기 - korean_3_1: convertGradeToNumber(state.graduatedThird1.kor), - social_3_1: convertGradeToNumber(state.graduatedThird1.soc), - history_3_1: convertGradeToNumber(state.graduatedThird1.his), - math_3_1: convertGradeToNumber(state.graduatedThird1.math), - science_3_1: convertGradeToNumber(state.graduatedThird1.sci), - tech_3_1: convertGradeToNumber(state.graduatedThird1.tech), - english_3_1: convertGradeToNumber(state.graduatedThird1.eng), - // 2학년 2학기 - korean_2_2: convertGradeToNumber(state.graduatedSecond2.kor), - social_2_2: convertGradeToNumber(state.graduatedSecond2.soc), - history_2_2: convertGradeToNumber(state.graduatedSecond2.his), - math_2_2: convertGradeToNumber(state.graduatedSecond2.math), - science_2_2: convertGradeToNumber(state.graduatedSecond2.sci), - tech_2_2: convertGradeToNumber(state.graduatedSecond2.tech), - english_2_2: convertGradeToNumber(state.graduatedSecond2.eng), - // 2학년 1학기 - korean_2_1: convertGradeToNumber(state.graduatedSecond1.kor), - social_2_1: convertGradeToNumber(state.graduatedSecond1.soc), - history_2_1: convertGradeToNumber(state.graduatedSecond1.his), - math_2_1: convertGradeToNumber(state.graduatedSecond1.math), - science_2_1: convertGradeToNumber(state.graduatedSecond1.sci), - tech_2_1: convertGradeToNumber(state.graduatedSecond1.tech), - english_2_1: convertGradeToNumber(state.graduatedSecond1.eng), - // 출석 및 봉사 (0도 전송되도록 안전 파싱) - absence: safeParseInt(activity.absences), - tardiness: safeParseInt(activity.lateArrivals), - earlyLeave: safeParseInt(activity.earlyLeaves), - classExit: safeParseInt(activity.resultMissing), - volunteer: safeParseInt(activity.volunteerHours), + gradeInfo: { + koreanGrade: buildGradeString([ + state.graduatedThird2.kor, + state.graduatedThird1.kor, + state.graduatedSecond2.kor, + state.graduatedSecond1.kor, + ]), + socialGrade: buildGradeString([ + state.graduatedThird2.soc, + state.graduatedThird1.soc, + state.graduatedSecond2.soc, + state.graduatedSecond1.soc, + ]), + historyGrade: buildGradeString([ + state.graduatedThird2.his, + state.graduatedThird1.his, + state.graduatedSecond2.his, + state.graduatedSecond1.his, + ]), + mathGrade: buildGradeString([ + state.graduatedThird2.math, + state.graduatedThird1.math, + state.graduatedSecond2.math, + state.graduatedSecond1.math, + ]), + scienceGrade: buildGradeString([ + state.graduatedThird2.sci, + state.graduatedThird1.sci, + state.graduatedSecond2.sci, + state.graduatedSecond1.sci, + ]), + englishGrade: buildGradeString([ + state.graduatedThird2.eng, + state.graduatedThird1.eng, + state.graduatedSecond2.eng, + state.graduatedSecond1.eng, + ]), + techAndHomeGrade: buildGradeString([ + state.graduatedThird2.tech, + state.graduatedThird1.tech, + state.graduatedSecond2.tech, + state.graduatedSecond1.tech, + ]), + gedKorean: 0, + gedSocial: 0, + gedMath: 0, + gedScience: 0, + gedEnglish: 0, + gedHistory: 0, + }, + attendanceInfo: { + absence: safeParseInt(activity.absences) ?? 0, + tardiness: safeParseInt(activity.lateArrivals) ?? 0, + earlyLeave: safeParseInt(activity.earlyLeaves) ?? 0, + classExit: safeParseInt(activity.resultMissing) ?? 0, + volunteer: safeParseInt(activity.volunteerHours) ?? 0, + }, + awardAndCertificateInfo: { algorithmAward: activity.dsmAlgorithm === 'O', infoProcessingCert: activity.infoProcessing === 'O', - } + }, }; }; diff --git a/libs/ui/src/contexts/ApplicationDataContext.tsx b/libs/ui/src/contexts/ApplicationDataContext.tsx index bcb1f32..2f9b677 100644 --- a/libs/ui/src/contexts/ApplicationDataContext.tsx +++ b/libs/ui/src/contexts/ApplicationDataContext.tsx @@ -49,7 +49,6 @@ interface IGedScoreType { soc: number | null; his: number | null; sci: number | null; - tech: number | null; math: number | null; eng: number | null; } @@ -148,7 +147,6 @@ const initialState: ApplicationState = { soc: null, his: null, sci: null, - tech: null, math: null, eng: null, }, diff --git a/libs/util-config/src/apis/instance.tsx b/libs/util-config/src/apis/instance.tsx index 60a5ec9..774d39a 100644 --- a/libs/util-config/src/apis/instance.tsx +++ b/libs/util-config/src/apis/instance.tsx @@ -1,6 +1,5 @@ import axios, { AxiosError, AxiosResponse, InternalAxiosRequestConfig } from 'axios'; import { - getAdminId, getAccessToken, getRefreshToken, setAccessToken, @@ -289,8 +288,6 @@ const handleAdminTokenRefresh = () => { { headers: { 'X-Refresh-Token': adminRefreshToken, - 'Request-User-Id': getAdminId(), - 'Request-User-Role': 'ADMIN', }, // @ts-ignore skipAuthInterceptor: true, diff --git a/yarn.lock b/yarn.lock index eee8139..d49a9fa 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1497,21 +1497,6 @@ "@jridgewell/resolve-uri" "^3.1.0" "@jridgewell/sourcemap-codec" "^1.4.14" -"@mapbox/node-pre-gyp@^1.0.0": - version "1.0.11" - resolved "https://registry.yarnpkg.com/@mapbox/node-pre-gyp/-/node-pre-gyp-1.0.11.tgz#417db42b7f5323d79e93b34a6d7a2a12c0df43fa" - integrity sha512-Yhlar6v9WQgUp/He7BdgzOz8lqMQ8sU+jkCq7Wx8Myc5YFJLbEe7lgui/V7G1qB1DJykHSGwreceSaD60Y0PUQ== - dependencies: - detect-libc "^2.0.0" - https-proxy-agent "^5.0.0" - make-dir "^3.1.0" - node-fetch "^2.6.7" - nopt "^5.0.0" - npmlog "^5.0.1" - rimraf "^3.0.2" - semver "^7.3.5" - tar "^6.1.11" - "@microsoft/api-extractor-model@7.30.7": version "7.30.7" resolved "https://registry.yarnpkg.com/@microsoft/api-extractor-model/-/api-extractor-model-7.30.7.tgz#a87cd3332cd1016e47a6f4a1c4585024aa92bc7d" @@ -1944,6 +1929,78 @@ "@module-federation/runtime" "0.9.1" "@module-federation/sdk" "0.9.1" +"@napi-rs/canvas-android-arm64@0.1.88": + version "0.1.88" + resolved "https://registry.yarnpkg.com/@napi-rs/canvas-android-arm64/-/canvas-android-arm64-0.1.88.tgz#4c50ec99916f568ec3109d2ec28ec4f46fff3fa0" + integrity sha512-KEaClPnZuVxJ8smUWjV1wWFkByBO/D+vy4lN+Dm5DFH514oqwukxKGeck9xcKJhaWJGjfruGmYGiwRe//+/zQQ== + +"@napi-rs/canvas-darwin-arm64@0.1.88": + version "0.1.88" + resolved "https://registry.yarnpkg.com/@napi-rs/canvas-darwin-arm64/-/canvas-darwin-arm64-0.1.88.tgz#ca7d6448bee00a1e2eaf6fd0601b61132219f93c" + integrity sha512-Xgywz0dDxOKSgx3eZnK85WgGMmGrQEW7ZLA/E7raZdlEE+xXCozobgqz2ZvYigpB6DJFYkqnwHjqCOTSDGlFdg== + +"@napi-rs/canvas-darwin-x64@0.1.88": + version "0.1.88" + resolved "https://registry.yarnpkg.com/@napi-rs/canvas-darwin-x64/-/canvas-darwin-x64-0.1.88.tgz#846aab350a6ada51478aff8d75c163e5915d600e" + integrity sha512-Yz4wSCIQOUgNucgk+8NFtQxQxZV5NO8VKRl9ePKE6XoNyNVC8JDqtvhh3b3TPqKK8W5p2EQpAr1rjjm0mfBxdg== + +"@napi-rs/canvas-linux-arm-gnueabihf@0.1.88": + version "0.1.88" + resolved "https://registry.yarnpkg.com/@napi-rs/canvas-linux-arm-gnueabihf/-/canvas-linux-arm-gnueabihf-0.1.88.tgz#c17f688d0131a9831580a72d3d0e12a57fed3571" + integrity sha512-9gQM2SlTo76hYhxHi2XxWTAqpTOb+JtxMPEIr+H5nAhHhyEtNmTSDRtz93SP7mGd2G3Ojf2oF5tP9OdgtgXyKg== + +"@napi-rs/canvas-linux-arm64-gnu@0.1.88": + version "0.1.88" + resolved "https://registry.yarnpkg.com/@napi-rs/canvas-linux-arm64-gnu/-/canvas-linux-arm64-gnu-0.1.88.tgz#57147119bbefcca9c64441e137997855c4fef3c9" + integrity sha512-7qgaOBMXuVRk9Fzztzr3BchQKXDxGbY+nwsovD3I/Sx81e+sX0ReEDYHTItNb0Je4NHbAl7D0MKyd4SvUc04sg== + +"@napi-rs/canvas-linux-arm64-musl@0.1.88": + version "0.1.88" + resolved "https://registry.yarnpkg.com/@napi-rs/canvas-linux-arm64-musl/-/canvas-linux-arm64-musl-0.1.88.tgz#4d9fe5ca09ac35fb2b70ee524074ef9613133d08" + integrity sha512-kYyNrUsHLkoGHBc77u4Unh067GrfiCUMbGHC2+OTxbeWfZkPt2o32UOQkhnSswKd9Fko/wSqqGkY956bIUzruA== + +"@napi-rs/canvas-linux-riscv64-gnu@0.1.88": + version "0.1.88" + resolved "https://registry.yarnpkg.com/@napi-rs/canvas-linux-riscv64-gnu/-/canvas-linux-riscv64-gnu-0.1.88.tgz#8d7e0fcc1812140afc50ef15e937ab5ffd9b31ac" + integrity sha512-HVuH7QgzB0yavYdNZDRyAsn/ejoXB0hn8twwFnOqUbCCdkV+REna7RXjSR7+PdfW0qMQ2YYWsLvVBT5iL/mGpw== + +"@napi-rs/canvas-linux-x64-gnu@0.1.88": + version "0.1.88" + resolved "https://registry.yarnpkg.com/@napi-rs/canvas-linux-x64-gnu/-/canvas-linux-x64-gnu-0.1.88.tgz#f0013c14922fd9f66600379fec848a4ac2e5105e" + integrity sha512-hvcvKIcPEQrvvJtJnwD35B3qk6umFJ8dFIr8bSymfrSMem0EQsfn1ztys8ETIFndTwdNWJKWluvxztA41ivsEw== + +"@napi-rs/canvas-linux-x64-musl@0.1.88": + version "0.1.88" + resolved "https://registry.yarnpkg.com/@napi-rs/canvas-linux-x64-musl/-/canvas-linux-x64-musl-0.1.88.tgz#52b143c28e5b752fe0eb7d5b73d6754c95117552" + integrity sha512-eSMpGYY2xnZSQ6UxYJ6plDboxq4KeJ4zT5HaVkUnbObNN6DlbJe0Mclh3wifAmquXfrlgTZt6zhHsUgz++AK6g== + +"@napi-rs/canvas-win32-arm64-msvc@0.1.88": + version "0.1.88" + resolved "https://registry.yarnpkg.com/@napi-rs/canvas-win32-arm64-msvc/-/canvas-win32-arm64-msvc-0.1.88.tgz#eaca8a65307294071e5c0c66c9ece60c7f9895dc" + integrity sha512-qcIFfEgHrchyYqRrxsCeTQgpJZ/GqHiqPcU/Fvw/ARVlQeDX1VyFH+X+0gCR2tca6UJrq96vnW+5o7buCq+erA== + +"@napi-rs/canvas-win32-x64-msvc@0.1.88": + version "0.1.88" + resolved "https://registry.yarnpkg.com/@napi-rs/canvas-win32-x64-msvc/-/canvas-win32-x64-msvc-0.1.88.tgz#8bbb4ea013e2386e20cc225bf6f898ba3f32de66" + integrity sha512-ROVqbfS4QyZxYkqmaIBBpbz/BQvAR+05FXM5PAtTYVc0uyY8Y4BHJSMdGAaMf6TdIVRsQsiq+FG/dH9XhvWCFQ== + +"@napi-rs/canvas@^0.1.80": + version "0.1.88" + resolved "https://registry.yarnpkg.com/@napi-rs/canvas/-/canvas-0.1.88.tgz#d76224439324750de02c3455cad755f64d5a6d16" + integrity sha512-/p08f93LEbsL5mDZFQ3DBxcPv/I4QG9EDYRRq1WNlCOXVfAHBTHMSVMwxlqG/AtnSfUr9+vgfN7MKiyDo0+Weg== + optionalDependencies: + "@napi-rs/canvas-android-arm64" "0.1.88" + "@napi-rs/canvas-darwin-arm64" "0.1.88" + "@napi-rs/canvas-darwin-x64" "0.1.88" + "@napi-rs/canvas-linux-arm-gnueabihf" "0.1.88" + "@napi-rs/canvas-linux-arm64-gnu" "0.1.88" + "@napi-rs/canvas-linux-arm64-musl" "0.1.88" + "@napi-rs/canvas-linux-riscv64-gnu" "0.1.88" + "@napi-rs/canvas-linux-x64-gnu" "0.1.88" + "@napi-rs/canvas-linux-x64-musl" "0.1.88" + "@napi-rs/canvas-win32-arm64-msvc" "0.1.88" + "@napi-rs/canvas-win32-x64-msvc" "0.1.88" + "@napi-rs/nice-android-arm-eabi@1.1.1": version "1.1.1" resolved "https://registry.yarnpkg.com/@napi-rs/nice-android-arm-eabi/-/nice-android-arm-eabi-1.1.1.tgz#4ebd966821cd6c2cc7cc020eb468de397bb9b40f" @@ -3703,11 +3760,6 @@ abab@^2.0.6: resolved "https://registry.yarnpkg.com/abab/-/abab-2.0.6.tgz#41b80f2c871d19686216b82309231cfd3cb3d291" integrity sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA== -abbrev@1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8" - integrity sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q== - accepts@^1.3.5, accepts@^1.3.8, accepts@~1.3.8: version "1.3.8" resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.8.tgz#0bf0be125b67014adcb0b0921e62db7bffe16b2e" @@ -3856,24 +3908,11 @@ ansi-styles@^6.1.0: resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-6.2.3.tgz#c044d5dcc521a076413472597a1acb1f103c4041" integrity sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg== -"aproba@^1.0.3 || ^2.0.0": - version "2.1.0" - resolved "https://registry.yarnpkg.com/aproba/-/aproba-2.1.0.tgz#75500a190313d95c64e871e7e4284c6ac219f0b1" - integrity sha512-tLIEcj5GuR2RSTnxNKdkK0dJ/GrC7P38sUkiDmDuHfsHmbagTFAxDVIBltoklXEVIQ/f14IL8IMJ5pn9Hez1Ew== - arch@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/arch/-/arch-3.0.0.tgz#a44e7077da4615fc5f1e3da21fbfc201d2c1817c" integrity sha512-AmIAC+Wtm2AU8lGfTtHsw0Y9Qtftx2YXEEtiBP10xFUtMOA+sHHx6OAddyL52mUKh1vsXQ6/w1mVDptZCyUt4Q== -are-we-there-yet@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/are-we-there-yet/-/are-we-there-yet-2.0.0.tgz#372e0e7bd279d8e94c653aaa1f67200884bf3e1c" - integrity sha512-Ci/qENmwHnsYo9xKIcUJN5LeDKdJ6R1Z1j9V/J5wyq8nh/mYPEpIKJbBZXtZjG04HiK7zV/p6Vs9952MrMeUIw== - dependencies: - delegates "^1.0.0" - readable-stream "^3.6.0" - arg@^5.0.1: version "5.0.2" resolved "https://registry.yarnpkg.com/arg/-/arg-5.0.2.tgz#c81433cc427c92c4dcf4865142dbca6f15acd59c" @@ -4331,15 +4370,6 @@ caniuse-lite@^1.0.30001520, caniuse-lite@^1.0.30001741: resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001745.tgz#ab2a36e3b6ed5bfb268adc002c476aab6513f859" integrity sha512-ywt6i8FzvdgrrrGbr1jZVObnVv6adj+0if2/omv9cmR2oiZs30zL4DIyaptKcbOrBdOIc74QTMoJvSE2QHh5UQ== -canvas@^2.11.2: - version "2.11.2" - resolved "https://registry.yarnpkg.com/canvas/-/canvas-2.11.2.tgz#553d87b1e0228c7ac0fc72887c3adbac4abbd860" - integrity sha512-ItanGBMrmRV7Py2Z+Xhs7cT+FNt5K0vPL4p9EZ/UX/Mu7hFbkxSjKF2KVtPwX7UYWp7dRKnrTvReflgrItJbdw== - dependencies: - "@mapbox/node-pre-gyp" "^1.0.0" - nan "^2.17.0" - simple-get "^3.0.3" - ccount@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/ccount/-/ccount-2.0.1.tgz#17a3bf82302e0870d6da43a01311a8bc02a3ecf5" @@ -4404,11 +4434,6 @@ chokidar@^4.0.0: dependencies: readdirp "^4.0.1" -chownr@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/chownr/-/chownr-2.0.0.tgz#15bfbe53d2eab4cf70f18a8cd68ebe5b3cb1dece" - integrity sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ== - chrome-trace-event@^1.0.2: version "1.0.4" resolved "https://registry.yarnpkg.com/chrome-trace-event/-/chrome-trace-event-1.0.4.tgz#05bffd7ff928465093314708c93bdfa9bd1f0f5b" @@ -4467,11 +4492,6 @@ color-name@~1.1.4: resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== -color-support@^1.1.2: - version "1.1.3" - resolved "https://registry.yarnpkg.com/color-support/-/color-support-1.1.3.tgz#93834379a1cc9a0c61f82f52f0d04322251bd5a2" - integrity sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg== - colorette@^2.0.20: version "2.0.20" resolved "https://registry.yarnpkg.com/colorette/-/colorette-2.0.20.tgz#9eb793e6833067f7235902fcd3b09917a000a95a" @@ -4567,11 +4587,6 @@ confusing-browser-globals@^1.0.9: resolved "https://registry.yarnpkg.com/confusing-browser-globals/-/confusing-browser-globals-1.0.11.tgz#ae40e9b57cdd3915408a2805ebd3a5585608dc81" integrity sha512-JsPKdmh8ZkmnHxDk55FZ1TqVLvEQTvoByJZRN9jzI0UjxK/QgAmsphz7PGtqgPieQZ/CQcHWXCR7ATDNhGe+YA== -console-control-strings@^1.0.0, console-control-strings@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e" - integrity sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ== - content-disposition@0.5.4, content-disposition@^0.5.4, content-disposition@~0.5.2, content-disposition@~0.5.4: version "0.5.4" resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.4.tgz#8b82b4efac82512a02bb0b1dcec9d2c5e8eb5bfe" @@ -4806,13 +4821,6 @@ decode-named-character-reference@^1.0.0: dependencies: character-entities "^2.0.0" -decompress-response@^4.2.0: - version "4.2.1" - resolved "https://registry.yarnpkg.com/decompress-response/-/decompress-response-4.2.1.tgz#414023cc7a302da25ce2ec82d0d5238ccafd8986" - integrity sha512-jOSne2qbyE+/r8G1VU+G/82LBs2Fs4LAsTiLSHOCOMZQl2OKZ6i8i4IyHemTe+/yIXOtTcRQMzPcgyhoFlqPkw== - dependencies: - mimic-response "^2.0.0" - decompress-response@^6.0.0: version "6.0.0" resolved "https://registry.yarnpkg.com/decompress-response/-/decompress-response-6.0.0.tgz#ca387612ddb7e104bd16d85aab00d5ecf09c66fc" @@ -4915,11 +4923,6 @@ destroy@1.2.0, destroy@^1.0.4, destroy@^1.2.0: resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.2.0.tgz#4803735509ad8be552934c67df614f94e66fa015" integrity sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg== -detect-libc@^2.0.0: - version "2.1.2" - resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-2.1.2.tgz#689c5dcdc1900ef5583a4cb9f6d7b473742074ad" - integrity sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ== - detect-port@^1.5.1: version "1.6.1" resolved "https://registry.yarnpkg.com/detect-port/-/detect-port-1.6.1.tgz#45e4073997c5f292b957cb678fb0bb8ed4250a67" @@ -5940,18 +5943,6 @@ fs-extra@~11.3.0: jsonfile "^6.0.1" universalify "^2.0.0" -fs-minipass@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-2.1.0.tgz#7f5036fdbf12c63c169190cbe4199c852271f9fb" - integrity sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg== - dependencies: - minipass "^3.0.0" - -fs.realpath@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" - integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw== - fsevents@~2.3.2, fsevents@~2.3.3: version "2.3.3" resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.3.tgz#cac6407785d03675a2a5e1a5305c697b347d90d6" @@ -5979,21 +5970,6 @@ functions-have-names@^1.2.3: resolved "https://registry.yarnpkg.com/functions-have-names/-/functions-have-names-1.2.3.tgz#0404fe4ee2ba2f607f0e0ec3c80bae994133b834" integrity sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ== -gauge@^3.0.0: - version "3.0.2" - resolved "https://registry.yarnpkg.com/gauge/-/gauge-3.0.2.tgz#03bf4441c044383908bcfa0656ad91803259b395" - integrity sha512-+5J6MS/5XksCuXq++uFRsnUd7Ovu1XenbeuIuNRJxYWjgQbPuFhT14lAvsWfqfAmnwluf1OwMjz39HjfLPci0Q== - dependencies: - aproba "^1.0.3 || ^2.0.0" - color-support "^1.1.2" - console-control-strings "^1.0.0" - has-unicode "^2.0.1" - object-assign "^4.1.1" - signal-exit "^3.0.0" - string-width "^4.2.3" - strip-ansi "^6.0.1" - wide-align "^1.1.2" - gensync@^1.0.0-beta.2: version "1.0.0-beta.2" resolved "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.2.tgz#32a6ee76c3d7f52d46b2b1ae5d93fea8580a25e0" @@ -6078,18 +6054,6 @@ glob@^10.2.2: package-json-from-dist "^1.0.0" path-scurry "^1.11.1" -glob@^7.1.3: - version "7.2.3" - resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.3.tgz#b8df0fb802bbfa8e89bd1d938b4e16578ed44f2b" - integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== - dependencies: - fs.realpath "^1.0.0" - inflight "^1.0.4" - inherits "2" - minimatch "^3.1.1" - once "^1.3.0" - path-is-absolute "^1.0.0" - global-modules@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/global-modules/-/global-modules-1.0.0.tgz#6d770f0eb523ac78164d72b5e71a8877265cc3ea" @@ -6196,11 +6160,6 @@ has-tostringtag@^1.0.2: dependencies: has-symbols "^1.0.3" -has-unicode@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9" - integrity sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ== - hasown@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/hasown/-/hasown-2.0.2.tgz#003eaf91be7adc372e84ec59dc37252cedb80003" @@ -6464,7 +6423,7 @@ http2-wrapper@^2.1.10: quick-lru "^5.1.1" resolve-alpn "^1.2.0" -https-proxy-agent@^5.0.0, https-proxy-agent@^5.0.1: +https-proxy-agent@^5.0.1: version "5.0.1" resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz#c59ef224a04fe8b754f3db0063a25ea30d0005d6" integrity sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA== @@ -6524,15 +6483,7 @@ imurmurhash@^0.1.4: resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" integrity sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA== -inflight@^1.0.4: - version "1.0.6" - resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" - integrity sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA== - dependencies: - once "^1.3.0" - wrappy "1" - -inherits@2, inherits@2.0.4, inherits@^2.0.3, inherits@^2.0.4: +inherits@2.0.4, inherits@^2.0.3, inherits@^2.0.4: version "2.0.4" resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== @@ -7344,22 +7295,15 @@ magic-string@^0.30.17: dependencies: "@jridgewell/sourcemap-codec" "^1.5.5" -make-cancellable-promise@^1.3.1: - version "1.3.2" - resolved "https://registry.yarnpkg.com/make-cancellable-promise/-/make-cancellable-promise-1.3.2.tgz#993c8c8b79cff13c74fa93de0bd8a17fe66685c1" - integrity sha512-GCXh3bq/WuMbS+Ky4JBPW1hYTOU+znU+Q5m9Pu+pI8EoUqIHk9+tviOKC6/qhHh8C4/As3tzJ69IF32kdz85ww== - -make-dir@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-3.1.0.tgz#415e967046b3a7f1d185277d84aa58203726a13f" - integrity sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw== - dependencies: - semver "^6.0.0" +make-cancellable-promise@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/make-cancellable-promise/-/make-cancellable-promise-2.0.0.tgz#d582b3ea435205e31653dead33a10bea0696c2fa" + integrity sha512-3SEQqTpV9oqVsIWqAcmDuaNeo7yBO3tqPtqGRcKkEo0lrzD3wqbKG9mkxO65KoOgXqj+zH2phJ2LiAsdzlogSw== -make-event-props@^1.6.0: - version "1.6.2" - resolved "https://registry.yarnpkg.com/make-event-props/-/make-event-props-1.6.2.tgz#c8e0e48eb28b9b808730de38359f6341de7ec5a2" - integrity sha512-iDwf7mA03WPiR8QxvcVHmVWEPfMY1RZXerDVNCRYW7dUr2ppH3J58Rwb39/WG39yTZdRSxr3x+2v22tvI0VEvA== +make-event-props@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/make-event-props/-/make-event-props-2.0.0.tgz#41f7a6e96841296d6835aebe94be86c25602f923" + integrity sha512-G/hncXrl4Qt7mauJEXSg3AcdYzmpkIITTNl5I+rH9sog5Yw0kK6vseJjCaPfOXqOqQuPUP89Rkhfz5kPS8ijtw== math-intrinsics@^1.1.0: version "1.1.0" @@ -7496,10 +7440,10 @@ merge-descriptors@1.0.3: resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.3.tgz#d80319a65f3c7935351e5cfdac8f9318504dbed5" integrity sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ== -merge-refs@^1.2.1: - version "1.3.0" - resolved "https://registry.yarnpkg.com/merge-refs/-/merge-refs-1.3.0.tgz#65d7f8c5058917b9d1fc204ae4b9a727614d0119" - integrity sha512-nqXPXbso+1dcKDpPCXvwZyJILz+vSLqGGOnDrYHQYE+B8n9JTCekVLC65AfCpR4ggVyA/45Y0iR9LDyS2iI+zA== +merge-refs@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/merge-refs/-/merge-refs-2.0.0.tgz#0f1a3e902fde05f30f59279ce73d5d82d2f84dfa" + integrity sha512-3+B21mYK2IqUWnd2EivABLT7ueDhb0b8/dGK8LoFQPrU61YITeCMn14F7y7qZafWNZhUEKb24cJdiT5Wxs3prg== merge-stream@^2.0.0: version "2.0.0" @@ -7752,11 +7696,6 @@ mimic-fn@^2.1.0: resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== -mimic-response@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-2.1.0.tgz#d13763d35f613d09ec37ebb30bac0469c0ee8f43" - integrity sha512-wXqjST+SLt7R009ySCglWBCFpjUygmCIfD790/kVbiGmUgfYGuB14PiTd5DwVxSV4NcYHjzMkoj5LjQZwTQLEA== - mimic-response@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-3.1.0.tgz#2d1d59af9c1b129815accc2c46a022a5ce1fa3c9" @@ -7781,7 +7720,7 @@ minimatch@9.0.3: dependencies: brace-expansion "^2.0.1" -minimatch@^3.1.1, minimatch@^3.1.2: +minimatch@^3.1.2: version "3.1.2" resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== @@ -7807,36 +7746,11 @@ minimist@^1.2.0, minimist@^1.2.6: resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.8.tgz#c1a464e7693302e082a075cee0c057741ac4772c" integrity sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA== -minipass@^3.0.0: - version "3.3.6" - resolved "https://registry.yarnpkg.com/minipass/-/minipass-3.3.6.tgz#7bba384db3a1520d18c9c0e5251c3444e95dd94a" - integrity sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw== - dependencies: - yallist "^4.0.0" - -minipass@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/minipass/-/minipass-5.0.0.tgz#3e9788ffb90b694a5d0ec94479a45b5d8738133d" - integrity sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ== - "minipass@^5.0.0 || ^6.0.2 || ^7.0.0", minipass@^7.1.2: version "7.1.2" resolved "https://registry.yarnpkg.com/minipass/-/minipass-7.1.2.tgz#93a9626ce5e5e66bd4db86849e7515e92340a707" integrity sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw== -minizlib@^2.1.1: - version "2.1.2" - resolved "https://registry.yarnpkg.com/minizlib/-/minizlib-2.1.2.tgz#e90d3466ba209b932451508a11ce3d3632145931" - integrity sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg== - dependencies: - minipass "^3.0.0" - yallist "^4.0.0" - -mkdirp@^1.0.3: - version "1.0.4" - resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-1.0.4.tgz#3eb5ed62622756d79a5f0e2a221dfebad75c2f7e" - integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw== - mlly@^1.7.4: version "1.8.0" resolved "https://registry.yarnpkg.com/mlly/-/mlly-1.8.0.tgz#e074612b938af8eba1eaf43299cbc89cb72d824e" @@ -7878,11 +7792,6 @@ muggle-string@^0.4.1: resolved "https://registry.yarnpkg.com/muggle-string/-/muggle-string-0.4.1.tgz#3b366bd43b32f809dc20659534dd30e7c8a0d328" integrity sha512-VNTrAak/KhO2i8dqqnqnAHOa3cYBwXEZe9h+D5h/1ZqFSTEFHdM65lR7RoIqq3tBBYavsOXV84NoHXZ0AkPyqQ== -nan@^2.17.0: - version "2.23.0" - resolved "https://registry.yarnpkg.com/nan/-/nan-2.23.0.tgz#24aa4ddffcc37613a2d2935b97683c1ec96093c6" - integrity sha512-1UxuyYGdoQHcGg87Lkqm3FzefucTa0NAiOcuRsDmysep3c1LVCRK2krrUDafMWtjSG04htvAmvg96+SDknOmgQ== - nanoid@^3.3.11: version "3.3.11" resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.11.tgz#4f4f112cefbe303202f2199838128936266d185b" @@ -7916,7 +7825,7 @@ no-case@^3.0.4: lower-case "^2.0.2" tslib "^2.0.3" -node-fetch@2.7.0, node-fetch@^2.6.7: +node-fetch@2.7.0: version "2.7.0" resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.7.0.tgz#d0f0fa6e3e2dc1d27efcd8ad99d550bda94d187d" integrity sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A== @@ -7942,13 +7851,6 @@ node-schedule@2.1.1: long-timeout "0.1.1" sorted-array-functions "^1.3.0" -nopt@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/nopt/-/nopt-5.0.0.tgz#530942bb58a512fccafe53fe210f13a25355dc88" - integrity sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ== - dependencies: - abbrev "1" - normalize-package-data@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-5.0.0.tgz#abcb8d7e724c40d88462b84982f7cbf6859b4588" @@ -8013,16 +7915,6 @@ npm-run-path@^4.0.1: dependencies: path-key "^3.0.0" -npmlog@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-5.0.1.tgz#f06678e80e29419ad67ab964e0fa69959c1eb8b0" - integrity sha512-AqZtDUWOMKs1G/8lwylVjrdYgqA4d9nu8hc+0gzRxlDb1I10+FHBGMXs6aiQHFdCUUlqH99MUMuLfzWDNDtfxw== - dependencies: - are-we-there-yet "^2.0.0" - console-control-strings "^1.1.0" - gauge "^3.0.0" - set-blocking "^2.0.0" - nth-check@^2.0.1: version "2.1.1" resolved "https://registry.yarnpkg.com/nth-check/-/nth-check-2.1.1.tgz#c9eab428effce36cd6b92c924bdb000ef1f1ed1d" @@ -8171,7 +8063,7 @@ on-headers@~1.1.0: resolved "https://registry.yarnpkg.com/on-headers/-/on-headers-1.1.0.tgz#59da4f91c45f5f989c6e4bcedc5a3b0aed70ff65" integrity sha512-737ZY3yNnXy37FHkQxPzt4UZ2UWPWiCZWLvFZ4fu5cueciegX0zGPnrlY6bwRg4FdQOe9YU8MkmJwGhoMybl8A== -once@^1.3.0, once@^1.3.1, once@^1.4.0: +once@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w== @@ -8320,11 +8212,6 @@ path-exists@^4.0.0: resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== -path-is-absolute@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" - integrity sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg== - path-key@^3.0.0, path-key@^3.1.0: version "3.1.1" resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" @@ -8353,18 +8240,6 @@ path-type@^4.0.0: resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b" integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== -path2d-polyfill@^2.0.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/path2d-polyfill/-/path2d-polyfill-2.1.1.tgz#6098b7bf2fc24c306c6377bcd558b17ba437ea27" - integrity sha512-4Rka5lN+rY/p0CdD8+E+BFv51lFaFvJOrlOhyQ+zjzyQrzyh3ozmxd1vVGGDdIbUFSBtIZLSnspxTgPT0iJhvA== - dependencies: - path2d "0.1.1" - -path2d@0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/path2d/-/path2d-0.1.1.tgz#d3c3886cd2252fb2a7830c27ea7bb9a862d937ea" - integrity sha512-/+S03c8AGsDYKKBtRDqieTJv2GlkMb0bWjnqOgtF6MkjdUQ9a8ARAtxWf9NgKLGm2+WQr6+/tqJdU8HNGsIDoA== - pathe@^1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/pathe/-/pathe-1.1.2.tgz#6c4cb47a945692e48a1ddd6e4094d170516437ec" @@ -8380,13 +8255,12 @@ pathval@^2.0.0: resolved "https://registry.yarnpkg.com/pathval/-/pathval-2.0.1.tgz#8855c5a2899af072d6ac05d11e46045ad0dc605d" integrity sha512-//nshmD55c46FuFw26xV/xFAaB5HF9Xdap7HJBBnrKdAd6/GxDBaNA1870O79+9ueg61cZLSVc+OaFlfmObYVQ== -pdfjs-dist@3.11.174, pdfjs-dist@^3.11.174: - version "3.11.174" - resolved "https://registry.yarnpkg.com/pdfjs-dist/-/pdfjs-dist-3.11.174.tgz#5ff47b80f2d58c8dd0d74f615e7c6a7e7e704c4b" - integrity sha512-TdTZPf1trZ8/UFu5Cx/GXB7GZM30LT+wWUNfsi6Bq8ePLnb+woNKtDymI2mxZYBpMbonNFqKmiz684DIfnd8dA== +pdfjs-dist@5.4.296: + version "5.4.296" + resolved "https://registry.yarnpkg.com/pdfjs-dist/-/pdfjs-dist-5.4.296.tgz#b1aa7ded8828f29537bc7cc99c1343c8b3a5d2d6" + integrity sha512-DlOzet0HO7OEnmUmB6wWGJrrdvbyJKftI1bhMitK7O2N8W2gc757yyYBbINy9IDafXAV9wmKr9t7xsTaNKRG5Q== optionalDependencies: - canvas "^2.11.2" - path2d-polyfill "^2.0.1" + "@napi-rs/canvas" "^0.1.80" pend@~1.2.0: version "1.2.0" @@ -8512,7 +8386,7 @@ promise-retry@^2.0.1: err-code "^2.0.2" retry "^0.12.0" -prop-types@^15.6.2, prop-types@^15.8.1: +prop-types@^15.8.1: version "15.8.1" resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.8.1.tgz#67d87bf1a694f48435cf332c24af10214a3140b5" integrity sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg== @@ -8673,18 +8547,17 @@ react-markdown@^10.1.0: unist-util-visit "^5.0.0" vfile "^6.0.0" -react-pdf@^7.7.1: - version "7.7.3" - resolved "https://registry.yarnpkg.com/react-pdf/-/react-pdf-7.7.3.tgz#eea8104cd165dfec7ae0fa54259cfe7de12b5e81" - integrity sha512-a2VfDl8hiGjugpqezBTUzJHYLNB7IS7a2t7GD52xMI9xHg8LdVaTMsnM9ZlNmKadnStT/tvX5IfV0yLn+JvYmw== +react-pdf@^10.2.0: + version "10.3.0" + resolved "https://registry.yarnpkg.com/react-pdf/-/react-pdf-10.3.0.tgz#b7c5e4bfb17b4eb128c7b78d8f198a742eda5bbb" + integrity sha512-2LQzC9IgNVAX8gM+6F+1t/70a9/5RWThYxc+CWAmT2LW/BRmnj+35x1os5j/nR2oldyf8L+hCAMBmVKU8wrYFA== dependencies: clsx "^2.0.0" dequal "^2.0.3" - make-cancellable-promise "^1.3.1" - make-event-props "^1.6.0" - merge-refs "^1.2.1" - pdfjs-dist "3.11.174" - prop-types "^15.6.2" + make-cancellable-promise "^2.0.0" + make-event-props "^2.0.0" + merge-refs "^2.0.0" + pdfjs-dist "5.4.296" tiny-invariant "^1.0.0" warning "^4.0.0" @@ -8732,7 +8605,7 @@ react@18.3.1: dependencies: loose-envify "^1.1.0" -readable-stream@^3.1.1, readable-stream@^3.4.0, readable-stream@^3.6.0: +readable-stream@^3.1.1, readable-stream@^3.4.0: version "3.6.2" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.2.tgz#56a9b36ea965c00c5a93ef31eb111a0f11056967" integrity sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA== @@ -8944,13 +8817,6 @@ rfdc@^1.3.0: resolved "https://registry.yarnpkg.com/rfdc/-/rfdc-1.4.1.tgz#778f76c4fb731d93414e8f925fbecf64cce7f6ca" integrity sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA== -rimraf@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a" - integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA== - dependencies: - glob "^7.1.3" - rollup@^4.34.9, rollup@^4.43.0: version "4.52.2" resolved "https://registry.yarnpkg.com/rollup/-/rollup-4.52.2.tgz#43dd135805c919285376634c8520074c5eb7a91a" @@ -9104,7 +8970,7 @@ semver@7.6.3: resolved "https://registry.yarnpkg.com/semver/-/semver-7.6.3.tgz#980f7b5550bc175fb4dc09403085627f9eb33143" integrity sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A== -semver@^6.0.0, semver@^6.3.1: +semver@^6.3.1: version "6.3.1" resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.1.tgz#556d2ef8689146e46dcea4bfdd095f3434dffcb4" integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== @@ -9157,11 +9023,6 @@ serve-static@1.16.2: parseurl "~1.3.3" send "0.19.0" -set-blocking@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" - integrity sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw== - set-function-length@^1.2.2: version "1.2.2" resolved "https://registry.yarnpkg.com/set-function-length/-/set-function-length-1.2.2.tgz#aac72314198eaed975cf77b2c3b6b880695e5449" @@ -9255,7 +9116,7 @@ siginfo@^2.0.0: resolved "https://registry.yarnpkg.com/siginfo/-/siginfo-2.0.0.tgz#32e76c70b79724e3bb567cb9d543eb858ccfaf30" integrity sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g== -signal-exit@^3.0.0, signal-exit@^3.0.2, signal-exit@^3.0.3: +signal-exit@^3.0.2, signal-exit@^3.0.3: version "3.0.7" resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.7.tgz#a9a1767f8af84155114eaabd73f99273c8f59ad9" integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ== @@ -9265,20 +9126,6 @@ signal-exit@^4.0.1: resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-4.1.0.tgz#952188c1cbd546070e2dd20d0f41c0ae0530cb04" integrity sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw== -simple-concat@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/simple-concat/-/simple-concat-1.0.1.tgz#f46976082ba35c2263f1c8ab5edfe26c41c9552f" - integrity sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q== - -simple-get@^3.0.3: - version "3.1.1" - resolved "https://registry.yarnpkg.com/simple-get/-/simple-get-3.1.1.tgz#cc7ba77cfbe761036fbfce3d021af25fc5584d55" - integrity sha512-CQ5LTKGfCpvE1K0n2us+kuMPbk/q0EKl82s4aheV9oXjFEz6W/Y7oQFVJuU6QG77hRT4Ghb5RURteF5vnWjupA== - dependencies: - decompress-response "^4.2.0" - once "^1.3.1" - simple-concat "^1.0.0" - sirv@^3.0.1: version "3.0.2" resolved "https://registry.yarnpkg.com/sirv/-/sirv-3.0.2.tgz#f775fccf10e22a40832684848d636346f41cd970" @@ -9457,7 +9304,7 @@ string-argv@~0.3.1: is-fullwidth-code-point "^3.0.0" strip-ansi "^6.0.1" -"string-width@^1.0.2 || 2 || 3 || 4", string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: +string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: version "4.2.3" resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== @@ -9702,18 +9549,6 @@ tar-stream@~2.2.0: inherits "^2.0.3" readable-stream "^3.1.1" -tar@^6.1.11: - version "6.2.1" - resolved "https://registry.yarnpkg.com/tar/-/tar-6.2.1.tgz#717549c541bc3c2af15751bea94b1dd068d4b03a" - integrity sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A== - dependencies: - chownr "^2.0.0" - fs-minipass "^2.0.0" - minipass "^5.0.0" - minizlib "^2.1.1" - mkdirp "^1.0.3" - yallist "^4.0.0" - terser-webpack-plugin@^5.3.11: version "5.3.14" resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-5.3.14.tgz#9031d48e57ab27567f02ace85c7d690db66c3e06" @@ -10503,13 +10338,6 @@ why-is-node-running@^2.3.0: siginfo "^2.0.0" stackback "0.0.2" -wide-align@^1.1.2: - version "1.1.5" - resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.5.tgz#df1d4c206854369ecf3c9a4898f1b23fbd9d15d3" - integrity sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg== - dependencies: - string-width "^1.0.2 || 2 || 3 || 4" - word-wrap@^1.2.5: version "1.2.5" resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.5.tgz#d2c45c6dd4fbce621a66f136cbe328afd0410b34"