Refactor receiver suggestions filtering logic

Introduced `ReceiverSuggestionFilterHandler` to refine the
filtering of recent receiver suggestions based on name and
email. Added `SuggestionLimit` constant to replace hardcoded
limits and ensure consistency. Updated UI to use the new
`FilteredRecentSuggestions` property, which leverages the
`BuildFilteredRecentSuggestions` method for grouping,
ordering, and limiting suggestions. Adjusted
`OnDocumentSelectedAsync` to use the new constant. Added
necessary `@using` directive for the filter handler.
This commit is contained in:
2026-10-06 09:26:43 +02:00
parent 2a939b4cad
commit 60241c9c6d

View File

@@ -2,6 +2,7 @@
@using EnvelopeGenerator.Application.Common.Dto.Receiver @using EnvelopeGenerator.Application.Common.Dto.Receiver
@using EnvelopeGenerator.Application.Resources @using EnvelopeGenerator.Application.Resources
@using EnvelopeGenerator.Domain.Resources @using EnvelopeGenerator.Domain.Resources
@using EnvelopeGenerator.Server.Client.Components.Sender.ReceiverSuggestionFilter
@using EnvelopeGenerator.Server.Client.Services @using EnvelopeGenerator.Server.Client.Services
@using Microsoft.AspNetCore.Components.Forms @using Microsoft.AspNetCore.Components.Forms
@using Microsoft.Extensions.Localization @using Microsoft.Extensions.Localization
@@ -115,7 +116,7 @@
else if (_recentReceiverSuggestions.Count > 0) else if (_recentReceiverSuggestions.Count > 0)
{ {
<div class="sender-create-wizard__suggestion-list" role="listbox" aria-label="Recent receivers"> <div class="sender-create-wizard__suggestion-list" role="listbox" aria-label="Recent receivers">
@foreach (var suggestion in _recentReceiverSuggestions) @foreach (var suggestion in FilteredRecentSuggestions)
{ {
<button type="button" <button type="button"
class="sender-create-wizard__suggestion-item" class="sender-create-wizard__suggestion-item"
@@ -323,6 +324,8 @@
private bool _isLoadingRecentSuggestions; private bool _isLoadingRecentSuggestions;
private bool _recentSuggestionsLoaded; private bool _recentSuggestionsLoaded;
private const int SuggestionLimit = 20;
private byte[]? _documentBytes; private byte[]? _documentBytes;
private string? _documentFileName; private string? _documentFileName;
private string _documentSizeText = string.Empty; private string _documentSizeText = string.Empty;
@@ -338,6 +341,9 @@
private bool IsLastStep => _currentStep >= TotalSteps - 1; private bool IsLastStep => _currentStep >= TotalSteps - 1;
private bool CanSkipCurrentStep => _currentStep == 1; private bool CanSkipCurrentStep => _currentStep == 1;
private IReadOnlyList<RecentReceiverSuggestionDto> FilteredRecentSuggestions =>
BuildFilteredRecentSuggestions();
private string CurrentStepTitle => _currentStep switch private string CurrentStepTitle => _currentStep switch
{ {
0 => L("SenderWizard_Step_Basics", "Grunddaten"), 0 => L("SenderWizard_Step_Basics", "Grunddaten"),
@@ -472,6 +478,23 @@
return Task.CompletedTask; return Task.CompletedTask;
} }
private IReadOnlyList<RecentReceiverSuggestionDto> BuildFilteredRecentSuggestions()
{
if (_recentReceiverSuggestions.Count == 0)
return [];
var handler = new ReceiverSuggestionFilterHandler(_recentReceiverSuggestions);
var filtered = handler.Filter(_receiverName, _receiverEmail);
return filtered
.GroupBy(x => x.EmailAddress, StringComparer.OrdinalIgnoreCase)
.Select(g => g.OrderByDescending(x => x.LastUsedAt).First())
.OrderByDescending(x => x.LastUsedAt)
.ThenBy(x => x.EmailAddress, StringComparer.OrdinalIgnoreCase)
.Take(SuggestionLimit)
.ToList();
}
private async Task OnDocumentSelectedAsync(InputFileChangeEventArgs args) private async Task OnDocumentSelectedAsync(InputFileChangeEventArgs args)
{ {
if (IsActionLocked) if (IsActionLocked)
@@ -658,7 +681,7 @@
_isLoadingRecentSuggestions = true; _isLoadingRecentSuggestions = true;
try try
{ {
var suggestions = await ReceiverService.GetRecentReceiverSuggestionsAsync(20); var suggestions = await ReceiverService.GetRecentReceiverSuggestionsAsync(SuggestionLimit);
_recentReceiverSuggestions.Clear(); _recentReceiverSuggestions.Clear();
_recentReceiverSuggestions.AddRange(suggestions); _recentReceiverSuggestions.AddRange(suggestions);
_recentSuggestionsLoaded = true; _recentSuggestionsLoaded = true;
@@ -790,4 +813,5 @@
var uiValue = UiLocalizer[key]; var uiValue = UiLocalizer[key];
return uiValue.ResourceNotFound ? fallback : uiValue.Value; return uiValue.ResourceNotFound ? fallback : uiValue.Value;
} }
} }