From 61e2e56b0872c89708a5e0e1ace23fc38d2c524d Mon Sep 17 00:00:00 2001 From: Connor Yoh Date: Thu, 21 Aug 2025 18:31:51 +0100 Subject: [PATCH] All tools working --- .../tools/automate/ToolConfigurationModal.tsx | 16 +++++++++ .../src/data/useTranslatedToolRegistry.tsx | 3 +- .../tools/convert/useConvertParameters.ts | 27 ++------------- frontend/src/utils/automationExecutor.ts | 8 +++++ frontend/src/utils/convertUtils.ts | 33 ++++++++++++++++++- 5 files changed, 60 insertions(+), 27 deletions(-) diff --git a/frontend/src/components/tools/automate/ToolConfigurationModal.tsx b/frontend/src/components/tools/automate/ToolConfigurationModal.tsx index f9456ad09..d97819fb8 100644 --- a/frontend/src/components/tools/automate/ToolConfigurationModal.tsx +++ b/frontend/src/components/tools/automate/ToolConfigurationModal.tsx @@ -14,6 +14,7 @@ import CheckIcon from '@mui/icons-material/Check'; import CloseIcon from '@mui/icons-material/Close'; import WarningIcon from '@mui/icons-material/Warning'; import { ToolRegistry } from '../../../data/toolsTaxonomy'; +import { getAvailableToExtensions } from '../../../utils/convertUtils'; interface ToolConfigurationModalProps { opened: boolean; tool: { @@ -59,6 +60,21 @@ export default function ToolConfigurationModal({ opened, tool, onSave, onCancel, ); } + // Special handling for ConvertSettings which needs additional props + if (tool.operation === 'convert') { + return ( + { + setParameters((prev: any) => ({ ...prev, [key]: value })); + }} + getAvailableToExtensions={getAvailableToExtensions} + selectedFiles={[]} + disabled={false} + /> + ); + } + return ( library_add, diff --git a/frontend/src/hooks/tools/convert/useConvertParameters.ts b/frontend/src/hooks/tools/convert/useConvertParameters.ts index a3d7092be..c65e60e79 100644 --- a/frontend/src/hooks/tools/convert/useConvertParameters.ts +++ b/frontend/src/hooks/tools/convert/useConvertParameters.ts @@ -8,7 +8,7 @@ import { type OutputOption, type FitOption } from '../../../constants/convertConstants'; -import { getEndpointName as getEndpointNameUtil, getEndpointUrl, isImageFormat, isWebFormat } from '../../../utils/convertUtils'; +import { getEndpointName as getEndpointNameUtil, getEndpointUrl, isImageFormat, isWebFormat, getAvailableToExtensions as getAvailableToExtensionsUtil } from '../../../utils/convertUtils'; import { detectFileExtension as detectFileExtensionUtil } from '../../../utils/fileUtils'; import { BaseParameters } from '../../../types/parameters'; import { useBaseParameters, BaseParametersHook } from '../shared/useBaseParameters'; @@ -152,30 +152,7 @@ export const useConvertParameters = (): ConvertParametersHook => { return getEndpointUrl(fromExtension, toExtension); }; - const getAvailableToExtensions = (fromExtension: string) => { - if (!fromExtension) return []; - - // Handle dynamic format identifiers (file-) - if (fromExtension.startsWith('file-')) { - // Dynamic format - use 'any' conversion options (file-to-pdf) - const supportedExtensions = CONVERSION_MATRIX['any'] || []; - return TO_FORMAT_OPTIONS.filter(option => - supportedExtensions.includes(option.value) - ); - } - - let supportedExtensions = CONVERSION_MATRIX[fromExtension] || []; - - // If no explicit conversion exists, but file-to-pdf might be available, - // fall back to 'any' conversion (which converts unknown files to PDF via file-to-pdf) - if (supportedExtensions.length === 0 && fromExtension !== 'any') { - supportedExtensions = CONVERSION_MATRIX['any'] || []; - } - - return TO_FORMAT_OPTIONS.filter(option => - supportedExtensions.includes(option.value) - ); - }; + const getAvailableToExtensions = getAvailableToExtensionsUtil; const analyzeFileTypes = (files: Array<{name: string}>) => { diff --git a/frontend/src/utils/automationExecutor.ts b/frontend/src/utils/automationExecutor.ts index 473f775a0..135e0190b 100644 --- a/frontend/src/utils/automationExecutor.ts +++ b/frontend/src/utils/automationExecutor.ts @@ -48,6 +48,14 @@ export const executeToolOperation = async ( console.log(`📋 Using config:`, config); try { + // Check if tool uses custom processor (like Convert tool) + if (config.customProcessor) { + console.log(`🎯 Using custom processor for ${config.operationType}`); + const resultFiles = await config.customProcessor(parameters, files); + console.log(`✅ Custom processor returned ${resultFiles.length} files`); + return resultFiles; + } + if (config.multiFileEndpoint) { // Multi-file processing - single API call with all files const endpoint = typeof config.endpoint === 'function' diff --git a/frontend/src/utils/convertUtils.ts b/frontend/src/utils/convertUtils.ts index 9c058c5ce..63e00da46 100644 --- a/frontend/src/utils/convertUtils.ts +++ b/frontend/src/utils/convertUtils.ts @@ -1,7 +1,9 @@ import { CONVERSION_ENDPOINTS, ENDPOINT_NAMES, - EXTENSION_TO_ENDPOINT + EXTENSION_TO_ENDPOINT, + CONVERSION_MATRIX, + TO_FORMAT_OPTIONS } from '../constants/convertConstants'; /** @@ -56,4 +58,33 @@ export const isImageFormat = (extension: string): boolean => { */ export const isWebFormat = (extension: string): boolean => { return ['html', 'zip'].includes(extension.toLowerCase()); +}; + +/** + * Gets available target extensions for a given source extension + * Extracted from useConvertParameters to be reusable in automation settings + */ +export const getAvailableToExtensions = (fromExtension: string): Array<{value: string, label: string, group: string}> => { + if (!fromExtension) return []; + + // Handle dynamic format identifiers (file-) + if (fromExtension.startsWith('file-')) { + // Dynamic format - use 'any' conversion options (file-to-pdf) + const supportedExtensions = CONVERSION_MATRIX['any'] || []; + return TO_FORMAT_OPTIONS.filter(option => + supportedExtensions.includes(option.value) + ); + } + + let supportedExtensions = CONVERSION_MATRIX[fromExtension] || []; + + // If no explicit conversion exists, but file-to-pdf might be available, + // fall back to 'any' conversion (which converts unknown files to PDF via file-to-pdf) + if (supportedExtensions.length === 0 && fromExtension !== 'any') { + supportedExtensions = CONVERSION_MATRIX['any'] || []; + } + + return TO_FORMAT_OPTIONS.filter(option => + supportedExtensions.includes(option.value) + ); }; \ No newline at end of file