diff --git a/src/Koogle.Web/Components/Pages/Admin/RejectMembershipDialog.razor b/src/Koogle.Web/Components/Pages/Admin/RejectMembershipDialog.razor new file mode 100644 index 0000000..db4dd49 --- /dev/null +++ b/src/Koogle.Web/Components/Pages/Admin/RejectMembershipDialog.razor @@ -0,0 +1,29 @@ +@using Koogle.Application.DTOs + + + + + Mitgliedschaftsantrag von @Pending.DisplayName für Club @Pending.ClubName ablehnen? + + + + + Abbrechen + Ablehnen + + + +@code { + [CascadingParameter] private IMudDialogInstance MudDialog { get; set; } = null!; + + [Parameter] public PendingMembershipDto Pending { get; set; } = null!; + + private string _reason = ""; + + private void Cancel() => MudDialog.Cancel(); + private void Submit() => MudDialog.Close(DialogResult.Ok(_reason)); +} diff --git a/src/Koogle.Web/Components/Pages/Admin/Users.razor b/src/Koogle.Web/Components/Pages/Admin/Users.razor index c811e2a..2ed5809 100644 --- a/src/Koogle.Web/Components/Pages/Admin/Users.razor +++ b/src/Koogle.Web/Components/Pages/Admin/Users.razor @@ -15,73 +15,123 @@ Benutzer verwalten -@if (_isLoading) -{ - -} -else -{ - - - - - - Name - E-Mail - Clubs - Aktionen - - - @context.DisplayName - @context.Identity.Email - - @if (context.ClubMemberships.Count == 0) - { - Kein Club - } - else - { - @foreach (var membership in context.ClubMemberships) - { - - @membership.ClubName - @if (membership.Roles.Any()) + + + @if (_isLoading) + { + + } + else + { + + + + + + Name + E-Mail + Clubs + Aktionen + + + @context.DisplayName + @context.Identity.Email + + @if (context.ClubMemberships.Count == 0) + { + Kein Club + } + else + { + @foreach (var membership in context.ClubMemberships) { - (@string.Join(", ", membership.Roles)) + + @membership.ClubName + @if (membership.Roles.Any()) + { + (@string.Join(", ", membership.Roles)) + } + } - - } - } - - - - - - - - - - - - - - -} + } + + + + + + + + + + + + + + + } + + + + @if (_isLoadingPending) + { + + } + else if (!_pendingMemberships.Any()) + { + Keine ausstehenden Mitgliedschaftsanträge. + } + else + { + + + Name + E-Mail + Club + Angefragt am + Aktionen + + + @context.DisplayName + @context.Email + @context.ClubName + @context.RequestedAt.ToString("dd.MM.yyyy HH:mm") + + + + + + + + + + + } + + @code { private List _users = new(); private List _clubs = new(); + private List _pendingMemberships = new(); private bool _isLoading = true; + private bool _isLoadingPending = true; private string _searchString = ""; + private int _activeTabIndex = 0; protected override async Task OnInitializedAsync() { @@ -91,6 +141,7 @@ else private async Task LoadData() { _isLoading = true; + _isLoadingPending = true; try { var usersTask = UserService.GetAllUsersAsync(); @@ -99,10 +150,33 @@ else _users = (await usersTask).ToList(); _clubs = await clubsTask; + _isLoading = false; + + await LoadPendingMemberships(); } finally { _isLoading = false; + _isLoadingPending = false; + } + } + + private async Task LoadPendingMemberships() + { + _isLoadingPending = true; + try + { + var allPending = new List(); + foreach (var club in _clubs) + { + var clubPending = await UserService.GetPendingMembershipsAsync(club.Id); + allPending.AddRange(clubPending); + } + _pendingMemberships = allPending.OrderByDescending(p => p.RequestedAt).ToList(); + } + finally + { + _isLoadingPending = false; } } @@ -174,4 +248,58 @@ else await LoadData(); } } + + private async Task ApproveMembership(PendingMembershipDto pending) + { + var currentUser = await UserService.GetCurrentUserAsync(); + if (currentUser == null) + { + Snackbar.Add("Nicht angemeldet", Severity.Error); + return; + } + + var success = await UserService.ApproveMembershipAsync(pending.UserProfileId, pending.ClubId, currentUser.ProfileId); + if (success) + { + Snackbar.Add($"Mitgliedschaft von {pending.DisplayName} genehmigt", Severity.Success); + await LoadData(); + } + else + { + Snackbar.Add("Fehler beim Genehmigen der Mitgliedschaft", Severity.Error); + } + } + + private async Task OpenRejectDialog(PendingMembershipDto pending) + { + var parameters = new DialogParameters + { + { "Pending", pending } + }; + + var options = new DialogOptions { CloseButton = true, MaxWidth = MaxWidth.Small }; + var dialog = await DialogService.ShowAsync("Mitgliedschaft ablehnen", parameters, options); + var result = await dialog.Result; + + if (result != null && !result.Canceled && result.Data is string reason) + { + var currentUser = await UserService.GetCurrentUserAsync(); + if (currentUser == null) + { + Snackbar.Add("Nicht angemeldet", Severity.Error); + return; + } + + var success = await UserService.RejectMembershipAsync(pending.UserProfileId, pending.ClubId, currentUser.ProfileId, reason); + if (success) + { + Snackbar.Add($"Mitgliedschaft von {pending.DisplayName} abgelehnt", Severity.Success); + await LoadData(); + } + else + { + Snackbar.Add("Fehler beim Ablehnen der Mitgliedschaft", Severity.Error); + } + } + } }