diff --git a/public/app.js b/public/app.js index 40730bc..daf9511 100644 --- a/public/app.js +++ b/public/app.js @@ -3,6 +3,7 @@ const state = { lang: 'en', fileType: 'allTypes', // 'images' | 'videos' | 'allTypes' | 'files' | 'music' copyMode: 'allFiles', // 'allFiles' | 'dateRange' + folderMode: 'filesOnly', // 'filesOnly' | 'keepFolders' dateFrom: null, // 'YYYY-MM-DD' | null dateTo: null, // 'YYYY-MM-DD' | null sourcePath: null, // selected phone path @@ -88,6 +89,11 @@ document.addEventListener('DOMContentLoaded', async () => { btn.addEventListener('click', () => selectCopyMode(btn.dataset.value)); }); + // Folder mode buttons + document.querySelectorAll('[data-group="folderMode"]').forEach(btn => { + btn.addEventListener('click', () => selectFolderMode(btn.dataset.value)); + }); + // Date range inputs document.getElementById('date-from').addEventListener('change', e => { state.dateFrom = e.target.value || null; @@ -271,8 +277,7 @@ function selectFileType(type) { }); const isFiles = type === 'files' || type === 'music'; - document.querySelector('[data-group="copyMode"][data-value="allFiles"]').disabled = isFiles; - document.querySelector('[data-group="copyMode"][data-value="dateRange"]').hidden = isFiles; + document.getElementById('section-date-filter').hidden = isFiles; // If date range was active when switching to Files, reset to all files if (isFiles && state.copyMode === 'dateRange') { @@ -293,6 +298,13 @@ function selectCopyMode(mode) { } } +function selectFolderMode(mode) { + state.folderMode = mode; + document.querySelectorAll('[data-group="folderMode"]').forEach(btn => { + btn.classList.toggle('active', btn.dataset.value === mode); + }); +} + function validateDateRange() { const errEl = document.getElementById('date-range-error'); if (state.dateFrom && state.dateTo && state.dateFrom > state.dateTo) { @@ -501,9 +513,10 @@ async function startTransfer() { showScreen('transfer'); const body = { - sourceDir: state.sourcePath, - destDir: state.destPath, - fileType: state.fileType, + sourceDir: state.sourcePath, + destDir: state.destPath, + fileType: state.fileType, + folderMode: state.folderMode, }; if (state.copyMode === 'dateRange') { body.dateFrom = state.dateFrom; @@ -607,8 +620,11 @@ function resetToStart() { document.querySelectorAll('[data-group="copyMode"]').forEach(btn => { btn.classList.toggle('active', btn.dataset.value === 'allFiles'); }); - document.querySelector('[data-group="copyMode"][data-value="allFiles"]').disabled = false; - document.querySelector('[data-group="copyMode"][data-value="dateRange"]').hidden = false; + state.folderMode = 'filesOnly'; + document.querySelectorAll('[data-group="folderMode"]').forEach(btn => { + btn.classList.toggle('active', btn.dataset.value === 'filesOnly'); + }); + document.getElementById('section-date-filter').hidden = false; document.getElementById('date-range-row').hidden = true; document.getElementById('date-from').value = ''; document.getElementById('date-to').value = ''; diff --git a/public/i18n/da.json b/public/i18n/da.json index 18370fa..a2bcc1d 100644 --- a/public/i18n/da.json +++ b/public/i18n/da.json @@ -52,6 +52,12 @@ "selectPaths": "Vælg venligst både en kildemappe på telefonen og en destinationsmappe på denne computer, inden du starter.", "modeAll": "Alle filer", "modeDateRange": "Datointerval", + "folderModeFiles": "Kun filer", + "folderModeFolders": "Filer og mapper", + "sectionFileType": "Filtype", + "sectionDateFilter": "Datofilter", + "sectionStructure": "Struktur", + "sectionFolders": "Mapper", "dateFrom": "Fra", "dateTo": "Til", "dateRangeError": "\"Fra\"-dato må ikke være efter \"Til\"-dato.", diff --git a/public/i18n/en.json b/public/i18n/en.json index 59362fd..7a800f8 100644 --- a/public/i18n/en.json +++ b/public/i18n/en.json @@ -52,6 +52,12 @@ "selectPaths": "Please select both a source folder on the phone and a destination folder on this computer before starting.", "modeAll": "All files", "modeDateRange": "Date range", + "folderModeFiles": "Files", + "folderModeFolders": "Files & folders", + "sectionFileType": "File type", + "sectionDateFilter": "Date filter", + "sectionStructure": "Structure", + "sectionFolders": "Folders", "dateFrom": "From", "dateTo": "To", "dateRangeError": "\"From\" date must not be after \"To\" date.", diff --git a/public/i18n/es.json b/public/i18n/es.json index 351e232..008f6bd 100644 --- a/public/i18n/es.json +++ b/public/i18n/es.json @@ -52,6 +52,12 @@ "selectPaths": "Por favor, selecciona una carpeta de origen en el teléfono y una carpeta de destino en este ordenador antes de empezar.", "modeAll": "Todos los archivos", "modeDateRange": "Intervalo de fechas", + "folderModeFiles": "Solo archivos", + "folderModeFolders": "Archivos y carpetas", + "sectionFileType": "Tipo de archivo", + "sectionDateFilter": "Filtro de fecha", + "sectionStructure": "Estructura", + "sectionFolders": "Carpetas", "dateFrom": "Desde", "dateTo": "Hasta", "dateRangeError": "La fecha \"Desde\" no puede ser posterior a \"Hasta\".", diff --git a/public/index.html b/public/index.html index 1695cac..812013e 100644 --- a/public/index.html +++ b/public/index.html @@ -111,45 +111,62 @@