From e3d2225a448d7c39471edcb4a366cbc6028e6a52 Mon Sep 17 00:00:00 2001 From: TekH Date: Thu, 5 Nov 2026 15:22:21 +0100 Subject: [PATCH] Refactor and enhance envelope wizard with MudBlazor Replaced custom wizard UI with MudBlazor's MudStepper for a modern and consistent design. Added dynamic step titles, descriptions, and forms for envelope creation, including advanced settings like certification, reminders, and email notifications. Integrated PDF upload with preview functionality. Refactored `CreateEnvelopeWizardPopup.razor` for better maintainability and modularity. Removed redundant code and centralized step-related logic. Improved localization, accessibility, and user experience. Updated `EnvelopeGenerator.Server.Client.csproj` and `EnvelopeGenerator.Server.csproj` to include MudBlazor. Registered MudBlazor services in `Program.cs` and added required CSS/JS in `App.razor`. Updated styles in `sender-page.css` to align with the new stepper design. --- .../EnvelopeNotificationService.cs | 3 - .../Sender/CreateEnvelopeWizardPopup.razor | 657 +++++++++--------- .../EnvelopeGenerator.Server.Client.csproj | 1 + .../Program.cs | 2 + .../Components/App.razor | 2 + .../EnvelopeGenerator.Server.csproj | 1 + .../EnvelopeGenerator.Server/Program.cs | 2 + .../wwwroot/css/sender-page.css | 80 ++- 8 files changed, 390 insertions(+), 358 deletions(-) diff --git a/EnvelopeGenerator.Infrastructure.Notification/EnvelopeNotificationService.cs b/EnvelopeGenerator.Infrastructure.Notification/EnvelopeNotificationService.cs index 595caea0..4209a03c 100644 --- a/EnvelopeGenerator.Infrastructure.Notification/EnvelopeNotificationService.cs +++ b/EnvelopeGenerator.Infrastructure.Notification/EnvelopeNotificationService.cs @@ -1,9 +1,6 @@ using DigitalData.Core.Abstraction.Application.Repository; -using DigitalData.MessagingService.Application.Common.Dto; using DigitalData.MessagingService.Application.Common.Interfaces; using DigitalData.MessagingService.Application.EmailSending.Commands; -using DigitalData.MessagingService.Client; -using DigitalData.MessagingService.Domain.Entities; using EnvelopeGenerator.Application.Common.Interfaces.Services.Notification; using EnvelopeGenerator.Domain.Constants; using EnvelopeGenerator.Domain.Entities; diff --git a/EnvelopeGenerator.Server/EnvelopeGenerator.Server.Client/Components/Sender/CreateEnvelopeWizardPopup.razor b/EnvelopeGenerator.Server/EnvelopeGenerator.Server.Client/Components/Sender/CreateEnvelopeWizardPopup.razor index 2d86320e..bab1bd41 100644 --- a/EnvelopeGenerator.Server/EnvelopeGenerator.Server.Client/Components/Sender/CreateEnvelopeWizardPopup.razor +++ b/EnvelopeGenerator.Server/EnvelopeGenerator.Server.Client/Components/Sender/CreateEnvelopeWizardPopup.razor @@ -5,6 +5,7 @@ @using EnvelopeGenerator.Domain.Resources @using EnvelopeGenerator.Server.Client.Components.Sender.ReceiverSuggestionFilter @using EnvelopeGenerator.Server.Client.Services +@using MudBlazor @using Microsoft.AspNetCore.Components.Forms @using Microsoft.Extensions.Localization @inject IStringLocalizer ModelLocalizer @@ -27,333 +28,341 @@
-
-
- @for (var step = 0; step < TotalSteps; step++) - { - var isActive = step == _currentStep; - var isDone = step < _currentStep; -
- @(step + 1) -
- } -
+ + + + @for (var step = 0; step < TotalSteps; step++) + { + var stepIndex = step; -
-
@CurrentStepTitle
-
@CurrentStepDescription
-
+ +
@GetStepDescription(stepIndex)
+ + @if (stepIndex == _currentStep) + { +
+ @if (_currentStep == 0) + { +
+
+ + +
+ +
+ + +
+
+ } + else if (_currentStep == 1) + { +
+
+ + +
+ +
+ + +
+
+ } + else if (_currentStep == 2) + { +
+
+
+ @L("SenderEditor_EnvelopeSettings", "Envelope-Einstellungen") +
+ +
+
+ + +
+ +
+ + +
+ +
+ + +
+ +
+
+ + +
+
+
+
+ +
+
+ @L("SendReminderEmails", "Erinnerungs-E-Mails senden") +
+ +
+
+ +
+ +
+ + +
+ +
+ + +
+ +
+ + +
+ +
+ + +
+
+
+
+ } + else if (_currentStep == 3) + { +
+
@L("SenderWizard_RecentReceivers", "Zuletzt verwendete Empfänger")
+ + @if (_isLoadingRecentSuggestions) + { +
@L("Loading", "Lädt...")
+ } + else if (_recentReceiverSuggestions.Count > 0) + { +
+ @foreach (var suggestion in FilteredRecentSuggestions) + { + + } +
+ } +
+ +
+
+ + +
+ +
+ + +
+
+ +
+ +
+ + @if (_receivers.Count == 0) + { +
+ @L("SenderEditor_NoReceiversAdded", "Noch keine Empfänger hinzugefügt.") +
+ } + else + { +
+ + + +
+ @if (tagContext.DataItem is CreateEnvelopeWizardReceiver receiver) + { + @receiver.FullName + @receiver.EmailAddress + } + else + { + @tagContext.DisplayText + } + +
+
+ +
+
+
+
+ } + } + else + { +
+ + + @if (_documentBytes is not null) + { +
+
+
@_documentFileName
+
@_documentSizeText
+
+
+ +
+
+ } + else + { + + } +
+ } +
+ } +
+ } +
+
+
@if (!string.IsNullOrWhiteSpace(_validationMessage)) {
@_validationMessage
} - @if (_currentStep == 0) - { -
-
- - -
- -
- - -
-
- } - else if (_currentStep == 1) - { -
-
- - -
- -
- - -
-
- } - else if (_currentStep == 2) - { -
-
-
- @L("SenderEditor_EnvelopeSettings", "Envelope-Einstellungen") -
- -
-
- - -
- -
- - -
- -
- - -
- -
-
- - -
-
-
-
- -
-
- @L("SendReminderEmails", "Erinnerungs-E-Mails senden") -
- -
-
- -
- -
- - -
- -
- - -
- -
- - -
- -
- - -
-
-
-
- } - else if (_currentStep == 3) - { -
-
@L("SenderWizard_RecentReceivers", "Zuletzt verwendete Empfänger")
- - @if (_isLoadingRecentSuggestions) - { -
@L("Loading", "Lädt...")
- } - else if (_recentReceiverSuggestions.Count > 0) - { -
- @foreach (var suggestion in FilteredRecentSuggestions) - { - - } -
- } -
- -
-
- - -
- -
- - -
-
- -
- -
- - @if (_receivers.Count == 0) - { -
- @L("SenderEditor_NoReceiversAdded", "Noch keine Empfänger hinzugefügt.") -
- } - else - { -
- - - -
- @if (tagContext.DataItem is CreateEnvelopeWizardReceiver receiver) - { - @receiver.FullName - @receiver.EmailAddress - } - else - { - @tagContext.DisplayText - } - -
-
- -
-
-
-
- } - } - else - { -
- - - @if (_documentBytes is not null) - { -
-
-
@_documentFileName
-
@_documentSizeText
-
-
- -
-
- } - else - { - - } -
- }
@@ -465,7 +474,11 @@ ? $"data:application/pdf;base64,{Convert.ToBase64String(_documentBytes)}" : null; - private string CurrentStepTitle => _currentStep switch + private string CurrentStepTitle => GetStepTitle(_currentStep); + + private string CurrentStepDescription => GetStepDescription(_currentStep); + + private string GetStepTitle(int step) => step switch { 0 => L("SenderWizard_Step_Basics", "Grunddaten"), 1 => L("SenderWizard_Step_Message", "Nachricht und Optionen"), @@ -475,7 +488,7 @@ _ => L("SenderWizard_Step_Basics", "Grunddaten") }; - private string CurrentStepDescription => _currentStep switch + private string GetStepDescription(int step) => step switch { 0 => L("SenderWizard_Step_Basics_Desc", "Starten Sie mit den Pflichtangaben für den Umschlag."), 1 => L("SenderWizard_Step_Message_Desc", "Fügen Sie optionale Nachricht und Einstellungen hinzu."), diff --git a/EnvelopeGenerator.Server/EnvelopeGenerator.Server.Client/EnvelopeGenerator.Server.Client.csproj b/EnvelopeGenerator.Server/EnvelopeGenerator.Server.Client/EnvelopeGenerator.Server.Client.csproj index b00ba988..79d4555f 100644 --- a/EnvelopeGenerator.Server/EnvelopeGenerator.Server.Client/EnvelopeGenerator.Server.Client.csproj +++ b/EnvelopeGenerator.Server/EnvelopeGenerator.Server.Client/EnvelopeGenerator.Server.Client.csproj @@ -12,6 +12,7 @@ + diff --git a/EnvelopeGenerator.Server/EnvelopeGenerator.Server.Client/Program.cs b/EnvelopeGenerator.Server/EnvelopeGenerator.Server.Client/Program.cs index 24e5a89d..46c37a95 100644 --- a/EnvelopeGenerator.Server/EnvelopeGenerator.Server.Client/Program.cs +++ b/EnvelopeGenerator.Server/EnvelopeGenerator.Server.Client/Program.cs @@ -1,6 +1,7 @@ using Microsoft.AspNetCore.Components.WebAssembly.Hosting; using EnvelopeGenerator.Server.Client.Services; using EnvelopeGenerator.Server.Client.Options; +using MudBlazor.Services; using DevExpress.Blazor.Reporting; using DevExpress.XtraReports.Web.Extensions; using DevExpress.DataAccess.Web; @@ -16,6 +17,7 @@ CultureInfo.DefaultThreadCurrentCulture = cultureInfo; CultureInfo.DefaultThreadCurrentUICulture = cultureInfo; builder.Services.AddLocalization(); +builder.Services.AddMudServices(); // Named HttpClient for API calls (both for services and DevExpress components) builder.Services.AddHttpClient("EnvelopeGenerator.Server", client => diff --git a/EnvelopeGenerator.Server/EnvelopeGenerator.Server/Components/App.razor b/EnvelopeGenerator.Server/EnvelopeGenerator.Server/Components/App.razor index 6d5ebdc4..24351640 100644 --- a/EnvelopeGenerator.Server/EnvelopeGenerator.Server/Components/App.razor +++ b/EnvelopeGenerator.Server/EnvelopeGenerator.Server/Components/App.razor @@ -9,6 +9,7 @@ +