import React, { useState, useEffect } from 'react'; import api from '../../../api'; import RevisionUploadDialog from '../../RevisionUploadDialog'; const BOMFilesTab = ({ selectedProject, user, bomFiles, setBomFiles, selectedBOM, onBOMSelect, refreshTrigger }) => { const [loading, setLoading] = useState(true); const [error, setError] = useState(''); const [groupedFiles, setGroupedFiles] = useState({}); const [revisionDialog, setRevisionDialog] = useState({ open: false, parentFile: null }); // BOM 파일 목록 로드 useEffect(() => { const loadBOMFiles = async () => { if (!selectedProject) return; try { setLoading(true); setError(''); const projectCode = selectedProject.official_project_code || selectedProject.job_no; const encodedProjectCode = encodeURIComponent(projectCode); const response = await api.get(`/files/project/${encodedProjectCode}`); const files = response.data || []; setBomFiles(files); // BOM 이름별로 그룹화 const groups = groupFilesByBOM(files); setGroupedFiles(groups); } catch (err) { console.error('BOM 파일 로드 실패:', err); setError('BOM 파일을 불러오는데 실패했습니다.'); } finally { setLoading(false); } }; loadBOMFiles(); }, [selectedProject, refreshTrigger, setBomFiles]); // 파일을 BOM 이름별로 그룹화 const groupFilesByBOM = (fileList) => { const groups = {}; fileList.forEach(file => { const bomName = file.bom_name || file.original_filename; if (!groups[bomName]) { groups[bomName] = []; } groups[bomName].push(file); }); // 각 그룹 내에서 리비전 번호로 정렬 Object.keys(groups).forEach(bomName => { groups[bomName].sort((a, b) => { const revA = parseInt(a.revision?.replace('Rev.', '') || '0'); const revB = parseInt(b.revision?.replace('Rev.', '') || '0'); return revB - revA; // 최신 리비전이 위로 }); }); return groups; }; // BOM 선택 처리 const handleBOMClick = (bomFile) => { if (onBOMSelect) { onBOMSelect(bomFile); } }; // 파일 삭제 const handleDeleteFile = async (fileId, bomName) => { if (!window.confirm(`이 파일을 삭제하시겠습니까?`)) { return; } try { await api.delete(`/files/delete/${fileId}`); // 파일 목록 새로고침 const projectCode = selectedProject.official_project_code || selectedProject.job_no; const encodedProjectCode = encodeURIComponent(projectCode); const response = await api.get(`/files/project/${encodedProjectCode}`); const files = response.data || []; setBomFiles(files); setGroupedFiles(groupFilesByBOM(files)); } catch (err) { console.error('파일 삭제 실패:', err); setError('파일 삭제에 실패했습니다.'); } }; // 리비전 업로드 const handleRevisionUpload = (parentFile) => { console.log('🔄 리비전 업로드 시작:', parentFile); setRevisionDialog({ open: true, parentFile }); }; // 리비전 업로드 성공 처리 const handleRevisionUploadSuccess = async (uploadResult) => { console.log('✅ 리비전 업로드 성공:', uploadResult); // BOM 파일 목록 새로고침 try { const projectCode = selectedProject.official_project_code || selectedProject.job_no; const encodedProjectCode = encodeURIComponent(projectCode); const response = await api.get(`/files/project/${encodedProjectCode}`); const files = response.data || []; setBomFiles(files); setGroupedFiles(groupFilesByBOM(files)); // 성공 메시지 표시 (선택사항) console.log(`새 리비전 ${uploadResult.revision} 업로드 완료!`); } catch (err) { console.error('파일 목록 새로고침 실패:', err); setError('파일 목록을 새로고침하는데 실패했습니다.'); } }; // 날짜 포맷팅 const formatDate = (dateString) => { if (!dateString) return 'N/A'; try { return new Date(dateString).toLocaleDateString('ko-KR'); } catch { return dateString; } }; if (loading) { return (
Upload your first BOM file using the Upload tab
Select a BOM file to manage its materials