From 8cbdee2491015080ae70d5267a29698c03e0cdce Mon Sep 17 00:00:00 2001 From: TekH Date: Fri, 12 Jun 2026 21:52:52 +0200 Subject: [PATCH] Integrate DevExpress and enhance app services Added DevExpress WASM components for PDF and report viewing, including Blazor PDF Viewer and Report Viewer. Configured DevExpress Blazor Reporting for development mode and registered custom reporting services and trusted classes for deserialization. Replaced default `HttpClient` with a scoped service using WebUI's YARP proxy. Introduced configuration options for `ApiOptions` and `PdfViewerOptions` and registered multiple business services in the DI container. Added in-memory report storage and font loading functionality. Updated `_Imports.razor` with additional namespaces. Re-enabled and implemented previously commented-out configuration options and removed obsolete code. --- .../EnvelopeGenerator.WebUI.Client/Program.cs | 52 ++++++++++++++++++- .../_Imports.razor | 7 +++ .../EnvelopeGenerator.WebUI/Program.cs | 11 ++-- 3 files changed, 63 insertions(+), 7 deletions(-) diff --git a/EnvelopeGenerator.WebUI/EnvelopeGenerator.WebUI.Client/Program.cs b/EnvelopeGenerator.WebUI/EnvelopeGenerator.WebUI.Client/Program.cs index 519269f2..496f0f1a 100644 --- a/EnvelopeGenerator.WebUI/EnvelopeGenerator.WebUI.Client/Program.cs +++ b/EnvelopeGenerator.WebUI/EnvelopeGenerator.WebUI.Client/Program.cs @@ -1,5 +1,55 @@ using Microsoft.AspNetCore.Components.WebAssembly.Hosting; +using EnvelopeGenerator.WebUI.Client.Services; +using EnvelopeGenerator.WebUI.Client.Options; +using DevExpress.Blazor.Reporting; +using DevExpress.XtraReports.Web.Extensions; +using DevExpress.DataAccess.Web; +using DevExpress.XtraReports.Services; var builder = WebAssemblyHostBuilder.CreateDefault(args); -await builder.Build().RunAsync(); +// HTTP Client (uses WebUI's YARP proxy) +builder.Services.AddScoped(sp => new HttpClient { + BaseAddress = new Uri(builder.HostEnvironment.BaseAddress) +}); + +// Configuration Options +builder.Services.Configure(opts => + builder.Configuration.GetSection(ApiOptions.SectionName).Bind(opts)); +builder.Services.Configure(opts => + builder.Configuration.GetSection(PdfViewerOptions.SectionName).Bind(opts)); + +// Business Services +builder.Services.AddScoped(); +builder.Services.AddScoped(); +builder.Services.AddScoped(); +builder.Services.AddScoped(); +builder.Services.AddScoped(); +builder.Services.AddScoped(); +builder.Services.AddSingleton(); + +// DevExpress WASM +builder.Services.AddDevExpressWebAssemblyBlazorPdfViewer(); +builder.Services.AddDevExpressWebAssemblyBlazorReportViewer(); + +builder.Services.AddDevExpressBlazorReportingWebAssembly(configure => { + configure.UseDevelopmentMode(); +}); + +// Reporting Services +builder.Services.AddScoped(); +builder.Services.AddScoped(); +builder.Services.AddScoped(); + +DevExpress.Utils.DeserializationSettings.RegisterTrustedClass(typeof(EnvelopeGenerator.WebUI.Client.Data.DataItemList)); +DevExpress.Utils.DeserializationSettings.RegisterTrustedClass(typeof(EnvelopeGenerator.WebUI.Client.PredefinedReports.Report)); + +builder.Services.AddSingleton(); +builder.Services.AddSingleton(sp => sp.GetRequiredService()); +builder.Services.AddScoped(); + +ReportStorageWebExtension.RegisterExtensionGlobal(new InMemoryReportStorageWebExtension()); + +var host = builder.Build(); +await FontLoader.LoadFonts(host.Services.GetRequiredService(), new List { "opensans.ttf" }); +await host.RunAsync(); diff --git a/EnvelopeGenerator.WebUI/EnvelopeGenerator.WebUI.Client/_Imports.razor b/EnvelopeGenerator.WebUI/EnvelopeGenerator.WebUI.Client/_Imports.razor index 9b33eab0..287f87f1 100644 --- a/EnvelopeGenerator.WebUI/EnvelopeGenerator.WebUI.Client/_Imports.razor +++ b/EnvelopeGenerator.WebUI/EnvelopeGenerator.WebUI.Client/_Imports.razor @@ -5,5 +5,12 @@ @using Microsoft.AspNetCore.Components.Web @using static Microsoft.AspNetCore.Components.Web.RenderMode @using Microsoft.AspNetCore.Components.Web.Virtualization +@using Microsoft.AspNetCore.Components.WebAssembly.Http @using Microsoft.JSInterop @using EnvelopeGenerator.WebUI.Client +@using EnvelopeGenerator.WebUI.Client.Services +@using EnvelopeGenerator.WebUI.Client.Models +@using EnvelopeGenerator.WebUI.Client.Options +@using DevExpress.Blazor +@using DevExpress.Blazor.PdfViewer +@using DevExpress.Blazor.Reporting diff --git a/EnvelopeGenerator.WebUI/EnvelopeGenerator.WebUI/Program.cs b/EnvelopeGenerator.WebUI/EnvelopeGenerator.WebUI/Program.cs index 19799648..d96b7f29 100644 --- a/EnvelopeGenerator.WebUI/EnvelopeGenerator.WebUI/Program.cs +++ b/EnvelopeGenerator.WebUI/EnvelopeGenerator.WebUI/Program.cs @@ -18,13 +18,12 @@ builder.Services.AddReverseProxy() // DevExpress Server-Side Services (CRITICAL for DxPdfViewer) builder.Services.AddDevExpressBlazor(configure => configure.BootstrapVersion = BootstrapVersion.v5); builder.Services.AddDevExpressServerSideBlazorPdfViewer(); -// builder.Services.AddDevExpressBlazorReportViewer(); // Will be enabled after Options migration -// Configuration Options (will be enabled in Phase 5 after Options migration) -// builder.Services.Configure( -// builder.Configuration.GetSection("ApiOptions")); -// builder.Services.Configure( -// builder.Configuration.GetSection("PdfViewerOptions")); +// Configuration Options +builder.Services.Configure( + builder.Configuration.GetSection("ApiOptions")); +builder.Services.Configure( + builder.Configuration.GetSection("PdfViewerOptions")); var app = builder.Build();