'use client'; import React, { useState, useEffect } from 'react'; import { Career } from '@/app/types'; import { apiClient } from '@/app/utils/apiClient'; import { Button, Box, Typography, Chip, Table, TableBody, TableCell, TableContainer, TableHead, TableRow, Paper, IconButton, Dialog, DialogActions, DialogContent, DialogContentText, DialogTitle, TextField, MenuItem, Pagination, FormControlLabel, Switch, CircularProgress, Alert, Tooltip } from '@mui/material'; import EditIcon from '@mui/icons-material/Edit'; import DeleteIcon from '@mui/icons-material/Delete'; import VisibilityIcon from '@mui/icons-material/Visibility'; import AddIcon from '@mui/icons-material/Add'; import CareerForm from './CareerForms'; const CareerList: React.FC = () => { const [careers, setCareers] = useState([]); const [loading, setLoading] = useState(true); const [error, setError] = useState(null); const [page, setPage] = useState(1); const [totalPages, setTotalPages] = useState(1); const [selectedCareer, setSelectedCareer] = useState(null); const [showForm, setShowForm] = useState(false); const [deleteDialogOpen, setDeleteDialogOpen] = useState(false); const [selectedStatus, setSelectedStatus] = useState('all'); const [searchQuery, setSearchQuery] = useState(''); const [selectedLocation, setSelectedLocation] = useState(''); const [locations, setLocations] = useState([]); const [bulkActionEnabled, setBulkActionEnabled] = useState(false); const [selectedIds, setSelectedIds] = useState([]); const [bulkStatus, setBulkStatus] = useState<'active' | 'inactive'>('active'); const fetchCareers = async () => { setLoading(true); setError(null); try { const params = new URLSearchParams(); params.append('page', page.toString()); params.append('limit', '10'); if (selectedStatus !== 'all') { params.append('status', selectedStatus); } if (searchQuery) { params.append('search', searchQuery); } if (selectedLocation) { params.append('location', selectedLocation); } const response = await apiClient(`/careers/listings?${params.toString()}`); if (response.success) { setCareers(response.data); setTotalPages(response.totalPages || 1); const uniqueLocations = Array.from( new Set(response.data.map((career: Career) => career.location as string)) ) as string[]; setLocations(uniqueLocations); } else { setError('Failed to load career listings'); } } catch (err) { console.error('Error fetching careers:', err); setError('Failed to load career listings. Please try again.'); } finally { setLoading(false); } }; useEffect(() => { fetchCareers(); }, [page, selectedStatus, selectedLocation]); const handleSearch = () => { setPage(1); fetchCareers(); }; const handleStatusChange = (event: React.ChangeEvent) => { setSelectedStatus(event.target.value); setPage(1); }; const handleLocationChange = (event: React.ChangeEvent) => { setSelectedLocation(event.target.value); setPage(1); }; const handlePageChange = (event: React.ChangeEvent, value: number) => { setPage(value); }; const handleEdit = (career: Career) => { setSelectedCareer(career); setShowForm(true); }; const handleCreate = () => { setSelectedCareer(null); setShowForm(true); }; const handleFormClose = () => { setShowForm(false); setSelectedCareer(null); }; const handleFormSubmitSuccess = () => { setShowForm(false); setSelectedCareer(null); fetchCareers(); }; const confirmDelete = (career: Career) => { setSelectedCareer(career); setDeleteDialogOpen(true); }; const handleDeleteConfirm = async () => { if (!selectedCareer) return; try { const response = await apiClient(`/careers/delete/${selectedCareer.id}`, { method: 'DELETE' }); if (response.success) { setCareers(prev => prev.filter(c => c.id !== selectedCareer.id)); setDeleteDialogOpen(false); setSelectedCareer(null); } else { setError('Failed to delete career listing'); } } catch (err) { console.error('Error deleting career:', err); setError('Failed to delete career listing. Please try again.'); } }; const handleBulkSelection = (careerId: number, checked: boolean) => { if (checked) { setSelectedIds(prev => [...prev, careerId]); } else { setSelectedIds(prev => prev.filter(id => id !== careerId)); } }; const handleSelectAll = (checked: boolean) => { if (checked) { setSelectedIds(careers.map(career => career.id)); } else { setSelectedIds([]); } }; const handleBulkStatusChange = async () => { if (selectedIds.length === 0) return; try { const response = await apiClient('/careers/bulk-update-status', { method: 'PUT', body: JSON.stringify({ careerIds: selectedIds, status: bulkStatus }) }); if (response.success) { fetchCareers(); setSelectedIds([]); setBulkActionEnabled(false); } else { setError('Failed to update career statuses'); } } catch (err) { console.error('Error updating career statuses:', err); setError('Failed to update career statuses. Please try again.'); } }; if (showForm) { return ( ); } return ( {error && ( {error} )} Job Listings setSearchQuery(e.target.value)} onKeyPress={(e) => e.key === 'Enter' && handleSearch()} sx={{ minWidth: 200 }} /> All Active Inactive All Locations {locations.map((location, index) => ( {location} ))} {bulkActionEnabled && selectedIds.length > 0 && ( {selectedIds.length} item(s) selected setBulkStatus(e.target.value as 'active' | 'inactive')} size="small" sx={{ minWidth: 150 }} > Active Inactive )} { setBulkActionEnabled(e.target.checked); if (!e.target.checked) { setSelectedIds([]); } }} /> } label="Enable Bulk Actions" /> {bulkActionEnabled && ( 0} onChange={(e) => handleSelectAll(e.target.checked)} size="small" /> } label="" /> )} Title Location Status Created Actions {loading ? ( ) : careers.length === 0 ? ( No job listings found ) : ( careers.map((career) => ( {bulkActionEnabled && ( handleBulkSelection(career.id, e.target.checked)} size="small" /> } label="" /> )} {career.title} {career.salary && ( {career.salary} )} {career.location} {new Date(career.createdAt).toLocaleDateString()} handleEdit(career)}> handleEdit(career)}> confirmDelete(career)}> )) )}
{/* Delete Confirmation Dialog */} setDeleteDialogOpen(false)} > Confirm Deletion Are you sure you want to delete the job listing "{selectedCareer?.title}"? This action will also delete all associated applications.
); }; export default CareerList;