Compare commits

..
Author SHA1 Message Date
kcar ede9a78459 chore: preserve app workspace t_41bd9518 2026-08-09 20:24:43 +01:00
3 changed files with 6 additions and 16 deletions
-1
View File
@@ -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 />} />
+5 -15
View File
@@ -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');
}; };
+1
View File
@@ -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 }