diff --git a/Components/Layout/NavMenu.razor b/Components/Layout/NavMenu.razor index 1ff2cb7..ef15087 100644 --- a/Components/Layout/NavMenu.razor +++ b/Components/Layout/NavMenu.razor @@ -1,25 +1,29 @@ - - Navigation - - Wochenübersicht - Monatsübersicht - Feiertage - Urlaubs-Maximizer - Einstellungen - - - - Benutzerverwaltung - - +
+ + + Wochenübersicht + Monatsübersicht + Feiertage + Urlaubs-Maximizer + Einstellungen + + + + Benutzerverwaltung + + + - + + @context.User.Identity?.Name - Abmelden + + Abmelden + - - + Version 1.1 +
\ No newline at end of file diff --git a/Components/Pages/AdminUsers.razor b/Components/Pages/AdminUsers.razor index ce35754..3c48166 100644 --- a/Components/Pages/AdminUsers.razor +++ b/Components/Pages/AdminUsers.razor @@ -47,26 +47,56 @@ else @context.Id - - - - @context.Username - - @if (context.Username == "marc") - { - Admin - } - + @if (_editUserId == context.Id) + { + + } + else + { + + + + @context.Username + + @if (context.Username == "marc") + { + Admin + } + + } - @if (context.Username != "marc") + @if (_editUserId == context.Id) { - + OnClick="@(() => SaveRename(context))" /> + + } + else + { + + @if (context.Username != "marc") + { + + } } @@ -83,6 +113,8 @@ else @code { private List _users = []; private bool _loading = true; + private int? _editUserId; + private string _editUsername = ""; protected override async Task OnInitializedAsync() { @@ -94,6 +126,33 @@ else _loading = false; } + 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); diff --git a/Data/AuthService.cs b/Data/AuthService.cs index 7e3753b..67b94ed 100644 --- a/Data/AuthService.cs +++ b/Data/AuthService.cs @@ -34,6 +34,23 @@ public class AuthService(IDbContextFactory factory) } } + public async Task RenameUserAsync(int userId, string newUsername) + { + if (string.IsNullOrWhiteSpace(newUsername) || newUsername.Length < 3) + return "Benutzername muss mindestens 3 Zeichen lang sein."; + + await using var db = await factory.CreateDbContextAsync(); + if (await db.Users.AnyAsync(u => u.Username == newUsername && u.Id != userId)) + return "Benutzername bereits vergeben."; + + var user = await db.Users.FindAsync(userId); + if (user == null) return "Benutzer nicht gefunden."; + + user.Username = newUsername; + await db.SaveChangesAsync(); + return null; + } + public async Task<(User? User, string? Error)> RegisterAsync(string username, string password) { if (string.IsNullOrWhiteSpace(username) || username.Length < 3) return (null, "Benutzername muss mindestens 3 Zeichen lang sein."); diff --git a/timetracker.db b/timetracker.db index f6a6ce5..de90888 100644 Binary files a/timetracker.db and b/timetracker.db differ