@page "/superadmin" @rendermode InteractiveWebAssembly @attribute [Authorize(Policy = "AdminOnly")] @using System.Net.Http.Json @inject HttpClient Http @inject ISnackbar Snackbar @inject IDialogService DialogService Firmenverwaltung – Timetracker SaaS @if (_loading) { Lade Firmen und Mandanten… } else { @* ── Header Card ── *@ SuperAdmin Dashboard @_tenants.Count registrierte Firmen im System @* ── Tenants Table ── *@ ID Name Subdomain Erstellt am Benutzer Arbeitstage Status Aktionen @context.Id @context.Name @context.Subdomain @context.CreatedAt.ToLocalTime().ToString("dd.MM.yyyy HH:mm") @context.WorkDaysCount @if (context.IsApproved) { Aktiv } else { Ausstehend } @if (!context.IsApproved) { Freigeben } else { Sperren } @if (context.ShowDetails) { Benutzer für Firma: @context.Name @if (context.Users == null || context.Users.Count == 0) { Keine Benutzer in dieser Firma registriert. } else { @foreach (var user in context.Users) { @user.Username.Substring(0, Math.Min(2, user.Username.Length)).ToUpper() @user.Username ID: @user.Id @if (user.IsTenantAdmin) { Admin } else { Mitarbeiter } } } } } @code { private bool _loading = true; private List _tenants = []; protected override async Task OnInitializedAsync() { await LoadTenants(); } private async Task LoadTenants() { _loading = true; try { _tenants = await Http.GetFromJsonAsync>("api/superadmin/tenants") ?? []; } catch (Exception ex) { Snackbar.Add($"Fehler beim Laden der Firmen: {ex.Message}", Severity.Error); } finally { _loading = false; } } private async Task ApproveTenant(TenantStats tenant) { try { var response = await Http.PostAsync($"api/superadmin/tenants/{tenant.Id}/approve", null); if (response.IsSuccessStatusCode) { tenant.IsApproved = true; Snackbar.Add($"Firma '{tenant.Name}' wurde erfolgreich freigegeben.", Severity.Success); } else { Snackbar.Add("Fehler bei der Freigabe.", Severity.Error); } } catch (Exception ex) { Snackbar.Add($"Fehler: {ex.Message}", Severity.Error); } } private async Task ToggleActiveTenant(TenantStats tenant) { try { var response = await Http.PostAsync($"api/superadmin/tenants/{tenant.Id}/toggle-active", null); if (response.IsSuccessStatusCode) { tenant.IsApproved = !tenant.IsApproved; var stateMsg = tenant.IsApproved ? "aktiviert" : "gesperrt"; Snackbar.Add($"Firma '{tenant.Name}' wurde {stateMsg}.", Severity.Info); } else { Snackbar.Add("Fehler beim Ändern des Status.", Severity.Error); } } catch (Exception ex) { Snackbar.Add($"Fehler: {ex.Message}", Severity.Error); } } private async Task DeleteTenant(TenantStats tenant) { bool? result = await DialogService.ShowMessageBoxAsync( "Firma unwiderruflich löschen?", $"Sind Sie sicher, dass Sie die Firma '{tenant.Name}' ({tenant.Subdomain}) inklusive ALLER zugehörigen Benutzer, Einstellungen und Zeiterfassungen unwiderruflich löschen möchten? Dieser Vorgang kann nicht rückgängig gemacht werden!", yesText: "Löschen", cancelText: "Abbrechen"); if (result == true) { try { var response = await Http.DeleteAsync($"api/superadmin/tenants/{tenant.Id}"); if (response.IsSuccessStatusCode) { _tenants.Remove(tenant); Snackbar.Add($"Firma '{tenant.Name}' wurde gelöscht.", Severity.Success); } else { var err = await response.Content.ReadAsStringAsync(); Snackbar.Add($"Fehler beim Löschen: {err}", Severity.Error); } } catch (Exception ex) { Snackbar.Add($"Fehler: {ex.Message}", Severity.Error); } } } }