88 lines
No EOL
2.9 KiB
Text
88 lines
No EOL
2.9 KiB
Text
@using Microsoft.EntityFrameworkCore
|
|
@inherits FeedbackComponent<Guid, Guid>
|
|
@inject RoleService RoleService
|
|
@inject UserService UserService
|
|
@inject IMessageService MessageService
|
|
@inject ILogger<ManageRolesDialog> Logger
|
|
|
|
<Transfer DataSource="TransferItems" TargetKeys="TargetKeys" OnChange="OnChange" Titles="@(new string[] { "Available", "Assigned" })" />
|
|
|
|
@code {
|
|
User User;
|
|
ICollection<Role> Roles = new List<Role>();
|
|
ICollection<Role> SelectedRoles = new List<Role>();
|
|
IEnumerable<TransferItem> TransferItems { get; set; } = new List<TransferItem>();
|
|
List<string> TargetKeys { get; set; } = new List<string>();
|
|
|
|
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);
|
|
}
|
|
} |