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": "Contacts",
"calendar": "Calendrier",
"settings": "Paramètres",
"files": "Fichiers",
"loading_mailboxes": "Chargement des boîtes mail...",
"push_connected": "Mises à jour en temps réel actives",
"push_disconnected": "Mises à jour en temps réel inactives",
@@ -1692,5 +1693,83 @@
"got_it": "Compris",
"settings": "Paramètres",
"dismiss": "Fermer"
},
"files": {
"title": "Fichiers",
"search_placeholder": "Rechercher des fichiers...",
"empty_state_title": "Aucun fichier pour le moment",
"empty_state_description": "Téléversez des fichiers ou créez des dossiers pour commencer",
"upload": "Téléverser",
"upload_files": "Téléverser des fichiers",
"new_folder": "Nouveau dossier",
"new_folder_name": "Nom du dossier",
"rename": "Renommer",
"rename_title": "Renommer",
"new_name": "Nouveau nom",
"delete": "Supprimer",
"delete_confirm_title": "Supprimer la ressource",
"delete_confirm_message": "Êtes-vous sûr de vouloir supprimer \"{name}\" ? Cette action est irréversible.",
"download": "Télécharger",
"name": "Nom",
"size": "Taille",
"modified": "Modifié",
"type": "Type",
"folder": "Dossier",
"file": "Fichier",
"parent_directory": "Répertoire parent",
"breadcrumb_root": "Accueil",
"drop_files_here": "Déposez les fichiers ici pour les téléverser",
"uploading": "Téléversement en cours...",
"upload_success": "{count, plural, one {1 fichier téléversé} other {# fichiers téléversés}}",
"upload_error": "Échec du téléversement du fichier",
"create_folder_success": "Dossier créé",
"create_folder_error": "Échec de la création du dossier",
"delete_success": "Supprimé avec succès",
"delete_error": "Échec de la suppression",
"rename_success": "Renommé avec succès",
"rename_error": "Échec du renommage",
"download_error": "Échec du téléchargement",
"not_available": "Le stockage de fichiers WebDAV n'est pas disponible sur ce serveur",
"cancel": "Annuler",
"create": "Créer",
"save": "Enregistrer",
"no_results": "Aucun fichier ne correspond à votre recherche",
"batch_delete_confirm_message": "Êtes-vous sûr de vouloir supprimer {count, plural, one {1 élément} other {# éléments}} ? Cette action est irréversible.",
"batch_delete_success": "{count, plural, one {1 élément supprimé} other {# éléments supprimés}}",
"grid_view": "Vue en grille",
"list_view": "Vue en liste",
"details": "Détails",
"path": "Chemin",
"preview": "Aperçu",
"preview_error": "Échec du chargement de l'aperçu",
"cut": "Couper",
"copy": "Copier",
"paste": "Coller",
"move_success": "{count, plural, one {1 élément déplacé} other {# éléments déplacés}}",
"move_error": "Échec du déplacement",
"paste_success": "Collé avec succès",
"paste_error": "Échec du collage",
"new_text_file": "Nouveau fichier texte",
"file_name": "Nom du fichier",
"retry": "Réessayer",
"refresh": "Actualiser",
"toggle_favorite": "Basculer le favori",
"duplicate": "Dupliquer",
"duplicate_success": "Dupliqué avec succès",
"duplicate_error": "Échec de la duplication",
"create_file_success": "Fichier créé",
"create_file_error": "Échec de la création du fichier",
"favorites": "Favoris",
"recent": "Récents",
"properties": "Propriétés",
"open_folder": "Ouvrir le dossier",
"upload_folder": "Téléverser un dossier",
"file_too_large": "\"{name}\" dépasse la taille maximale du fichier ({max})",
"undo": "Annuler",
"undo_success": "Action annulée",
"undo_error": "Échec de l'annulation",
"toolbar": "Actions sur les fichiers",
"file_list": "Fichiers et dossiers",
"context_menu": "Actions"
}
}