@page "/administration/users" @rendermode InteractiveServer @layout AdminLayout @using System.Globalization @using BlazorStrap @using CurrieTechnologies.Razor.SweetAlert2 @using HopFrame.Database.Models @using HopFrame.Security.Claims @using HopFrame.Security.Services @using HopFrame.Web.Pages.Administration.Layout @using static Microsoft.AspNetCore.Components.Web.RenderMode @using Microsoft.AspNetCore.Components.Web @using HopFrame.Web.Components @using BlazorStrap.V5 @using HopFrame.Web.Components.Administration Users

Users administration

Add User
# E-Mail @if (_currentOrder == OrderType.Email) { } Username @if (_currentOrder == OrderType.Username) { } Registered @if (_currentOrder == OrderType.Registered) { } Primary Group @if (_hasEditPrivileges || _hasDeletePrivileges) { Actions } @foreach (var user in _users) { @user.Id @user.Email @user.Username @user.CreatedAt @GetFriendlyGroupName(user) @if (_hasEditPrivileges || _hasDeletePrivileges) { @if (_hasEditPrivileges) { Edit } @if (_hasDeletePrivileges) { Delete } } } @inject IUserService UserService @inject IPermissionService PermissionsService @inject SweetAlertService Alerts @inject ITokenContext Auth @code { private IList _users = new List(); private IDictionary _userGroups = new Dictionary(); private OrderType _currentOrder = OrderType.None; private OrderDirection _currentOrderDirection = OrderDirection.Asc; private string _searchText; private bool _hasEditPrivileges = false; private bool _hasDeletePrivileges = false; private UserAddModal _userAddModal; private UserEditModal _userEditModal; protected override async Task OnInitializedAsync() { _users = await UserService.GetUsers(); foreach (var user in _users) { var groups = await PermissionsService.GetUserPermissionGroups(user); _userGroups.Add(user.Id, groups.LastOrDefault()); } _hasEditPrivileges = await PermissionsService.HasPermission(Security.AdminPermissions.EditUser, Auth.User.Id); _hasDeletePrivileges = await PermissionsService.HasPermission(Security.AdminPermissions.DeleteUser, Auth.User.Id); } private async Task Reload() { _users = new List(); _userGroups = new Dictionary(); _users = await UserService.GetUsers(); foreach (var user in _users) { var groups = await PermissionsService.GetUserPermissionGroups(user); _userGroups.Add(user.Id, groups.LastOrDefault()); } OrderBy(_currentOrder, false); StateHasChanged(); } private async Task Search() { var users = await UserService.GetUsers(); if (!string.IsNullOrWhiteSpace(_searchText)) { users = users .Where(user => user.Email.Contains(_searchText) || user.Username.Contains(_searchText) || user.Id.ToString().Contains(_searchText) || user.CreatedAt.ToString(CultureInfo.InvariantCulture).Contains(_searchText) || _userGroups[user.Id]?.Name.Contains(_searchText) == true) .ToList(); } _users = users; OrderBy(_currentOrder, false); } private string GetFriendlyGroupName(User user) { var group = _userGroups[user.Id]; if (group is null) return null; return group.Name.Replace("group.", ""); } private void OrderBy(OrderType type, bool changeDir = true) { if (_currentOrder == type && changeDir) _currentOrderDirection = (OrderDirection)(((byte)_currentOrderDirection + 1) % 2); if (_currentOrder != type) _currentOrderDirection = OrderDirection.Asc; if (type == OrderType.Email) { _users = _currentOrderDirection == OrderDirection.Asc ? _users.OrderBy(user => user.Email).ToList() : _users.OrderByDescending(user => user.Email).ToList(); } else if (type == OrderType.Username) { _users = _currentOrderDirection == OrderDirection.Asc ? _users.OrderBy(user => user.Username).ToList() : _users.OrderByDescending(user => user.Username).ToList(); } else if (type == OrderType.Registered) { _users = _currentOrderDirection == OrderDirection.Asc ? _users.OrderBy(user => user.CreatedAt).ToList() : _users.OrderByDescending(user => user.CreatedAt).ToList(); } _currentOrder = type; } private async Task Delete(User user) { var result = await Alerts.FireAsync(new SweetAlertOptions { Title = "Are you sure?", Text = "You won't be able to revert this!", Icon = SweetAlertIcon.Warning, ConfirmButtonText = "Yes", ShowCancelButton = true, ShowConfirmButton = true }); if (result.IsConfirmed) { await UserService.DeleteUser(user); await Reload(); await Alerts.FireAsync(new SweetAlertOptions { Title = "Deleted!", Icon = SweetAlertIcon.Success, Timer = 1500, ShowConfirmButton = false }); } } private enum OrderType { None, Email, Username, Registered } private enum OrderDirection : byte { Asc = 0, Desc = 1 } }