From 6c40c48ac8288153307f4c741c2e8c50a46a1398 Mon Sep 17 00:00:00 2001 From: TekH Date: Fri, 12 Jun 2026 13:25:29 +0200 Subject: [PATCH] Add pages for sender/receiver login and homepage UI Added `EnvelopeSenderPage.razor` as a placeholder for the sender's dashboard. Updated `Index.razor` to include a homepage with a hero header, feature badges, and dynamic description rendering using JavaScript interop. Implemented `LoginReceiverPage.razor` for secure document access via access code, with error handling and user feedback for various login states. Implemented `LoginSenderPage.razor` for sender authentication, including error handling, password visibility toggle, and redirection to the sender dashboard. --- .../Pages/EnvelopeSenderPage.razor | 8 + .../Pages/Index.razor | 72 ++++++++ .../Pages/LoginReceiverPage.razor | 158 ++++++++++++++++ .../Pages/LoginSenderPage.razor | 172 ++++++++++++++++++ 4 files changed, 410 insertions(+) create mode 100644 EnvelopeGenerator.WebUI/EnvelopeGenerator.WebUI.Client/Pages/EnvelopeSenderPage.razor create mode 100644 EnvelopeGenerator.WebUI/EnvelopeGenerator.WebUI.Client/Pages/Index.razor create mode 100644 EnvelopeGenerator.WebUI/EnvelopeGenerator.WebUI.Client/Pages/LoginReceiverPage.razor create mode 100644 EnvelopeGenerator.WebUI/EnvelopeGenerator.WebUI.Client/Pages/LoginSenderPage.razor diff --git a/EnvelopeGenerator.WebUI/EnvelopeGenerator.WebUI.Client/Pages/EnvelopeSenderPage.razor b/EnvelopeGenerator.WebUI/EnvelopeGenerator.WebUI.Client/Pages/EnvelopeSenderPage.razor new file mode 100644 index 00000000..77316281 --- /dev/null +++ b/EnvelopeGenerator.WebUI/EnvelopeGenerator.WebUI.Client/Pages/EnvelopeSenderPage.razor @@ -0,0 +1,8 @@ +@page "/sender" +@rendermode InteractiveWebAssembly + +

EnvelopeSender

+ +@code { + +} diff --git a/EnvelopeGenerator.WebUI/EnvelopeGenerator.WebUI.Client/Pages/Index.razor b/EnvelopeGenerator.WebUI/EnvelopeGenerator.WebUI.Client/Pages/Index.razor new file mode 100644 index 00000000..1fa72b8e --- /dev/null +++ b/EnvelopeGenerator.WebUI/EnvelopeGenerator.WebUI.Client/Pages/Index.razor @@ -0,0 +1,72 @@ +@page "/" +@rendermode InteractiveWebAssembly +@inject IJSRuntime JS + + + +
+ +
+
+ + + +
+

SignFlow

+

Willkommen im eSign-Portal

+
+
+
+ +
+
+
+ +

+ +

+ +
+
+
+ + + + Sicherer Zugang +
+
+ + + + Digitale Unterschrift +
+
+ + + + + PDF-Export +
+
+
+ +
+
+
+ +
+ +@code { + private const string HomePageDescription = + "Das digitale Unterschriftenportal ist eine Plattform, die entwickelt wurde, um Ihre Dokumente sicher zu unterschreiben und zu verwalten. " + + "Mit seiner benutzerfreundlichen Oberfläche können Sie Ihre Dokumente schnell hochladen, die Unterschriftsprozesse verfolgen und Ihre digitalen Unterschriftenanwendungen einfach durchführen. " + + "Dieses Portal beschleunigt Ihren Arbeitsablauf mit rechtlich gültigen Unterschriften und erhöht gleichzeitig die Sicherheit Ihrer Dokumente."; + + protected override async Task OnAfterRenderAsync(bool firstRender) + { + if (firstRender) + { + await JS.InvokeVoidAsync("receiverSignature.startTyped", "home-description", HomePageDescription, 15); + } + } +} diff --git a/EnvelopeGenerator.WebUI/EnvelopeGenerator.WebUI.Client/Pages/LoginReceiverPage.razor b/EnvelopeGenerator.WebUI/EnvelopeGenerator.WebUI.Client/Pages/LoginReceiverPage.razor new file mode 100644 index 00000000..735d06ac --- /dev/null +++ b/EnvelopeGenerator.WebUI/EnvelopeGenerator.WebUI.Client/Pages/LoginReceiverPage.razor @@ -0,0 +1,158 @@ +@page "/envelope/login/{EnvelopeKey}" +@rendermode InteractiveWebAssembly +@using EnvelopeGenerator.WebUI.Client.Services +@inject AuthService AuthService +@inject NavigationManager Navigation + + + +
+ +
+ +@code { + [Parameter] public string EnvelopeKey { get; set; } = string.Empty; + + string AccessCode = string.Empty; + bool ShowCode; + bool IsLoading; + EnvelopeLoginResult? LoginResult; + + async Task OnKeyDownAsync(Microsoft.AspNetCore.Components.Web.KeyboardEventArgs e) { + if (e.Key == "Enter") + await SubmitAsync(); + } + + async Task SubmitAsync() { + if (string.IsNullOrWhiteSpace(AccessCode) || IsLoading) return; + + IsLoading = true; + LoginResult = null; + await InvokeAsync(StateHasChanged); + + var result = await AuthService.LoginEnvelopeReceiverAsync(EnvelopeKey, AccessCode.Trim()); + + if (result == EnvelopeLoginResult.Success) { + Navigation.NavigateTo($"/envelope/{Uri.EscapeDataString(EnvelopeKey)}", forceLoad: true); + return; + } + + LoginResult = result; + IsLoading = false; + await InvokeAsync(StateHasChanged); + } +} diff --git a/EnvelopeGenerator.WebUI/EnvelopeGenerator.WebUI.Client/Pages/LoginSenderPage.razor b/EnvelopeGenerator.WebUI/EnvelopeGenerator.WebUI.Client/Pages/LoginSenderPage.razor new file mode 100644 index 00000000..8c93d6b2 --- /dev/null +++ b/EnvelopeGenerator.WebUI/EnvelopeGenerator.WebUI.Client/Pages/LoginSenderPage.razor @@ -0,0 +1,172 @@ +@page "/sender/login" +@rendermode InteractiveWebAssembly +@using EnvelopeGenerator.WebUI.Client.Services +@inject AuthService AuthService +@inject NavigationManager Navigation + + + +
+ +
+ +@code { + string Username = string.Empty; + string Password = string.Empty; + bool ShowPassword; + bool IsLoading; + SenderLoginResult? LoginResult; + + async Task OnKeyDownAsync(Microsoft.AspNetCore.Components.Web.KeyboardEventArgs e) { + if (e.Key == "Enter") + await SubmitAsync(); + } + + async Task SubmitAsync() { + if (string.IsNullOrWhiteSpace(Username) || string.IsNullOrWhiteSpace(Password) || IsLoading) return; + + IsLoading = true; + LoginResult = null; + await InvokeAsync(StateHasChanged); + + var result = await AuthService.LoginSenderAsync(Username.Trim(), Password.Trim()); + + if (result == SenderLoginResult.Success) { + Navigation.NavigateTo("/sender", forceLoad: true); + return; + } + + LoginResult = result; + IsLoading = false; + await InvokeAsync(StateHasChanged); + } +}