From 47c4f33dfc9531b8c33f3ed77db24efe616d1242 Mon Sep 17 00:00:00 2001 From: TekH Date: Wed, 11 Nov 2026 14:07:19 +0100 Subject: [PATCH] Refactor and enhance SenderPage grid and UI behavior Refactored the `DxGrid` component in `SenderPage.razor` to improve readability, maintainability, and user experience. Added new grid properties like `HighlightRowOnHover` and `DetailExpandButtonDisplayMode`. Simplified and reorganized column and template structures. Enhanced detail row behavior to handle row expansion and collapse more intuitively. Updated receiver and history displays with progress bars, badges, and improved styling. Performed code cleanup by removing redundant blocks, consolidating logic, and eliminating unused variables. Refactored `ThemeService.LoadFromServerAsync` for better readability. Made minor adjustments to the `CreateEnvelopeWizardPopup` configuration and improved general UI elements for better alignment, spacing, and styling. --- .../Pages/SenderPage.razor | 424 +++++++++--------- 1 file changed, 219 insertions(+), 205 deletions(-) diff --git a/EnvelopeGenerator.Server/EnvelopeGenerator.Server.Client/Pages/SenderPage.razor b/EnvelopeGenerator.Server/EnvelopeGenerator.Server.Client/Pages/SenderPage.razor index ea9d172a..1332b47b 100644 --- a/EnvelopeGenerator.Server/EnvelopeGenerator.Server.Client/Pages/SenderPage.razor +++ b/EnvelopeGenerator.Server/EnvelopeGenerator.Server.Client/Pages/SenderPage.razor @@ -223,215 +223,223 @@
- - - - @((cellContext.DataItem as EnvelopeDto)?.Id) - - - - - @((cellContext.DataItem as EnvelopeDto)?.Title) - - - - - - - - @{ - var envelope = cellContext.DataItem as EnvelopeDto; - if (envelope != null) - { - var statusInfo = GetStatusInfo(GetEffectiveEnvelopeStatus(envelope)); -
- - @statusInfo.Label -
- } - } -
-
- - - @{ - var envelope = cellContext.DataItem as EnvelopeDto; - if (envelope != null) - { - var receivers = envelope.EnvelopeReceivers?.ToList() ?? []; - var signed = GetSignedReceiverCount(envelope); - var total = receivers.Count; -
- - @signed / @total @L("Signed", "unterschrieben") - - @if (total > 0) - { -
-
-
- } -
- } - } -
-
- - - -
- -
-
@L("Receiver", "Empfänger")
+ Data="@CurrentGridData" + @ref="_grid" + KeyFieldName="Id" + ShowFilterRow="false" + FilterMenuButtonDisplayMode="GridFilterMenuButtonDisplayMode.Always" + ShowSearchBox="true" + AllowColumnReorder="true" + AllowSort="true" + ColumnResizeMode="GridColumnResizeMode.ColumnsContainer" + PageSize="20" + PagerVisible="true" + SelectionMode="GridSelectionMode.Single" + AllowSelectRowByClick="true" + SelectedDataItem="@_selectedEnvelope" + SelectedDataItemChanged="@((object o) => _selectedEnvelope = o as EnvelopeDto)" + RowClick="OnRowClick" + RowDoubleClick="OnRowDoubleClick" + CustomizeElement="OnCustomizeElement" + LayoutAutoLoading="OnGridLayoutAutoLoading" + LayoutAutoSaving="OnGridLayoutAutoSaving" + HighlightRowOnHover="true" + AutoCollapseDetailRow=true + DetailExpandButtonDisplayMode="GridDetailExpandButtonDisplayMode.Auto"> + + + + @((cellContext.DataItem as EnvelopeDto)?.Id) + + + + + @((cellContext.DataItem as EnvelopeDto)?.Title) + + + + + + + @{ - var envelope = detailContext.DataItem as EnvelopeDto; - if (envelope?.EnvelopeReceivers?.Any() == true) + var envelope = cellContext.DataItem as EnvelopeDto; + if (envelope != null) { -
- @foreach (var receiver in envelope.EnvelopeReceivers) - { -
- @{ - var isRejected = IsReceiverRejected(envelope, receiver); - var isSigned = IsReceiverSigned(envelope, receiver); - var accessCode = receiver.AccessCode; - var hasAccessCode = !string.IsNullOrWhiteSpace(accessCode); - var hasReceiverEnvelopeUrl = CanOpenReceiverEnvelopeUrl(envelope, receiver); - } - - @if (isRejected) - { - - - - @GetStatusLabel(EnvelopeStatus.DocumentRejected) - } - else if (isSigned) - { - - - - @L("Signed", "Unterschrieben") - } - else - { - - - - - @L("Pending", "Ausstehend") - } - -
- @receiver.Name - @receiver.Receiver?.EmailAddress -
-
- @L("AccessCode", "Access code") -
- - - @if (_canUseReceiverEnvelopeUrl) - { - - } -
-
-
- } -
- } - else - { -

@L("Sender_NoReceivers", "Keine Empfänger")

+ var statusInfo = GetStatusInfo(GetEffectiveEnvelopeStatus(envelope)); +
+ + @statusInfo.Label +
} } - -
@L("History", "Historie")
+
+
+ + @{ - var historyEntries = envelope is null - ? Enumerable.Empty() - : GetOrderedHistories(envelope); - if (historyEntries.Any()) + var envelope = cellContext.DataItem as EnvelopeDto; + if (envelope != null) { -
- @foreach (var history in historyEntries) + var receivers = envelope.EnvelopeReceivers?.ToList() ?? []; + var signed = GetSignedReceiverCount(envelope); + var total = receivers.Count; +
+ + @signed / @total @L("Signed", "unterschrieben") + + @if (total > 0) { - var statusInfo = GetStatusInfo(history.Status); -
-
-
- - @statusInfo.Label -
- @GetHistoryActor(history) -
-
- @GetHistoryDate(history).ToString("dd.MM.yyyy HH:mm") -
+
+
}
} - else - { -

@L("Sender_NoHistory", "Keine Historie vorhanden")

- } } -
- - + + + + + + + +
+
@L("Receiver", "Empfänger")
+ @{ + var envelope = detailContext.DataItem as EnvelopeDto; + if(envelope is not null && _grid is not null) + { + _grid.SelectDataItem(envelope); + // _grid!.SelectedDataItem = envelope!; + } + + if (envelope?.EnvelopeReceivers?.Any() == true) + { +
+ @foreach (var receiver in envelope.EnvelopeReceivers) + { +
+ @{ + var isRejected = IsReceiverRejected(envelope, receiver); + var isSigned = IsReceiverSigned(envelope, receiver); + var accessCode = receiver.AccessCode; + var hasAccessCode = !string.IsNullOrWhiteSpace(accessCode); + var hasReceiverEnvelopeUrl = CanOpenReceiverEnvelopeUrl(envelope, receiver); + } + + @if (isRejected) + { + + + + @GetStatusLabel(EnvelopeStatus.DocumentRejected) + } + else if (isSigned) + { + + + + @L("Signed", "Unterschrieben") + } + else + { + + + + + @L("Pending", "Ausstehend") + } + +
+ @receiver.Name + @receiver.Receiver?.EmailAddress +
+
+ @L("AccessCode", "Access code") +
+ + + @if (_canUseReceiverEnvelopeUrl) + { + + } +
+
+
+ } +
+ } + else + { +

@L("Sender_NoReceivers", "Keine Empfänger")

+ } + } + +
@L("History", "Historie")
+ @{ + var historyEntries = envelope is null + ? Enumerable.Empty() + : GetOrderedHistories(envelope); + if (historyEntries.Any()) + { +
+ @foreach (var history in historyEntries) + { + var statusInfo = GetStatusInfo(history.Status); +
+
+
+ + @statusInfo.Label +
+ @GetHistoryActor(history) +
+
+ @GetHistoryDate(history).ToString("dd.MM.yyyy HH:mm") +
+
+ } +
+ } + else + { +

@L("Sender_NoHistory", "Keine Historie vorhanden")

+ } + } +
+
+
} @@ -440,9 +448,9 @@
+ VisibleChanged="OnCreateWizardVisibleChangedAsync" + EnvelopeTypes="@_envelopeTypes" + StartEditorRequested="StartEditorFromWizardAsync" /> @* ── PDF Vorschau Popup ────────────────────────────────────────────────── *@ { - try { await ThemeService.LoadFromServerAsync(); } - catch { /* swallow — default theme remains active */ } + try { await ThemeService.LoadFromServerAsync(); } + catch { /* swallow — default theme remains active */ } }); var featureTask = EnvelopeReceiverService.GetReceiverEnvelopeUrlFeatureEnabledAsync(); @@ -1080,13 +1088,19 @@ var clicked = e.Grid.GetDataItem(e.VisibleIndex) as EnvelopeDto; if (clicked == null) return; - if (_selectedEnvelope?.Id == clicked.Id) + if (e.Grid.IsDetailRowExpanded(e.VisibleIndex)) { - // Same row clicked again → deselect + // Already expanded → collapse and deselect + e.Grid.CollapseDetailRow(e.VisibleIndex); _selectedEnvelope = null; e.Grid.DeselectDataItem(clicked); } - // Different row: @bind-SelectedDataItem already updated _selectedEnvelope + else + { + // Collapsed → expand and select + e.Grid.SelectDataItem(clicked); + e.Grid.ExpandDetailRow(e.VisibleIndex); + } } // Double-click: select the row and open preview popup