feat: add WebDAV file browser with auth improvements

Add a new Files section powered by WebDAV for browsing, uploading,
downloading, renaming, and deleting files and folders.

New features:
- WebDAV file browser with grid/list views and breadcrumb navigation
- File upload (drag-and-drop and button), folder creation, rename, delete
- File preview modals for images and other file types
- WebDAV proxy API route to handle authentication
- Navigation rail entry for Files (auto-hidden when WebDAV is unsupported)

Auth improvements:
- Fix premature redirects on calendar, contacts, and settings pages by
  adding explicit auth check on mount before redirecting to login
- Persist active settings tab in localStorage

Other:
- Expose getAuthHeader() and getServerUrl() on JMAPClient
- Add WebDAV store with connection testing and capability detection
- Add i18n translations for file browser in all 8 locales (de, en, es,
  fr, it, ja, nl, pt)
This commit is contained in:
Linus Rath
2026-03-15 05:24:27 +01:00
parent cb74e3bf73
commit 1f1db8fac8
23 changed files with 4179 additions and 12 deletions
+79
View File
@@ -61,6 +61,7 @@
"contacts": "Kontakte",
"calendar": "Kalender",
"settings": "Einstellungen",
"files": "Dateien",
"loading_mailboxes": "Postfächer werden geladen...",
"push_connected": "Echtzeit-Updates aktiv",
"push_disconnected": "Echtzeit-Updates inaktiv",
@@ -1692,5 +1693,83 @@
"got_it": "Verstanden",
"settings": "Einstellungen",
"dismiss": "Schließen"
},
"files": {
"title": "Dateien",
"search_placeholder": "Dateien suchen...",
"empty_state_title": "Noch keine Dateien",
"empty_state_description": "Laden Sie Dateien hoch oder erstellen Sie Ordner, um loszulegen",
"upload": "Hochladen",
"upload_files": "Dateien hochladen",
"new_folder": "Neuer Ordner",
"new_folder_name": "Ordnername",
"rename": "Umbenennen",
"rename_title": "Umbenennen",
"new_name": "Neuer Name",
"delete": "Löschen",
"delete_confirm_title": "Ressource löschen",
"delete_confirm_message": "Möchten Sie \"{name}\" wirklich löschen? Dies kann nicht rückgängig gemacht werden.",
"download": "Herunterladen",
"name": "Name",
"size": "Größe",
"modified": "Geändert",
"type": "Typ",
"folder": "Ordner",
"file": "Datei",
"parent_directory": "Übergeordnetes Verzeichnis",
"breadcrumb_root": "Startseite",
"drop_files_here": "Dateien hier ablegen zum Hochladen",
"uploading": "Wird hochgeladen...",
"upload_success": "{count, plural, one {1 Datei hochgeladen} other {# Dateien hochgeladen}}",
"upload_error": "Datei konnte nicht hochgeladen werden",
"create_folder_success": "Ordner erstellt",
"create_folder_error": "Ordner konnte nicht erstellt werden",
"delete_success": "Erfolgreich gelöscht",
"delete_error": "Löschen fehlgeschlagen",
"rename_success": "Erfolgreich umbenannt",
"rename_error": "Umbenennen fehlgeschlagen",
"download_error": "Herunterladen fehlgeschlagen",
"not_available": "WebDAV-Dateispeicher ist auf diesem Server nicht verfügbar",
"cancel": "Abbrechen",
"create": "Erstellen",
"save": "Speichern",
"no_results": "Keine Dateien entsprechen Ihrer Suche",
"batch_delete_confirm_message": "Möchten Sie wirklich {count, plural, one {1 Element} other {# Elemente}} löschen? Dies kann nicht rückgängig gemacht werden.",
"batch_delete_success": "{count, plural, one {1 Element gelöscht} other {# Elemente gelöscht}}",
"grid_view": "Rasteransicht",
"list_view": "Listenansicht",
"details": "Details",
"path": "Pfad",
"preview": "Vorschau",
"preview_error": "Vorschau konnte nicht geladen werden",
"cut": "Ausschneiden",
"copy": "Kopieren",
"paste": "Einfügen",
"move_success": "{count, plural, one {1 Element verschoben} other {# Elemente verschoben}}",
"move_error": "Verschieben fehlgeschlagen",
"paste_success": "Erfolgreich eingefügt",
"paste_error": "Einfügen fehlgeschlagen",
"new_text_file": "Neue Textdatei",
"file_name": "Dateiname",
"retry": "Wiederholen",
"refresh": "Aktualisieren",
"toggle_favorite": "Favorit umschalten",
"duplicate": "Duplizieren",
"duplicate_success": "Erfolgreich dupliziert",
"duplicate_error": "Duplizieren fehlgeschlagen",
"create_file_success": "Datei erstellt",
"create_file_error": "Datei konnte nicht erstellt werden",
"favorites": "Favoriten",
"recent": "Zuletzt verwendet",
"properties": "Eigenschaften",
"open_folder": "Ordner öffnen",
"upload_folder": "Ordner hochladen",
"file_too_large": "\"{name}\" überschreitet die maximale Dateigröße ({max})",
"undo": "Rückgängig",
"undo_success": "Aktion rückgängig gemacht",
"undo_error": "Rückgängig machen fehlgeschlagen",
"toolbar": "Dateiaktionen",
"file_list": "Dateien und Ordner",
"context_menu": "Aktionen"
}
}