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/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 ? ( + + ) : ( + + )}