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

+394
View File
@@ -4433,6 +4433,203 @@ const de: TranslationDict = {
'grading_review.review_date': 'Pruefungsdatum',
'grading_review.no_discrepancies': 'Keine Abweichungen gefunden',
'grading_review.overall_assessment': 'Gesamtbewertung',
// Grading Enhancement - Task 4/5
'grading.annotate': 'Annotieren',
'grading.save_annotation': 'Anmerkung speichern',
'grading.annotation_saved': 'Anmerkung gespeichert',
'grading.annotation_exists': 'Anmerkung vorhanden',
'grading.ai_review': 'KI-Pruefung',
'grading.ai_reviewing': 'KI prueft...',
'grading.discrepancies_found': 'Abweichungen gefunden',
'grading.no_discrepancies': 'Keine Abweichungen',
'grading.bulk_grade': 'Sammelbenotung',
'grading.bulk_grade_mode': 'Sammelbenotungsmodus',
'grading.bulk_grade_active': 'Sammelbenotung aktiv',
'grading.bulk_grade_select_all': 'Alle auswaehlen',
'grading.bulk_grade_deselect_all': 'Auswahl aufheben',
'grading.bulk_grade_apply': 'Noten anwenden',
'grading.grade_distribution': 'Notenverteilung',
'grading.scratch_pad': 'Notizblock',
'grading.open_scratch_pad': 'Notizblock oeffnen',
'grading.annotation_notes': 'Anmerkungen',
'grading.write_annotation': 'Anmerkung schreiben',
'grading.stylus_annotation': 'Stift-Anmerkung',
// Dashboard Enhancement - Task 4/5
'dashboard.upcoming_exams': 'Anstehende Pruefungen',
'dashboard.upcoming_exams_desc': 'Naechste Pruefungen mit Countdown',
'dashboard.ai_tips': 'KI-Tipps',
'dashboard.ai_tips_desc': 'KI-generierte Vorschlaege fuer Ihren Unterricht',
'dashboard.days_left': 'Tage verbleibend',
'dashboard.tomorrow': 'Morgen',
'dashboard.today': 'Heute',
'dashboard.stat_animated': 'Statistik-Animation',
'dashboard.activity_feed': 'Aktivitaeten-Feed',
'dashboard.recent_activity_feed': 'Neueste Aktivitaeten',
'dashboard.view_profile': 'Profil anzeigen',
// Settings Enhancement - Task 4/5
'settings.ai_settings': 'KI-Einstellungen',
'settings.ai_settings_desc': 'Pollination, OpenAI, Anthropic konfigurieren',
'settings.ai_provider': 'KI-Anbieter',
'settings.ai_api_key': 'API-Schluessel',
'settings.ai_model': 'Modell',
'settings.ai_test_connection': 'Verbindung testen',
'settings.ai_connection_ok': 'Verbindung erfolgreich',
'settings.ai_connection_failed': 'Verbindung fehlgeschlagen',
'settings.virtual_character': 'Virtueller Charakter',
'settings.virtual_character_desc': 'KI-Assistenten konfigurieren',
'settings.virtual_character_toggle': 'Virtueller Charakter aktiviert',
'settings.responsible_teacher': 'Verantwortlicher Lehrer',
'settings.responsible_teacher_desc': 'Klassenlehrer zuweisen',
'settings.disciplinary_committee': 'Disziplinarausschuss',
'settings.disciplinary_committee_desc': 'Mitglieder des Disziplinarausschusses verwalten',
'settings.vice_principal': 'Stellvertretender Schulleiter',
'settings.vice_principal_desc': 'Stellvertretende Schulleiter verwalten',
'settings.data_export': 'Datenexport',
'settings.data_import': 'Datenimport',
'settings.data_import_desc': 'Daten aus CSV oder JSON importieren',
'settings.data_import_file': 'Datei auswaehlen',
'settings.data_import_started': 'Import gestartet',
'settings.data_import_completed': 'Import abgeschlossen',
'settings.tab_ai': 'KI',
'settings.tab_management': 'Verwaltung',
// Layout Enhancement - Task 4/5
'layout.search': 'Suchen',
'layout.search_placeholder': 'Suche nach Klassen, Schuelern...',
'layout.favorites': 'Favoriten',
'layout.recent': 'Kuerzlich angesehen',
'layout.notifications_count': '{count} Benachrichtigungen',
'layout.no_favorites': 'Keine Favoriten',
'layout.add_favorite': 'Zu Favoriten hinzufuegen',
'layout.remove_favorite': 'Aus Favoriten entfernen',
'layout.clear_recent': 'Verlauf loeschen',
// Attendance Enhancement - Task 4/5
'attendance.illness_report': 'Krankmeldung',
'attendance.report_illness': 'Krankmeldung erfassen',
'attendance.illness_start': 'Krankheitsbeginn',
'attendance.illness_end': 'Krankheitsende',
'attendance.illness_reason': 'Grund',
'attendance.illness_doctor_note': 'Arztbescheinigung',
'attendance.illness_reported': 'Krankmeldung erfasst',
'attendance.illness_stats': 'Krankheitsstatistik',
'attendance.illness_trend': 'Krankheitstrend',
'attendance.illness_days': 'Krankheitstage',
// Assessments Enhancement - Task 4/5
'assessments.plan_exam': 'Pruefung planen',
'assessments.generate_test': 'KI-Test generieren',
'assessments.exam_calendar': 'Pruefungskalender',
'assessments.exam_calendar_desc': 'Pruefungen im Kalender anzeigen',
'assessments.create_calendar_event': 'Kalendereintrag erstellen',
'assessments.calendar_event_created': 'Kalendereintrag erstellt',
'assessments.ai_generate_test': 'KI-generierten Test erstellen',
'assessments.ai_generate_desc': 'Basierend auf dem Lehrplan automatisch einen Test generieren',
// Auth Enhancement - Task 4/5
'auth.demo_vice_principal': 'Demo Stellv. Schulleiter',
'auth.feature_showcase': 'Funktionen',
'auth.feature_grading': 'Kompetenzorientierte Benotung',
'auth.feature_grading_desc': 'Benotungsschemata mit Gewichtung und KI-Unterstuetzung',
'auth.feature_attendance': 'Anwesenheit & Krankmeldung',
'auth.feature_attendance_desc': 'Digitale Anwesenheitserfassung mit Krankmeldungen',
'auth.feature_ai': 'KI-Assistent',
'auth.feature_ai_desc': 'Intelligente Testgenerierung und Benotungspruefung',
'auth.feature_collaboration': 'Zusammenarbeit',
'auth.feature_collaboration_desc': 'Elternkommunikation und Notizbuch-Sharing',
// ─── Exam Calendar Integration ──────────────────────────────────────
'calendar.exam_plan': 'Pruefung planen',
'calendar.exam_countdown': 'Pruefung Countdown',
'calendar.in_weeks': 'in {weeks} Wochen',
'calendar.in_days': 'in {days} Tagen',
'calendar.in_one_week': 'in 1 Woche',
'calendar.in_one_day': 'in 1 Tag',
'calendar.tomorrow': 'Morgen',
'calendar.today': 'Heute',
'calendar.exam_type': 'Pruefung',
'calendar.plan_exam': 'Pruefung planen',
'calendar.show_exams': 'Pruefungen anzeigen',
'calendar.hide_exams': 'Pruefungen ausblenden',
'calendar.exam_filter': 'Pruefungsfilter',
'calendar.exam_scheduled': 'Pruefung geplant',
'calendar.exam_details': 'Pruefungsdetails',
'calendar.linked_assessment': 'Verknuepfte Leistungsueberpruefung',
'calendar.create_exam_event': 'Pruefungstermin erstellen',
'calendar.exam_title': 'Pruefungstitel',
'calendar.exam_subject': 'Fach',
'calendar.exam_class': 'Klasse',
'calendar.exam_date': 'Pruefungsdatum',
'calendar.exam_time': 'Pruefungszeit',
'calendar.upcoming_exams': 'Anstehende Pruefungen',
'calendar.no_exams': 'Keine Pruefungen geplant',
'calendar.exam_created': 'Pruefungstermin erstellt',
'calendar.exam_deleted': 'Pruefungstermin geloescht',
'calendar.exam_updated': 'Pruefungstermin aktualisiert',
'calendar.exam_badge': 'Pruefung',
'calendar.all_exams': 'Alle Pruefungen',
// ─── Parent Portal ──────────────────────────────────────────────────
'parent_portal.title': 'Elternportal',
'parent_portal.subtitle': 'Uebersicht ueber Ihre Kinder',
'parent_portal.my_children': 'Meine Kinder',
'parent_portal.pending_approvals': 'Ausstehende Genehmigungen',
'parent_portal.report_illness': 'Krankheit melden',
'parent_portal.approve_illness': 'Krankmeldung genehmigen',
'parent_portal.reject_illness': 'Krankmeldung ablehnen',
'parent_portal.child_grades': 'Noten',
'parent_portal.child_attendance': 'Anwesenheit',
'parent_portal.child_exams': 'Pruefungen',
'parent_portal.child_counseling': 'Beratung',
'parent_portal.child_disciplinary': 'Disziplinarisch',
'parent_portal.request_conversation': 'Gespraech anfragen',
'parent_portal.no_children': 'Keine Kinder verknuepft',
'parent_portal.no_children_desc': 'Ihr Konto ist noch nicht mit einem Schueler verknuepft. Bitte wenden Sie sich an die Schule.',
'parent_portal.child_overview': 'Uebersicht fuer {name}',
'parent_portal.illness_reports': 'Krankmeldungen',
'parent_portal.approve': 'Genehmigen',
'parent_portal.reject': 'Ablehnen',
'parent_portal.approved': 'Genehmigt',
'parent_portal.rejected': 'Abgelehnt',
'parent_portal.illness_approved': 'Krankmeldung genehmigt',
'parent_portal.illness_rejected': 'Krankmeldung abgelehnt',
'parent_portal.conversation_requested': 'Gespraech angefragt',
'parent_portal.upcoming_exams': 'Anstehende Pruefungen',
'parent_portal.recent_grades': 'Aktuelle Noten',
'parent_portal.attendance_summary': 'Anwesenheitsuebersicht',
'parent_portal.counseling_appointments': 'Beratungstermine',
'parent_portal.disciplinary_cases': 'Disziplinarische Faelle',
'parent_portal.quick_actions': 'Schnellaktionen',
'parent_portal.view_details': 'Details anzeigen',
'parent_portal.no_illness_reports': 'Keine Krankmeldungen',
'parent_portal.no_exams': 'Keine Pruefungen',
'parent_portal.no_grades': 'Keine Noten',
'parent_portal.no_counseling': 'Keine Beratungstermine',
'parent_portal.no_disciplinary': 'Keine disziplinarischen Faelle',
'parent_portal.select_child': 'Kind auswaehlen',
'parent_portal.days_absent': 'Tage abwesend',
'parent_portal.days_present': 'Tage anwesend',
'parent_portal.attendance_rate': 'Anwesenheitsrate',
'parent_portal.all_children': 'Alle Kinder',
// ─── Content Crawl ──────────────────────────────────────────────────
'subjects.crawl': 'Inhalte crawlen',
'subjects.crawl_desc': 'Schlaukopf.de-Seite crawlen und Inhalte generieren',
'subjects.crawl_url': 'Schlaukopf URL',
'subjects.crawl_url_placeholder': 'https://www.schlaukopf.de/gymnasium/klasse5/mathematik/',
'subjects.crawling': 'Crawle Inhalte...',
'subjects.crawl_success': 'Inhalte erfolgreich gecrawlt und gespeichert',
'subjects.crawl_error': 'Fehler beim Crawlen der Inhalte',
'subjects.crawl_results': 'Crawl-Ergebnisse',
'subjects.crawl_topics_found': 'Gefundene Themen',
'subjects.crawl_contents_created': 'Erstellte Inhalte',
'subjects.generate_with_ai': 'Mit KI generieren',
'subjects.crawl_admin_only': 'Nur fuer Administratoren',
'subjects.crawl_progress': 'Crawl-Fortschritt',
'subjects.crawl_complete': 'Crawl abgeschlossen',
};
const en: TranslationDict = {
@@ -8864,6 +9061,203 @@ const en: TranslationDict = {
'grading_review.review_date': 'Review Date',
'grading_review.no_discrepancies': 'No discrepancies found',
'grading_review.overall_assessment': 'Overall Assessment',
// Grading Enhancement - Task 4/5
'grading.annotate': 'Annotate',
'grading.save_annotation': 'Save Annotation',
'grading.annotation_saved': 'Annotation saved',
'grading.annotation_exists': 'Annotation exists',
'grading.ai_review': 'AI Review',
'grading.ai_reviewing': 'AI reviewing...',
'grading.discrepancies_found': 'Discrepancies found',
'grading.no_discrepancies': 'No discrepancies',
'grading.bulk_grade': 'Bulk Grade',
'grading.bulk_grade_mode': 'Bulk Grading Mode',
'grading.bulk_grade_active': 'Bulk grading active',
'grading.bulk_grade_select_all': 'Select all',
'grading.bulk_grade_deselect_all': 'Deselect all',
'grading.bulk_grade_apply': 'Apply Grades',
'grading.grade_distribution': 'Grade Distribution',
'grading.scratch_pad': 'Scratch Pad',
'grading.open_scratch_pad': 'Open Scratch Pad',
'grading.annotation_notes': 'Annotation Notes',
'grading.write_annotation': 'Write Annotation',
'grading.stylus_annotation': 'Stylus Annotation',
// Dashboard Enhancement - Task 4/5
'dashboard.upcoming_exams': 'Upcoming Exams',
'dashboard.upcoming_exams_desc': 'Next exams with countdown',
'dashboard.ai_tips': 'AI Tips',
'dashboard.ai_tips_desc': 'AI-generated suggestions for your teaching',
'dashboard.days_left': 'days left',
'dashboard.tomorrow': 'Tomorrow',
'dashboard.today': 'Today',
'dashboard.stat_animated': 'Animated Statistics',
'dashboard.activity_feed': 'Activity Feed',
'dashboard.recent_activity_feed': 'Recent Activity',
'dashboard.view_profile': 'View Profile',
// Settings Enhancement - Task 4/5
'settings.ai_settings': 'AI Settings',
'settings.ai_settings_desc': 'Configure Pollination, OpenAI, Anthropic',
'settings.ai_provider': 'AI Provider',
'settings.ai_api_key': 'API Key',
'settings.ai_model': 'Model',
'settings.ai_test_connection': 'Test Connection',
'settings.ai_connection_ok': 'Connection successful',
'settings.ai_connection_failed': 'Connection failed',
'settings.virtual_character': 'Virtual Character',
'settings.virtual_character_desc': 'Configure AI assistants',
'settings.virtual_character_toggle': 'Virtual character enabled',
'settings.responsible_teacher': 'Responsible Teacher',
'settings.responsible_teacher_desc': 'Assign class teachers',
'settings.disciplinary_committee': 'Disciplinary Committee',
'settings.disciplinary_committee_desc': 'Manage disciplinary committee members',
'settings.vice_principal': 'Vice Principal',
'settings.vice_principal_desc': 'Manage vice principals',
'settings.data_export': 'Data Export',
'settings.data_import': 'Data Import',
'settings.data_import_desc': 'Import data from CSV or JSON',
'settings.data_import_file': 'Select file',
'settings.data_import_started': 'Import started',
'settings.data_import_completed': 'Import completed',
'settings.tab_ai': 'AI',
'settings.tab_management': 'Management',
// Layout Enhancement - Task 4/5
'layout.search': 'Search',
'layout.search_placeholder': 'Search classes, students...',
'layout.favorites': 'Favorites',
'layout.recent': 'Recently viewed',
'layout.notifications_count': '{count} notifications',
'layout.no_favorites': 'No favorites',
'layout.add_favorite': 'Add to favorites',
'layout.remove_favorite': 'Remove from favorites',
'layout.clear_recent': 'Clear history',
// Attendance Enhancement - Task 4/5
'attendance.illness_report': 'Illness Report',
'attendance.report_illness': 'Report Illness',
'attendance.illness_start': 'Illness Start',
'attendance.illness_end': 'Illness End',
'attendance.illness_reason': 'Reason',
'attendance.illness_doctor_note': 'Doctor\'s Note',
'attendance.illness_reported': 'Illness reported',
'attendance.illness_stats': 'Illness Statistics',
'attendance.illness_trend': 'Illness Trend',
'attendance.illness_days': 'Illness Days',
// Assessments Enhancement - Task 4/5
'assessments.plan_exam': 'Plan Exam',
'assessments.generate_test': 'Generate AI Test',
'assessments.exam_calendar': 'Exam Calendar',
'assessments.exam_calendar_desc': 'View exams in calendar',
'assessments.create_calendar_event': 'Create Calendar Event',
'assessments.calendar_event_created': 'Calendar event created',
'assessments.ai_generate_test': 'Create AI-Generated Test',
'assessments.ai_generate_desc': 'Automatically generate a test based on the curriculum',
// Auth Enhancement - Task 4/5
'auth.demo_vice_principal': 'Demo Vice Principal',
'auth.feature_showcase': 'Features',
'auth.feature_grading': 'Competency-Based Grading',
'auth.feature_grading_desc': 'Grading schemes with weighting and AI support',
'auth.feature_attendance': 'Attendance & Illness',
'auth.feature_attendance_desc': 'Digital attendance tracking with illness reports',
'auth.feature_ai': 'AI Assistant',
'auth.feature_ai_desc': 'Intelligent test generation and grading review',
'auth.feature_collaboration': 'Collaboration',
'auth.feature_collaboration_desc': 'Parent communication and notebook sharing',
// ─── Exam Calendar Integration ──────────────────────────────────────
'calendar.exam_plan': 'Plan Exam',
'calendar.exam_countdown': 'Exam Countdown',
'calendar.in_weeks': 'in {weeks} weeks',
'calendar.in_days': 'in {days} days',
'calendar.in_one_week': 'in 1 week',
'calendar.in_one_day': 'in 1 day',
'calendar.tomorrow': 'Tomorrow',
'calendar.today': 'Today',
'calendar.exam_type': 'Exam',
'calendar.plan_exam': 'Plan Exam',
'calendar.show_exams': 'Show Exams',
'calendar.hide_exams': 'Hide Exams',
'calendar.exam_filter': 'Exam Filter',
'calendar.exam_scheduled': 'Exam Scheduled',
'calendar.exam_details': 'Exam Details',
'calendar.linked_assessment': 'Linked Assessment',
'calendar.create_exam_event': 'Create Exam Event',
'calendar.exam_title': 'Exam Title',
'calendar.exam_subject': 'Subject',
'calendar.exam_class': 'Class',
'calendar.exam_date': 'Exam Date',
'calendar.exam_time': 'Exam Time',
'calendar.upcoming_exams': 'Upcoming Exams',
'calendar.no_exams': 'No exams scheduled',
'calendar.exam_created': 'Exam event created',
'calendar.exam_deleted': 'Exam event deleted',
'calendar.exam_updated': 'Exam event updated',
'calendar.exam_badge': 'Exam',
'calendar.all_exams': 'All Exams',
// ─── Parent Portal ──────────────────────────────────────────────────
'parent_portal.title': 'Parent Portal',
'parent_portal.subtitle': 'Overview of your children',
'parent_portal.my_children': 'My Children',
'parent_portal.pending_approvals': 'Pending Approvals',
'parent_portal.report_illness': 'Report Illness',
'parent_portal.approve_illness': 'Approve Illness Report',
'parent_portal.reject_illness': 'Reject Illness Report',
'parent_portal.child_grades': 'Grades',
'parent_portal.child_attendance': 'Attendance',
'parent_portal.child_exams': 'Exams',
'parent_portal.child_counseling': 'Counseling',
'parent_portal.child_disciplinary': 'Disciplinary',
'parent_portal.request_conversation': 'Request Conversation',
'parent_portal.no_children': 'No children linked',
'parent_portal.no_children_desc': 'Your account is not linked to any student yet. Please contact the school.',
'parent_portal.child_overview': 'Overview for {name}',
'parent_portal.illness_reports': 'Illness Reports',
'parent_portal.approve': 'Approve',
'parent_portal.reject': 'Reject',
'parent_portal.approved': 'Approved',
'parent_portal.rejected': 'Rejected',
'parent_portal.illness_approved': 'Illness report approved',
'parent_portal.illness_rejected': 'Illness report rejected',
'parent_portal.conversation_requested': 'Conversation requested',
'parent_portal.upcoming_exams': 'Upcoming Exams',
'parent_portal.recent_grades': 'Recent Grades',
'parent_portal.attendance_summary': 'Attendance Summary',
'parent_portal.counseling_appointments': 'Counseling Appointments',
'parent_portal.disciplinary_cases': 'Disciplinary Cases',
'parent_portal.quick_actions': 'Quick Actions',
'parent_portal.view_details': 'View Details',
'parent_portal.no_illness_reports': 'No illness reports',
'parent_portal.no_exams': 'No exams',
'parent_portal.no_grades': 'No grades',
'parent_portal.no_counseling': 'No counseling appointments',
'parent_portal.no_disciplinary': 'No disciplinary cases',
'parent_portal.select_child': 'Select Child',
'parent_portal.days_absent': 'Days Absent',
'parent_portal.days_present': 'Days Present',
'parent_portal.attendance_rate': 'Attendance Rate',
'parent_portal.all_children': 'All Children',
// ─── Content Crawl ──────────────────────────────────────────────────
'subjects.crawl': 'Crawl Content',
'subjects.crawl_desc': 'Crawl schlaukopf.de pages and generate content',
'subjects.crawl_url': 'Schlaukopf URL',
'subjects.crawl_url_placeholder': 'https://www.schlaukopf.de/gymnasium/klasse5/mathematik/',
'subjects.crawling': 'Crawling content...',
'subjects.crawl_success': 'Content successfully crawled and saved',
'subjects.crawl_error': 'Error crawling content',
'subjects.crawl_results': 'Crawl Results',
'subjects.crawl_topics_found': 'Topics Found',
'subjects.crawl_contents_created': 'Contents Created',
'subjects.generate_with_ai': 'Generate with AI',
'subjects.crawl_admin_only': 'Admin Only',
'subjects.crawl_progress': 'Crawl Progress',
'subjects.crawl_complete': 'Crawl Complete',
};
const translations: Record<string, TranslationDict> = { de, en };