@using Microsoft.EntityFrameworkCore @inherits FeedbackComponent @inject RoleService RoleService @inject UserService UserService @inject IMessageService MessageService @inject ILogger Logger @code { User User; ICollection Roles = new List(); ICollection SelectedRoles = new List(); IEnumerable TransferItems { get; set; } = new List(); List TargetKeys { get; set; } = new List(); protected override async Task OnAfterRenderAsync(bool firstRender) { if (firstRender) { TransferItems = Roles.Select(r => new TransferItem() { Key = r.Id.ToString(), Title = r.Name }); if (SelectedRoles != null) TargetKeys = SelectedRoles.Select(i => i.Id.ToString()).ToList(); } } protected override async Task OnInitializedAsync() { await LoadData(); } private async Task LoadData() { User = await UserService .Query(q => { return q.Include(u => u.UserRoles) .ThenInclude(ur => ur.Role); }) .GetAsync(Options); Roles = await RoleService.GetAsync(); SelectedRoles = Roles.Where(r => User.Roles?.Any(cr => r.Name == cr.Name) ?? false).ToList(); } async Task OnChange(TransferChangeArgs e) { SelectedRoles = Roles.Where(r => e.TargetKeys.Contains(r.Id.ToString())).ToList(); } public override async Task OnFeedbackOkAsync(ModalClosingEventArgs args) { var currentAdmins = await RoleService.GetUsersAsync(RoleService.AdministratorRoleName); try { var currentRoles = await UserService.GetRolesAsync(User); await UserService.AddToRolesAsync(User.UserName, SelectedRoles.Select(r => r.Name).Where(r => !currentRoles.Any(cr => cr.Name == r))); foreach (var role in currentRoles) { if (!SelectedRoles.Any(r => r.Name == role.Name)) { if (role.Name == RoleService.AdministratorRoleName && currentAdmins.Count() == 1) MessageService.Warning("Cannot demote the only administrator!"); else await UserService.RemoveFromRole(User.UserName, role.Name); } } MessageService.Success("Updated user roles!"); } catch (Exception ex) { MessageService.Error("Could not update user roles!"); Logger.LogError(ex, "Could not update user roles!"); } await base.OkCancelRefWithResult!.OnOk(User.Id); } }