"use client"; import { useState, useEffect, useCallback } from "react"; import { ArrowLeft, Check, Loader2 } from "lucide-react"; import { Button } from "@/components/ui/button"; import { Input } from "@/components/ui/input"; import { Label } from "@/components/ui/label"; import { Select } from "@/components/ui/select"; import { Card, CardContent } from "@/components/ui/card"; import { createEmployee, fetchDepartments, fetchManagerDropdown } from "@/lib/supabase/employees-actions"; import { EMPLOYMENT_TYPE_LABELS, PAY_FREQUENCY_LABELS, type Department } from "@/lib/supabase/employees-types"; import type { EmploymentType, PayFrequency } from "@/lib/supabase/employees-types"; interface FormErrors { [key: string]: string; } export default function EmployeesNewPage({ onBack }: { onBack?: () => void }) { const [step, setStep] = useState(1); const [saving, setSaving] = useState(false); const [error, setError] = useState(null); const [departments, setDepartments] = useState([]); const [managers, setManagers] = useState<{ id: string; first_name: string; last_name: string }[]>([]); const [errors, setErrors] = useState({}); // Personal details const [firstName, setFirstName] = useState(""); const [lastName, setLastName] = useState(""); const [email, setEmail] = useState(""); const [phone, setPhone] = useState(""); const [address, setAddress] = useState(""); // Employment details const [jobTitle, setJobTitle] = useState(""); const [departmentId, setDepartmentId] = useState(""); const [employmentType, setEmploymentType] = useState("full_time"); const [startDate, setStartDate] = useState(""); const [salary, setSalary] = useState(""); const [hourlyRate, setHourlyRate] = useState(""); const [payFrequency, setPayFrequency] = useState("monthly"); const [managerId, setManagerId] = useState(""); useEffect(() => { let cancelled = false; Promise.all([fetchDepartments(), fetchManagerDropdown()]) .then(([depts, mgrs]) => { if (!cancelled) { setDepartments(depts); setManagers(mgrs); } }) .catch(() => {}); return () => { cancelled = true; }; }, []); const validateStep1 = useCallback((): boolean => { const e: FormErrors = {}; if (!firstName.trim()) e.firstName = "First name is required"; if (!lastName.trim()) e.lastName = "Last name is required"; if (!email.trim()) e.email = "Email is required"; else if (!/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(email)) e.email = "Invalid email"; setErrors(e); return Object.keys(e).length === 0; }, [firstName, lastName, email]); const validateStep2 = useCallback((): boolean => { const e: FormErrors = {}; if (!jobTitle.trim()) e.jobTitle = "Job title is required"; if (!startDate) e.startDate = "Start date is required"; if ((employmentType === "full_time" || employmentType === "part_time") && !salary) { e.salary = "Salary is required"; } if ((employmentType === "casual" || employmentType === "contractor") && !hourlyRate) { e.hourlyRate = "Hourly rate is required"; } setErrors(e); return Object.keys(e).length === 0; }, [jobTitle, startDate, employmentType, salary, hourlyRate]); const handleNext = () => { if (validateStep1()) setStep(2); }; const handleSubmit = async () => { if (!validateStep2()) return; setError(null); setSaving(true); try { const result = await createEmployee({ first_name: firstName.trim(), last_name: lastName.trim(), email: email.trim(), phone: phone.trim() || undefined, date_of_birth: undefined, address: address.trim() || undefined, job_title: jobTitle.trim() || undefined, department_id: departmentId || undefined, employment_type: employmentType, start_date: startDate || undefined, salary: salary ? parseFloat(salary) : undefined, hourly_rate: hourlyRate ? parseFloat(hourlyRate) : undefined, pay_frequency: payFrequency, manager_id: managerId || undefined, }); if (!result.success) { setError(result.error || "Failed to create employee"); return; } // Reset form setFirstName(""); setLastName(""); setEmail(""); setPhone(""); setAddress(""); setJobTitle(""); setDepartmentId(""); setEmploymentType("full_time"); setStartDate(""); setSalary(""); setHourlyRate(""); setPayFrequency("monthly"); setManagerId(""); setStep(1); if (onBack) onBack(); } catch (e: any) { setError(e.message || "An unexpected error occurred"); } finally { setSaving(false); } }; return (
{/* Header */}
{onBack && ( )}

Add Employee

Step {step} of 2

{/* Step Indicator */}
{[1, 2].map((s) => (
{s < step ? : s}
{s === 1 ? "Personal details" : "Employment details"}
{s < 2 &&
}
))}
{error && (
{error}
)} {step === 1 && (
setFirstName(e.target.value)} className="mt-1" placeholder="John" /> {errors.firstName &&

{errors.firstName}

}
setLastName(e.target.value)} className="mt-1" placeholder="Doe" /> {errors.lastName &&

{errors.lastName}

}
setEmail(e.target.value)} className="mt-1" placeholder="john@company.com" /> {errors.email &&

{errors.email}

}
setPhone(e.target.value)} className="mt-1" placeholder="+61 400 000 000" />
setAddress(e.target.value)} className="mt-1" placeholder="123 Main St, Sydney NSW 2000" />
)} {step === 2 && (
setJobTitle(e.target.value)} className="mt-1" placeholder="Software Engineer" /> {errors.jobTitle &&

{errors.jobTitle}

}
setStartDate(e.target.value)} className="mt-1" /> {errors.startDate &&

{errors.startDate}

}
{(employmentType === "full_time" || employmentType === "part_time") && (
setSalary(e.target.value)} className="mt-1" placeholder="85000" /> {errors.salary &&

{errors.salary}

}
)} {(employmentType === "casual" || employmentType === "contractor") && (
setHourlyRate(e.target.value)} className="mt-1" placeholder="35.00" /> {errors.hourlyRate &&

{errors.hourlyRate}

}
)}
{managers.length > 0 && (
)}
)} {/* Actions */}
{step === 2 && ( )}
{step === 1 ? ( ) : ( )}
); }