82 lines
2.4 KiB
Plaintext
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);
|
|
|
|
}
|
|
} |