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:
@@ -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}
|
||||
|
||||
Reference in New Issue
Block a user