import React, { useState, useRef, useEffect } from "react"; import { Check, ChevronsUpDown, Search, X } from "lucide-react"; import { Button } from "@/components/ui/button"; import { Input } from "@/components/ui/input"; import { Avatar, AvatarFallback } from "@/components/ui/avatar"; import { cn } from "@/lib/utils"; import { Employee } from "@/types"; interface EmployeeSelectorProps { employees: Employee[]; selectedEmployeeId: string; onSelect: (employeeId: string) => void; placeholder?: string; disabled?: boolean; className?: string; } const EmployeeSelector = ({ employees, selectedEmployeeId, onSelect, placeholder = "Select an employee", disabled = false, className }: EmployeeSelectorProps) => { const [isOpen, setIsOpen] = useState(false); const [searchQuery, setSearchQuery] = useState(""); const dropdownRef = useRef(null); // Find the currently selected employee const selected = employees.find(employee => employee.id.toString() === selectedEmployeeId); // Get full name of employee const getFullName = (employee: Employee): string => { return [employee.firstName, employee.middleName, employee.lastName] .filter(Boolean) .join(" "); }; // Get initials for avatar const getInitials = (employee: Employee): string => { return `${employee.firstName.charAt(0)}${employee.lastName.charAt(0)}`.toUpperCase(); }; // Filter employees based on search query const filteredEmployees = employees.filter(employee => { const fullName = getFullName(employee).toLowerCase(); const query = searchQuery.toLowerCase(); return ( fullName.includes(query) || employee.email.toLowerCase().includes(query) || employee.empCode.toLowerCase().includes(query) ); }); // Handle click outside to close dropdown useEffect(() => { function handleClickOutside(event: MouseEvent) { if (dropdownRef.current && !dropdownRef.current.contains(event.target as Node)) { setIsOpen(false); } } document.addEventListener("mousedown", handleClickOutside); return () => { document.removeEventListener("mousedown", handleClickOutside); }; }, []); // Handle selecting an employee const handleSelectEmployee = (employeeId: string) => { onSelect(employeeId); setIsOpen(false); setSearchQuery(""); }; // Handle clearing selection const handleClearSelection = (e: React.MouseEvent) => { e.stopPropagation(); onSelect(""); }; return (
)}
{isOpen && (
setSearchQuery(e.target.value)} onClick={(e) => e.stopPropagation()} />
{filteredEmployees.length === 0 ? (
No employees found
) : ( filteredEmployees.map(employee => (
handleSelectEmployee(employee.id.toString())} >
{getInitials(employee)}

{getFullName(employee)}

{employee.email} • {employee.empCode}

{employee.id.toString() === selectedEmployeeId && ( )}
)) )}
)} ); }; export default EmployeeSelector;