feat: add browser implementations for advanced tools

This commit is contained in:
ConnorYoh
2025-10-24 14:08:47 +01:00
parent c9eee00d66
commit 81e43b7eb9
83 changed files with 2590 additions and 197 deletions

View File

@@ -2,7 +2,7 @@
* AddPageNumbersPositionSettings - Position & Pages step
*/
import { Stack, TextInput, NumberInput, Divider, Text } from "@mantine/core";
import { Stack, TextInput, NumberInput, Divider, Text, SegmentedControl } from "@mantine/core";
import { useTranslation } from "react-i18next";
import { AddPageNumbersParameters } from "./useAddPageNumbersParameters";
import { Tooltip } from "../../shared/Tooltip";
@@ -27,6 +27,27 @@ const AddPageNumbersPositionSettings = ({
return (
<Stack gap="lg">
<Stack gap="xs">
<Text size="sm" fw={500}>
{t('addPageNumbers.processingMode.label', 'Processing mode')}
</Text>
<SegmentedControl
value={parameters.processingMode}
onChange={(value) => onParameterChange('processingMode', value as AddPageNumbersParameters['processingMode'])}
data={[
{ label: t('addPageNumbers.processingMode.backend', 'Backend'), value: 'backend' },
{ label: t('addPageNumbers.processingMode.frontend', 'Browser'), value: 'frontend' }
]}
fullWidth
disabled={disabled}
/>
<Text size="xs" c="dimmed">
{parameters.processingMode === 'frontend'
? t('addPageNumbers.processingMode.frontendDescription', 'Stamp page numbers locally (page lists only).')
: t('addPageNumbers.processingMode.backendDescription', 'Use the server for formula-based selection and heavy PDFs.')}
</Text>
</Stack>
{/* Position Selection */}
<Stack gap="md">
<PageNumberPreview

View File

@@ -1,7 +1,9 @@
import { useTranslation } from 'react-i18next';
import { ToolType, useToolOperation } from '../../../hooks/tools/shared/useToolOperation';
import { ToolType, useToolOperation, ToolOperationConfig } from '../../../hooks/tools/shared/useToolOperation';
import { createStandardErrorHandler } from '../../../utils/toolErrorHandler';
import { AddPageNumbersParameters, defaultParameters } from './useAddPageNumbersParameters';
import { addPageNumbersClientSide } from '../../../utils/pdfOperations/addPageNumbers';
import { validatePageNumbers } from '../../../utils/pageSelection';
export const buildAddPageNumbersFormData = (parameters: AddPageNumbersParameters, file: File): FormData => {
const formData = new FormData();
@@ -23,7 +25,18 @@ export const addPageNumbersOperationConfig = {
operationType: 'addPageNumbers',
endpoint: '/api/v1/misc/add-page-numbers',
defaultParameters,
} as const;
frontendProcessing: {
process: addPageNumbersClientSide,
shouldUseFrontend: (params) => {
if (params.processingMode !== 'frontend') return false;
const selection = params.pagesToNumber?.trim();
if (!selection) return true;
if (selection.toLowerCase().includes('n')) return false;
return validatePageNumbers(selection);
},
statusMessage: 'Adding page numbers in browser...'
}
} as const satisfies ToolOperationConfig<AddPageNumbersParameters>;
export const useAddPageNumbersOperation = () => {
const { t } = useTranslation();

View File

@@ -1,7 +1,7 @@
import { BaseParameters } from '../../../types/parameters';
import { BaseParameters, ToggleableProcessingParameters } from '../../../types/parameters';
import { useBaseParameters, type BaseParametersHook } from '../../../hooks/tools/shared/useBaseParameters';
export interface AddPageNumbersParameters extends BaseParameters {
export interface AddPageNumbersParameters extends BaseParameters, ToggleableProcessingParameters {
customMargin: 'small' | 'medium' | 'large' | 'x-large';
position: 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9;
fontSize: number;
@@ -19,6 +19,7 @@ export const defaultParameters: AddPageNumbersParameters = {
startingNumber: 1,
pagesToNumber: '',
customText: '',
processingMode: 'backend',
};
export type AddPageNumbersParametersHook = BaseParametersHook<AddPageNumbersParameters>;
@@ -26,7 +27,7 @@ export type AddPageNumbersParametersHook = BaseParametersHook<AddPageNumbersPara
export const useAddPageNumbersParameters = (): AddPageNumbersParametersHook => {
return useBaseParameters<AddPageNumbersParameters>({
defaultParameters,
endpointName: 'add-page-numbers',
endpointName: (params) => (params.processingMode === 'frontend' ? '' : 'add-page-numbers'),
validateFn: (params): boolean => {
return params.fontSize > 0 && params.startingNumber > 0;
},