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);
+ }
+ }
+ }
}