From 7083ad9207176e3cfb281aa6c6c6f6f83e8fb284 Mon Sep 17 00:00:00 2001 From: Connor Yoh Date: Fri, 15 Aug 2025 14:44:46 +0100 Subject: [PATCH] working with bad ui --- .../public/locales/en-US/translation.json | 15 +- .../addWatermark/WatermarkContentSettings.tsx | 80 +++++++++++ .../addWatermark/WatermarkStyleSettings.tsx | 117 ++++++++++++++++ .../addWatermark/WatermarkTypeSettings.tsx | 45 ++++++ .../addWatermark/useAddWatermarkOperation.ts | 18 +-- .../addWatermark/useAddWatermarkParameters.ts | 17 ++- frontend/src/tools/AddWatermark.tsx | 132 +++++++++++++++--- 7 files changed, 392 insertions(+), 32 deletions(-) create mode 100644 frontend/src/components/tools/addWatermark/WatermarkContentSettings.tsx create mode 100644 frontend/src/components/tools/addWatermark/WatermarkStyleSettings.tsx create mode 100644 frontend/src/components/tools/addWatermark/WatermarkTypeSettings.tsx diff --git a/frontend/public/locales/en-US/translation.json b/frontend/public/locales/en-US/translation.json index 00cfe7265..c3bf98080 100644 --- a/frontend/public/locales/en-US/translation.json +++ b/frontend/public/locales/en-US/translation.json @@ -1761,13 +1761,24 @@ "selected": "Selected: {{filename}}" }, "fontSize": "Font Size", - "position": "Position", + "alphabet": "Font/Language", + "color": "Watermark Color", "rotation": "Rotation (degrees)", "opacity": "Opacity (%)", "spacing": { "width": "Width Spacing", "height": "Height Spacing" - } + }, + "convertToImage": "Convert result to image-based PDF", + "convertToImageDesc": "Creates a PDF with images instead of text (more secure but larger file size)" + }, + "alphabet": { + "roman": "Roman/Latin", + "arabic": "Arabic", + "japanese": "Japanese", + "korean": "Korean", + "chinese": "Chinese", + "thai": "Thai" }, "positions": { "topLeft": "Top Left", diff --git a/frontend/src/components/tools/addWatermark/WatermarkContentSettings.tsx b/frontend/src/components/tools/addWatermark/WatermarkContentSettings.tsx new file mode 100644 index 000000000..872bc1d23 --- /dev/null +++ b/frontend/src/components/tools/addWatermark/WatermarkContentSettings.tsx @@ -0,0 +1,80 @@ +import React, { useRef } from "react"; +import { Stack, Text, TextInput, FileButton, Button, NumberInput } from "@mantine/core"; +import { useTranslation } from "react-i18next"; + +interface AddWatermarkParameters { + watermarkType?: 'text' | 'image'; + watermarkText: string; + watermarkImage?: File; + fontSize: number; + rotation: number; + opacity: number; + widthSpacer: number; + heightSpacer: number; + position: string; + overrideX?: number; + overrideY?: number; +} + +interface WatermarkContentSettingsProps { + parameters: AddWatermarkParameters; + onParameterChange: (key: keyof AddWatermarkParameters, value: any) => void; + disabled?: boolean; +} + +const WatermarkContentSettings = ({ parameters, onParameterChange, disabled = false }: WatermarkContentSettingsProps) => { + const { t } = useTranslation(); + const resetRef = useRef<() => void>(null); + + return ( + + {/* Text Watermark Settings */} + {parameters.watermarkType === 'text' && ( + + {t('watermark.settings.text.label', 'Watermark Text')} + onParameterChange('watermarkText', e.target.value)} + disabled={disabled} + /> + + {t('watermark.settings.fontSize', 'Font Size')} + onParameterChange('fontSize', value || 12)} + min={8} + max={72} + disabled={disabled} + /> + + )} + + {/* Image Watermark Settings */} + {parameters.watermarkType === 'image' && ( + + {t('watermark.settings.image.label', 'Watermark Image')} + onParameterChange('watermarkImage', file)} + accept="image/*" + disabled={disabled} + > + {(props) => ( + + )} + + {parameters.watermarkImage && ( + + {t('watermark.settings.image.selected', 'Selected: {{filename}}', { filename: parameters.watermarkImage.name })} + + )} + + )} + + ); +}; + +export default WatermarkContentSettings; \ No newline at end of file diff --git a/frontend/src/components/tools/addWatermark/WatermarkStyleSettings.tsx b/frontend/src/components/tools/addWatermark/WatermarkStyleSettings.tsx new file mode 100644 index 000000000..95aa7e4a3 --- /dev/null +++ b/frontend/src/components/tools/addWatermark/WatermarkStyleSettings.tsx @@ -0,0 +1,117 @@ +import React from "react"; +import { Stack, Text, NumberInput, Select, ColorInput, Checkbox } from "@mantine/core"; +import { useTranslation } from "react-i18next"; + +interface AddWatermarkParameters { + watermarkType?: 'text' | 'image'; + watermarkText: string; + watermarkImage?: File; + fontSize: number; + rotation: number; + opacity: number; + widthSpacer: number; + heightSpacer: number; + alphabet: string; + customColor: string; + convertPDFToImage: boolean; +} + +interface WatermarkStyleSettingsProps { + parameters: AddWatermarkParameters; + onParameterChange: (key: keyof AddWatermarkParameters, value: any) => void; + disabled?: boolean; +} + +const WatermarkStyleSettings = ({ parameters, onParameterChange, disabled = false }: WatermarkStyleSettingsProps) => { + const { t } = useTranslation(); + + const alphabetOptions = [ + { value: 'roman', label: t('watermark.alphabet.roman', 'Roman/Latin') }, + { value: 'arabic', label: t('watermark.alphabet.arabic', 'Arabic') }, + { value: 'japanese', label: t('watermark.alphabet.japanese', 'Japanese') }, + { value: 'korean', label: t('watermark.alphabet.korean', 'Korean') }, + { value: 'chinese', label: t('watermark.alphabet.chinese', 'Chinese') }, + { value: 'thai', label: t('watermark.alphabet.thai', 'Thai') } + ]; + + return ( + + {/* Text-specific settings */} + {parameters.watermarkType === 'text' && ( + + {t('watermark.settings.alphabet', 'Font/Language')} +