configure for test case

This commit is contained in:
2026-05-31 05:52:42 +02:00
parent 5bdc552492
commit b416823f38
6 changed files with 166 additions and 32 deletions

View File

@@ -1,4 +1,5 @@
@page "/receiver"
@page "/receiver/{EnvelopeKey}"
@using System.Drawing
@using DevExpress.Drawing
@using DevExpress.Utils
@@ -10,9 +11,11 @@
@using XRPictureBox = DevExpress.XtraReports.UI.XRPictureBox
@using XRControl = DevExpress.XtraReports.UI.XRControl
@using ImageSizeMode = DevExpress.XtraPrinting.ImageSizeMode
@using EnvelopeGenerator.ReceiverUI.Services;
@using EnvelopeGenerator.ReceiverUI.Services
@using DevExpress.Blazor.Reporting
@inject IJSRuntime JSRuntime
@inject InMemoryReportStorageWebExtension ReportStorage
@inject EnvelopeGenerator.ReceiverUI.Services.DocumentService DocumentService
<link href="_content/DevExpress.Blazor.Themes/blazing-berry.bs5.min.css" rel="stylesheet" />
<link href="_content/DevExpress.Blazor.Reporting.Viewer/css/dx-blazor-reporting-components.bs5.css" rel="stylesheet" />
@@ -119,7 +122,9 @@
</DxPopup>
<div class="receiver-viewer-wrapper">
@if(Report is not null) {
@if(!string.IsNullOrWhiteSpace(EnvelopeKey) && PdfBytes is { Length: > 0 }) {
<DxPdfViewer @key="ViewerKey" CssClass="w-100 h-100" DocumentContent="PdfBytes" />
} else if(Report is not null) {
<DxReportViewer @key="ViewerKey" @ref="reportViewer" Report="Report" RootCssClasses="w-100 h-100" />
}
</div>
@@ -127,6 +132,7 @@
</div>
@code {
const string SignatureTabDraw = "draw";
const string SignatureTabText = "text";
const string SignatureTabImage = "image";
@@ -143,8 +149,13 @@
("Cursive", "cursive")
};
DxReportViewer reportViewer;
[Parameter] public string? EnvelopeKey { get; set; }
DxReportViewer? reportViewer;
XtraReport? Report;
string PdfViewerUrl = string.Empty;
byte[]? PdfBytes;
byte[]? SignedPdfBytes;
bool SignatureApplied;
bool SignaturePopupVisible;
string? SignatureValidationMessage;
@@ -158,9 +169,35 @@
int ViewerKey;
protected override async Task OnInitializedAsync() {
Report = CreateReportInstance();
await Task.CompletedTask;
EnvelopeKey = null; // Force report generation for testing. Remove this line to enable EnvelopeKey-based loading.
if (!string.IsNullOrWhiteSpace(EnvelopeKey)) {
(PdfBytes, _) = await DocumentService.GetDocumentAsync(EnvelopeKey);
return;
}
Report = CreateReportInstance();
}
async Task<XtraReport?> BuildPdfReportAsync(string key) {
Console.WriteLine("BuildPdfReportAsync is invoked..");
var (pdfBytes, _) = await DocumentService.GetDocumentAsync(key);
Console.WriteLine($"[BuildPdfReport] key={key}, pdfBytes={pdfBytes?.Length ?? 0}");
if (pdfBytes is not { Length: > 0 })
return CreateReportInstance();
var report = new XtraReport();
var detail = new DevExpress.XtraReports.UI.DetailBand();
report.Bands.Add(detail);
var pdfContent = new DevExpress.XtraReports.UI.XRPdfContent { Source = pdfBytes, GenerateOwnPages = true };
detail.Controls.Add(pdfContent);
Console.WriteLine($"[BuildPdfReport] XRPdfContent added, Source length={pdfContent.Source?.Length ?? 0}");
ReportStorage.SetData(report, key);
var result = ReportStorage.TryGetReport(key, out var stored) ? stored : report;
Console.WriteLine($"[BuildPdfReport] TryGetReport success={stored is not null}, bands={result?.Bands?.Count}");
return result;
}
async Task OpenSignaturePopupAsync() {
@@ -244,10 +281,8 @@
PopupValidationMessage = null;
SignatureValidationMessage = null;
Report = CreateSignedReportInstance(signatureDataUrl, SignerFullName.Trim(), SignerPosition.Trim(), SignaturePlace.Trim());
SignatureApplied = true;
SignaturePopupVisible = false;
ViewerKey++;
}
async Task<string?> GetActiveSignatureDataUrlAsync() {
@@ -263,13 +298,30 @@
}
async Task ExportSignedPdfAsync() {
if(!SignatureApplied || Report is null) {
if(!SignatureApplied) {
SignatureValidationMessage = "Bitte fuegen Sie die Unterschrift zuerst zum Bericht hinzu.";
return;
}
try {
SignatureValidationMessage = null;
var signatureDataUrl = await GetActiveSignatureDataUrlAsync();
if(string.IsNullOrWhiteSpace(signatureDataUrl)) {
SignatureValidationMessage = "Die Unterschrift konnte nicht gelesen werden.";
return;
}
var signedKey = $"{EnvelopeKey}_signed";
var signedReport = new XtraReport();
var detail = new DevExpress.XtraReports.UI.DetailBand();
signedReport.Bands.Add(detail);
detail.Controls.Add(new DevExpress.XtraReports.UI.XRPdfContent { Source = PdfBytes });
ReportStorage.SetData(signedReport, signedKey);
Report = ReportStorage.TryGetReport(signedKey, out var stored) ? stored : signedReport;
ViewerKey++;
await InvokeAsync(StateHasChanged);
await Task.Delay(300);
await reportViewer.ExportToAsync(ExportFormat.Pdf);
} catch(Exception) {
SignatureValidationMessage = "Das signierte PDF konnte nicht exportiert werden. Bitte laden Sie die Seite neu und versuchen Sie es erneut.";
@@ -283,7 +335,8 @@
}
XtraReport CreateSignedReportInstance(string signatureDataUrl, string signerFullName, string signerPosition, string signaturePlace) {
var report = CreateReportInstance();
var baseReportName = string.IsNullOrWhiteSpace(EnvelopeKey) ? "LargeDatasetReport" : EnvelopeKey;
var report = ReportStorage.TryGetReport(baseReportName, out var stored) ? stored : CreateReportInstance();
AddSignature(report, signatureDataUrl, signerFullName, signerPosition, signaturePlace);
return report;
}
@@ -358,3 +411,4 @@
bottomMargin.Controls.Remove(control);
}
}