"use client"; import React, { useState, useEffect } from 'react'; import { useTranslation } from "react-i18next"; import { Dialog, DialogTitle, DialogContent, DialogActions, Button, Table, TableBody, TableCell, TableContainer, TableHead, TableRow, Paper, Chip, Typography, } from '@mui/material'; import DownloadIcon from '@mui/icons-material/Download'; import { fetchSemiFGItemCodes, fetchSemiFGItemCodesWithCategory, generateSemiFGProductionAnalysisReport, generateSemiFGProductionAnalysisReportExcel, ItemCodeWithCategory, } from './semiFGProductionAnalysisApi'; interface SemiFGProductionAnalysisReportProps { criteria: Record; requiredFieldLabels: string[]; loading: boolean; setLoading: (loading: boolean) => void; reportTitle?: string; onExportSuccess?: (format: "pdf" | "excel") => void; } export default function SemiFGProductionAnalysisReport({ criteria, requiredFieldLabels, loading, setLoading, reportTitle = '成品/半成品生產分析報告', onExportSuccess, }: SemiFGProductionAnalysisReportProps) { const { t } = useTranslation("report"); const [showConfirmDialog, setShowConfirmDialog] = useState(false); const [selectedItemCodesInfo, setSelectedItemCodesInfo] = useState([]); const [itemCodesWithCategory, setItemCodesWithCategory] = useState>({}); const [exportFormat, setExportFormat] = useState<'pdf' | 'excel'>('pdf'); // Fetch item codes with category when stockCategory changes useEffect(() => { const stockCategory = criteria.stockCategory || ''; if (stockCategory) { fetchSemiFGItemCodesWithCategory(stockCategory) .then((items) => { const categoryMap: Record = {}; items.forEach((item) => { categoryMap[item.code] = item; }); setItemCodesWithCategory((prev) => ({ ...prev, ...categoryMap })); }) .catch((error) => { console.error('Failed to fetch item codes with category:', error); }); } }, [criteria.stockCategory]); const handleExportClick = async (format: 'pdf' | 'excel') => { setExportFormat(format); // Validate required fields if (requiredFieldLabels.length > 0) { alert(t('missingRequired', { fields: requiredFieldLabels.join('\n- ') })); return; } // If no itemCode is selected, export directly without confirmation if (!criteria.itemCode) { await executeExport(format); return; } // If itemCode is selected, show confirmation dialog const selectedCodes = criteria.itemCode.split(',').filter((code) => code.trim()); const itemCodesInfo: ItemCodeWithCategory[] = selectedCodes.map((code) => { const codeTrimmed = code.trim(); const categoryInfo = itemCodesWithCategory[codeTrimmed]; return { code: codeTrimmed, category: categoryInfo?.category || 'Unknown', name: categoryInfo?.name || '', }; }); setSelectedItemCodesInfo(itemCodesInfo); setShowConfirmDialog(true); }; const executeExport = async (format: 'pdf' | 'excel' = exportFormat) => { setLoading(true); try { if (format === 'excel') { await generateSemiFGProductionAnalysisReportExcel(criteria, reportTitle); } else { await generateSemiFGProductionAnalysisReport(criteria, reportTitle); } onExportSuccess?.(format); setShowConfirmDialog(false); } catch (error) { console.error('Failed to generate report:', error); alert(t('generateError')); } finally { setLoading(false); } }; return ( <>
{/* Confirmation Dialog for 成品/半成品生產分析報告 */} setShowConfirmDialog(false)} maxWidth="md" fullWidth > {t('semiFgConfirmTitle')} {t('semiFgConfirmHint')} {t('semiFgColItem')} {t('semiFgColCategory')} {selectedItemCodesInfo.map((item, index) => { const displayName = item.name ? `${item.code} ${item.name}` : item.code; return ( {displayName} ); })}
); }