From ee4d6cb5b1f411b4496780faca59d607a5aa9cb9 Mon Sep 17 00:00:00 2001 From: "Wieland, Marc" Date: Mon, 8 Jun 2026 15:24:20 +0200 Subject: [PATCH] Userverwaltung improved --- Components/Layout/NavMenu.razor | 40 +++++++------ Components/Pages/AdminUsers.razor | 91 ++++++++++++++++++++++++------ Data/AuthService.cs | 17 ++++++ timetracker.db | Bin 49152 -> 49152 bytes 4 files changed, 114 insertions(+), 34 deletions(-) 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 f6a6ce5debeeaf7b82eea0aaa3bee8a3e7daad87..de90888712b6b2ebd566a1d6fd138c42668db224 100644 GIT binary patch delta 536 zcmZo@U~Xt&o**sA%D}+D1H>>OFj2=?k(EKOO_P`1gn^s6iGkmSkB{#qa})PMt_^G^ z9331yJhmGfn3%a*^;y`(m6aL0R5$-)Hf5^UQBZQrNv#OU%uNk0Nh~UHNi0cKQV4O4 z2vP70_3=TM&df`9O3X>jOHTF3FD)uoQV4Q&^ilBhhp1L?admSH^$Afh&@%w)bWbhH zP0Rxti(;f^V=X(oxU4K=vu{b_WCyk{ES$d>Zfv$--^;?m;01D9d->#l%nn?Q*<9@6 znwpHwf|Kpo&x!*Lbj~l$E6Gd+S_^le=4Nf)T|(Msx&{^shQ?Ng23Dq)dIlE8My7`5 z+6D$z1_r#qP-5YaV&K2ezlFb#KWej}fET}s5esv?q>+JlNY7$&pMDt+3x6>K|1*+GbGZJkQ%jSjl zaSDvwn-W+Aq`3JC8Th{QpW|Q4x0Sz|KZ@UyUxM!%-(@EGf~G_k%d98O_P`N7Xvr*7Y2SCK0dye%wM<{a&2HU z;ppJtVK>>>z{EUpK@nGrEepH2vNB_bn6vB~_K7uv@uFmi25U=fhu;+xFC i_nrS7|60DS{MGzX{FeL@eAoCU0~MC@ZJu10>j(fbaX?Q1