import React, { useState, useEffect } from 'react'; import { EmployeeProjectDetail } from '../../types'; import { Button } from '../ui/button'; import { Input } from '../ui/input'; import { Textarea } from '../ui/textarea'; import { Card, CardContent, CardHeader, CardTitle } from '../ui/card'; import { Label } from '../ui/label'; import { format, parse } from 'date-fns'; import { toast } from 'sonner'; import { SlateRichTextEditor } from '@/components/custom/SlateRichTextEditor'; interface EmployeeProjectFormProps { project?: EmployeeProjectDetail; employeeId: number; onSubmit: (data: Partial) => Promise; onCancel: () => void; } const EmployeeProjectForm: React.FC = ({ project, employeeId, onSubmit, onCancel }) => { const isEditing = !!project; const [formData, setFormData] = useState>({ employeeId: employeeId, projectName: '', clientCompany: '', startDate: format(new Date(), 'yyyy-MM-dd'), endDate: format(new Date(), 'yyyy-MM-dd'), technologiesUsed: '', role: '', responsibilities: '', projectDetails: '', sector: '' }); // Track rich text values separately to ensure proper re-rendering const [responsibilitiesValue, setResponsibilitiesValue] = useState(''); const [projectDetailsValue, setProjectDetailsValue] = useState(''); const [loading, setLoading] = useState(false); const [errors, setErrors] = useState>({}); useEffect(() => { if (project) { setFormData({ ...project, startDate: project.startDate ? project.startDate.substring(0, 10) : format(new Date(), 'yyyy-MM-dd'), endDate: project.endDate ? project.endDate.substring(0, 10) : format(new Date(), 'yyyy-MM-dd') }); // Set rich text field values setResponsibilitiesValue(project.responsibilities || ''); setProjectDetailsValue(project.projectDetails || ''); console.log('Loaded project for editing:', { responsibilities: project.responsibilities, projectDetails: project.projectDetails }); } }, [project]); const handleChange = (e: React.ChangeEvent) => { const { name, value } = e.target; setFormData(prev => ({ ...prev, [name]: value })); // Clear error when field is edited if (errors[name]) { setErrors(prev => ({ ...prev, [name]: '' })); } }; const handleRichTextChange = (field: string, value: string) => { // Update form data setFormData(prev => ({ ...prev, [field]: value })); // Also update the specific field state for re-rendering if (field === 'responsibilities') { setResponsibilitiesValue(value); } else if (field === 'projectDetails') { setProjectDetailsValue(value); } // Clear error if present if (errors[field]) { setErrors(prev => ({ ...prev, [field]: '' })); } }; const validateForm = (): boolean => { const newErrors: Record = {}; if (!formData.projectName?.trim()) { newErrors.projectName = 'Project name is required'; } if (!formData.clientCompany?.trim()) { newErrors.clientCompany = 'Client company is required'; } if (!formData.role?.trim()) { newErrors.role = 'Role is required'; } if (!formData.startDate) { newErrors.startDate = 'Start date is required'; } if (!formData.endDate) { newErrors.endDate = 'End date is required'; } if (formData.startDate && formData.endDate && new Date(formData.startDate) > new Date(formData.endDate)) { newErrors.endDate = 'End date must be after start date'; } setErrors(newErrors); return Object.keys(newErrors).length === 0; }; // Format a date string to UTC ISO format required by PostgreSQL const formatDateToUTC = (dateString: string): string => { // Parse the date in format 'yyyy-MM-dd' to a Date object const [year, month, day] = dateString.split('-').map(Number); // Create a new Date object with UTC time const date = new Date(Date.UTC(year, month - 1, day)); // Return ISO string with time component set to midnight UTC return date.toISOString(); }; const handleSubmit = async (e: React.FormEvent) => { e.preventDefault(); if (!validateForm()) { toast.error('Please correct the errors in the form'); return; } setLoading(true); try { // Create a copy of form data with properly formatted dates const formattedData = { ...formData, // Format dates as UTC ISO strings for PostgreSQL timestamp with time zone startDate: formData.startDate ? formatDateToUTC(formData.startDate as string) : undefined, endDate: formData.endDate ? formatDateToUTC(formData.endDate as string) : undefined }; await onSubmit(formattedData); toast.success(`Project ${isEditing ? 'updated' : 'created'} successfully`); } catch (error) { console.error('Error submitting form:', error); toast.error(`Failed to ${isEditing ? 'update' : 'create'} project`); } finally { setLoading(false); } }; return ( {isEditing ? 'Edit Project' : 'Add New Project'}
{errors.projectName &&

{errors.projectName}

}
{errors.clientCompany &&

{errors.clientCompany}

}
{errors.startDate &&

{errors.startDate}

}
{errors.endDate &&

{errors.endDate}

}
{errors.role &&

{errors.role}

}
handleRichTextChange('projectDetails', value)} placeholder="Describe project details, objectives, and achievements" minHeight="150px" />
handleRichTextChange('responsibilities', value)} placeholder="Describe your responsibilities in this project" minHeight="150px" />
); }; export default EmployeeProjectForm;