@*
* dbMango
*
* Copyright 2025 Deutsche Bank AG
* SPDX-License-Identifier: Apache-2.0
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*@
@code
{
[Parameter] public string Name { get; set; } = "Select";
[Parameter] public string DenoteEmptyString { get; set; } = "(Blank)";
[Parameter] public string Class { get; set; } = "";
[Parameter] public bool ShowSelectionText { get; set; }
[Parameter]
public List DropdownValues
{
get;
set
{
value ??= [];
if (field.SequenceEqual(value))
return;
field = value;
SetValues(BlankedDropdownValues);
UpdateAllSelected();
InvokeAsync(StateHasChanged);
}
} = [];
[Parameter] public EventCallback> SelectionChanged { get; set; }
[Parameter] public bool EnableDropdownRefresh { get; set; }
[Parameter] public bool EnableDropdownMenu { get; set; } = true;
[Parameter] public bool Filterable { get; set; }
[Parameter] public bool ResetNow { get; set; }
[Parameter] public bool SelectAllByDefault { get; set; } = true;
[Parameter]
public string FilterString
{
get;
set
{
field = value;
_filterList = field.Split(",").Select(v => v.Trim()).Where(v => !string.IsNullOrWhiteSpace(v)).ToList();
RefreshFilter();
}
} = string.Empty;
private bool _allSelected = true;
private List _dropdownValuesList = [];
private HashSet _dropdownValuesSet = [];
private HashSet _selectedValues = [];
private HashSet _selectedValuesBackup = [];
private List _filterList = [];
private List _filteredDropdown = [];
IEnumerable BlankedDropdownValues
=> DropdownValues?.Select(x => string.IsNullOrWhiteSpace(x) ? DenoteEmptyString : x) ?? Array.Empty();
[Parameter] public HashSet SelectedValues
{
get => _selectedValues;
set
{
if (value == null || ReferenceEquals(_selectedValues, value) || _selectedValues.SequenceEqual(value))
return;
_selectedValues = value;
SelectedValuesChanged.InvokeAsync(_selectedValues);
}
}
[Parameter] public EventCallback> SelectedValuesChanged { get; set; }
private void RefreshFilter()
{
_filteredDropdown.Clear();
if (_filterList.Count == 0)
_filteredDropdown.AddRange(BlankedDropdownValues);
else
_filteredDropdown.AddRange(
BlankedDropdownValues.Where(x =>
_filterList.Any(v => x.Contains(v, StringComparison.OrdinalIgnoreCase))));
}
private void SetValues(IEnumerable values)
{
_dropdownValuesList.Clear();
_dropdownValuesList.AddRange(values);
_dropdownValuesSet.Clear();
_dropdownValuesSet.UnionWith(_dropdownValuesList);
}
private void ResetMenu(IEnumerable values)
{
SetValues(values);
_selectedValues .Clear();
_selectedValues .UnionWith(_dropdownValuesSet);
_allSelected = true;
SelectedValuesChanged.InvokeAsync(_selectedValues);
}
protected override void OnInitialized()
{
if (SelectAllByDefault)
ResetMenu(BlankedDropdownValues);
}
protected override async Task OnAfterRenderAsync(bool firstRender)
{
await base.OnAfterRenderAsync(firstRender);
if (!firstRender)
return;
if (!SelectAllByDefault)
{
SetValues(BlankedDropdownValues);
if ( UpdateAllSelected() )
await InvokeAsync(StateHasChanged);
}
}
private bool UpdateAllSelected()
{
var sel = _selectedValues.SetEquals(_dropdownValuesSet);
if (_allSelected != sel)
{
_allSelected = sel;
return true;
}
return false;
}
protected override void OnParametersSet()
{
if (ResetNow)
{
ResetMenu(BlankedDropdownValues);
FilterString = string.Empty;
}
else if (EnableDropdownRefresh)
{
var newDropdownValues = new HashSet(BlankedDropdownValues);
if (!newDropdownValues.SetEquals(_dropdownValuesSet))
ResetMenu(BlankedDropdownValues);
}
RefreshFilter();
}
public async Task AllClicked()
{
_allSelected = !_allSelected;
_selectedValues.Clear();
if (_allSelected)
_selectedValues.UnionWith(_dropdownValuesSet);
await SelectedValuesChanged.InvokeAsync(_selectedValues);
await InvokeAsync(StateHasChanged);
}
public void ItemCheckboxClicked(string item, object? checkedValue)
{
if (checkedValue is true)
_selectedValues.Add(item);
else
_selectedValues.Remove(item);
_allSelected = _selectedValues.SetEquals(_dropdownValuesSet);
SelectedValuesChanged.InvokeAsync(_selectedValues);
}
public void CancelClicked()
{
_selectedValues.Clear();
_selectedValues.UnionWith(_selectedValuesBackup);
_allSelected = _selectedValues.SetEquals(_dropdownValuesSet);
SelectedValuesChanged.InvokeAsync(_selectedValues);
}
public Task ApplyClicked()
{
_selectedValuesBackup.Clear();
_selectedValuesBackup.UnionWith(_selectedValues);
return SelectionChanged.InvokeAsync(_selectedValues.Select(x => x == DenoteEmptyString ? "" : x)
.ToList());
}
private void ToggleFilterable()
{
Filterable = !Filterable;
FilterString = string.Empty;
}
}