CompetenceTrack v9 - Rich text editor, Drawing integration, PDF export, Notebook sharing, Templates, Keyboard shortcuts
Features: - Rich text toolbar for notebook pages (Bold, Italic, Underline, Headings, Lists) - Drawing canvas integration in notebook pages (toggle drawing mode) - Notebook PDF export (client-side print with print CSS) - Page background rendering (lined, grid, blank, dotted, music, calligraphy) - Page thumbnails in sidebar with bookmark indicators - Auto-save with 3-second debounce - Notebook sharing with classes (isPublic toggle) - Notebook duplication (copy with all pages) - 6 pre-built notebook templates (Math, Deutsch, Englisch, Kunst, Musik, Sachkunde) - Shared notebooks tab (view other teachers' shared notebooks) - Templates tab with one-click creation - Keyboard shortcuts (Cmd+N, Cmd+D, Cmd+Shift+N, Cmd+E, Cmd+Shift+A, Cmd+.) - Student notebook access (role-based UI) - Role indicator in notebook header (Teacher/Student) - Onboarding tour expanded to 14 steps - Dashboard improvements (Today's Schedule, Paper Saved counter, Recent Activity) - Classes view improvements (student/subject counts, type badges) - Competence flower improvements (shadow, shimmer, mastery summary) - Progress entries improvements (mastery distribution chart) - Global CSS improvements (dark scrollbar, focus-visible, card-hover-glow) - 60+ new i18n keys (German/English) Bug Fixes: - Notebook creation not refreshing list (fixed by calling loadData after creation) - Missing BarChart3 import in progress-entries-view - Escaped quotes in JSX className attributes
This commit is contained in:
1 parent
04034dca62
commit
62f4a150e0
14 files changed
+1983
-166
No files matched your search
+190
@@ -1633,6 +1633,22 @@ const de: TranslationDict = {
|
||||
'onboarding.back': 'Zurück',
|
||||
'onboarding.start': 'Loslegen',
|
||||
'onboarding.step': 'Schritt {current} von {total}',
|
||||
'onboarding.classes_title': 'Klassen & Schüler',
|
||||
'onboarding.classes_desc': 'Verwalten Sie Ihre Klassen und Schüler. Erstellen Sie neue Klassen, fügen Sie Schüler hinzu und weisen Sie Kompetenzraster zu.',
|
||||
'onboarding.assessments_title': 'Leistungsüberprüfungen',
|
||||
'onboarding.assessments_desc': 'Erstellen und verwalten Sie Leistungsüberprüfungen. Bewerten Sie Schüler und verfolgen Sie deren Fortschritt.',
|
||||
'onboarding.grading_title': 'Benotung',
|
||||
'onboarding.grading_desc': 'Konfigurieren Sie Notenschemata und berechnen Sie Noten basierend auf Kompetenzniveaus und Leistungsüberprüfungen.',
|
||||
'onboarding.notebooks_title': 'Digitale Hefte',
|
||||
'onboarding.notebooks_desc': 'Erstellen Sie digitale Notizbücher für Ihre Fächer. Spart Papier und schützt die Umwelt — jedes Heft spart ca. 50 Seiten.',
|
||||
'onboarding.drawing_title': 'Zeichnen',
|
||||
'onboarding.drawing_desc': 'Nutzen Sie die digitale Zeichenfläche für Skizzen und Illustrationen. Stylus-optimiert mit Druckempfindlichkeit.',
|
||||
'onboarding.calendar_title': 'Kalender & Anwesenheit',
|
||||
'onboarding.calendar_desc': 'Verwalten Sie den Stundenplan und die Anwesenheit Ihrer Schüler. Behalten Sie den Überblick über Fehlzeiten.',
|
||||
'onboarding.parents_title': 'Elternkommunikation',
|
||||
'onboarding.parents_desc': 'Kommunizieren Sie mit Eltern über den Lernfortschritt. Senden Sie Berichte und halten Sie den Dialog aufrecht.',
|
||||
'onboarding.environmental_title': 'Umweltschutz',
|
||||
'onboarding.environmental_desc': 'CompetenceTrack spart Papier: Jeder digitale Eintrag ersetzt ca. 50 Seiten Papier. Danke für Ihren Beitrag zum Umweltschutz!',
|
||||
|
||||
// Batch deletion (progress entries)
|
||||
'progress.batch_select': 'Auswählen',
|
||||
@@ -1701,6 +1717,13 @@ const de: TranslationDict = {
|
||||
'shortcuts.recent_actions': 'Letzte Aktionen',
|
||||
'shortcuts.views': 'Ansichten',
|
||||
'shortcuts.quick_actions': 'Schnellaktionen',
|
||||
'shortcuts.new_notebook': 'Neues Heft',
|
||||
'shortcuts.drawing': 'Zeichnen',
|
||||
'shortcuts.new_page': 'Neue Seite',
|
||||
'shortcuts.export_pdf': 'PDF exportieren',
|
||||
'shortcuts.archive_toggle': 'Archiv umschalten',
|
||||
'shortcuts.close_notebook': 'Heft schließen',
|
||||
'shortcuts.notebooks_drawing': 'Hefte & Zeichnen',
|
||||
|
||||
// Drawing
|
||||
'drawing.title': 'Zeichnungen',
|
||||
@@ -1862,6 +1885,78 @@ const de: TranslationDict = {
|
||||
'notebooks.total_pages': 'Seiten gesamt',
|
||||
'notebooks.paper_saved': 'Papier gespart',
|
||||
'notebooks.pages_unit': 'Seiten',
|
||||
|
||||
// Notebook toolbar
|
||||
'notebooks.toolbar_bold': 'Fett',
|
||||
'notebooks.toolbar_italic': 'Kursiv',
|
||||
'notebooks.toolbar_underline': 'Unterstrichen',
|
||||
'notebooks.toolbar_heading1': 'Ueberschrift 1',
|
||||
'notebooks.toolbar_heading2': 'Ueberschrift 2',
|
||||
'notebooks.toolbar_heading3': 'Ueberschrift 3',
|
||||
'notebooks.toolbar_bullet_list': 'Aufzaehlungsliste',
|
||||
'notebooks.toolbar_numbered_list': 'Nummerierte Liste',
|
||||
'notebooks.toolbar_align_left': 'Linksbuendig',
|
||||
'notebooks.toolbar_align_center': 'Zentriert',
|
||||
'notebooks.toolbar_align_right': 'Rechtsbuendig',
|
||||
'notebooks.auto_saving': 'Automatisch speichern...',
|
||||
'notebooks.auto_saved': 'Automatisch gespeichert',
|
||||
'notebooks.page_thumbnail': 'Seitenvorschau',
|
||||
|
||||
// Drawing integration
|
||||
'notebooks.drawing_saved': 'Zeichnung gespeichert',
|
||||
'notebooks.drawing_page_label': 'Diese Seite enthält eine Zeichnung',
|
||||
'notebooks.edit_drawing': 'Zeichnung bearbeiten',
|
||||
'notebooks.switch_to_text': 'Zur Textseite wechseln',
|
||||
'notebooks.drawing_section_label': 'Zeichnungsbereich',
|
||||
'notebooks.open_drawing': 'Zeichnung öffnen',
|
||||
'notebooks.switch_to_mixed': 'Text + Zeichnung',
|
||||
|
||||
// PDF Export
|
||||
'notebooks.export_pdf': 'PDF exportieren',
|
||||
'notebooks.export_error': 'Fehler beim Exportieren. Bitte Popups erlauben.',
|
||||
'notebooks.export_drawing_note': 'Diese Seite enthält eine Zeichnung (nicht im PDF enthalten)',
|
||||
'notebooks.export_empty_page': 'Leere Seite',
|
||||
'notebooks.export_eco_message': 'Dieses Heft wurde digital erstellt — Papier gespart!',
|
||||
|
||||
// Student notebook access
|
||||
'notebooks.shared_with_me': 'Mit mir geteilt',
|
||||
'notebooks.my_notebooks': 'Meine Hefte',
|
||||
'notebooks.shared_notebook': 'Geteiltes Heft',
|
||||
|
||||
// Sharing & Collaboration
|
||||
'notebooks.share': 'Teilen',
|
||||
'notebooks.duplicate': 'Duplizieren',
|
||||
'notebooks.shared': 'Geteilt',
|
||||
'notebooks.copy_suffix': ' (Kopie)',
|
||||
'notebooks.templates': 'Vorlagen',
|
||||
'notebooks.template_desc': 'Vorgefertigte Hefte fuer haeufige Faecher',
|
||||
'notebooks.tab_shared': 'Geteilt',
|
||||
'notebooks.tab_templates': 'Vorlagen',
|
||||
'notebooks.share_confirm': 'Dieses Heft mit der Klasse teilen?',
|
||||
'notebooks.share_confirm_desc': 'Wenn Sie dieses Heft teilen, koennen alle Schueler der Klasse es einsehen (schreibgeschuetzt).',
|
||||
'notebooks.unshare_confirm': 'Teilen aufheben?',
|
||||
'notebooks.unshare_confirm_desc': 'Wenn Sie das Teilen aufheben, koennen die Schueler der Klasse dieses Heft nicht mehr einsehen.',
|
||||
'notebooks.duplicated': 'Heft dupliziert',
|
||||
'notebooks.duplicate_error': 'Fehler beim Duplizieren des Hefts',
|
||||
'notebooks.shared_notebooks': 'Geteilte Hefte',
|
||||
'notebooks.shared_empty': 'Keine geteilten Hefte vorhanden',
|
||||
'notebooks.shared_empty_desc': 'Hefte von anderen Lehrern werden hier angezeigt, wenn sie geteilt werden.',
|
||||
'notebooks.read_only': 'Schreibgeschuetzt',
|
||||
'notebooks.create_from_template': 'Aus Vorlage erstellen',
|
||||
'notebooks.template_math': 'Mathematik',
|
||||
'notebooks.template_german': 'Deutsch',
|
||||
'notebooks.template_english': 'Englisch',
|
||||
'notebooks.template_art': 'Kunst',
|
||||
'notebooks.template_music': 'Musik',
|
||||
'notebooks.template_science': 'Sachkunde',
|
||||
'notebooks.template_math_desc': 'Kariertes Heft mit Mathe-Abschnitten',
|
||||
'notebooks.template_german_desc': 'Liniertes Heft mit Schreib-Abschnitten',
|
||||
'notebooks.template_english_desc': 'Liniertes Heft mit Vokabel-Abschnitten',
|
||||
'notebooks.template_art_desc': 'Blanko-Heft zum Zeichnen',
|
||||
'notebooks.template_music_desc': 'Musikheft zum Komponieren',
|
||||
'notebooks.template_science_desc': 'Kariertes Heft fuer Experimente',
|
||||
'notebooks.tab_all': 'Meine Hefte',
|
||||
'notebooks.owner': 'Von',
|
||||
};
|
||||
|
||||
const en: TranslationDict = {
|
||||
@@ -3494,6 +3589,22 @@ const en: TranslationDict = {
|
||||
'onboarding.back': 'Back',
|
||||
'onboarding.start': 'Get started',
|
||||
'onboarding.step': 'Step {current} of {total}',
|
||||
'onboarding.classes_title': 'Classes & Students',
|
||||
'onboarding.classes_desc': 'Manage your classes and students. Create new classes, add students, and assign competency grids.',
|
||||
'onboarding.assessments_title': 'Assessments',
|
||||
'onboarding.assessments_desc': 'Create and manage assessments. Grade students and track their progress over time.',
|
||||
'onboarding.grading_title': 'Grading',
|
||||
'onboarding.grading_desc': 'Configure grading schemes and calculate grades based on competency levels and assessments.',
|
||||
'onboarding.notebooks_title': 'Digital Notebooks',
|
||||
'onboarding.notebooks_desc': 'Create digital notebooks for your subjects. Saves paper and protects the environment — each notebook saves ~50 pages.',
|
||||
'onboarding.drawing_title': 'Drawing',
|
||||
'onboarding.drawing_desc': 'Use the digital drawing canvas for sketches and illustrations. Stylus-optimized with pressure sensitivity.',
|
||||
'onboarding.calendar_title': 'Calendar & Attendance',
|
||||
'onboarding.calendar_desc': 'Manage your schedule and student attendance. Keep track of absences and upcoming events.',
|
||||
'onboarding.parents_title': 'Parent Communication',
|
||||
'onboarding.parents_desc': 'Communicate with parents about learning progress. Send reports and maintain an ongoing dialogue.',
|
||||
'onboarding.environmental_title': 'Environmental Protection',
|
||||
'onboarding.environmental_desc': 'CompetenceTrack saves paper: Each digital entry replaces ~50 pages of paper. Thank you for contributing to environmental protection!',
|
||||
|
||||
// Batch deletion (progress entries)
|
||||
'progress.batch_select': 'Select',
|
||||
@@ -3562,6 +3673,13 @@ const en: TranslationDict = {
|
||||
'shortcuts.recent_actions': 'Recent Actions',
|
||||
'shortcuts.views': 'Views',
|
||||
'shortcuts.quick_actions': 'Quick Actions',
|
||||
'shortcuts.new_notebook': 'New Notebook',
|
||||
'shortcuts.drawing': 'Drawing',
|
||||
'shortcuts.new_page': 'New Page',
|
||||
'shortcuts.export_pdf': 'Export PDF',
|
||||
'shortcuts.archive_toggle': 'Toggle Archive',
|
||||
'shortcuts.close_notebook': 'Close Notebook',
|
||||
'shortcuts.notebooks_drawing': 'Notebooks & Drawing',
|
||||
|
||||
// Drawing
|
||||
'drawing.title': 'Drawings',
|
||||
@@ -3723,6 +3841,78 @@ const en: TranslationDict = {
|
||||
'notebooks.total_pages': 'Total Pages',
|
||||
'notebooks.paper_saved': 'Paper Saved',
|
||||
'notebooks.pages_unit': 'Pages',
|
||||
|
||||
// Notebook toolbar
|
||||
'notebooks.toolbar_bold': 'Bold',
|
||||
'notebooks.toolbar_italic': 'Italic',
|
||||
'notebooks.toolbar_underline': 'Underline',
|
||||
'notebooks.toolbar_heading1': 'Heading 1',
|
||||
'notebooks.toolbar_heading2': 'Heading 2',
|
||||
'notebooks.toolbar_heading3': 'Heading 3',
|
||||
'notebooks.toolbar_bullet_list': 'Bullet List',
|
||||
'notebooks.toolbar_numbered_list': 'Numbered List',
|
||||
'notebooks.toolbar_align_left': 'Align Left',
|
||||
'notebooks.toolbar_align_center': 'Align Center',
|
||||
'notebooks.toolbar_align_right': 'Align Right',
|
||||
'notebooks.auto_saving': 'Auto-saving...',
|
||||
'notebooks.auto_saved': 'Auto-saved',
|
||||
'notebooks.page_thumbnail': 'Page Thumbnail',
|
||||
|
||||
// Drawing integration
|
||||
'notebooks.drawing_saved': 'Drawing saved',
|
||||
'notebooks.drawing_page_label': 'This page contains a drawing',
|
||||
'notebooks.edit_drawing': 'Edit drawing',
|
||||
'notebooks.switch_to_text': 'Switch to text page',
|
||||
'notebooks.drawing_section_label': 'Drawing section',
|
||||
'notebooks.open_drawing': 'Open drawing',
|
||||
'notebooks.switch_to_mixed': 'Text + Drawing',
|
||||
|
||||
// PDF Export
|
||||
'notebooks.export_pdf': 'Export PDF',
|
||||
'notebooks.export_error': 'Export error. Please allow popups.',
|
||||
'notebooks.export_drawing_note': 'This page contains a drawing (not included in PDF)',
|
||||
'notebooks.export_empty_page': 'Empty page',
|
||||
'notebooks.export_eco_message': 'This notebook was created digitally — paper saved!',
|
||||
|
||||
// Student notebook access
|
||||
'notebooks.shared_with_me': 'Shared with me',
|
||||
'notebooks.my_notebooks': 'My Notebooks',
|
||||
'notebooks.shared_notebook': 'Shared Notebook',
|
||||
|
||||
// Sharing & Collaboration
|
||||
'notebooks.share': 'Share',
|
||||
'notebooks.duplicate': 'Duplicate',
|
||||
'notebooks.shared': 'Shared',
|
||||
'notebooks.copy_suffix': ' (Copy)',
|
||||
'notebooks.templates': 'Templates',
|
||||
'notebooks.template_desc': 'Pre-built notebooks for common subjects',
|
||||
'notebooks.tab_shared': 'Shared',
|
||||
'notebooks.tab_templates': 'Templates',
|
||||
'notebooks.share_confirm': 'Share this notebook with the class?',
|
||||
'notebooks.share_confirm_desc': 'If you share this notebook, all students in the class can view it (read-only).',
|
||||
'notebooks.unshare_confirm': 'Unshare this notebook?',
|
||||
'notebooks.unshare_confirm_desc': 'If you unshare this notebook, students in the class will no longer be able to view it.',
|
||||
'notebooks.duplicated': 'Notebook duplicated',
|
||||
'notebooks.duplicate_error': 'Error duplicating notebook',
|
||||
'notebooks.shared_notebooks': 'Shared Notebooks',
|
||||
'notebooks.shared_empty': 'No shared notebooks available',
|
||||
'notebooks.shared_empty_desc': 'Notebooks shared by other teachers will appear here.',
|
||||
'notebooks.read_only': 'Read-only',
|
||||
'notebooks.create_from_template': 'Create from template',
|
||||
'notebooks.template_math': 'Mathematics',
|
||||
'notebooks.template_german': 'German',
|
||||
'notebooks.template_english': 'English',
|
||||
'notebooks.template_art': 'Art',
|
||||
'notebooks.template_music': 'Music',
|
||||
'notebooks.template_science': 'Science',
|
||||
'notebooks.template_math_desc': 'Grid notebook with math sections',
|
||||
'notebooks.template_german_desc': 'Lined notebook with writing sections',
|
||||
'notebooks.template_english_desc': 'Lined notebook with vocabulary sections',
|
||||
'notebooks.template_art_desc': 'Blank notebook for drawing',
|
||||
'notebooks.template_music_desc': 'Music notebook for composition',
|
||||
'notebooks.template_science_desc': 'Grid notebook for experiments',
|
||||
'notebooks.tab_all': 'My Notebooks',
|
||||
'notebooks.owner': 'By',
|
||||
};
|
||||
|
||||
const translations: Record<string, TranslationDict> = { de, en };
|
||||
|
||||
Reference in new issue
Block a user