import React, { useState, useEffect } from 'react'; import api from '../../../api'; const BOMFilesTab = ({ selectedProject, user, bomFiles, setBomFiles, selectedBOM, onBOMSelect, refreshTrigger }) => { const [loading, setLoading] = useState(true); const [error, setError] = useState(''); const [groupedFiles, setGroupedFiles] = useState({}); // 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) => { // TODO: 리비전 업로드 기능 구현 alert('리비전 업로드 기능은 향후 구현 예정입니다.'); }; // 날짜 포맷팅 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