From d1d5b4681b6c506e88603fe5af8e3b48224fe3cd Mon Sep 17 00:00:00 2001 From: wangziqi Date: Thu, 9 Jul 2026 16:31:53 +0800 Subject: [PATCH] feat(schedules): replace teacher ID input with searchable user select, show teacher name, add schedule button --- apps/admin/src/pages/Schedules/index.tsx | 51 +++++++++++++++++++++--- 1 file changed, 46 insertions(+), 5 deletions(-) diff --git a/apps/admin/src/pages/Schedules/index.tsx b/apps/admin/src/pages/Schedules/index.tsx index 1cdaccb..f20b225 100644 --- a/apps/admin/src/pages/Schedules/index.tsx +++ b/apps/admin/src/pages/Schedules/index.tsx @@ -10,6 +10,7 @@ import { RightOutlined, DeleteOutlined, CloudSyncOutlined, + PlusOutlined, } from '@ant-design/icons'; import dayjs, { Dayjs } from 'dayjs'; import api from '../../api'; @@ -49,6 +50,12 @@ interface ClassItem { code: string; } + +interface UserItem { + id: number; + username: string; + name: string; +} interface ScheduleFormValues { classId: number; subject: string; @@ -83,6 +90,7 @@ const SchedulesPage: React.FC = () => { // Data const [classrooms, setClassrooms] = useState([]); const [classes, setClasses] = useState([]); + const [users, setUsers] = useState([]); const [matrix, setMatrix] = useState>>({}); const [loading, setLoading] = useState(false); @@ -236,6 +244,10 @@ const SchedulesPage: React.FC = () => { fetchData(); }, [fetchData]); + useEffect(() => { + api.get('/rbac/users').then(setUsers).catch(() => {}); + }, []); + // ---- Filtered classrooms ---- const filteredClassrooms = useMemo(() => { @@ -394,6 +406,15 @@ const SchedulesPage: React.FC = () => { [classes], ); + const userOptions = useMemo( + () => + users.map((u) => ({ + value: u.id, + label: `${u.name || u.username}${u.name ? ` (${u.username})` : ''}`, + })), + [users], + ); + // ---- Render ---- const selectedClassroom = selectedCell @@ -785,10 +806,15 @@ const SchedulesPage: React.FC = () => { (v ? Number(v) : undefined)} + label="教师(可选)" > - +