feat: Round 24 - Klassenlehrer management, vice principal, exam calendar, student portal exams

- Klassenlehrer management: Assign/change responsible teacher, privilege badges
- Vice principal management: Assign/remove VP role, admins list
- Calendar exam integration: Exam countdown, print calendar, exam filter
- Student portal: Exams tab with countdown, AI study tips, virtual character
- Dashboard: Klassenlehrer section with pending illness/communications
- API: PUT /api/users/role for role management
- API: Enhanced classes GET to include responsibleTeacher
- 90+ new i18n keys
This commit is contained in:
Mustafa Cetin committed 2026-07-29 21:13:32 +00:00
1 parent 44ff170fca
commit f2caf267c7
12 files changed
+1522 -14

No files matched your search

+4 -1
View File
@@ -155,10 +155,13 @@ export interface ClassGroup {
schoolType: string;
school: { id: string; name: string };
schoolYear: { id: string; label: string };
responsibleTeacherId?: string | null;
responsibleTeacher?: { id: string; firstName: string; lastName: string; email: string } | null;
teachers: Array<{ id: string; userId: string; role: string; user: { id: string; firstName: string; lastName: string; email: string } }>;
studentCount?: number;
assessmentCount?: number;
teacherList?: Array<{ id: string; firstName: string; lastName: string; teacherRole: string }>;
_count?: { enrollments?: number; competencyAssignments?: number; [key: string]: unknown };
_count?: { enrollments?: number; competencyAssignments?: number; assessments?: number; [key: string]: unknown };
}
export function fetchClasses(schoolId?: string, schoolYearId?: string): Promise<ClassGroup[]> {
+180
View File
@@ -4814,6 +4814,96 @@ const de: TranslationDict = {
'communication.voice_recording_error': 'Mikrofonzugriff verweigert',
'communication.play_voice': 'Sprachnachricht abspielen',
'communication.pause_voice': 'Sprachnachricht pausieren',
// ── Responsible Teacher / Klassenlehrer ──
'classes.responsible_teacher': 'Klassenlehrer',
'classes.klassenlehrer': 'Klassenlehrer',
'classes.assign_teacher': 'Klassenlehrer zuweisen',
'classes.change_teacher': 'Klassenlehrer ändern',
'classes.teacher_privileges': 'Lehrer-Berechtigungen',
'classes.illness_access': 'Zugang zu Krankmeldungen',
'classes.communication_access': 'Kommunikationsanfragen prüfen',
'classes.counseling_access': 'Beratungstermine einsehen',
'classes.disciplinary_access': 'Disziplinarische Vorfälle erhalten',
'classes.no_responsible_teacher': 'Kein Klassenlehrer zugewiesen',
'classes.teacher_assigned': 'Klassenlehrer zugewiesen',
'classes.teacher_changed': 'Klassenlehrer geändert',
'classes.select_teacher': 'Lehrer auswählen',
'classes.class_statistics': 'Klassenstatistik',
'classes.student_progress': 'Schülerfortschritt',
'classes.class_color': 'Klassenfarbe',
'classes.avg_mastery': 'Durchschnitt Kompetenzniveau',
'classes.total_students': 'Gesamt Schüler',
'classes.active_assessments': 'Aktive Prüfungen',
'classes.teacher_badge': 'Klassenlehrer',
'classes.privileges_info': 'Der Klassenlehrer hat besondere Rechte: Krankmeldungen, Kommunikationsanfragen, Beratungstermine und Disziplinarfälle für diese Klasse.',
// ── Vice Principal ──
'settings.vice_principal': 'Stellvertretender Schulleiter',
'settings.vice_principal_short': 'Stv. Schulleiter',
'settings.assign_vice_principal': 'Zum Stellv. Schulleiter ernennen',
'settings.remove_vice_principal': 'Stellv. Schulleiter-Rolle entfernen',
'settings.current_admins': 'Aktuelle Administratoren',
'settings.admin_list': 'Admin-Liste',
'settings.role_changed': 'Rolle geändert',
'settings.role_removed': 'Rolle entfernt',
'settings.confirm_role_change': 'Rolle wirklich ändern?',
'settings.confirm_role_remove': 'Stellv. Schulleiter-Rolle wirklich entfernen?',
'settings.vice_principal_desc': 'Stellvertretende Schulleiter haben erweiterte Rechte, ähnlich wie Schulleiter, können aber keine Super-Admins erstellen.',
'settings.manage_roles': 'Rollen verwalten',
'settings.user_role': 'Benutzerrolle',
// ── Calendar Exam Integration ──
'calendar.exam_mode': 'Prüfungsmodus',
'calendar.exam_marker': 'Prüfung',
'calendar.print': 'Kalender drucken',
'calendar.exam_details': 'Prüfungsdetails',
'calendar.plan_exam': 'Prüfung planen',
'calendar.exam_filter': 'Nur Prüfungen anzeigen',
'calendar.exam_countdown': 'Tage bis Prüfung',
'calendar.exam_today': 'Heute',
'calendar.exam_tomorrow': 'Morgen',
'calendar.exam_in_days': 'In {days} Tagen',
'calendar.exam_in_weeks': 'In {weeks} Wochen',
'calendar.no_exams': 'Keine Prüfungen geplant',
'calendar.exam_subject': 'Fach',
'calendar.exam_class': 'Klasse',
'calendar.exam_teacher': 'Lehrer',
'calendar.exam_type': 'Prüfungstyp',
'calendar.exam_notes': 'Prüfungshinweise',
'calendar.exam_created': 'Prüfung erstellt',
'calendar.show_all': 'Alle anzeigen',
'calendar.show_exams_only': 'Nur Prüfungen',
// ── Dashboard Klassenlehrer ──
'dashboard.klassenlehrer_section': 'Klassenlehrer-Übersicht',
'dashboard.pending_illness': 'Ausstehende Krankmeldungen',
'dashboard.pending_communications': 'Offene Kommunikationsanfragen',
'dashboard.class_overview': 'Klassenübersicht',
'dashboard.upcoming_exams': 'Anstehende Prüfungen',
'dashboard.my_classes': 'Meine Klassen',
'dashboard.no_illness_reports': 'Keine ausstehenden Krankmeldungen',
'dashboard.no_communications': 'Keine offenen Anfragen',
'dashboard.quick_actions': 'Schnellaktionen',
// ── Student Portal Enhancements ──
'portal.upcoming_exams': 'Anstehende Prüfungen',
'portal.study_tips': 'Lerntipps',
'portal.practice_recommendations': 'Übungsempfehlungen',
'portal.ai_assistant': 'KI-Assistent',
'portal.exam_countdown': 'Prüfung_countdown',
'portal.days_left': 'Tage verbleibend',
'portal.prepare_exam': 'Prüfung vorbereiten',
'portal.no_exams_scheduled': 'Keine Prüfungen geplant',
'portal.ai_study_tip': 'KI-Lerntipp',
'portal.recommended_exercises': 'Empfohlene Übungen',
'portal.start_practice': 'Übung starten',
'portal.virtual_character': 'Virtueller Begleiter',
'portal.ask_ai': 'KI fragen',
'portal.exam_ready': 'Prüfungsbereit',
'portal.study_progress': 'Lernfortschritt',
'portal.focus_areas': 'Schwerpunkte',
'portal.motivation_message': 'Weiter so! Du bist auf dem richtigen Weg.',
};
const en: TranslationDict = {
@@ -9626,6 +9716,96 @@ const en: TranslationDict = {
'communication.voice_recording_error': 'Microphone access denied',
'communication.play_voice': 'Play voice message',
'communication.pause_voice': 'Pause voice message',
// ── Responsible Teacher / Klassenlehrer ──
'classes.responsible_teacher': 'Responsible Teacher',
'classes.klassenlehrer': 'Homeroom Teacher',
'classes.assign_teacher': 'Assign Responsible Teacher',
'classes.change_teacher': 'Change Responsible Teacher',
'classes.teacher_privileges': 'Teacher Privileges',
'classes.illness_access': 'Illness Report Access',
'classes.communication_access': 'Communication Request Review',
'classes.counseling_access': 'Counseling Appointment Access',
'classes.disciplinary_access': 'Disciplinary Case Notifications',
'classes.no_responsible_teacher': 'No responsible teacher assigned',
'classes.teacher_assigned': 'Responsible teacher assigned',
'classes.teacher_changed': 'Responsible teacher changed',
'classes.select_teacher': 'Select Teacher',
'classes.class_statistics': 'Class Statistics',
'classes.student_progress': 'Student Progress',
'classes.class_color': 'Class Color',
'classes.avg_mastery': 'Average Mastery Level',
'classes.total_students': 'Total Students',
'classes.active_assessments': 'Active Assessments',
'classes.teacher_badge': 'Homeroom Teacher',
'classes.privileges_info': 'The responsible teacher has special privileges: illness reports, communication requests, counseling appointments, and disciplinary cases for this class.',
// ── Vice Principal ──
'settings.vice_principal': 'Vice Principal',
'settings.vice_principal_short': 'Vice Principal',
'settings.assign_vice_principal': 'Assign Vice Principal Role',
'settings.remove_vice_principal': 'Remove Vice Principal Role',
'settings.current_admins': 'Current Administrators',
'settings.admin_list': 'Admin List',
'settings.role_changed': 'Role changed',
'settings.role_removed': 'Role removed',
'settings.confirm_role_change': 'Are you sure you want to change this role?',
'settings.confirm_role_remove': 'Are you sure you want to remove the Vice Principal role?',
'settings.vice_principal_desc': 'Vice Principals have extended privileges similar to school admins, but cannot create super admins.',
'settings.manage_roles': 'Manage Roles',
'settings.user_role': 'User Role',
// ── Calendar Exam Integration ──
'calendar.exam_mode': 'Exam Mode',
'calendar.exam_marker': 'Exam',
'calendar.print': 'Print Calendar',
'calendar.exam_details': 'Exam Details',
'calendar.plan_exam': 'Plan Exam',
'calendar.exam_filter': 'Show Exams Only',
'calendar.exam_countdown': 'Days Until Exam',
'calendar.exam_today': 'Today',
'calendar.exam_tomorrow': 'Tomorrow',
'calendar.exam_in_days': 'In {days} days',
'calendar.exam_in_weeks': 'In {weeks} weeks',
'calendar.no_exams': 'No exams scheduled',
'calendar.exam_subject': 'Subject',
'calendar.exam_class': 'Class',
'calendar.exam_teacher': 'Teacher',
'calendar.exam_type': 'Exam Type',
'calendar.exam_notes': 'Exam Notes',
'calendar.exam_created': 'Exam created',
'calendar.show_all': 'Show All',
'calendar.show_exams_only': 'Exams Only',
// ── Dashboard Klassenlehrer ──
'dashboard.klassenlehrer_section': 'Homeroom Teacher Overview',
'dashboard.pending_illness': 'Pending Illness Reports',
'dashboard.pending_communications': 'Open Communication Requests',
'dashboard.class_overview': 'Class Overview',
'dashboard.upcoming_exams': 'Upcoming Exams',
'dashboard.my_classes': 'My Classes',
'dashboard.no_illness_reports': 'No pending illness reports',
'dashboard.no_communications': 'No open requests',
'dashboard.quick_actions': 'Quick Actions',
// ── Student Portal Enhancements ──
'portal.upcoming_exams': 'Upcoming Exams',
'portal.study_tips': 'Study Tips',
'portal.practice_recommendations': 'Practice Recommendations',
'portal.ai_assistant': 'AI Assistant',
'portal.exam_countdown': 'Exam Countdown',
'portal.days_left': 'Days Left',
'portal.prepare_exam': 'Prepare for Exam',
'portal.no_exams_scheduled': 'No exams scheduled',
'portal.ai_study_tip': 'AI Study Tip',
'portal.recommended_exercises': 'Recommended Exercises',
'portal.start_practice': 'Start Practice',
'portal.virtual_character': 'Virtual Companion',
'portal.ask_ai': 'Ask AI',
'portal.exam_ready': 'Exam Ready',
'portal.study_progress': 'Study Progress',
'portal.focus_areas': 'Focus Areas',
'portal.motivation_message': 'Keep going! You are on the right track.',
};
const translations: Record<string, TranslationDict> = { de, en };