diff --git a/frontend/src/hooks/tools/merge/useMergeOperation.test.ts b/frontend/src/hooks/tools/merge/useMergeOperation.test.ts index 0612f784d..9c4ad0e0c 100644 --- a/frontend/src/hooks/tools/merge/useMergeOperation.test.ts +++ b/frontend/src/hooks/tools/merge/useMergeOperation.test.ts @@ -20,12 +20,12 @@ vi.mock('../../../utils/toolErrorHandler', () => ({ })); // Import the mocked function -import { ToolOperationHook, useToolOperation } from '../shared/useToolOperation'; +import { MultiFileToolOperationConfig, ToolOperationHook, useToolOperation } from '../shared/useToolOperation'; describe('useMergeOperation', () => { const mockUseToolOperation = vi.mocked(useToolOperation); - const getToolConfig = () => mockUseToolOperation.mock.calls[0][0]; + const getToolConfig = () => mockUseToolOperation.mock.calls[0][0] as MultiFileToolOperationConfig; const mockToolOperationReturn: ToolOperationHook = { files: [], @@ -41,6 +41,9 @@ describe('useMergeOperation', () => { resetResults: vi.fn(), clearError: vi.fn(), cancelOperation: vi.fn(), + undoOperation: function (): Promise { + throw new Error('Function not implemented.'); + } }; beforeEach(() => { @@ -61,7 +64,7 @@ describe('useMergeOperation', () => { generateTableOfContents: false }; - const formData = config.buildFormData(parameters, mockFiles as any /* FIX ME */); + const formData = config.buildFormData(parameters, mockFiles); // Verify files are appended expect(formData.getAll('fileInput')).toHaveLength(2); @@ -115,7 +118,7 @@ describe('useMergeOperation', () => { removeDigitalSignature: false, generateTableOfContents: false }; - const formData1 = config.buildFormData(params1, mockFiles as any /* FIX ME */); + const formData1 = config.buildFormData(params1, mockFiles); expect(formData1.get('removeCertSign')).toBe('false'); expect(formData1.get('generateToc')).toBe('false'); @@ -124,7 +127,7 @@ describe('useMergeOperation', () => { removeDigitalSignature: true, generateTableOfContents: true }; - const formData2 = config.buildFormData(params2, mockFiles as any /* FIX ME */); + const formData2 = config.buildFormData(params2, mockFiles); expect(formData2.get('removeCertSign')).toBe('true'); expect(formData2.get('generateToc')).toBe('true'); }); diff --git a/frontend/src/hooks/tools/merge/useMergeOperation.ts b/frontend/src/hooks/tools/merge/useMergeOperation.ts index ec59cd129..a356be443 100644 --- a/frontend/src/hooks/tools/merge/useMergeOperation.ts +++ b/frontend/src/hooks/tools/merge/useMergeOperation.ts @@ -1,5 +1,5 @@ import { useTranslation } from 'react-i18next'; -import { useToolOperation, ResponseHandler, ToolOperationConfig } from '../shared/useToolOperation'; +import { useToolOperation, ResponseHandler, ToolOperationConfig, ToolType } from '../shared/useToolOperation'; import { createStandardErrorHandler } from '../../../utils/toolErrorHandler'; import { MergeParameters } from './useMergeParameters'; @@ -23,11 +23,11 @@ const mergeResponseHandler: ResponseHandler = (blob: Blob, originalFiles: File[] // Operation configuration for automation export const mergeOperationConfig: ToolOperationConfig = { + toolType: ToolType.multiFile, + buildFormData, operationType: 'merge', endpoint: '/api/v1/general/merge-pdfs', - buildFormData, filePrefix: 'merged_', - multiFileEndpoint: true, responseHandler: mergeResponseHandler, }; diff --git a/frontend/src/hooks/useToolManagement.tsx b/frontend/src/hooks/useToolManagement.tsx index 0de4391b0..3239cbaaa 100644 --- a/frontend/src/hooks/useToolManagement.tsx +++ b/frontend/src/hooks/useToolManagement.tsx @@ -2,7 +2,6 @@ import { useState, useCallback, useMemo } from 'react'; import { useTranslation } from 'react-i18next'; import { useFlatToolRegistry } from "../data/useTranslatedToolRegistry"; import { getAllEndpoints, type ToolRegistryEntry } from "../data/toolsTaxonomy"; -import MergeIcon from "@mui/icons-material/Merge"; import { useMultipleEndpointsEnabled } from "./useEndpointConfig"; import { FileId } from '../types/file'; diff --git a/frontend/src/tools/Merge.tsx b/frontend/src/tools/Merge.tsx index 84be9e2a3..7c07d326c 100644 --- a/frontend/src/tools/Merge.tsx +++ b/frontend/src/tools/Merge.tsx @@ -52,6 +52,11 @@ const Merge = ({ onPreviewFile, onComplete, onError }: BaseToolProps) => { onPreviewFile?.(null); }; + const handleUndo = async () => { + await mergeOperation.undoOperation(); + onPreviewFile?.(null); + }; + // TODO: Move to more general place so other tools can use it const sortFiles = useCallback((sortType: 'filename' | 'dateModified', ascending: boolean = true) => { // Sort the FileIds based on their corresponding File properties @@ -102,6 +107,18 @@ const Merge = ({ onPreviewFile, onComplete, onError }: BaseToolProps) => { title: "Settings", isCollapsed: settingsCollapsed, onCollapsedClick: settingsCollapsed ? handleSettingsReset : undefined, + tooltip: { + tips: [ + { + title: t('merge.removeDigitalSignature.tooltip.title', 'Remove Digital Signature'), + description: t('merge.removeDigitalSignature.tooltip.description', 'Digital signatures will be invalidated when merging files. Check this to remove them from the final merged PDF.') + }, + { + title: t('merge.generateTableOfContents.tooltip.title', 'Generate Table of Contents'), + description: t('merge.generateTableOfContents.tooltip.description', 'Automatically creates a clickable table of contents in the merged PDF based on the original file names and page numbers.') + } + ] + }, content: ( { operation: mergeOperation, title: t("merge.title", "Merge Results"), onFileClick: handleThumbnailClick, + onUndo: handleUndo, }, }); };