From f9081e6fe7ba904b0d7d48cf5cb7b5a45c4d8769 Mon Sep 17 00:00:00 2001 From: Gianmarco Date: Tue, 2 Dec 2025 12:06:07 +0100 Subject: [PATCH] Edit utenti --- Libs/OAService.Domain.dll | Bin 5632 -> 5632 bytes Libs/OAService.Infrastructure.dll | Bin 20480 -> 21504 bytes Libs/OAService.Service.dll | Bin 13824 -> 14848 bytes .../Components/Pages/Account/Login.razor | 8 +- .../Components/Pages/Management/Utenti.razor | 91 +++++++++++--- .../Pages/Management/Utenti_Edit.razor | 117 ++++++++++++++++++ StandManager/Components/_Imports.razor | 6 + StandManager/Model/UtenteViewModel.cs | 40 ++++++ StandManager/Program.cs | 4 +- 9 files changed, 242 insertions(+), 24 deletions(-) create mode 100644 StandManager/Components/Pages/Management/Utenti_Edit.razor create mode 100644 StandManager/Model/UtenteViewModel.cs diff --git a/Libs/OAService.Domain.dll b/Libs/OAService.Domain.dll index f7daef970d8802234d16dda5f9ac2e0be3e702b8..949a07be1424cf961b2171143d3ed4f16d0fc6b9 100644 GIT binary patch delta 231 zcmZqBY0#O_!QvslZSTY$873y(iL1gG*G^_+tY_ljo!rD&$M|qFBa<+f!0t`^-Uoi& z>%FSKU1}NU#Fv{@cv={F4GQ??F);cDFflMN^iAH%E6>`d!@$rs`6jQjeaDjbFH<&d z^;jkT&uqf!sTqtwHO^Ksp~b01#WCr6Wtk<3MVT=!`N^fZsd**EG47cqG5Lu=*|N;! z)cBIg@_a$MP%|X5pk@H=lgk#a-d*@$f{1}#gXmSDZ7}eD@;p9ipmTTeSuk$q6Zpl< P#A3TyP~<)1L<4pJAp=s< delta 211 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 U!5Lo|a(zW-+N=*m`zZ5&0EqVVxc~qF diff --git a/Libs/OAService.Service.dll b/Libs/OAService.Service.dll index 4c8108d0fa6e0b4bde4dfdae137d59b9a2eb8753..5372de50c3d0732ce6dcc2cceb0a912234a24503 100644 GIT binary patch literal 14848 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 literal 13824 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 Jum67$_#ca(;tBu& diff --git a/StandManager/Components/Pages/Account/Login.razor b/StandManager/Components/Pages/Account/Login.razor index d2a2e31..637665a 100644 --- a/StandManager/Components/Pages/Account/Login.razor +++ b/StandManager/Components/Pages/Account/Login.razor @@ -11,10 +11,7 @@ @using System.Security.Claims @using StandManager.Service.Interfaces -@inject StandManagerDbContext dbContext -@inject NavigationManager navi @inject IHttpContextAccessor HttpContextAccessor -@inject IManagerService _managerService
@@ -79,12 +76,13 @@ var claims = new List { new Claim(ClaimTypes.Name, user.Email), - new Claim(ClaimTypes.Role, "Admin") + new Claim(ClaimTypes.Role, "Admin"), + new Claim("UserId", user.Id.ToString()) }; var identity = new ClaimsIdentity(claims, CookieAuthenticationDefaults.AuthenticationScheme); var principal = new ClaimsPrincipal(identity); await httpContext.SignInAsync(principal); - navi.NavigateTo("/management/dashboard"); + _navManager.NavigateTo("/management/dashboard"); } } diff --git a/StandManager/Components/Pages/Management/Utenti.razor b/StandManager/Components/Pages/Management/Utenti.razor index 1b5ea5c..f19855b 100644 --- a/StandManager/Components/Pages/Management/Utenti.razor +++ b/StandManager/Components/Pages/Management/Utenti.razor @@ -1,24 +1,61 @@ -@page "/management/Utenti" -@using Microsoft.AspNetCore.Authorization -@using StandManager.Domain.Entita -@using StandManager.Service.Interfaces -@inject IManagerService _managerService -@attribute [Authorize] -

Utenti

