Merge branch 'develop'

This commit is contained in:
zaccaria.majid
2023-08-10 14:40:55 +02:00
20 changed files with 703 additions and 71 deletions
+2
View File
@@ -21,6 +21,8 @@ namespace SMGen.Core
public const string redisBaseAddr = "SMGEN";
public const string rKeyFiles = $"{redisBaseAddr}:Files";
public const string rKeyEventi = $"{redisBaseAddr}:Eventi";
public const string rKeyFamIng = $"{redisBaseAddr}:FamIngressi";
public const string rKeyFamStati = $"{redisBaseAddr}:FamStati";
}
}
+36 -24
View File
@@ -47,6 +47,42 @@ namespace SMGen.Data.Controllers
}
return events;
}
public List<FamIngressiViewModel> FamIngressiGetAll()
{
List<FamIngressiViewModel> dbResult = new List<FamIngressiViewModel>();
using (SMGDataContext localDbCtx = new SMGDataContext(_configuration))
{
try
{
dbResult = localDbCtx
.DbSetFamIngressi
.ToList();
}
catch (Exception exc)
{
Log.Error($"Eccezione durante FamIngressiGetAll: {Environment.NewLine}{exc}");
}
}
return dbResult;
}
public List<FamStatiViewModel> FamStatiGetAll()
{
List<FamStatiViewModel> dbResult = new List<FamStatiViewModel>();
using (SMGDataContext localDbCtx = new SMGDataContext(_configuration))
{
try
{
dbResult = localDbCtx
.DbSetFamStati
.ToList();
}
catch (Exception exc)
{
Log.Error($"Eccezione durante FamStatiGetAll: {Environment.NewLine}{exc}");
}
}
return dbResult;
}
/// <summary>
/// Aggiunta in bulk delle transizioni/ingressi
@@ -117,30 +153,6 @@ namespace SMGen.Data.Controllers
.AddRange(newEvRecs);
await localDbCtx.SaveChangesAsync();
fatto = true;
#if false
foreach (var item in newEvRecs)
{
var currRec = localDbCtx
.DbSetAnagEventiTemp
.Where(x => (x.IdxTipo == item.IdxTipo))
.FirstOrDefault();
if (currRec != null)
{
currRec.Nome = item.Nome;
localDbCtx.Entry(currRec).State = EntityState.Modified;
}
else
{
localDbCtx
.DbSetAnagEventiTemp
.Add(item);
}
}
#endif
await localDbCtx.SaveChangesAsync();
fatto = true;
Log.Info($"Gli stati sono OK!");
}
catch (Exception exc)
+68
View File
@@ -0,0 +1,68 @@
using NLog.LayoutRenderers.Wrappers;
namespace SMGen.Data
{
public class SelectFamIngParams
{
#region Public Constructors
public SelectFamIngParams()
{ }
#endregion Public Constructors
#region Public Properties
public int CurrPage { get; set; } = 1;
public int MaxRecord { get; set; } = 100;
public int NumRec { get; set; } = 10;
public int TotCount { get; set; } = 0;
#endregion Public Properties
#region Public Methods
public SelectFamIngParams clone()
{
SelectFamIngParams clonedData = new SelectFamIngParams()
{
CurrPage = this.CurrPage,
MaxRecord = this.MaxRecord,
NumRec = this.NumRec,
TotCount = this.TotCount
};
return clonedData;
}
public override bool Equals(object obj)
{
if (!(obj is SelectFamIngParams item))
return false;
if (MaxRecord != item.MaxRecord)
return false;
if (NumRec != item.NumRec)
return false;
if (TotCount != item.TotCount)
return false;
if (CurrPage != item.CurrPage)
return false;
return true;
}
public override int GetHashCode()
{
return base.GetHashCode();
}
#endregion Public Methods
}
}
+68
View File
@@ -0,0 +1,68 @@
using NLog.LayoutRenderers.Wrappers;
namespace SMGen.Data
{
public class SelectFamStatiParams
{
#region Public Constructors
public SelectFamStatiParams()
{ }
#endregion Public Constructors
#region Public Properties
public int CurrPage { get; set; } = 1;
public int MaxRecord { get; set; } = 100;
public int NumRec { get; set; } = 10;
public int TotCount { get; set; } = 0;
#endregion Public Properties
#region Public Methods
public SelectFamStatiParams clone()
{
SelectFamStatiParams clonedData = new SelectFamStatiParams()
{
CurrPage = this.CurrPage,
MaxRecord = this.MaxRecord,
NumRec = this.NumRec,
TotCount = this.TotCount
};
return clonedData;
}
public override bool Equals(object obj)
{
if (!(obj is SelectFamStatiParams item))
return false;
if (MaxRecord != item.MaxRecord)
return false;
if (NumRec != item.NumRec)
return false;
if (TotCount != item.TotCount)
return false;
if (CurrPage != item.CurrPage)
return false;
return true;
}
public override int GetHashCode()
{
return base.GetHashCode();
}
#endregion Public Methods
}
}
@@ -0,0 +1,20 @@
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace SMGen.Data.DbModels
{
[Table("v_FamIngressi")]
public class FamIngressiViewModel
{
public int IdxFamigliaIngresso { get; set; } = 0;
public string DescrizioneIngresso { get; set; } = "";
public int numTipoEv { get; set; } = 0;
public int numMStati { get; set; } = 0;
public int numRighe { get; set; } = 0;
}
}
+22
View File
@@ -0,0 +1,22 @@
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace SMGen.Data.DbModels
{
[Table("v_FamStati")]
public class FamStatiViewModel
{
public int IdxFamiglia { get; set; } = 0;
public string Descrizione { get; set; } = "";
public bool HasIOB { get; set; } = false;
public bool HasUDI { get; set; } = false;
public int numTipoEv { get; set; } = 0;
public int numMStati { get; set; } = 0;
public int numRighe { get; set; } = 0;
}
}
+9
View File
@@ -54,6 +54,8 @@ namespace SMGen.Data
public virtual DbSet<TransizioneIngressiModelTemp> DbSetTranIngTemp { get; set; } = null!;
public virtual DbSet<AnagEventiModelTemp> DbSetAnagEventiTemp { get; set; } = null!;
public virtual DbSet<AnagEventiModel> DbSetAnagEventi { get; set; } = null!;
public virtual DbSet<FamIngressiViewModel> DbSetFamIngressi { get; set; } = null!;
public virtual DbSet<FamStatiViewModel> DbSetFamStati { get; set; } = null!;
public void DbForceMigrate()
{
@@ -95,6 +97,13 @@ namespace SMGen.Data
modelBuilder.UseCollation("Latin1_General_CI_AS");
modelBuilder.Entity<TransizioneIngressiModelTemp>().HasKey(c => new { c.IdxFamigliaIngresso, c.IdxMicroStato, c.ValoreIngresso });
modelBuilder.Entity<FamIngressiViewModel>().ToView("v_FamIngressi");
modelBuilder.Entity<FamIngressiViewModel>().HasNoKey();
modelBuilder.Entity<FamStatiViewModel>().ToView("v_FamStati");
modelBuilder.Entity<FamStatiViewModel>().HasNoKey();
OnModelCreatingPartial(modelBuilder);
}
partial void OnModelCreatingPartial(ModelBuilder modelBuilder);
+89
View File
@@ -143,6 +143,95 @@ namespace SMGen.Data.Services
}
public async Task<List<FamStatiViewModel>> FamStatiGetAll()
{
string source = "DB";
List<FamStatiViewModel> dbResult = new List<FamStatiViewModel>();
try
{
// cerco da cache
string currKey = $"{Constants.rKeyFamStati}";
Stopwatch stopWatch = new Stopwatch();
stopWatch.Start();
string? rawData = await redisDb.StringGetAsync(currKey);
if (!string.IsNullOrEmpty(rawData))
{
source = "REDIS";
var tempResult = JsonConvert.DeserializeObject<List<FamStatiViewModel>>(rawData);
if (tempResult == null)
{
dbResult = new List<FamStatiViewModel>();
}
else
{
dbResult = tempResult;
}
}
else
{
dbResult = dbController.FamStatiGetAll();
rawData = JsonConvert.SerializeObject(dbResult, JSSettings);
await redisDb.StringSetAsync(currKey, rawData, UltraLongCache);
}
if (dbResult == null)
{
dbResult = new List<FamStatiViewModel>();
}
stopWatch.Stop();
TimeSpan ts = stopWatch.Elapsed;
Log.Debug($"FamStatiGetAll | {source} in: {ts.TotalMilliseconds} ms");
}
catch (Exception exc)
{
Log.Error($"Exception during FamStatiGetAll: {exc}{Environment.NewLine}");
}
return dbResult;
}
public async Task<List<FamIngressiViewModel>> FamIngressiGetAll()
{
string source = "DB";
List<FamIngressiViewModel> dbResult = new List<FamIngressiViewModel>();
try
{
// cerco da cache
string currKey = $"{Constants.rKeyFamIng}";
Stopwatch stopWatch = new Stopwatch();
stopWatch.Start();
string? rawData = await redisDb.StringGetAsync(currKey);
if (!string.IsNullOrEmpty(rawData))
{
source = "REDIS";
var tempResult = JsonConvert.DeserializeObject<List<FamIngressiViewModel>>(rawData);
if (tempResult == null)
{
dbResult = new List<FamIngressiViewModel>();
}
else
{
dbResult = tempResult;
}
}
else
{
dbResult = dbController.FamIngressiGetAll();
rawData = JsonConvert.SerializeObject(dbResult, JSSettings);
await redisDb.StringSetAsync(currKey, rawData, UltraLongCache);
}
if (dbResult == null)
{
dbResult = new List<FamIngressiViewModel>();
}
stopWatch.Stop();
TimeSpan ts = stopWatch.Elapsed;
Log.Debug($"FamIngressiGetAll | {source} in: {ts.TotalMilliseconds} ms");
}
catch (Exception exc)
{
Log.Error($"Exception during FamIngressiGetAll: {exc}{Environment.NewLine}");
}
return dbResult;
}
public async Task<Dictionary<int, string>> AnagEventiGetAll()
{
string source = "DB";
+23
View File
@@ -0,0 +1,23 @@
<table class="table">
<thead>
<tr>
<th scope="col">Idx famiglia</th>
<th scope="col">Descrizione ingresso</th>
<th scope="col">Totale eventi</th>
<th scope="col">Totale stati</th>
<th scope="col">Righe totali</th>
</tr>
</thead>
<tbody>
@foreach (var item in FamIngs)
{
<tr>
<td>@item.IdxFamigliaIngresso</td>
<td>@item.DescrizioneIngresso</td>
<td>@item.numTipoEv</td>
<td>@item.numMStati</td>
<td>@item.numRighe</td>
</tr>
}
</tbody>
</table>
+84
View File
@@ -0,0 +1,84 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Components;
using System.Net.Http;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Components.Authorization;
using Microsoft.AspNetCore.Components.Forms;
using Microsoft.AspNetCore.Components.Routing;
using Microsoft.AspNetCore.Components.Web;
using Microsoft.AspNetCore.Components.Web.Virtualization;
using Microsoft.JSInterop;
using SMGen;
using SMGen.Shared;
using SMGen.Components;
using EgwCoreLib.Razor;
using EgwCoreLib.Razor.Data;
using SMGen.Data;
using SMGen.Core;
using SMGen.Data.DbModels;
using SMGen.Data.Controllers;
using SMGen.Data.Services;
namespace SMGen.Components
{
public partial class FamIngList
{
protected List<FamIngressiViewModel> FamIngs = new List<FamIngressiViewModel>();
protected List<FamIngressiViewModel> SearchRecords = new List<FamIngressiViewModel>();
[Parameter]
public SelectFamIngParams currFilter { get; set; } = null!;
[Parameter]
public EventCallback<bool> PagerResetReq { get; set; }
[Parameter]
public EventCallback<int> updateRecordCount { get; set; }
[Inject]
protected SMGDataService SMGDService{ get; set; } = null!;
private int _totalCount { get; set; } = 0;
private int currPage
{
get => currFilter.CurrPage;
set => currFilter.CurrPage = value;
}
private int numRecord
{
get => currFilter.NumRec;
set => currFilter.NumRec = value;
}
private int totalCount
{
get => _totalCount;
set
{
if (_totalCount != value)
{
_totalCount = value;
updateRecordCount.InvokeAsync(value);
}
}
}
protected override async Task OnParametersSetAsync()
{
await Task.Delay(1);
await ReloadData();
}
protected async Task ReloadData()
{
SearchRecords = await SMGDService.FamIngressiGetAll();
totalCount = SearchRecords.Count;
FamIngs = SearchRecords.Skip(numRecord * (currPage - 1)).Take(numRecord).ToList();
await InvokeAsync(() => StateHasChanged());
}
}
}
+45
View File
@@ -0,0 +1,45 @@
<table class="table">
<thead>
<tr>
<th scope="col">Idx famiglia</th>
<th scope="col">Descrizion ingresso</th>
<th scope="col">IOB</th>
<th scope="col">UDI</th>
<th scope="col">Totale eventi</th>
<th scope="col">Totale stati</th>
<th scope="col">Righe totali</th>
</tr>
</thead>
<tbody>
@foreach (var item in FamIngs)
{
<tr>
<td>@item.IdxFamiglia</td>
<td>@item.Descrizione</td>
<td>
@if (item.HasIOB)
{
<i class="text-success fa-regular fa-circle-check"></i>
}
else
{
<i class="text-danger fa-regular fa-circle-xmark"></i>
}
</td>
<td>
@if (item.HasUDI)
{
<i class="text-success fa-regular fa-circle-check"></i>
}
else
{
<i class="text-danger fa-regular fa-circle-xmark"></i>
}
</td>
<td>@item.numTipoEv</td>
<td>@item.numMStati</td>
<td>@item.numRighe</td>
</tr>
}
</tbody>
</table>
+84
View File
@@ -0,0 +1,84 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Components;
using System.Net.Http;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Components.Authorization;
using Microsoft.AspNetCore.Components.Forms;
using Microsoft.AspNetCore.Components.Routing;
using Microsoft.AspNetCore.Components.Web;
using Microsoft.AspNetCore.Components.Web.Virtualization;
using Microsoft.JSInterop;
using SMGen;
using SMGen.Shared;
using SMGen.Components;
using EgwCoreLib.Razor;
using EgwCoreLib.Razor.Data;
using SMGen.Data;
using SMGen.Core;
using SMGen.Data.DbModels;
using SMGen.Data.Controllers;
using SMGen.Data.Services;
namespace SMGen.Components
{
public partial class FamStatiList
{
protected List<FamStatiViewModel> FamIngs = new List<FamStatiViewModel>();
protected List<FamStatiViewModel> SearchRecords = new List<FamStatiViewModel>();
[Parameter]
public SelectFamStatiParams currFilter { get; set; } = null!;
[Parameter]
public EventCallback<bool> PagerResetReq { get; set; }
[Parameter]
public EventCallback<int> updateRecordCount { get; set; }
[Inject]
protected SMGDataService SMGDService{ get; set; } = null!;
private int _totalCount { get; set; } = 0;
private int currPage
{
get => currFilter.CurrPage;
set => currFilter.CurrPage = value;
}
private int numRecord
{
get => currFilter.NumRec;
set => currFilter.NumRec = value;
}
private int totalCount
{
get => _totalCount;
set
{
if (_totalCount != value)
{
_totalCount = value;
updateRecordCount.InvokeAsync(value);
}
}
}
protected override async Task OnParametersSetAsync()
{
await Task.Delay(1);
await ReloadData();
}
protected async Task ReloadData()
{
SearchRecords = await SMGDService.FamStatiGetAll();
totalCount = SearchRecords.Count;
FamIngs = SearchRecords.Skip(numRecord * (currPage - 1)).Take(numRecord).ToList();
await InvokeAsync(() => StateHasChanged());
}
}
}
+20 -23
View File
@@ -7,15 +7,14 @@ namespace SMGen.Components
{
public partial class FilesList
{
protected FileLinesClass k = new FileLinesClass();
[Parameter]
public bool calcEmptyState { get; set; } = false;
[Parameter]
public bool calcItSelf { get; set; } = false;
[Parameter]
public Core.Enum.ORDERTYPE orderType { get; set; } = Core.Enum.ORDERTYPE.stateEvent;
[Parameter]
public SelectSMIn2EvParams currFilter { get; set; } = null!;
@@ -26,8 +25,13 @@ namespace SMGen.Components
[Parameter]
public bool hasBit { get; set; } = false;
[Parameter]
public Core.Enum.ORDERTYPE orderType { get; set; } = Core.Enum.ORDERTYPE.stateEvent;
//[Parameter]
//public Dictionary<string, string> Files2Download { get; set; } = new Dictionary<string, string>();
[Parameter]
public int succFiles { get; set; } = 0;
[Parameter]
public EventCallback<bool> PagerResetReq { get; set; }
@@ -43,27 +47,7 @@ namespace SMGen.Components
[Inject]
protected SMGDataService SMGDService { get; set; } = null!;
[Parameter]
public int succFiles { get; set; } = 0;
private int _totalCount { get; set; } = 0;
protected FileLinesClass k = new FileLinesClass();
protected async Task doProc(FilesClass currFile)
{
await Task.Delay(1);
if (k.statesOK.Count <= 0 && k.eventsOK.Count <= 0 && k.lines.Count <= 0)
{
k = await SMGDService.DoCheckUnusedEvSt(currFile);
}
else
{
k = new FileLinesClass();
}
}
private int currPage
{
get => currFilter.CurrPage;
@@ -75,6 +59,7 @@ namespace SMGen.Components
get => currFilter.NumRec;
set => currFilter.NumRec = value;
}
private int totalCount
{
get => _totalCount;
@@ -88,6 +73,18 @@ namespace SMGen.Components
}
}
protected async Task doProc(FilesClass currFile)
{
await Task.Delay(1);
if (k.statesOK.Count <= 0 && k.eventsOK.Count <= 0 && k.lines.Count <= 0)
{
k = await SMGDService.DoCheckUnusedEvSt(currFile);
}
else
{
k = new FileLinesClass();
}
}
protected override async Task OnParametersSetAsync()
{
await ReloadData();
+15 -2
View File
@@ -1,7 +1,6 @@
@page "/FamIngressi"
<h3>FamIngressi</h3>
<p>
@*<p>
Deve mostrare elenco fam ingressi e su selezione dettaglio delle righe tab relative..
</p>
@@ -18,4 +17,18 @@ Deve mostrare elenco fam ingressi e su selezione dettaglio delle righe tab relat
select * from TransizioneIngressi where IdxFamigliaIngresso = 60 -- es SIM
</li>
</ul>
</div>*@
<div class="card">
<div class="card-header">
<h3>Famiglia-ingressi</h3>
</div>
<div class="card-body">
<FamIngList PagerResetReq="pgResetReq" updateRecordCount="UpdateTotCount" currFilter="@currFilter"></FamIngList>
</div>
<div class="card-footer">
<DataPager @ref="pagerFamIng" PageSize="@numRecord" currPage="@currPage" numRecordChanged="@ForceReload" numPageChanged="@ForceReloadPage" totalCount="@totalCount" />
</div>
</div>
+47
View File
@@ -13,10 +13,57 @@ using Microsoft.AspNetCore.Components.Web.Virtualization;
using Microsoft.JSInterop;
using SMGen;
using SMGen.Shared;
using SMGen.Data;
using EgwCoreLib.Razor;
namespace SMGen.Pages
{
public partial class FamIngressi
{
protected void ForceReload(int newNum)
{
numRecord = newNum;
}
protected void ForceReloadPage(int newNum)
{
currPage = newNum;
}
protected async Task pgResetReq(bool doReset)
{
if (doReset)
{
await Task.Delay(1);
if (pagerFamIng != null)
{
pagerFamIng.resetCurrPage();
}
}
}
protected void UpdateTotCount(int newTotCount)
{
totalCount = newTotCount;
}
private int currPage
{
get => currFilter.CurrPage;
set => currFilter.CurrPage = value;
}
private int numRecord
{
get => currFilter.NumRec;
set => currFilter.NumRec = value;
}
private int totalCount
{
get => currFilter.TotCount;
set => currFilter.TotCount = value;
}
protected SelectFamIngParams currFilter = new SelectFamIngParams();
protected DataPager? pagerFamIng = null!;
}
}
+16 -3
View File
@@ -1,8 +1,7 @@
@page "/FamMacchine"
<h3>FamMacchine</h3>
<p>
@*<p>
Deve mostrare elenco fam ingressi e su selezione dettaglio delle righe tab relative..
</p>
@@ -21,4 +20,18 @@
</ul>
</div>
Partire da esempio vb in Mapo-IOB\StateMachine\src, in particolare M_transitions.vb
Partire da esempio vb in Mapo-IOB\StateMachine\src, in particolare M_transitions.vb
*@
<div class="card">
<div class="card-header">
<h3>Famiglia-stati</h3>
</div>
<div class="card-body">
<FamStatiList PagerResetReq="pgResetReq" updateRecordCount="UpdateTotCount" currFilter="@currFilter"></FamStatiList>
</div>
<div class="card-footer">
<DataPager @ref="pagerFamStati" PageSize="@numRecord" currPage="@currPage" numRecordChanged="@ForceReload" numPageChanged="@ForceReloadPage" totalCount="@totalCount" />
</div>
</div>
+47
View File
@@ -13,10 +13,57 @@ using Microsoft.AspNetCore.Components.Web.Virtualization;
using Microsoft.JSInterop;
using SMGen;
using SMGen.Shared;
using EgwCoreLib.Razor;
using SMGen.Data;
namespace SMGen.Pages
{
public partial class FamMacchine
{
protected void ForceReload(int newNum)
{
numRecord = newNum;
}
protected void ForceReloadPage(int newNum)
{
currPage = newNum;
}
protected async Task pgResetReq(bool doReset)
{
if (doReset)
{
await Task.Delay(1);
if (pagerFamStati != null)
{
pagerFamStati.resetCurrPage();
}
}
}
protected void UpdateTotCount(int newTotCount)
{
totalCount = newTotCount;
}
private int currPage
{
get => currFilter.CurrPage;
set => currFilter.CurrPage = value;
}
private int numRecord
{
get => currFilter.NumRec;
set => currFilter.NumRec = value;
}
private int totalCount
{
get => currFilter.TotCount;
set => currFilter.TotCount = value;
}
protected SelectFamStatiParams currFilter = new SelectFamStatiParams();
protected DataPager? pagerFamStati = null!;
}
}
+3 -3
View File
@@ -1,7 +1,7 @@
@page "/SMEvent2State"
<h3>SMEvent2State</h3>
<h3>Event-state</h3>
<p>
@*<p>
Deve permettere upload file *.rul (NUOVO, diverso/semplificato) e generazione righe regole (come x csv)
</p>
@@ -12,7 +12,7 @@
</p>
<p>
Vista in preview si può poi inserire in prod se confermato
</p>
</p>*@
<div class="w-100 shadow-lg p-3 rounded mb-2">
+4 -3
View File
@@ -1,7 +1,8 @@
@page "/SMIn2Event"
<h3>SMIn2Event</h3>
<p>
<h3>Ingresso-evento</h3>
@*<p>
Deve permettere upload file *.rul e generazione righe regole (come x csv)
</p>
@@ -13,7 +14,7 @@
<p>
Vista in preview si può poi inserire in prod se confermato
</p>
*@
<div class="w-100 shadow-lg p-3 rounded mb-2">
+1 -13
View File
@@ -56,12 +56,9 @@ namespace SMGen.Pages
protected Dictionary<string, FilesClass> Files { get; set; } = new Dictionary<string, FilesClass>();
protected int maxAllowedFiles { get; set; } = 100;
protected int resetSucc { get; set; } = 0;
protected string pathDir { get; set; } = "";
protected string pathFile { get; set; } = "";
protected int resetSucc { get; set; } = 0;
[Inject]
protected SMGDataService SMGDService { get; set; } = null!;
@@ -97,15 +94,6 @@ namespace SMGen.Pages
}
}
}
protected async Task updateFilter(SelectSMIn2EvParams newParams)
{
await Task.Delay(1);
currPage = 1;
// salvo comunque filtro reparto x utente
await Task.Delay(1);
await InvokeAsync(() => StateHasChanged());
currFilter = newParams;
}
protected void UpdateTotCount(int newTotCount)
{