V2 Flatten split options to remove layers of drop downs (#4439)

Co-authored-by: Connor Yoh <connor@stirlingpdf.com>
This commit is contained in:
ConnorYoh
2025-09-15 17:11:29 +01:00
committed by GitHub
parent 7dad484aa7
commit a57373b968
8 changed files with 229 additions and 83 deletions

View File

@@ -1,6 +1,6 @@
import { Stack, TextInput, Select, Checkbox } from '@mantine/core';
import { useTranslation } from 'react-i18next';
import { isSplitMode, isSplitType, SPLIT_MODES, SPLIT_TYPES } from '../../../constants/splitConstants';
import { isSplitMethod, SPLIT_METHODS } from '../../../constants/splitConstants';
import { SplitParameters } from '../../../hooks/tools/split/useSplitParameters';
export interface SplitSettingsProps {
@@ -57,28 +57,37 @@ const SplitSettings = ({
</Stack>
);
const renderBySizeOrCountForm = () => (
<Stack gap="sm">
<Select
label={t("split-by-size-or-count.type.label", "Split Type")}
value={parameters.splitType}
onChange={(v) => isSplitType(v) && onParameterChange('splitType', v)}
disabled={disabled}
data={[
{ value: SPLIT_TYPES.SIZE, label: t("split-by-size-or-count.type.size", "By Size") },
{ value: SPLIT_TYPES.PAGES, label: t("split-by-size-or-count.type.pageCount", "By Page Count") },
{ value: SPLIT_TYPES.DOCS, label: t("split-by-size-or-count.type.docCount", "By Document Count") },
]}
/>
const renderSplitValueForm = () => {
let label, placeholder;
switch (parameters.method) {
case SPLIT_METHODS.BY_SIZE:
label = t("split.value.fileSize.label", "File Size");
placeholder = t("split.value.fileSize.placeholder", "e.g. 10MB, 500KB");
break;
case SPLIT_METHODS.BY_PAGE_COUNT:
label = t("split.value.pageCount.label", "Pages per File");
placeholder = t("split.value.pageCount.placeholder", "e.g. 5, 10");
break;
case SPLIT_METHODS.BY_DOC_COUNT:
label = t("split.value.docCount.label", "Number of Files");
placeholder = t("split.value.docCount.placeholder", "e.g. 3, 5");
break;
default:
label = t("split-by-size-or-count.value.label", "Split Value");
placeholder = t("split-by-size-or-count.value.placeholder", "e.g. 10MB or 5 pages");
}
return (
<TextInput
label={t("split-by-size-or-count.value.label", "Split Value")}
placeholder={t("split-by-size-or-count.value.placeholder", "e.g. 10MB or 5 pages")}
label={label}
placeholder={placeholder}
value={parameters.splitValue}
onChange={(e) => onParameterChange('splitValue', e.target.value)}
disabled={disabled}
/>
</Stack>
);
);
};
const renderByChaptersForm = () => (
<Stack gap="sm">
@@ -106,26 +115,30 @@ const SplitSettings = ({
return (
<Stack gap="md">
{/* Mode Selector */}
{/* Method Selector */}
<Select
label="Choose split method"
placeholder="Select how to split the PDF"
value={parameters.mode}
onChange={(v) => isSplitMode(v) && onParameterChange('mode', v)}
label={t("split.method.label", "Choose split method")}
placeholder={t("split.method.placeholder", "Select how to split the PDF")}
value={parameters.method}
onChange={(v) => isSplitMethod(v) && onParameterChange('method', v)}
disabled={disabled}
data={[
{ value: SPLIT_MODES.BY_PAGES, label: t("split.header", "Split by Pages") + " (e.g. 1,3,5-10)" },
{ value: SPLIT_MODES.BY_SECTIONS, label: t("split-by-sections.title", "Split by Grid Sections") },
{ value: SPLIT_MODES.BY_SIZE_OR_COUNT, label: t("split-by-size-or-count.title", "Split by Size or Count") },
{ value: SPLIT_MODES.BY_CHAPTERS, label: t("splitByChapters.title", "Split by Chapters") },
{ value: SPLIT_METHODS.BY_PAGES, label: t("split.methods.byPages", "Split at Pages Numbers") },
{ value: SPLIT_METHODS.BY_SECTIONS, label: t("split.methods.bySections", "Split by Sections") },
{ value: SPLIT_METHODS.BY_SIZE, label: t("split.methods.bySize", "Split by Size") },
{ 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") },
]}
/>
{/* Parameter Form */}
{parameters.mode === SPLIT_MODES.BY_PAGES && renderByPagesForm()}
{parameters.mode === SPLIT_MODES.BY_SECTIONS && renderBySectionsForm()}
{parameters.mode === SPLIT_MODES.BY_SIZE_OR_COUNT && renderBySizeOrCountForm()}
{parameters.mode === SPLIT_MODES.BY_CHAPTERS && renderByChaptersForm()}
{parameters.method === SPLIT_METHODS.BY_PAGES && renderByPagesForm()}
{parameters.method === SPLIT_METHODS.BY_SECTIONS && renderBySectionsForm()}
{(parameters.method === SPLIT_METHODS.BY_SIZE ||
parameters.method === SPLIT_METHODS.BY_PAGE_COUNT ||
parameters.method === SPLIT_METHODS.BY_DOC_COUNT) && renderSplitValueForm()}
{parameters.method === SPLIT_METHODS.BY_CHAPTERS && renderByChaptersForm()}
</Stack>
);
}

View File

@@ -0,0 +1,59 @@
import { useTranslation } from 'react-i18next';
import { TooltipContent } from '../../types/tips';
export const useSplitTips = (): TooltipContent => {
const { t } = useTranslation();
return {
header: {
title: t("split.tooltip.header.title", "Split Methods Overview")
},
tips: [
{
title: t("split.tooltip.byPages.title", "Split at Page Numbers"),
description: t("split.tooltip.byPages.text", "Extract specific pages or ranges from your PDF. Use commas to separate individual pages and hyphens for ranges."),
bullets: [
t("split.tooltip.byPages.bullet1", "Single pages: 1,3,5"),
t("split.tooltip.byPages.bullet2", "Page ranges: 1-5,10-15"),
t("split.tooltip.byPages.bullet3", "Mixed: 1,3-7,12,15-20")
]
},
{
title: t("split.tooltip.bySections.title", "Split by Grid Sections"),
description: t("split.tooltip.bySections.text", "Divide each page into a grid of sections. Useful for splitting documents with multiple columns or extracting specific areas."),
bullets: [
t("split.tooltip.bySections.bullet1", "Horizontal: Number of rows to create"),
t("split.tooltip.bySections.bullet2", "Vertical: Number of columns to create"),
t("split.tooltip.bySections.bullet3", "Merge: Combine all sections into one PDF")
]
},
{
title: t("split.tooltip.bySize.title", "Split by File Size"),
description: t("split.tooltip.bySize.text", "Create multiple PDFs that don't exceed a specified file size. Ideal for file size limitations or email attachments."),
bullets: [
t("split.tooltip.bySize.bullet1", "Use MB for larger files (e.g., 10MB)"),
t("split.tooltip.bySize.bullet2", "Use KB for smaller files (e.g., 500KB)"),
t("split.tooltip.bySize.bullet3", "System will split at page boundaries")
]
},
{
title: t("split.tooltip.byCount.title", "Split by Count"),
description: t("split.tooltip.byCount.text", "Create multiple PDFs with a specific number of pages or documents each."),
bullets: [
t("split.tooltip.byCount.bullet1", "Page Count: Fixed number of pages per file"),
t("split.tooltip.byCount.bullet2", "Document Count: Fixed number of output files"),
t("split.tooltip.byCount.bullet3", "Useful for batch processing workflows")
]
},
{
title: t("split.tooltip.byChapters.title", "Split by Chapters"),
description: t("split.tooltip.byChapters.text", "Use PDF bookmarks to automatically split at chapter boundaries. Requires PDFs with bookmark structure."),
bullets: [
t("split.tooltip.byChapters.bullet1", "Bookmark Level: Which level to split on (1=top level)"),
t("split.tooltip.byChapters.bullet2", "Include Metadata: Preserve document properties"),
t("split.tooltip.byChapters.bullet3", "Allow Duplicates: Handle repeated bookmark names")
]
}
]
};
};