diff --git a/TecniStamp/TecniStamp/Components/Pages/Anagrafiche/Operatore.razor b/TecniStamp/TecniStamp/Components/Pages/Anagrafiche/Operatore.razor index 3a6de7e..90d920e 100644 --- a/TecniStamp/TecniStamp/Components/Pages/Anagrafiche/Operatore.razor +++ b/TecniStamp/TecniStamp/Components/Pages/Anagrafiche/Operatore.razor @@ -2,15 +2,17 @@ @using Microsoft.EntityFrameworkCore @using TecniStamp.Domain @using TecniStamp.Model +@using TecniStamp.Utils @rendermode InteractiveServer +@inject AuthenticationStateProvider auth Operatori
-
+
@@ -18,7 +20,7 @@
@@ -38,7 +40,7 @@ @@ -76,4 +78,23 @@ { _navManager.NavigateTo($"/Anagrafiche/Operatori/Modifica/{cliente.Id}"); } + + /// + /// Chiede conferma ed elimina l’utente; se confermato, aggiorna la lista + /// ricaricandola dal database. + /// + private async Task DeleteRow(UserViewModel user) + { + var ok = await _dialogService.Confirm($"Vuoi davvero eliminare l'utente {user.Nome}?", "Conferma eliminazione", new ConfirmOptions { OkButtonText = "Sì", CancelButtonText = "No", Width = "400px" }); + + if (ok == true) + { + await _managerService.UtenteService.Elimina(user.Id, await MembershipUtils.GetUserId(auth)); + utenti = (await _managerService.UtenteService.RicercaQueryable( + x => x.Eliminato == false, + includi: x => x.Include(y => y.Ruolo), + ordinamento: x => x.OrderBy(y => y.Cognome).ThenBy(z => z.Nome))) + .Select(x => (UserViewModel)x).ToList(); + } + } } diff --git a/TecniStamp/TecniStamp/Components/Pages/Anagrafiche/Operatore_Edit.razor b/TecniStamp/TecniStamp/Components/Pages/Anagrafiche/Operatore_Edit.razor index e0149af..1ff6075 100644 --- a/TecniStamp/TecniStamp/Components/Pages/Anagrafiche/Operatore_Edit.razor +++ b/TecniStamp/TecniStamp/Components/Pages/Anagrafiche/Operatore_Edit.razor @@ -54,7 +54,8 @@
Ruolo - + +
diff --git a/TecniStamp/TecniStamp/Components/Pages/Anagrafiche/Ruolo.razor b/TecniStamp/TecniStamp/Components/Pages/Anagrafiche/Ruolo.razor index 5e136b3..cd37195 100644 --- a/TecniStamp/TecniStamp/Components/Pages/Anagrafiche/Ruolo.razor +++ b/TecniStamp/TecniStamp/Components/Pages/Anagrafiche/Ruolo.razor @@ -1,7 +1,73 @@ @page "/anagrafiche/ruoli" +@using Microsoft.EntityFrameworkCore +@using TecniStamp.Model + +Ruoli + +
+ +
+
+
+
+ +

Ruoli

+
+ +
+
+
+ + + + + + + + + +
+
+
+
+
+
+
@code { + List ruoli; + RadzenDataGrid ruoliGrid; - - + /// + /// Carica la lista dei ruoli non eliminati, ordinandoli per nome. + /// + protected override async Task OnInitializedAsync() + { + await base.OnInitializedAsync(); + + ruoli = (await _managerService.RuoloService.RicercaQueryable( + x => x.Eliminato == false, + includi: x => x.Include(y => y.UtenteCreazione), + ordinamento: x => x.OrderBy(y => y.Nome))) + .Select(x => (RuoloViewModel)x).ToList(); + } + + /// + /// Apre la pagina di modifica per il cliente selezionato. + /// + private async Task EditRow(RuoloViewModel ruolo) + { + _navManager.NavigateTo($"/Anagrafiche/Ruoli/Modifica/{ruolo.Id}"); + } } diff --git a/TecniStamp/TecniStamp/Components/Pages/Anagrafiche/Ruolo_Edit.razor b/TecniStamp/TecniStamp/Components/Pages/Anagrafiche/Ruolo_Edit.razor new file mode 100644 index 0000000..6faae3f --- /dev/null +++ b/TecniStamp/TecniStamp/Components/Pages/Anagrafiche/Ruolo_Edit.razor @@ -0,0 +1,115 @@ +@page "/Anagrafiche/ruoli/Modifica" +@page "/Anagrafiche/ruoli/Modifica/{RuoloId:guid}" +@using Microsoft.AspNetCore.Identity +@using Microsoft.EntityFrameworkCore +@using TecniStamp.Domain +@using TecniStamp.Model + +@rendermode InteractiveServer + +@pageTitle + +
+ + + + +
+
+
+
+
+
+
+ + + +
+
+
+ Descrizione + + +
+
+ +
+
+ +
+
+ +
+
+
+
+
+
+
+
+
+
+
+
+ + +@code { + [Parameter] public Guid? RuoloId { get; set; } + + public RuoloViewModel Model { get; set; } = new(); + + private string pageTitle => Model?.Id == Guid.Empty ? "Nuovo Ruolo" : $"Modifica Ruolo {Model}"; + + protected override async Task OnInitializedAsync() + { + await base.OnInitializedAsync(); + + Model = RuoloId.GetValueOrDefault() == Guid.Empty + ? new RuoloViewModel() + : await _managerService.RuoloService.RicercaPer(x => x.Id == RuoloId); + } + + /// + /// Salva l’utente: recupera o crea il modello, applica le modifiche dalla UI, + /// gestisce l’hash della password se inserita e registra tutto a database + /// usando l’ID dell’utente autenticato. + /// + private async Task onRuoloSave() + { + 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.RuoloService.RicercaPer(x => x.Id == Model.Id, solaLettura: false) + ?? new Ruolo(); + + model = Model.Map(model); + + await _managerService.UtenteService.Salva(model, Guid.Parse(idClaim)); + _navManager.NavigateTo($"/Anagrafiche/ruoli/Modifica/{Model.Id}"); + } + + /// + /// Torna all’elenco utenti senza applicare altre azioni. + /// + private void backToHome() + { + _navManager.NavigateTo("/Anagrafiche/Operatori"); + } +} \ No newline at end of file diff --git a/TecniStamp/TecniStamp/Model/UserViewModel.cs b/TecniStamp/TecniStamp/Model/UserViewModel.cs index b2e38df..7e8283f 100644 --- a/TecniStamp/TecniStamp/Model/UserViewModel.cs +++ b/TecniStamp/TecniStamp/Model/UserViewModel.cs @@ -1,14 +1,24 @@ -using TecniStamp.Domain; +using System.ComponentModel.DataAnnotations; +using TecniStamp.Domain; namespace TecniStamp.Model; public class UserViewModel : BaseViewModel { public string Username { get; set; } + + [Required(ErrorMessage = "L'email è obbligatoria")] + [EmailAddress(ErrorMessage = "Formato email non valido")] 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; } + + [Required(ErrorMessage = "Il ruolo è obbligatorio")] public Guid RuoloId { get; set; } public string Ruolo { get; set; }