feat: 기안함/결재함 상세 모달 버튼 분기 및 수정 기능 추가

- 기안함 임시저장 상세: 복제, 상신, 인쇄 버튼 표시
- 기안함 결재대기 이후 상세: 인쇄만 표시
- 결재함 상세: 수정, 반려, 승인, 인쇄 버튼 표시
- 결재함 리스트 작업컬럼 수정 버튼 → 기안함 수정 페이지 이동
- DocumentDetailModal mode/documentStatus 기반 조건부 렌더링

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
byeongcheolryu
2025-12-29 21:14:08 +09:00
parent 388b113b58
commit 0e5307f7a3
5 changed files with 163 additions and 47 deletions

View File

@@ -1,6 +1,7 @@
'use client';
import { useState, useMemo, useCallback, useEffect, useTransition } from 'react';
import { useRouter } from 'next/navigation';
import {
FileCheck,
Check,
@@ -78,6 +79,7 @@ interface InboxSummary {
}
export function ApprovalBox() {
const router = useRouter();
const [isPending, startTransition] = useTransition();
// ===== 상태 관리 =====
@@ -108,8 +110,9 @@ export function ApprovalBox() {
const [totalPages, setTotalPages] = useState(1);
const [isLoading, setIsLoading] = useState(true);
// 통계 데이터
// 통계 데이터 (전체 탭 기준으로 고정 유지)
const [summary, setSummary] = useState<InboxSummary | null>(null);
const [fixedStats, setFixedStats] = useState({ all: 0, pending: 0, approved: 0, rejected: 0 });
// ===== 데이터 로드 =====
const loadData = useCallback(async () => {
@@ -195,15 +198,24 @@ export function ApprovalBox() {
}
}, [selectedItems.size, data]);
// ===== 통계 데이터 (API summary 사용) =====
const stats = useMemo(() => {
return {
all: summary?.total ?? 0,
pending: summary?.pending ?? 0,
approved: summary?.approved ?? 0,
rejected: summary?.rejected ?? 0,
};
}, [summary]);
// ===== 전체 탭일 때만 통계 데이 =====
useEffect(() => {
if (activeTab === 'all' && data.length > 0) {
const pending = data.filter(item => item.status === 'pending').length;
const approved = data.filter(item => item.status === 'approved').length;
const rejected = data.filter(item => item.status === 'rejected').length;
setFixedStats({
all: totalCount,
pending,
approved,
rejected,
});
}
}, [data, totalCount, activeTab]);
// ===== 통계 데이터 (고정 값 사용) =====
const stats = fixedStats;
// ===== 승인/반려 핸들러 =====
const handleApproveClick = useCallback(() => {
@@ -310,10 +322,16 @@ export function ApprovalBox() {
}, []);
const handleModalEdit = useCallback(() => {
// TODO: 수정 페이지로 이동 - 라우터 연동 필요
console.log('[ApprovalBox] 문서 수정 - 라우터 연동 필요:', selectedDocument?.id);
setIsModalOpen(false);
}, [selectedDocument]);
if (selectedDocument) {
router.push(`/ko/approval/draft/new?id=${selectedDocument.id}&mode=edit`);
setIsModalOpen(false);
}
}, [selectedDocument, router]);
// 리스트에서 수정 버튼 클릭 시 핸들러
const handleEditClick = useCallback((item: ApprovalRecord) => {
router.push(`/ko/approval/draft/new?id=${item.id}&mode=edit`);
}, [router]);
const handleModalCopy = useCallback(() => {
// TODO: 문서 복제 API 개발 필요 - POST /api/v1/approvals/{id}/copy
@@ -460,7 +478,8 @@ export function ApprovalBox() {
<Button
variant="ghost"
size="sm"
onClick={() => handleDocumentClick(item)}
onClick={() => handleEditClick(item)}
title="기안함 수정 페이지로 이동"
>
<Edit className="h-4 w-4" />
</Button>
@@ -468,7 +487,7 @@ export function ApprovalBox() {
</TableCell>
</TableRow>
);
}, [selectedItems, toggleSelection, handleDocumentClick]);
}, [selectedItems, toggleSelection, handleDocumentClick, handleEditClick]);
// ===== 모바일 카드 렌더링 =====
const renderMobileCard = useCallback((
@@ -669,6 +688,7 @@ export function ApprovalBox() {
onOpenChange={setIsModalOpen}
documentType={getDocumentType(selectedDocument.approvalType)}
data={convertToModalData(selectedDocument)}
mode="inbox"
onEdit={handleModalEdit}
onCopy={handleModalCopy}
onApprove={handleModalApprove}