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": "Contatti",
"calendar": "Calendario",
"settings": "Impostazioni",
"files": "File",
"loading_mailboxes": "Caricamento caselle di posta...",
"push_connected": "Aggiornamenti in tempo reale attivi",
"push_disconnected": "Aggiornamenti in tempo reale non attivi",
@@ -1692,5 +1693,83 @@
"got_it": "Ho capito",
"settings": "Impostazioni",
"dismiss": "Chiudi"
},
"files": {
"title": "File",
"search_placeholder": "Cerca file...",
"empty_state_title": "Nessun file ancora",
"empty_state_description": "Carica file o crea cartelle per iniziare",
"upload": "Carica",
"upload_files": "Carica file",
"new_folder": "Nuova cartella",
"new_folder_name": "Nome cartella",
"rename": "Rinomina",
"rename_title": "Rinomina",
"new_name": "Nuovo nome",
"delete": "Elimina",
"delete_confirm_title": "Elimina risorsa",
"delete_confirm_message": "Sei sicuro di voler eliminare \"{name}\"? Questa azione non può essere annullata.",
"download": "Scarica",
"name": "Nome",
"size": "Dimensione",
"modified": "Modificato",
"type": "Tipo",
"folder": "Cartella",
"file": "File",
"parent_directory": "Directory superiore",
"breadcrumb_root": "Home",
"drop_files_here": "Trascina i file qui per caricarli",
"uploading": "Caricamento in corso...",
"upload_success": "{count, plural, one {1 file caricato} other {# file caricati}}",
"upload_error": "Caricamento del file non riuscito",
"create_folder_success": "Cartella creata",
"create_folder_error": "Creazione della cartella non riuscita",
"delete_success": "Eliminato con successo",
"delete_error": "Eliminazione non riuscita",
"rename_success": "Rinominato con successo",
"rename_error": "Rinominazione non riuscita",
"download_error": "Download non riuscito",
"not_available": "L'archiviazione file WebDAV non è disponibile su questo server",
"cancel": "Annulla",
"create": "Crea",
"save": "Salva",
"no_results": "Nessun file corrisponde alla ricerca",
"batch_delete_confirm_message": "Sei sicuro di voler eliminare {count, plural, one {1 elemento} other {# elementi}}? Questa azione non può essere annullata.",
"batch_delete_success": "{count, plural, one {1 elemento eliminato} other {# elementi eliminati}}",
"grid_view": "Vista a griglia",
"list_view": "Vista a elenco",
"details": "Dettagli",
"path": "Percorso",
"preview": "Anteprima",
"preview_error": "Caricamento dell'anteprima non riuscito",
"cut": "Taglia",
"copy": "Copia",
"paste": "Incolla",
"move_success": "{count, plural, one {1 elemento spostato} other {# elementi spostati}}",
"move_error": "Spostamento non riuscito",
"paste_success": "Incollato con successo",
"paste_error": "Incollaggio non riuscito",
"new_text_file": "Nuovo file di testo",
"file_name": "Nome del file",
"retry": "Riprova",
"refresh": "Aggiorna",
"toggle_favorite": "Attiva/disattiva preferito",
"duplicate": "Duplica",
"duplicate_success": "Duplicato con successo",
"duplicate_error": "Duplicazione non riuscita",
"create_file_success": "File creato",
"create_file_error": "Creazione del file non riuscita",
"favorites": "Preferiti",
"recent": "Recenti",
"properties": "Proprietà",
"open_folder": "Apri cartella",
"upload_folder": "Carica cartella",
"file_too_large": "\"{name}\" supera la dimensione massima del file ({max})",
"undo": "Annulla",
"undo_success": "Azione annullata",
"undo_error": "Annullamento non riuscito",
"toolbar": "Azioni file",
"file_list": "File e cartelle",
"context_menu": "Azioni"
}
}