summaryrefslogtreecommitdiff
path: root/components/knox/approval/ApprovalDetail.tsx
diff options
context:
space:
mode:
authorjoonhoekim <26rote@gmail.com>2025-07-28 12:10:39 +0000
committerjoonhoekim <26rote@gmail.com>2025-07-28 12:10:39 +0000
commit75249e6fa46864f49d4eb91bd755171b6b65eaae (patch)
treef2c021f0fe10b3513d29f05ca15b82e460d79d20 /components/knox/approval/ApprovalDetail.tsx
parentc228a89c2834ee63b209bad608837c39643f350e (diff)
(김준회) 공통모듈 - Knox 결재 모듈 구현, 유저 선택기 구현, 상신 결재 저장을 위한 DB 스키마 및 서비스 추가, spreadjs 라이센스 환경변수 통일, 유저 테이블에 epId 컬럼 추가
Diffstat (limited to 'components/knox/approval/ApprovalDetail.tsx')
-rw-r--r--components/knox/approval/ApprovalDetail.tsx58
1 files changed, 39 insertions, 19 deletions
diff --git a/components/knox/approval/ApprovalDetail.tsx b/components/knox/approval/ApprovalDetail.tsx
index 6db43cbe..d6c883cb 100644
--- a/components/knox/approval/ApprovalDetail.tsx
+++ b/components/knox/approval/ApprovalDetail.tsx
@@ -14,12 +14,37 @@ import { Loader2, Search, FileText, Clock, User, AlertCircle } from 'lucide-reac
import { getApprovalDetail, getApprovalContent } from '@/lib/knox-api/approval/approval';
import type { ApprovalDetailResponse, ApprovalContentResponse, ApprovalLine } from '@/lib/knox-api/approval/approval';
-// Mock 데이터
-import { mockApprovalAPI, getStatusText, getRoleText, getApprovalStatusText } from './mocks/approval-mock';
+// 상태/역할 텍스트 매핑 (mock util 대체)
+const getStatusText = (status: string) => {
+ const map: Record<string, string> = {
+ '-3': '암호화실패',
+ '-2': '암호화중',
+ '-1': '예약상신',
+ '0': '보류',
+ '1': '진행중',
+ '2': '완결',
+ '3': '반려',
+ '4': '상신취소',
+ '5': '전결',
+ '6': '후완결',
+ };
+ return map[status] || status;
+};
+
+const getRoleText = (role: string) => {
+ const map: Record<string, string> = {
+ '0': '기안',
+ '1': '결재',
+ '2': '합의',
+ '3': '후결',
+ '4': '병렬합의',
+ '7': '병렬결재',
+ '9': '통보',
+ };
+ return map[role] || role;
+};
interface ApprovalDetailProps {
- useFakeData?: boolean;
- systemId?: string;
initialApInfId?: string;
}
@@ -38,8 +63,6 @@ interface ApprovalAttachment {
}
export default function ApprovalDetail({
- useFakeData = false,
- systemId = 'EVCP_SYSTEM',
initialApInfId = ''
}: ApprovalDetailProps) {
const [apInfId, setApInfId] = useState(initialApInfId);
@@ -59,12 +82,8 @@ export default function ApprovalDetail({
try {
const [detailResponse, contentResponse] = await Promise.all([
- useFakeData
- ? mockApprovalAPI.getApprovalDetail(id)
- : getApprovalDetail(id, systemId),
- useFakeData
- ? mockApprovalAPI.getApprovalContent(id)
- : getApprovalContent(id, systemId)
+ getApprovalDetail(id),
+ getApprovalContent(id)
]);
if (detailResponse.result === 'SUCCESS' && contentResponse.result === 'SUCCESS') {
@@ -146,11 +165,11 @@ export default function ApprovalDetail({
// 2) fileId + 별도 엔드포인트 조합 (가이드에 명시되지 않았으므로 best-effort 처리)
if (attachment.fileId) {
- const url = `${process.env.KNOX_API_BASE_URL}/approval/api/v2.0/attachments/${attachment.fileId}`;
+ const url = `${process.env.NEXT_PUBLIC_KNOX_API_BASE_URL || ''}/approval/api/v2.0/attachments/${attachment.fileId}`;
const resp = await fetch(url, {
method: 'GET',
headers: {
- 'System-ID': systemId,
+ 'System-ID': process.env.NEXT_PUBLIC_KNOX_SYSTEM_ID || '',
},
});
if (!resp.ok) throw new Error('다운로드 실패');
@@ -177,17 +196,17 @@ export default function ApprovalDetail({
if (initialApInfId) {
fetchApprovalDetail(initialApInfId);
}
- }, [initialApInfId, useFakeData, systemId]);
+ }, [initialApInfId]);
return (
- <Card className="w-full max-w-6xl">
+ <Card className="w-full max-w-5xl">
<CardHeader>
<CardTitle className="flex items-center gap-2">
<FileText className="w-5 h-5" />
결재 상세 조회
</CardTitle>
<CardDescription>
- 결재 ID를 입력하여 상세 정보를 조회합니다. {useFakeData && '(테스트 모드)'}
+ 결재 ID를 입력하여 상세 정보를 조회합니다.
</CardDescription>
</CardHeader>
@@ -354,7 +373,7 @@ export default function ApprovalDetail({
<div className="mt-1">
<Badge variant={apln.aplnStatsCode === '1' ? 'default' :
apln.aplnStatsCode === '2' ? 'destructive' : 'outline'}>
- {getApprovalStatusText(apln.aplnStatsCode)}
+ {getStatusText(apln.aplnStatsCode)}
</Badge>
</div>
</div>
@@ -384,7 +403,8 @@ export default function ApprovalDetail({
<h3 className="text-lg font-semibold">첨부파일</h3>
<div className="space-y-2">
- {approvalData.detail.attachments.map((attachment: ApprovalAttachment, index: number) => (
+ {/* eslint-disable-next-line @typescript-eslint/no-explicit-any */}
+ {approvalData.detail.attachments.map((attachment: any, index: number) => (
<div key={index} className="flex items-center gap-3 p-3 bg-gray-50 rounded-lg">
<FileText className="w-4 h-4 text-gray-500" />
<div className="flex-1">