add loggers

users
maxime.batista 1 year ago
parent fd4cabbd1a
commit f871249669

@ -6,4 +6,9 @@ public class User
public required string Email { get; set; }
public uint Id { get; set; }
public bool IsAdmin { get; set; }
public override string ToString()
{
return $"{nameof(Name)}: {Name}, {nameof(Email)}: {Email}, {nameof(Id)}: {Id}, {nameof(IsAdmin)}: {IsAdmin}";
}
}

@ -7,22 +7,22 @@
<h1>User Panel</h1>
<div id="users-div">
<MudOverlay Visible="IsAddingUser" DarkBackground>
<MudForm id="add-account-form">
<MudTextField T="string"
Label="Name"
@bind-Value="FormAccountName"
Required
Required
Validation="@(VerifyLength(6, 256))"/>
<MudTextField T="string"
Label="Email"
@bind-Value="FormAccountEmail"
Required
Validation="@(new EmailAddressAttribute() {ErrorMessage = "The email address is invalid"})"/>
<MudTextField T="string"
InputType="InputType.Password"
Label="Password"
<MudTextField T="string"
Label="Email"
@bind-Value="FormAccountEmail"
Required
Validation="@(new EmailAddressAttribute() { ErrorMessage = "The email address is invalid" })"/>
<MudTextField T="string"
InputType="InputType.Password"
Label="Password"
@bind-Value="FormAccountPassword"
Validation="@(VerifyLength(6, 256))"
Required/>
@ -33,15 +33,7 @@
</MudForm>
</MudOverlay>
<div style="display: flex; align-items: center">
<MudIconButton Icon="@Icons.Material.Filled.Add" OnClick="@(() => IsAddingUser = true)" Color="@Color.Success" Class="add-item-btn"/>
<MudText Align="Align.Center">Add Account</MudText>
</div>
<div style="display: flex; align-items: center">
<MudIconButton Icon="@Icons.Material.Filled.Remove" OnClick="RemoveSelection" Color="@Color.Error" Class="remove-item-btn"/>
<MudText Align="Align.Center">Remove Selection</MudText>
</div>
<MudDataGrid
T="User"
@ref="Grid"
@ -53,6 +45,29 @@
EditMode="DataGridEditMode.Form"
@bind-SelectedItems="SelectedItems"
CommittedItemChanges="OnAccountUpdated">
<ToolBarContent>
<div style="display: flex; align-items: center">
<MudIconButton Icon="@Icons.Material.Filled.Add" OnClick="@(() => IsAddingUser = true)" Color="@Color.Success" Class="add-item-btn"/>
<MudText Align="Align.Center">Add Account</MudText>
</div>
<div style="display: flex; align-items: center">
<MudIconButton Icon="@Icons.Material.Filled.Remove" OnClick="RemoveSelection" Color="@Color.Error" Class="remove-item-btn"/>
<MudText Align="Align.Center">Remove Selection</MudText>
</div>
<MudSpacer/>
<MudText>Accounts</MudText>
<MudSpacer/>
<MudTextField
T="string"
@bind-Value="SearchString"
OnKeyDown="@ValidateSearch"
Placeholder="Search an email or a name"
AdornmentIcon="@Icons.Material.Filled.Search"
Immediate
IconSize="Size.Medium"/>
</ToolBarContent>
<Columns>
<SelectColumn T="User"/>
<PropertyColumn Property="x => x.Name" Required/>

