From 2122b1a32393506f5e336df28c12164edf58698c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bal=C3=A1zs=20Sz=C3=BCcs?= Date: Thu, 6 Nov 2025 09:34:49 +0100 Subject: [PATCH 1/9] feat(convert): add support for CBR to PDF and PDF to CBR conversions MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Introduced `ConvertFromCbrSettings` and `ConvertToCbrSettings` components for handling conversion-specific settings. - Updated `ConvertSettings` to include CBR-related configurations. - Enhanced `useConvertParameters` with new parameters: `cbrOptions` and `pdfToCbrOptions`. - Updated locales with CBR-related translations. - Added endpoints and updated conversion matrix for CBR formats in `convertConstants`. - Modified `useConvertOperation` to handle CBR-specific parameters during form data preparation. Signed-off-by: Balázs Szücs --- .../public/locales/en-GB/translation.json | 6 ++- .../public/locales/en-US/translation.json | 4 ++ .../tools/convert/ConvertFromCbrSettings.tsx | 36 +++++++++++++++++ .../tools/convert/ConvertSettings.tsx | 38 ++++++++++++++++++ .../tools/convert/ConvertToCbrSettings.tsx | 39 +++++++++++++++++++ .../src/core/constants/convertConstants.ts | 21 +++++++--- .../tools/convert/useConvertOperation.ts | 8 +++- .../tools/convert/useConvertParameters.ts | 12 ++++++ 8 files changed, 156 insertions(+), 8 deletions(-) create mode 100644 frontend/src/core/components/tools/convert/ConvertFromCbrSettings.tsx create mode 100644 frontend/src/core/components/tools/convert/ConvertToCbrSettings.tsx diff --git a/frontend/public/locales/en-GB/translation.json b/frontend/public/locales/en-GB/translation.json index 669c9f505..f2cf03a39 100644 --- a/frontend/public/locales/en-GB/translation.json +++ b/frontend/public/locales/en-GB/translation.json @@ -1079,7 +1079,11 @@ "markdown": "Markdown", "textRtf": "Text/RTF", "grayscale": "Greyscale", - "errorConversion": "An error occurred while converting the file." + "errorConversion": "An error occurred while converting the file.", + "cbrOptions": "CBR to PDF Options", + "optimizeForEbook": "Optimize PDF for ebook readers (uses Ghostscript)", + "cbrOutputOptions": "PDF to CBR Options", + "cbrDpi": "DPI for image rendering" }, "imageToPdf": { "tags": "conversion,img,jpg,picture,photo" diff --git a/frontend/public/locales/en-US/translation.json b/frontend/public/locales/en-US/translation.json index c92c4c56e..70b5379f1 100644 --- a/frontend/public/locales/en-US/translation.json +++ b/frontend/public/locales/en-US/translation.json @@ -2021,6 +2021,10 @@ "outputFormat": "Output Format", "pdfaNote": "PDF/A-1b is more compatible, PDF/A-2b supports more features.", "pdfaDigitalSignatureWarning": "The PDF contains a digital signature. This will be removed in the next step.", + "cbrOptions": "CBR to PDF Options", + "optimizeForEbook": "Optimize PDF for ebook readers (uses Ghostscript)", + "cbrOutputOptions": "PDF to CBR Options", + "cbrDpi": "DPI for image rendering", "sanitize": { "submit": "Sanitize PDF", "completed": "Sanitization completed successfully", diff --git a/frontend/src/core/components/tools/convert/ConvertFromCbrSettings.tsx b/frontend/src/core/components/tools/convert/ConvertFromCbrSettings.tsx new file mode 100644 index 000000000..c5faa8c8a --- /dev/null +++ b/frontend/src/core/components/tools/convert/ConvertFromCbrSettings.tsx @@ -0,0 +1,36 @@ +import {Checkbox, Stack, Text } from "@mantine/core"; +import { useTranslation } from "react-i18next"; +import { ConvertParameters } from "@app/hooks/tools/convert/useConvertParameters"; + +interface ConvertFromCbrSettingsProps { + parameters: ConvertParameters; + onParameterChange: (key: K, value: ConvertParameters[K]) => void; + disabled?: boolean; +} + +const ConvertFromCbrSettings = ({ + parameters, + onParameterChange, + disabled = false +}: ConvertFromCbrSettingsProps) => { + const { t } = useTranslation(); + + return ( + + {t("convert.cbrOptions", "CBR Options")}: + + onParameterChange('cbrOptions', { + ...parameters.cbrOptions, + optimizeForEbook: event.currentTarget.checked + })} + disabled={disabled} + data-testid="optimize-ebook-checkbox" + /> + + ); +}; + +export default ConvertFromCbrSettings; diff --git a/frontend/src/core/components/tools/convert/ConvertSettings.tsx b/frontend/src/core/components/tools/convert/ConvertSettings.tsx index d332f888e..25ef868c8 100644 --- a/frontend/src/core/components/tools/convert/ConvertSettings.tsx +++ b/frontend/src/core/components/tools/convert/ConvertSettings.tsx @@ -14,6 +14,8 @@ import ConvertFromImageSettings from "@app/components/tools/convert/ConvertFromI import ConvertFromWebSettings from "@app/components/tools/convert/ConvertFromWebSettings"; import ConvertFromEmailSettings from "@app/components/tools/convert/ConvertFromEmailSettings"; import ConvertToPdfaSettings from "@app/components/tools/convert/ConvertToPdfaSettings"; +import ConvertFromCbrSettings from "@app/components/tools/convert/ConvertFromCbrSettings"; +import ConvertToCbrSettings from "@app/components/tools/convert/ConvertToCbrSettings"; import { ConvertParameters } from "@app/hooks/tools/convert/useConvertParameters"; import { FROM_FORMAT_OPTIONS, @@ -118,6 +120,12 @@ const ConvertSettings = ({ onParameterChange('pdfaOptions', { outputFormat: 'pdfa-1', }); + onParameterChange('cbrOptions', { + optimizeForEbook: false, + }); + onParameterChange('pdfToCbrOptions', { + dpi: 150, + }); onParameterChange('isSmartDetection', false); onParameterChange('smartDetectionType', 'none'); }; @@ -180,6 +188,12 @@ const ConvertSettings = ({ onParameterChange('pdfaOptions', { outputFormat: 'pdfa-1', }); + onParameterChange('cbrOptions', { + optimizeForEbook: false, + }); + onParameterChange('pdfToCbrOptions', { + dpi: 150, + }); }; @@ -306,6 +320,30 @@ const ConvertSettings = ({ )} + {/* CBR to PDF options */} + {parameters.fromExtension === 'cbr' && parameters.toExtension === 'pdf' && ( + <> + + + + )} + + {/* PDF to CBR options */} + {parameters.fromExtension === 'pdf' && parameters.toExtension === 'cbr' && ( + <> + + + + )} + ); }; diff --git a/frontend/src/core/components/tools/convert/ConvertToCbrSettings.tsx b/frontend/src/core/components/tools/convert/ConvertToCbrSettings.tsx new file mode 100644 index 000000000..df7a41a3f --- /dev/null +++ b/frontend/src/core/components/tools/convert/ConvertToCbrSettings.tsx @@ -0,0 +1,39 @@ +import { Stack, Text, NumberInput } from "@mantine/core"; +import { useTranslation } from "react-i18next"; +import { ConvertParameters } from "@app/hooks/tools/convert/useConvertParameters"; + +interface ConvertToCbrSettingsProps { + parameters: ConvertParameters; + onParameterChange: (key: K, value: ConvertParameters[K]) => void; + disabled?: boolean; +} + +const ConvertToCbrSettings = ({ + parameters, + onParameterChange, + disabled = false +}: ConvertToCbrSettingsProps) => { + const { t } = useTranslation(); + + return ( + + {t("convert.cbrOutputOptions", "PDF to CBR Options")}: + + onParameterChange('pdfToCbrOptions', { + ...parameters.pdfToCbrOptions, + dpi: typeof value === 'number' ? value : 150 + })} + min={72} + max={600} + step={50} + disabled={disabled} + /> + + ); +}; + +export default ConvertToCbrSettings; diff --git a/frontend/src/core/constants/convertConstants.ts b/frontend/src/core/constants/convertConstants.ts index 5978d523b..a2e3bd698 100644 --- a/frontend/src/core/constants/convertConstants.ts +++ b/frontend/src/core/constants/convertConstants.ts @@ -31,7 +31,9 @@ export const CONVERSION_ENDPOINTS = { 'pdf-pdfa': '/api/v1/convert/pdf/pdfa', 'html-pdf': '/api/v1/convert/html/pdf', 'markdown-pdf': '/api/v1/convert/markdown/pdf', - 'eml-pdf': '/api/v1/convert/eml/pdf' + 'eml-pdf': '/api/v1/convert/eml/pdf', + 'cbr-pdf': '/api/v1/convert/cbr/pdf', + 'pdf-cbr': '/api/v1/convert/pdf/cbr' } as const; export const ENDPOINT_NAMES = { @@ -48,7 +50,9 @@ export const ENDPOINT_NAMES = { 'pdf-pdfa': 'pdf-to-pdfa', 'html-pdf': 'html-to-pdf', 'markdown-pdf': 'markdown-to-pdf', - 'eml-pdf': 'eml-to-pdf' + 'eml-pdf': 'eml-to-pdf', + 'cbr-pdf': 'cbr-to-pdf', + 'pdf-cbr': 'pdf-to-cbr' } as const; @@ -80,6 +84,7 @@ export const FROM_FORMAT_OPTIONS = [ { value: 'txt', label: 'TXT', group: 'Text' }, { value: 'rtf', label: 'RTF', group: 'Text' }, { value: 'eml', label: 'EML', group: 'Email' }, + { value: 'cbr', label: 'CBR', group: 'Archive' }, ]; export const TO_FORMAT_OPTIONS = [ @@ -101,13 +106,14 @@ export const TO_FORMAT_OPTIONS = [ { value: 'webp', label: 'WEBP', group: 'Image' }, { value: 'html', label: 'HTML', group: 'Web' }, { value: 'xml', label: 'XML', group: 'Web' }, + { value: 'cbr', label: 'CBR', group: 'Archive' }, ]; // Conversion matrix - what each source format can convert to export const CONVERSION_MATRIX: Record = { 'any': ['pdf'], // Mixed files always convert to PDF 'image': ['pdf'], // Multiple images always convert to PDF - 'pdf': ['png', 'jpg', 'gif', 'tiff', 'bmp', 'webp', 'docx', 'odt', 'pptx', 'odp', 'csv', 'txt', 'rtf', 'md', 'html', 'xml', 'pdfa'], + 'pdf': ['png', 'jpg', 'gif', 'tiff', 'bmp', 'webp', 'docx', 'odt', 'pptx', 'odp', 'csv', 'txt', 'rtf', 'md', 'html', 'xml', 'pdfa', 'cbr'], 'docx': ['pdf'], 'doc': ['pdf'], 'odt': ['pdf'], 'xlsx': ['pdf'], 'xls': ['pdf'], 'ods': ['pdf'], 'pptx': ['pdf'], 'ppt': ['pdf'], 'odp': ['pdf'], @@ -116,7 +122,8 @@ export const CONVERSION_MATRIX: Record = { 'zip': ['pdf'], 'md': ['pdf'], 'txt': ['pdf'], 'rtf': ['pdf'], - 'eml': ['pdf'] + 'eml': ['pdf'], + 'cbr': ['pdf'] }; // Map extensions to endpoint keys @@ -130,7 +137,8 @@ export const EXTENSION_TO_ENDPOINT: Record> = { 'csv': 'pdf-to-csv', 'txt': 'pdf-to-text', 'rtf': 'pdf-to-text', 'md': 'pdf-to-markdown', 'html': 'pdf-to-html', 'xml': 'pdf-to-xml', - 'pdfa': 'pdf-to-pdfa' + 'pdfa': 'pdf-to-pdfa', + 'cbr': 'pdf-to-cbr' }, 'docx': { 'pdf': 'file-to-pdf' }, 'doc': { 'pdf': 'file-to-pdf' }, 'odt': { 'pdf': 'file-to-pdf' }, 'xlsx': { 'pdf': 'file-to-pdf' }, 'xls': { 'pdf': 'file-to-pdf' }, 'ods': { 'pdf': 'file-to-pdf' }, @@ -141,7 +149,8 @@ export const EXTENSION_TO_ENDPOINT: Record> = { 'zip': { 'pdf': 'html-to-pdf' }, 'md': { 'pdf': 'markdown-to-pdf' }, 'txt': { 'pdf': 'file-to-pdf' }, 'rtf': { 'pdf': 'file-to-pdf' }, - 'eml': { 'pdf': 'eml-to-pdf' } + 'eml': { 'pdf': 'eml-to-pdf' }, + 'cbr': { 'pdf': 'cbr-to-pdf' } }; export type ColorType = typeof COLOR_TYPES[keyof typeof COLOR_TYPES]; diff --git a/frontend/src/core/hooks/tools/convert/useConvertOperation.ts b/frontend/src/core/hooks/tools/convert/useConvertOperation.ts index 28080407d..baa4c10e8 100644 --- a/frontend/src/core/hooks/tools/convert/useConvertOperation.ts +++ b/frontend/src/core/hooks/tools/convert/useConvertOperation.ts @@ -21,6 +21,8 @@ export const shouldProcessFilesSeparately = ( (parameters.fromExtension === 'pdf' && parameters.toExtension === 'pdfa') || // PDF to text-like formats should be one output per input (parameters.fromExtension === 'pdf' && ['txt', 'rtf', 'csv'].includes(parameters.toExtension)) || + // PDF to CBR conversions (each PDF should generate its own archive) + (parameters.fromExtension === 'pdf' && parameters.toExtension === 'cbr') || // Web files to PDF conversions (each web file should generate its own PDF) ((isWebFormat(parameters.fromExtension) || parameters.fromExtension === 'web') && parameters.toExtension === 'pdf') || @@ -39,7 +41,7 @@ export const buildConvertFormData = (parameters: ConvertParameters, selectedFile formData.append("fileInput", file); }); - const { fromExtension, toExtension, imageOptions, htmlOptions, emailOptions, pdfaOptions } = parameters; + const { fromExtension, toExtension, imageOptions, htmlOptions, emailOptions, pdfaOptions, cbrOptions, pdfToCbrOptions } = parameters; if (isImageFormat(toExtension)) { formData.append("imageFormat", toExtension); @@ -67,6 +69,10 @@ export const buildConvertFormData = (parameters: ConvertParameters, selectedFile formData.append("outputFormat", pdfaOptions.outputFormat); } else if (fromExtension === 'pdf' && toExtension === 'csv') { formData.append("pageNumbers", "all"); + } else if (fromExtension === 'cbr' && toExtension === 'pdf') { + formData.append("optimizeForEbook", cbrOptions.optimizeForEbook.toString()); + } else if (fromExtension === 'pdf' && toExtension === 'cbr') { + formData.append("dpi", pdfToCbrOptions.dpi.toString()); } return formData; diff --git a/frontend/src/core/hooks/tools/convert/useConvertParameters.ts b/frontend/src/core/hooks/tools/convert/useConvertParameters.ts index c9c19176e..83ef1e524 100644 --- a/frontend/src/core/hooks/tools/convert/useConvertParameters.ts +++ b/frontend/src/core/hooks/tools/convert/useConvertParameters.ts @@ -36,6 +36,12 @@ export interface ConvertParameters extends BaseParameters { pdfaOptions: { outputFormat: string; }; + cbrOptions: { + optimizeForEbook: boolean; + }; + pdfToCbrOptions: { + dpi: number; + }; isSmartDetection: boolean; smartDetectionType: 'mixed' | 'images' | 'web' | 'none'; } @@ -69,6 +75,12 @@ export const defaultParameters: ConvertParameters = { pdfaOptions: { outputFormat: 'pdfa-1', }, + cbrOptions: { + optimizeForEbook: false, + }, + pdfToCbrOptions: { + dpi: 150, + }, isSmartDetection: false, smartDetectionType: 'none', }; From 9923ab31c8f185befee9eb24add16e14df7ab027 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bal=C3=A1zs=20Sz=C3=BCcs?= Date: Thu, 6 Nov 2025 10:27:51 +0100 Subject: [PATCH 2/9] feat(utils): add URL mapping for CBR conversions MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Added `/cbr-to-pdf` and `/pdf-to-cbr` to `urlMapping`. - Removed unused CBR-related translation keys from `en-US/translation.json`. Signed-off-by: Balázs Szücs --- frontend/public/locales/en-US/translation.json | 4 ---- frontend/src/core/utils/urlMapping.ts | 2 ++ 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/frontend/public/locales/en-US/translation.json b/frontend/public/locales/en-US/translation.json index 70b5379f1..c92c4c56e 100644 --- a/frontend/public/locales/en-US/translation.json +++ b/frontend/public/locales/en-US/translation.json @@ -2021,10 +2021,6 @@ "outputFormat": "Output Format", "pdfaNote": "PDF/A-1b is more compatible, PDF/A-2b supports more features.", "pdfaDigitalSignatureWarning": "The PDF contains a digital signature. This will be removed in the next step.", - "cbrOptions": "CBR to PDF Options", - "optimizeForEbook": "Optimize PDF for ebook readers (uses Ghostscript)", - "cbrOutputOptions": "PDF to CBR Options", - "cbrDpi": "DPI for image rendering", "sanitize": { "submit": "Sanitize PDF", "completed": "Sanitization completed successfully", diff --git a/frontend/src/core/utils/urlMapping.ts b/frontend/src/core/utils/urlMapping.ts index c76adf856..565064156 100644 --- a/frontend/src/core/utils/urlMapping.ts +++ b/frontend/src/core/utils/urlMapping.ts @@ -28,6 +28,8 @@ export const URL_TO_TOOL_MAP: Record = { '/pdf-to-pdfa': 'convert', '/pdf-to-word': 'convert', '/pdf-to-xml': 'convert', + '/cbr-to-pdf': 'convert', + '/pdf-to-cbr': 'convert', // Security tools '/add-password': 'addPassword', From db339bc6c3ffcc9cf6c3e2b96272cf9aeeba26f5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bal=C3=A1zs=20Sz=C3=BCcs?= Date: Thu, 6 Nov 2025 10:41:38 +0100 Subject: [PATCH 3/9] test(convert): extend integration tests with CBR conversion options MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Added `cbrOptions` to test configurations with `optimizeForEbook` set to `false`. - Added `pdfToCbrOptions` to test configurations with `dpi` set to `150`. Signed-off-by: Balázs Szücs --- .../tests/convert/ConvertIntegration.test.tsx | 72 +++++++++++++++++++ 1 file changed, 72 insertions(+) diff --git a/frontend/src/core/tests/convert/ConvertIntegration.test.tsx b/frontend/src/core/tests/convert/ConvertIntegration.test.tsx index 5d0d899d7..3ff8a04e4 100644 --- a/frontend/src/core/tests/convert/ConvertIntegration.test.tsx +++ b/frontend/src/core/tests/convert/ConvertIntegration.test.tsx @@ -148,6 +148,12 @@ describe('Convert Tool Integration Tests', () => { }, pdfaOptions: { outputFormat: '' + }, + cbrOptions: { + optimizeForEbook: false + }, + pdfToCbrOptions: { + dpi: 150 } }; @@ -215,6 +221,12 @@ describe('Convert Tool Integration Tests', () => { }, pdfaOptions: { outputFormat: '' + }, + cbrOptions: { + optimizeForEbook: false + }, + pdfToCbrOptions: { + dpi: 150 } }; @@ -260,6 +272,12 @@ describe('Convert Tool Integration Tests', () => { }, pdfaOptions: { outputFormat: '' + }, + cbrOptions: { + optimizeForEbook: false + }, + pdfToCbrOptions: { + dpi: 150 } }; @@ -314,6 +332,12 @@ describe('Convert Tool Integration Tests', () => { }, pdfaOptions: { outputFormat: '' + }, + cbrOptions: { + optimizeForEbook: false + }, + pdfToCbrOptions: { + dpi: 150 } }; @@ -372,6 +396,12 @@ describe('Convert Tool Integration Tests', () => { }, pdfaOptions: { outputFormat: '' + }, + cbrOptions: { + optimizeForEbook: false + }, + pdfToCbrOptions: { + dpi: 150 } }; @@ -428,6 +458,12 @@ describe('Convert Tool Integration Tests', () => { }, pdfaOptions: { outputFormat: '' + }, + cbrOptions: { + optimizeForEbook: false + }, + pdfToCbrOptions: { + dpi: 150 } }; @@ -480,6 +516,12 @@ describe('Convert Tool Integration Tests', () => { }, pdfaOptions: { outputFormat: '' + }, + cbrOptions: { + optimizeForEbook: false + }, + pdfToCbrOptions: { + dpi: 150 } }; @@ -529,6 +571,12 @@ describe('Convert Tool Integration Tests', () => { }, pdfaOptions: { outputFormat: '' + }, + cbrOptions: { + optimizeForEbook: false + }, + pdfToCbrOptions: { + dpi: 150 } }; @@ -580,6 +628,12 @@ describe('Convert Tool Integration Tests', () => { }, pdfaOptions: { outputFormat: '' + }, + cbrOptions: { + optimizeForEbook: false + }, + pdfToCbrOptions: { + dpi: 150 } }; @@ -628,6 +682,12 @@ describe('Convert Tool Integration Tests', () => { }, pdfaOptions: { outputFormat: '' + }, + cbrOptions: { + optimizeForEbook: false + }, + pdfToCbrOptions: { + dpi: 150 } }; @@ -682,6 +742,12 @@ describe('Convert Tool Integration Tests', () => { }, pdfaOptions: { outputFormat: '' + }, + cbrOptions: { + optimizeForEbook: false + }, + pdfToCbrOptions: { + dpi: 150 } }; @@ -735,6 +801,12 @@ describe('Convert Tool Integration Tests', () => { }, pdfaOptions: { outputFormat: '' + }, + cbrOptions: { + optimizeForEbook: false + }, + pdfToCbrOptions: { + dpi: 150 } }; From b6ac1326d434e0d135fcd3580cc554cef294c337 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bal=C3=A1zs=20Sz=C3=BCcs?= Date: Wed, 12 Nov 2025 12:35:21 +0100 Subject: [PATCH 4/9] feat(constants): add CBR format to supported conversions MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Added `cbr` to the list of supported archive formats in `convertSupportedFormats.ts`. Signed-off-by: Balázs Szücs --- frontend/src/core/constants/convertSupportedFornats.ts | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/frontend/src/core/constants/convertSupportedFornats.ts b/frontend/src/core/constants/convertSupportedFornats.ts index b9bea3227..dd41c7b13 100644 --- a/frontend/src/core/constants/convertSupportedFornats.ts +++ b/frontend/src/core/constants/convertSupportedFornats.ts @@ -13,9 +13,7 @@ export const CONVERT_SUPPORTED_FORMATS = [ // Email formats 'eml', // Archive formats - 'zip', + 'zip', 'cbr', // Other 'dbf', 'fods', 'vsd', 'vor', 'vor3', 'vor4', 'uop', 'pct', 'ps', 'pdf', ]; - - From 35d0014d10fd3906793e660db2a0a622ee0955e5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bal=C3=A1zs=20Sz=C3=BCcs?= Date: Wed, 12 Nov 2025 16:44:13 +0100 Subject: [PATCH 5/9] fix(i18n): correct duplicate key definitions in en-GB translations MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Fixed duplicate `errorConversion` key in `translation.json` - Aligned and reordered translation keys for clarity in CBR-related options - Removed redundant entry of `optimizeForEbook` within CBZ section Signed-off-by: Balázs Szücs --- frontend/public/locales/en-GB/translation.json | 10 ++++------ .../core/hooks/tools/convert/useConvertOperation.ts | 1 + 2 files changed, 5 insertions(+), 6 deletions(-) diff --git a/frontend/public/locales/en-GB/translation.json b/frontend/public/locales/en-GB/translation.json index 4b1874055..e2dd1f7ab 100644 --- a/frontend/public/locales/en-GB/translation.json +++ b/frontend/public/locales/en-GB/translation.json @@ -1105,14 +1105,12 @@ "markdown": "Markdown", "textRtf": "Text/RTF", "grayscale": "Greyscale", - "errorConversion": "An error occurred while converting the file.", - "cbrOptions": "CBR to PDF Options", - "optimizeForEbook": "Optimize PDF for ebook readers (uses Ghostscript)", - "cbrOutputOptions": "PDF to CBR Options", - "cbrDpi": "DPI for image rendering" "errorConversion": "An error occurred while converting the file.", - "cbzOptions": "CBZ to PDF Options", + "cbrOptions": "CBR to PDF Options", "optimizeForEbook": "Optimize PDF for ebook readers (uses Ghostscript)", + "cbrOutputOptions": "PDF to CBR Options", + "cbrDpi": "DPI for image rendering", + "cbzOptions": "CBZ to PDF Options", "cbzOutputOptions": "PDF to CBZ Options", "cbzDpi": "DPI for image rendering" }, diff --git a/frontend/src/core/hooks/tools/convert/useConvertOperation.ts b/frontend/src/core/hooks/tools/convert/useConvertOperation.ts index e71685288..ef4fceebd 100644 --- a/frontend/src/core/hooks/tools/convert/useConvertOperation.ts +++ b/frontend/src/core/hooks/tools/convert/useConvertOperation.ts @@ -36,6 +36,7 @@ export const shouldProcessFilesSeparately = ( // Static function that can be used by both the hook and automation executor export const buildConvertFormData = (parameters: ConvertParameters, selectedFiles: File[]): FormData => { const formData = new FormData(); + const { fromExtension, toExtension, imageOptions, htmlOptions, emailOptions, pdfaOptions, cbrOptions, pdfToCbrOptions, cbzOptions, cbzOutputOptions } = parameters; selectedFiles.forEach(file => { formData.append("fileInput", file); From 967d2bf55620c9720544149e098c3416afc9c248 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bal=C3=A1zs=20Sz=C3=BCcs?= Date: Wed, 12 Nov 2025 16:59:16 +0100 Subject: [PATCH 6/9] feat(convert): update CBR format settings and constants MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Changed `step` value in `ConvertToCbrSettings` component from 50 to 1 - Re-added `cbr` format to `convertConstants` lists and conversion matrix - Adjusted import order in `ConvertFromCbrSettings` Signed-off-by: Balázs Szücs --- .../components/tools/convert/ConvertFromCbrSettings.tsx | 2 +- .../core/components/tools/convert/ConvertToCbrSettings.tsx | 2 +- frontend/src/core/constants/convertConstants.ts | 6 +++--- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/frontend/src/core/components/tools/convert/ConvertFromCbrSettings.tsx b/frontend/src/core/components/tools/convert/ConvertFromCbrSettings.tsx index c5faa8c8a..f7e98dc30 100644 --- a/frontend/src/core/components/tools/convert/ConvertFromCbrSettings.tsx +++ b/frontend/src/core/components/tools/convert/ConvertFromCbrSettings.tsx @@ -1,4 +1,4 @@ -import {Checkbox, Stack, Text } from "@mantine/core"; +import { Stack, Text, Checkbox } from '@mantine/core'; import { useTranslation } from "react-i18next"; import { ConvertParameters } from "@app/hooks/tools/convert/useConvertParameters"; diff --git a/frontend/src/core/components/tools/convert/ConvertToCbrSettings.tsx b/frontend/src/core/components/tools/convert/ConvertToCbrSettings.tsx index df7a41a3f..36acca3b5 100644 --- a/frontend/src/core/components/tools/convert/ConvertToCbrSettings.tsx +++ b/frontend/src/core/components/tools/convert/ConvertToCbrSettings.tsx @@ -29,7 +29,7 @@ const ConvertToCbrSettings = ({ })} min={72} max={600} - step={50} + step={1} disabled={disabled} /> diff --git a/frontend/src/core/constants/convertConstants.ts b/frontend/src/core/constants/convertConstants.ts index 2bae77a13..73d00677f 100644 --- a/frontend/src/core/constants/convertConstants.ts +++ b/frontend/src/core/constants/convertConstants.ts @@ -66,6 +66,7 @@ export const FROM_FORMAT_OPTIONS = [ { value: 'image', label: 'Images', group: 'Multiple Files' }, { value: 'pdf', label: 'PDF', group: 'Document' }, { value: 'cbz', label: 'CBZ', group: 'Archive' }, + { value: 'cbr', label: 'CBR', group: 'Archive' }, { value: 'docx', label: 'DOCX', group: 'Document' }, { value: 'doc', label: 'DOC', group: 'Document' }, { value: 'odt', label: 'ODT', group: 'Document' }, @@ -89,7 +90,6 @@ export const FROM_FORMAT_OPTIONS = [ { value: 'txt', label: 'TXT', group: 'Text' }, { value: 'rtf', label: 'RTF', group: 'Text' }, { value: 'eml', label: 'EML', group: 'Email' }, - { value: 'cbr', label: 'CBR', group: 'Archive' }, ]; export const TO_FORMAT_OPTIONS = [ @@ -98,6 +98,7 @@ export const TO_FORMAT_OPTIONS = [ { value: 'docx', label: 'DOCX', group: 'Document' }, { value: 'odt', label: 'ODT', group: 'Document' }, { value: 'cbz', label: 'CBZ', group: 'Archive' }, + { value: 'cbr', label: 'CBR', group: 'Archive' }, { value: 'csv', label: 'CSV', group: 'Spreadsheet' }, { value: 'pptx', label: 'PPTX', group: 'Presentation' }, { value: 'odp', label: 'ODP', group: 'Presentation' }, @@ -112,14 +113,13 @@ export const TO_FORMAT_OPTIONS = [ { value: 'webp', label: 'WEBP', group: 'Image' }, { value: 'html', label: 'HTML', group: 'Web' }, { value: 'xml', label: 'XML', group: 'Web' }, - { value: 'cbr', label: 'CBR', group: 'Archive' }, ]; // Conversion matrix - what each source format can convert to export const CONVERSION_MATRIX: Record = { 'any': ['pdf'], // Mixed files always convert to PDF 'image': ['pdf'], // Multiple images always convert to PDF - 'pdf': ['png', 'jpg', 'gif', 'tiff', 'bmp', 'webp', 'docx', 'odt', 'pptx', 'odp', 'csv', 'txt', 'rtf', 'md', 'html', 'xml', 'pdfa', 'cbz'], + 'pdf': ['png', 'jpg', 'gif', 'tiff', 'bmp', 'webp', 'docx', 'odt', 'pptx', 'odp', 'csv', 'txt', 'rtf', 'md', 'html', 'xml', 'pdfa', 'cbz', 'cbr'], 'cbz': ['pdf'], 'docx': ['pdf'], 'doc': ['pdf'], 'odt': ['pdf'], 'xlsx': ['pdf'], 'xls': ['pdf'], 'ods': ['pdf'], From ef7f7755befea17143c4d44b4f8f6a821eb88de1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bal=C3=A1zs=20Sz=C3=BCcs?= Date: Wed, 12 Nov 2025 17:01:02 +0100 Subject: [PATCH 7/9] feat(convert): fine-tune CBR settings and formatting MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Increased `step` value in `ConvertToCbrSettings` from 1 to 50 - Fixed spacing for `zip`, `cbr`, and `cbz` entries in `convertSupportedFormats.ts` Signed-off-by: Balázs Szücs --- .../core/components/tools/convert/ConvertToCbrSettings.tsx | 4 ++-- frontend/src/core/constants/convertSupportedFornats.ts | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/frontend/src/core/components/tools/convert/ConvertToCbrSettings.tsx b/frontend/src/core/components/tools/convert/ConvertToCbrSettings.tsx index 36acca3b5..4008992ac 100644 --- a/frontend/src/core/components/tools/convert/ConvertToCbrSettings.tsx +++ b/frontend/src/core/components/tools/convert/ConvertToCbrSettings.tsx @@ -18,7 +18,7 @@ const ConvertToCbrSettings = ({ return ( {t("convert.cbrOutputOptions", "PDF to CBR Options")}: - + diff --git a/frontend/src/core/constants/convertSupportedFornats.ts b/frontend/src/core/constants/convertSupportedFornats.ts index 67e1a877c..f16fef369 100644 --- a/frontend/src/core/constants/convertSupportedFornats.ts +++ b/frontend/src/core/constants/convertSupportedFornats.ts @@ -13,7 +13,7 @@ export const CONVERT_SUPPORTED_FORMATS = [ // Email formats 'eml', // Archive formats - 'zip', 'cbr','cbz', + 'zip', 'cbr', 'cbz', // Other 'dbf', 'fods', 'vsd', 'vor', 'vor3', 'vor4', 'uop', 'pct', 'ps', 'pdf', ]; From af949d184dc26e2f7e9c3b033cb756563c067795 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bal=C3=A1zs=20Sz=C3=BCcs?= Date: Wed, 12 Nov 2025 17:24:44 +0100 Subject: [PATCH 8/9] feat(convert): update CBR settings and fix input handling MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Renamed `data-testid` in `ConvertToCbrSettings` to `cbr-output-settings` - Refined `onChange` handler in `ConvertToCbrSettings` to ensure valid numeric value - Standardized quote style in `ConvertFromCbrSettings` imports Signed-off-by: Balázs Szücs --- .../tools/convert/ConvertFromCbrSettings.tsx | 2 +- .../components/tools/convert/ConvertToCbrSettings.tsx | 10 +++++----- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/frontend/src/core/components/tools/convert/ConvertFromCbrSettings.tsx b/frontend/src/core/components/tools/convert/ConvertFromCbrSettings.tsx index f7e98dc30..736932232 100644 --- a/frontend/src/core/components/tools/convert/ConvertFromCbrSettings.tsx +++ b/frontend/src/core/components/tools/convert/ConvertFromCbrSettings.tsx @@ -1,5 +1,5 @@ import { Stack, Text, Checkbox } from '@mantine/core'; -import { useTranslation } from "react-i18next"; +import { useTranslation } from 'react-i18next'; import { ConvertParameters } from "@app/hooks/tools/convert/useConvertParameters"; interface ConvertFromCbrSettingsProps { diff --git a/frontend/src/core/components/tools/convert/ConvertToCbrSettings.tsx b/frontend/src/core/components/tools/convert/ConvertToCbrSettings.tsx index 4008992ac..db85eda77 100644 --- a/frontend/src/core/components/tools/convert/ConvertToCbrSettings.tsx +++ b/frontend/src/core/components/tools/convert/ConvertToCbrSettings.tsx @@ -16,17 +16,17 @@ const ConvertToCbrSettings = ({ const { t } = useTranslation(); return ( - + {t("convert.cbrOutputOptions", "PDF to CBR Options")}: onParameterChange('pdfToCbrOptions', { - ...parameters.pdfToCbrOptions, - dpi: typeof value === 'number' ? value : 150 - })} + onChange={(val) => + typeof val === 'number' && + onParameterChange('pdfToCbrOptions', { ...parameters.pdfToCbrOptions, dpi: val }) + } min={72} max={600} step={50} From cb331230aedc574dfede1786af242958c3aaddff Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bal=C3=A1zs=20Sz=C3=BCcs?= Date: Wed, 12 Nov 2025 17:38:53 +0100 Subject: [PATCH 9/9] feat(convert): update test ID in ConvertFromCbrSettings MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Renamed `data-testid` from `cbr-options-section` to `cbr-settings` for consistency Signed-off-by: Balázs Szücs --- .../core/components/tools/convert/ConvertFromCbrSettings.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frontend/src/core/components/tools/convert/ConvertFromCbrSettings.tsx b/frontend/src/core/components/tools/convert/ConvertFromCbrSettings.tsx index 736932232..8f1a80946 100644 --- a/frontend/src/core/components/tools/convert/ConvertFromCbrSettings.tsx +++ b/frontend/src/core/components/tools/convert/ConvertFromCbrSettings.tsx @@ -16,7 +16,7 @@ const ConvertFromCbrSettings = ({ const { t } = useTranslation(); return ( - + {t("convert.cbrOptions", "CBR Options")}: