149 lines
6.8 KiB
Plaintext
149 lines
6.8 KiB
Plaintext
@attribute [Authorize]
|
||
@page "/management/Clienti"
|
||
@using ClosedXML.Excel
|
||
@using Microsoft.EntityFrameworkCore
|
||
@using StandManager.Model
|
||
@using System.Threading.Tasks
|
||
|
||
@rendermode InteractiveServer
|
||
|
||
@inject AuthenticationStateProvider auth
|
||
|
||
<PageTitle>Clienti</PageTitle>
|
||
|
||
<div class="page-wrapper">
|
||
<!-- BEGIN PAGE BODY -->
|
||
<div class="page-body">
|
||
<div class="container-xl">
|
||
<div class="row row-cards">
|
||
<div class="col">
|
||
<!-- Page pre-title -->
|
||
<div class="page-pretitle">Overview</div>
|
||
<h2 class="page-title">Clienti</h2>
|
||
</div>
|
||
<div class="col-auto ms-auto">
|
||
<div class="btn-list">
|
||
<RadzenUpload class="btn-5 d-none d-sm-inline-block" Change=@onUpload ChooseText="Importa da excel" />
|
||
|
||
<RadzenUpload class="btn-5 d-none d-sm-inline-block" Change=@onUploadComuni ChooseText="Importa comuni da excel" />
|
||
|
||
<a href="/management/Clienti/Modifica" class="btn btn-primary btn-5 d-none d-sm-inline-block">
|
||
Nuovo cliente
|
||
</a>
|
||
</div>
|
||
</div>
|
||
<div class="col-lg-12">
|
||
<div class="card">
|
||
<div class="table-responsive">
|
||
<RadzenDataGrid @ref="clientiGrid" AllowFiltering="true" AllowColumnResize="true" AllowAlternatingRows="false" FilterMode="FilterMode.CheckBoxList" AllowSorting="true" PageSize="25"
|
||
AllowPaging="true" PagerHorizontalAlign="HorizontalAlign.Left" ShowPagingSummary="true"
|
||
Data="@clienti" LogicalFilterOperator="LogicalFilterOperator.Or" SelectionMode="DataGridSelectionMode.Single">
|
||
<Columns>
|
||
<RadzenDataGridColumn Property="@nameof(Cliente.Id)" Filterable="false" Title="ID" Width="200px" TextAlign="TextAlign.Center" />
|
||
<RadzenDataGridColumn Property="@nameof(Cliente.RagioneSociale)" Title="Ragione sociale" Width="250px" />
|
||
<RadzenDataGridColumn Property="@nameof(Cliente.PartitaIva)" Title="Partita IVA" Width="250px" />
|
||
<RadzenDataGridColumn Property="Agente.Info" Title="Agente" Width="250px" />
|
||
<RadzenDataGridColumn Property="Capoarea.Info" Title="Capoarea" Width="250px" />
|
||
|
||
<RadzenDataGridColumn Context="cliente" Filterable="false" Sortable="false" TextAlign="TextAlign.Right" Width="250px">
|
||
<Template Context="cliente">
|
||
<RadzenButton Icon="edit" ButtonStyle="ButtonStyle.Light" Variant="Variant.Flat" Size="ButtonSize.Medium" class="rz-my-1 rz-ms-1" Click="@(args => EditRow(cliente))" @onclick:stopPropagation="true" />
|
||
<RadzenButton Icon="delete" ButtonStyle="ButtonStyle.Danger" Variant="Variant.Flat" Size="ButtonSize.Medium" Shade="Shade.Lighter" class="rz-my-1 rz-ms-1" Click="@(args => DeleteRow(cliente))" @onclick:stopPropagation="true" />
|
||
</Template>
|
||
</RadzenDataGridColumn>
|
||
</Columns>
|
||
</RadzenDataGrid>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
|
||
@code {
|
||
List<Cliente> clienti;
|
||
RadzenDataGrid<Cliente> clientiGrid;
|
||
|
||
/// <summary>
|
||
/// Carica l’elenco dei clienti non eliminati, includendo l’agente,
|
||
/// e prepara i dati per la visualizzazione in pagina.
|
||
/// </summary>
|
||
protected override async Task OnInitializedAsync()
|
||
{
|
||
await base.OnInitializedAsync();
|
||
|
||
clienti = (await _managerService.ClienteService.RicercaQueryable(
|
||
x => x.Eliminato == false,
|
||
includi: x => x.Include(y => y.Agente).Include(y => y.Capoarea),
|
||
ordinamento: x => x.OrderBy(y => y.RagioneSociale)))
|
||
.ToList();
|
||
}
|
||
|
||
/// <summary>
|
||
/// Apre la pagina di modifica per il cliente selezionato.
|
||
/// </summary>
|
||
private async Task EditRow(ClienteViewModel cliente)
|
||
{
|
||
_navManager.NavigateTo($"/management/Clienti/Modifica/{cliente.Id}");
|
||
}
|
||
|
||
/// <summary>
|
||
/// Chiede conferma ed elimina il cliente scelto; se confermato,
|
||
/// aggiorna la lista ricaricandola dal database.
|
||
/// </summary>
|
||
private async Task DeleteRow(ClienteViewModel cliente)
|
||
{
|
||
var ok = await _dialogService.Confirm($"Vuoi davvero eliminare il cliente {cliente.RagioneSociale}?", "Conferma eliminazione", new ConfirmOptions { OkButtonText = "Sì", CancelButtonText = "No", Width = "400px" });
|
||
|
||
if (ok == true)
|
||
{
|
||
await _managerService.ClienteService.Elimina(cliente.Id, await MembershipUtils.GetUserId(auth));
|
||
clienti = (await _managerService.ClienteService.RicercaQueryable(x => x.Eliminato == false, includi: x => x.Include(y => y.Agente)))
|
||
.ToList();
|
||
}
|
||
}
|
||
|
||
private async Task onUpload(UploadChangeEventArgs args)
|
||
{
|
||
var file = args.Files.FirstOrDefault();
|
||
if (file == null ||
|
||
!file.Name.EndsWith(".xlsx", StringComparison.OrdinalIgnoreCase))
|
||
{
|
||
await _dialogService.Alert("Sono supportati solo file Excel .xlsx", "Errore");
|
||
return;
|
||
}
|
||
try
|
||
{
|
||
// await using var uploadStream = file.OpenReadStream(10_000_000);
|
||
await _dialogService.OpenAsync<Clienti_Import>("Importazione clienti e destinazioni", new Dictionary<string, object>() { { "args", args } });
|
||
}
|
||
catch (Exception ex)
|
||
{
|
||
var er = ex.Message;
|
||
await _dialogService.Alert("Si è verificato un errore durante l'importazione del file.", "Errore");
|
||
}
|
||
}
|
||
|
||
private async Task onUploadComuni(UploadChangeEventArgs args)
|
||
{
|
||
var file = args.Files.FirstOrDefault();
|
||
if (file == null ||
|
||
!file.Name.EndsWith(".xlsx", StringComparison.OrdinalIgnoreCase))
|
||
{
|
||
await _dialogService.Alert("Sono supportati solo file Excel .xlsx", "Errore");
|
||
return;
|
||
}
|
||
try
|
||
{
|
||
// await using var uploadStream = file.OpenReadStream(10_000_000);
|
||
await _dialogService.OpenAsync<Comuni_Import>("Importazione comuni", new Dictionary<string, object>() { { "args", args } });
|
||
}
|
||
catch (Exception ex)
|
||
{
|
||
var er = ex.Message;
|
||
await _dialogService.Alert("Si è verificato un errore durante l'importazione del file.", "Errore");
|
||
}
|
||
}
|
||
}
|