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": "Contacten",
"calendar": "Agenda",
"settings": "Instellingen",
"files": "Bestanden",
"loading_mailboxes": "Mappen laden...",
"push_connected": "Real-time updates actief",
"push_disconnected": "Real-time updates inactief",
@@ -1692,5 +1693,83 @@
"got_it": "Begrepen",
"settings": "Instellingen",
"dismiss": "Sluiten"
},
"files": {
"title": "Bestanden",
"search_placeholder": "Bestanden zoeken...",
"empty_state_title": "Nog geen bestanden",
"empty_state_description": "Upload bestanden of maak mappen aan om te beginnen",
"upload": "Uploaden",
"upload_files": "Bestanden uploaden",
"new_folder": "Nieuwe map",
"new_folder_name": "Mapnaam",
"rename": "Hernoemen",
"rename_title": "Hernoemen",
"new_name": "Nieuwe naam",
"delete": "Verwijderen",
"delete_confirm_title": "Bron verwijderen",
"delete_confirm_message": "Weet u zeker dat u \"{name}\" wilt verwijderen? Dit kan niet ongedaan worden gemaakt.",
"download": "Downloaden",
"name": "Naam",
"size": "Grootte",
"modified": "Gewijzigd",
"type": "Type",
"folder": "Map",
"file": "Bestand",
"parent_directory": "Bovenliggende map",
"breadcrumb_root": "Start",
"drop_files_here": "Sleep bestanden hierheen om te uploaden",
"uploading": "Uploaden...",
"upload_success": "{count, plural, one {1 bestand geüpload} other {# bestanden geüpload}}",
"upload_error": "Bestand uploaden mislukt",
"create_folder_success": "Map aangemaakt",
"create_folder_error": "Map aanmaken mislukt",
"delete_success": "Succesvol verwijderd",
"delete_error": "Verwijderen mislukt",
"rename_success": "Succesvol hernoemd",
"rename_error": "Hernoemen mislukt",
"download_error": "Downloaden mislukt",
"not_available": "WebDAV-bestandsopslag is niet beschikbaar op deze server",
"cancel": "Annuleren",
"create": "Aanmaken",
"save": "Opslaan",
"no_results": "Geen bestanden komen overeen met uw zoekopdracht",
"batch_delete_confirm_message": "Weet u zeker dat u {count, plural, one {1 item} other {# items}} wilt verwijderen? Dit kan niet ongedaan worden gemaakt.",
"batch_delete_success": "{count, plural, one {1 item verwijderd} other {# items verwijderd}}",
"grid_view": "Rasterweergave",
"list_view": "Lijstweergave",
"details": "Details",
"path": "Pad",
"preview": "Voorbeeld",
"preview_error": "Voorbeeld laden mislukt",
"cut": "Knippen",
"copy": "Kopiëren",
"paste": "Plakken",
"move_success": "{count, plural, one {1 item verplaatst} other {# items verplaatst}}",
"move_error": "Verplaatsen mislukt",
"paste_success": "Succesvol geplakt",
"paste_error": "Plakken mislukt",
"new_text_file": "Nieuw tekstbestand",
"file_name": "Bestandsnaam",
"retry": "Opnieuw proberen",
"refresh": "Vernieuwen",
"toggle_favorite": "Favoriet aan/uit",
"duplicate": "Dupliceren",
"duplicate_success": "Succesvol gedupliceerd",
"duplicate_error": "Dupliceren mislukt",
"create_file_success": "Bestand aangemaakt",
"create_file_error": "Bestand aanmaken mislukt",
"favorites": "Favorieten",
"recent": "Recent",
"properties": "Eigenschappen",
"open_folder": "Map openen",
"upload_folder": "Map uploaden",
"file_too_large": "\"{name}\" overschrijdt de maximale bestandsgrootte ({max})",
"undo": "Ongedaan maken",
"undo_success": "Actie ongedaan gemaakt",
"undo_error": "Ongedaan maken mislukt",
"toolbar": "Bestandsacties",
"file_list": "Bestanden en mappen",
"context_menu": "Acties"
}
}