feat(files): upload files with drag and drop

This commit is contained in:
Bohdan Triapitsyn
2026-08-18 21:24:53 +03:00
parent 215749a65f
commit 423f5b9652
20 changed files with 657 additions and 4 deletions
+8
View File
@@ -1172,6 +1172,14 @@ export const dict = {
'sidebarFilesTree.toast.writeNotSupported': 'Schreiben nicht unterstützt',
'sidebarFilesTree.toast.fileCreated': 'Datei erstellt',
'sidebarFilesTree.toast.operationFailed': 'Operation fehlgeschlagen',
'sidebarFilesTree.toast.uploaded': 'Dateien hochgeladen',
'sidebarFilesTree.toast.uploadedWithoutConflicts': 'Dateien ohne Konflikte wurden hochgeladen',
'sidebarFilesTree.toast.uploadFailed': 'Einige Dateien konnten nicht hochgeladen werden',
'sidebarFilesTree.drop.target': 'In {path} hochladen',
'sidebarFilesTree.drop.uploading': 'Dateien werden in {path} hochgeladen',
'sidebarFilesTree.dialog.uploadConflicts.title': 'Vorhandene Dateien ersetzen?',
'sidebarFilesTree.dialog.uploadConflicts.description': 'Dateien mit diesen Namen sind in {path} bereits vorhanden. Das Ersetzen kann nicht rückgängig gemacht werden.',
'sidebarFilesTree.dialog.uploadConflicts.replace': 'Ersetzen',
'sidebarFilesTree.toast.folderNameRequired': 'Ordnername ist erforderlich',
'sidebarFilesTree.toast.folderCreated': 'Ordner erstellt',
'sidebarFilesTree.toast.nameRequired': 'Name ist erforderlich',
+8
View File
@@ -1322,6 +1322,14 @@ export const dict = {
'sidebarFilesTree.toast.writeNotSupported': 'Write not supported',
'sidebarFilesTree.toast.fileCreated': 'File created',
'sidebarFilesTree.toast.operationFailed': 'Operation failed',
'sidebarFilesTree.toast.uploaded': 'Files uploaded',
'sidebarFilesTree.toast.uploadedWithoutConflicts': 'Files without conflicts were uploaded',
'sidebarFilesTree.toast.uploadFailed': 'Some files could not be uploaded',
'sidebarFilesTree.drop.target': 'Upload to {path}',
'sidebarFilesTree.drop.uploading': 'Uploading files to {path}',
'sidebarFilesTree.dialog.uploadConflicts.title': 'Replace existing files?',
'sidebarFilesTree.dialog.uploadConflicts.description': 'Files with these names already exist in {path}. Replacing them cannot be undone.',
'sidebarFilesTree.dialog.uploadConflicts.replace': 'Replace',
'sidebarFilesTree.toast.folderNameRequired': 'Folder name is required',
'sidebarFilesTree.toast.folderCreated': 'Folder created',
'sidebarFilesTree.toast.nameRequired': 'Name is required',
+8
View File
@@ -1288,6 +1288,14 @@ export const dict: Record<I18nKey, string> = {
"sidebarFilesTree.toast.writeNotSupported": "La escritura no es compatible",
"sidebarFilesTree.toast.fileCreated": "Archivo creado",
"sidebarFilesTree.toast.operationFailed": "No se pudo completar la operación",
"sidebarFilesTree.toast.uploaded": "Archivos subidos",
"sidebarFilesTree.toast.uploadedWithoutConflicts": "Se subieron los archivos sin conflictos",
"sidebarFilesTree.toast.uploadFailed": "No se pudieron subir algunos archivos",
"sidebarFilesTree.drop.target": "Subir a {path}",
"sidebarFilesTree.drop.uploading": "Subiendo archivos a {path}",
"sidebarFilesTree.dialog.uploadConflicts.title": "¿Reemplazar los archivos existentes?",
"sidebarFilesTree.dialog.uploadConflicts.description": "Ya existen archivos con estos nombres en {path}. El reemplazo no se puede deshacer.",
"sidebarFilesTree.dialog.uploadConflicts.replace": "Reemplazar",
"sidebarFilesTree.toast.folderNameRequired": "El nombre de carpeta es obligatorio",
"sidebarFilesTree.toast.folderCreated": "Carpeta creada",
"sidebarFilesTree.toast.nameRequired": "El nombre es obligatorio",
+8
View File
@@ -1089,6 +1089,14 @@ export const dict = {
'sidebarFilesTree.toast.writeNotSupported': 'Écriture non prise en charge',
'sidebarFilesTree.toast.fileCreated': 'Fichier créé',
'sidebarFilesTree.toast.operationFailed': 'L\'opération a échoué',
'sidebarFilesTree.toast.uploaded': 'Fichiers téléversés',
'sidebarFilesTree.toast.uploadedWithoutConflicts': 'Les fichiers sans conflit ont été téléversés',
'sidebarFilesTree.toast.uploadFailed': 'Certains fichiers n’ont pas pu être téléversés',
'sidebarFilesTree.drop.target': 'Téléverser dans {path}',
'sidebarFilesTree.drop.uploading': 'Téléversement des fichiers dans {path}',
'sidebarFilesTree.dialog.uploadConflicts.title': 'Remplacer les fichiers existants ?',
'sidebarFilesTree.dialog.uploadConflicts.description': 'Des fichiers portant ces noms existent déjà dans {path}. Leur remplacement est irréversible.',
'sidebarFilesTree.dialog.uploadConflicts.replace': 'Remplacer',
'sidebarFilesTree.toast.folderNameRequired': 'Le nom du dossier est requis',
'sidebarFilesTree.toast.folderCreated': 'Dossier créé',
'sidebarFilesTree.toast.nameRequired': 'Le nom est requis',
+8
View File
@@ -1318,6 +1318,14 @@ export const dict: Record<I18nKey, string> = {
'sidebarFilesTree.toast.writeNotSupported': '書き込みはサポートされていません',
'sidebarFilesTree.toast.fileCreated': 'ファイルを作成しました',
'sidebarFilesTree.toast.operationFailed': '操作に失敗しました',
'sidebarFilesTree.toast.uploaded': 'ファイルをアップロードしました',
'sidebarFilesTree.toast.uploadedWithoutConflicts': '競合のないファイルをアップロードしました',
'sidebarFilesTree.toast.uploadFailed': '一部のファイルをアップロードできませんでした',
'sidebarFilesTree.drop.target': '{path} にアップロード',
'sidebarFilesTree.drop.uploading': '{path} にファイルをアップロードしています',
'sidebarFilesTree.dialog.uploadConflicts.title': '既存のファイルを置き換えますか?',
'sidebarFilesTree.dialog.uploadConflicts.description': '同じ名前のファイルが {path} に既に存在します。置き換えは元に戻せません。',
'sidebarFilesTree.dialog.uploadConflicts.replace': '置き換える',
'sidebarFilesTree.toast.folderNameRequired': 'フォルダ名が必要です',
'sidebarFilesTree.toast.folderCreated': 'フォルダを作成しました',
'sidebarFilesTree.toast.nameRequired': '名前が必要です',
+8
View File
@@ -1324,6 +1324,14 @@ export const dict: Record<I18nKey, string> = {
'sidebarFilesTree.toast.writeNotSupported': '쓰기를 지원하지 않음',
'sidebarFilesTree.toast.fileCreated': '파일 생성됨',
'sidebarFilesTree.toast.operationFailed': '작업 실패',
'sidebarFilesTree.toast.uploaded': '파일을 업로드했습니다',
'sidebarFilesTree.toast.uploadedWithoutConflicts': '충돌하지 않은 파일을 업로드했습니다',
'sidebarFilesTree.toast.uploadFailed': '일부 파일을 업로드하지 못했습니다',
'sidebarFilesTree.drop.target': '{path}에 업로드',
'sidebarFilesTree.drop.uploading': '{path}에 파일 업로드 중',
'sidebarFilesTree.dialog.uploadConflicts.title': '기존 파일을 교체할까요?',
'sidebarFilesTree.dialog.uploadConflicts.description': '같은 이름의 파일이 {path}에 이미 있습니다. 교체 작업은 취소할 수 없습니다.',
'sidebarFilesTree.dialog.uploadConflicts.replace': '교체',
'sidebarFilesTree.toast.folderNameRequired': '폴더 이름 필수',
'sidebarFilesTree.toast.folderCreated': '폴더 생성됨',
'sidebarFilesTree.toast.nameRequired': '이름 필수',
+8
View File
@@ -2845,6 +2845,14 @@ export const dict: Record<I18nKey, string> = {
'sidebarFilesTree.toast.folderNameRequired': 'Nazwa folderu jest wymagana',
'sidebarFilesTree.toast.nameRequired': 'Nazwa jest wymagana',
'sidebarFilesTree.toast.operationFailed': 'Operacja nie powiodła się',
'sidebarFilesTree.toast.uploaded': 'Pliki przesłano',
'sidebarFilesTree.toast.uploadedWithoutConflicts': 'Przesłano pliki bez konfliktów',
'sidebarFilesTree.toast.uploadFailed': 'Nie udało się przesłać niektórych plików',
'sidebarFilesTree.drop.target': 'Prześlij do {path}',
'sidebarFilesTree.drop.uploading': 'Przesyłanie plików do {path}',
'sidebarFilesTree.dialog.uploadConflicts.title': 'Zastąpić istniejące pliki?',
'sidebarFilesTree.dialog.uploadConflicts.description': 'Pliki o tych nazwach już istnieją w {path}. Zastąpienia nie można cofnąć.',
'sidebarFilesTree.dialog.uploadConflicts.replace': 'Zastąp',
'sidebarFilesTree.toast.pathCopied': 'Ścieżka skopiowana',
'sidebarFilesTree.toast.renameNotSupported': 'Zmiana nazwy nie jest obsługiwana',
'sidebarFilesTree.toast.renamedSuccessfully': 'Zmieniono nazwę pomyślnie',
@@ -1288,6 +1288,14 @@ export const dict: Record<I18nKey, string> = {
"sidebarFilesTree.toast.writeNotSupported": "A escrita não é compatível",
"sidebarFilesTree.toast.fileCreated": "Arquivo criado",
"sidebarFilesTree.toast.operationFailed": "Não foi possível completar a operación",
"sidebarFilesTree.toast.uploaded": "Arquivos enviados",
"sidebarFilesTree.toast.uploadedWithoutConflicts": "Os arquivos sem conflitos foram enviados",
"sidebarFilesTree.toast.uploadFailed": "Não foi possível enviar alguns arquivos",
"sidebarFilesTree.drop.target": "Enviar para {path}",
"sidebarFilesTree.drop.uploading": "Enviando arquivos para {path}",
"sidebarFilesTree.dialog.uploadConflicts.title": "Substituir arquivos existentes?",
"sidebarFilesTree.dialog.uploadConflicts.description": "Já existem arquivos com esses nomes em {path}. A substituição não pode ser desfeita.",
"sidebarFilesTree.dialog.uploadConflicts.replace": "Substituir",
"sidebarFilesTree.toast.folderNameRequired": "O nome de pasta é obrigatório",
"sidebarFilesTree.toast.folderCreated": "Pasta criada",
"sidebarFilesTree.toast.nameRequired": "O nome é obrigatório",
+8
View File
@@ -1288,6 +1288,14 @@ export const dict: Record<I18nKey, string> = {
"sidebarFilesTree.toast.writeNotSupported": "Запис не підтримується",
"sidebarFilesTree.toast.fileCreated": "Файл створено",
"sidebarFilesTree.toast.operationFailed": "Операція не вдалася",
"sidebarFilesTree.toast.uploaded": "Файли завантажено",
"sidebarFilesTree.toast.uploadedWithoutConflicts": "Файли без конфліктів завантажено",
"sidebarFilesTree.toast.uploadFailed": "Деякі файли не вдалося завантажити",
"sidebarFilesTree.drop.target": "Завантажити в {path}",
"sidebarFilesTree.drop.uploading": "Завантаження файлів у {path}",
"sidebarFilesTree.dialog.uploadConflicts.title": "Замінити наявні файли?",
"sidebarFilesTree.dialog.uploadConflicts.description": "Файли з такими назвами вже існують у {path}. Заміну неможливо скасувати.",
"sidebarFilesTree.dialog.uploadConflicts.replace": "Замінити",
"sidebarFilesTree.toast.folderNameRequired": "Потрібно вказати назву папки",
"sidebarFilesTree.toast.folderCreated": "Папку створено",
"sidebarFilesTree.toast.nameRequired": "Потрібно вказати назву",
@@ -1288,6 +1288,14 @@ export const dict: Record<I18nKey, string> = {
'sidebarFilesTree.toast.writeNotSupported': '不支持写入',
'sidebarFilesTree.toast.fileCreated': '文件已创建',
'sidebarFilesTree.toast.operationFailed': '操作失败',
'sidebarFilesTree.toast.uploaded': '文件已上传',
'sidebarFilesTree.toast.uploadedWithoutConflicts': '无冲突的文件已上传',
'sidebarFilesTree.toast.uploadFailed': '部分文件无法上传',
'sidebarFilesTree.drop.target': '上传到 {path}',
'sidebarFilesTree.drop.uploading': '正在将文件上传到 {path}',
'sidebarFilesTree.dialog.uploadConflicts.title': '替换现有文件?',
'sidebarFilesTree.dialog.uploadConflicts.description': '{path} 中已存在同名文件。替换后无法撤销。',
'sidebarFilesTree.dialog.uploadConflicts.replace': '替换',
'sidebarFilesTree.toast.folderNameRequired': '文件夹名不能为空',
'sidebarFilesTree.toast.folderCreated': '文件夹已创建',
'sidebarFilesTree.toast.nameRequired': '名称不能为空',
@@ -1300,6 +1300,14 @@ export const dict: Record<I18nKey, string> = {
'sidebarFilesTree.toast.writeNotSupported': '不支援寫入',
'sidebarFilesTree.toast.fileCreated': '檔案已建立',
'sidebarFilesTree.toast.operationFailed': '操作失敗',
'sidebarFilesTree.toast.uploaded': '檔案已上傳',
'sidebarFilesTree.toast.uploadedWithoutConflicts': '無衝突的檔案已上傳',
'sidebarFilesTree.toast.uploadFailed': '部分檔案無法上傳',
'sidebarFilesTree.drop.target': '上傳至 {path}',
'sidebarFilesTree.drop.uploading': '正在將檔案上傳至 {path}',
'sidebarFilesTree.dialog.uploadConflicts.title': '取代現有檔案?',
'sidebarFilesTree.dialog.uploadConflicts.description': '{path} 中已有同名檔案。取代後無法復原。',
'sidebarFilesTree.dialog.uploadConflicts.replace': '取代',
'sidebarFilesTree.toast.folderNameRequired': '資料夾名稱不能為空',
'sidebarFilesTree.toast.folderCreated': '資料夾已建立',
'sidebarFilesTree.toast.nameRequired': '名稱不能為空',