@using Koogle.Application.DTOs @using Koogle.Domain.Enums @using MudBlazor Teilnehmer auswählen Alle Keine @if (_availableParticipants.Count == 0) { Keine Teilnehmer verfügbar. Füge zuerst Teilnehmer zum Spieltag hinzu. } else { @foreach (var participant in _availableParticipants) { var isSelected = _selectedIds.Contains(participant.PersonId); @participant.PersonName @GetStatusLabel(participant.PersonStatus) } } @_selectedIds.Count von @_availableParticipants.Count Teilnehmer ausgewählt @code { /// /// List of available participants from the day. /// [Parameter] public IReadOnlyList AvailableParticipants { get; set; } = []; /// /// Currently selected participant IDs. /// [Parameter] public IReadOnlyList SelectedParticipantIds { get; set; } = []; /// /// Callback when selected participants change. /// [Parameter] public EventCallback> SelectedParticipantIdsChanged { get; set; } /// /// Minimum number of participants required. /// [Parameter] public int MinimumParticipants { get; set; } = 1; private List _availableParticipants = []; private HashSet _selectedIds = new(); protected override async Task OnParametersSetAsync() { _availableParticipants = AvailableParticipants.ToList(); _selectedIds = new HashSet(SelectedParticipantIds); // Auto-select all if none selected if (_selectedIds.Count == 0 && _availableParticipants.Count > 0) { await SelectAll(); } } private async Task ToggleParticipant(Guid personId) { if (_selectedIds.Contains(personId)) { _selectedIds.Remove(personId); } else { _selectedIds.Add(personId); } await NotifySelectionChanged(); } private async Task SelectAll() { _selectedIds = _availableParticipants.Select(p => p.PersonId).ToHashSet(); await NotifySelectionChanged(); } private async Task SelectNone() { _selectedIds.Clear(); await NotifySelectionChanged(); } private async Task NotifySelectionChanged() { await SelectedParticipantIdsChanged.InvokeAsync(_selectedIds.ToList()); } private string GetParticipantClass(bool isSelected) => isSelected ? "mud-theme-primary pa-1" : "mud-paper-outlined pa-1"; private string GetStatusLabel(PersonStatus status) => status switch { PersonStatus.Member => "Mitglied", PersonStatus.Guest => "Gast", _ => status.ToString() }; /// /// Gets the currently selected participant IDs. /// public IReadOnlyList GetSelectedIds() => _selectedIds.ToList(); /// /// Validates that minimum participants are selected. /// public bool IsValid() => _selectedIds.Count >= MinimumParticipants; }