From 9af772daa084ca1be59a62699d058a87e3af644c Mon Sep 17 00:00:00 2001 From: seoJing Date: Mon, 30 Mar 2026 21:02:09 +0900 Subject: [PATCH 1/3] =?UTF-8?q?feature(graduate):=20=EC=83=81=EC=84=B8?= =?UTF-8?q?=EB=B3=B4=EA=B8=B0=EC=97=90=20=EC=97=B0=EB=9D=BD=EC=B2=98=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/admin/features/studentDetail/types/studentDetail.ts | 1 + .../src/admin/shared/ui/UserDetailModal/UserDetailModal.tsx | 4 +++- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/apps/graduate/src/admin/features/studentDetail/types/studentDetail.ts b/apps/graduate/src/admin/features/studentDetail/types/studentDetail.ts index 47e0ba7a..e7c2293d 100644 --- a/apps/graduate/src/admin/features/studentDetail/types/studentDetail.ts +++ b/apps/graduate/src/admin/features/studentDetail/types/studentDetail.ts @@ -8,5 +8,6 @@ export interface StudentDetailApiResponse { advisor: string; major: string; capstoneCompletion: boolean; + phone: string; status: SubmissionStatus; } diff --git a/apps/graduate/src/admin/shared/ui/UserDetailModal/UserDetailModal.tsx b/apps/graduate/src/admin/shared/ui/UserDetailModal/UserDetailModal.tsx index 6b20b3df..914dc26d 100644 --- a/apps/graduate/src/admin/shared/ui/UserDetailModal/UserDetailModal.tsx +++ b/apps/graduate/src/admin/shared/ui/UserDetailModal/UserDetailModal.tsx @@ -39,6 +39,7 @@ export default function UserDetailModal({ advisor, major, capstoneCompletion, + phone, status, } = studentDetail ?? {}; @@ -133,9 +134,10 @@ export default function UserDetailModal({ {capstoneCompletion ? '캡스톤 이수' : '캡스톤 미이수'} - + {getStatusLabel(status)} + {phone} From 3821343e4d544d5a8cc8d990116fcd7dbf08cf89 Mon Sep 17 00:00:00 2001 From: seoJing Date: Mon, 30 Mar 2026 21:02:24 +0900 Subject: [PATCH 2/3] =?UTF-8?q?feature(graduate):=20=EC=8A=B9=EC=9D=B8=20?= =?UTF-8?q?=EC=B7=A8=EC=86=8C=20=ED=86=A0=EA=B8=80=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../pages/filePreview/ui/FilePreviewPage.tsx | 26 +++++++++++++- .../filePreview/ui/FilePreviewToolbar.tsx | 35 ++++++++++++++----- 2 files changed, 51 insertions(+), 10 deletions(-) diff --git a/apps/graduate/src/admin/pages/filePreview/ui/FilePreviewPage.tsx b/apps/graduate/src/admin/pages/filePreview/ui/FilePreviewPage.tsx index 9665f5d5..fa1bb82f 100644 --- a/apps/graduate/src/admin/pages/filePreview/ui/FilePreviewPage.tsx +++ b/apps/graduate/src/admin/pages/filePreview/ui/FilePreviewPage.tsx @@ -13,11 +13,16 @@ import { getSubmissionTypeIndex } from '../../schedule/constants'; import { useFile } from '../model'; import * as style from '../styles/FilePreviewPage.css'; -import { useGraduationBatchApproval } from '~/admin/entities/graduation-approval/model'; +import { + useGraduationBatchApproval, + useGraduationBatchDisapproval, +} from '~/admin/entities/graduation-approval/model'; import { useStudentDetail } from '~/admin/features/studentDetail'; import { APPROVE_FAILED, APPROVE_SUCCESS, + DISAPPROVE_FAILED, + DISAPPROVE_SUCCESS, } from '~/admin/shared/constants/actionTexts'; export default function FilePreviewPage() { @@ -52,6 +57,23 @@ export default function FilePreviewPage() { }, }); + const { disapproveGraduationUsers, mutation: disapprovalMutation } = + useGraduationBatchDisapproval({ + onSuccess: async () => { + toast.success(DISAPPROVE_SUCCESS); + await refetch(); + }, + }); + + const handleCancelApprove = async () => { + const result = await disapproveGraduationUsers([ + { graduationUserId, submissionId: fileId }, + ]); + if (result.successCount === 0) { + toast.error(DISAPPROVE_FAILED); + } + }; + const clearHideTimeout = () => { if (hideTimeoutRef.current !== null) { clearTimeout(hideTimeoutRef.current); @@ -180,9 +202,11 @@ export default function FilePreviewPage() { name={name} isApproved={approval ?? false} onApprove={handleApprove} + onCancelApprove={handleCancelApprove} onChangeFile={handleNextFile} canNavigate={canNavigate} isApproving={approvalMutation.isPending} + isCancellingApprove={disapprovalMutation.isPending} /> diff --git a/apps/graduate/src/admin/pages/filePreview/ui/FilePreviewToolbar.tsx b/apps/graduate/src/admin/pages/filePreview/ui/FilePreviewToolbar.tsx index ef6ba92a..d2a7c3a9 100644 --- a/apps/graduate/src/admin/pages/filePreview/ui/FilePreviewToolbar.tsx +++ b/apps/graduate/src/admin/pages/filePreview/ui/FilePreviewToolbar.tsx @@ -7,9 +7,11 @@ interface FilePreviewToolbarProps { name: string; isApproved: boolean; onApprove: () => void; + onCancelApprove: () => void; onChangeFile: () => void; canNavigate: boolean; isApproving: boolean; + isCancellingApprove: boolean; } export default function FilePreviewToolbar({ @@ -17,23 +19,38 @@ export default function FilePreviewToolbar({ name, isApproved, onApprove, + onCancelApprove, onChangeFile, canNavigate, isApproving, + isCancellingApprove, }: FilePreviewToolbarProps) { return (
학번: {studentId} 이름: {name} - + {isApproved ? ( + + ) : ( + + )}