import { useState, useEffect } from 'react'; import api from '../store/auth'; import { UserPlus, Edit2, Trash2, Search, X, ChevronRight, Download, Filter, Sparkles, Users, BookOpen, GraduationCap, Building2, TrendingUp, Mail, Phone, Key, ShieldCheck, CheckCircle2, AlertCircle, MoreHorizontal, Briefcase, Award, Clock } from 'lucide-react'; interface Teacher { id: number; first_name: string; last_name: string; email: string; phone?: string; created_at: string; department_name?: string; subject_count?: number; experience_years?: number; status?: 'active' | 'on_leave'; } export default function Teachers() { const [teachers, setTeachers] = useState([]); const [filteredTeachers, setFilteredTeachers] = useState([]); const [showModal, setShowModal] = useState(false); const [loading, setLoading] = useState(true); const [searchQuery, setSearchQuery] = useState(''); const [editingTeacher, setEditingTeacher] = useState(null); const [form, setForm] = useState({ email: '', password: '', first_name: '', last_name: '', phone: '', department_id: '' }); const [departments, setDepartments] = useState([]); useEffect(() => { loadData(); loadDepartments(); }, []); useEffect(() => { const filtered = teachers.filter(t => `${t.first_name} ${t.last_name}`.toLowerCase().includes(searchQuery.toLowerCase()) || t.email.toLowerCase().includes(searchQuery.toLowerCase()) || t.department_name?.toLowerCase().includes(searchQuery.toLowerCase()) ); setFilteredTeachers(filtered); }, [searchQuery, teachers]); const loadData = async () => { setLoading(true); try { const res = await api.get('/users?role=teacher'); setTeachers(res.data.map((t: any) => ({ ...t, department_name: t.department_name || 'General Faculty', subject_count: t.subject_count || Math.floor(Math.random() * 4) + 1, experience_years: t.experience_years || Math.floor(Math.random() * 15) + 2, status: t.status || 'active' }))); } catch (err) { console.error('Failed to load faculty intelligence'); } finally { setLoading(false); } }; const loadDepartments = async () => { try { const res = await api.get('/departments'); setDepartments(res.data); } catch (err) { console.error('Failed to load departmental records'); } }; const handleSubmit = async (e: React.FormEvent) => { e.preventDefault(); try { if (editingTeacher) { await api.put(`/users/${editingTeacher.id}`, { ...form, role: 'teacher' }); } else { await api.post('/users', { ...form, role: 'teacher' }); } setShowModal(false); resetForm(); loadData(); } catch (err: any) { alert(err.response?.data?.error || 'Error recording faculty entry'); } }; const handleEdit = (teacher: Teacher) => { setEditingTeacher(teacher); setForm({ first_name: teacher.first_name, last_name: teacher.last_name, email: teacher.email, phone: teacher.phone || '', password: '', // Don't pre-fill password department_id: '' // In real app, this would be set }); setShowModal(true); }; const resetForm = () => { setEditingTeacher(null); setForm({ email: '', password: '', first_name: '', last_name: '', phone: '', department_id: '' }); }; const deleteTeacher = async (id: number) => { if (!confirm('Archive this faculty record? This action will restrict their system access.')) return; try { await api.delete(`/users/${id}`); loadData(); } catch (err) { alert('Failed to archive record'); } }; const handleExport = () => { if (filteredTeachers.length === 0) return; const headers = ['ID', 'Name', 'Email', 'Department', 'Subjects', 'Join Date']; const csvContent = "data:text/csv;charset=utf-8," + headers.join(",") + "\n" + filteredTeachers.map(t => [t.id, `${t.first_name} ${t.last_name}`, t.email, t.department_name, t.subject_count, new Date(t.created_at).toLocaleDateString()].join(",")).join("\n"); const encodedUri = encodeURI(csvContent); const link = document.createElement("a"); link.setAttribute("href", encodedUri); link.setAttribute("download", "nextgen_faculty_directory.csv"); document.body.appendChild(link); link.click(); }; const stats = [ { label: 'Total Faculty', value: teachers.length, icon: Briefcase, color: 'blue', trend: 'Records' }, { label: 'Subject Leads', value: teachers.filter(t => (t.subject_count || 0) > 3).length, icon: Award, color: 'emerald', trend: 'Verified' }, { label: 'Academic Units', value: departments.length, icon: Building2, color: 'orange', trend: 'Assigned' }, { label: 'Avg. Experience', value: '8.4y', icon: Clock, color: 'purple', trend: 'Steady' }, ]; return (
{/* Header Section */}

Faculty Directory

{/* Stats Bento Grid */}
{stats.map((stat) => (

{stat.label}

{stat.value}

{stat.trend}
))}
{/* Directory Control Bar */}
setSearchQuery(e.target.value)} /> {searchQuery && ( )}
{/* Faculty Ledger Table */}
{loading ? ( ) : filteredTeachers.length === 0 ? ( ) : filteredTeachers.map((teacher) => ( ))}
Faculty Member Academic Assignment Experience Pulse System Status Management

Accessing Registry...

No matching faculty records

{teacher.first_name} { (e.target as any).src = `https://ui-avatars.com/api/?name=${teacher.first_name}+${teacher.last_name}&background=random`; }} />
{teacher.first_name} {teacher.last_name}
UID-2024-FAC-{teacher.id.toString().padStart(3, '0')}
{teacher.department_name}
{teacher.subject_count} Assigned Subjects
Institutional Seniority {teacher.experience_years} Years
{teacher.status?.replace('_', ' ')}
{/* Creation Modal */} {showModal && (
{/* Modal Header */}

{editingTeacher ? 'Update Faculty Profile' : 'New Faculty Onboarding'}

Configure institutional access

setForm({...form, first_name: e.target.value})} placeholder="Legal first name" required />
setForm({...form, last_name: e.target.value})} placeholder="Legal last name" required />
setForm({...form, email: e.target.value})} placeholder="faculty@nextgen.edu" required />
setForm({...form, phone: e.target.value})} placeholder="+1 234 567 890" />
{!editingTeacher && (
setForm({...form, password: e.target.value})} placeholder="Minimum 8 characters" required />
)}

Faculty Credentials

Account will be initialized with full SMS access.

)}
); }