import { useState, useEffect, useCallback } from 'react'; import { getCareersApi, updateCareerApi, createCareerApi } from '@/api/career'; import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow } from '@/components/ui/table'; import { Card, CardContent, CardHeader, CardTitle } from '@/components/ui/card'; import { Button } from '@/components/ui/button'; import { Dialog, DialogContent, DialogHeader, DialogTitle, DialogFooter } from '@/components/ui/dialog'; import { Input } from '@/components/ui/input'; import { Badge } from '@/components/ui/badge'; import { Switch } from '@/components/ui/switch'; import { Label } from '@/components/ui/label'; import { Loader2, Plus, Pencil, RefreshCw, ChevronLeft, ChevronRight } from 'lucide-react'; export default function CareerPage() { const [careers, setCareers] = useState([]); const [loading, setLoading] = useState(true); const [openModal, setOpenModal] = useState(false); const [editing, setEditing] = useState(null); const [searchText, setSearchText] = useState(''); const [currentPage, setCurrentPage] = useState(1); const itemsPerPage = 10; const [form, setForm] = useState({ post: '', designation: '', qualification: '', experienceNeed: '', email: '', number: '', status: 'new', isActive: true, sortOrder: 0, }); const fetchAll = useCallback(async () => { setLoading(true); try { const res = await getCareersApi(); setCareers(res?.data || []); } catch (err) { console.error(err); } finally { setLoading(false); } }, []); useEffect(() => { fetchAll(); }, [fetchAll]); const filteredCareers = careers.filter( (item) => item.post?.toLowerCase().includes(searchText.toLowerCase()) || item.designation?.toLowerCase().includes(searchText.toLowerCase()) ); useEffect(() => { setCurrentPage(1); }, [searchText]); const totalPages = Math.ceil(filteredCareers.length / itemsPerPage); const indexOfLastItem = currentPage * itemsPerPage; const indexOfFirstItem = indexOfLastItem - itemsPerPage; const currentItems = filteredCareers.slice(indexOfFirstItem, indexOfLastItem); function handleChange(e: any) { setForm({ ...form, [e.target.name]: e.target.value }); } const handleToggleStatus = async (item: any) => { try { await updateCareerApi(item.id, { ...item, isActive: !item.isActive, } as any); fetchAll(); } catch (error) { console.error('Failed to toggle status', error); } }; function openAdd() { setEditing(null); setForm({ post: '', designation: '', qualification: '', experienceNeed: '', email: '', number: '', status: 'new', isActive: true, sortOrder: 0, }); setOpenModal(true); } function openEdit(item: any) { setEditing(item); setForm({ post: item.post || '', designation: item.designation || '', qualification: item.qualification || '', experienceNeed: item.experienceNeed || '', email: item.email || '', number: item.number || '', status: item.status || 'new', isActive: item.isActive ?? true, sortOrder: item.sortOrder ?? 0, }); setOpenModal(true); } async function handleSubmit() { try { if (editing) { await updateCareerApi(editing.id, form); } else { await createCareerApi(form); } setOpenModal(false); fetchAll(); } catch (err) { console.error(err); } } return (

Careers

setSearchText(e.target.value)} className="w-[250px] text-base" />
Career Opportunities
Priority Post & Designation Qualification Experience Status (Active) Actions {loading ? ( ) : currentItems.length === 0 ? ( No careers found ) : ( currentItems.map((item) => ( {item.sortOrder}
{item.post}
{item.designation}
{item.qualification}
{item.experienceNeed}
handleToggleStatus(item)} /> {item.isActive ? 'Active' : 'Hidden'}
)) )}
{!loading && filteredCareers.length > 0 && (
Showing {indexOfFirstItem + 1} to{' '} {Math.min(indexOfLastItem, filteredCareers.length)} of{' '} {filteredCareers.length} careers
Page {currentPage} of {totalPages}
)}
{editing ? 'Edit Career' : 'Add New Career'}
setForm({ ...form, isActive: val })} />
); }