@typeparam T @* * 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. *@
@if (!string.IsNullOrWhiteSpace(Name)) {
}
@if (Icon != null) {
}
@{ var groupedValues = GetGroupedValues(); if (groupedValues.Count == 1) { foreach (var v in groupedValues[0].Values) {
@RenderItem(v)
} } else { foreach (var g in groupedValues) {
@g.Name
@foreach (var v in g.Values) {
@RenderItem(v)
}
} } }
@code { [Parameter] public string Name { get; set; } = ""; [Parameter] public T Value { get; set { if (value == null || (field?.Equals(value) ?? false)) return; field = value; ValueChanged.InvokeAsync(value); } } = default!; [Parameter] public EventCallback ValueChanged { get; set; } [Parameter] public IReadOnlyCollection Values { get; set; } = []; [Parameter] public string? Placeholder { get; set; } = ""; [Parameter] public string? Icon { get; set; } [Parameter] public string Class { get; set; } = ""; [Parameter] public bool Enabled { get; set; } = true; [Parameter] public Func IsSelectable { get; set; } = _ => true; [Parameter] public Func GetText { get; set; } = x => x?.ToString() ?? ""; [Parameter] public RenderFragment? OptionTemplate { get; set; } [Parameter] public RenderFragment? SelectedOptionTemplate { get; set; } private string _id = $"h{Random.Shared.Next():X8}"; private string FormGroupClass => string.IsNullOrWhiteSpace(Name) ? Class : $"form-group {Class}"; private class Group { public string Name { get; set; } = string.Empty; public List Values { get; set; } = new (); } private List GetGroupedValues() { var groups = new List(); Group? currentGroup = null; foreach (var v in Values) { if (!IsSelectable(v)) { // Start a new group with this name currentGroup = new Group { Name = v?.ToString() ?? string.Empty }; groups.Add(currentGroup); } else { if (currentGroup == null) { // If no group has been started, create a default group currentGroup = new () { Name = "Not grouped" }; groups.Add(currentGroup); } currentGroup.Values.Add(v); } } return groups; } private void SelectItem(T value) { if (Enabled && IsSelectable(value)) { Value = value; } } private RenderFragment RenderItem(T value) { var selected = Value?.Equals(value) ?? false; if ( selected ) { if (SelectedOptionTemplate != null) { return @
@SelectedOptionTemplate(value)
; } else if (OptionTemplate != null) { return @
@OptionTemplate(value)
; } else { return @
@GetText(value)
; } } if (OptionTemplate != null) { return @
@OptionTemplate(value)
; } else { return @
@GetText(value)
; } } }