From 07c9bfd5860e27165c255a03f51e95d0187459fe Mon Sep 17 00:00:00 2001 From: joonhoekim <26rote@gmail.com> Date: Wed, 3 Sep 2025 12:46:37 +0000 Subject: (김준회) 결재 API 응답 처리 오류 수정, 자재마스터 상세보기 누락컬럼 추가 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- components/knox/approval/ApprovalCancel.tsx | 127 ++++++++++++++++++---------- components/knox/approval/ApprovalDetail.tsx | 2 +- components/knox/approval/ApprovalList.tsx | 2 +- 3 files changed, 83 insertions(+), 48 deletions(-) (limited to 'components/knox') diff --git a/components/knox/approval/ApprovalCancel.tsx b/components/knox/approval/ApprovalCancel.tsx index b40b43df..62afce94 100644 --- a/components/knox/approval/ApprovalCancel.tsx +++ b/components/knox/approval/ApprovalCancel.tsx @@ -7,6 +7,7 @@ import { Input } from '@/components/ui/input'; import { Label } from '@/components/ui/label'; import { Badge } from '@/components/ui/badge'; import { Separator } from '@/components/ui/separator'; +import { Textarea } from '@/components/ui/textarea'; import { AlertDialog, AlertDialogAction, AlertDialogCancel, AlertDialogContent, AlertDialogDescription, AlertDialogFooter, AlertDialogHeader, AlertDialogTitle, AlertDialogTrigger } from '@/components/ui/alert-dialog'; import { toast } from 'sonner'; import { Loader2, XCircle, AlertTriangle, CheckCircle } from 'lucide-react'; @@ -47,6 +48,7 @@ export default function ApprovalCancel({ const [isCancelling, setIsCancelling] = useState(false); const [error, setError] = useState(null); const [cancelResult, setCancelResult] = useState<{ apInfId: string } | null>(null); + const [cancelOpinion, setCancelOpinion] = useState(''); const fetchApprovalDetail = async () => { if (!apInfId.trim()) { @@ -58,11 +60,12 @@ export default function ApprovalCancel({ setError(null); setApprovalDetail(null); setCancelResult(null); + setCancelOpinion(''); try { const response = await getApprovalDetail(apInfId); - if (response.result === 'SUCCESS') { + if (response.result === 'success') { setApprovalDetail(response.data); } else { setError('결재 정보를 가져오는데 실패했습니다.'); @@ -80,12 +83,17 @@ export default function ApprovalCancel({ const handleCancelApproval = async () => { if (!approvalDetail) return; + if (!cancelOpinion.trim()) { + toast.error('상신취소 의견을 입력해주세요.'); + return; + } + setIsCancelling(true); try { - const response = await cancelApproval(approvalDetail.apInfId); + const response = await cancelApproval(approvalDetail.apInfId, cancelOpinion); - if (response.result === 'SUCCESS') { + if (response.result === 'success') { setCancelResult({ apInfId: response.data.apInfId }); toast.success('결재가 성공적으로 취소되었습니다.'); onCancelSuccess?.(response.data.apInfId); @@ -95,6 +103,9 @@ export default function ApprovalCancel({ ...approvalDetail, status: '4' // 상신취소 }); + + // 의견 초기화 + setCancelOpinion(''); } else { toast.error('결재 취소에 실패했습니다.'); } @@ -288,54 +299,78 @@ export default function ApprovalCancel({ - {/* 취소 버튼 */} + {/* 취소 의견 및 버튼 */} {canCancelApproval(approvalDetail.status) && ( <> -
- - - - - - - 결재 취소 확인 - - 정말로 이 결재를 취소하시겠습니까? -
-
- 결재 ID: {approvalDetail.apInfId} -
- 제목: {approvalDetail.subject} -
-
- 이 작업은 되돌릴 수 없습니다. -
-
- - 취소 - +
+ +