@ -8,11 +8,15 @@ namespace AdminPanel.Pages
{
public partial class UserListPanel
{
[Inject] public ISnackbar Snackbar { get; private init; }
[Inject] public IUsersService Service { get; private init; }
[Inject] private ISnackbar Snackbar { get; init; }
[Inject] private IUsersService Service { get; init; }
[Inject] private ILogger<UserListPanel> Logger { get; init; }
private MudDataGrid<User> Grid { get; set; }
private string? SearchString { get; set; }
private HashSet<User> SelectedItems { get; set; } = new();
@ -26,7 +30,8 @@ namespace AdminPanel.Pages
private async Task<GridData<User>> LoadUsersFromServer(GridState<User> state)
{
var (count, users) = await Service.ListUsers((uint)(state.Page * state.PageSize), (uint)state.PageSize);
Logger.LogDebug($"Loading users from server, state = {state} searchString = {SearchString}");
var (count, users) = await Service.ListUsers((uint)(state.Page * state.PageSize), (uint)state.PageSize, SearchString);
return new GridData<User>
{
TotalItems = (int)count,
@ -37,7 +42,7 @@ namespace AdminPanel.Pages
private async void OnAccountUpdated(User user)
{
Console.WriteLine(user.IsAdmin);
Logger.LogDebug($"Account updated : {user}");
try
{
await Service.UpdateUser(user);
@ -56,8 +61,9 @@ namespace AdminPanel.Pages
try
{
await Service.AddUser(FormAccountName!, FormAccountEmail!, FormAccountPassword!,
var user = await Service.AddUser(FormAccountName!, FormAccountEmail!, FormAccountPassword!,
FormAccountIsAdmin);
Logger.LogDebug($"Added user : {user}");
await Grid.ReloadServerData();
}
catch (Exception)
@ -68,11 +74,11 @@ namespace AdminPanel.Pages
private async void RemoveSelection(MouseEventArgs e)
{
var items = SelectedItems.ToList().ConvertAll(u => u.Id);
Console.WriteLine(items.Count);
var users = SelectedItems.ToList().ConvertAll(u => u.Id);
Logger.LogDebug($"Removing users : {users}");
try
{
await Service.RemoveUsers(items);
await Service.RemoveUsers(users);
await Grid.ReloadServerData();
}
catch (Exception)
@ -83,7 +89,16 @@ namespace AdminPanel.Pages
private Func<string, string?> VerifyLength(uint min, uint max)
{
return s => (s.Length >= min && s.Length <= max) ? null : $"length is incorrect (must be between {min} and {max})";
return s => s.Length >= min && s.Length <= max ? null : $"length is incorrect (must be between {min} and {max})";
}
private void ValidateSearch(KeyboardEventArgs e)
{
if (e.Key == "Enter")
{
Grid.ReloadServerData();
Logger.LogDebug($"Searching for {SearchString}");
}
}
}
}

@ -1,4 +1,5 @@
using AdminPanel;
using AdminPanel.Pages;
using AdminPanel.Services;
using Microsoft.AspNetCore.Components.Web;
using Microsoft.AspNetCore.Components.WebAssembly.Hosting;
@ -11,10 +12,11 @@ builder.RootComponents.Add<HeadOutlet>("head::after");
builder.Services
.AddScoped(sp => new HttpClient { BaseAddress = new Uri(builder.HostEnvironment.BaseAddress) });
builder.Logging.SetMinimumLevel(LogLevel.Debug);
var client = new HttpClient
{
BaseAddress = new Uri("http://localhost:8080")
};
builder.Services.AddScoped<IUsersService>(sp => new HttpUsersService(client));

@ -14,9 +14,9 @@ public class HttpUsersService : IUsersService
private record ListUsersResponse(List<User> Users, uint TotalCount);
public async Task<(uint, List<User>)> ListUsers(uint from, uint len)
public async Task<(uint, List<User>)> ListUsers(uint from, uint len, string? searchString = null)
{
var httpResponse = await Client.GetAsync($"/api/admin/list-users?start={from}&n={len}");
var httpResponse = await Client.GetAsync($"/api/admin/list-users?start={from}&n={len}&search={searchString ?? ""}");
httpResponse.EnsureSuccessStatusCode();
var response = await httpResponse.Content.ReadFromJsonAsync<ListUsersResponse>()

@ -4,7 +4,7 @@ namespace AdminPanel.Services
{
public interface IUsersService
{
public Task<(uint, List<User>)> ListUsers(uint from, uint len);
public Task<(uint, List<User>)> ListUsers(uint from, uint len, string? searchString = null);
public Task<User> AddUser(string username, string email, string password, bool isAdmin);

@ -1,5 +1,4 @@
using AdminPanel.Models;
using System.Runtime.CompilerServices;
namespace AdminPanel.Services
{
@ -36,13 +35,14 @@ namespace AdminPanel.Services
return Task.FromResult(user);
}
public async Task<(uint, List<User>)> ListUsers(uint from, uint len)
public async Task<(uint, List<User>)> ListUsers(uint from, uint len, string? searchString = null)
{
//simulate a 1sec long request
await Task.Delay(1000);
var slice = Users.Values
.ToList()
.GetRange((int)from, (int)((from + len > Users.Count) ? Users.Count - from : len));
.FindAll(a => searchString == null || a.Name.Contains(searchString) || a.Email.Contains(searchString))
.GetRange((int)from, (int)(from + len > Users.Count ? Users.Count - from : len));
return ((uint)Users.Count, slice);
}

Loading…
Cancel
Save