@page "/admin/users" @rendermode InteractiveServer @attribute [Authorize(Policy = "AdminOnly")] @inject AuthService AuthService @inject ISnackbar Snackbar @inject AuthenticationStateProvider AuthStateProvider @inject timetracker.Data.UserNotificationService UserNotificationService @implements IDisposable Benutzerverwaltung – Timetracker @if (_loading) { Lade Benutzer… } else { @* ── Header ── *@ Benutzerverwaltung @_users.Count Benutzer registriert @* ── Tabelle ── *@ ID Benutzername Aktionen @context.Id @if (_editUserId == context.Id) { } else { @context.Username @if (context.Username == "marc") { Admin } } @if (_editUserId == context.Id) { } else { @if (context.Username != "marc") { } } Keine Benutzer gefunden. } @code { private List _users = []; private bool _loading = true; private int? _editUserId; private string _editUsername = ""; protected override async Task OnInitializedAsync() { var claim = (await AuthStateProvider.GetAuthenticationStateAsync()) .User.FindFirst(ClaimTypes.NameIdentifier); if (claim == null) return; UserNotificationService.OnUsersChanged += RefreshUsers; _users = await AuthService.GetAllUsersAsync(); _loading = false; } private async Task RefreshUsers() { _users = await AuthService.GetAllUsersAsync(); await InvokeAsync(StateHasChanged); } public void Dispose() { UserNotificationService.OnUsersChanged -= RefreshUsers; } private void StartEdit(User user) { _editUserId = user.Id; _editUsername = user.Username; } private void CancelEdit() { _editUserId = null; _editUsername = ""; } private async Task SaveRename(User user) { var trimmed = _editUsername.Trim(); var error = await AuthService.RenameUserAsync(user.Id, trimmed); if (error != null) { Snackbar.Add(error, Severity.Error); return; } user.Username = trimmed; _editUserId = null; _editUsername = ""; Snackbar.Add($"Benutzer umbenannt zu \"{trimmed}\".", Severity.Success); } private async Task DeleteUser(User user) { await AuthService.DeleteUserAsync(user.Id); _users.Remove(user); Snackbar.Add($"Benutzer \"{user.Username}\" gelöscht.", Severity.Info); } }