T08b: Frontend Calendar UI (month view, kanban, ICS, resources, sharing)

- 8 calendar components (MonthView, KanbanBoard, AppointmentModal, TaskDetailPanel, IcsControls, ResourceBooking, SharingSettings + API client)

- 2 pages (/calendar, /calendar/kanban) + zustand store

- 17 vitest tests (MonthView 5, KanbanBoard 6, AppointmentModal 6) all passing

- i18n: calendar namespace in en/de (104 lines each, +exportSuccess key)

- TS strict mode pass, npm run build pass
This commit is contained in:
A0-Orchestrator
2026-06-30 11:35:08 +02:00
parent f9b19bb777
commit 7350739554
17 changed files with 2837 additions and 0 deletions
+105
View File
@@ -258,5 +258,110 @@
"minLength": "Mindestens {{count}} Zeichen erforderlich.",
"maxLength": "Maximal {{count}} Zeichen erlaubt.",
"passwordMismatch": "Passwörter stimmen nicht überein."
},
"calendar": {
"title": "Kalender",
"kanbanTitle": "Aufgaben-Kanban",
"today": "Heute",
"previousMonth": "Vorheriger Monat",
"nextMonth": "Nächster Monat",
"monthView": "Monatsansicht",
"kanbanView": "Kanban",
"weekdays": ["Mo", "Di", "Mi", "Do", "Fr", "Sa", "So"],
"months": [
"Januar", "Februar", "März", "April", "Mai", "Juni",
"Juli", "August", "September", "Oktober", "November", "Dezember"
],
"newAppointment": "Neuer Termin",
"editAppointment": "Termin bearbeiten",
"appointmentTitle": "Titel",
"appointmentDescription": "Beschreibung",
"appointmentLocation": "Ort",
"appointmentStart": "Beginn",
"appointmentEnd": "Ende",
"appointmentAllDay": "Ganztägig",
"appointmentPriority": "Priorität",
"appointmentSubtype": "Typ",
"appointmentCalendar": "Kalender",
"save": "Speichern",
"cancel": "Abbrechen",
"delete": "Löschen",
"deleteEntryConfirm": "Eintrag wirklich löschen?",
"noCalendars": "Keine Kalender vorhanden. Bitte zuerst einen Kalender anlegen.",
"noEntries": "Keine Termine in diesem Zeitraum.",
"loading": "Wird geladen...",
"errorLoad": "Einträge konnten nicht geladen werden.",
"errorSave": "Eintrag konnte nicht gespeichert werden.",
"created": "Termin angelegt.",
"updated": "Termin aktualisiert.",
"deleted": "Termin gelöscht.",
"moved": "Termin verschoben.",
"kanban": {
"open": "Offen",
"in_progress": "In Arbeit",
"done": "Erledigt",
"cancelled": "Abgebrochen",
"empty": "Keine Aufgaben in dieser Spalte.",
"noTasks": "Keine Aufgaben vorhanden."
},
"subtasks": {
"title": "Unteraufgaben",
"addPlaceholder": "Neue Unteraufgabe...",
"add": "Hinzufügen",
"empty": "Keine Unteraufgaben vorhanden.",
"added": "Unteraufgabe angelegt.",
"updated": "Unteraufgabe aktualisiert."
},
"ics": {
"export": "ICS exportieren",
"import": "ICS importieren",
"importSuccess": "{{count}} Termine importiert.",
"importPartial": "{{count}} importiert, {{errors}} Fehler.",
"importFailed": "Import fehlgeschlagen.",
"exportSuccess": "ICS-Datei heruntergeladen.",
"chooseFile": "Datei auswählen",
"noCalendar": "Bitte zuerst einen Kalender auswählen."
},
"resources": {
"title": "Ressourcen-Buchung",
"select": "Ressource auswählen",
"none": "Keine Ressource",
"book": "Ressource buchen",
"booked": "Ressource gebucht.",
"conflict": "Konflikt: Diese Ressource ist im gewählten Zeitraum bereits belegt.",
"missingTimes": "Der Termin benötigt Start- und Endzeit."
},
"sharing": {
"title": "Freigabe",
"user": "Benutzer",
"group": "Gruppe",
"userPlaceholder": "Benutzer-ID",
"groupPlaceholder": "Gruppen-ID",
"permission": "Berechtigung",
"permissionRead": "Lesen",
"permissionWrite": "Schreiben",
"add": "Hinzufügen",
"list": "Freigaben",
"empty": "Keine Freigaben vorhanden.",
"added": "Freigabe hinzugefügt.",
"removed": "Freigabe entfernt.",
"remove": "Entfernen"
},
"priority": {
"low": "Niedrig",
"medium": "Mittel",
"high": "Hoch"
},
"status": {
"open": "Offen",
"in_progress": "In Arbeit",
"done": "Erledigt",
"cancelled": "Abgebrochen"
},
"subtype": {
"normal": "Normal",
"follow_up": "Wiedervorlage",
"private": "Privat"
}
}
}