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 -