Compare commits

...

3 Commits

Author SHA1 Message Date
Ludy
e8af4f6b35
Set i18n to load only current language (#4359)
This pull request introduces a minor configuration change to the i18n
setup in the frontend. The change improves language loading behavior by
ensuring only the current language is loaded, which can help optimize
performance and prevent unnecessary resource usage.

* Added the `load: 'currentOnly'` option to the i18n initialization in
`frontend/src/i18n.ts`, so only the current language is loaded.

Co-authored-by: ConnorYoh <40631091+ConnorYoh@users.noreply.github.com>
2025-09-08 10:05:49 +01:00
stirlingbot[bot]
c25985e49e
Update Frontend 3rd Party Licenses (#4319)
Auto-generated by stirlingbot[bot]

This PR updates the frontend license report based on changes to
package.json dependencies.

Signed-off-by: stirlingbot[bot] <stirlingbot[bot]@users.noreply.github.com>
Co-authored-by: stirlingbot[bot] <195170888+stirlingbot[bot]@users.noreply.github.com>
Co-authored-by: ConnorYoh <40631091+ConnorYoh@users.noreply.github.com>
2025-09-08 08:58:22 +00:00
James Brunton
316be5eac5
Fix types of onParameterChange methods (#4415)
# Description of Changes
Fix types of onParameterChange methods
2025-09-08 09:55:30 +01:00
16 changed files with 105 additions and 62 deletions

View File

@ -385,6 +385,13 @@
"moduleLicense": "MIT", "moduleLicense": "MIT",
"moduleLicenseUrl": "https://opensource.org/licenses/MIT" "moduleLicenseUrl": "https://opensource.org/licenses/MIT"
}, },
{
"moduleName": "@posthog/core",
"moduleUrl": "https://github.com/PostHog/posthog-js",
"moduleVersion": "1.0.2",
"moduleLicense": "MIT",
"moduleLicenseUrl": "https://opensource.org/licenses/MIT"
},
{ {
"moduleName": "@tailwindcss/node", "moduleName": "@tailwindcss/node",
"moduleUrl": "https://github.com/tailwindlabs/tailwindcss", "moduleUrl": "https://github.com/tailwindlabs/tailwindcss",
@ -742,6 +749,13 @@
"moduleLicense": "MIT", "moduleLicense": "MIT",
"moduleLicenseUrl": "https://opensource.org/licenses/MIT" "moduleLicenseUrl": "https://opensource.org/licenses/MIT"
}, },
{
"moduleName": "core-js",
"moduleUrl": "https://github.com/zloirock/core-js",
"moduleVersion": "3.45.1",
"moduleLicense": "MIT",
"moduleLicenseUrl": "https://opensource.org/licenses/MIT"
},
{ {
"moduleName": "core-util-is", "moduleName": "core-util-is",
"moduleUrl": "https://github.com/isaacs/core-util-is", "moduleUrl": "https://github.com/isaacs/core-util-is",
@ -924,6 +938,13 @@
"moduleLicense": "MIT", "moduleLicense": "MIT",
"moduleLicenseUrl": "https://opensource.org/licenses/MIT" "moduleLicenseUrl": "https://opensource.org/licenses/MIT"
}, },
{
"moduleName": "fflate",
"moduleUrl": "https://github.com/101arrowz/fflate",
"moduleVersion": "0.4.8",
"moduleLicense": "MIT",
"moduleLicenseUrl": "https://opensource.org/licenses/MIT"
},
{ {
"moduleName": "file-selector", "moduleName": "file-selector",
"moduleUrl": "https://github.com/react-dropzone/file-selector", "moduleUrl": "https://github.com/react-dropzone/file-selector",
@ -1533,6 +1554,20 @@
"moduleLicense": "MIT", "moduleLicense": "MIT",
"moduleLicenseUrl": "https://opensource.org/licenses/MIT" "moduleLicenseUrl": "https://opensource.org/licenses/MIT"
}, },
{
"moduleName": "posthog-js",
"moduleUrl": "https://github.com/PostHog/posthog-js",
"moduleVersion": "1.261.0",
"moduleLicense": "MIT*",
"moduleLicenseUrl": "https://opensource.org/licenses/MIT"
},
{
"moduleName": "preact",
"moduleUrl": "https://github.com/preactjs/preact",
"moduleVersion": "10.27.1",
"moduleLicense": "MIT",
"moduleLicenseUrl": "https://opensource.org/licenses/MIT"
},
{ {
"moduleName": "pretty-format", "moduleName": "pretty-format",
"moduleUrl": "https://github.com/facebook/jest", "moduleUrl": "https://github.com/facebook/jest",
@ -1928,7 +1963,7 @@
{ {
"moduleName": "typescript", "moduleName": "typescript",
"moduleUrl": "https://github.com/microsoft/TypeScript", "moduleUrl": "https://github.com/microsoft/TypeScript",
"moduleVersion": "5.8.3", "moduleVersion": "5.9.2",
"moduleLicense": "Apache-2.0", "moduleLicense": "Apache-2.0",
"moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0" "moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0"
}, },
@ -1995,6 +2030,13 @@
"moduleLicense": "Apache-2.0", "moduleLicense": "Apache-2.0",
"moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0" "moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0"
}, },
{
"moduleName": "web-vitals",
"moduleUrl": "https://github.com/GoogleChrome/web-vitals",
"moduleVersion": "4.2.4",
"moduleLicense": "Apache-2.0",
"moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0"
},
{ {
"moduleName": "webidl-conversions", "moduleName": "webidl-conversions",
"moduleUrl": "https://github.com/jsdom/webidl-conversions", "moduleUrl": "https://github.com/jsdom/webidl-conversions",

View File

@ -4,7 +4,7 @@ import { AddPasswordParameters } from "../../../hooks/tools/addPassword/useAddPa
interface AddPasswordSettingsProps { interface AddPasswordSettingsProps {
parameters: AddPasswordParameters; parameters: AddPasswordParameters;
onParameterChange: (key: keyof AddPasswordParameters, value: any) => void; onParameterChange: <K extends keyof AddPasswordParameters>(key: K, value: AddPasswordParameters[K]) => void;
disabled?: boolean; disabled?: boolean;
} }

View File

@ -4,7 +4,7 @@ import { ChangePermissionsParameters } from "../../../hooks/tools/changePermissi
interface ChangePermissionsSettingsProps { interface ChangePermissionsSettingsProps {
parameters: ChangePermissionsParameters; parameters: ChangePermissionsParameters;
onParameterChange: (key: keyof ChangePermissionsParameters, value: boolean) => void; onParameterChange: <K extends keyof ChangePermissionsParameters>(key: K, value: ChangePermissionsParameters[K]) => void;
disabled?: boolean; disabled?: boolean;
} }

View File

@ -5,7 +5,7 @@ import { CompressParameters } from "../../../hooks/tools/compress/useCompressPar
interface CompressSettingsProps { interface CompressSettingsProps {
parameters: CompressParameters; parameters: CompressParameters;
onParameterChange: (key: keyof CompressParameters, value: any) => void; onParameterChange: <K extends keyof CompressParameters>(key: K, value: CompressParameters[K]) => void;
disabled?: boolean; disabled?: boolean;
} }

View File

@ -5,40 +5,40 @@ import { ConvertParameters } from '../../../hooks/tools/convert/useConvertParame
interface ConvertFromEmailSettingsProps { interface ConvertFromEmailSettingsProps {
parameters: ConvertParameters; parameters: ConvertParameters;
onParameterChange: (key: keyof ConvertParameters, value: any) => void; onParameterChange: <K extends keyof ConvertParameters>(key: K, value: ConvertParameters[K]) => void;
disabled?: boolean; disabled?: boolean;
} }
const ConvertFromEmailSettings = ({ const ConvertFromEmailSettings = ({
parameters, parameters,
onParameterChange, onParameterChange,
disabled = false disabled = false
}: ConvertFromEmailSettingsProps) => { }: ConvertFromEmailSettingsProps) => {
const { t } = useTranslation(); const { t } = useTranslation();
return ( return (
<Stack gap="sm" data-testid="email-settings"> <Stack gap="sm" data-testid="email-settings">
<Text size="sm" fw={500}>{t("convert.emailOptions", "Email to PDF Options")}:</Text> <Text size="sm" fw={500}>{t("convert.emailOptions", "Email to PDF Options")}:</Text>
<Checkbox <Checkbox
label={t("convert.includeAttachments", "Include email attachments")} label={t("convert.includeAttachments", "Include email attachments")}
checked={parameters.emailOptions.includeAttachments} checked={parameters.emailOptions.includeAttachments}
onChange={(event) => onParameterChange('emailOptions', { onChange={(event) => onParameterChange('emailOptions', {
...parameters.emailOptions, ...parameters.emailOptions,
includeAttachments: event.currentTarget.checked includeAttachments: event.currentTarget.checked
})} })}
disabled={disabled} disabled={disabled}
data-testid="include-attachments-checkbox" data-testid="include-attachments-checkbox"
/> />
{parameters.emailOptions.includeAttachments && ( {parameters.emailOptions.includeAttachments && (
<Stack gap="xs"> <Stack gap="xs">
<Text size="xs" fw={500}>{t("convert.maxAttachmentSize", "Maximum attachment size (MB)")}:</Text> <Text size="xs" fw={500}>{t("convert.maxAttachmentSize", "Maximum attachment size (MB)")}:</Text>
<NumberInput <NumberInput
value={parameters.emailOptions.maxAttachmentSizeMB} value={parameters.emailOptions.maxAttachmentSizeMB}
onChange={(value) => onParameterChange('emailOptions', { onChange={(value) => onParameterChange('emailOptions', {
...parameters.emailOptions, ...parameters.emailOptions,
maxAttachmentSizeMB: Number(value) || 10 maxAttachmentSizeMB: Number(value) || 10
})} })}
min={1} min={1}
max={100} max={100}
@ -48,24 +48,24 @@ const ConvertFromEmailSettings = ({
/> />
</Stack> </Stack>
)} )}
<Checkbox <Checkbox
label={t("convert.includeAllRecipients", "Include CC and BCC recipients in header")} label={t("convert.includeAllRecipients", "Include CC and BCC recipients in header")}
checked={parameters.emailOptions.includeAllRecipients} checked={parameters.emailOptions.includeAllRecipients}
onChange={(event) => onParameterChange('emailOptions', { onChange={(event) => onParameterChange('emailOptions', {
...parameters.emailOptions, ...parameters.emailOptions,
includeAllRecipients: event.currentTarget.checked includeAllRecipients: event.currentTarget.checked
})} })}
disabled={disabled} disabled={disabled}
data-testid="include-all-recipients-checkbox" data-testid="include-all-recipients-checkbox"
/> />
<Checkbox <Checkbox
label={t("convert.downloadHtml", "Download HTML intermediate file instead of PDF")} label={t("convert.downloadHtml", "Download HTML intermediate file instead of PDF")}
checked={parameters.emailOptions.downloadHtml} checked={parameters.emailOptions.downloadHtml}
onChange={(event) => onParameterChange('emailOptions', { onChange={(event) => onParameterChange('emailOptions', {
...parameters.emailOptions, ...parameters.emailOptions,
downloadHtml: event.currentTarget.checked downloadHtml: event.currentTarget.checked
})} })}
disabled={disabled} disabled={disabled}
data-testid="download-html-checkbox" data-testid="download-html-checkbox"
@ -74,4 +74,4 @@ const ConvertFromEmailSettings = ({
); );
}; };
export default ConvertFromEmailSettings; export default ConvertFromEmailSettings;

View File

@ -6,7 +6,7 @@ import { ConvertParameters } from "../../../hooks/tools/convert/useConvertParame
interface ConvertFromImageSettingsProps { interface ConvertFromImageSettingsProps {
parameters: ConvertParameters; parameters: ConvertParameters;
onParameterChange: (key: keyof ConvertParameters, value: any) => void; onParameterChange: <K extends keyof ConvertParameters>(key: K, value: ConvertParameters[K]) => void;
disabled?: boolean; disabled?: boolean;
} }

View File

@ -5,28 +5,28 @@ import { ConvertParameters } from '../../../hooks/tools/convert/useConvertParame
interface ConvertFromWebSettingsProps { interface ConvertFromWebSettingsProps {
parameters: ConvertParameters; parameters: ConvertParameters;
onParameterChange: (key: keyof ConvertParameters, value: any) => void; onParameterChange: <K extends keyof ConvertParameters>(key: K, value: ConvertParameters[K]) => void;
disabled?: boolean; disabled?: boolean;
} }
const ConvertFromWebSettings = ({ const ConvertFromWebSettings = ({
parameters, parameters,
onParameterChange, onParameterChange,
disabled = false disabled = false
}: ConvertFromWebSettingsProps) => { }: ConvertFromWebSettingsProps) => {
const { t } = useTranslation(); const { t } = useTranslation();
return ( return (
<Stack gap="sm" data-testid="web-settings"> <Stack gap="sm" data-testid="web-settings">
<Text size="sm" fw={500}>{t("convert.webOptions", "Web to PDF Options")}:</Text> <Text size="sm" fw={500}>{t("convert.webOptions", "Web to PDF Options")}:</Text>
<Stack gap="xs"> <Stack gap="xs">
<Text size="xs" fw={500}>{t("convert.zoomLevel", "Zoom Level")}:</Text> <Text size="xs" fw={500}>{t("convert.zoomLevel", "Zoom Level")}:</Text>
<NumberInput <NumberInput
value={parameters.htmlOptions.zoomLevel} value={parameters.htmlOptions.zoomLevel}
onChange={(value) => onParameterChange('htmlOptions', { onChange={(value) => onParameterChange('htmlOptions', {
...parameters.htmlOptions, ...parameters.htmlOptions,
zoomLevel: Number(value) || 1.0 zoomLevel: Number(value) || 1.0
})} })}
min={0.1} min={0.1}
max={3.0} max={3.0}
@ -36,9 +36,9 @@ const ConvertFromWebSettings = ({
/> />
<Slider <Slider
value={parameters.htmlOptions.zoomLevel} value={parameters.htmlOptions.zoomLevel}
onChange={(value) => onParameterChange('htmlOptions', { onChange={(value) => onParameterChange('htmlOptions', {
...parameters.htmlOptions, ...parameters.htmlOptions,
zoomLevel: value zoomLevel: value
})} })}
min={0.1} min={0.1}
max={3.0} max={3.0}
@ -51,4 +51,4 @@ const ConvertFromWebSettings = ({
); );
}; };
export default ConvertFromWebSettings; export default ConvertFromWebSettings;

View File

@ -26,7 +26,7 @@ import { StirlingFile } from "../../../types/fileContext";
interface ConvertSettingsProps { interface ConvertSettingsProps {
parameters: ConvertParameters; parameters: ConvertParameters;
onParameterChange: (key: keyof ConvertParameters, value: any) => void; onParameterChange: <K extends keyof ConvertParameters>(key: K, value: ConvertParameters[K]) => void;
getAvailableToExtensions: (fromExtension: string) => Array<{value: string, label: string, group: string}>; getAvailableToExtensions: (fromExtension: string) => Array<{value: string, label: string, group: string}>;
selectedFiles: StirlingFile[]; selectedFiles: StirlingFile[];
disabled?: boolean; disabled?: boolean;

View File

@ -6,7 +6,7 @@ import { ConvertParameters } from "../../../hooks/tools/convert/useConvertParame
interface ConvertToImageSettingsProps { interface ConvertToImageSettingsProps {
parameters: ConvertParameters; parameters: ConvertParameters;
onParameterChange: (key: keyof ConvertParameters, value: any) => void; onParameterChange: <K extends keyof ConvertParameters>(key: K, value: ConvertParameters[K]) => void;
disabled?: boolean; disabled?: boolean;
} }

View File

@ -7,16 +7,16 @@ import { StirlingFile } from '../../../types/fileContext';
interface ConvertToPdfaSettingsProps { interface ConvertToPdfaSettingsProps {
parameters: ConvertParameters; parameters: ConvertParameters;
onParameterChange: (key: keyof ConvertParameters, value: any) => void; onParameterChange: <K extends keyof ConvertParameters>(key: K, value: ConvertParameters[K]) => void;
selectedFiles: StirlingFile[]; selectedFiles: StirlingFile[];
disabled?: boolean; disabled?: boolean;
} }
const ConvertToPdfaSettings = ({ const ConvertToPdfaSettings = ({
parameters, parameters,
onParameterChange, onParameterChange,
selectedFiles, selectedFiles,
disabled = false disabled = false
}: ConvertToPdfaSettingsProps) => { }: ConvertToPdfaSettingsProps) => {
const { t } = useTranslation(); const { t } = useTranslation();
const { hasDigitalSignatures, isChecking } = usePdfSignatureDetection(selectedFiles); const { hasDigitalSignatures, isChecking } = usePdfSignatureDetection(selectedFiles);
@ -29,7 +29,7 @@ const ConvertToPdfaSettings = ({
return ( return (
<Stack gap="sm" data-testid="pdfa-settings"> <Stack gap="sm" data-testid="pdfa-settings">
<Text size="sm" fw={500}>{t("convert.pdfaOptions", "PDF/A Options")}:</Text> <Text size="sm" fw={500}>{t("convert.pdfaOptions", "PDF/A Options")}:</Text>
{hasDigitalSignatures && ( {hasDigitalSignatures && (
<Alert color="yellow"> <Alert color="yellow">
<Text size="sm"> <Text size="sm">
@ -37,14 +37,14 @@ const ConvertToPdfaSettings = ({
</Text> </Text>
</Alert> </Alert>
)} )}
<Stack gap="xs"> <Stack gap="xs">
<Text size="xs" fw={500}>{t("convert.outputFormat", "Output Format")}:</Text> <Text size="xs" fw={500}>{t("convert.outputFormat", "Output Format")}:</Text>
<Select <Select
value={parameters.pdfaOptions.outputFormat} value={parameters.pdfaOptions.outputFormat}
onChange={(value) => onParameterChange('pdfaOptions', { onChange={(value) => onParameterChange('pdfaOptions', {
...parameters.pdfaOptions, ...parameters.pdfaOptions,
outputFormat: value || 'pdfa-1' outputFormat: value || 'pdfa-1'
})} })}
data={pdfaFormatOptions} data={pdfaFormatOptions}
disabled={disabled || isChecking} disabled={disabled || isChecking}
@ -58,4 +58,4 @@ const ConvertToPdfaSettings = ({
); );
}; };
export default ConvertToPdfaSettings; export default ConvertToPdfaSettings;

View File

@ -16,7 +16,7 @@ interface AdvancedOption {
interface AdvancedOCRSettingsProps { interface AdvancedOCRSettingsProps {
advancedOptions: string[]; advancedOptions: string[];
ocrRenderType?: string; ocrRenderType?: string;
onParameterChange: (key: keyof OCRParameters, value: any) => void; onParameterChange: <K extends keyof OCRParameters>(key: K, value: OCRParameters[K]) => void;
disabled?: boolean; disabled?: boolean;
} }
@ -40,7 +40,7 @@ const AdvancedOCRSettings: React.FC<AdvancedOCRSettingsProps> = ({
// Handle individual checkbox changes // Handle individual checkbox changes
const handleCheckboxChange = (optionValue: string, checked: boolean) => { const handleCheckboxChange = (optionValue: string, checked: boolean) => {
const option = advancedOptionsData.find(opt => opt.value === optionValue); const option = advancedOptionsData.find(opt => opt.value === optionValue);
if (option?.isSpecial) { if (option?.isSpecial) {
// Handle special options (like compatibility mode) differently // Handle special options (like compatibility mode) differently
if (optionValue === 'compatibilityMode') { if (optionValue === 'compatibilityMode') {
@ -69,7 +69,7 @@ const AdvancedOCRSettings: React.FC<AdvancedOCRSettingsProps> = ({
<Text size="sm" fw={500} mb="md"> <Text size="sm" fw={500} mb="md">
{t('ocr.settings.advancedOptions.label', 'Processing Options')} {t('ocr.settings.advancedOptions.label', 'Processing Options')}
</Text> </Text>
<Stack gap="sm"> <Stack gap="sm">
{advancedOptionsData.map((option) => ( {advancedOptionsData.map((option) => (
<Checkbox <Checkbox
@ -87,4 +87,4 @@ const AdvancedOCRSettings: React.FC<AdvancedOCRSettingsProps> = ({
); );
}; };
export default AdvancedOCRSettings; export default AdvancedOCRSettings;

View File

@ -6,7 +6,7 @@ import { OCRParameters } from '../../../hooks/tools/ocr/useOCRParameters';
interface OCRSettingsProps { interface OCRSettingsProps {
parameters: OCRParameters; parameters: OCRParameters;
onParameterChange: (key: keyof OCRParameters, value: any) => void; onParameterChange: <K extends keyof OCRParameters>(key: K, value: OCRParameters[K]) => void;
disabled?: boolean; disabled?: boolean;
} }

View File

@ -4,7 +4,7 @@ import { RemovePasswordParameters } from "../../../hooks/tools/removePassword/us
interface RemovePasswordSettingsProps { interface RemovePasswordSettingsProps {
parameters: RemovePasswordParameters; parameters: RemovePasswordParameters;
onParameterChange: (key: keyof RemovePasswordParameters, value: string) => void; onParameterChange: <K extends keyof RemovePasswordParameters>(key: K, value: RemovePasswordParameters[K]) => void;
disabled?: boolean; disabled?: boolean;
} }

View File

@ -4,7 +4,7 @@ import { SanitizeParameters, defaultParameters } from "../../../hooks/tools/sani
interface SanitizeSettingsProps { interface SanitizeSettingsProps {
parameters: SanitizeParameters; parameters: SanitizeParameters;
onParameterChange: (key: keyof SanitizeParameters, value: boolean) => void; onParameterChange: <K extends keyof SanitizeParameters>(key: K, value: SanitizeParameters[K]) => void;
disabled?: boolean; disabled?: boolean;
} }

View File

@ -1,11 +1,11 @@
import { Stack, TextInput, Select, Checkbox } from '@mantine/core'; import { Stack, TextInput, Select, Checkbox } from '@mantine/core';
import { useTranslation } from 'react-i18next'; import { useTranslation } from 'react-i18next';
import { isSplitMode, SPLIT_MODES, SPLIT_TYPES } from '../../../constants/splitConstants'; import { isSplitMode, isSplitType, SPLIT_MODES, SPLIT_TYPES } from '../../../constants/splitConstants';
import { SplitParameters } from '../../../hooks/tools/split/useSplitParameters'; import { SplitParameters } from '../../../hooks/tools/split/useSplitParameters';
export interface SplitSettingsProps { export interface SplitSettingsProps {
parameters: SplitParameters; parameters: SplitParameters;
onParameterChange: (parameter: keyof SplitParameters, value: string | boolean) => void; onParameterChange: <K extends keyof SplitParameters>(key: K, value: SplitParameters[K]) => void;
disabled?: boolean; disabled?: boolean;
} }
@ -62,7 +62,7 @@ const SplitSettings = ({
<Select <Select
label={t("split-by-size-or-count.type.label", "Split Type")} label={t("split-by-size-or-count.type.label", "Split Type")}
value={parameters.splitType} value={parameters.splitType}
onChange={(v) => v && onParameterChange('splitType', v)} onChange={(v) => isSplitType(v) && onParameterChange('splitType', v)}
disabled={disabled} disabled={disabled}
data={[ data={[
{ value: SPLIT_TYPES.SIZE, label: t("split-by-size-or-count.type.size", "By Size") }, { value: SPLIT_TYPES.SIZE, label: t("split-by-size-or-count.type.size", "By Size") },

View File

@ -59,6 +59,7 @@ i18n
.init({ .init({
fallbackLng: 'en-GB', fallbackLng: 'en-GB',
supportedLngs: Object.keys(supportedLanguages), supportedLngs: Object.keys(supportedLanguages),
load: 'currentOnly',
nonExplicitSupportedLngs: false, nonExplicitSupportedLngs: false,
debug: process.env.NODE_ENV === 'development', debug: process.env.NODE_ENV === 'development',