import { useState, useMemo } from 'react'; import { Dialog, DialogContent, DialogHeader, DialogTitle, DialogDescription } from '@/Components/ui/dialog'; import { Input } from '@/Components/ui/input'; import { Button } from '@/Components/ui/button'; import { Badge } from '@/Components/ui/badge'; import { Search, Users, Check } from 'lucide-react'; interface Skill { id: number; ulid: string; name: string; } interface Labor { id: number; ulid: string; name: string; category: 'skilled' | 'unskilled'; hourly_rate: string; skills: Skill[]; } interface Props { open: boolean; onOpenChange: (open: boolean) => void; labors: Labor[]; onSelectLabor: (labor: Labor) => void; selectedLaborUlid?: string; } export default function LaborLookupModal({ open, onOpenChange, labors, onSelectLabor, selectedLaborUlid }: Props) { const [search, setSearch] = useState(''); const [categoryFilter, setCategoryFilter] = useState<'all' | 'skilled' | 'unskilled'>('all'); const formatCurrency = (v: string | number) => { return new Intl.NumberFormat('en-PH', { style: 'currency', currency: 'PHP' }).format(Number(v)); }; const filteredLabors = useMemo(() => { return labors.filter(labor => { // Category filter if (categoryFilter !== 'all' && labor.category !== categoryFilter) { return false; } // Search filter if (!search) return true; const query = search.toLowerCase(); const matchesName = labor.name.toLowerCase().includes(query); const matchesCategory = labor.category.toLowerCase().includes(query); const matchesSkills = labor.skills && labor.skills.some(skill => skill.name.toLowerCase().includes(query) ); return matchesName || matchesCategory || matchesSkills; }); }, [labors, search, categoryFilter]); return ( Select Labor Record Search and select a labor trade category to allocate to the project task.
{/* Category Tabs */}
{/* Search Input */}
setSearch(e.target.value)} />
{filteredLabors.length === 0 ? (
No labor records found matching "{search}".
) : (
{filteredLabors.map(labor => { const isSelected = selectedLaborUlid === labor.ulid; return ( onSelectLabor(labor)} > ); })}
Labor Record Category Skills Hourly Rate
{labor.name} {isSelected && ( Selected )}
{labor.category}
{labor.skills && labor.skills.length > 0 ? ( labor.skills.map(skill => ( {skill.name} )) ) : ( No skills listed )}
{formatCurrency(labor.hourly_rate)}/hr
)}
); }