LANCommander/LANCommander.Server/UI/Pages/Settings/Users/Components/ManageRolesDialog.razor

82 lines
No EOL
2.7 KiB
Text

@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.GetAsync(Options);
Roles = await RoleService.GetAsync();
var currentRoles = await UserService.GetRolesAsync(User);
SelectedRoles = Roles.Where(r => currentRoles.Any(cr => r.Name == cr.Name)).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.Any())
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);
}
}