feat(ios): Anhaenge an Terminen

attachmentCount im Event-Parser, EventAttachment als Modell, API-Methoden
fuer Liste, Upload, Download, Thumbnail und Loeschen. Der Multipart-Body
ist von importICS uebernommen.

Die Detailansicht laedt die Liste beim Oeffnen und teilt eine Datei ueber
das System-Share-Sheet; der Editor staged neue Dateien und wendet sie
erst nach dem Speichern an, weil ein neuer Termin vorher keine UID hat.

EventAttachment liegt bewusst in CalEvent.swift statt in einer eigenen
Datei: eine hier angelegte .swift-Datei waere in keinem Xcode-Target
Mitglied und wuerde schlicht nicht mitkompiliert -- das faellt erst auf
dem Mac auf.

Die URL fuer das Share-Sheet steckt in einem kleinen Identifiable-Wrapper,
weil URL das nicht ist und eine nachtraegliche Konformitaet auf einen
Stdlib-Typ modulweit sichtbar waere.

Nicht kompiliert: auf diesem Rechner gibt es kein Xcode. Muss auf dem Mac
gebaut werden.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
Scarriffle
2026-09-14 10:32:01 +02:00
co-authored by Claude Opus 5
parent cd8aba74b6
commit 3b649ec310
5 changed files with 307 additions and 2 deletions
@@ -259,6 +259,10 @@ private let strings: [String: [String: String]] = [
"event.title_placeholder": "Titel",
"event.allday": "Ganztägig",
"event.private": "Privat",
"event.attachments": "Anhänge",
"event.attachment_add": "Datei hinzufügen",
"event.attachment_hint": "Max. 10 MB pro Datei, 10 Dateien. PDF, Bilder, Text.",
"event.attachment_failed": "Anhänge konnten nicht vollständig gespeichert werden.",
"event.start": "Start",
"event.end": "Ende",
"event.location": "Ort",
@@ -652,6 +656,10 @@ private let strings: [String: [String: String]] = [
"event.title_placeholder": "Title",
"event.allday": "All-day",
"event.private": "Private",
"event.attachments": "Attachments",
"event.attachment_add": "Add file",
"event.attachment_hint": "Max. 10 MB per file, 10 files. PDF, images, text.",
"event.attachment_failed": "Attachments could not be saved completely.",
"event.start": "Start",
"event.end": "End",
"event.location": "Location",