diff --git a/frontend/src/components/tools/addStamp/StampPreview.tsx b/frontend/src/components/tools/addStamp/StampPreview.tsx
index 730f36b35..a6a4c178b 100644
--- a/frontend/src/components/tools/addStamp/StampPreview.tsx
+++ b/frontend/src/components/tools/addStamp/StampPreview.tsx
@@ -72,7 +72,7 @@ export default function StampPreview({ parameters, onParameterChange, file, show
if (!cancelled) setPageSize(null);
}
};
- load();
+ void load();
return () => { cancelled = true; };
}, [file]);
@@ -88,12 +88,12 @@ export default function StampPreview({ parameters, onParameterChange, file, show
const pageNumber = Math.max(1, getFirstSelectedPage(parameters.pageNumbers));
const pageId = `${file.name}:${file.size}:${file.lastModified}:page:${pageNumber}`;
const thumb = await requestThumbnail(pageId, file, pageNumber);
- if (isActive) setPageThumbnail(thumb || null);
+ if (isActive) setPageThumbnail(thumb ?? null);
} catch {
if (isActive) setPageThumbnail(null);
}
};
- loadThumb();
+ void loadThumb();
return () => { isActive = false; };
}, [file, parameters.pageNumbers, requestThumbnail]);
@@ -189,7 +189,7 @@ export default function StampPreview({ parameters, onParameterChange, file, show
draggingRef.current = {
type,
- startX: e.clientX - (rect?.left || 0),
+ startX: e.clientX - (rect?.left ?? 0),
startY: (rect ? rect.bottom - e.clientY : 0), // convert to bottom-based coords
initLeft: left,
initBottom: bottom,
@@ -255,11 +255,11 @@ export default function StampPreview({ parameters, onParameterChange, file, show
Preview Stamp
-
{pageThumbnail && (
diff --git a/frontend/src/components/tools/addStamp/useAddStampOperation.ts b/frontend/src/components/tools/addStamp/useAddStampOperation.ts
index c41c440fc..48480f408 100644
--- a/frontend/src/components/tools/addStamp/useAddStampOperation.ts
+++ b/frontend/src/components/tools/addStamp/useAddStampOperation.ts
@@ -7,7 +7,7 @@ export const buildAddStampFormData = (parameters: AddStampParameters, file: File
const formData = new FormData();
formData.append('fileInput', file);
formData.append('pageNumbers', parameters.pageNumbers);
- formData.append('customMargin', parameters.customMargin || 'medium');
+ formData.append('customMargin', parameters.customMargin || 'medium');
formData.append('position', String(parameters.position));
const effectiveFontSize = parameters.fontSize;
formData.append('fontSize', String(effectiveFontSize));
@@ -19,7 +19,7 @@ export const buildAddStampFormData = (parameters: AddStampParameters, file: File
formData.append('alphabet', parameters.alphabet);
// Stamp type and payload
- formData.append('stampType', parameters.stampType || 'text');
+ formData.append('stampType', parameters.stampType ?? 'text');
if (parameters.stampType === 'text') {
formData.append('stampText', parameters.stampText);
} else if (parameters.stampType === 'image' && parameters.stampImage) {
diff --git a/frontend/src/components/tools/addWatermark/WatermarkImageFile.tsx b/frontend/src/components/tools/addWatermark/WatermarkImageFile.tsx
index 85e723ccb..90e603f52 100644
--- a/frontend/src/components/tools/addWatermark/WatermarkImageFile.tsx
+++ b/frontend/src/components/tools/addWatermark/WatermarkImageFile.tsx
@@ -17,7 +17,7 @@ const WatermarkImageFile = ({ parameters, onParameterChange, disabled = false }:
onParameterChange('watermarkImage', file || undefined)}
+ onChange={(file) => onParameterChange('watermarkImage', file ?? undefined)}
accept="image/*"
disabled={disabled}
placeholder={t('watermark.settings.image.choose', 'Choose Image')}
diff --git a/frontend/src/components/tools/addWatermark/WatermarkTypeSettings.tsx b/frontend/src/components/tools/addWatermark/WatermarkTypeSettings.tsx
index 2c7548df8..142d623a4 100644
--- a/frontend/src/components/tools/addWatermark/WatermarkTypeSettings.tsx
+++ b/frontend/src/components/tools/addWatermark/WatermarkTypeSettings.tsx
@@ -1,3 +1,4 @@
+import React from "react";
import { useTranslation } from "react-i18next";
import ButtonSelector from "../../shared/ButtonSelector";
diff --git a/frontend/src/components/tools/adjustPageScale/AdjustPageScaleSettings.test.tsx b/frontend/src/components/tools/adjustPageScale/AdjustPageScaleSettings.test.tsx
index d71655cdc..52b0abbd5 100644
--- a/frontend/src/components/tools/adjustPageScale/AdjustPageScaleSettings.test.tsx
+++ b/frontend/src/components/tools/adjustPageScale/AdjustPageScaleSettings.test.tsx
@@ -1,3 +1,4 @@
+import React from 'react';
import { describe, expect, test, vi, beforeEach } from 'vitest';
import { render, screen } from '@testing-library/react';
import { MantineProvider } from '@mantine/core';
diff --git a/frontend/src/components/tools/adjustPageScale/AdjustPageScaleSettings.tsx b/frontend/src/components/tools/adjustPageScale/AdjustPageScaleSettings.tsx
index 9262bcba4..3879ad954 100644
--- a/frontend/src/components/tools/adjustPageScale/AdjustPageScaleSettings.tsx
+++ b/frontend/src/components/tools/adjustPageScale/AdjustPageScaleSettings.tsx
@@ -1,3 +1,4 @@
+import React from "react";
import { Stack, NumberInput, Select } from "@mantine/core";
import { useTranslation } from "react-i18next";
import { AdjustPageScaleParameters, PageSize } from "../../../hooks/tools/adjustPageScale/useAdjustPageScaleParameters";
diff --git a/frontend/src/components/tools/automate/AutomationCreation.tsx b/frontend/src/components/tools/automate/AutomationCreation.tsx
index b5e793ccb..c19092f79 100644
--- a/frontend/src/components/tools/automate/AutomationCreation.tsx
+++ b/frontend/src/components/tools/automate/AutomationCreation.tsx
@@ -1,4 +1,4 @@
-import { useState } from 'react';
+import React, { useState } from 'react';
import { useTranslation } from 'react-i18next';
import {
Button,
@@ -100,7 +100,7 @@ export default function AutomationCreation({ mode, existingAutomation, onBack, o
icon: automationIcon,
operations: selectedTools.map(tool => ({
operation: tool.operation,
- parameters: tool.parameters || {}
+ parameters: tool.parameters ?? {}
}))
};
diff --git a/frontend/src/components/tools/automate/AutomationEntry.tsx b/frontend/src/components/tools/automate/AutomationEntry.tsx
index 30c280491..d68b517b5 100644
--- a/frontend/src/components/tools/automate/AutomationEntry.tsx
+++ b/frontend/src/components/tools/automate/AutomationEntry.tsx
@@ -240,7 +240,7 @@ export default function AutomationEntry({
);
// Show tooltip if there's a description OR operations to display
- const shouldShowTooltip = description || operations.length > 0;
+ const shouldShowTooltip = description ?? operations.length > 0;
return shouldShowTooltip ? (
0 || automateOperation?.downloadUrl !== null;
// Initialize execution steps from automation
@@ -194,7 +194,7 @@ export default function AutomationRun({ automation, onComplete, automateOperatio
}
onClick={executeAutomation}
- disabled={isExecuting || !selectedFiles || selectedFiles.length === 0}
+ disabled={(isExecuting ?? !selectedFiles) ?? selectedFiles.length === 0}
loading={isExecuting}
>
{isExecuting
diff --git a/frontend/src/components/tools/automate/ToolConfigurationModal.tsx b/frontend/src/components/tools/automate/ToolConfigurationModal.tsx
index 4fce30b3d..ffac6a02d 100644
--- a/frontend/src/components/tools/automate/ToolConfigurationModal.tsx
+++ b/frontend/src/components/tools/automate/ToolConfigurationModal.tsx
@@ -1,4 +1,4 @@
-import { useState, useEffect } from 'react';
+import React, { useState, useEffect } from 'react';
import { useTranslation } from 'react-i18next';
import {
Modal,
diff --git a/frontend/src/components/tools/automate/ToolSelector.tsx b/frontend/src/components/tools/automate/ToolSelector.tsx
index 7d5faafc5..33e43999f 100644
--- a/frontend/src/components/tools/automate/ToolSelector.tsx
+++ b/frontend/src/components/tools/automate/ToolSelector.tsx
@@ -1,4 +1,4 @@
-import { useState, useMemo, useCallback, useRef, useEffect } from 'react';
+import React, { useState, useMemo, useCallback, useRef, useEffect } from 'react';
import { useTranslation } from 'react-i18next';
import { Stack, Text, ScrollArea } from '@mantine/core';
import { ToolRegistryEntry } from '../../../data/toolsTaxonomy';
@@ -82,7 +82,7 @@ export default function ToolSelector({
// Find the "all" section which contains all tools without duplicates
const allSection = sections.find(s => (s as any).key === 'all');
- return allSection?.subcategories || [];
+ return allSection?.subcategories ?? [];
}, [isSearching, searchGroups, sections, baseFilteredTools]);
const handleToolSelect = useCallback((toolKey: string) => {
@@ -138,7 +138,7 @@ export default function ToolSelector({
if (selectedValue && toolRegistry[selectedValue]) {
return toolRegistry[selectedValue].name;
}
- return placeholder || t('automate.creation.tools.add', 'Add a tool...');
+ return placeholder ?? t('automate.creation.tools.add', 'Add a tool...');
};
return (
diff --git a/frontend/src/components/tools/certSign/CertificateFilesSettings.tsx b/frontend/src/components/tools/certSign/CertificateFilesSettings.tsx
index a11ba5b72..06610e5b4 100644
--- a/frontend/src/components/tools/certSign/CertificateFilesSettings.tsx
+++ b/frontend/src/components/tools/certSign/CertificateFilesSettings.tsx
@@ -1,3 +1,4 @@
+import React from "react";
import { Stack, Text, TextInput } from "@mantine/core";
import { useTranslation } from "react-i18next";
import { CertSignParameters } from "../../../hooks/tools/certSign/useCertSignParameters";
@@ -19,7 +20,7 @@ const CertificateFilesSettings = ({ parameters, onParameterChange, disabled = fa
onParameterChange('privateKeyFile', file || undefined)}
+ onChange={(file) => onParameterChange('privateKeyFile', file ?? undefined)}
accept=".pem,.der,.key"
disabled={disabled}
placeholder={t('certSign.choosePrivateKey', 'Choose Private Key File')}
@@ -27,7 +28,7 @@ const CertificateFilesSettings = ({ parameters, onParameterChange, disabled = fa
{parameters.privateKeyFile && (
onParameterChange('certFile', file || undefined)}
+ onChange={(file) => onParameterChange('certFile', file ?? undefined)}
accept=".pem,.der,.crt,.cer"
disabled={disabled}
placeholder={t('certSign.chooseCertificate', 'Choose Certificate File')}
@@ -39,7 +40,7 @@ const CertificateFilesSettings = ({ parameters, onParameterChange, disabled = fa
{parameters.certType === 'PKCS12' && (
onParameterChange('p12File', file || undefined)}
+ onChange={(file) => onParameterChange('p12File', file ?? undefined)}
accept=".p12"
disabled={disabled}
placeholder={t('certSign.chooseP12File', 'Choose PKCS12 File')}
@@ -49,7 +50,7 @@ const CertificateFilesSettings = ({ parameters, onParameterChange, disabled = fa
{parameters.certType === 'PFX' && (
onParameterChange('p12File', file || undefined)}
+ onChange={(file) => onParameterChange('p12File', file ?? undefined)}
accept=".pfx"
disabled={disabled}
placeholder={t('certSign.choosePfxFile', 'Choose PFX File')}
@@ -59,7 +60,7 @@ const CertificateFilesSettings = ({ parameters, onParameterChange, disabled = fa
{parameters.certType === 'JKS' && (
onParameterChange('jksFile', file || undefined)}
+ onChange={(file) => onParameterChange('jksFile', file ?? undefined)}
accept=".jks,.keystore"
disabled={disabled}
placeholder={t('certSign.chooseJksFile', 'Choose JKS File')}
@@ -74,9 +75,9 @@ const CertificateFilesSettings = ({ parameters, onParameterChange, disabled = fa
{/* Password - only show when files are uploaded */}
{parameters.certType && (
- (parameters.certType === 'PEM' && parameters.privateKeyFile && parameters.certFile) ||
- (parameters.certType === 'PKCS12' && parameters.p12File) ||
- (parameters.certType === 'PFX' && parameters.p12File) ||
+ (parameters.certType === 'PEM' && parameters.privateKeyFile && parameters.certFile) ??
+ (parameters.certType === 'PKCS12' && parameters.p12File) ??
+ (parameters.certType === 'PFX' && parameters.p12File) ??
(parameters.certType === 'JKS' && parameters.jksFile)
) && (
onParameterChange('pdfaOptions', {
...parameters.pdfaOptions,
- outputFormat: value || 'pdfa-1'
+ outputFormat: value ?? 'pdfa-1'
})}
data={pdfaFormatOptions}
disabled={disabled || isChecking}
diff --git a/frontend/src/components/tools/crop/CropSettings.tsx b/frontend/src/components/tools/crop/CropSettings.tsx
index dafcdeaab..9301bb25a 100644
--- a/frontend/src/components/tools/crop/CropSettings.tsx
+++ b/frontend/src/components/tools/crop/CropSettings.tsx
@@ -1,4 +1,4 @@
-import { useMemo, useState, useEffect } from "react";
+import React, { useMemo, useState, useEffect } from "react";
import { Stack, Text, Box, Group, NumberInput, ActionIcon, Center, Alert } from "@mantine/core";
import { useTranslation } from "react-i18next";
import RestartAltIcon from "@mui/icons-material/RestartAlt";
@@ -48,7 +48,7 @@ const CropSettings = ({ parameters, disabled = false }: CropSettingsProps) => {
return;
}
- setThumbnail(selectedStub.thumbnailUrl || null);
+ setThumbnail(selectedStub.thumbnailUrl ?? null);
try {
// Get PDF dimensions from the actual file
@@ -89,7 +89,7 @@ const CropSettings = ({ parameters, disabled = false }: CropSettingsProps) => {
}
};
- loadPDFDimensions();
+ void loadPDFDimensions();
}, [selectedStub, selectedFile, parameters]);
// Current crop area
diff --git a/frontend/src/components/tools/flatten/FlattenSettings.tsx b/frontend/src/components/tools/flatten/FlattenSettings.tsx
index 8386ad493..7c85ec401 100644
--- a/frontend/src/components/tools/flatten/FlattenSettings.tsx
+++ b/frontend/src/components/tools/flatten/FlattenSettings.tsx
@@ -1,3 +1,4 @@
+import React from "react";
import { Stack, Text, Checkbox } from "@mantine/core";
import { useTranslation } from "react-i18next";
import { FlattenParameters } from "../../../hooks/tools/flatten/useFlattenParameters";
diff --git a/frontend/src/components/tools/merge/MergeFileSorter.test.tsx b/frontend/src/components/tools/merge/MergeFileSorter.test.tsx
index 302777261..b19e1f4f9 100644
--- a/frontend/src/components/tools/merge/MergeFileSorter.test.tsx
+++ b/frontend/src/components/tools/merge/MergeFileSorter.test.tsx
@@ -1,3 +1,4 @@
+import React from 'react';
import { describe, expect, test, vi, beforeEach } from 'vitest';
import { render, screen, fireEvent } from '@testing-library/react';
import { MantineProvider } from '@mantine/core';
diff --git a/frontend/src/components/tools/merge/MergeSettings.test.tsx b/frontend/src/components/tools/merge/MergeSettings.test.tsx
index 7989fa6d0..657d3199a 100644
--- a/frontend/src/components/tools/merge/MergeSettings.test.tsx
+++ b/frontend/src/components/tools/merge/MergeSettings.test.tsx
@@ -1,3 +1,4 @@
+import React from 'react';
import { describe, expect, test, vi, beforeEach } from 'vitest';
import { render, screen, fireEvent } from '@testing-library/react';
import { MantineProvider } from '@mantine/core';
diff --git a/frontend/src/components/tools/ocr/LanguagePicker.tsx b/frontend/src/components/tools/ocr/LanguagePicker.tsx
index 31f0fe301..d94a34613 100644
--- a/frontend/src/components/tools/ocr/LanguagePicker.tsx
+++ b/frontend/src/components/tools/ocr/LanguagePicker.tsx
@@ -75,7 +75,7 @@ const LanguagePicker: React.FC = ({
}
};
- fetchLanguages();
+ void fetchLanguages();
}, [languagesEndpoint]);
// Auto-fill OCR language based on browser language when languages are loaded
diff --git a/frontend/src/components/tools/ocr/OCRSettings.tsx b/frontend/src/components/tools/ocr/OCRSettings.tsx
index 959601166..9aff013c3 100644
--- a/frontend/src/components/tools/ocr/OCRSettings.tsx
+++ b/frontend/src/components/tools/ocr/OCRSettings.tsx
@@ -23,7 +23,7 @@ const OCRSettings: React.FC = ({