From fe0fcdb7da3712a33dc7187ae5e11afee8a5ab4c Mon Sep 17 00:00:00 2001 From: Kawa Date: Thu, 11 Jun 2026 10:17:27 +0200 Subject: [PATCH] Make role-change report saved value on-screen @bind:after did not persist reliably. Move back to an explicit @onchange handler and surface every outcome in the page alert, including the role re-read from the store after the write. This makes a failed save visible (unrecognized value, exception, or saved != selected) instead of silent, so we can pinpoint where the role update breaks. Co-Authored-By: Claude Opus 4.8 (1M context) --- Components/Pages/Admin/UserManagement.razor | 27 +++++++++++++++------ 1 file changed, 19 insertions(+), 8 deletions(-) diff --git a/Components/Pages/Admin/UserManagement.razor b/Components/Pages/Admin/UserManagement.razor index c95360e..bed3d93 100644 --- a/Components/Pages/Admin/UserManagement.razor +++ b/Components/Pages/Admin/UserManagement.razor @@ -86,11 +86,12 @@ else @@ -192,16 +193,26 @@ else } } - // Bound via @bind:after, so user.Role already holds the newly-selected value when this runs. - private async Task PersistRoleAsync(AppUser user) + private async Task OnRoleChange(AppUser user, ChangeEventArgs e) { + // Surface every branch on-screen so a failed save is never silent. The "saved" value is + // re-read from the store, so it proves whether the write actually landed on disk. + var raw = e.Value?.ToString(); + if (!Enum.TryParse(raw, out var newRole)) + { + _message = string.Format(T["usermgmt.msg.error"], $"unrecognized role value '{raw}'"); + _isError = true; + return; + } try { - var oldRole = await UserService.UpdateRoleAsync(user.Id, user.Role); + var oldRole = await UserService.UpdateRoleAsync(user.Id, newRole); + user.Role = newRole; + var saved = (await UserService.GetByEmailAsync(user.Email))?.Role; await Audit.LogAsync("RoleChanged", "", Array.Empty(), - $"Changed role for {user.Email} ({user.DisplayName}) from {oldRole} to {user.Role}."); - _message = string.Format(T["usermgmt.msg.roleupdated"], user.DisplayName); - _isError = false; + $"Changed role for {user.Email} ({user.DisplayName}) from {oldRole} to {newRole}."); + _message = $"{string.Format(T["usermgmt.msg.roleupdated"], user.DisplayName)} ({oldRole} → {newRole}, saved: {saved})"; + _isError = saved != newRole; } catch (Exception ex) {