From 7081c5f64e7f1c02db2fb4186cb717429b27d3aa Mon Sep 17 00:00:00 2001 From: TekH Date: Wed, 30 Sep 2026 15:16:23 +0200 Subject: [PATCH] Refactor PDF editor styles and add throttling logic Refactored `SenderPdfImageEditor.razor` to use culture-invariant formatting for dynamic styles and introduced the `GetPageCanvasStyle` method for calculating `aspect-ratio` and `cursor` styles. Enhanced layout control with additional CSS properties. Updated `envelope-editor.js` to include a throttling mechanism for mouse movement events using `_moveThrottle` and `requestAnimationFrame`. Added `getClickCoordsOnPdfPageThrottled` with a promise-based approach to improve performance during rapid interactions. --- .../PdfEditor/SenderPdfImageEditor.razor | 38 ++++++++++++++++--- .../wwwroot/js/envelope-editor.js | 34 +++++++++++++++++ 2 files changed, 66 insertions(+), 6 deletions(-) diff --git a/EnvelopeGenerator.Server/EnvelopeGenerator.Server.Client/Components/PdfEditor/SenderPdfImageEditor.razor b/EnvelopeGenerator.Server/EnvelopeGenerator.Server.Client/Components/PdfEditor/SenderPdfImageEditor.razor index 8d0cb290..da9f1f46 100644 --- a/EnvelopeGenerator.Server/EnvelopeGenerator.Server.Client/Components/PdfEditor/SenderPdfImageEditor.razor +++ b/EnvelopeGenerator.Server/EnvelopeGenerator.Server.Client/Components/PdfEditor/SenderPdfImageEditor.razor @@ -1,5 +1,6 @@ @using EnvelopeGenerator.Application.Resources @using EnvelopeGenerator.Application.Common.Dto +@using System.Globalization @using Microsoft.Extensions.Localization @inject IStringLocalizer UiLocalizer @inject IJSRuntime JSRuntime @@ -39,7 +40,7 @@ data-page-height-pt="@heightPt">
+ style="@GetPageCanvasStyle(widthPt, heightPt)"> @if (!string.IsNullOrWhiteSpace(pagePreview?.ImageDataUrl)) { { + const state = window.envelopeEditor._moveThrottle; + state.latest = { viewerCssClass, clientX, clientY }; + state.waiters.push(resolve); + + if (state.rafId !== 0) { + return; + } + + state.rafId = window.requestAnimationFrame(() => { + state.rafId = 0; + + const args = state.latest; + state.latest = null; + + const result = args + ? window.envelopeEditor.getClickCoordsOnPdfPage(args.viewerCssClass, args.clientX, args.clientY) + : null; + + const waiters = state.waiters.splice(0, state.waiters.length); + for (const waiter of waiters) { + waiter(result); + } + }); + }); } };