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) <noreply@anthropic.com>
This commit is contained in:
@@ -86,11 +86,12 @@ else
|
|||||||
</td>
|
</td>
|
||||||
<td style="padding:8px">
|
<td style="padding:8px">
|
||||||
<select class="form-input" style="width:130px"
|
<select class="form-input" style="width:130px"
|
||||||
@bind="user.Role" @bind:after="() => PersistRoleAsync(user)"
|
value="@user.Role"
|
||||||
|
@onchange="@(e => OnRoleChange(user, e))"
|
||||||
disabled="@(user.Email == UserContext.Email)">
|
disabled="@(user.Email == UserContext.Email)">
|
||||||
@foreach (var role in Enum.GetValues<UserRole>())
|
@foreach (var role in Enum.GetValues<UserRole>())
|
||||||
{
|
{
|
||||||
<option value="@role">@role</option>
|
<option value="@role" selected="@(user.Role == role)">@role</option>
|
||||||
}
|
}
|
||||||
</select>
|
</select>
|
||||||
</td>
|
</td>
|
||||||
@@ -192,16 +193,26 @@ else
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Bound via @bind:after, so user.Role already holds the newly-selected value when this runs.
|
private async Task OnRoleChange(AppUser user, ChangeEventArgs e)
|
||||||
private async Task PersistRoleAsync(AppUser user)
|
|
||||||
{
|
{
|
||||||
|
// 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<UserRole>(raw, out var newRole))
|
||||||
|
{
|
||||||
|
_message = string.Format(T["usermgmt.msg.error"], $"unrecognized role value '{raw}'");
|
||||||
|
_isError = true;
|
||||||
|
return;
|
||||||
|
}
|
||||||
try
|
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<string>(),
|
await Audit.LogAsync("RoleChanged", "", Array.Empty<string>(),
|
||||||
$"Changed role for {user.Email} ({user.DisplayName}) from {oldRole} to {user.Role}.");
|
$"Changed role for {user.Email} ({user.DisplayName}) from {oldRole} to {newRole}.");
|
||||||
_message = string.Format(T["usermgmt.msg.roleupdated"], user.DisplayName);
|
_message = $"{string.Format(T["usermgmt.msg.roleupdated"], user.DisplayName)} ({oldRole} → {newRole}, saved: {saved})";
|
||||||
_isError = false;
|
_isError = saved != newRole;
|
||||||
}
|
}
|
||||||
catch (Exception ex)
|
catch (Exception ex)
|
||||||
{
|
{
|
||||||
|
|||||||
Reference in New Issue
Block a user