feat: Round 22 - Exam calendar, parent portal, teacher grading, deep styling

- Exam calendar integration: Plan Exam button, countdown badges, exam filter
- Parent portal: Children overview, illness approvals, grades, attendance
- Teacher grading: Stylus annotation, AI review, bulk grading mode
- Deep schlaukopf crawling: AI-powered content extraction from schlaukopf.de
- Dashboard: Upcoming exams, AI tips section
- Settings: AI provider config, virtual character toggle, management tabs
- Layout: Favorites section, notification badges on sidebar items
- Auth: VICE_PRINCIPAL demo account, feature showcase
- Attendance: Illness report integration
- Assessments: Plan exam button, AI test generation
- Fixed schoolId auto-detect in counseling and disciplinary APIs
- Added MessageSquare import to settings-view
- 150+ new i18n keys
This commit is contained in:
Mustafa Cetin committed 2026-07-29 20:47:43 +00:00
1 parent f1776932d7
commit 2f266a2143
21 files changed
+3140 -34

No files matched your search

+22 -1
View File
@@ -560,6 +560,27 @@ export function createGradingScheme(data: {
return apiPost<GradingScheme>('/api/grading', data);
}
/* ── Grading Annotations ─────────────────────────────────────────── */
export interface GradingAnnotation {
id: string;
annotationData: string;
annotationImage: string | null;
}
export function fetchGradingAnnotation(assessmentId: string, studentId: string): Promise<{ annotation: GradingAnnotation | null }> {
return apiGet(`/api/grading/annotate?assessmentId=${assessmentId}&studentId=${studentId}`);
}
export function saveGradingAnnotation(data: {
assessmentId: string;
studentId: string;
annotationData: string;
annotationImage?: string;
}): Promise<{ annotation: GradingAnnotation }> {
return apiPost('/api/grading/annotate', data);
}
/* ── Reports ──────────────────────────────────────────────────────── */
export interface ReportSection {
@@ -1648,7 +1669,7 @@ export function fetchCalendarEvents(schoolId: string, month: string): Promise<Ca
/* ── Calendar Events (Custom) ──────────────────────────────────── */
export type CalendarEventItemType = 'assessment' | 'lesson' | 'reminder';
export type CalendarEventItemType = 'assessment' | 'lesson' | 'reminder' | 'exam';
export interface RecurrencePattern {
type: 'none' | 'daily' | 'weekly' | 'monthly' | 'yearly';