@@ -99,20 +73,4 @@
base.OnInitializedAsync();
currentUrl = NavManager.ToBaseRelativePath(NavManager.Uri);
}
-
- private string GetActiveClass(string href)
- {
- string currentClean = currentUrl.Split("management").Last();
- string hrefClean = href.Split("management").Last();
-
-
- if (currentClean.Contains("?"))
- currentClean = currentClean.Substring(0, currentClean.IndexOf("?"));
-
- var isActive = (currentClean.Contains(hrefClean, StringComparison.OrdinalIgnoreCase) && !string.IsNullOrEmpty(hrefClean)
- || (string.IsNullOrEmpty(hrefClean) && string.IsNullOrEmpty(currentClean)));
-
- return isActive ? "active" : "";
- }
-
}
\ No newline at end of file
diff --git a/StandManager/Components/Layout/NavMenu.razor b/StandManager/Components/Layout/NavMenu.razor
deleted file mode 100644
index 6c00167..0000000
--- a/StandManager/Components/Layout/NavMenu.razor
+++ /dev/null
@@ -1,94 +0,0 @@
-@implements IDisposable
-
-@inject NavigationManager NavigationManager
-
-
-
-
-
-
-
-@code {
- private string? currentUrl;
-
- protected override void OnInitialized()
- {
- currentUrl = NavigationManager.ToBaseRelativePath(NavigationManager.Uri);
- NavigationManager.LocationChanged += OnLocationChanged;
- }
-
- private void OnLocationChanged(object? sender, LocationChangedEventArgs e)
- {
- currentUrl = NavigationManager.ToBaseRelativePath(e.Location);
- StateHasChanged();
- }
-
- public void Dispose()
- {
- NavigationManager.LocationChanged -= OnLocationChanged;
- }
-
- public void onLogoutPressed()
- {
- var a = "";
- }
-}
-
diff --git a/StandManager/Components/Layout/NavMenu.razor.css b/StandManager/Components/Layout/NavMenu.razor.css
deleted file mode 100644
index 16700eb..0000000
--- a/StandManager/Components/Layout/NavMenu.razor.css
+++ /dev/null
@@ -1,125 +0,0 @@
-.navbar-toggler {
- appearance: none;
- cursor: pointer;
- width: 3.5rem;
- height: 2.5rem;
- color: white;
- position: absolute;
- top: 0.5rem;
- right: 1rem;
- border: 1px solid rgba(255, 255, 255, 0.1);
- background: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30'%3e%3cpath stroke='rgba%28255, 255, 255, 0.55%29' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e") no-repeat center/1.75rem rgba(255, 255, 255, 0.1);
-}
-
-.navbar-toggler:checked {
- background-color: rgba(255, 255, 255, 0.5);
-}
-
-.top-row {
- height: 3.5rem;
- background-color: rgba(0,0,0,0.4);
-}
-
-.navbar-brand {
- font-size: 1.1rem;
-}
-
-.bi {
- display: inline-block;
- position: relative;
- width: 1.25rem;
- height: 1.25rem;
- margin-right: 0.75rem;
- top: -1px;
- background-size: cover;
-}
-
-.bi-house-door-fill-nav-menu {
- background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' fill='white' class='bi bi-house-door-fill' viewBox='0 0 16 16'%3E%3Cpath d='M6.5 14.5v-3.505c0-.245.25-.495.5-.495h2c.25 0 .5.25.5.5v3.5a.5.5 0 0 0 .5.5h4a.5.5 0 0 0 .5-.5v-7a.5.5 0 0 0-.146-.354L13 5.793V2.5a.5.5 0 0 0-.5-.5h-1a.5.5 0 0 0-.5.5v1.293L8.354 1.146a.5.5 0 0 0-.708 0l-6 6A.5.5 0 0 0 1.5 7.5v7a.5.5 0 0 0 .5.5h4a.5.5 0 0 0 .5-.5Z'/%3E%3C/svg%3E");
-}
-
-.bi-plus-square-fill-nav-menu {
- background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' fill='white' class='bi bi-plus-square-fill' viewBox='0 0 16 16'%3E%3Cpath d='M2 0a2 2 0 0 0-2 2v12a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V2a2 2 0 0 0-2-2H2zm6.5 4.5v3h3a.5.5 0 0 1 0 1h-3v3a.5.5 0 0 1-1 0v-3h-3a.5.5 0 0 1 0-1h3v-3a.5.5 0 0 1 1 0z'/%3E%3C/svg%3E");
-}
-
-.bi-list-nested-nav-menu {
- background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' fill='white' class='bi bi-list-nested' viewBox='0 0 16 16'%3E%3Cpath fill-rule='evenodd' d='M4.5 11.5A.5.5 0 0 1 5 11h10a.5.5 0 0 1 0 1H5a.5.5 0 0 1-.5-.5zm-2-4A.5.5 0 0 1 3 7h10a.5.5 0 0 1 0 1H3a.5.5 0 0 1-.5-.5zm-2-4A.5.5 0 0 1 1 3h10a.5.5 0 0 1 0 1H1a.5.5 0 0 1-.5-.5z'/%3E%3C/svg%3E");
-}
-
-.bi-lock-nav-menu {
- background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' fill='white' class='bi bi-list-nested' viewBox='0 0 16 16'%3E%3Cpath d='M8 1a2 2 0 0 1 2 2v4H6V3a2 2 0 0 1 2-2zm3 6V3a3 3 0 0 0-6 0v4a2 2 0 0 0-2 2v5a2 2 0 0 0 2 2h6a2 2 0 0 0 2-2V9a2 2 0 0 0-2-2zM5 8h6a1 1 0 0 1 1 1v5a1 1 0 0 1-1 1H5a1 1 0 0 1-1-1V9a1 1 0 0 1 1-1z'/%3E%3C/svg%3E");
-}
-
-.bi-person-nav-menu {
- background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' fill='white' class='bi bi-person' viewBox='0 0 16 16'%3E%3Cpath d='M8 8a3 3 0 1 0 0-6 3 3 0 0 0 0 6Zm2-3a2 2 0 1 1-4 0 2 2 0 0 1 4 0Zm4 8c0 1-1 1-1 1H3s-1 0-1-1 1-4 6-4 6 3 6 4Zm-1-.004c-.001-.246-.154-.986-.832-1.664C11.516 10.68 10.289 10 8 10c-2.29 0-3.516.68-4.168 1.332-.678.678-.83 1.418-.832 1.664h10Z'/%3E%3C/svg%3E");
-}
-
-.bi-person-badge-nav-menu {
- background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' fill='white' class='bi bi-person-badge' viewBox='0 0 16 16'%3E%3Cpath d='M6.5 2a.5.5 0 0 0 0 1h3a.5.5 0 0 0 0-1h-3zM11 8a3 3 0 1 1-6 0 3 3 0 0 1 6 0z'/%3E%3Cpath d='M4.5 0A2.5 2.5 0 0 0 2 2.5V14a2 2 0 0 0 2 2h8a2 2 0 0 0 2-2V2.5A2.5 2.5 0 0 0 11.5 0h-7zM3 2.5A1.5 1.5 0 0 1 4.5 1h7A1.5 1.5 0 0 1 13 2.5v10.795a4.2 4.2 0 0 0-.776-.492C11.392 12.387 10.063 12 8 12s-3.392.387-4.224.803a4.2 4.2 0 0 0-.776.492V2.5z'/%3E%3C/svg%3E");
-}
-
-.bi-person-fill-nav-menu {
- background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' fill='white' class='bi bi-person-fill' viewBox='0 0 16 16'%3E%3Cpath d='M3 14s-1 0-1-1 1-4 6-4 6 3 6 4-1 1-1 1H3Zm5-6a3 3 0 1 0 0-6 3 3 0 0 0 0 6Z'/%3E%3C/svg%3E");
-}
-
-.bi-arrow-bar-left-nav-menu {
- background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' fill='white' class='bi bi-arrow-bar-left' viewBox='0 0 16 16'%3E%3Cpath d='M12.5 15a.5.5 0 0 1-.5-.5v-13a.5.5 0 0 1 1 0v13a.5.5 0 0 1-.5.5ZM10 8a.5.5 0 0 1-.5.5H3.707l2.147 2.146a.5.5 0 0 1-.708.708l-3-3a.5.5 0 0 1 0-.708l3-3a.5.5 0 1 1 .708.708L3.707 7.5H9.5a.5.5 0 0 1 .5.5Z'/%3E%3C/svg%3E");
-}
-
-.nav-item {
- font-size: 0.9rem;
- padding-bottom: 0.5rem;
-}
-
- .nav-item:first-of-type {
- padding-top: 1rem;
- }
-
- .nav-item:last-of-type {
- padding-bottom: 1rem;
- }
-
- .nav-item ::deep .nav-link {
- color: #d7d7d7;
- background: none;
- border: none;
- border-radius: 4px;
- height: 3rem;
- display: flex;
- align-items: center;
- line-height: 3rem;
- width: 100%;
- }
-
-.nav-item ::deep a.active {
- background-color: rgba(255,255,255,0.37);
- color: white;
-}
-
-.nav-item ::deep .nav-link:hover {
- background-color: rgba(255,255,255,0.1);
- color: white;
-}
-
-.nav-scrollable {
- display: none;
-}
-
-.navbar-toggler:checked ~ .nav-scrollable {
- display: block;
-}
-
-@media (min-width: 641px) {
- .navbar-toggler {
- display: none;
- }
-
- .nav-scrollable {
- /* Never collapse the sidebar for wide screens */
- display: block;
-
- /* Allow sidebar to scroll for tall menus */
- height: calc(100vh - 3.5rem);
- overflow-y: auto;
- }
-}
diff --git a/StandManager/Components/NavigationItem.razor b/StandManager/Components/NavigationItem.razor
new file mode 100644
index 0000000..588f129
--- /dev/null
+++ b/StandManager/Components/NavigationItem.razor
@@ -0,0 +1,31 @@
+
+
+
+
+
+ @title
+
+
+
+@code{
+ [Parameter] public string currentUrl { get; set; } = "";
+ [Parameter] public string requiredUrl { get; set; } = "/";
+ [Parameter] public string destination { get; set; } = "/";
+ [Parameter] public string iconName { get; set; } = "fa-user";
+ [Parameter] public string title { get; set; }
+
+ private string GetActiveClass()
+ {
+ var currentClean = currentUrl.Split("management").Last();
+ var hrefClean = requiredUrl.Split("management").Last();
+
+ if (currentClean.Contains("?"))
+ currentClean = currentClean.Substring(0, currentClean.IndexOf("?"));
+
+ var isActive = (currentClean.Contains(hrefClean, StringComparison.OrdinalIgnoreCase) && !string.IsNullOrEmpty(hrefClean)
+ || (string.IsNullOrEmpty(hrefClean) && string.IsNullOrEmpty(currentClean)));
+
+ return isActive ? "active" : "";
+ }
+
+}
\ No newline at end of file
diff --git a/StandManager/Components/Pages/Account/Login.razor b/StandManager/Components/Pages/Account/Login.razor
index 832aa1e..c8306d5 100644
--- a/StandManager/Components/Pages/Account/Login.razor
+++ b/StandManager/Components/Pages/Account/Login.razor
@@ -9,6 +9,7 @@
@using StandManager.Infrastructure.DAL.Context
@using StandManager.Model
@using System.Security.Claims
+@using Microsoft.EntityFrameworkCore
@using StandManager.Service.Interfaces
@inject IHttpContextAccessor HttpContextAccessor
@@ -66,7 +67,8 @@
///
private async Task HandleValidSubmit(EditContext args)
{
- var user = await _managerService.UtenteService.RicercaPer(x => x.Email == model.Email);
+ var user = await _managerService.UtenteService.RicercaPer(x => x.Email == model.Email,
+ includi:x => x.Include(y => y.Ruolo));
var hasher = new PasswordHasher
();
if (user == null ||
@@ -81,7 +83,8 @@
{
new Claim(ClaimTypes.Name, user.Email),
new Claim(ClaimTypes.Role, "Admin"),
- new Claim("UserId", user.Id.ToString())
+ new Claim("UserId", user.Id.ToString()),
+ new Claim("RoleId", user.RuoloId?.ToString())
};
var identity = new ClaimsIdentity(claims, CookieAuthenticationDefaults.AuthenticationScheme);
diff --git a/StandManager/Components/Pages/Management/Clienti_Edit.razor b/StandManager/Components/Pages/Management/Clienti_Edit.razor
index ac5cedd..788f474 100644
--- a/StandManager/Components/Pages/Management/Clienti_Edit.razor
+++ b/StandManager/Components/Pages/Management/Clienti_Edit.razor
@@ -169,18 +169,19 @@
@code {
[Parameter]
public Guid? ClienteId { get; set; }
+ public Guid idClaim { get; set; }
[SupplyParameterFromForm]
private ClienteViewModel cliente { get; set; } = new();
private IEnumerable agenti { get; set; } = new List();
private List tipologiaCliente { get; set; } = new();
- private List> statoCliente { get; set; } = new List>();
+ private List> statoCliente { get; set; } = new();
RadzenDataGrid destinazioniGrid;
private string pageTitle => cliente?.Id == Guid.Empty ? "Nuovo cliente" : "Modifica cliente";
- private DialogOptions editNewDialogOption { get; set; } = new DialogOptions()
+ private DialogOptions editNewDialogOption { get; set; } = new()
{
Resizable = false,
Draggable = false,
@@ -194,7 +195,19 @@
///
protected override async Task OnInitializedAsync()
{
- agenti = (await _managerService.UtenteService.RicercaQueryable(x => x.Eliminato == false, ordinamento: x => x.OrderBy(y => y.Cognome).ThenBy(z => z.Nome)))
+ idClaim = await MembershipUtils.GetUserId(auth);
+ var idRuolo = await MembershipUtils.GetRoleId(auth);
+ var ruolo = await _managerService.RuoloService.RicercaPer(
+ x => x.Id == idRuolo && x.Permessi.Any(y => y.Feature.Type == FeatureType.Capoarea || y.Feature.Type == FeatureType.AdminGlobal),
+ includi:x => x.Include(y => y.Permessi).ThenInclude(z => z.Feature));
+
+ var isAdmin = ruolo?.Permessi.Where(x => x.Eliminato == false)?.Any(x => x.Feature.Type == FeatureType.AdminGlobal) ?? false;
+ agenti = ruolo == null
+ ? [await _managerService.UtenteService.RicercaPer(x => x.Id == idClaim)]
+ : (await _managerService.UtenteService.RicercaQueryable(
+ x => x.Eliminato == false && (isAdmin || x.CapoareaId == idClaim),
+ includi: x => x.Include(y => y.Capoarea),
+ ordinamento: x => x.OrderBy(y => y.Cognome).ThenBy(z => z.Nome)))
.Select(x => (UtenteViewModel)x).ToList();
var eUtils = new EnumUtils();
tipologiaCliente = (await _managerService.TipologiaClienteService.RicercaQueryable(ordinamento: x => x.OrderBy(y => y.Nome))).Select(x => (TipologiaClienteViewModel)x).ToList();
@@ -225,8 +238,6 @@
///
private async Task onClienteSave()
{
- var idClaim = await MembershipUtils.GetUserId(auth);
-
var model = await _managerService.ClienteService.RicercaPer(x => x.Id == cliente.Id, solaLettura: false)
?? new Cliente() { Destinazioni = new List() };
diff --git a/StandManager/Components/Pages/Management/Ruoli.razor b/StandManager/Components/Pages/Management/Ruoli.razor
new file mode 100644
index 0000000..261f890
--- /dev/null
+++ b/StandManager/Components/Pages/Management/Ruoli.razor
@@ -0,0 +1,97 @@
+@attribute [Authorize]
+@page "/management/Ruoli"
+@using ClosedXML.Excel
+@using Microsoft.EntityFrameworkCore
+@using StandManager.Model
+@using System.Threading.Tasks
+
+@rendermode InteractiveServer
+
+@inject AuthenticationStateProvider auth
+
+Ruoli
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+@code {
+ List ruoli;
+
+ ///
+ /// Carica l’elenco dei clienti non eliminati, includendo l’agente,
+ /// e prepara i dati per la visualizzazione in pagina.
+ ///
+ protected override async Task OnInitializedAsync()
+ {
+ await base.OnInitializedAsync();
+
+ ruoli = (await _managerService.RuoloService.RicercaQueryable(
+ x => x.Eliminato == false,
+ 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($"/management/Ruoli/Modifica/{ruolo.Id}");
+ }
+
+ ///
+ /// Chiede conferma ed elimina il cliente scelto; se confermato,
+ /// aggiorna la lista ricaricandola dal database.
+ ///
+ private async Task DeleteRow(RuoloViewModel ruolo)
+ {
+ var ok = await _dialogService.Confirm($"Vuoi davvero eliminare il ruolo {ruolo.Nome}?", "Conferma eliminazione", new ConfirmOptions { OkButtonText = "Sì", CancelButtonText = "No", Width = "400px" });
+
+ if (ok == true)
+ {
+ await _managerService.RuoloService.Elimina(ruolo.Id, await MembershipUtils.GetUserId(auth));
+ ruoli = (await _managerService.RuoloService.RicercaQueryable(x => x.Eliminato == false))
+ .Select(x => (RuoloViewModel)x).ToList();
+ }
+ }
+}
diff --git a/StandManager/Components/Pages/Management/Ruoli_Edit.razor b/StandManager/Components/Pages/Management/Ruoli_Edit.razor
new file mode 100644
index 0000000..912fb18
--- /dev/null
+++ b/StandManager/Components/Pages/Management/Ruoli_Edit.razor
@@ -0,0 +1,175 @@
+@attribute [Authorize]
+@rendermode InteractiveServer
+
+@page "/management/Ruoli/Modifica"
+@page "/management/Ruoli/Modifica/{RuoloId:guid}"
+
+@using Microsoft.AspNetCore.Identity
+@using Microsoft.EntityFrameworkCore
+@using StandManager.Model
+@inject AuthenticationStateProvider auth
+
+@pageTitle
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ onSelected(args, permesso))>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+@code {
+ [Parameter]
+ public Guid? RuoloId { get; set; }
+
+ [SupplyParameterFromForm]
+ private RuoloViewModel? ruolo { get; set; } = new();
+ private List permessi { get; set; } = new();
+ private RadzenDataGrid permessiGrid { get; set; }
+
+ private string pageTitle => ruolo?.Id == Guid.Empty ? "Nuovo ruolo" : "Modifica ruolo";
+
+ ///
+ /// Recupera l’utente da modificare se è stato passato un ID,
+ /// altrimenti inizializza un nuovo modello vuoto.
+ ///
+ protected override async Task OnInitializedAsync()
+ {
+ ruolo = RuoloId.GetValueOrDefault() != Guid.Empty
+ ? await _managerService.RuoloService.RicercaPer(x => x.Id == RuoloId)
+ : new RuoloViewModel();
+
+ var sections = (await
+ _managerService.SezioneService.RicercaQueryable(x => x.Eliminato == false, includi: x => x.Include(y => y.Features))).ToList();
+ var permissions = await _managerService.PermissionService.RicercaQueryable(x => x.Ruolo.Id == ruolo.Id && x.Eliminato == false);
+
+ permessi = [];
+ foreach (var section in sections)
+ permessi.AddRange(section.Features.Where(x => !x.Eliminato).Select(x => new PermissionRowViewModel(section, x, permissions)).ToList());
+ }
+
+ void OnRender(DataGridRenderEventArgs args)
+ {
+ if (!args.FirstRender) return;
+ args.Grid.Groups.Add(new GroupDescriptor(){ Property = "Nome", SortOrder = SortOrder.Descending });
+ StateHasChanged();
+ }
+
+ ///
+ /// 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 idClaim = await MembershipUtils.GetUserId(auth);
+
+ var model = await _managerService.RuoloService.RicercaPer(x => x.Id == ruolo.Id, solaLettura: false)
+ ?? new Ruolo();
+
+ model.Nome = ruolo.Nome;
+
+ await _managerService.RuoloService.Salva(model, idClaim);
+ _navManager.NavigateTo("/management/Ruoli");
+ }
+
+ ///
+ /// Torna all’elenco ruoli senza applicare altre azioni.
+ ///
+ private void backToHome()
+ {
+ _navManager.NavigateTo("/management/Ruoli");
+ }
+
+ private async Task onSelected(bool selected, PermissionRowViewModel permissionRow)
+ {
+ var idClaim = await MembershipUtils.GetUserId(auth);
+ var ruoloPermission = await _managerService.PermissionService.RicercaPer(
+ x => x.RuoloId == ruolo.Id && x.IdFeature == permissionRow.IdFeature && x.Eliminato == false,
+ includi: x => x.Include(y => y.Ruolo).Include(y => y.Feature),
+ solaLettura: false);
+ if (ruoloPermission == null && selected)
+ {
+ var permission = new Permission()
+ {
+ RuoloId = ruolo.Id,
+ IdFeature = permissionRow.IdFeature
+ };
+ await _managerService.PermissionService.Salva(permission, idClaim);
+ }
+ else
+ {
+ await _managerService.PermissionService.Elimina(ruoloPermission?.Id ?? Guid.Empty, idClaim);
+ }
+ permissionRow.Selected = selected;
+ }
+
+}
diff --git a/StandManager/Components/Pages/Management/Utenti.razor b/StandManager/Components/Pages/Management/Utenti.razor
index a153aa6..96d15b8 100644
--- a/StandManager/Components/Pages/Management/Utenti.razor
+++ b/StandManager/Components/Pages/Management/Utenti.razor
@@ -1,5 +1,6 @@
@attribute [Authorize]
@page "/management/Utenti"
+@using Microsoft.EntityFrameworkCore
@rendermode InteractiveServer
@@ -35,8 +36,10 @@
+
+
-
+
@@ -63,7 +66,10 @@
{
await base.OnInitializedAsync();
- utenti = await _managerService.UtenteService.RicercaQueryable(x => x.Eliminato == false, ordinamento: x => x.OrderBy(y => y.Cognome).ThenBy(z => z.Nome));
+ utenti = await _managerService.UtenteService.RicercaQueryable(
+ x => x.Eliminato == false,
+ includi: x => x.Include(y => y.Ruolo).Include(y => y.Capoarea),
+ ordinamento: x => x.OrderBy(y => y.Cognome).ThenBy(z => z.Nome));
}
///
@@ -80,12 +86,15 @@
///
private async Task DeleteRow(Utente user)
{
- var ok = await _dialogService.Confirm($"Vuoi davvero eliminare l'utente {user.ToString()}?", "Conferma eliminazione", new ConfirmOptions { OkButtonText = "Sì", CancelButtonText = "No", Width = "400px" });
+ var ok = await _dialogService.Confirm($"Vuoi davvero eliminare l'utente {user}?", "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);
+ utenti = await _managerService.UtenteService.RicercaQueryable(
+ x => x.Eliminato == false,
+ includi: x => x.Include(y => y.Ruolo).Include(y => y.Capoarea),
+ ordinamento: x => x.OrderBy(y => y.Cognome).ThenBy(z => z.Nome));
}
}
}
diff --git a/StandManager/Components/Pages/Management/Utenti_Edit.razor b/StandManager/Components/Pages/Management/Utenti_Edit.razor
index c263029..dc9f2f4 100644
--- a/StandManager/Components/Pages/Management/Utenti_Edit.razor
+++ b/StandManager/Components/Pages/Management/Utenti_Edit.razor
@@ -5,6 +5,7 @@
@page "/management/Utenti/Modifica/{UserId:guid}"
@using Microsoft.AspNetCore.Identity
+@using Microsoft.EntityFrameworkCore
@using StandManager.Model
@inject AuthenticationStateProvider auth
@@ -52,19 +53,29 @@