From a6b210eca82daba8a56d13d3fb3e66185cb64775 Mon Sep 17 00:00:00 2001 From: Connor Yoh Date: Mon, 15 Sep 2025 17:30:06 +0100 Subject: [PATCH] Auto split --- .../public/locales/en-GB/translation.json | 3 ++- .../components/tools/split/SplitSettings.tsx | 26 ++++++++++++++++++- .../src/components/tooltips/useSplitTips.ts | 11 ++++++++ frontend/src/constants/splitConstants.ts | 6 +++-- .../hooks/tools/split/useSplitOperation.ts | 5 ++++ .../hooks/tools/split/useSplitParameters.ts | 4 +++ 6 files changed, 51 insertions(+), 4 deletions(-) diff --git a/frontend/public/locales/en-GB/translation.json b/frontend/public/locales/en-GB/translation.json index b7875c314..5ce84331e 100644 --- a/frontend/public/locales/en-GB/translation.json +++ b/frontend/public/locales/en-GB/translation.json @@ -697,7 +697,8 @@ "bySize": "Split by File Size", "byPageCount": "Split by Page Count", "byDocCount": "Split by Document Count", - "byChapters": "Split by Chapters" + "byChapters": "Split by Chapters", + "byPageDivider": "Split by Page Divider" }, "value": { "fileSize": { diff --git a/frontend/src/components/tools/split/SplitSettings.tsx b/frontend/src/components/tools/split/SplitSettings.tsx index 98a612c41..3df1eabd4 100644 --- a/frontend/src/components/tools/split/SplitSettings.tsx +++ b/frontend/src/components/tools/split/SplitSettings.tsx @@ -1,4 +1,5 @@ -import { Stack, TextInput, Select, Checkbox } from '@mantine/core'; +import { Stack, TextInput, Select, Checkbox, Anchor } from '@mantine/core'; +import LocalIcon from '../../shared/LocalIcon'; import { useTranslation } from 'react-i18next'; import { isSplitMethod, SPLIT_METHODS } from '../../../constants/splitConstants'; import { SplitParameters } from '../../../hooks/tools/split/useSplitParameters'; @@ -113,6 +114,27 @@ const SplitSettings = ({ ); + const renderByPageDividerForm = () => ( + + + + {t("autoSplitPDF.dividerDownload2", "Download 'Auto Splitter Divider (with instructions).pdf'")} + + + onParameterChange('duplexMode', e.currentTarget.checked)} + disabled={disabled} + /> + + ); + return ( {/* Method Selector */} @@ -129,6 +151,7 @@ const SplitSettings = ({ { value: SPLIT_METHODS.BY_PAGE_COUNT, label: t("split.methods.byPageCount", "Split by Page Count") }, { value: SPLIT_METHODS.BY_DOC_COUNT, label: t("split.methods.byDocCount", "Split by Document Count") }, { value: SPLIT_METHODS.BY_CHAPTERS, label: t("split.methods.byChapters", "Split by Chapters") }, + { value: SPLIT_METHODS.BY_PAGE_DIVIDER, label: t("split.methods.byPageDivider", "Split by Page Divider") }, ]} /> @@ -139,6 +162,7 @@ const SplitSettings = ({ parameters.method === SPLIT_METHODS.BY_PAGE_COUNT || parameters.method === SPLIT_METHODS.BY_DOC_COUNT) && renderSplitValueForm()} {parameters.method === SPLIT_METHODS.BY_CHAPTERS && renderByChaptersForm()} + {parameters.method === SPLIT_METHODS.BY_PAGE_DIVIDER && renderByPageDividerForm()} ); } diff --git a/frontend/src/components/tooltips/useSplitTips.ts b/frontend/src/components/tooltips/useSplitTips.ts index ff655aabe..9389c3bc3 100644 --- a/frontend/src/components/tooltips/useSplitTips.ts +++ b/frontend/src/components/tooltips/useSplitTips.ts @@ -53,6 +53,17 @@ export const useSplitTips = (): TooltipContent => { t("split.tooltip.byChapters.bullet2", "Include Metadata: Preserve document properties"), t("split.tooltip.byChapters.bullet3", "Allow Duplicates: Handle repeated bookmark names") ] + }, + { + title: t("split.tooltip.byPageDivider.title", "Split by Page Divider"), + description: t("split.tooltip.byPageDivider.text", "Automatically split scanned documents using physical divider sheets with QR codes. Perfect for processing multiple documents scanned together."), + bullets: [ + t("split.tooltip.byPageDivider.bullet1", "Print divider sheets from the download link"), + t("split.tooltip.byPageDivider.bullet2", "Insert divider sheets between your documents"), + t("split.tooltip.byPageDivider.bullet3", "Scan all documents together as one PDF"), + t("split.tooltip.byPageDivider.bullet4", "Upload - divider pages are automatically detected and removed"), + t("split.tooltip.byPageDivider.bullet5", "Enable Duplex Mode if scanning both sides of divider sheets") + ] } ] }; diff --git a/frontend/src/constants/splitConstants.ts b/frontend/src/constants/splitConstants.ts index 896e4bc44..31f09794e 100644 --- a/frontend/src/constants/splitConstants.ts +++ b/frontend/src/constants/splitConstants.ts @@ -4,7 +4,8 @@ export const SPLIT_METHODS = { BY_SIZE: 'bySize', BY_PAGE_COUNT: 'byPageCount', BY_DOC_COUNT: 'byDocCount', - BY_CHAPTERS: 'byChapters' + BY_CHAPTERS: 'byChapters', + BY_PAGE_DIVIDER: 'byPageDivider' } as const; @@ -14,7 +15,8 @@ export const ENDPOINTS = { [SPLIT_METHODS.BY_SIZE]: 'split-by-size-or-count', [SPLIT_METHODS.BY_PAGE_COUNT]: 'split-by-size-or-count', [SPLIT_METHODS.BY_DOC_COUNT]: 'split-by-size-or-count', - [SPLIT_METHODS.BY_CHAPTERS]: 'split-pdf-by-chapters' + [SPLIT_METHODS.BY_CHAPTERS]: 'split-pdf-by-chapters', + [SPLIT_METHODS.BY_PAGE_DIVIDER]: 'auto-split-pdf' } as const; export type SplitMethod = typeof SPLIT_METHODS[keyof typeof SPLIT_METHODS]; diff --git a/frontend/src/hooks/tools/split/useSplitOperation.ts b/frontend/src/hooks/tools/split/useSplitOperation.ts index b7ad93af0..938a600d9 100644 --- a/frontend/src/hooks/tools/split/useSplitOperation.ts +++ b/frontend/src/hooks/tools/split/useSplitOperation.ts @@ -38,6 +38,9 @@ export const buildSplitFormData = (parameters: SplitParameters, file: File): For formData.append("includeMetadata", parameters.includeMetadata.toString()); formData.append("allowDuplicates", parameters.allowDuplicates.toString()); break; + case SPLIT_METHODS.BY_PAGE_DIVIDER: + formData.append("duplexMode", parameters.duplexMode.toString()); + break; default: throw new Error(`Unknown split method: ${parameters.method}`); } @@ -57,6 +60,8 @@ export const getSplitEndpoint = (parameters: SplitParameters): string => { return "/api/v1/general/split-by-size-or-count"; case SPLIT_METHODS.BY_CHAPTERS: return "/api/v1/general/split-pdf-by-chapters"; + case SPLIT_METHODS.BY_PAGE_DIVIDER: + return "/api/v1/misc/auto-split-pdf"; default: throw new Error(`Unknown split method: ${parameters.method}`); } diff --git a/frontend/src/hooks/tools/split/useSplitParameters.ts b/frontend/src/hooks/tools/split/useSplitParameters.ts index 09b1ff1c9..8d77604e5 100644 --- a/frontend/src/hooks/tools/split/useSplitParameters.ts +++ b/frontend/src/hooks/tools/split/useSplitParameters.ts @@ -12,6 +12,7 @@ export interface SplitParameters extends BaseParameters { bookmarkLevel: string; includeMetadata: boolean; allowDuplicates: boolean; + duplexMode: boolean; } export type SplitParametersHook = BaseParametersHook; @@ -26,6 +27,7 @@ export const defaultParameters: SplitParameters = { bookmarkLevel: '1', includeMetadata: false, allowDuplicates: false, + duplexMode: false, }; export const useSplitParameters = (): SplitParametersHook => { @@ -49,6 +51,8 @@ export const useSplitParameters = (): SplitParametersHook => { return params.splitValue.trim() !== ""; case SPLIT_METHODS.BY_CHAPTERS: return params.bookmarkLevel !== ""; + case SPLIT_METHODS.BY_PAGE_DIVIDER: + return true; // No required parameters default: return false; }