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:
@@ -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"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -258,5 +258,110 @@
|
||||
"minLength": "At least {{count}} characters required.",
|
||||
"maxLength": "At most {{count}} characters allowed.",
|
||||
"passwordMismatch": "Passwords do not match."
|
||||
},
|
||||
"calendar": {
|
||||
"title": "Calendar",
|
||||
"kanbanTitle": "Task Kanban",
|
||||
"today": "Today",
|
||||
"previousMonth": "Previous month",
|
||||
"nextMonth": "Next month",
|
||||
"monthView": "Month view",
|
||||
"kanbanView": "Kanban",
|
||||
"weekdays": ["Mo", "Tu", "We", "Th", "Fr", "Sa", "Su"],
|
||||
"months": [
|
||||
"January", "February", "March", "April", "May", "June",
|
||||
"July", "August", "September", "October", "November", "December"
|
||||
],
|
||||
"newAppointment": "New appointment",
|
||||
"editAppointment": "Edit appointment",
|
||||
"appointmentTitle": "Title",
|
||||
"appointmentDescription": "Description",
|
||||
"appointmentLocation": "Location",
|
||||
"appointmentStart": "Start",
|
||||
"appointmentEnd": "End",
|
||||
"appointmentAllDay": "All day",
|
||||
"appointmentPriority": "Priority",
|
||||
"appointmentSubtype": "Type",
|
||||
"appointmentCalendar": "Calendar",
|
||||
"save": "Save",
|
||||
"cancel": "Cancel",
|
||||
"delete": "Delete",
|
||||
"deleteEntryConfirm": "Really delete this entry?",
|
||||
"noCalendars": "No calendars available. Please create one first.",
|
||||
"noEntries": "No entries in this period.",
|
||||
"loading": "Loading...",
|
||||
"errorLoad": "Could not load entries.",
|
||||
"errorSave": "Could not save entry.",
|
||||
"created": "Entry created.",
|
||||
"updated": "Entry updated.",
|
||||
"deleted": "Entry deleted.",
|
||||
"moved": "Entry moved.",
|
||||
"kanban": {
|
||||
"open": "Open",
|
||||
"in_progress": "In Progress",
|
||||
"done": "Done",
|
||||
"cancelled": "Cancelled",
|
||||
"empty": "No tasks in this column.",
|
||||
"noTasks": "No tasks available."
|
||||
},
|
||||
"subtasks": {
|
||||
"title": "Subtasks",
|
||||
"addPlaceholder": "New subtask...",
|
||||
"add": "Add",
|
||||
"empty": "No subtasks yet.",
|
||||
"added": "Subtask created.",
|
||||
"updated": "Subtask updated."
|
||||
},
|
||||
"ics": {
|
||||
"export": "Export ICS",
|
||||
"import": "Import ICS",
|
||||
"importSuccess": "{{count}} entries imported.",
|
||||
"importPartial": "{{count}} imported, {{errors}} errors.",
|
||||
"importFailed": "Import failed.",
|
||||
"exportSuccess": "ICS file downloaded.",
|
||||
"chooseFile": "Choose file",
|
||||
"noCalendar": "Please select a calendar first."
|
||||
},
|
||||
"resources": {
|
||||
"title": "Resource booking",
|
||||
"select": "Select resource",
|
||||
"none": "No resource",
|
||||
"book": "Book resource",
|
||||
"booked": "Resource booked.",
|
||||
"conflict": "Conflict: this resource is already booked for this time range.",
|
||||
"missingTimes": "The appointment needs both start and end time."
|
||||
},
|
||||
"sharing": {
|
||||
"title": "Sharing",
|
||||
"user": "User",
|
||||
"group": "Group",
|
||||
"userPlaceholder": "User ID",
|
||||
"groupPlaceholder": "Group ID",
|
||||
"permission": "Permission",
|
||||
"permissionRead": "Read",
|
||||
"permissionWrite": "Write",
|
||||
"add": "Add",
|
||||
"list": "Shares",
|
||||
"empty": "No shares yet.",
|
||||
"added": "Share added.",
|
||||
"removed": "Share removed.",
|
||||
"remove": "Remove"
|
||||
},
|
||||
"priority": {
|
||||
"low": "Low",
|
||||
"medium": "Medium",
|
||||
"high": "High"
|
||||
},
|
||||
"status": {
|
||||
"open": "Open",
|
||||
"in_progress": "In Progress",
|
||||
"done": "Done",
|
||||
"cancelled": "Cancelled"
|
||||
},
|
||||
"subtype": {
|
||||
"normal": "Normal",
|
||||
"follow_up": "Follow up",
|
||||
"private": "Private"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user