Round 16: Peer Assessment, Emergency Contacts, School Events, School Branding, Email Templates, Performance, Styling Polish, Onboarding 24 Steps

This commit is contained in:
Mustafa Cetin committed 2026-07-29 11:45:24 +00:00
1 parent d45ba030f5
commit 6174f127f9
30 files changed
+4835 -142

No files matched your search

+106 -2
View File
@@ -642,6 +642,17 @@ export interface School {
schoolType: string;
country: string;
timezone: string;
logoUrl?: string | null;
primaryColor?: string | null;
secondaryColor?: string | null;
accentColor?: string | null;
fontFamily?: string | null;
customCss?: string | null;
motto?: string | null;
websiteUrl?: string | null;
emailDomain?: string | null;
address?: string | null;
phone?: string | null;
_count: { users: number; classGroups: number; students: number };
}
@@ -682,6 +693,17 @@ export function updateSchool(data: {
schoolType?: string;
country?: string;
timezone?: string;
logoUrl?: string | null;
primaryColor?: string | null;
secondaryColor?: string | null;
accentColor?: string | null;
fontFamily?: string | null;
customCss?: string | null;
motto?: string | null;
websiteUrl?: string | null;
emailDomain?: string | null;
address?: string | null;
phone?: string | null;
}) {
return apiPut<School>('/api/schools', data);
}
@@ -865,22 +887,104 @@ export function downloadCsvExport(params: {
classGroupId?: string;
schoolYearId?: string;
schoolId?: string;
format?: 'csv' | 'json';
dateFrom?: string;
dateTo?: string;
}): void {
const sp = new URLSearchParams();
sp.set('type', params.type);
if (params.classGroupId) sp.set('classGroupId', params.classGroupId);
if (params.schoolYearId) sp.set('schoolYearId', params.schoolYearId);
if (params.schoolId) sp.set('schoolId', params.schoolId);
// Direct download — triggers browser download
if (params.dateFrom) sp.set('dateFrom', params.dateFrom);
if (params.dateTo) sp.set('dateTo', params.dateTo);
const format = params.format || 'csv';
const url = `/api/data-export/csv?${sp.toString()}`;
const a = document.createElement('a');
a.href = url;
a.download = `${params.type}_export.csv`;
a.download = `${params.type}_export.${format}`;
document.body.appendChild(a);
a.click();
document.body.removeChild(a);
}
/* ── Email Templates ──────────────────────────────────────────────── */
export interface EmailTemplate {
id: string;
schoolId: string;
name: string;
subject: string;
body: string;
isDefault: boolean;
isDemo: boolean;
createdAt: string;
updatedAt: string;
deletedAt: string | null;
}
export interface EmailLog {
id: string;
schoolId: string;
templateId: string | null;
recipientEmail: string;
recipientName: string | null;
subject: string;
body: string;
status: string;
sentAt: string | null;
error: string | null;
createdAt: string;
}
export function fetchEmailTemplates(schoolId: string): Promise<EmailTemplate[]> {
return apiGet<EmailTemplate[]>(`/api/email-templates?schoolId=${schoolId}`);
}
export function createEmailTemplate(data: {
schoolId: string;
name: string;
subject: string;
body: string;
isDefault?: boolean;
}): Promise<EmailTemplate> {
return apiPost<EmailTemplate>('/api/email-templates', data);
}
export function updateEmailTemplate(id: string, data: {
name?: string;
subject?: string;
body?: string;
isDefault?: boolean;
}): Promise<EmailTemplate> {
return apiPut<EmailTemplate>(`/api/email-templates/${id}`, data);
}
export function deleteEmailTemplate(id: string): Promise<{ success: boolean }> {
return apiDelete<{ success: boolean }>(`/api/email-templates/${id}`);
}
export function sendTestEmail(data: {
schoolId: string;
templateId?: string;
recipientEmail: string;
recipientName?: string;
subject: string;
body: string;
}): Promise<{ success: boolean; logId: string; message: string }> {
return apiPost<{ success: boolean; logId: string; message: string }>('/api/email-templates/send', {
...data,
isTest: true,
});
}
export function fetchEmailLogs(schoolId: string, status?: string): Promise<{ logs: EmailLog[]; counts: { total: number; sent: number; failed: number; pending: number; bounced: number } }> {
const sp = new URLSearchParams();
sp.set('schoolId', schoolId);
if (status) sp.set('status', status);
return apiGet(`/api/email-logs?${sp.toString()}`);
}
/* ── Data Erasure (GDPR) ──────────────────────────────────────────── */
export function requestDataErasure(data: {
+79
View File
@@ -0,0 +1,79 @@
// CompetenceTrack — In-memory API response cache utility
// Provides TTL-based caching for API responses to reduce redundant fetches
interface CacheEntry<T> {
data: T;
timestamp: number;
ttl: number; // time to live in ms
}
const cache = new Map<string, CacheEntry<any>>();
/**
* Get cached data or fetch and cache it.
* If the cache entry exists and is not expired, returns cached data.
* Otherwise, calls the fetcher, caches the result, and returns it.
*/
export function getCached<T>(key: string, fetcher: () => Promise<T>, ttlMs: number = 30000): Promise<T> {
const entry = cache.get(key);
if (entry && Date.now() - entry.timestamp < entry.ttl) {
return Promise.resolve(entry.data as T);
}
return fetcher().then((data) => {
cache.set(key, { data, timestamp: Date.now(), ttl: ttlMs });
return data;
});
}
/**
* Invalidate a specific cache entry by key.
*/
export function invalidateCache(key: string): void {
cache.delete(key);
}
/**
* Invalidate all cache entries whose key matches a pattern.
* Pattern uses simple wildcard: '*' matches any characters.
* Example: invalidateCachePattern('dashboard:*') clears all keys starting with 'dashboard:'
*/
export function invalidateCachePattern(pattern: string): void {
const regexStr = pattern.replace(/\*/g, '.*');
const regex = new RegExp(`^${regexStr}$`);
for (const key of cache.keys()) {
if (regex.test(key)) {
cache.delete(key);
}
}
}
/**
* Clear all cache entries.
*/
export function clearCache(): void {
cache.clear();
}
/**
* Get cache stats for debugging.
*/
export function getCacheStats(): { size: number; keys: string[] } {
return {
size: cache.size,
keys: [...cache.keys()],
};
}
// Default TTLs for different API types
export const CACHE_TTL = {
DASHBOARD: 30000, // 30s
ANALYTICS: 60000, // 60s
NOTIFICATIONS: 15000, // 15s
SCHOOL_YEARS: 120000, // 120s
COMPETENCY_TEMPLATES: 120000, // 120s
CLASSES: 60000, // 60s
STUDENTS: 60000, // 60s
ATTENDANCE: 30000, // 30s
ASSESSMENTS: 45000, // 45s
} as const;
+484
View File
@@ -2842,6 +2842,248 @@ const de: TranslationDict = {
'resources.tags_field': 'Schlagwörter',
'resources.add_tag': 'Schlagwort hinzufügen',
'resources.delete_confirm': 'Ressource wirklich löschen?',
// ─── School Branding ──────────────────────────────────────────────
'branding.title': 'Schulbranding',
'branding.logo': 'Logo',
'branding.logo_url': 'Logo-URL',
'branding.logo_placeholder': 'https://schule.de/logo.png',
'branding.primary_color': 'Primärfarbe',
'branding.secondary_color': 'Sekundärfarbe',
'branding.accent_color': 'Akzentfarbe',
'branding.font': 'Schriftart',
'branding.motto': 'Schulmotto',
'branding.motto_placeholder': 'Gemeinsam lernen, gemeinsam wachsen',
'branding.website': 'Webseite',
'branding.website_placeholder': 'https://schule.de',
'branding.preview': 'Vorschau',
'branding.custom_css': 'Custom CSS',
'branding.custom_css_placeholder': '/* Eigene CSS-Overrides */',
'branding.email_domain': 'E-Mail-Domain',
'branding.email_domain_placeholder': '@schule.de',
'branding.address': 'Adresse',
'branding.phone': 'Telefon',
'branding.saved': 'Branding gespeichert',
'branding.tab': 'Branding',
'branding.colors': 'Farben',
'branding.typography': 'Typografie',
'branding.contact': 'Kontaktinformationen',
'branding.reset': 'Zurücksetzen',
// ─── Email Templates ──────────────────────────────────────────────
'email.templates': 'E-Mail-Vorlagen',
'email.templates_title': 'E-Mail-Vorlagen',
'email.templates_desc': 'E-Mail-Vorlagen für automatische Benachrichtigungen',
'email.weekly_report': 'Wochenbericht',
'email.assessment_reminder': 'Bewertungs-Erinnerung',
'email.behavior_alert': 'Verhaltens-Alert',
'email.attendance_notice': 'Anwesenheits-Notice',
'email.welcome': 'Willkommen',
'email.send_test': 'Test-E-Mail senden',
'email.send_test_desc': 'E-Mail-Vorschau an Ihre Adresse senden',
'email.log': 'E-Mail-Log',
'email.log_title': 'E-Mail-Versandprotokoll',
'email.smtp': 'SMTP-Konfiguration',
'email.smtp_host': 'SMTP-Server',
'email.smtp_port': 'Port',
'email.smtp_user': 'Benutzername',
'email.smtp_password': 'Passwort',
'email.smtp_from': 'Absenderadresse',
'email.frequency': 'E-Mail-Häufigkeit',
'email.frequency_daily': 'Täglich',
'email.frequency_weekly': 'Wöchentlich',
'email.frequency_monthly': 'Monatlich',
'email.auto_reports': 'Berichte automatisch senden',
'email.auto_behavior': 'Verhaltens-Alerts senden',
'email.auto_attendance': 'Anwesenheits-Notices senden',
'email.template_name': 'Name',
'email.template_subject': 'Betreff',
'email.template_body': 'Inhalt',
'email.template_variables': 'Verfügbare Variablen',
'email.template_preview': 'Vorschau',
'email.template_create': 'Vorlage erstellen',
'email.template_edit': 'Vorlage bearbeiten',
'email.template_delete': 'Vorlage löschen',
'email.template_delete_confirm': 'Vorlage wirklich löschen?',
'email.template_default': 'Standardvorlage',
'email.status_sent': 'Gesendet',
'email.status_failed': 'Fehlgeschlagen',
'email.status_pending': 'Ausstehend',
'email.status_bounced': 'Zurückgewiesen',
'email.recipient': 'Empfänger',
'email.sent_at': 'Gesendet am',
'email.tab': 'E-Mail',
'email.settings': 'E-Mail-Einstellungen',
'email.test_sent': 'Test-E-Mail gesendet',
'email.test_recipient': 'Empfänger-E-Mail',
'email.counts': 'E-Mail-Statistik',
// ─── Data Export Enhancement ──────────────────────────────────────
'export.pdf': 'PDF-Export',
'export.json': 'JSON-Export',
'export.csv': 'CSV-Export',
'export.filter': 'Filter',
'export.date_range': 'Datumsbereich',
'export.date_from': 'Von',
'export.date_to': 'Bis',
'export.format': 'Format',
'export.select_format': 'Format wählen',
'export.select_class': 'Klasse wählen',
'export.all_classes': 'Alle Klassen',
'export.grade_report': 'Notenbericht',
'export.attendance_report': 'Anwesenheitsbericht',
'export.competency_report': 'Kompetenzbericht',
'export.progress_indicator': 'Export wird vorbereitet...',
'export.download_history': 'Download-Verlauf',
'export.no_history': 'Noch keine Exporte',
'export.enhanced_title': 'Erweiterter Datenexport',
'export.enhanced_desc': 'Daten in verschiedenen Formaten mit Filteroptionen exportieren',
// Peer Assessment
'peer.title': 'Peer-Beurteilung',
'peer.assessor': 'Beurteiler',
'peer.assessed': 'Beurteilter Schüler',
'peer.anonymous': 'Anonym',
'peer.competency': 'Kompetenz',
'peer.create': 'Peer-Beurteilung erstellen',
'peer.results': 'Peer-Beurteilungsergebnisse',
'peer.average': 'Durchschnittliche Peer-Bewertung',
'peer.comparison': 'Vergleich: Peer / Lehrer / Selbst',
'peer.assessment_type': 'Beurteilungsart',
'peer.level': 'Bewertungsstufe',
'peer.comment': 'Kommentar',
'peer.no_assessments': 'Keine Peer-Beurteilungen vorhanden',
'peer.type_competency': 'Kompetenz',
'peer.type_project': 'Projekt',
'peer.type_presentation': 'Präsentation',
'peer.type_teamwork': 'Teamarbeit',
'peer.type_behavior': 'Verhalten',
'peer.assign_task': 'Peer-Beurteilung zuweisen',
'peer.from': 'Von',
'peer.received': 'Erhaltene Beurteilungen',
'peer.given': 'Gegebene Beurteilungen',
'peer.rubric': 'Rubrik',
'peer.teacher': 'Lehrer',
'peer.self': 'Selbst',
'peer.detail': 'Details anzeigen',
// Emergency Contacts
'emergency.title': 'Notfallkontakte',
'emergency.contact': 'Notfallkontakt',
'emergency.primary': 'Hauptkontakt',
'emergency.phone': 'Telefon',
'emergency.phone_alt': 'Alternative Telefonnummer',
'emergency.priority': 'Priorität',
'emergency.quick_call': 'Schnellwahl',
'emergency.print_list': 'Liste drucken',
'emergency.export': 'Kontakte exportieren',
'emergency.name': 'Name',
'emergency.relationship': 'Beziehung',
'emergency.email': 'E-Mail',
'emergency.address': 'Adresse',
'emergency.notes': 'Notizen',
'emergency.add': 'Notfallkontakt hinzufügen',
'emergency.edit': 'Notfallkontakt bearbeiten',
'emergency.delete': 'Notfallkontakt löschen',
'emergency.no_contacts': 'Keine Notfallkontakte vorhanden',
'emergency.search': 'Kontakte suchen...',
'emergency.mother': 'Mutter',
'emergency.father': 'Vater',
'emergency.guardian': 'Vormund',
'emergency.grandparent': 'Großelternteil',
'emergency.other': 'Sonstige',
'emergency.class_list': 'Klassenliste',
'emergency.all_contacts': 'Alle Notfallkontakte',
'emergency.student': 'Schüler',
// School Events
'events.title': 'Schulveranstaltungen',
'events.type': 'Veranstaltungsart',
'events.assembly': 'Versammlung',
'events.field_trip': 'Ausflug',
'events.sports_day': 'Sportfest',
'events.concert': 'Konzert',
'events.fair': 'Schulfest',
'events.parent_meeting': 'Elternabend',
'events.graduation': 'Abschlussfeier',
'events.holiday': 'Ferien/Feiertag',
'events.register': 'Anmelden',
'events.cancel': 'Abmelden',
'events.location': 'Ort',
'events.organizer': 'Organisator',
'events.all_school': 'Schulweite Veranstaltung',
'events.create': 'Veranstaltung erstellen',
'events.edit': 'Veranstaltung bearbeiten',
'events.no_events': 'Keine anstehenden Veranstaltungen',
'events.upcoming': 'Anstehende Veranstaltungen',
'events.start_date': 'Startdatum',
'events.end_date': 'Enddatum',
'events.description': 'Beschreibung',
'events.registration': 'Anmeldung erforderlich',
'events.max_participants': 'Maximale Teilnehmer',
'events.participants': 'Teilnehmer',
'events.registered': 'Angemeldet',
'events.cancelled': 'Abgemeldet',
'events.attended': 'Teilgenommen',
'events.notes': 'Notizen',
'events.is_public': 'Öffentlich',
'events.class_group': 'Klasse',
'events.view_all': 'Alle Veranstaltungen',
// Onboarding Tour (24 steps) - DE
'onboarding.step_1_title': 'Willkommen bei CompetenceTrack!',
'onboarding.step_1_desc': 'Ihre freie Kompetenz- & Benotungsplattform für Schulen. Lassen Sie uns eine kurze Einführung machen.',
'onboarding.step_2_title': 'Dashboard',
'onboarding.step_2_desc': 'Hier sehen Sie einen Überblick über alle Klassen, Schüler und aktuelle Aktivitäten. Nutzen Sie die Schnellaktionen und Kennzahlen.',
'onboarding.step_3_title': 'Klassen & Schüler',
'onboarding.step_3_desc': 'Verwalten Sie Ihre Klassen und Schüler. Erstellen Sie neue Klassen, fügen Sie Schüler hinzu und weisen Sie Kompetenzraster zu.',
'onboarding.step_4_title': 'Kompetenzraster',
'onboarding.step_4_desc': 'Verwalten Sie Kompetenzraster und weisen Sie diese Ihren Klassen zu. Definieren Sie Kategorien und Kompetenzen.',
'onboarding.step_5_title': 'Lernfortschritt',
'onboarding.step_5_desc': 'Erfassen Sie Beobachtungen und Fortschritte einzelner Schüler. Wählen Sie eine Klasse und ein Fach, um Einträge zu loggen.',
'onboarding.step_6_title': 'Kompetenzblume',
'onboarding.step_6_desc': 'Visualisieren Sie die Kompetenzentwicklung als Radar-Chart. Vergleichen Sie Schüler und verfolgen Sie Trends über die Zeit.',
'onboarding.step_7_title': 'Kompetenzmatrix',
'onboarding.step_7_desc': 'Zeigen Sie alle Kompetenzniveaus auf einen Blick. Identifizieren Sie Lücken und Stärken schnell und übersichtlich.',
'onboarding.step_8_title': 'Leistungsüberprüfungen',
'onboarding.step_8_desc': 'Erstellen und verwalten Sie Leistungsüberprüfungen. Bewerten Sie Schüler und verfolgen Sie deren Fortschritt.',
'onboarding.step_9_title': 'Benotung',
'onboarding.step_9_desc': 'Konfigurieren Sie Notenschemata und berechnen Sie Noten basierend auf Kompetenzniveaus und Leistungsüberprüfungen.',
'onboarding.step_10_title': 'Anwesenheit',
'onboarding.step_10_desc': 'Erfassen Sie die Anwesenheit Ihrer Schüler. Behalten Sie den Überblick über Fehlzeiten und Anwesenheitsstatistiken.',
'onboarding.step_11_title': 'Unterrichtsplanung',
'onboarding.step_11_desc': 'Planen Sie Ihren Unterricht strukturiert. Erstellen Sie Stundenpläne mit Zielen, Materialien und Reflexionen.',
'onboarding.step_12_title': 'Kalender',
'onboarding.step_12_desc': 'Verwalten Sie Ihren Kalender mit wiederkehrenden Ereignissen. Behalten Sie wichtige Termine im Blick.',
'onboarding.step_13_title': 'Verhalten',
'onboarding.step_13_desc': 'Erfassen Sie Verhaltensbeobachtungen und verfolgen Sie Interventionsmaßnahmen für Ihre Schüler.',
'onboarding.step_14_title': 'Elternkommunikation',
'onboarding.step_14_desc': 'Kommunizieren Sie mit Eltern über den Lernfortschritt. Senden Sie Berichte und halten Sie den Dialog aufrecht.',
'onboarding.step_15_title': 'Rubriken',
'onboarding.step_15_desc': 'Erstellen Sie detaillierte Bewertungsrubriken mit Stufen und Kriterien. Nutzen Sie diese für objektive Bewertungen.',
'onboarding.step_16_title': 'Kommentarbank',
'onboarding.step_16_desc': 'Verwalten Sie wiederverwendbare Kommentare für Zeugnisse und Berichte. Sparen Sie Zeit bei der Berichtserstellung.',
'onboarding.step_17_title': 'Digitale Hefte',
'onboarding.step_17_desc': 'Erstellen Sie digitale Notizbücher für Ihre Fächer mit WYSIWYG-Editor und Versionsverwaltung. Spart Papier.',
'onboarding.step_18_title': 'Zeichnen',
'onboarding.step_18_desc': 'Nutzen Sie die digitale Zeichenfläche für Skizzen und Illustrationen. Stylus-optimiert mit Druckempfindlichkeit.',
'onboarding.step_19_title': 'Portfolio',
'onboarding.step_19_desc': 'Erstellen Sie digitale Portfolios für Schüler. Sammeln Sie Belege und Artefakte der Kompetenzentwicklung.',
'onboarding.step_20_title': 'Hausaufgaben',
'onboarding.step_20_desc': 'Verwalten Sie Hausaufgaben und Abgaben. Verfolgen Sie den Fortschritt und geben Sie Feedback.',
'onboarding.step_21_title': 'Stundenplan',
'onboarding.step_21_desc': 'Verwalten Sie Ihren Stundenplan mit Räumen und Zeiten. Übersichtliche Wochenansicht.',
'onboarding.step_22_title': 'Ressourcen',
'onboarding.step_22_desc': 'Durchsuchen Sie die Ressourcenbibliothek. Teilen Sie Dokumente, Links und Arbeitsblätter mit Kollegen.',
'onboarding.step_23_title': 'Analyse',
'onboarding.step_23_desc': 'Nutzen Sie erweiterte Analysen und Vorhersagemodelle. Identifizieren Sie Risikoschüler und Entwicklungstrends.',
'onboarding.step_24_title': 'Einstellungen',
'onboarding.step_24_desc': 'Passen Sie die Plattform an: Schulprofil, Branding, Backup und Datenverwaltung.',
'onboarding.celebration': 'Sie sind bereit!',
'onboarding.complete': 'Sie haben die Tour abgeschlossen. Viel Erfolg mit CompetenceTrack!',
'onboarding.previous': 'Zurück',
'onboarding.dont_show_again': 'Nicht mehr anzeigen',
'onboarding.restart_tour': 'Tour erneut starten',
};
const en: TranslationDict = {
@@ -5683,6 +5925,248 @@ const en: TranslationDict = {
'resources.tags_field': 'Tags',
'resources.add_tag': 'Add Tag',
'resources.delete_confirm': 'Are you sure you want to delete this resource?',
// ─── School Branding ──────────────────────────────────────────────
'branding.title': 'School Branding',
'branding.logo': 'Logo',
'branding.logo_url': 'Logo URL',
'branding.logo_placeholder': 'https://school.edu/logo.png',
'branding.primary_color': 'Primary Color',
'branding.secondary_color': 'Secondary Color',
'branding.accent_color': 'Accent Color',
'branding.font': 'Font Family',
'branding.motto': 'School Motto',
'branding.motto_placeholder': 'Learning together, growing together',
'branding.website': 'Website',
'branding.website_placeholder': 'https://school.edu',
'branding.preview': 'Preview',
'branding.custom_css': 'Custom CSS',
'branding.custom_css_placeholder': '/* Custom CSS overrides */',
'branding.email_domain': 'Email Domain',
'branding.email_domain_placeholder': '@school.edu',
'branding.address': 'Address',
'branding.phone': 'Phone',
'branding.saved': 'Branding saved',
'branding.tab': 'Branding',
'branding.colors': 'Colors',
'branding.typography': 'Typography',
'branding.contact': 'Contact Information',
'branding.reset': 'Reset',
// ─── Email Templates ──────────────────────────────────────────────
'email.templates': 'Email Templates',
'email.templates_title': 'Email Templates',
'email.templates_desc': 'Email templates for automated notifications',
'email.weekly_report': 'Weekly Report',
'email.assessment_reminder': 'Assessment Reminder',
'email.behavior_alert': 'Behavior Alert',
'email.attendance_notice': 'Attendance Notice',
'email.welcome': 'Welcome',
'email.send_test': 'Send Test Email',
'email.send_test_desc': 'Send a preview email to your address',
'email.log': 'Email Log',
'email.log_title': 'Email Delivery Log',
'email.smtp': 'SMTP Configuration',
'email.smtp_host': 'SMTP Server',
'email.smtp_port': 'Port',
'email.smtp_user': 'Username',
'email.smtp_password': 'Password',
'email.smtp_from': 'From Address',
'email.frequency': 'Email Frequency',
'email.frequency_daily': 'Daily',
'email.frequency_weekly': 'Weekly',
'email.frequency_monthly': 'Monthly',
'email.auto_reports': 'Send reports automatically',
'email.auto_behavior': 'Send behavior alerts',
'email.auto_attendance': 'Send attendance notices',
'email.template_name': 'Name',
'email.template_subject': 'Subject',
'email.template_body': 'Body',
'email.template_variables': 'Available Variables',
'email.template_preview': 'Preview',
'email.template_create': 'Create Template',
'email.template_edit': 'Edit Template',
'email.template_delete': 'Delete Template',
'email.template_delete_confirm': 'Are you sure you want to delete this template?',
'email.template_default': 'Default Template',
'email.status_sent': 'Sent',
'email.status_failed': 'Failed',
'email.status_pending': 'Pending',
'email.status_bounced': 'Bounced',
'email.recipient': 'Recipient',
'email.sent_at': 'Sent at',
'email.tab': 'Email',
'email.settings': 'Email Settings',
'email.test_sent': 'Test email sent',
'email.test_recipient': 'Recipient Email',
'email.counts': 'Email Statistics',
// ─── Data Export Enhancement ──────────────────────────────────────
'export.pdf': 'PDF Export',
'export.json': 'JSON Export',
'export.csv': 'CSV Export',
'export.filter': 'Filter',
'export.date_range': 'Date Range',
'export.date_from': 'From',
'export.date_to': 'To',
'export.format': 'Format',
'export.select_format': 'Select format',
'export.select_class': 'Select class',
'export.all_classes': 'All Classes',
'export.grade_report': 'Grade Report',
'export.attendance_report': 'Attendance Report',
'export.competency_report': 'Competency Report',
'export.progress_indicator': 'Preparing export...',
'export.download_history': 'Download History',
'export.no_history': 'No exports yet',
'export.enhanced_title': 'Enhanced Data Export',
'export.enhanced_desc': 'Export data in various formats with filter options',
// Peer Assessment
'peer.title': 'Peer Assessment',
'peer.assessor': 'Assessor',
'peer.assessed': 'Assessed Student',
'peer.anonymous': 'Anonymous',
'peer.competency': 'Competency',
'peer.create': 'Create Peer Assessment',
'peer.results': 'Peer Assessment Results',
'peer.average': 'Average Peer Rating',
'peer.comparison': 'Comparison: Peer / Teacher / Self',
'peer.assessment_type': 'Assessment Type',
'peer.level': 'Rating Level',
'peer.comment': 'Comment',
'peer.no_assessments': 'No peer assessments available',
'peer.type_competency': 'Competency',
'peer.type_project': 'Project',
'peer.type_presentation': 'Presentation',
'peer.type_teamwork': 'Teamwork',
'peer.type_behavior': 'Behavior',
'peer.assign_task': 'Assign Peer Assessment',
'peer.from': 'From',
'peer.received': 'Received Assessments',
'peer.given': 'Given Assessments',
'peer.rubric': 'Rubric',
'peer.teacher': 'Teacher',
'peer.self': 'Self',
'peer.detail': 'View Details',
// Emergency Contacts
'emergency.title': 'Emergency Contacts',
'emergency.contact': 'Emergency Contact',
'emergency.primary': 'Primary Contact',
'emergency.phone': 'Phone',
'emergency.phone_alt': 'Alternative Phone',
'emergency.priority': 'Priority',
'emergency.quick_call': 'Quick Call',
'emergency.print_list': 'Print List',
'emergency.export': 'Export Contacts',
'emergency.name': 'Name',
'emergency.relationship': 'Relationship',
'emergency.email': 'Email',
'emergency.address': 'Address',
'emergency.notes': 'Notes',
'emergency.add': 'Add Emergency Contact',
'emergency.edit': 'Edit Emergency Contact',
'emergency.delete': 'Delete Emergency Contact',
'emergency.no_contacts': 'No emergency contacts available',
'emergency.search': 'Search contacts...',
'emergency.mother': 'Mother',
'emergency.father': 'Father',
'emergency.guardian': 'Guardian',
'emergency.grandparent': 'Grandparent',
'emergency.other': 'Other',
'emergency.class_list': 'Class List',
'emergency.all_contacts': 'All Emergency Contacts',
'emergency.student': 'Student',
// School Events
'events.title': 'School Events',
'events.type': 'Event Type',
'events.assembly': 'Assembly',
'events.field_trip': 'Field Trip',
'events.sports_day': 'Sports Day',
'events.concert': 'Concert',
'events.fair': 'School Fair',
'events.parent_meeting': 'Parent Meeting',
'events.graduation': 'Graduation',
'events.holiday': 'Holiday',
'events.register': 'Register',
'events.cancel': 'Cancel Registration',
'events.location': 'Location',
'events.organizer': 'Organizer',
'events.all_school': 'All-School Event',
'events.create': 'Create Event',
'events.edit': 'Edit Event',
'events.no_events': 'No upcoming events',
'events.upcoming': 'Upcoming Events',
'events.start_date': 'Start Date',
'events.end_date': 'End Date',
'events.description': 'Description',
'events.registration': 'Registration Required',
'events.max_participants': 'Max Participants',
'events.participants': 'Participants',
'events.registered': 'Registered',
'events.cancelled': 'Cancelled',
'events.attended': 'Attended',
'events.notes': 'Notes',
'events.is_public': 'Public',
'events.class_group': 'Class',
'events.view_all': 'View All Events',
// Onboarding Tour (24 steps) - EN
'onboarding.step_1_title': 'Welcome to CompetenceTrack!',
'onboarding.step_1_desc': 'Your free competency & grading platform for schools. Let\'s take a quick tour.',
'onboarding.step_2_title': 'Dashboard',
'onboarding.step_2_desc': 'Here you see an overview of all classes, students and current activities. Use quick actions and key metrics.',
'onboarding.step_3_title': 'Classes & Students',
'onboarding.step_3_desc': 'Manage your classes and students. Create new classes, add students, and assign competency grids.',
'onboarding.step_4_title': 'Competency Grid',
'onboarding.step_4_desc': 'Manage competency grids and assign them to your classes. Define categories and competencies.',
'onboarding.step_5_title': 'Progress Entries',
'onboarding.step_5_desc': 'Record observations and progress for individual students. Select a class and subject to log entries.',
'onboarding.step_6_title': 'Competence Flower',
'onboarding.step_6_desc': 'Visualize competency development as a radar chart. Compare students and track trends over time.',
'onboarding.step_7_title': 'Mastery Matrix',
'onboarding.step_7_desc': 'View all mastery levels at a glance. Quickly identify gaps and strengths across your class.',
'onboarding.step_8_title': 'Assessments',
'onboarding.step_8_desc': 'Create and manage assessments. Grade students and track their progress over time.',
'onboarding.step_9_title': 'Grading',
'onboarding.step_9_desc': 'Configure grading schemes and calculate grades based on competency levels and assessments.',
'onboarding.step_10_title': 'Attendance',
'onboarding.step_10_desc': 'Track student attendance with analytics. Monitor absences and attendance statistics.',
'onboarding.step_11_title': 'Lesson Plans',
'onboarding.step_11_desc': 'Plan your lessons with structure. Create lesson plans with goals, materials and reflections.',
'onboarding.step_12_title': 'Calendar',
'onboarding.step_12_desc': 'Manage your calendar with recurring events. Keep track of important dates and deadlines.',
'onboarding.step_13_title': 'Behavior Tracking',
'onboarding.step_13_desc': 'Record behavioral observations and track intervention measures for your students.',
'onboarding.step_14_title': 'Parent Communication',
'onboarding.step_14_desc': 'Communicate with parents about learning progress. Send reports and maintain an ongoing dialogue.',
'onboarding.step_15_title': 'Rubrics',
'onboarding.step_15_desc': 'Create detailed scoring rubrics with levels and criteria. Use them for objective assessments.',
'onboarding.step_16_title': 'Comment Bank',
'onboarding.step_16_desc': 'Manage reusable comments for report cards and reports. Save time during report creation.',
'onboarding.step_17_title': 'Notebooks',
'onboarding.step_17_desc': 'Create digital notebooks for your subjects with WYSIWYG editor and version history. Saves paper.',
'onboarding.step_18_title': 'Drawing Canvas',
'onboarding.step_18_desc': 'Use the digital drawing canvas for sketches and illustrations. Stylus-optimized with pressure sensitivity.',
'onboarding.step_19_title': 'Portfolio',
'onboarding.step_19_desc': 'Create digital portfolios for students. Collect evidence and artifacts of competency development.',
'onboarding.step_20_title': 'Homework',
'onboarding.step_20_desc': 'Manage homework assignments and submissions. Track progress and give feedback.',
'onboarding.step_21_title': 'Timetable',
'onboarding.step_21_desc': 'Manage your timetable with rooms and time slots. Clear weekly view overview.',
'onboarding.step_22_title': 'Resources',
'onboarding.step_22_desc': 'Browse the resource library. Share documents, links and worksheets with colleagues.',
'onboarding.step_23_title': 'Analytics',
'onboarding.step_23_desc': 'Use advanced analytics and predictive models. Identify at-risk students and development trends.',
'onboarding.step_24_title': 'Settings',
'onboarding.step_24_desc': 'Customize the platform: school profile, branding, backup and data management.',
'onboarding.celebration': 'You\'re all set!',
'onboarding.complete': 'You\'ve completed the tour. Good luck with CompetenceTrack!',
'onboarding.previous': 'Previous',
'onboarding.dont_show_again': 'Don\'t show again',
'onboarding.restart_tour': 'Restart tour',
};
const translations: Record<string, TranslationDict> = { de, en };