Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
ede9a78459 |
@@ -169,7 +169,6 @@ const AppRoutes: React.FC = () => {
|
|||||||
<Route path="/classes" element={<ClassesPage />} />
|
<Route path="/classes" element={<ClassesPage />} />
|
||||||
<Route path="/my-classes" element={<MyClassesPage />} />
|
<Route path="/my-classes" element={<MyClassesPage />} />
|
||||||
<Route path="/classes/:classId" element={<ClassDetailPage />} />
|
<Route path="/classes/:classId" element={<ClassDetailPage />} />
|
||||||
<Route path="/timetable/classes/:classId" element={<ClassDetailPage />} />
|
|
||||||
<Route path="/student-lessons" element={<StudentLessonsPage />} />
|
<Route path="/student-lessons" element={<StudentLessonsPage />} />
|
||||||
<Route path="/lesson-plans" element={<LessonPlansPage />} />
|
<Route path="/lesson-plans" element={<LessonPlansPage />} />
|
||||||
<Route path="/lesson-plans/:planId" element={<LessonPlanDetailPage />} />
|
<Route path="/lesson-plans/:planId" element={<LessonPlanDetailPage />} />
|
||||||
|
|||||||
@@ -132,20 +132,10 @@ const ClassDetailPage: React.FC = () => {
|
|||||||
setLoading(true);
|
setLoading(true);
|
||||||
setError(null);
|
setError(null);
|
||||||
try {
|
try {
|
||||||
const clsRes = await fetch(`${API_BASE}/database/timetable/classes/${classId}`, {
|
const clsRes = await fetch(`${API_BASE}/classes/${classId}`, {
|
||||||
headers: { Authorization: `Bearer ${accessToken}` },
|
headers: { Authorization: `Bearer ${accessToken}` },
|
||||||
}).then(r => r.json());
|
}).then(r => r.json());
|
||||||
if (clsRes.id) {
|
if (clsRes.id) setCls(clsRes);
|
||||||
setCls({
|
|
||||||
...clsRes,
|
|
||||||
class_code: clsRes.class_code || clsRes.code,
|
|
||||||
year_group: clsRes.year_group || clsRes.school_year,
|
|
||||||
teachers: clsRes.teachers || [],
|
|
||||||
students: clsRes.students || [],
|
|
||||||
enrollment_requests: clsRes.enrollment_requests || [],
|
|
||||||
student_count: clsRes.student_count ?? clsRes.students?.length ?? 0,
|
|
||||||
});
|
|
||||||
}
|
|
||||||
else setError(clsRes.detail || 'Class not found');
|
else setError(clsRes.detail || 'Class not found');
|
||||||
const role = bootstrapData?.active_institute?.membership_role || '';
|
const role = bootstrapData?.active_institute?.membership_role || '';
|
||||||
setIsAdmin(role === 'school_admin' || role === 'department_head');
|
setIsAdmin(role === 'school_admin' || role === 'department_head');
|
||||||
@@ -185,20 +175,20 @@ const ClassDetailPage: React.FC = () => {
|
|||||||
|
|
||||||
const handleAddStudent = async (studentId: string) => {
|
const handleAddStudent = async (studentId: string) => {
|
||||||
setActionError(null);
|
setActionError(null);
|
||||||
const res = await apiPost(`/database/timetable/classes/${classId}/students`, { student_id: studentId });
|
const res = await apiPost(`/classes/${classId}/students`, { student_id: studentId });
|
||||||
if (res.status === 'ok') load();
|
if (res.status === 'ok') load();
|
||||||
else setActionError(res.detail || 'Failed to add student');
|
else setActionError(res.detail || 'Failed to add student');
|
||||||
};
|
};
|
||||||
|
|
||||||
const handleRemoveStudent = async (studentId: string) => {
|
const handleRemoveStudent = async (studentId: string) => {
|
||||||
setActionError(null);
|
setActionError(null);
|
||||||
await apiDelete(`/database/timetable/classes/${classId}/students/${studentId}`);
|
await apiDelete(`/classes/${classId}/students/${studentId}`);
|
||||||
load();
|
load();
|
||||||
};
|
};
|
||||||
|
|
||||||
const handleEnrollmentResponse = async (requestId: string, action: 'approve' | 'reject') => {
|
const handleEnrollmentResponse = async (requestId: string, action: 'approve' | 'reject') => {
|
||||||
setActionError(null);
|
setActionError(null);
|
||||||
const res = await apiPatch(`/database/timetable/classes/${classId}/enrollment-requests/${requestId}`, { action });
|
const res = await apiPatch(`/classes/${classId}/enrollment-requests/${requestId}`, { action });
|
||||||
if (res.status === 'ok') load();
|
if (res.status === 'ok') load();
|
||||||
else setActionError(res.detail || 'Action failed');
|
else setActionError(res.detail || 'Action failed');
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -4,6 +4,7 @@ import type { ExamTemplateDetail, TemplateReplacePayload } from '../../types/exa
|
|||||||
export const PAGE_HEIGHT = 1100
|
export const PAGE_HEIGHT = 1100
|
||||||
export const PAGE_WIDTH = 780
|
export const PAGE_WIDTH = 780
|
||||||
export const PAGE_GAP = 0
|
export const PAGE_GAP = 0
|
||||||
|
export const BOUNDARY_LINE_HEIGHT = 12
|
||||||
|
|
||||||
export interface CanvasPageGeometry { pageNumber: number; x: number; y: number; w: number; h: number }
|
export interface CanvasPageGeometry { pageNumber: number; x: number; y: number; w: number; h: number }
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user