Update to get running in current version

This commit is contained in:
James Brunton 2025-09-09 13:30:44 +01:00
parent a6e250e2fd
commit 8206310ef3
4 changed files with 29 additions and 9 deletions

View File

@ -20,12 +20,12 @@ vi.mock('../../../utils/toolErrorHandler', () => ({
})); }));
// Import the mocked function // Import the mocked function
import { ToolOperationHook, useToolOperation } from '../shared/useToolOperation'; import { MultiFileToolOperationConfig, ToolOperationHook, useToolOperation } from '../shared/useToolOperation';
describe('useMergeOperation', () => { describe('useMergeOperation', () => {
const mockUseToolOperation = vi.mocked(useToolOperation<MergeParameters>); const mockUseToolOperation = vi.mocked(useToolOperation<MergeParameters>);
const getToolConfig = () => mockUseToolOperation.mock.calls[0][0]; const getToolConfig = () => mockUseToolOperation.mock.calls[0][0] as MultiFileToolOperationConfig<MergeParameters>;
const mockToolOperationReturn: ToolOperationHook<unknown> = { const mockToolOperationReturn: ToolOperationHook<unknown> = {
files: [], files: [],
@ -41,6 +41,9 @@ describe('useMergeOperation', () => {
resetResults: vi.fn(), resetResults: vi.fn(),
clearError: vi.fn(), clearError: vi.fn(),
cancelOperation: vi.fn(), cancelOperation: vi.fn(),
undoOperation: function (): Promise<void> {
throw new Error('Function not implemented.');
}
}; };
beforeEach(() => { beforeEach(() => {
@ -61,7 +64,7 @@ describe('useMergeOperation', () => {
generateTableOfContents: false generateTableOfContents: false
}; };
const formData = config.buildFormData(parameters, mockFiles as any /* FIX ME */); const formData = config.buildFormData(parameters, mockFiles);
// Verify files are appended // Verify files are appended
expect(formData.getAll('fileInput')).toHaveLength(2); expect(formData.getAll('fileInput')).toHaveLength(2);
@ -115,7 +118,7 @@ describe('useMergeOperation', () => {
removeDigitalSignature: false, removeDigitalSignature: false,
generateTableOfContents: 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('removeCertSign')).toBe('false');
expect(formData1.get('generateToc')).toBe('false'); expect(formData1.get('generateToc')).toBe('false');
@ -124,7 +127,7 @@ describe('useMergeOperation', () => {
removeDigitalSignature: true, removeDigitalSignature: true,
generateTableOfContents: 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('removeCertSign')).toBe('true');
expect(formData2.get('generateToc')).toBe('true'); expect(formData2.get('generateToc')).toBe('true');
}); });

View File

@ -1,5 +1,5 @@
import { useTranslation } from 'react-i18next'; 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 { createStandardErrorHandler } from '../../../utils/toolErrorHandler';
import { MergeParameters } from './useMergeParameters'; import { MergeParameters } from './useMergeParameters';
@ -23,11 +23,11 @@ const mergeResponseHandler: ResponseHandler = (blob: Blob, originalFiles: File[]
// Operation configuration for automation // Operation configuration for automation
export const mergeOperationConfig: ToolOperationConfig<MergeParameters> = { export const mergeOperationConfig: ToolOperationConfig<MergeParameters> = {
toolType: ToolType.multiFile,
buildFormData,
operationType: 'merge', operationType: 'merge',
endpoint: '/api/v1/general/merge-pdfs', endpoint: '/api/v1/general/merge-pdfs',
buildFormData,
filePrefix: 'merged_', filePrefix: 'merged_',
multiFileEndpoint: true,
responseHandler: mergeResponseHandler, responseHandler: mergeResponseHandler,
}; };

View File

@ -2,7 +2,6 @@ import { useState, useCallback, useMemo } from 'react';
import { useTranslation } from 'react-i18next'; import { useTranslation } from 'react-i18next';
import { useFlatToolRegistry } from "../data/useTranslatedToolRegistry"; import { useFlatToolRegistry } from "../data/useTranslatedToolRegistry";
import { getAllEndpoints, type ToolRegistryEntry } from "../data/toolsTaxonomy"; import { getAllEndpoints, type ToolRegistryEntry } from "../data/toolsTaxonomy";
import MergeIcon from "@mui/icons-material/Merge";
import { useMultipleEndpointsEnabled } from "./useEndpointConfig"; import { useMultipleEndpointsEnabled } from "./useEndpointConfig";
import { FileId } from '../types/file'; import { FileId } from '../types/file';

View File

@ -52,6 +52,11 @@ const Merge = ({ onPreviewFile, onComplete, onError }: BaseToolProps) => {
onPreviewFile?.(null); onPreviewFile?.(null);
}; };
const handleUndo = async () => {
await mergeOperation.undoOperation();
onPreviewFile?.(null);
};
// TODO: Move to more general place so other tools can use it // TODO: Move to more general place so other tools can use it
const sortFiles = useCallback((sortType: 'filename' | 'dateModified', ascending: boolean = true) => { const sortFiles = useCallback((sortType: 'filename' | 'dateModified', ascending: boolean = true) => {
// Sort the FileIds based on their corresponding File properties // Sort the FileIds based on their corresponding File properties
@ -102,6 +107,18 @@ const Merge = ({ onPreviewFile, onComplete, onError }: BaseToolProps) => {
title: "Settings", title: "Settings",
isCollapsed: settingsCollapsed, isCollapsed: settingsCollapsed,
onCollapsedClick: settingsCollapsed ? handleSettingsReset : undefined, 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: ( content: (
<MergeSettings <MergeSettings
parameters={mergeParams.parameters} parameters={mergeParams.parameters}
@ -123,6 +140,7 @@ const Merge = ({ onPreviewFile, onComplete, onError }: BaseToolProps) => {
operation: mergeOperation, operation: mergeOperation,
title: t("merge.title", "Merge Results"), title: t("merge.title", "Merge Results"),
onFileClick: handleThumbnailClick, onFileClick: handleThumbnailClick,
onUndo: handleUndo,
}, },
}); });
}; };