mirror of
https://github.com/chylex/Minecraft-Phantom-Panel.git
synced 2025-05-09 06:34:02 +02:00
106 lines
3.8 KiB
Plaintext
106 lines
3.8 KiB
Plaintext
@using System.Collections.Immutable
|
|
@using Phantom.Common.Data.Web.Users
|
|
@using Phantom.Web.Services.Authentication
|
|
@using Phantom.Web.Services.Users
|
|
@inherits UserEditDialogBase
|
|
@inject RoleManager RoleManager
|
|
@inject UserRoleManager UserRoleManager
|
|
|
|
<Modal Id="@ModalId" TitleText="Manage User Roles">
|
|
<Body>
|
|
Roles for user: <strong class="fw-semibold">@EditedUserName</strong><br>
|
|
@for (var index = 0; index < items.Count; index++) {
|
|
var item = items[index];
|
|
<div class="mt-1">
|
|
<input id="role-@index" type="checkbox" class="form-check-input" @bind="@item.Checked" />
|
|
<label for="role-@index" class="form-check-label">@item.Role.Name</label>
|
|
</div>
|
|
}
|
|
</Body>
|
|
<Footer>
|
|
<FormSubmitError Model="SubmitModel" />
|
|
<FormButtonSubmit Model="SubmitModel" Label="Save Roles" type="button" class="btn btn-success" @onclick="Submit" />
|
|
<button type="button" class="btn btn-secondary" data-bs-dismiss="modal" @onclick="OnClosed">Cancel</button>
|
|
</Footer>
|
|
</Modal>
|
|
|
|
@code {
|
|
|
|
private ImmutableDictionary<Guid, RoleInfo> allRolesByGuid = ImmutableDictionary<Guid, RoleInfo>.Empty;
|
|
private List<RoleItem> items = new();
|
|
|
|
protected override async Task BeforeShown(UserInfo user) {
|
|
var allRoles = await RoleManager.GetAll(CancellationToken);
|
|
this.allRolesByGuid = allRoles.ToImmutableDictionary(static role => role.Guid, static role => role);
|
|
|
|
var currentRoleGuids = await UserRoleManager.GetUserRoles(user.Guid, CancellationToken);
|
|
this.items = allRoles.Select(role => new RoleItem(role, currentRoleGuids.Contains(role.Guid))).ToList();
|
|
}
|
|
|
|
protected override async Task<UserActionFailure?> DoEdit(AuthenticatedUser? authenticatedUser, UserInfo editedUser) {
|
|
var currentRoleGuids = await UserRoleManager.GetUserRoles(editedUser.Guid, CancellationToken);
|
|
var addToRoleGuids = ImmutableHashSet.CreateBuilder<Guid>();
|
|
var removeFromRoleGuids = ImmutableHashSet.CreateBuilder<Guid>();
|
|
|
|
foreach (var item in items) {
|
|
var roleGuid = item.Role.Guid;
|
|
var shouldHaveRole = item.Checked;
|
|
if (shouldHaveRole == currentRoleGuids.Contains(roleGuid)) {
|
|
continue;
|
|
}
|
|
|
|
if (shouldHaveRole) {
|
|
addToRoleGuids.Add(roleGuid);
|
|
}
|
|
else {
|
|
removeFromRoleGuids.Add(roleGuid);
|
|
}
|
|
}
|
|
|
|
return await DoChangeUserRoles(authenticatedUser, editedUser, addToRoleGuids.ToImmutable(), removeFromRoleGuids.ToImmutable());
|
|
}
|
|
|
|
private async Task<UserActionFailure?> DoChangeUserRoles(AuthenticatedUser? authenticatedUser, UserInfo editedUser, ImmutableHashSet<Guid> addToRoleGuids, ImmutableHashSet<Guid> removeFromRoleGuids) {
|
|
var result = await UserRoleManager.ChangeUserRoles(authenticatedUser, editedUser.Guid, addToRoleGuids, removeFromRoleGuids, CancellationToken);
|
|
if (!result) {
|
|
return result.Error;
|
|
}
|
|
|
|
var failedToAdd = addToRoleGuids.Except(result.Value.AddedToRoleGuids);
|
|
var failedToRemove = removeFromRoleGuids.Except(result.Value.RemovedFromRoleGuids);
|
|
|
|
if (failedToAdd.IsEmpty && failedToRemove.IsEmpty) {
|
|
await OnEditSuccess();
|
|
return null;
|
|
}
|
|
|
|
var errors = new List<string>();
|
|
|
|
foreach (var roleGuid in failedToAdd) {
|
|
errors.Add("Could not add role: " + GetRoleName(roleGuid));
|
|
}
|
|
|
|
foreach (var roleGuid in failedToRemove) {
|
|
errors.Add("Could not remove role: " + GetRoleName(roleGuid));
|
|
}
|
|
|
|
OnEditFailure(string.Join("\n", errors));
|
|
return null;
|
|
}
|
|
|
|
private string GetRoleName(Guid roleGuid) {
|
|
return allRolesByGuid.TryGetValue(roleGuid, out var role) ? role.Name : "?";
|
|
}
|
|
|
|
private sealed class RoleItem {
|
|
public RoleInfo Role { get; }
|
|
public bool Checked { get; set; }
|
|
|
|
public RoleItem(RoleInfo role, bool @checked) {
|
|
this.Role = role;
|
|
this.Checked = @checked;
|
|
}
|
|
}
|
|
|
|
}
|