import React, { useState, useRef, useEffect } from 'react'; import { EmployeeProjectDetail } from '../../types'; import { Button } from '../ui/button'; import { Card, CardContent, CardHeader, CardTitle } from '../ui/card'; import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow } from '../ui/table'; import { format } from 'date-fns'; import { toast } from 'sonner'; import { Pencil, Trash2, Plus, CalendarRange, Briefcase, Building, Code, AlertCircle, Printer, User, FileDown } from 'lucide-react'; import CustomDialog from '../CustomDialog'; import EmployeeProjectForm from './EmployeeProjectForm'; import { deleteEmployeeProjectDetail, employeeProjectDetailApi } from '../../services/employeeProjectDetailApi'; interface EmployeeProjectListProps { projects: EmployeeProjectDetail[]; employeeId: number; employeeName?: string; onEdit: (projectId: number, data: Partial) => Promise; onAdd: (data: Partial) => Promise; onRefresh: () => void; } // Add a utility component to safely render HTML content const HtmlContent: React.FC<{ html: string }> = ({ html }) => { return (
); }; const EmployeeProjectList: React.FC = ({ projects = [], employeeId, employeeName = '', onEdit, onAdd, onRefresh }) => { const projectsArray = Array.isArray(projects) ? projects : []; // Debug logs console.log('EmployeeProjectList received props:'); console.log('- employeeId:', employeeId); console.log('- employeeName:', employeeName); console.log('- projects count:', projectsArray.length); const [showAddDialog, setShowAddDialog] = useState(false); const [showEditDialog, setShowEditDialog] = useState(false); const [showDeleteDialog, setShowDeleteDialog] = useState(false); const [selectedProject, setSelectedProject] = useState(null); const [deletingId, setDeletingId] = useState(null); const [isProcessing, setIsProcessing] = useState(false); const [printMode, setPrintMode] = useState(false); const printRef = useRef(null); // Store employee name in local state to ensure it's available for printing const [localEmployeeName, setLocalEmployeeName] = useState(employeeName); // Update local state when prop changes useEffect(() => { console.log('Employee name prop changed to:', employeeName); if (employeeName) { setLocalEmployeeName(employeeName); } }, [employeeName]); const handleAdd = async (data: Partial) => { setIsProcessing(true); try { await onAdd(data); setShowAddDialog(false); onRefresh(); toast.success('Project added successfully'); } catch (error) { console.error('Error adding project:', error); toast.error('Failed to add project'); } finally { setIsProcessing(false); } }; const handleEdit = async (data: Partial) => { if (selectedProject?.id) { setIsProcessing(true); try { await onEdit(selectedProject.id, data); setShowEditDialog(false); setSelectedProject(null); onRefresh(); toast.success('Project updated successfully'); } catch (error) { console.error('Error updating project:', error); toast.error('Failed to update project'); } finally { setIsProcessing(false); } } }; const handleDeleteClick = (project: EmployeeProjectDetail) => { setSelectedProject(project); setShowDeleteDialog(true); }; const handleDelete = async () => { if (!selectedProject) return; setIsProcessing(true); setDeletingId(selectedProject.id); try { const result = await employeeProjectDetailApi.delete(selectedProject.id); if (result.success) { toast.success(result.message || 'Project deleted successfully'); setShowDeleteDialog(false); setSelectedProject(null); onRefresh(); } else { toast.error(result.message || 'Failed to delete project'); } } catch (error) { console.error('Error deleting project:', error); toast.error('Failed to delete project'); } finally { setIsProcessing(false); setDeletingId(null); } }; const formatDate = (dateString: string | undefined) => { if (!dateString) return '-'; try { return format(new Date(dateString), 'MMM dd, yyyy'); } catch (error) { return dateString; } }; const handlePrint = () => { setPrintMode(true); // Debug log before printing console.log('Print function called with employeeName:', employeeName); console.log('Print function using localEmployeeName:', localEmployeeName); // Create a new window for printing const printWindow = window.open('', '_blank'); if (printWindow && printRef.current) { // Get the HTML content directly const printContents = printRef.current.innerHTML; const totalProjects = projectsArray.length; printWindow.document.write(` Project History${localEmployeeName ? ' - ' + localEmployeeName : ''} `); printWindow.document.close(); // Add event listeners printWindow.onafterprint = () => { setPrintMode(false); }; printWindow.onunload = () => { setPrintMode(false); }; // Use a longer delay to ensure content is properly rendered setTimeout(() => { // Log to debug console.log(`Preparing to print ${totalProjects} project details`); try { printWindow.focus(); printWindow.print(); } catch (error) { console.error("Print error:", error); setPrintMode(false); } }, 1200); } else { // If window couldn't be opened, reset the state setPrintMode(false); toast.error("Could not open print window. Please check your popup blocker settings."); } }; const handleDownloadAsWord = () => { // Create a Blob with HTML content const htmlContent = ` Project History${localEmployeeName ? ' - ' + localEmployeeName : ''}

${localEmployeeName ? localEmployeeName : 'Employee Project History'}

Project History
Total projects: ${projectsArray.length}

${projectsArray.map(project => `

${project.projectName}

${project.clientCompany}
Duration: ${formatDate(project.startDate)} - ${formatDate(project.endDate)}
Role: ${project.role}
${project.technologiesUsed ? `
Technologies: ${project.technologiesUsed}
` : ''} ${project.projectDetails ? `
Project Details: ${project.projectDetails}
` : ''} ${project.responsibilities ? `
Responsibilities: ${project.responsibilities}
` : ''} ${project.sector ? `
Sector: ${project.sector}
` : ''}
`).join('')} `; const blob = new Blob([htmlContent], { type: 'application/msword' }); const url = URL.createObjectURL(blob); // Create a temporary link to trigger download const link = document.createElement('a'); link.href = url; link.download = `${localEmployeeName ? localEmployeeName.replace(/\s+/g, '_') : 'Employee'}_Project_History.doc`; document.body.appendChild(link); link.click(); // Clean up setTimeout(() => { document.body.removeChild(link); URL.revokeObjectURL(url); }, 100); toast.success("Downloaded as Word document"); }; return (
Project History
{projectsArray.length > 0 && ( <> )}
{projectsArray.length === 0 ? (

No project history found

) : (
Project Name Client Company Duration Role Actions {projectsArray.map((project) => ( {project.projectName} {project.clientCompany}
{formatDate(project.startDate)} - {formatDate(project.endDate)}
{project.role}
))}
)}
{projectsArray.length > 0 && (
{projectsArray.map((project) => (

{project.projectName}

{project.clientCompany}

Duration

{formatDate(project.startDate)} - {formatDate(project.endDate)}

Role

{project.role}
{project.technologiesUsed && (

Technologies

{project.technologiesUsed}
)} {project.projectDetails && (

Project Details

)} {project.responsibilities && (

Responsibilities

)}
))}
)} {/* Add Project Dialog */} setShowAddDialog(false)} title="Add New Project" allowClose={!isProcessing} isPending={isProcessing} > setShowAddDialog(false)} /> {/* Edit Project Dialog */} { setShowEditDialog(false); setSelectedProject(null); }} title="Edit Project" allowClose={!isProcessing} isPending={isProcessing} > {selectedProject && ( { setShowEditDialog(false); setSelectedProject(null); }} /> )} {/* Delete Confirmation Dialog */} { setShowDeleteDialog(false); setSelectedProject(null); }} title="Delete Project" allowClose={!isProcessing} isPending={isProcessing} >

Are you sure you want to delete this project?

This action cannot be undone. This will permanently delete the project "{selectedProject?.projectName}" from the employee's history.

{/* Hidden printable content */}
{projectsArray.map((project) => (

{project.projectName}

{project.clientCompany}
Duration: {formatDate(project.startDate)} - {formatDate(project.endDate)}
Role: {project.role}
{project.technologiesUsed && (
Technologies: {project.technologiesUsed}
)} {project.projectDetails && (
Project Details:
)} {project.responsibilities && (
Responsibilities:
)} {project.sector && (
Sector: {project.sector}
)}
))}
); }; export default EmployeeProjectList;