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": "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"
}
}
}