import React, { useEffect, useState } from 'react'; import { Plus, Clock, Loader2, Edit, Trash2, X, Filter } from 'lucide-react'; import { api } from '../services/api'; import { Course, Subject, User, ClassInfo } from '../types'; import { sortClasses } from './Dashboard'; export const CourseList: React.FC = () => { const [courses, setCourses] = useState([]); const [subjects, setSubjects] = useState([]); const [teachers, setTeachers] = useState([]); const [classes, setClasses] = useState([]); const [loading, setLoading] = useState(true); // Filter state const [filterSubject, setFilterSubject] = useState('All'); const [isModalOpen, setIsModalOpen] = useState(false); const [formData, setFormData] = useState<{ courseCode: string, courseName: string, teacherName: string, teacherId: string, className: string, credits: number, capacity: number }>({ courseCode: '', courseName: '', teacherName: '', teacherId: '', className: '', credits: 2, capacity: 45 }); const [editId, setEditId] = useState(null); const currentUser = api.auth.getCurrentUser(); const isAdmin = currentUser?.role === 'ADMIN'; const isTeacher = currentUser?.role === 'TEACHER'; const loadData = async () => { setLoading(true); try { const [c, s, t, cls] = await Promise.all([ api.courses.getAll(), api.subjects.getAll(), api.users.getAll({ role: 'TEACHER' }), api.classes.getAll() ]); let filteredCourses = c; if (isTeacher) { // Teachers only see their own courses filteredCourses = c.filter((course: Course) => course.teacherId === currentUser._id || course.teacherName === (currentUser.trueName || currentUser.username)); } setCourses(filteredCourses); setSubjects(s); setTeachers(t); // Safety check: Ensure cls is array and sort safely const safeClasses = Array.isArray(cls) ? cls : []; try { safeClasses.sort(sortClasses); } catch (e) { console.warn("Class sort failed", e); } setClasses(safeClasses); } catch (e) { console.error(e); } finally { setLoading(false); } }; useEffect(() => { loadData(); }, []); const handleSubmit = async (e: React.FormEvent) => { e.preventDefault(); if (editId) await api.courses.update(editId, formData); else { try { await api.courses.add(formData); } catch (e: any) { if (e.message.includes('DUPLICATE')) { alert('该班级的该科目已经有任课老师了,请勿重复添加。'); return; } alert('添加失败'); return; } } setIsModalOpen(false); loadData(); }; const handleDelete = async (id: string) => { if(confirm('删除课程关联?')) { await api.courses.delete(id); loadData(); } }; const filteredCourses = courses.filter(c => filterSubject === 'All' || c.courseName === filterSubject); const handleTeacherSelect = (e: React.ChangeEvent) => { const tId = e.target.value; const t = teachers.find(u => u._id === tId); if(t) { setFormData({ ...formData, teacherId: tId, teacherName: t.trueName || t.username }); } }; // If teacher is logged in, default the teacher selection to themselves const handleOpenAdd = () => { setEditId(null); setFormData({ courseCode: '', courseName: '', teacherName: isTeacher ? (currentUser?.trueName || currentUser?.username || '') : '', teacherId: isTeacher ? (currentUser?._id || '') : '', className: '', credits: 2, capacity: 45 }); setIsModalOpen(true); }; // Helper to ensure class name is consistent const getFullClassName = (c: ClassInfo) => { if (c.className && c.grade && c.className.startsWith(c.grade)) return c.className; return (c.grade || '') + (c.className || ''); }; return (

任课安排

在此设置每个班级各科目的任课老师

{loading ?
: ( filteredCourses.length > 0 ? (
{filteredCourses.map(c => (
{c.courseName[0]}

{c.className}

{c.courseName}

教师: {c.teacherName}

{c.courseCode &&

代码: {c.courseCode}

}
))}
) : (
{isTeacher ? '您尚未绑定任何教学班级,请点击右上角绑定' : '没有找到课程安排'}
) )} {isModalOpen && (

{editId ? '编辑课程关联' : '新增课程关联'}

{!isTeacher && (
)} {isTeacher && (
您正在将自己 ({formData.teacherName}) 绑定为 {formData.className || '某班'} 的 {formData.courseName || '某科'} 老师。
)}
)}
); };