Add filter for recent receiver suggestions

Introduced a filter input box in `CreateEnvelopeWizardPopup.razor` to allow users to search recent receiver suggestions dynamically. Added `_receiverSuggestionFilterText` property and `OnReceiverSuggestionFilterChanged` method to handle filtering logic.

Refactored `ReceiverSuggestionFilterHandler` to simplify its API. Updated the `Filter` method to accept a single query string and removed redundant overloads. Improved filtering logic to match `FullName` or `EmailAddress` using case-sensitive comparison.

These changes enhance usability by enabling quick filtering of receiver suggestions.
This commit is contained in:
2026-11-09 13:14:31 +01:00
parent 11e72bac53
commit ceb2860883
2 changed files with 28 additions and 14 deletions

View File

@@ -252,8 +252,14 @@
}
else if (_currentStep == 1)
{
<div class="sender-create-wizard__suggestions">
<div class="sender-create-wizard__suggestions-title">@L("SenderWizard_RecentReceivers", "Zuletzt verwendete Empfänger")</div>
<div class="sender-create-wizard__suggestions">
<div class="sender-create-wizard__suggestions-title">@L("SenderWizard_RecentReceivers", "Zuletzt verwendete Empfänger")</div>
<DxTextBox Text="@_receiverSuggestionFilterText"
TextChanged="OnReceiverSuggestionFilterChanged"
BindValueMode="BindValueMode.OnInput"
NullText='@L("SenderWizard_FilterRecentReceivers_Placeholder", "Empfänger in Vorschlägen filtern...")'
CssClass="w-100" />
@if (_isLoadingRecentSuggestions)
{
@@ -512,6 +518,7 @@
private string _receiverName = string.Empty;
private string _receiverEmail = string.Empty;
private string _receiverSuggestionFilterText = string.Empty;
private readonly List<CreateEnvelopeWizardReceiver> _receivers = [];
private IEnumerable<string> _receiverTags = [];
private readonly List<RecentReceiverSuggestionDto> _recentReceiverSuggestions = [];
@@ -611,6 +618,13 @@
return Task.CompletedTask;
}
private Task OnReceiverSuggestionFilterChanged(string? value)
{
_receiverSuggestionFilterText = value ?? string.Empty;
_validationMessage = null;
return Task.CompletedTask;
}
private Task OnEnvelopeTypeChanged(ChangeEventArgs args)
{
_validationMessage = null;
@@ -696,7 +710,10 @@
return [];
var handler = new ReceiverSuggestionFilterHandler(_recentReceiverSuggestions);
var filtered = handler.Filter(_receiverName, _receiverEmail);
var filterText = _receiverSuggestionFilterText.Trim();
var filtered = string.IsNullOrWhiteSpace(filterText)
? _recentReceiverSuggestions
: handler.Filter(filterText);
return filtered
.GroupBy(x => x.EmailAddress, StringComparer.OrdinalIgnoreCase)
@@ -1213,6 +1230,7 @@
_receiverName = string.Empty;
_receiverEmail = string.Empty;
_receiverSuggestionFilterText = string.Empty;
_receivers.Clear();
_receiverTags = [];
_recentReceiverSuggestions.Clear();

View File

@@ -4,23 +4,19 @@ namespace EnvelopeGenerator.Server.Client.Components.Sender.ReceiverSuggestionFi
public class ReceiverSuggestionFilterHandler(IEnumerable<RecentReceiverSuggestionDto> suggestions)
{
private readonly IReadOnlyList<Entry> _entries = suggestions
private readonly IReadOnlyList<Entry> _entries = [.. suggestions
.Where(x => !string.IsNullOrWhiteSpace(x.FullName) && !string.IsNullOrWhiteSpace(x.EmailAddress))
.Select(x => new Entry(new ReceiverFilterCriteria(x.FullName, x.EmailAddress), x))
.ToList();
.Select(x => new Entry(new ReceiverFilterCriteria(x.FullName, x.EmailAddress), x))];
private readonly record struct Entry(ReceiverFilterCriteria Criteria, RecentReceiverSuggestionDto Suggestion);
public IEnumerable<RecentReceiverSuggestionDto> Filter(ReceiverFilterCriteria criteria)
public IEnumerable<RecentReceiverSuggestionDto> Filter(string query)
{
var normalizedQuery = new ReceiverFilterCriteria(query, query);
return _entries
.Where(x => x.Criteria.Matches(criteria))
.Where(x =>
x.Criteria.FullName.Contains(normalizedQuery.FullName, StringComparison.Ordinal)
|| x.Criteria.EmailAddress.Contains(normalizedQuery.EmailAddress, StringComparison.Ordinal))
.Select(x => x.Suggestion);
}
public IEnumerable<RecentReceiverSuggestionDto> Filter(string fullName, string emailAddress)
{
var criteria = new ReceiverFilterCriteria(fullName, emailAddress);
return Filter(criteria);
}
}