import { Input } from '@/Components/ui/input'; import { Label } from '@/Components/ui/label'; import { Textarea } from '@/Components/ui/textarea'; import { Card, CardContent, CardHeader, CardTitle } from '@/Components/ui/card'; import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue, } from '@/Components/ui/select'; import { Button } from '@/Components/ui/button'; import { ChevronDown, ChevronUp, Building2, Search, CheckCircle2 } from 'lucide-react'; import { Dialog, DialogContent, DialogHeader, DialogTitle, DialogTrigger, DialogFooter } from '@/Components/ui/dialog'; import { Avatar, AvatarFallback, AvatarImage } from '@/Components/ui/avatar'; import { Badge } from '@/Components/ui/badge'; import { useEffect, useMemo, useState } from 'react'; const MAIN_CONTRACTOR = 'Great SwissMetal Builders Corporation'; interface Employee { id: number; ulid: string; name: string; email?: string; employee_profile?: { department?: string; position?: string; phone?: string; }; } function ProjectManagerLookup({ employees, selectedId, onSelect }: { employees: Employee[], selectedId: string, onSelect: (id: string) => void }) { const [open, setOpen] = useState(false); const [search, setSearch] = useState(''); const [tempSelectedId, setTempSelectedId] = useState(selectedId); const filteredEmployees = useMemo(() => { if (!search) return employees; const lowerSearch = search.toLowerCase(); return employees.filter(e => e.name.toLowerCase().includes(lowerSearch) || (e.email && e.email.toLowerCase().includes(lowerSearch)) || (e.employee_profile?.position && e.employee_profile.position.toLowerCase().includes(lowerSearch)) ); }, [employees, search]); const handleConfirm = () => { onSelect(tempSelectedId); setOpen(false); }; const handleOpenChange = (newOpen: boolean) => { setOpen(newOpen); if (newOpen) { setTempSelectedId(selectedId); setSearch(''); } }; const selectedEmployee = employees.find(e => e.ulid === selectedId); return ( <> Select Project Manager
setSearch(e.target.value)} className="pl-9 bg-background" />
{filteredEmployees.length === 0 ? (
No project managers found matching your search.
) : (
{filteredEmployees.map((emp) => { const isSelected = tempSelectedId === emp.ulid; return (
setTempSelectedId(emp.ulid)} className={`flex items-start gap-3 p-3 rounded-lg border cursor-pointer transition-colors ${ isSelected ? 'border-primary bg-primary/5 ring-1 ring-primary' : 'border-border hover:bg-accent/50' }`} > {emp.name.substring(0, 2).toUpperCase()}

{emp.name}

{isSelected && }

{emp.email || 'No email provided'}

{emp.employee_profile?.position && ( {emp.employee_profile.position} )}
); })}
)}
); } export interface ProjectFormData { name: string; client_name: string; location: string; start_date: string; target_end_date: string; contract_duration: string; // Additional details description: string; pm_id: string; contract_value: string; } interface Props { data: ProjectFormData; setData: (key: K, value: ProjectFormData[K]) => void; errors: Partial>; employees: Employee[]; } export function ProjectForm({ data, setData, errors, employees }: Props) { const [showAdvanced, setShowAdvanced] = useState(false); const employeeSelectItems = useMemo( () => employees.map(e => ({ value: e.ulid, label: e.name })), [employees], ); // Auto-calculate contract duration when both dates are set useEffect(() => { if (data.start_date && data.target_end_date) { const start = new Date(data.start_date); const end = new Date(data.target_end_date); const diffMs = end.getTime() - start.getTime(); if (diffMs >= 0) { const days = Math.round(diffMs / (1000 * 60 * 60 * 24)) + 1; // inclusive of start & end setData('contract_duration', String(days)); } } }, [data.start_date, data.target_end_date]); return (
{/* Primary Fields — 1.1 to 1.7 */} Project Information {/* 1.1 Project Name */}
setData('name', e.target.value)} placeholder="e.g., Construction of FGEN-PPA Access Road" /> {errors.name &&

{errors.name}

}
{/* 1.2 Project Location */}
setData('location', e.target.value)} placeholder="e.g., Bolbok, Batangas City" />
{/* 1.3 Client */}
setData('client_name', e.target.value)} placeholder="e.g., First Gen Corporation" />
{/* 1.4 Main Contractor — Hard-coded */}
{MAIN_CONTRACTOR}
{/* 1.5 & 1.6 — Start Date / Project Completion */}
setData('start_date', e.target.value)} />
setData('target_end_date', e.target.value)} /> {errors.target_end_date &&

{errors.target_end_date}

}
{/* 1.7 Contract Duration */}
setData('contract_duration', e.target.value)} className="max-w-[140px]" placeholder="0" /> days
{data.start_date && data.target_end_date && (

Auto-calculated from dates. You can override manually.

)}
{/* Collapsible Additional Details */} setShowAdvanced(!showAdvanced)} >
Additional Details
{showAdvanced && ( {/* Description */}