From 065de43d6c48dc1f8999b93759f3c321ba7d1593 Mon Sep 17 00:00:00 2001 From: Egamorf Date: Sat, 26 Apr 2025 21:03:58 +0200 Subject: [PATCH] Get users and role and add user row --- .../Pages/Users/Components/UserRow.razor | 35 +++++++ .../Pages/Users/Components/UserRow.razor.cs | 62 ++++++++++++ .../Pages/Users/Components/UserRow.razor.css | 14 +++ .../Pages/Users/Components/UserValidator.cs | 23 +++++ .../Pages/Users/Users.razor | 7 +- .../Pages/Users/Users.razor.cs | 8 ++ .../Pages/Users/Users.razor.css | 10 ++ .../Client/GameIdeas.BlazorApp/Program.cs | 2 + .../SelectSearch/SelectSearch.razor | 2 +- .../SelectSearch/SelectSearch.razor.cs | 1 + .../Shared/Constants/Icons.cs | 12 +++ .../CreateStaticResourceKey.cs | 2 + src/GameIdeas/GameIdeas.Shared/Dto/UserDto.cs | 2 +- .../Controllers/UserController.cs | 34 ++++++- .../GameIdeas.WebAPI/Files/GameIdeas.fr.json | 3 +- .../GameIdeas.WebAPI/Profiles/UserProfile.cs | 20 ++++ .../Services/Games/GameReadService.cs | 2 +- .../Services/Users/IUserService.cs | 2 + .../Services/Users/UserService.cs | 94 ++++++++++++++++++- 19 files changed, 325 insertions(+), 10 deletions(-) create mode 100644 src/GameIdeas/Client/GameIdeas.BlazorApp/Pages/Users/Components/UserRow.razor create mode 100644 src/GameIdeas/Client/GameIdeas.BlazorApp/Pages/Users/Components/UserRow.razor.cs create mode 100644 src/GameIdeas/Client/GameIdeas.BlazorApp/Pages/Users/Components/UserRow.razor.css create mode 100644 src/GameIdeas/Client/GameIdeas.BlazorApp/Pages/Users/Components/UserValidator.cs create mode 100644 src/GameIdeas/Server/GameIdeas.WebAPI/Profiles/UserProfile.cs diff --git a/src/GameIdeas/Client/GameIdeas.BlazorApp/Pages/Users/Components/UserRow.razor b/src/GameIdeas/Client/GameIdeas.BlazorApp/Pages/Users/Components/UserRow.razor new file mode 100644 index 0000000..763feb1 --- /dev/null +++ b/src/GameIdeas/Client/GameIdeas.BlazorApp/Pages/Users/Components/UserRow.razor @@ -0,0 +1,35 @@ +@using GameIdeas.BlazorApp.Shared.Components.Select +@using GameIdeas.BlazorApp.Shared.Components.Select.Models +@using GameIdeas.BlazorApp.Shared.Constants +@using GameIdeas.Shared.Dto + + +
+
+ @Icons.Account +
+
+ +
+
+ +
+
+ +
+
+ + @if (!CanEdit) + { + + } + else + { + + } +
+
+
\ No newline at end of file diff --git a/src/GameIdeas/Client/GameIdeas.BlazorApp/Pages/Users/Components/UserRow.razor.cs b/src/GameIdeas/Client/GameIdeas.BlazorApp/Pages/Users/Components/UserRow.razor.cs new file mode 100644 index 0000000..c8eaca8 --- /dev/null +++ b/src/GameIdeas/Client/GameIdeas.BlazorApp/Pages/Users/Components/UserRow.razor.cs @@ -0,0 +1,62 @@ +using GameIdeas.BlazorApp.Shared.Components.Select; +using GameIdeas.BlazorApp.Shared.Components.Select.Models; +using GameIdeas.Shared.Dto; +using Microsoft.AspNetCore.Components; +using Microsoft.AspNetCore.Components.Forms; + +namespace GameIdeas.BlazorApp.Pages.Users.Components; + +public partial class UserRow +{ + [Parameter] public UserDto User { get; set; } = new(); + [Parameter] public List Roles { get; set; } = []; + [Parameter] public bool CanEdit { get; set; } = false; + [Parameter] public EventCallback OnRemove { get; set; } + [Parameter] public EventCallback OnSubmit { get; set; } + + private SelectParams SelectRoleParams = new(); + private EditContext? EditContext; + + protected override void OnInitialized() + { + EditContext = new(User); + base.OnInitialized(); + } + + protected override void OnParametersSet() + { + SelectRoleParams = new() + { + GetItemLabel = role => role.Name, + Items = Roles + }; + + base.OnParametersSet(); + } + + private void HandleValuesChanged(IEnumerable roles) + { + User.Role = roles.FirstOrDefault(); + } + + private async Task HandleSubmitClicked() + { + if (EditContext?.Validate() == false) + { + return; + } + + CanEdit = false; + await OnSubmit.InvokeAsync(User); + } + + + private void HandleEditClicked() + { + CanEdit = true; + } + private async Task HandleRemoveClicked() + { + await OnRemove.InvokeAsync(User); + } +} \ No newline at end of file diff --git a/src/GameIdeas/Client/GameIdeas.BlazorApp/Pages/Users/Components/UserRow.razor.css b/src/GameIdeas/Client/GameIdeas.BlazorApp/Pages/Users/Components/UserRow.razor.css new file mode 100644 index 0000000..5c0ab4a --- /dev/null +++ b/src/GameIdeas/Client/GameIdeas.BlazorApp/Pages/Users/Components/UserRow.razor.css @@ -0,0 +1,14 @@ +.row { + height: 64px; + display: grid; + grid-template-columns: 48px 1fr 1fr 1fr auto; + grid-gap: 8px; + padding: 0 8px; + background: var(--input-secondary); + box-shadow: var(--drop-shadow); + border-radius: var(--big-radius); +} + +.row > * { + align-content: center; +} diff --git a/src/GameIdeas/Client/GameIdeas.BlazorApp/Pages/Users/Components/UserValidator.cs b/src/GameIdeas/Client/GameIdeas.BlazorApp/Pages/Users/Components/UserValidator.cs new file mode 100644 index 0000000..7550c83 --- /dev/null +++ b/src/GameIdeas/Client/GameIdeas.BlazorApp/Pages/Users/Components/UserValidator.cs @@ -0,0 +1,23 @@ +using FluentValidation; +using GameIdeas.Resources; +using GameIdeas.Shared.Dto; + +namespace GameIdeas.BlazorApp.Pages.Users.Components; + +public class UserValidator : AbstractValidator +{ + public UserValidator() + { + RuleFor(user => user.Username) + .NotEmpty() + .WithMessage(ResourcesKey.MissingField); + + RuleFor(user => user.Password) + .NotEmpty() + .WithMessage(ResourcesKey.MissingField); + + RuleFor(user => user.Role) + .NotEmpty() + .WithMessage(ResourcesKey.MissingField); + } +} diff --git a/src/GameIdeas/Client/GameIdeas.BlazorApp/Pages/Users/Users.razor b/src/GameIdeas/Client/GameIdeas.BlazorApp/Pages/Users/Users.razor index 4b34129..673f280 100644 --- a/src/GameIdeas/Client/GameIdeas.BlazorApp/Pages/Users/Users.razor +++ b/src/GameIdeas/Client/GameIdeas.BlazorApp/Pages/Users/Users.razor @@ -1,8 +1,10 @@ @page "/Users" @using GameIdeas.BlazorApp.Pages.Games.Header @using GameIdeas.BlazorApp.Layouts +@using GameIdeas.BlazorApp.Pages.Users.Components @using GameIdeas.BlazorApp.Shared.Components.Popup @using GameIdeas.BlazorApp.Shared.Components.Search +@using GameIdeas.BlazorApp.Shared.Components.Select.Models @using GameIdeas.BlazorApp.Shared.Components.SelectSearch @using GameIdeas.Shared.Dto @@ -14,7 +16,7 @@
+ Items="Roles.ToList()" GetLabel="@(role => role.Name)" Theme="SelectTheme.Filter" />
@@ -24,7 +26,7 @@ { @foreach (var user in UserList.Users ?? []) { - + } } else @@ -34,7 +36,6 @@ } } - diff --git a/src/GameIdeas/Client/GameIdeas.BlazorApp/Pages/Users/Users.razor.cs b/src/GameIdeas/Client/GameIdeas.BlazorApp/Pages/Users/Users.razor.cs index 08b6dea..19212ea 100644 --- a/src/GameIdeas/Client/GameIdeas.BlazorApp/Pages/Users/Users.razor.cs +++ b/src/GameIdeas/Client/GameIdeas.BlazorApp/Pages/Users/Users.razor.cs @@ -43,4 +43,12 @@ public partial class Users IsLoading = false; } } + private Task HandleSubmitUser(UserDto args) + { + throw new NotImplementedException(); + } + private Task HandleRemoveUser(UserDto args) + { + throw new NotImplementedException(); + } } \ No newline at end of file diff --git a/src/GameIdeas/Client/GameIdeas.BlazorApp/Pages/Users/Users.razor.css b/src/GameIdeas/Client/GameIdeas.BlazorApp/Pages/Users/Users.razor.css index d839b81..068faa8 100644 --- a/src/GameIdeas/Client/GameIdeas.BlazorApp/Pages/Users/Users.razor.css +++ b/src/GameIdeas/Client/GameIdeas.BlazorApp/Pages/Users/Users.razor.css @@ -8,3 +8,13 @@ box-sizing: border-box; width: 200px; } + +.container { + padding: 20px 200px; +} + +@media screen and (max-width: 1000px) { + .container { + padding: 20px 20px; + } +} diff --git a/src/GameIdeas/Client/GameIdeas.BlazorApp/Program.cs b/src/GameIdeas/Client/GameIdeas.BlazorApp/Program.cs index 4edf1f7..261e04c 100644 --- a/src/GameIdeas/Client/GameIdeas.BlazorApp/Program.cs +++ b/src/GameIdeas/Client/GameIdeas.BlazorApp/Program.cs @@ -3,6 +3,7 @@ using Blazored.LocalStorage; using GameIdeas.BlazorApp; using GameIdeas.BlazorApp.Pages.Games.Gateways; using GameIdeas.BlazorApp.Pages.UserMenu.Gateways; +using GameIdeas.BlazorApp.Pages.Users.Gateways; using GameIdeas.BlazorApp.Services; using GameIdeas.Resources; using Microsoft.AspNetCore.Components.Authorization; @@ -37,6 +38,7 @@ services.AddScoped(); services.AddScoped(); services.AddScoped(); +services.AddScoped(); services.AddSingleton(); services.AddSingleton(); diff --git a/src/GameIdeas/Client/GameIdeas.BlazorApp/Shared/Components/SelectSearch/SelectSearch.razor b/src/GameIdeas/Client/GameIdeas.BlazorApp/Shared/Components/SelectSearch/SelectSearch.razor index 35c1a8a..383fdb8 100644 --- a/src/GameIdeas/Client/GameIdeas.BlazorApp/Shared/Components/SelectSearch/SelectSearch.razor +++ b/src/GameIdeas/Client/GameIdeas.BlazorApp/Shared/Components/SelectSearch/SelectSearch.razor @@ -5,7 +5,7 @@ @typeparam TItem -