1
0
mirror of https://github.com/chylex/Minecraft-Phantom-Panel.git synced 2025-05-07 18:34:03 +02:00
Minecraft-Phantom-Panel/Web/Phantom.Web/Pages/Users.razor
2023-12-18 06:04:12 +01:00

119 lines
4.1 KiB
Plaintext

@page "/users"
@attribute [Authorize(Permission.ViewUsersPolicy)]
@using System.Collections.Immutable
@using Phantom.Common.Data.Web.Users
@using Phantom.Web.Services.Users
@using Phantom.Web.Services.Authorization
@inherits Phantom.Web.Components.PhantomComponent
@inject UserManager UserManager
@inject RoleManager RoleManager
@inject UserRoleManager UserRoleManager
<h1>Users</h1>
<PermissionView Permission="Permission.EditUsers">
<button type="button" class="btn btn-primary" data-bs-toggle="modal" data-bs-target="#add-user">Add User...</button>
</PermissionView>
<AuthorizeView>
<Authorized>
@{ var canEdit = PermissionManager.CheckPermission(context.User, Permission.EditUsers); }
<table class="table align-middle">
<thead>
<tr>
<Column Width="320px">Identifier</Column>
<Column Width="125px; 40%">Username</Column>
<Column Width="125px; 60%">Roles</Column>
@if (canEdit) {
<Column Width="175px">Actions</Column>
}
</tr>
</thead>
<tbody>
@foreach (var user in allUsers) {
var isMe = me == user.Guid;
<tr>
<td>
<code class="text-uppercase">@user.Guid</code>
</td>
@if (isMe) {
<td class="fw-semibold">@user.Name</td>
}
else {
<td>@user.Name</td>
}
<td>@(userGuidToRoleDescription.TryGetValue(user.Guid, out var roles) ? roles : "?")</td>
@if (canEdit) {
<td>
@if (!isMe) {
<button class="btn btn-primary btn-sm" @onclick="() => userRolesDialog.Show(user)">Edit Roles</button>
<button class="btn btn-danger btn-sm" @onclick="() => userDeleteDialog.Show(user)">Delete...</button>
}
</td>
}
</tr>
}
</tbody>
</table>
</Authorized>
</AuthorizeView>
<PermissionView Permission="Permission.EditUsers">
<UserAddDialog ModalId="add-user" UserAdded="OnUserAdded" />
<UserRolesDialog @ref="userRolesDialog" ModalId="manage-user-roles" UserModified="OnUserRolesChanged" />
<UserDeleteDialog @ref="userDeleteDialog" ModalId="delete-user" UserModified="OnUserDeleted" />
</PermissionView>
@code {
private Guid? me = Guid.Empty;
private ImmutableArray<UserInfo> allUsers = ImmutableArray<UserInfo>.Empty;
private ImmutableDictionary<Guid, RoleInfo> allRolesByGuid = ImmutableDictionary<Guid, RoleInfo>.Empty;
private readonly Dictionary<Guid, string> userGuidToRoleDescription = new();
private UserRolesDialog userRolesDialog = null!;
private UserDeleteDialog userDeleteDialog = null!;
protected override async Task OnInitializedAsync() {
me = await GetUserGuid();
allUsers = (await UserManager.GetAll(CancellationToken)).Sort(static (a, b) => a.Name.CompareTo(b.Name));
allRolesByGuid = (await RoleManager.GetAll(CancellationToken)).ToImmutableDictionary(static role => role.Guid, static role => role);
var allUserGuids = allUsers
.Select(static user => user.Guid)
.ToImmutableHashSet();
foreach (var (userGuid, roleGuids) in await UserRoleManager.GetUserRoles(allUserGuids, CancellationToken)) {
userGuidToRoleDescription[userGuid] = StringifyRoles(roleGuids);
}
}
private async Task RefreshUserRoles(UserInfo user) {
userGuidToRoleDescription[user.Guid] = StringifyRoles(await UserRoleManager.GetUserRoles(user.Guid, CancellationToken));
}
private string StringifyRoles(ImmutableArray<Guid> roleGuids) {
return roleGuids.IsEmpty ? "-" : string.Join(", ", roleGuids.Select(StringifyRole));
}
private string StringifyRole(Guid role) {
return allRolesByGuid.TryGetValue(role, out var roleInfo) ? roleInfo.Name : "?";
}
private Task OnUserAdded(UserInfo user) {
allUsers = allUsers.Add(user);
return RefreshUserRoles(user);
}
private Task OnUserRolesChanged(UserInfo user) {
return RefreshUserRoles(user);
}
private void OnUserDeleted(UserInfo user) {
allUsers = allUsers.Remove(user);
userGuidToRoleDescription.Remove(user.Guid);
}
}