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, FilterCheckboxList } from '../../components/Employer/FilterDrawer';
export default function SelectedCandidates({
selectedWorkers,
allNationalities,
skills = ['cooking', 'driving', 'childcare', 'cleaning', 'elderly care', 'gardening'],
languages = ['English', 'Arabic', 'Hindi', 'Tagalog']
}) {
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 [filterProfession, setFilterProfession] = useState('All Professions');
const [filterLocation, setFilterLocation] = useState('All');
const [filterJobType, setFilterJobType] = useState('All');
const [filterAccommodation, setFilterAccommodation] = useState('All');
const [filterNationalities, setFilterNationalities] = useState([]);
const [filterGender, setFilterGender] = useState('All');
const [filterInCountry, setFilterInCountry] = useState('All');
const [filterVisaType, setFilterVisaType] = useState('All');
const [filterSkills, setFilterSkills] = useState([]);
const [filterLanguages, setFilterLanguages] = useState([]);
const [maxSalary, setMaxSalary] = useState(5000);
const toggleMultiSelect = (item, setSelectedList) => {
setSelectedList(prev =>
prev.includes(item) ? prev.filter(x => x !== item) : [...prev, item]
);
};
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(() => {
if (allNationalities && allNationalities.length > 0) {
return allNationalities;
}
const nats = (selectedWorkers || []).map(w => w.nationality).filter(Boolean);
return [...new Set(nats)];
}, [selectedWorkers, allNationalities]);
// 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 (filterProfession !== 'All Professions') {
list = list.filter(w => w.main_profession && w.main_profession.toLowerCase() === filterProfession.toLowerCase());
}
if (filterLocation !== 'All' && filterLocation.trim() !== '') {
const locKey = filterLocation.toLowerCase();
const locationMapping = {
'dubai': ['dubai', 'marina', 'barsha', 'nahda', 'jumeirah', 'deira', 'downtown', 'silicon', 'sports', 'motor', 'jlt', 'jbr', 'meydan', 'ranches', 'bay', 'mirdif', 'quoz'],
'abu dhabi': ['abu dhabi', 'yas', 'khalifa', 'reem', 'saadiyat', 'raha', 'mussafah', 'zahiyah', 'karamah'],
'oman': ['oman', 'muscat', 'salalah', 'sohar', 'nizwa', 'sur', 'ibri', 'rustaq']
};
const allowedKeywords = locationMapping[locKey] || [locKey];
list = list.filter(w => {
if (!w.preferred_location) return false;
const wLoc = w.preferred_location.toLowerCase();
return allowedKeywords.some(keyword => wLoc.includes(keyword));
});
}
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 (filterNationalities.length > 0) {
list = list.filter(w => w.nationality && filterNationalities.map(n => n.toLowerCase()).includes(w.nationality.toLowerCase()));
}
if (filterGender !== 'All') {
list = list.filter(w => w.gender && w.gender.toLowerCase() === filterGender.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()));
}
if (filterSkills.length > 0) {
list = list.filter(w => w.skills && w.skills.some(s => filterSkills.includes(s.toLowerCase())));
}
if (filterLanguages.length > 0) {
list = list.filter(w => w.languages && w.languages.some(l => filterLanguages.includes(l)));
}
if (maxSalary < 5000) {
list = list.filter(w => w.salary && Number(w.salary) <= maxSalary);
}
return list;
}, [selectedWorkers, searchTerm, filterProfession, filterLocation, filterJobType, filterAccommodation, filterNationalities, filterGender, filterInCountry, filterVisaType, filterSkills, filterLanguages, maxSalary]);
const resetFilters = () => {
setFilterProfession('All Professions');
setFilterLocation('All');
setFilterJobType('All');
setFilterAccommodation('All');
setFilterNationalities([]);
setFilterGender('All');
setFilterInCountry('All');
setFilterVisaType('All');
setFilterSkills([]);
setFilterLanguages([]);
setMaxSalary(5000);
};
const activeFilterCount = useMemo(() => {
let count = 0;
if (filterProfession !== 'All Professions') count++;
if (filterLocation !== 'All' && filterLocation.trim() !== '') count++;
if (filterJobType !== 'All') count++;
if (filterAccommodation !== 'All') count++;
if (filterNationalities.length > 0) count++;
if (filterGender !== 'All') count++;
if (filterInCountry !== 'All') count++;
if (filterInCountry === 'In Country' && filterVisaType !== 'All') count++;
if (filterSkills.length > 0) count++;
if (filterLanguages.length > 0) count++;
if (maxSalary < 5000) count++;
return count;
}, [filterProfession, filterLocation, filterJobType, filterAccommodation, filterNationalities, filterGender, filterInCountry, filterVisaType, filterSkills, filterLanguages, maxSalary]);
// Active filter tags for display
const activeFilterTags = useMemo(() => {
const tags = [];
if (filterProfession !== 'All Professions') tags.push({ key: 'profession', label: `π§βπ§ ${filterProfession}`, clear: () => setFilterProfession('All Professions') });
if (filterLocation !== 'All' && filterLocation.trim()) tags.push({ key: 'location', label: `π ${filterLocation}`, clear: () => setFilterLocation('All') });
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 (filterNationalities.length > 0) tags.push({ key: 'nat', label: `π ${filterNationalities.length} Nat`, clear: () => setFilterNationalities([]) });
if (filterGender !== 'All') tags.push({ key: 'gender', label: `π» ${filterGender}`, clear: () => setFilterGender('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') });
if (filterSkills.length > 0) tags.push({ key: 'skills', label: `π ${filterSkills.length} skill${filterSkills.length > 1 ? 's' : ''}`, clear: () => setFilterSkills([]) });
if (filterLanguages.length > 0) tags.push({ key: 'lang', label: `π£ ${filterLanguages.length} lang`, clear: () => setFilterLanguages([]) });
if (maxSalary < 5000) tags.push({ key: 'salary', label: `π° β€${maxSalary} AED`, clear: () => setMaxSalary(5000) });
return tags;
}, [filterProfession, filterLocation, filterJobType, filterAccommodation, filterNationalities, filterGender, filterInCountry, filterVisaType, filterSkills, filterLanguages, maxSalary]);
return (
Select "In Country" to enable this filter
{t('candidates_pipeline_desc', 'Manage your workforce recruitment pipeline')}
| {t('candidate_header', 'Candidate')} | {t('selected_header', 'Selected')} | {t('salary_header', 'Salary')} | {t('status_header', 'Status')} | {t('actions_header', 'Actions')} | |
|---|---|---|---|---|---|
|
{worker.name.charAt(0)}
{worker.name}
|
{worker.applied_at || 'β'} | {worker.salary} AED | {t('hired', 'Hired').toUpperCase()} |
|
|
|
{t('no_candidates_found', 'No candidates found')}
{activeFilterCount > 0 && (
)}
|
|||||