파일 삭제기능 구현
This commit is contained in:
@@ -1521,6 +1521,58 @@ export const InteractiveDataTable: React.FC<InteractiveDataTableProps> = ({
|
||||
}
|
||||
}, []);
|
||||
|
||||
// 🗑️ 연결된 파일 삭제 함수
|
||||
const handleDeleteLinkedFile = useCallback(
|
||||
async (fileId: string, fileName: string) => {
|
||||
try {
|
||||
console.log("🗑️ 파일 삭제 시작:", { fileId, fileName });
|
||||
|
||||
// 삭제 확인 다이얼로그
|
||||
if (!confirm(`"${fileName}" 파일을 삭제하시겠습니까?`)) {
|
||||
return;
|
||||
}
|
||||
|
||||
// API 호출로 파일 삭제 (논리적 삭제) - apiClient 사용으로 JWT 토큰 자동 추가
|
||||
const apiClient = (await import("@/lib/api/client")).apiClient;
|
||||
const response = await apiClient.delete(`/files/${fileId}`, {
|
||||
data: {
|
||||
writer: "current_user", // 현재 사용자 정보
|
||||
},
|
||||
});
|
||||
|
||||
const result = response.data;
|
||||
console.log("📡 파일 삭제 API 응답:", result);
|
||||
|
||||
if (!result.success) {
|
||||
throw new Error(result.message || "파일 삭제 실패");
|
||||
}
|
||||
|
||||
// 성공 메시지
|
||||
toast.success(`"${fileName}" 파일이 삭제되었습니다.`);
|
||||
|
||||
// 파일 목록 새로고침
|
||||
if (showFileManagementModal && selectedRowForFiles && component.tableName) {
|
||||
const primaryKeyField = Object.keys(selectedRowForFiles)[0];
|
||||
const recordId = selectedRowForFiles[primaryKeyField];
|
||||
|
||||
try {
|
||||
const response = await getLinkedFiles(component.tableName, recordId);
|
||||
setLinkedFiles(response.files || []);
|
||||
console.log("📁 파일 목록 새로고침 완료:", response.files?.length || 0);
|
||||
} catch (error) {
|
||||
console.error("파일 목록 새로고침 실패:", error);
|
||||
}
|
||||
}
|
||||
|
||||
console.log("✅ 파일 삭제 완료:", fileName);
|
||||
} catch (error) {
|
||||
console.error("❌ 파일 삭제 실패:", error);
|
||||
toast.error(`"${fileName}" 파일 삭제에 실패했습니다.`);
|
||||
}
|
||||
},
|
||||
[showFileManagementModal, selectedRowForFiles, component.tableName],
|
||||
);
|
||||
|
||||
// 셀 값 포맷팅
|
||||
const formatCellValue = (value: any, column: DataTableColumn, rowData?: Record<string, any>): React.ReactNode => {
|
||||
// 가상 파일 컬럼의 경우 value가 없어도 파일 아이콘을 표시해야 함
|
||||
@@ -2301,6 +2353,16 @@ export const InteractiveDataTable: React.FC<InteractiveDataTableProps> = ({
|
||||
>
|
||||
<Download className="h-4 w-4" />
|
||||
</Button>
|
||||
|
||||
{/* 🗑️ 파일 삭제 버튼 */}
|
||||
<Button
|
||||
size="sm"
|
||||
variant="outline"
|
||||
onClick={() => handleDeleteLinkedFile(file.objid, file.realFileName)}
|
||||
className="text-red-500 hover:bg-red-50 hover:text-red-700"
|
||||
>
|
||||
<Trash2 className="h-4 w-4" />
|
||||
</Button>
|
||||
</div>
|
||||
</div>
|
||||
))}
|
||||
|
||||
@@ -239,8 +239,9 @@ export function FileUpload({ component, onUpdateComponent, onFileUpload, userInf
|
||||
|
||||
const formData = new FormData();
|
||||
formData.append("files", file);
|
||||
formData.append("docType", fileConfig.docType);
|
||||
formData.append("docTypeName", fileConfig.docTypeName);
|
||||
// 🎯 컴포넌트 ID를 doc_type으로 사용하여 파일 컴포넌트별로 구분
|
||||
formData.append("docType", component.id);
|
||||
formData.append("docTypeName", component.label || fileConfig.docTypeName);
|
||||
|
||||
// 🎯 최신 사용자 정보 참조 (ref를 통해 실시간 값 접근)
|
||||
const currentUser = userRef.current;
|
||||
@@ -487,22 +488,14 @@ export function FileUpload({ component, onUpdateComponent, onFileUpload, userInf
|
||||
const deleteFile = async (fileInfo: AttachedFileInfo) => {
|
||||
console.log("🗑️ 파일 삭제:", fileInfo.realFileName);
|
||||
try {
|
||||
// 실제 API 호출 (논리적 삭제)
|
||||
const response = await fetch(`/api/files/${fileInfo.objid}`, {
|
||||
method: "DELETE",
|
||||
headers: {
|
||||
"Content-Type": "application/json",
|
||||
},
|
||||
body: JSON.stringify({
|
||||
// 실제 API 호출 (논리적 삭제) - apiClient 사용으로 JWT 토큰 자동 추가
|
||||
const response = await apiClient.delete(`/files/${fileInfo.objid}`, {
|
||||
data: {
|
||||
writer: fileInfo.writer || "current_user",
|
||||
}),
|
||||
},
|
||||
});
|
||||
|
||||
if (!response.ok) {
|
||||
throw new Error(`파일 삭제 실패: ${response.status}`);
|
||||
}
|
||||
|
||||
const result = await response.json();
|
||||
const result = response.data;
|
||||
console.log("📡 파일 삭제 API 응답:", result);
|
||||
|
||||
if (!result.success) {
|
||||
|
||||
Reference in New Issue
Block a user