diff --git a/src/Koogle.Web/Components/Pages/Dashboard.razor b/src/Koogle.Web/Components/Pages/Dashboard.razor
index ab079c6..b08a202 100644
--- a/src/Koogle.Web/Components/Pages/Dashboard.razor
+++ b/src/Koogle.Web/Components/Pages/Dashboard.razor
@@ -4,6 +4,7 @@
@using Koogle.Application.DTOs
@using Koogle.Application.Interfaces
@using Koogle.Domain.Enums
+@using Koogle.Web.Components.Shared
@using Microsoft.AspNetCore.Authorization
@inject IDashboardService DashboardService
@@ -102,6 +103,11 @@ else if (_dashboard is not null)
+
+
+
+
+
diff --git a/src/Koogle.Web/Components/Shared/PendingMembershipsWidget.razor b/src/Koogle.Web/Components/Shared/PendingMembershipsWidget.razor
new file mode 100644
index 0000000..4b17b31
--- /dev/null
+++ b/src/Koogle.Web/Components/Shared/PendingMembershipsWidget.razor
@@ -0,0 +1,90 @@
+@using Fluxor
+@using Koogle.Application.DTOs
+@using Koogle.Application.Interfaces
+@using Koogle.Web.Store.AuthState
+
+@inherits Fluxor.Blazor.Web.Components.FluxorComponent
+
+@inject IUserService UserService
+@inject IState AuthState
+@inject NavigationManager NavigationManager
+@inject ISnackbar Snackbar
+
+@if (_isLoading)
+{
+
+}
+else if (_pendingCount > 0)
+{
+
+
+
+
+
+ Offene Beitrittsanträge
+
+ @(_pendingCount == 1 ? "1 Antrag wartet auf Freigabe" : $"{_pendingCount} Anträge warten auf Freigabe")
+
+
+
+}
+
+@code {
+ private int _pendingCount;
+ private bool _isLoading = true;
+
+ protected override async Task OnInitializedAsync()
+ {
+ await base.OnInitializedAsync();
+ await LoadPendingCountAsync();
+ }
+
+ private async Task LoadPendingCountAsync()
+ {
+ try
+ {
+ _isLoading = true;
+ var state = AuthState.Value;
+ var clubId = state.CurrentClub?.ClubId ?? Guid.Empty;
+
+ if (clubId == Guid.Empty)
+ {
+ _pendingCount = 0;
+ return;
+ }
+
+ // Only load for club admins or super admins
+ if (!state.IsClubAdmin && !state.IsSuperAdmin)
+ {
+ _pendingCount = 0;
+ return;
+ }
+
+ var pending = await UserService.GetPendingMembershipsAsync(clubId);
+ _pendingCount = pending.Count;
+ }
+ catch (Exception ex)
+ {
+ Snackbar.Add($"Fehler beim Laden der Anträge: {ex.Message}", Severity.Error);
+ _pendingCount = 0;
+ }
+ finally
+ {
+ _isLoading = false;
+ }
+ }
+
+ ///
+ /// Reloads pending membership count.
+ ///
+ public async Task RefreshAsync()
+ {
+ await LoadPendingCountAsync();
+ StateHasChanged();
+ }
+
+ private void NavigateToUsers()
+ {
+ NavigationManager.NavigateTo("/admin/users");
+ }
+}