@page "/admin/users" @attribute [Microsoft.AspNetCore.Authorization.Authorize] @inject IUserService UserService @inject IUserContextAccessor UserContext @inject NavigationManager Nav @rendermode InteractiveServer @using SharepointToolbox.Web.Core.Models @using SharepointToolbox.Web.Services.Auth @using SharepointToolbox.Web.Services.Session

User Management

Manage technician accounts and roles. Auto-provisioned on first OIDC login.

@if (!UserContext.IsAuthenticated || UserContext.Role != UserRole.Admin) {
Access denied. Admin role required.
return; } @if (!string.IsNullOrEmpty(_message)) {
@_message
} @if (_users.Count == 0) {
No users provisioned yet.
} else {
@foreach (var user in _users) { }
User Email Role Last Login Actions
@user.DisplayName @user.Email @(user.LastLogin?.ToString("yyyy-MM-dd HH:mm") ?? "Never") @if (user.Email != UserContext.Email) { } else { You }
} @code { private List _users = new(); private string _message = string.Empty; private bool _isError; protected override async Task OnInitializedAsync() { _users = (await UserService.GetAllAsync()).ToList(); } private async Task OnRoleChange(AppUser user, ChangeEventArgs e) { if (!Enum.TryParse(e.Value?.ToString(), out var newRole)) return; try { await UserService.UpdateRoleAsync(user.Id, newRole); user.Role = newRole; _message = $"Role updated for {user.DisplayName}."; _isError = false; } catch (Exception ex) { _message = $"Error: {ex.Message}"; _isError = true; } } private async Task DeleteUserAsync(AppUser user) { await UserService.DeleteAsync(user.Id); _users.Remove(user); _message = $"User {user.DisplayName} removed."; _isError = false; } }