feat(bookings): download button on booking and transport attachments (#2585)

Each attached file row now has a download icon next to its name, on the
desktop booking cards and detail dialog and on the phone's bookings and
transports cards. On the phone the file rows move out of the card body
button so open and download are two real sibling buttons.
This commit is contained in:
Maurice
2026-11-13 09:16:53 +01:00
parent 74af74fb5e
commit 3f68c8a50e
38 changed files with 236 additions and 88 deletions
+1
View File
@@ -17,6 +17,7 @@ const files: TranslationStrings = {
'files.subtitle.many': '{count} ملفًا لـ {trip}',
'files.download': 'تنزيل',
'files.openError': 'تعذر فتح الملف',
'files.downloadError': 'تعذر تنزيل الملف',
'files.downloadPdf': 'تنزيل PDF',
'files.count': '{count} ملف',
'files.count.zero': 'لا توجد ملفات',
+1
View File
@@ -14,6 +14,7 @@ const files: TranslationStrings = {
'files.subtitle.one': '{trip} üçün {count} fayl',
'files.download': 'Endir',
'files.openError': 'Faylı açmaq mümkün olmadı',
'files.downloadError': 'Faylı yükləmək mümkün olmadı',
'files.downloadPdf': 'PDF-i endir',
'files.count': '{count} fayl',
'files.count.one': '{count} fayl',
+1
View File
@@ -13,6 +13,7 @@ const files: TranslationStrings = {
'files.subtitle.one': '{count} arquivo para {trip}',
'files.download': 'Baixar',
'files.openError': 'Não foi possível abrir o arquivo',
'files.downloadError': 'Não foi possível baixar o arquivo',
'files.downloadPdf': 'Baixar PDF',
'files.count': '{count} arquivos',
'files.count.one': '{count} arquivo',
+1
View File
@@ -7,6 +7,7 @@ const files: TranslationStrings = {
'files.subtitle.one': '{count} fitxer per a {trip}',
'files.download': 'Baixa',
'files.openError': "No s'ha pogut obrir el fitxer",
'files.downloadError': "No s'ha pogut baixar el fitxer",
'files.downloadPdf': 'Baixa el PDF',
'files.count': '{count} fitxers',
'files.count.one': '{count} fitxer',
+1
View File
@@ -14,6 +14,7 @@ const files: TranslationStrings = {
'files.subtitle.few': '{count} soubory pro {trip}',
'files.download': 'Stáhnout',
'files.openError': 'Soubor nelze otevřít',
'files.downloadError': 'Soubor nelze stáhnout',
'files.downloadPdf': 'Stáhnout PDF',
'files.count': '{count} souborů',
'files.count.one': '{count} soubor',
+1
View File
@@ -13,6 +13,7 @@ const files: TranslationStrings = {
'files.subtitle.one': '{count} Datei für {trip}',
'files.download': 'Herunterladen',
'files.openError': 'Datei konnte nicht geöffnet werden',
'files.downloadError': 'Datei konnte nicht heruntergeladen werden',
'files.downloadPdf': 'PDF herunterladen',
'files.count': '{count} Dateien',
'files.count.one': '{count} Datei',
+1
View File
@@ -13,6 +13,7 @@ const files: TranslationStrings = {
'files.subtitle.one': '{count} file for {trip}',
'files.download': 'Download',
'files.openError': 'Could not open file',
'files.downloadError': 'Could not download file',
'files.downloadPdf': 'Download PDF',
'files.count': '{count} files',
'files.count.one': '{count} file',
+1
View File
@@ -13,6 +13,7 @@ const files: TranslationStrings = {
'files.subtitle.one': '{count} archivo para {trip}',
'files.download': 'Descargar',
'files.openError': 'No se pudo abrir el archivo',
'files.downloadError': 'No se pudo descargar el archivo',
'files.downloadPdf': 'Descargar PDF',
'files.count': '{count} archivos',
'files.count.one': '{count} archivo',
+1
View File
@@ -13,6 +13,7 @@ const files: TranslationStrings = {
'files.subtitle.one': '{count} fail reisile {trip}',
'files.download': 'Laadi alla',
'files.openError': 'Faili avamine ebaõnnestus',
'files.downloadError': 'Faili allalaadimine ebaõnnestus',
'files.downloadPdf': 'Laadi PDF alla',
'files.count': '{count} faili',
'files.count.one': '{count} fail',
+1
View File
@@ -13,6 +13,7 @@ const files: TranslationStrings = {
'files.subtitle.one': '{count} fichier pour {trip}',
'files.download': 'Télécharger',
'files.openError': "Impossible d'ouvrir le fichier",
'files.downloadError': 'Impossible de télécharger le fichier',
'files.downloadPdf': 'Télécharger le PDF',
'files.count': '{count} fichiers',
'files.count.one': '{count} fichier',
+1
View File
@@ -13,6 +13,7 @@ const files: TranslationStrings = {
'files.subtitle.one': '{count} αρχείο για {trip}',
'files.download': 'Λήψη',
'files.openError': 'Δεν ήταν δυνατό το άνοιγμα του αρχείου',
'files.downloadError': 'Δεν ήταν δυνατή η λήψη του αρχείου',
'files.downloadPdf': 'Λήψη PDF',
'files.count': '{count} αρχεία',
'files.count.one': '{count} αρχείο',
+1
View File
@@ -14,6 +14,7 @@ const files: TranslationStrings = {
'files.subtitle.two': 'שני קבצים עבור {trip}',
'files.download': 'הורדה',
'files.openError': 'לא ניתן לפתוח את הקובץ',
'files.downloadError': 'לא ניתן להוריד את הקובץ',
'files.downloadPdf': 'הורדת PDF',
'files.count': '{count} קבצים',
'files.count.one': 'קובץ אחד',
+1
View File
@@ -13,6 +13,7 @@ const files: TranslationStrings = {
'files.subtitle.one': '{count} fájl a következőhöz: {trip}',
'files.download': 'Letöltés',
'files.openError': 'A fájl megnyitása sikertelen',
'files.downloadError': 'A fájl letöltése sikertelen',
'files.downloadPdf': 'PDF letöltése',
'files.count': '{count} fájl',
'files.count.one': '{count} fájl',
+1
View File
@@ -12,6 +12,7 @@ const files: TranslationStrings = {
'files.subtitle': '{count} file untuk {trip}',
'files.download': 'Unduh',
'files.openError': 'Tidak dapat membuka file',
'files.downloadError': 'Tidak dapat mengunduh file',
'files.downloadPdf': 'Unduh PDF',
'files.count': '{count} file',
'files.uploaded': '{count} diunggah',
+1
View File
@@ -13,6 +13,7 @@ const files: TranslationStrings = {
'files.subtitle.one': '{count} file per {trip}',
'files.download': 'Scarica',
'files.openError': 'Impossibile aprire il file',
'files.downloadError': 'Impossibile scaricare il file',
'files.downloadPdf': 'Scarica PDF',
'files.count': '{count} file',
'files.count.one': '{count} file', // same-as-en
+1
View File
@@ -12,6 +12,7 @@ const files: TranslationStrings = {
'files.subtitle': '{trip} のファイル {count} 件',
'files.download': 'ダウンロード',
'files.openError': 'ファイルを開けませんでした',
'files.downloadError': 'ファイルをダウンロードできませんでした',
'files.downloadPdf': 'PDFをダウンロード',
'files.count': '{count}件のファイル',
'files.uploaded': '{count}件アップロードしました',
+1
View File
@@ -12,6 +12,7 @@ const files: TranslationStrings = {
'files.subtitle': '{trip}의 파일 {count}개',
'files.download': '다운로드',
'files.openError': '파일을 열 수 없습니다',
'files.downloadError': '파일을 다운로드할 수 없습니다',
'files.downloadPdf': 'PDF 다운로드',
'files.count': '파일 {count}개',
'files.uploaded': '{count}개 업로드됨',
+1
View File
@@ -13,6 +13,7 @@ const files: TranslationStrings = {
'files.subtitle.one': '{count} bestand voor {trip}',
'files.download': 'Downloaden',
'files.openError': 'Bestand kon niet worden geopend',
'files.downloadError': 'Bestand kon niet worden gedownload',
'files.downloadPdf': 'PDF downloaden',
'files.count': '{count} bestanden',
'files.count.one': '{count} bestand',
+1
View File
@@ -15,6 +15,7 @@ const files: TranslationStrings = {
'files.subtitle.many': '{count} plików z podróży {trip}',
'files.download': 'Pobierz',
'files.openError': 'Nie można otworzyć pliku',
'files.downloadError': 'Nie można pobrać pliku',
'files.downloadPdf': 'Pobierz PDF',
'files.count': '{count} pliku',
'files.count.one': '{count} plik',
+1
View File
@@ -15,6 +15,7 @@ const files: TranslationStrings = {
'files.subtitle.many': '{count} файлов для {trip}',
'files.download': 'Скачать',
'files.openError': 'Не удалось открыть файл',
'files.downloadError': 'Не удалось скачать файл',
'files.downloadPdf': 'Скачать PDF',
'files.count': '{count} файла',
'files.count.one': '{count} файл',
+1
View File
@@ -14,6 +14,7 @@ const files: TranslationStrings = {
'files.subtitle.few': '{count} súbory pre {trip}',
'files.download': 'Stiahnuť',
'files.openError': 'Súbor sa nedá otvoriť',
'files.downloadError': 'Súbor sa nedá stiahnuť',
'files.downloadPdf': 'Stiahnuť PDF',
'files.count': '{count} súborov',
'files.count.one': '{count} súbor',
+1
View File
@@ -13,6 +13,7 @@ const files: TranslationStrings = {
'files.subtitle.one': '{count} fil för {trip}',
'files.download': 'Ladda ner',
'files.openError': 'Kunde inte öppna fil',
'files.downloadError': 'Kunde inte ladda ner filen',
'files.downloadPdf': 'Ladda ner PDF',
'files.count': '{count} filer',
'files.count.one': '{count} fil',
+1
View File
@@ -12,6 +12,7 @@ const files: TranslationStrings = {
'files.subtitle': '{count} ไฟล์สำหรับ {trip}',
'files.download': 'ดาวน์โหลด',
'files.openError': 'ไม่สามารถเปิดไฟล์ได้',
'files.downloadError': 'ไม่สามารถดาวน์โหลดไฟล์ได้',
'files.downloadPdf': 'ดาวน์โหลดไฟล์ PDF',
'files.count': '{count} ไฟล์',
'files.uploaded': 'อัปโหลดแล้ว {count} ไฟล์',
+1
View File
@@ -13,6 +13,7 @@ const files: TranslationStrings = {
'files.subtitle.one': '{trip} için {count} dosya',
'files.download': 'İndir',
'files.openError': 'Dosya açılamadı',
'files.downloadError': 'Dosya indirilemedi',
'files.downloadPdf': 'PDF İndir',
'files.count': '{count} dosya',
'files.count.one': '{count} dosya',
+1
View File
@@ -15,6 +15,7 @@ const files: TranslationStrings = {
'files.subtitle.many': '{count} файлів для {trip}',
'files.download': 'Завантажити',
'files.openError': 'Не вдалося відкрити файл',
'files.downloadError': 'Не вдалося завантажити файл',
'files.downloadPdf': 'Завантажити PDF',
'files.count': '{count} файлу',
'files.count.one': '{count} файл',
+1
View File
@@ -13,6 +13,7 @@ const files: TranslationStrings = {
'files.subtitle': '{count} tệp cho {trip}',
'files.download': 'Tải xuống',
'files.openError': 'Không thể mở tập tin',
'files.downloadError': 'Không thể tải xuống tập tin',
'files.downloadPdf': 'Tải xuống PDF',
'files.count': '{count} tập tin',
'files.uploaded': 'Đã tải lên {count} tệp',
+1
View File
@@ -12,6 +12,7 @@ const files: TranslationStrings = {
'files.subtitle': '{trip} 的 {count} 個檔案',
'files.download': '下載',
'files.openError': '無法開啟檔案',
'files.downloadError': '無法下載檔案',
'files.downloadPdf': '下載 PDF',
'files.count': '{count} 個檔案',
'files.uploaded': '已上傳 {count} 個檔案',
+1
View File
@@ -12,6 +12,7 @@ const files: TranslationStrings = {
'files.subtitle': '{trip} 的 {count} 个文件',
'files.download': '下载',
'files.openError': '无法打开文件',
'files.downloadError': '无法下载文件',
'files.downloadPdf': '下载 PDF',
'files.count': '{count} 个文件',
'files.uploaded': '已上传 {count} 个文件',