import React, { useState, useEffect, useMemo } from 'react'; import { Head, Link, router } from '@inertiajs/react'; import EmployerLayout from '../../Layouts/EmployerLayout'; import { useTranslation } from '../../lib/LanguageContext'; import { MessageSquare, UserCheck, Search, Filter, MoreHorizontal, MapPin, Briefcase, Home, Globe2, Plane } from 'lucide-react'; import { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuLabel, DropdownMenuSeparator, DropdownMenuTrigger } from '@/components/ui/dropdown-menu'; import FilterDrawer, { FilterSection, FilterSelect, FilterInput, FilterChips } from '../../Components/Employer/FilterDrawer'; export default function SelectedCandidates({ selectedWorkers }) { const { t } = useTranslation(); const [workers, setWorkers] = useState((selectedWorkers || []).filter(w => w.status !== 'Searching')); const [searchTerm, setSearchTerm] = useState(''); // Drawer state const [drawerOpen, setDrawerOpen] = useState(false); // Filter States const [filterLocation, setFilterLocation] = useState(''); const [filterJobType, setFilterJobType] = useState('All'); const [filterAccommodation, setFilterAccommodation] = useState('All'); const [filterNationality, setFilterNationality] = useState('All'); const [filterInCountry, setFilterInCountry] = useState('All'); const [filterVisaType, setFilterVisaType] = useState('All'); useEffect(() => { setWorkers((selectedWorkers || []).filter(w => w.status !== 'Searching')); }, [selectedWorkers]); const changeStatus = (id, newStatus) => { setWorkers(workers.map(w => w.id === id ? { ...w, status: newStatus } : w)); router.post(`/employer/candidates/${id}/status`, { status: newStatus }, { preserveScroll: true }); }; // Extract unique nationalities for filter dropdown const nationalities = useMemo(() => { const nats = (selectedWorkers || []).map(w => w.nationality).filter(Boolean); return [...new Set(nats)]; }, [selectedWorkers]); // Apply Client-Side Filters const filteredWorkers = useMemo(() => { let list = (selectedWorkers || []).filter(w => w.status !== 'Searching'); if (searchTerm.trim() !== '') { const query = searchTerm.toLowerCase(); list = list.filter(w => w.name.toLowerCase().includes(query)); } if (filterLocation.trim() !== '') { const query = filterLocation.toLowerCase(); list = list.filter(w => w.preferred_location && w.preferred_location.toLowerCase().includes(query)); } if (filterJobType !== 'All') { list = list.filter(w => w.preferred_job_type && w.preferred_job_type.toLowerCase() === filterJobType.toLowerCase()); } if (filterAccommodation !== 'All') { list = list.filter(w => w.live_in_out && w.live_in_out.toLowerCase() === filterAccommodation.toLowerCase()); } if (filterNationality !== 'All') { list = list.filter(w => w.nationality && w.nationality.toLowerCase() === filterNationality.toLowerCase()); } if (filterInCountry !== 'All') { const wantInCountry = filterInCountry === 'In Country'; list = list.filter(w => { const wVal = w.in_country; return (wVal === true || wVal === '1' || wVal === 1) === wantInCountry; }); } if (filterInCountry === 'In Country' && filterVisaType !== 'All') { list = list.filter(w => w.visa_status && w.visa_status.toLowerCase().includes(filterVisaType.toLowerCase())); } return list; }, [selectedWorkers, searchTerm, filterLocation, filterJobType, filterAccommodation, filterNationality, filterInCountry, filterVisaType]); const resetFilters = () => { setFilterLocation(''); setFilterJobType('All'); setFilterAccommodation('All'); setFilterNationality('All'); setFilterInCountry('All'); setFilterVisaType('All'); }; const activeFilterCount = useMemo(() => { let count = 0; if (filterLocation.trim() !== '') count++; if (filterJobType !== 'All') count++; if (filterAccommodation !== 'All') count++; if (filterNationality !== 'All') count++; if (filterInCountry !== 'All') count++; if (filterInCountry === 'In Country' && filterVisaType !== 'All') count++; return count; }, [filterLocation, filterJobType, filterAccommodation, filterNationality, filterInCountry, filterVisaType]); // Active filter tags for display const activeFilterTags = useMemo(() => { const tags = []; if (filterLocation.trim()) tags.push({ key: 'location', label: `πŸ“ ${filterLocation}`, clear: () => setFilterLocation('') }); if (filterJobType !== 'All') tags.push({ key: 'job', label: `πŸ’Ό ${filterJobType}`, clear: () => setFilterJobType('All') }); if (filterAccommodation !== 'All') tags.push({ key: 'acc', label: `🏠 ${filterAccommodation.replace('_', '-')}`, clear: () => setFilterAccommodation('All') }); if (filterNationality !== 'All') tags.push({ key: 'nat', label: `🌍 ${filterNationality}`, clear: () => setFilterNationality('All') }); if (filterInCountry !== 'All') tags.push({ key: 'country', label: `✈️ ${filterInCountry}`, clear: () => { setFilterInCountry('All'); setFilterVisaType('All'); } }); if (filterInCountry === 'In Country' && filterVisaType !== 'All') tags.push({ key: 'visa', label: `πŸͺͺ ${filterVisaType}`, clear: () => setFilterVisaType('All') }); return tags; }, [filterLocation, filterJobType, filterAccommodation, filterNationality, filterInCountry, filterVisaType]); return ( {/* ── Filter Drawer ── */} setDrawerOpen(false)} onReset={resetFilters} activeCount={activeFilterCount} title="Filter Candidates" > {/* Preferred Location */} setFilterLocation(e.target.value)} placeholder="e.g. Dubai, Abu Dhabi…" /> {/* Job Type */} {/* Accommodation */} {/* Nationality */} setFilterNationality(e.target.value)} > {nationalities.map(nat => ( ))} {/* Country Status */} { setFilterInCountry(val); if (val !== 'In Country') setFilterVisaType('All'); }} /> {/* Visa Type */}
setFilterVisaType(e.target.value)} disabled={filterInCountry !== 'In Country'} > {filterInCountry !== 'In Country' && (

Select "In Country" to enable this filter

)}
{/* Header Section */}

{t('candidates_pipeline', 'Candidates')}

{t('candidates_pipeline_desc', 'Manage your workforce recruitment pipeline')}

{/* Table Section */}
{/* Toolbar */}
{/* Search */}
setSearchTerm(e.target.value)} />
{/* Results count */} {filteredWorkers.length} result{filteredWorkers.length !== 1 ? 's' : ''} {/* Export actions */}
{['COPY', 'CSV', 'PDF', 'PRINT'].map(action => ( ))}
{/* Filter button */}
{/* Active filter tags */} {activeFilterTags.length > 0 && (
Active: {activeFilterTags.map(tag => ( ))}
)} {/* Table */}
{filteredWorkers.length > 0 ? ( filteredWorkers.map((worker) => ( )) ) : ( )}
{t('candidate_header', 'Candidate')} {t('selected_header', 'Selected')} {t('category_header', 'Category')} {t('salary_header', 'Salary')} {t('status_header', 'Status')} {t('actions_header', 'Actions')}
{worker.name.charAt(0)}
{worker.name}
{worker.nationality || 'β€”'}
{worker.applied_at || 'β€”'} {worker.category} {worker.salary} AED {t('hired', 'Hired').toUpperCase()}
{t('no_candidates_found', 'No candidates found')}
{activeFilterCount > 0 && ( )}
{/* Footer */}
Showing {filteredWorkers.length} of {(selectedWorkers || []).filter(w => w.status !== 'Searching').length} candidates
); }