From 1fb730229c74c4c60113f4cbfe91b5c0b841029f Mon Sep 17 00:00:00 2001 From: Connor Yoh Date: Fri, 1 Aug 2025 14:43:34 +0100 Subject: [PATCH] Select all files of given type --- .../tools/convert/ConvertSettings.tsx | 65 +++++++++++-------- frontend/src/tools/Convert.tsx | 10 ++- 2 files changed, 46 insertions(+), 29 deletions(-) diff --git a/frontend/src/components/tools/convert/ConvertSettings.tsx b/frontend/src/components/tools/convert/ConvertSettings.tsx index 041ad2b29..fa6134f54 100644 --- a/frontend/src/components/tools/convert/ConvertSettings.tsx +++ b/frontend/src/components/tools/convert/ConvertSettings.tsx @@ -35,13 +35,13 @@ const ConvertSettings = ({ onParameterChange, getAvailableToExtensions, selectedFiles, - disabled = false + disabled = false }: ConvertSettingsProps) => { const { t } = useTranslation(); const theme = useMantineTheme(); const { colorScheme } = useMantineColorScheme(); const { setSelectedFiles } = useFileSelectionActions(); - const { setSelectedFiles: setContextSelectedFiles } = useFileContext(); + const { activeFiles, setSelectedFiles: setContextSelectedFiles } = useFileContext(); const allEndpoints = useMemo(() => { const endpoints = new Set(); @@ -105,14 +105,7 @@ const ConvertSettings = ({ })); }, [parameters.fromExtension, getAvailableToExtensions, endpointStatus]); - const handleFromExtensionChange = (value: string) => { - onParameterChange('fromExtension', value); - - // Auto-select target if only one option available - const availableToOptions = getAvailableToExtensions(value); - const autoTarget = availableToOptions.length === 1 ? availableToOptions[0].value : ''; - onParameterChange('toExtension', autoTarget); - + const resetParametersToDefaults = () => { onParameterChange('imageOptions', { colorType: COLOR_TYPES.COLOR, dpi: 300, @@ -132,24 +125,44 @@ const ConvertSettings = ({ }); onParameterChange('isSmartDetection', false); onParameterChange('smartDetectionType', 'none'); - - if (selectedFiles.length > 0 && value !== 'any') { - const matchingFiles = selectedFiles.filter(file => { - const extension = file.name.split('.').pop()?.toLowerCase() || ''; - - if (value === 'image') { - return isImageFormat(extension); - } - - return extension === value; - }); + }; + + const setAutoTargetExtension = (fromExtension: string) => { + const availableToOptions = getAvailableToExtensions(fromExtension); + const autoTarget = availableToOptions.length === 1 ? availableToOptions[0].value : ''; + onParameterChange('toExtension', autoTarget); + }; + + const filterFilesByExtension = (extension: string) => { + return activeFiles.filter(file => { + const fileExtension = detectFileExtension(file.name); - if (matchingFiles.length !== selectedFiles.length) { - setSelectedFiles(matchingFiles); - - const matchingFileIds = matchingFiles.map(file => (file as any).id || file.name); - setContextSelectedFiles(matchingFileIds); + if (extension === 'any') { + return true; + } else if (extension === 'image') { + return isImageFormat(fileExtension); + } else { + return fileExtension === extension; } + }); + }; + + const updateFileSelection = (files: File[]) => { + setSelectedFiles(files); + const fileIds = files.map(file => (file as any).id || file.name); + setContextSelectedFiles(fileIds); + }; + + const handleFromExtensionChange = (value: string) => { + onParameterChange('fromExtension', value); + setAutoTargetExtension(value); + resetParametersToDefaults(); + + if (activeFiles.length > 0) { + const matchingFiles = filterFilesByExtension(value); + updateFileSelection(matchingFiles); + } else { + updateFileSelection([]); } }; diff --git a/frontend/src/tools/Convert.tsx b/frontend/src/tools/Convert.tsx index 832b20a82..ef30d7ffe 100644 --- a/frontend/src/tools/Convert.tsx +++ b/frontend/src/tools/Convert.tsx @@ -20,7 +20,7 @@ import { BaseToolProps } from "../types/tool"; const Convert = ({ onPreviewFile, onComplete, onError }: BaseToolProps) => { const { t } = useTranslation(); - const { setCurrentMode } = useFileContext(); + const { setCurrentMode, activeFiles } = useFileContext(); const { selectedFiles } = useToolFileSelection(); const scrollContainerRef = useRef(null); @@ -49,9 +49,13 @@ const Convert = ({ onPreviewFile, onComplete, onError }: BaseToolProps) => { if (selectedFiles.length > 0) { convertParams.analyzeFileTypes(selectedFiles); } else { - convertParams.resetParameters(); + // Only reset when there are no active files at all + // If there are active files but no selected files, keep current format (user filtered by format) + if (activeFiles.length === 0) { + convertParams.resetParameters(); + } } - }, [selectedFiles]); + }, [selectedFiles, activeFiles]); useEffect(() => { convertOperation.resetResults();