From 8386b8559208d96453bab5d3e9f5d1416679e1bc Mon Sep 17 00:00:00 2001 From: TekH Date: Wed, 30 Sep 2026 16:12:38 +0200 Subject: [PATCH] Add PDF navigation to SenderPdfImageEditor Enhanced SenderPdfImageEditor with page navigation features: - Added methods to navigate to first, previous, next, last, or specific pages. - Introduced `_currentPage` to track and validate the current page. - Implemented `OnParametersSet` to initialize/clamp `_currentPage`. - Integrated JavaScript interop for scrolling and visible page detection. Updated SenderPdfImageEditorToolbar: - Added navigation buttons with enable/disable states. - Replaced static page display with input and dropdown for page selection. - Added event callbacks for navigation actions. Styled new toolbar elements in `envelope-viewer.css` and added: - Input field and dropdown for page selection. - Adjusted layout and appearance of navigation controls. Extended `envelope-editor.js` with: - `scrollToPdfPage` for smooth scrolling to a specific page. - `getVisiblePdfPageNumber` to detect the most visible page. --- .../PdfEditor/SenderPdfImageEditor.razor | 81 ++++++++++++- .../SenderPdfImageEditorToolbar.razor | 107 ++++++++++++++++-- .../wwwroot/css/envelope-viewer.css | 43 +++++++ .../wwwroot/js/envelope-editor.js | 58 ++++++++++ 4 files changed, 276 insertions(+), 13 deletions(-) diff --git a/EnvelopeGenerator.Server/EnvelopeGenerator.Server.Client/Components/PdfEditor/SenderPdfImageEditor.razor b/EnvelopeGenerator.Server/EnvelopeGenerator.Server.Client/Components/PdfEditor/SenderPdfImageEditor.razor index 738babe8..d0ca42b4 100644 --- a/EnvelopeGenerator.Server/EnvelopeGenerator.Server.Client/Components/PdfEditor/SenderPdfImageEditor.razor +++ b/EnvelopeGenerator.Server/EnvelopeGenerator.Server.Client/Components/PdfEditor/SenderPdfImageEditor.razor @@ -9,15 +9,21 @@ @if (PageCount > 0) {
- + ZoomPercent="112" + GoFirstPage="OnGoFirstPageAsync" + GoPreviousPage="OnGoPreviousPageAsync" + GoNextPage="OnGoNextPageAsync" + GoLastPage="OnGoLastPageAsync" + GoToPage="OnGoToPageAsync" />
}
@@ -121,6 +127,7 @@ private bool _isDragging; private double _grabOffsetXPt; private double _grabOffsetYPt; + private int _currentPage = 1; private static string GetFieldStyle(SenderPdfFieldOverlay field, double pageWidthPt, double pageHeightPt) { @@ -163,6 +170,17 @@ return $"aspect-ratio:{ratioText};cursor:{cursor};"; } + protected override void OnParametersSet() + { + if (PageCount <= 0) + { + _currentPage = 1; + return; + } + + _currentPage = Math.Max(1, Math.Min(_currentPage, PageCount)); + } + private async Task HandleClickAsync(MouseEventArgs args) { if (EditorClick.HasDelegate) @@ -219,6 +237,65 @@ await MoveField.InvokeAsync(new SenderPdfFieldMoveRequest(_draggedFieldIndex.Value, pageNumber, xPt, yPt)); } + private async Task OnGoFirstPageAsync() + { + await NavigateToPageAsync(1); + } + + private async Task OnGoPreviousPageAsync() + { + await NavigateToPageAsync(_currentPage - 1); + } + + private async Task OnGoNextPageAsync() + { + await NavigateToPageAsync(_currentPage + 1); + } + + private async Task OnGoLastPageAsync() + { + await NavigateToPageAsync(PageCount); + } + + private async Task OnGoToPageAsync(int page) + { + await NavigateToPageAsync(page); + } + + private async Task NavigateToPageAsync(int targetPage) + { + if (PageCount <= 0) + return; + + var page = Math.Max(1, Math.Min(targetPage, PageCount)); + _currentPage = page; + + await JSRuntime.InvokeVoidAsync( + "envelopeEditor.scrollToPdfPage", + "sender-editor-pdf-viewer", + page); + } + + private async Task OnEditorScrollAsync(EventArgs _) + { + if (PageCount <= 0) + return; + + var visiblePage = await JSRuntime.InvokeAsync( + "envelopeEditor.getVisiblePdfPageNumber", + "sender-editor-pdf-viewer"); + + if (!visiblePage.HasValue) + return; + + var clamped = Math.Max(1, Math.Min(visiblePage.Value, PageCount)); + if (clamped == _currentPage) + return; + + _currentPage = clamped; + await InvokeAsync(StateHasChanged); + } + private void OnEditorMouseUp(MouseEventArgs args) { _draggedFieldIndex = null; diff --git a/EnvelopeGenerator.Server/EnvelopeGenerator.Server.Client/Components/PdfEditor/SenderPdfImageEditorToolbar.razor b/EnvelopeGenerator.Server/EnvelopeGenerator.Server.Client/Components/PdfEditor/SenderPdfImageEditorToolbar.razor index 28137a86..0f2a3e36 100644 --- a/EnvelopeGenerator.Server/EnvelopeGenerator.Server.Client/Components/PdfEditor/SenderPdfImageEditorToolbar.razor +++ b/EnvelopeGenerator.Server/EnvelopeGenerator.Server.Client/Components/PdfEditor/SenderPdfImageEditorToolbar.razor @@ -1,35 +1,55 @@
- - -