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:
@@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user