+@attribute [Authorize] +@page "/management/Utenti" +@rendermode InteractiveServer +Utenti - - - - - - - - +
+ + + + +
+
+
+
+
+
+ + + + + + + + + + + + + + + + + +
+
+
+
+
+
+
@code { IQueryable utenti; + RadzenDataGrid userGrid; protected override async Task OnInitializedAsync() { @@ -26,4 +63,24 @@ utenti = await _managerService.UtenteService.RicercaQueryable(x => x.Eliminato == false); } -} \ No newline at end of file + + private async Task EditRow(Utente user) + { + _navManager.NavigateTo($"/management/Utenti/Modifica/{user.Id}"); + } + + private async Task DeleteRow(Utente user) + { + + } + + private async Task SaveRow(Utente user) + { + + } + + private async Task CancelEdit(Utente user) + { + + } +} diff --git a/StandManager/Components/Pages/Management/Utenti_Edit.razor b/StandManager/Components/Pages/Management/Utenti_Edit.razor new file mode 100644 index 0000000..1a8833e --- /dev/null +++ b/StandManager/Components/Pages/Management/Utenti_Edit.razor @@ -0,0 +1,117 @@ +@attribute [Authorize] +@rendermode InteractiveServer + +@page "/management/Utenti/Modifica" +@page "/management/Utenti/Modifica/{UserId:guid}" + +@using Microsoft.AspNetCore.Identity +@using StandManager.Model +@inject AuthenticationStateProvider auth + +@pageTitle + +
+ + + + +
+
+
+
+
+
+
+ + + +
+
+
+ Nome + +
+ +
+ Cognome + +
+ +
+ Email + +
+
+ +
+
+ Password + +
+
+ +
+
+ +
+
+
+
+
+
+
+
+
+
+
+
+ +@code { + [Parameter] + public Guid? UserId { get; set; } + + [SupplyParameterFromForm] + private UtenteViewModel? utente { get; set; } + + private string pageTitle => utente?.Id == Guid.Empty ? "Nuovo utente" : "Modifica utente"; + + protected override async Task OnInitializedAsync() + { + utente ??= await _managerService.UtenteService.RicercaPer(x => x.Id == UserId); + } + + private async Task onUtenteSave() + { + var state = await auth.GetAuthenticationStateAsync(); + var idClaim = state.User.FindFirst("UserId")?.Value; + if (string.IsNullOrEmpty(idClaim)) + { + // gestisci errore (utente non autenticato o claim mancante) + return; + } + + var model = await _managerService.UtenteService.RicercaPer(x => x.Id == utente.Id, solaLettura: false) + ?? new Utente(); + + model = utente.Map(model); + + if (!string.IsNullOrWhiteSpace(utente.Password)) + { + var hasher = new PasswordHasher(); + model.Password = hasher.HashPassword(model, utente.Password); + } + + await _managerService.UtenteService.Salva(model, Guid.Parse(idClaim)); + _navManager.NavigateTo("/management/Utenti"); + } +} diff --git a/StandManager/Components/_Imports.razor b/StandManager/Components/_Imports.razor index e580f08..3f668d8 100644 --- a/StandManager/Components/_Imports.razor +++ b/StandManager/Components/_Imports.razor @@ -9,6 +9,12 @@ @using Microsoft.JSInterop @using StandManager @using StandManager.Components +@using Microsoft.AspNetCore.Authorization +@using StandManager.Domain.Entita +@using StandManager.Service.Interfaces @using Radzen @using Radzen.Blazor + +@inject IManagerService _managerService +@inject NavigationManager _navManager \ No newline at end of file diff --git a/StandManager/Model/UtenteViewModel.cs b/StandManager/Model/UtenteViewModel.cs new file mode 100644 index 0000000..ec66d51 --- /dev/null +++ b/StandManager/Model/UtenteViewModel.cs @@ -0,0 +1,40 @@ +using StandManager.Domain.Entita; +using System.ComponentModel.DataAnnotations; + +namespace StandManager.Model +{ + public class UtenteViewModel + { + public Guid Id { get; set; } + public string Username { get; set; } + //[Required] + //[EmailAddress(ErrorMessage = "Email non valida")] + public string Email { get; set; } + public string Password { get; set; } + //[Required(ErrorMessage ="Il nome è obbligatorio")] + public string Nome { get; set; } + //[Required(ErrorMessage = "Il cognome è obbligatorio")] + public string Cognome { get; set; } + + public static implicit operator UtenteViewModel(Utente? model) + { + return model == null ? null : new UtenteViewModel + { + Id = model.Id, + Username = model.Username, + Email = model.Email, + Nome = model.Nome, + Cognome = model.Cognome + }; + } + + public Utente Map(Utente model) + { + model.Nome = Nome; + model.Cognome = Cognome; + model.Email = Email; + + return model; + } + } +} diff --git a/StandManager/Program.cs b/StandManager/Program.cs index 6fcf026..b01cdb0 100644 --- a/StandManager/Program.cs +++ b/StandManager/Program.cs @@ -84,11 +84,11 @@ else app.UseHttpsRedirection(); app.UseStaticFiles(); -app.UseAntiforgery(); - app.UseAuthentication(); app.UseAuthorization(); +app.UseAntiforgery(); + app.MapRazorComponents() .AddInteractiveServerRenderMode();