Files
NewMudForms.RCL/Components/NewMudAutoComplete.razor
T
2026-08-07 02:17:23 +03:00

82 lines
2.4 KiB
Plaintext

@typeparam TModel
@typeparam TId
<MudAutocomplete Variant="Variant" Clearable="true" T="TModel" Label="@Label" @bind-Value="Model" SearchFunc="Search"
OnClearButtonClick="() =>{ Model = default(TModel); Value = default(TId); ValueChanged.InvokeAsync(Value);}"
Strict="false" ToStringFunc="GetName">
</MudAutocomplete>
@code {
[Parameter] public Variant Variant { get; set; }
[Parameter] public string Label { get; set; }
[Parameter] public Func<TModel, string> GetName { get; set; }
[Parameter] public EventCallback<string> NameChanged { get; set; }
[Parameter] public Func<Task<List<TModel>>> GetDataFunc { get; set; }
IEnumerable<TModel> models;
[Parameter] public TId Value { get; set; }
[Parameter] public EventCallback<TId> ValueChanged { get; set; }
private TModel model;
TModel Model
{
get
{
return model;
}
set
{
model = value;
Value = (TId)(typeof(TModel).GetProperty("Id").GetValue(model));
InvokeAsync(async () => await ValueChanged.InvokeAsync(Value));
InvokeAsync(async () => await NameChanged.InvokeAsync(GetName(model)));
}
}
protected override async Task OnInitializedAsync()
{
models = await GetDataFunc();
if (model != null)
await NameChanged.InvokeAsync(GetName(model));
}
private async Task<IEnumerable<TModel>> Search(string text, CancellationToken cancellationToken)
{
return await Task.Run(() =>
{
// If text is null or empty, return no results
if (string.IsNullOrWhiteSpace(text))
return models;
// Split the search text into parts
var searchParts = text.Split(new[] { ' ' }, StringSplitOptions.RemoveEmptyEntries);
return models.Where(model =>
{
// Get the name of the model
string modelName = GetName(model);
// Split the model name into parts
var modelNameParts = modelName.Split(new[] { ' ' }, StringSplitOptions.RemoveEmptyEntries);
// Check if ALL search parts exist in the model name parts
return searchParts.All(searchPart =>
modelNameParts.Any(namePart =>
namePart.Contains(searchPart, StringComparison.OrdinalIgnoreCase)
)
);
});
}, cancellationToken);
}
}