Compare commits

...

31 Commits

Author SHA1 Message Date
Samuele Locatelli 98119d4818 Merge branch 'Release/CloneDossResValueEdit' 2022-11-07 10:16:44 +01:00
Samuele Locatelli ed2c694abd Fix duplicazione x valori edit 2022-11-07 09:34:30 +01:00
Samuele Locatelli c70ce33f26 Merge tag 'FIxArtInsertDelete' into develop
Update reset cache x edit articoli...
2022-11-04 18:11:07 +01:00
Samuele Locatelli 03eb82c7b2 Merge branch 'Release/FIxArtInsertDelete' 2022-11-04 18:10:48 +01:00
Samuele Locatelli 7655e340eb Update gest articoli
- se elimina o insert reset cache
2022-11-04 18:07:34 +01:00
Samuele Locatelli 443a56cc07 Update gestione filtro periodo parametri 2022-11-04 18:01:59 +01:00
Samuele Locatelli 06390295d2 Pulizie minori codice dossier 2022-11-04 17:34:00 +01:00
Samuele Locatelli a3f5855b4a Merge tag 'UpdateDuplicaDossier' into develop
Update gestione duplicazione dossier
2022-11-04 16:49:24 +01:00
Samuele Locatelli bd14fc0502 Merge branch 'Release/UpdateDuplicaDossier' 2022-11-04 16:48:30 +01:00
Samuele Locatelli 6525d7e803 Fix pagina contatti 2022-11-04 16:48:02 +01:00
Samuele Locatelli 140566d81b Merge branch 'develop' of https://gitlab.steamware.net/steamware/mapo-core into develop 2022-11-04 16:26:25 +01:00
Samuele Locatelli af0624b9c4 Add pagina Contacts 2022-11-04 16:26:22 +01:00
zaccaria.majid 74856d9831 Merge branch 'develop' of https://gitlab.steamware.net/steamware/mapo-core into develop 2022-11-04 16:15:38 +01:00
zaccaria.majid bf654f54e6 resetSelect visibile solo se record selezionato
+ refresh dopo creazione dossier
2022-11-04 16:13:02 +01:00
Samuele Locatelli 8fbfea1f62 COmplreto refresh gestione licenze LAND
- sistemato GC in generale
- controllo e sistemazione calcolo data scadenza
2022-11-04 16:09:26 +01:00
Samuele Locatelli b8dc7dffc4 Merge branch 'develop' of https://gitlab.steamware.net/steamware/mapo-core into develop 2022-11-04 15:51:31 +01:00
Samuele Locatelli 2c3feaa4f3 Refresh versione 2022-11-04 15:50:51 +01:00
Samuele Locatelli dbb4fbf9e2 Inizio update LAND x problemi GC 2022-11-04 15:50:40 +01:00
zaccaria.majid d13a1b7833 aggiunta clona dossier 2022-11-04 15:20:35 +01:00
Samuele Locatelli 76c49d1eea Fix scrittura clone dossier 2022-11-04 10:10:56 +01:00
Samuele Locatelli 3f1a3aa2ce Aggiunta navmanager 2022-11-04 09:30:01 +01:00
Samuele Locatelli bbec081cae Separato codice cs x CmpTop 2022-11-04 09:29:43 +01:00
Samuele Locatelli 29fd417499 Merge remote-tracking branch 'origin/develop' into develop 2022-11-04 09:27:54 +01:00
Samuele Locatelli 5380c996ac Refresh DbModel x macchina 2022-11-04 09:27:44 +01:00
zaccaria.majid 4e61028323 Merge branch 'FeaturecloneDossier' into develop 2022-11-04 09:26:38 +01:00
zaccaria.majid 4f7ac21f41 new dossier 2022-11-04 09:20:53 +01:00
zaccaria.majid 55187eda96 dismiss nuovo dossier 2022-11-04 09:11:55 +01:00
Samuele Locatelli d6f7a55a05 update metodo insert dossier 2022-11-04 09:06:43 +01:00
zaccaria.majid c71d7291a2 Prima bozza aggiunta nuovo dossier 2022-11-03 17:21:44 +01:00
Samuele Locatelli 79c73db726 Fix reload apgina 2022-11-03 12:28:06 +01:00
Samuele Locatelli 2608395e5b Merge tag 'UpdateSpecProd' into develop
Vari udpate x fix e ottimizzazioni
2022-11-03 12:17:11 +01:00
46 changed files with 1170 additions and 577 deletions
+13 -12
View File
@@ -110,7 +110,7 @@ namespace MP.Data.Controllers
dbResult = dbCtx
.DbSetDossiers
.AsNoTracking()
.Select(i => i.OdlNav.CodArticolo)
.Select(i => i.CodArticolo)
.Distinct()
.ToList();
}
@@ -302,7 +302,7 @@ namespace MP.Data.Controllers
/// </summary>
/// <param name="currRec">record dossier da eliminare</param>
/// <returns></returns>
public async Task<bool> DossiersDeleteRecord(Dossiers currRec)
public async Task<bool> DossiersDeleteRecord(DossierModel currRec)
{
bool answ = false;
using (var dbCtx = new MoonProContext(_configuration))
@@ -336,18 +336,18 @@ namespace MP.Data.Controllers
/// <param name="DtStart">Data minima per estrazione records</param>
/// <param name="DtEnd">Data Massima per estrazione records</param>
/// <returns></returns>
public List<Dossiers> DossiersGetLastFilt(string IdxMacchina, string CodArticolo, DateTime DtStart, DateTime DtEnd)
public List<DossierModel> DossiersGetLastFilt(string IdxMacchina, string CodArticolo, DateTime DtStart, DateTime DtEnd)
{
List<Dossiers> dbResult = new List<Dossiers>();
List<DossierModel> dbResult = new List<DossierModel>();
using (var dbCtx = new MoonProContext(_configuration))
{
dbResult = dbCtx
.DbSetDossiers
.AsNoTracking()
.Where(x => (IdxMacchina == "*" || x.IdxMacchina == IdxMacchina) && (CodArticolo == "*" || x.OdlNav.CodArticolo == CodArticolo) && (x.DtRif >= DtStart && x.DtRif <= DtEnd))
.Where(x => (IdxMacchina == "*" || x.IdxMacchina == IdxMacchina) && (CodArticolo == "*" || x.CodArticolo == CodArticolo) && (x.DtRif >= DtStart && x.DtRif <= DtEnd))
.Include(m => m.MachineNav)
.Include(o => o.OdlNav)
.Include(a => a.OdlNav.ArticoloNav)
//.Include(o => o.OdlNav)
.Include(a => a.ArticoloNav)
.OrderByDescending(x => x.DtRif)
.ToList();
}
@@ -359,7 +359,7 @@ namespace MP.Data.Controllers
/// </summary>
/// <param name="editRec">record dossier da modificare</param>
/// <returns></returns>
public async Task<bool> DossiersInsert(Dossiers newRec)
public async Task<bool> DossiersInsert(DossierModel newRec)
{
bool fatto = false;
using (var dbCtx = new MoonProContext(_configuration))
@@ -431,7 +431,7 @@ namespace MP.Data.Controllers
/// </summary>
/// <param name="editRec">record dossier da modificare</param>
/// <returns></returns>
public async Task<bool> DossiersUpdateValore(Dossiers editRec)
public async Task<bool> DossiersUpdateValore(DossierModel editRec)
{
bool fatto = false;
using (var dbCtx = new MoonProContext(_configuration))
@@ -502,12 +502,13 @@ namespace MP.Data.Controllers
/// <summary>
/// Elenco ultimi n record flux log dato macchina e flusso (ordinato x data registrazione)
/// </summary>
/// <param name="DtMax">Data massima (recupera eventi antecedenti)</param>
/// <param name="DtMax">Data massima x eventi</param>
/// <param name="DtMin">Data minima x eventi</param>
/// <param name="IdxMacchina">* = tutte, altrimenti solo x una data macchina</param>
/// <param name="CodFlux">*=tutti, altrimenti solo selezionato</param>
/// <param name="MaxRec">numero massimo record da restituire</param>
/// <returns></returns>
public List<FluxLog> FluxLogGetLastFilt(DateTime DtMax, string IdxMacchina, string CodFlux, int MaxRec)
public List<FluxLog> FluxLogGetLastFilt(DateTime DtMax, DateTime DtMin, string IdxMacchina, string CodFlux, int MaxRec)
{
List<FluxLog> dbResult = new List<FluxLog>();
using (var dbCtx = new MoonProContext(_configuration))
@@ -515,7 +516,7 @@ namespace MP.Data.Controllers
dbResult = dbCtx
.DbSetFluxLog
.AsNoTracking()
.Where(x => (x.dtEvento <= DtMax) && (IdxMacchina == "*" || x.IdxMacchina == IdxMacchina) && (CodFlux == "*" || x.CodFlux == CodFlux))
.Where(x => (x.dtEvento >= DtMin && x.dtEvento <= DtMax) && (IdxMacchina == "*" || x.IdxMacchina == IdxMacchina) && (CodFlux == "*" || x.CodFlux == CodFlux))
.OrderByDescending(x => x.dtEvento)
.Take(MaxRec)
.ToList();
@@ -10,7 +10,7 @@ using System.ComponentModel.DataAnnotations.Schema;
namespace MP.Data.DatabaseModels
{
[Table("Dossiers")]
public partial class Dossiers
public partial class DossierModel
{
#region Public Properties
@@ -31,7 +31,8 @@ namespace MP.Data.DatabaseModels
public string Valore { get; set; } = "";
[MaxLength(50)]
public string KeyRichiesta { get; set; } = "";
/// <summary>
/// Navigazione oggetto Machine
@@ -45,6 +46,12 @@ namespace MP.Data.DatabaseModels
[ForeignKey("IdxODL")]
public virtual ODLModel OdlNav { get; set; } = null!;
/// <summary>
/// Navigazione oggetto Articolo
/// </summary>
[ForeignKey("CodArticolo")]
public virtual AnagArticoli ArticoloNav { get; set; } = null!;
#endregion Public Properties
}
}
+13 -3
View File
@@ -1,5 +1,7 @@
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
#nullable disable
@@ -8,14 +10,22 @@ using System.Collections.Generic;
// </Auto-Generated>
namespace MP.Data.DatabaseModels
{
[Table("Macchine")]
public partial class Macchine
{
#region Public Properties
public string CodMacchina { get; set; }
public string Descrizione { get; set; }
[Key]
public string IdxMacchina { get; set; }
public string Nome { get; set; }
public string CodMacchina { get; set; } = "";
public string Descrizione { get; set; } = "";
public string Nome { get; set; } = "";
public string Note { get; set; } = "";
public string url { get; set; } = "";
public string locazione { get; set; } = "";
public string css { get; set; } = "";
public int RowNum { get; set; } = 0;
public int ColNum { get; set; } = 0;
#endregion Public Properties
}
+1 -1
View File
@@ -47,7 +47,7 @@ namespace MP.Data
public virtual DbSet<ODLModel> DbSetODL { get; set; }
public virtual DbSet<PODLModel> DbSetPODL { get; set; }
public virtual DbSet<FluxLog> DbSetFluxLog { get; set; }
public virtual DbSet<Dossiers> DbSetDossiers { get; set; }
public virtual DbSet<DossierModel> DbSetDossiers { get; set; }
public virtual DbSet<StatODLModel> DbSetStatOdl { get; set; }
public virtual DbSet<StatoProdModel> DbSetStatoProd { get; set; }
public virtual DbSet<EventListModel> DbSetEvList { get; set; }
-55
View File
@@ -22,62 +22,7 @@
</div>
</div>
@code {
//[CascadingParameter]
//private Task<AuthenticationState> AuthenticationStateTask { get; set; }
[CascadingParameter(Name = "ShowSearch")]
private bool ShowSearch { get; set; }
private string userName = "";
private string PageName { get; set; }
private string PageIcon { get; set; }
protected override async Task OnInitializedAsync()
{
await forceReload();
}
protected override void OnInitialized()
{
AppMessages.EA_PageUpdated += OnPageUpdate;
}
public void OnPageUpdate()
{
PageName = AppMessages.PageName;
PageIcon = AppMessages.PageIcon;
InvokeAsync(() =>
{
StateHasChanged();
});
}
public void Dispose()
{
AppMessages.EA_PageUpdated -= OnPageUpdate;
}
private async Task forceReload()
{
userName = "N.A.";
await Task.Delay(1);
#if false
var authState = await AuthenticationStateProvider.GetAuthenticationStateAsync();
var user = authState.User;
if (user.Identity.IsAuthenticated)
{
userName = $"{user.Identity.Name}";
}
else
{
userName = "N.A.";
}
#endif
}
}
@* // Vedere anche:
// https://docs.microsoft.com/en-us/aspnet/core/blazor/security/?view=aspnetcore-5.0#:~:text=Blazor%20uses%20the%20existing%20ASP.NET%20Core%20authentication%20mechanisms,all%20client-side%20code%20can%20be%20modified%20by%20users
+83
View File
@@ -0,0 +1,83 @@
using Microsoft.AspNetCore.Components;
using System;
using System.Threading.Tasks;
namespace MP.Land.Components
{
public partial class CmpTop
{
#region Public Methods
public void Dispose()
{
AppMessages.EA_PageUpdated -= OnPageUpdate;
GC.Collect();
}
public void OnPageUpdate()
{
PageName = AppMessages.PageName;
PageIcon = AppMessages.PageIcon;
InvokeAsync(() =>
{
StateHasChanged();
});
}
#endregion Public Methods
#region Protected Methods
protected override void OnInitialized()
{
AppMessages.EA_PageUpdated += OnPageUpdate;
}
protected override async Task OnInitializedAsync()
{
await forceReload();
}
#endregion Protected Methods
#region Private Fields
private string userName = "";
#endregion Private Fields
#region Private Properties
private string PageIcon { get; set; }
private string PageName { get; set; }
[CascadingParameter(Name = "ShowSearch")]
private bool ShowSearch { get; set; }
#endregion Private Properties
#region Private Methods
private async Task forceReload()
{
userName = "N.A.";
await Task.Delay(1);
#if false
var authState = await AuthenticationStateProvider.GetAuthenticationStateAsync();
var user = authState.User;
if (user.Identity.IsAuthenticated)
{
userName = $"{user.Identity.Name}";
}
else
{
userName = "N.A.";
}
#endif
}
#endregion Private Methods
}
}
-76
View File
@@ -53,79 +53,3 @@ else // disegno box non cliccabile e licenza mancante
</div>
}
@code {
[Parameter]
public UpdMan CurrItem { get; set; }
protected List<AnagKeyValueModel> AKVList
{
get
{
return LicServ.AKVList;
}
set
{
LicServ.AKVList = value;
}
}
protected override async Task OnInitializedAsync()
{
// check init AKV
if (AKVList == null || AKVList.Count == 0)
{
AKVList = await DataService.AnagKeyValList();
LicServ.InitAkv();
}
}
protected string getAKVString(string nomeVar)
{
string answ = "";
if (AKVList != null)
{
var currRec = AKVList.FirstOrDefault(x => x.NomeVar == nomeVar);
if (currRec != null)
{
answ = currRec.ValString;
}
}
return answ;
}
protected AnagKeyValueModel getAKVRec(string nomeVar)
{
AnagKeyValueModel answ = new AnagKeyValueModel();
if (AKVList != null)
{
answ = AKVList.FirstOrDefault(x => x.NomeVar == nomeVar);
}
return answ;
}
protected bool authOk()
{
bool allOk = !string.IsNullOrEmpty(CurrItem.LicenseKey);
if (allOk)
{
allOk = LicServ.checkLicenseActive(CurrItem.LicenseKey);
}
return allOk;
}
protected string fullUrl(string relUrl)
{
return $"{Configuration["ServerConf:BaseUrl"]}{relUrl}";
}
protected MarkupString traduci(string lemma)
{
MarkupString answ;
string rawHtml = DataService.Traduci(lemma, "IT");
answ = new MarkupString(rawHtml);
return answ;
}
}
+109
View File
@@ -0,0 +1,109 @@
using Microsoft.AspNetCore.Components;
using MP.AppAuth.Models;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
namespace MP.Land.Components
{
public partial class HomeLink : IDisposable
{
#region Public Properties
[Parameter]
public UpdMan CurrItem { get; set; }
#endregion Public Properties
#region Public Methods
public void Dispose()
{
GC.Collect();
}
#endregion Public Methods
#region Protected Properties
protected List<AnagKeyValueModel> AKVList
{
get
{
return LicServ.AKVList;
}
set
{
LicServ.AKVList = value;
}
}
#endregion Protected Properties
#region Protected Methods
protected bool authOk()
{
bool allOk = !string.IsNullOrEmpty(CurrItem.LicenseKey);
if (allOk)
{
allOk = LicServ.checkLicenseActive(CurrItem.LicenseKey);
}
return allOk;
}
protected string fullUrl(string relUrl)
{
return $"{Configuration["ServerConf:BaseUrl"]}{relUrl}";
}
protected AnagKeyValueModel getAKVRec(string nomeVar)
{
AnagKeyValueModel answ = new AnagKeyValueModel();
if (AKVList != null)
{
answ = AKVList.FirstOrDefault(x => x.NomeVar == nomeVar);
}
return answ;
}
protected string getAKVString(string nomeVar)
{
string answ = "";
if (AKVList != null)
{
var currRec = AKVList.FirstOrDefault(x => x.NomeVar == nomeVar);
if (currRec != null)
{
answ = currRec.ValString;
}
}
return answ;
}
protected override async Task OnInitializedAsync()
{
// check init AKV
if (AKVList == null || AKVList.Count == 0)
{
AKVList = await DataService.AnagKeyValList();
LicServ.InitAkv();
}
}
protected MarkupString traduci(string lemma)
{
MarkupString answ;
string rawHtml = DataService.Traduci(lemma, "IT");
answ = new MarkupString(rawHtml);
return answ;
}
#endregion Protected Methods
}
}
+29 -1
View File
@@ -372,7 +372,35 @@ namespace MP.Land.Data
}
else
{
_logger.LogInformation($"Record non trovato per {authKey}");
_logger.LogInformation($"checkLicenseActive | Record non trovato per {authKey}");
}
}
return answ;
}
/// <summary>
/// Verifica scadenza licenza
/// </summary>
/// <param name="authKey"></param>
/// <returns></returns>
public DateTime getLicenseExpiry(string authKey)
{
DateTime answ = DateTime.Today.AddDays(-1);
//cerco anche nelle info AKV
if (AKVList != null)
{
var recLic = AKVList.Where(x => x.ValString == authKey).FirstOrDefault();
int numLic = 0;
//cerco in record
if (recLic != null)
{
numLic = (int)recLic.ValInt;
// verifico scadenza licenza!
DateTime scadenza = licenseManGLS.expiryDateByAuthKey(Installazione, recLic.NomeVar, numLic, authKey);
answ = scadenza;
}
else
{
_logger.LogInformation($"getLicenseExpiry | Record non trovato per {authKey}");
}
}
return answ;
+1 -1
View File
@@ -3,7 +3,7 @@
<PropertyGroup>
<TargetFramework>net6.0</TargetFramework>
<RootNamespace>MP.Land</RootNamespace>
<Version>6.16.2210.2110</Version>
<Version>6.16.2211.0416</Version>
</PropertyGroup>
<ItemGroup>
+30 -33
View File
@@ -1,40 +1,12 @@
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 MP.Land;
using MP.Land.Shared;
using MP.Land.Data;
using NLog;
using System;
using System.Threading.Tasks;
namespace MP.Land.Pages
{
public partial class About
{
private static NLog.Logger Log = LogManager.GetCurrentClassLogger();
private string Titolo = "";
private string Messaggio = "";
private string ServerStatus = "SrvState";
private string Installazione = "Inst";
private string Applicazione = "App";
private string Licenze = "#";
private DateTime Scadenza = DateTime.Today;
private string MastKey = "########################";
private string mainCss = "alert alert-info";
private string remSrvCss = "bg-warning text-secondary";
private string expDateCss = "bg-warning text-secondary";
private string licenseCss = "bg-warning text-secondary";
#region Protected Methods
protected override async Task OnInitializedAsync()
{
@@ -43,9 +15,31 @@ namespace MP.Land.Pages
await reloadLicenseData();
}
#endregion Protected Methods
#region Private Fields
private static NLog.Logger Log = LogManager.GetCurrentClassLogger();
private string Applicazione = "App";
private string expDateCss = "bg-warning text-secondary";
private string Installazione = "Inst";
private string licenseCss = "bg-warning text-secondary";
private string Licenze = "#";
private string mainCss = "alert alert-info";
private string MastKey = "########################";
private string Messaggio = "";
private string remSrvCss = "bg-warning text-secondary";
private DateTime Scadenza = DateTime.Today;
private string ServerStatus = "SrvState";
private string Titolo = "";
#endregion Private Fields
#region Private Methods
private async Task reloadLicenseData()
{
int cDelay = 5;
int cDelay = 10;
// recupero dati
await Task.Delay(cDelay);
try
@@ -56,13 +50,14 @@ namespace MP.Land.Pages
Installazione = LicServ.Installazione;
Applicazione = LicServ.Applicazione;
MastKey = LicServ.MasterKey;
Scadenza = LicServ.getLicenseExpiry(LicServ.MasterKey);
await Task.Delay(cDelay);
var fatto = await LicServ.RefreshLicense();
await Task.Delay(cDelay);
Licenze = $"{LicServ.NumLicDb}/{LicServ.NumLicRemote}";
licenseCss = "";
}
catch(Exception exc)
catch (Exception exc)
{
licenseCss = "bg-dark text-warning";
Log.Error($"Eccezione in reloadLicenseData:{Environment.NewLine}{exc}");
@@ -86,5 +81,7 @@ namespace MP.Land.Pages
AppMService.PageName = "About";
AppMService.PageIcon = "fas fa-info-circle pr-2";
}
#endregion Private Methods
}
}
-14
View File
@@ -69,17 +69,3 @@
</div>
</div>
@code {
protected string Titolo = "";
protected string Messaggio = "";
protected override void OnInitialized()
{
Titolo = "Mapo MES";
Messaggio = "I nostri contattatti e siti di supporto";
AppMService.ShowSearch = false;
AppMService.PageName = "Contacts";
AppMService.PageIcon = "fas fa-envelope pr-2";
}
}
+36
View File
@@ -0,0 +1,36 @@
using System;
namespace MP.Land.Pages
{
public partial class Contacts : IDisposable
{
#region Public Methods
public void Dispose()
{
GC.Collect();
}
#endregion Public Methods
#region Protected Fields
protected string Messaggio = "";
protected string Titolo = "";
#endregion Protected Fields
#region Protected Methods
protected override void OnInitialized()
{
Titolo = "Mapo MES";
Messaggio = "I nostri contattatti e siti di supporto";
AppMService.ShowSearch = false;
AppMService.PageName = "Contacts";
AppMService.PageIcon = "fas fa-envelope pr-2";
}
#endregion Protected Methods
}
}
+17 -10
View File
@@ -1,22 +1,23 @@
using System;
using Microsoft.AspNetCore.Components;
using MP.Land.Data;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using MP.Land.Data;
using MP.Land.Components;
using Microsoft.AspNetCore.Components;
using Microsoft.Extensions.Configuration;
using MP.AppAuth.Models;
namespace MP.Land.Pages
{
public partial class Index
public partial class Index : IDisposable
{
#region Private Fields
#region Public Methods
private List<MP.AppAuth.Models.UpdMan> ListRecords;
public void Dispose()
{
ListRecords = null;
GC.Collect();
}
#endregion Private Fields
#endregion Public Methods
#region Protected Fields
@@ -63,5 +64,11 @@ namespace MP.Land.Pages
}
#endregion Protected Methods
#region Private Fields
private List<MP.AppAuth.Models.UpdMan> ListRecords;
#endregion Private Fields
}
}
+7 -55
View File
@@ -42,25 +42,25 @@
<div class="list-group">
<div class="list-group-item">
<div class="d-flex w-100 justify-content-between">
<h5 class="mb-1">Environment</h5>
<b class="mb-1">Environment</b>
</div>
<p class="mb-1">@Environment</p>
</div>
<div class="list-group-item">
<div class="d-flex w-100 justify-content-between">
<h5 class="mb-1">Main DB Conf</h5>
<b class="mb-1">Main DB Conf</b>
</div>
<p class="mb-1">@DbNameExample</p>
</div>
<div class="list-group-item">
<div class="d-flex w-100 justify-content-between">
<h5 class="mb-1">.net framework</h5>
<b class="mb-1">.net framework</b>
</div>
<p class="mb-1">@currHwSwInfo.runtimeImg</p>
</div>
<div class="list-group-item">
<div class="d-flex w-100 justify-content-between">
<h5 class="mb-1">Main Assembly</h5>
<b class="mb-1">Main Assembly</b>
</div>
<p class="mb-1">@currHwSwInfo.mainAssembly</p>
</div>
@@ -81,7 +81,7 @@
<div class="list-group">
<div class="list-group-item">
<div class="d-flex w-100 justify-content-between">
<h5 class="mb-1">Server Stats</h5>
<b class="mb-1">Server Stats</b>
</div>
<p class="mb-1">
<pre>@currHwSwInfo.ServerStats</pre>
@@ -89,7 +89,7 @@
</div>
<div class="list-group-item">
<div class="d-flex w-100 justify-content-between">
<h5 class="mb-1">IIS Stats</h5>
<b class="mb-1">IIS Stats</b>
</div>
<p class="mb-1">
<pre>@currHwSwInfo.IISStats</pre>
@@ -112,7 +112,7 @@
<div class="list-group">
<div class="list-group-item">
<div class="d-flex w-100 justify-content-between">
<h5 class="mb-1">Elenco librerie</h5>
<b class="mb-1">Elenco librerie</b>
<span>@currHwSwInfo.numLibraries</span>
</div>
<p class="mb-1">
@@ -133,51 +133,3 @@
</div>
</div>
</div>
@code {
// imposto i vari dati da mostrare a video senza indicare come bypassare...
protected string Titolo = "MAPO System Info";
protected string Messaggio = "HW & SW details";
protected HwSwInfo currHwSwInfo = HwSwInfo.man(System.Reflection.Assembly.GetExecutingAssembly());
protected string masterLic = "";
protected override async Task OnInitializedAsync()
{
await ReloadData();
}
protected async Task ReloadData()
{
var akvList = await DataService.AnagKeyValList();
var licRecord = akvList
.Where(x => x.NomeVar == "MAPO")
.FirstOrDefault();
if (licRecord != null)
{
masterLic = licRecord.ValString;
}
}
protected string DbNameExample
{
get
{
string answ = Configuration["ConnectionStrings:DefaultConnection"];
if (answ.IndexOf(";User ID=") > 0)
{
answ = answ.Substring(0, answ.IndexOf(";User ID="));
}
return answ;
}
}
protected string Environment
{
get
{
string answ = Configuration["Environment"];
return answ;
}
}
}
+72
View File
@@ -0,0 +1,72 @@
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 MP.Land;
using MP.Land.Shared;
using MP.AppAuth;
using MP.Land.Data;
using Microsoft.Extensions.Configuration;
namespace MP.Land.Pages
{
public partial class SysInfo : IDisposable
{
public void Dispose()
{
GC.Collect();
}
// imposto i vari dati da mostrare a video senza indicare come bypassare...
protected string Titolo = "MAPO System Info";
protected string Messaggio = "HW & SW details";
protected HwSwInfo currHwSwInfo = HwSwInfo.man(System.Reflection.Assembly.GetExecutingAssembly());
protected string masterLic = "";
protected override async Task OnInitializedAsync()
{
await ReloadData();
}
protected async Task ReloadData()
{
var akvList = await DataService.AnagKeyValList();
var licRecord = akvList.Where(x => x.NomeVar == "MAPO").FirstOrDefault();
if (licRecord != null)
{
masterLic = licRecord.ValString;
}
}
protected string DbNameExample
{
get
{
string answ = Configuration["ConnectionStrings:DefaultConnection"];
if (answ.IndexOf(";User ID=") > 0)
{
answ = answ.Substring(0, answ.IndexOf(";User ID="));
}
return answ;
}
}
protected string Environment
{
get
{
string answ = Configuration["Environment"];
return answ;
}
}
}
}
+34 -28
View File
@@ -10,22 +10,24 @@ using System.Threading.Tasks;
namespace MP.Land.Pages
{
public partial class UpdateManager
public partial class UpdateManager : IDisposable
{
#region Private Fields
#region Public Methods
private List<MP.AppAuth.Models.UpdMan> ListRecords;
public void Dispose()
{
ListRecords = null;
GC.Collect();
}
#endregion Private Fields
#endregion Public Methods
#region Protected Fields
protected int numDone = 0;
protected int numTot = 0;
protected int totalCount = 0;
protected double TotalMb = 0;
protected UpdateMan updateManAuth = new UpdateMan("SWDownloader", "viaD@nte16");
#endregion Protected Fields
@@ -42,34 +44,12 @@ namespace MP.Land.Pages
protected AppAuthService DataService { get; set; }
protected string outMessages { get; set; } = "";
protected int percLoading { get; set; } = 0;
protected bool showProgress { get; set; } = false;
protected bool showUpdate { get; set; } = false;
#endregion Protected Properties
#region Private Methods
private async Task<long> scaricaSingolo(AppAuth.Models.UpdMan item)
{
long size = 0;
if (item.IsAuth)
{
size = updateManAuth.downloadLatest(item.ManifestUrl, localPath(item.LocalRepo), item.PackName);
}
else
{
size = UpdateMan.obj.downloadLatest(item.ManifestUrl, localPath(item.LocalRepo), item.PackName);
}
numDone++;
percLoading = 100 * numDone / numTot;
return await Task.FromResult(size);
}
#endregion Private Methods
#region Protected Methods
/// <summary>
@@ -151,5 +131,31 @@ namespace MP.Land.Pages
}
#endregion Protected Methods
#region Private Fields
private List<MP.AppAuth.Models.UpdMan> ListRecords;
#endregion Private Fields
#region Private Methods
private async Task<long> scaricaSingolo(AppAuth.Models.UpdMan item)
{
long size = 0;
if (item.IsAuth)
{
size = updateManAuth.downloadLatest(item.ManifestUrl, localPath(item.LocalRepo), item.PackName);
}
else
{
size = UpdateMan.obj.downloadLatest(item.ManifestUrl, localPath(item.LocalRepo), item.PackName);
}
numDone++;
percLoading = 100 * numDone / numTot;
return await Task.FromResult(size);
}
#endregion Private Methods
}
}
+3
View File
@@ -16,6 +16,9 @@ namespace MP.Land.Pages
public void Dispose()
{
AppMService.EA_SearchUpdated -= OnSeachUpdated;
AppMService.EA_FilterUpdated -= OnFilterUpdated;
ListRecords = null;
GC.Collect();
}
#endregion Public Methods
+1 -1
View File
@@ -1,6 +1,6 @@
<body>
<i>Modulo gestione Programmi MAPO</i>
<h4>Versione: 6.16.2210.2110</h4>
<h4>Versione: 6.16.2211.0416</h4>
<br />
Note di rilascio:
<ul>
+1 -1
View File
@@ -1 +1 @@
6.16.2210.2110
6.16.2211.0416
+1 -1
View File
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<item>
<version>6.16.2210.2110</version>
<version>6.16.2211.0416</version>
<url>https://nexus.steamware.net/repository/SWS/MP-LAND/stable/LAST/MP.Land.zip</url>
<changelog>https://nexus.steamware.net/repository/SWS/MP-LAND/stable/LAST/ChangeLog.html</changelog>
<mandatory>false</mandatory>
-32
View File
@@ -26,35 +26,3 @@
</CascadingValue>
</div>
@code {
bool ShowSearch { get; set; } = false;
protected override void OnInitialized()
{
AppMService.EA_ShowSearch += OnShowSearch;
AppMService.EA_HideSearch += OnHideSearch;
}
public void OnShowSearch()
{
ShowSearch = true;
InvokeAsync(() =>
{
StateHasChanged();
});
}
public void OnHideSearch()
{
ShowSearch = false;
InvokeAsync(() =>
{
StateHasChanged();
});
}
public void Dispose()
{
AppMService.EA_ShowSearch -= OnShowSearch;
AppMService.EA_ShowSearch -= OnHideSearch;
}
}
+52
View File
@@ -0,0 +1,52 @@
using System;
namespace MP.Land.Shared
{
public partial class MainLayout
{
#region Public Methods
public void Dispose()
{
AppMService.EA_ShowSearch -= OnShowSearch;
AppMService.EA_ShowSearch -= OnHideSearch;
GC.Collect();
}
public void OnHideSearch()
{
ShowSearch = false;
InvokeAsync(() =>
{
StateHasChanged();
});
}
public void OnShowSearch()
{
ShowSearch = true;
InvokeAsync(() =>
{
StateHasChanged();
});
}
#endregion Public Methods
#region Protected Methods
protected override void OnInitialized()
{
AppMService.EA_ShowSearch += OnShowSearch;
AppMService.EA_HideSearch += OnHideSearch;
}
#endregion Protected Methods
#region Private Properties
private bool ShowSearch { get; set; } = false;
#endregion Private Properties
}
}
-59
View File
@@ -24,63 +24,4 @@
</div>*@
</div>
@code {
protected bool ShowSearch
{
get => MService.ShowSearch;
set => MService.ShowSearch = value;
}
private string userName = "";
private string TipoSearch
{
get => MService.TipoSearch;
set => MService.TipoSearch = value;
}
protected override async Task OnInitializedAsync()
{
MService.EA_ShowSearch += MService_EA_ShowSearch;
await forceReload();
}
private async void MService_EA_ShowSearch()
{
await Task.Delay(1);
await InvokeAsync(() => StateHasChanged());
}
private async Task forceReload()
{
var authState = await AuthenticationStateProvider.GetAuthenticationStateAsync();
var user = authState.User;
if (user.Identity != null&& user.Identity.IsAuthenticated)
{
userName = $"{user.Identity.Name}";
}
else
{
userName = "N.A.";
}
}
public async Task flushCache()
{
await Task.Delay(1);
await MDService.FlushRedisCache();
await JSRuntime.InvokeAsync<bool>("location.reload");
// rimando a home
//NavManager.NavigateTo("", true);
}
[Inject]
private NavigationManager NavManager { get; set; } = null!;
[Inject]
protected MpDataService MDService { get; set; } = null!;
[Inject]
protected IJSRuntime JSRuntime { get; set; } = null!;
}
+84
View File
@@ -0,0 +1,84 @@
using Microsoft.AspNetCore.Components;
using Microsoft.AspNetCore.Components.Authorization;
using Microsoft.JSInterop;
using MP.SPEC.Data;
namespace MP.SPEC.Components
{
public partial class CmpTop
{
#region Public Methods
public async Task flushCache()
{
await Task.Delay(1);
await MDService.FlushRedisCache();
await Task.Delay(1);
// rimando a pagina corrente
NavManager.NavigateTo(NavManager.Uri, true);
}
#endregion Public Methods
#region Protected Properties
[Inject]
protected IJSRuntime JSRuntime { get; set; } = null!;
[Inject]
protected MpDataService MDService { get; set; } = null!;
protected bool ShowSearch { get => MService.ShowSearch; set => MService.ShowSearch = value; }
#endregion Protected Properties
#region Protected Methods
protected override async Task OnInitializedAsync()
{
MService.EA_ShowSearch += MService_EA_ShowSearch;
await forceReload();
}
#endregion Protected Methods
#region Private Fields
private string userName = "";
#endregion Private Fields
#region Private Properties
[Inject]
private NavigationManager NavManager { get; set; } = null!;
private string TipoSearch { get => MService.TipoSearch; set => MService.TipoSearch = value; }
#endregion Private Properties
#region Private Methods
private async Task forceReload()
{
var authState = await AuthenticationStateProvider.GetAuthenticationStateAsync();
var user = authState.User;
if (user.Identity != null && user.Identity.IsAuthenticated)
{
userName = $"{user.Identity.Name}";
}
else
{
userName = "N.A.";
}
}
private async void MService_EA_ShowSearch()
{
await Task.Delay(1);
await InvokeAsync(() => StateHasChanged());
}
#endregion Private Methods
}
}
+135 -8
View File
@@ -14,6 +14,7 @@ else if (totalCount == 0)
}
else
{
<!-- INIZIO: MODIFICA FLUSSO -->
@if (currFluxLogDto != null)
{
<div class="row">
@@ -78,13 +79,137 @@ else
</div>
</div>
}
<!-- FINE: MODIFICA FLUSSO -->
<!-- INIZIO: NUOVO DOSSIER -->
@if (currRecordClone != null)
{
<div class="row">
<div class="col-12">
<div class="card mb-5">
<div class="card-header bg-primary text-light d-flex justify-content-between">
<div>
Nuovo Dossier
</div>
</div>
<div class="card-body">
<!--INIZIO PRIMA RIGA-->
<div class="row">
<div class="col-4 pe-0">
<div class="input-group input-group-sm">
<span class="input-group-text" id="inputGroup-sizing-sm">MACCHINA</span>
<select @bind="@currRecordClone.IdxMacchina" class="form-select" id="macchina" title="Selezionare la macchina" @onclick="()=> enableEditing()">
@if (ListMacchine != null)
{
foreach (var item in ListMacchine)
{
@if (item.IdxMacchina == currRecordClone.IdxMacchina)
{
<option value="@item.IdxMacchina" selected>@item.IdxMacchina | @item.Descrizione</option>
}
else
{
<option value="@item.IdxMacchina">@item.IdxMacchina | @item.Descrizione</option>
}
}
}
</select>
</div>
</div>
<div class="col-4 pe-0">
<div class="input-group input-group-sm">
<span class="input-group-text" id="inputGroup-sizing-sm">FASE</span>
<select class="form-select" @bind="@currRecordClone.KeyRichiesta" @onclick="()=> enableEditing()" title="Selezionare la fase">
@if (ListStati != null)
{
foreach (var item in ListStati)
{
@if (item.value == currRecordClone.KeyRichiesta)
{
<option value="@item.value" selected>@item.label</option>
}
else
{
<option value="@item.value">@item.label</option>
}
}
}
</select>
</div>
</div>
<div class="col-4 pe-0">
<div class="input-group input-group-sm">
<span class="input-group-text" id="inputGroup-sizing-sm" @onclick="()=> enableEditing()">ARTICOLI</span>
<select @bind="@currRecordClone.CodArticolo" class="form-select" id="macchina" title="Selezionare l'articolo">
@if (ListArticoli != null)
{
foreach (var item in ListArticoli)
{
@if (item.CodArticolo == currRecordClone.CodArticolo)
{
<option value="@item.CodArticolo" selected>@item.CodArticolo | @item.DescArticolo</option>
}
else
{
<option value="@item.CodArticolo">@item.CodArticolo | @item.DescArticolo</option>
}
}
}
</select>
</div>
</div>
</div>
<!--FINE PRIMA RIGA-->
<div class="row pt-4">
<div class="col-3 pe-0">
</div>
<div class="col-3 pe-0">
</div>
<div class="col-3 pe-0">
<div class="d-grid gap-2">
<button @onclick="() => cancelNewDoss()" class="btn btn-warning">Annulla <i class="bi bi-x-circle"></i></button>
</div>
</div>
<div class="col-3 pe-0">
<div class="d-grid gap-2">
<button @onclick="() => newDossier(currRecordClone)" class="btn btn-success">Save <i class="bi bi-save"></i></button>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
}
<!-- FINE: NUOVO DOSSIER -->
<div class="row">
<div class="d-flex justify justify-content-between">
<table class="table table-sm table-striped small">
<thead>
<tr>
<th>
<button @onclick="() => closeTableFlux()" class="btn btn-primary btn-sm"><i class="bi bi-arrow-counterclockwise"></i></button>
<div class="text-nowrap">
@if (currRecord != null)
{
<button @onclick="() => closeTableFlux()" class="btn btn-primary btn-sm"><i class="bi bi-arrow-counterclockwise"></i></button>
<button @onclick="()=> cloneRecord(currRecord)" class="btn btn-info btn-sm" title="Duplica Record"><i class="bi bi-clipboard-check"></i></button>
}
</div>
</th>
<th><i class="fa-solid fa-file"></i> Articolo</th>
<th><i class="fa-solid fa-screwdriver-wrench"></i> Fase</th>
@@ -101,8 +226,10 @@ else
<td>
@if (isEditing == false)
{
<!--SEL RECORD PER VISUALIZZAZIONE FLUSSI-->
<button class="btn btn-primary btn-sm" @onclick="() => selRecord(record)"><i class="fa-solid fa-magnifying-glass"></i></button>
<!--SEL RECORD PER CLONA DOSSIER-->
@*<button @onclick="()=> cloneRecord(record)" class="btn btn-info btn-sm" title="Duplica Record"><i class="bi bi-clipboard-check"></i></button>*@
}
else
{
@@ -110,15 +237,15 @@ else
}
</td>
<td>
@record.OdlNav.CodArticolo
<div class="small textConsensed text-secondary">@record.OdlNav.ArticoloNav.DescArticolo</div>
@record.CodArticolo
<div class="small textConsensed text-secondary">@record.ArticoloNav.DescArticolo</div>
</td>
<td>
@tradFase(record.OdlNav.KeyRichiesta)
@tradFase(record.KeyRichiesta)
</td>
<td>
@record.IdxMacchina
<div class="small textConsensed text-secondary">@record.MachineNav.Descrizione</div>
@*<div class="small textConsensed text-secondary">@record.MachineNav.Descrizione</div>*@
</td>
<td>
@record.DtRif
@@ -180,8 +307,8 @@ else
@record.dtEvento
</td>
<td>
@record.CodFlux
<div class="small text-dark" title="Valore Registrato"><i>@traduci(record.CodFlux)</i></div>
@traduci(record.CodFlux)
<div class="small textConsensed text-secondary" title="Valore Registrato">@record.CodFlux</div>
</td>
<td style="text-align: right;">
@if (record.ValoreEdit != record.Valore)
+206 -94
View File
@@ -1,5 +1,4 @@
using Microsoft.AspNetCore.Components;
using Microsoft.AspNetCore.DataProtection;
using Microsoft.JSInterop;
using MP.Data.DatabaseModels;
using MP.Data.DTO;
@@ -13,7 +12,7 @@ namespace MP.SPEC.Components
#region Public Properties
[Parameter]
public EventCallback<Dossiers> RecordSel { get; set; }
public EventCallback<DossierModel> RecordSel { get; set; }
[Parameter]
public EventCallback<FluxLogDTO> RecordSelFlux { get; set; }
@@ -28,8 +27,20 @@ namespace MP.SPEC.Components
#region Public Methods
private FluxLogDTO? currFluxLogDto = null;
public string checkSelect(DossierModel recordSel)
{
string answ = "";
if (currRecord != null)
{
try
{
answ = (currRecord.IdxMacchina == recordSel.IdxMacchina && currRecord.DtRif == recordSel.DtRif) ? "table-info" : "";
}
catch
{ }
}
return answ;
}
public string checkSelPar(FluxLogDTO recordSel)
{
@@ -46,21 +57,6 @@ namespace MP.SPEC.Components
return answ;
}
public string checkSelect(Dossiers recordSel)
{
string answ = "";
if (currRecord != null)
{
try
{
answ = (currRecord.IdxMacchina == recordSel.IdxMacchina && currRecord.DtRif == recordSel.DtRif) ? "table-info" : "";
}
catch
{ }
}
return answ;
}
public void Dispose()
{
currRecord = null;
@@ -68,40 +64,82 @@ namespace MP.SPEC.Components
ListRecords = null;
GC.Collect();
}
private SelectDossierParams lastFilter { get; set; } = new SelectDossierParams() { CurrPage = -1 };
protected override async Task OnParametersSetAsync()
public async Task flushCache()
{
if (!lastFilter.Equals(SelFilter))
{
lastFilter = SelFilter.clone();
await reloadData(true);
}
await Task.Delay(1);
await MDService.FlushRedisCache();
await Task.Delay(1);
// rimando a pagina corrente
NavManager.NavigateTo(NavManager.Uri, true);
}
#endregion Public Methods
#region Protected Properties
private string traduci(string lemma)
{
var answ = MDService.Traduci(lemma, "IT");
return answ;
}
[Inject]
protected IJSRuntime JSRuntime { get; set; } = null!;
[Inject]
protected MpDataService MDService { get; set; } = null!;
#endregion Protected Properties
#region Protected Methods
protected async Task cancel()
{
var alert = await JSRuntime.InvokeAsync<bool>("confirm", "Confermi di voler annullare TUTTE le modifiche? i dati saranno ricaricati.");
if (alert)
{
currFluxLogDto = null;
isEditing = false;
await Task.Delay(1);
if (currRecord != null)
{
listaFlux = MDService.getFluxLog(currRecord.Valore);
}
StateHasChanged();
}
}
protected async Task cancelNewDoss()
{
var alert = await JSRuntime.InvokeAsync<bool>("confirm", "Confermi di voler annullare l'aggiunta di un nuovo dossier? i dati saranno ricaricati.");
if (alert)
{
currRecordClone = null;
isEditing = false;
await Task.Delay(1);
StateHasChanged();
}
}
protected async Task cloneRecord(DossierModel selRec)
{
// creo record duplicato...
DossierModel newRec = new DossierModel()
{
//IdxDossier = 0,
DataType = selRec.DataType,
KeyRichiesta = selRec.KeyRichiesta,
DtRif = DateTime.Now,
IdxMacchina = selRec.IdxMacchina,
CodArticolo = selRec.CodArticolo,
IdxODL = 0,
Valore = selRec.Valore
};
currRecordClone = newRec;
await Task.Delay(1);
}
/// <summary>
/// Eliminazione record selezionato (previa conferma)
/// </summary>
/// <param name="selRec"></param>
/// <returns></returns>
protected async Task deleteRecord(Dossiers selRec)
protected async Task deleteRecord(DossierModel selRec)
{
if (!await JSRuntime.InvokeAsync<bool>("confirm", "Eliminazione Dossier: sei sicuro di voler procedere?"))
return;
@@ -120,25 +158,96 @@ namespace MP.SPEC.Components
await RecordSelFlux.InvokeAsync(selRec);
}
private void enableEditing()
protected async Task newDossier(DossierModel selRec)
{
isEditing = true;
}
var alert = await JSRuntime.InvokeAsync<bool>("confirm", "Confermi di voler creare un nuovo Dossier per l'impianto/articolo selezionato?");
protected async Task cancel()
{
var alert = await JSRuntime.InvokeAsync<bool>("confirm", "Confermi di voler annullare TUTTE le modifiche? i dati saranno ricaricati.");
if (alert)
{
currFluxLogDto = null;
isEditing = false;
await Task.Delay(1);
if (currRecord != null)
if (currRecordClone != null)
{
listaFlux = MDService.getFluxLog(currRecord.Valore);
// serializzo valore x flux log...
DossierFluxLogDTO? valoreDeserializzato = JsonConvert.DeserializeObject<DossierFluxLogDTO>(selRec.Valore);
if (valoreDeserializzato != null)
{
listaFlux = valoreDeserializzato
.ODL
.OrderBy(x => x.CodFlux)
.ToList();
}
if (listaFlux != null)
{
foreach (var item in listaFlux)
{
item.IdxMacchina = selRec.IdxMacchina;
item.Valore = "0";
item.ValoreEdit = "0";
item.dtEvento = DateTime.Now;
}
}
DossierFluxLogDTO updatedResult = new DossierFluxLogDTO() { ODL = listaFlux };
string newVal = JsonConvert.SerializeObject(updatedResult);
// preparo x insert
currRecordClone.DtRif = DateTime.Now;
currRecordClone.IdxMacchina = selRec.IdxMacchina;
currRecordClone.CodArticolo = selRec.CodArticolo;
currRecordClone.KeyRichiesta = selRec.KeyRichiesta;
currRecordClone.Valore = newVal;
// METODO PER INSERT DOSSIER + FLUX
await MDService.DossiersInsert(currRecordClone);
//await reloadData(true);
currRecordClone = null;
isEditing = false;
await Task.Delay(1);
await flushCache();
}
StateHasChanged();
return;
}
else
{
currRecordClone = null;
await Task.Delay(1);
NavManager.NavigateTo(NavManager.Uri, true);
}
}
protected override async Task OnInitializedAsync()
{
ListGruppiFase = await MDService.ElencoGruppiFase();
ListStati = await MDService.AnagStatiComm();
ListArticoli = await MDService.ArticoliGetSearch(100000, "BAGLIETTO", "");
ListMacchine = await MDService.MacchineGetAll();
await reloadData(true);
}
protected override async Task OnParametersSetAsync()
{
if (!lastFilter.Equals(SelFilter))
{
lastFilter = SelFilter.clone();
await reloadData(true);
}
}
protected async void OnSeachUpdated()
{
await InvokeAsync(() =>
{
currPage = 1;
StateHasChanged();
});
}
protected async Task selRecord(DossierModel selRec)
{
currRecord = selRec;
await RecordSel.InvokeAsync(selRec);
listaFlux = MDService.getFluxLog(selRec.Valore);
await toggleTableFlux();
}
protected async Task update(FluxLogDTO selRec)
@@ -147,7 +256,6 @@ namespace MP.SPEC.Components
if (alert)
{
await Task.Delay(1);
if (currRecord != null)
{
@@ -168,33 +276,9 @@ namespace MP.SPEC.Components
{
currFluxLogDto = null;
await Task.Delay(1);
await JSRuntime.InvokeAsync<bool>("location.reload");
// rimando a pagina corrente
NavManager.NavigateTo(NavManager.Uri, true);
}
}
protected override async Task OnInitializedAsync()
{
ListStati = await MDService.AnagStatiComm();
await reloadData(true);
}
protected async void OnSeachUpdated()
{
await InvokeAsync(() =>
{
currPage = 1;
StateHasChanged();
});
}
protected async Task selRecord(Dossiers selRec)
{
currRecord = selRec;
await RecordSel.InvokeAsync(selRec);
listaFlux = MDService.getFluxLog(selRec.Valore);
await toggleTableFlux();
}
protected async Task UpdateData()
@@ -202,19 +286,6 @@ namespace MP.SPEC.Components
currRecord = null;
await reloadData(true);
}
private string css()
{
string answ = "";
if (isEditing)
{
answ = "visible";
}
else
{
answ = "hidden";
}
return answ;
}
#endregion Protected Methods
@@ -222,12 +293,21 @@ namespace MP.SPEC.Components
private int _totalCount = 0;
private Dossiers? currRecord = null;
private FluxLogDTO? currFluxLogDto = null;
private DossierModel? currRecord = null;
private DossierModel? currRecordClone = null;
private List<AnagArticoli>? ListArticoli;
private List<AnagGruppi>? ListGruppiFase;
private List<Macchine>? ListMacchine;
private List<DossierModel>? ListRecords;
private List<Dossiers>? ListRecords;
private List<ListValues>? ListStati;
private List<Dossiers>? SearchRecords;
private List<DossierModel>? SearchRecords;
#endregion Private Fields
@@ -247,6 +327,8 @@ namespace MP.SPEC.Components
private bool isLoading { get; set; } = false;
private SelectDossierParams lastFilter { get; set; } = new SelectDossierParams() { CurrPage = -1 };
private List<FluxLogDTO>? listaFlux { get; set; } = null;
private int MaxRecord
@@ -254,6 +336,9 @@ namespace MP.SPEC.Components
get => SelFilter.MaxRecord;
}
[Inject]
private NavigationManager NavManager { get; set; } = null!;
private int numRecord
{
get => SelFilter.NumRec;
@@ -269,6 +354,7 @@ namespace MP.SPEC.Components
{
get => SelFilter.DtEnd;
}
private DateTime SelDtStart
{
get => SelFilter.DtStart;
@@ -298,6 +384,36 @@ namespace MP.SPEC.Components
#region Private Methods
private async Task closeTableFlux()
{
currFluxLogDto = null;
currRecord = null;
currRecordClone = null;
visualizzaFlux = true;
isEditing = false;
await RecordSelFlux.InvokeAsync(currFluxLogDto);
await Task.Delay(1);
}
private string css()
{
string answ = "";
if (isEditing)
{
answ = "visible";
}
else
{
answ = "hidden";
}
return answ;
}
private void enableEditing()
{
isEditing = true;
}
private async Task reloadData(bool setChanged)
{
isLoading = true;
@@ -332,14 +448,10 @@ namespace MP.SPEC.Components
return answ;
}
private async Task closeTableFlux()
private string traduci(string lemma)
{
currFluxLogDto = null;
currRecord = null;
visualizzaFlux = true;
isEditing = false;
await RecordSelFlux.InvokeAsync(currFluxLogDto);
await Task.Delay(1);
var answ = MDService.Traduci(lemma, "IT");
return answ;
}
#endregion Private Methods
+4 -1
View File
@@ -31,7 +31,10 @@ else
<thead>
<tr>
<th>
<button @onclick="() => resetSel()" class="btn btn-primary btn-sm"><i class="bi bi-arrow-counterclockwise"></i></button>
@if (currRecord != null)
{
<button @onclick="() => resetSel()" class="btn btn-primary btn-sm"><i class="bi bi-arrow-counterclockwise"></i></button>
}
</th>
<th><i class="fa-solid fa-file"></i> Articolo</th>
<th><i class="fa-solid fa-screwdriver-wrench"></i> Fase</th>
+4 -1
View File
@@ -17,7 +17,10 @@ else
<thead>
<tr>
<th>
<button @onclick="() => resetSel()" class="btn btn-primary btn-sm"><i class="bi bi-arrow-counterclockwise"></i></button>
@if (currRecord != null)
{
<button @onclick="() => resetSel()" class="btn btn-primary btn-sm"><i class="bi bi-arrow-counterclockwise"></i></button>
}
</th>
<th><i class="fa-regular fa-calendar-days"></i> Data</th>
<th><i class="fa-solid fa-hard-drive"></i> Macchina</th>
+9 -28
View File
@@ -93,12 +93,18 @@ namespace MP.SPEC.Components
public async Task reloadData(bool setChanged)
{
isLoading = true;
DateTime limitData = DateTime.Now;
DateTime dataFrom = DateTime.Today.AddMonths(-1);
DateTime dataTo = DateTime.Now.AddMinutes(5);
if (SelFilter != null && SelFilter.dtMin != null)
{
dataFrom = (DateTime)SelFilter.dtMin;
}
if (SelDtMax != null)
{
limitData = (DateTime)SelDtMax;
dataTo = (DateTime)SelDtMax;
}
SearchRecords = await MDService.FluxLogGetLastFilt(limitData, SelMacchina, SelFlux, MaxRecord);
SearchRecords = await MDService.FluxLogGetLastFilt(dataTo, dataFrom, SelMacchina, SelFlux, MaxRecord);
totalCount = SearchRecords.Count;
ListRecords = SearchRecords.Skip(numRecord * (currPage - 1)).Take(numRecord).ToList();
await Task.Delay(1);
@@ -157,7 +163,6 @@ namespace MP.SPEC.Components
protected async Task resetSel()
{
currRecord = null;
setDtMax();
await RecordSel.InvokeAsync(null);
}
@@ -240,31 +245,7 @@ namespace MP.SPEC.Components
get => SelFilter.dtMax;
set => SelFilter.dtMax = value;
}
protected void setDtMax()
{
// copio il filtro
var currFilt = SelFilter;
// fermo update
//currFilt.LiveUpdate = true;
currFilt.CurrPage = 0;
currFilt.lastUpdate = $"{DateTime.Now:yyyy/MM/dd HH:mm:ss}";
currFilt.dtMax = RoundDatetime(5);
currFilt.dtMin = RoundDatetime(5).AddHours(-25);
SelFilter = currFilt;
}
/// <summary>
/// Inizializzazione con periodo e arrotondamento
/// </summary>
/// <param name="minRound"></param>
/// <returns></returns>
public static DateTime RoundDatetime(int minRound)
{
TimeSpan DayElapsed = DateTime.Now.Subtract(DateTime.Today);
int minDay = (int)Math.Ceiling((double)(DayElapsed.TotalMinutes / minRound)) * minRound;
DateTime endRounded = DateTime.Today.AddMinutes(minDay);
return endRounded;
}
private int totalCount
{
get => _totalCount;
+6 -2
View File
@@ -17,7 +17,10 @@ else
<thead>
<tr>
<th>
<button @onclick="() => resetSel()" class="btn btn-primary btn-sm"><i class="bi bi-arrow-counterclockwise"></i></button>
@if (currRecord != null)
{
<button @onclick="() => resetSel()" class="btn btn-primary btn-sm"><i class="bi bi-arrow-counterclockwise"></i></button>
}
</th>
<th><i class="fa-solid fa-file"></i> Articolo</th>
<th><i class="fa-solid fa-screwdriver-wrench"></i> Fase</th>
@@ -45,7 +48,8 @@ else
{
<button class="btn btn-secondary btn-sm disabled mx-1" title="ODL ancora in corso">
<i class="far fa-play-circle"></i>
</button>}
</button>
}
</td>
<td>
@record.CodArticolo
+21 -10
View File
@@ -1,4 +1,5 @@
using Microsoft.AspNetCore.Components;
using MP.Data;
using MP.SPEC.Data;
namespace MP.SPEC.Components
@@ -24,10 +25,7 @@ namespace MP.SPEC.Components
/// <returns></returns>
public static DateTime RoundDatetime(int minRound)
{
TimeSpan DayElapsed = DateTime.Now.Subtract(DateTime.Today);
int minDay = (int)Math.Ceiling((double)(DayElapsed.TotalMinutes / minRound)) * minRound;
DateTime endRounded = DateTime.Today.AddMinutes(minDay);
return endRounded;
return Utils.InitDatetime(DateTime.Now, minRound);
}
public void Dispose()
@@ -172,9 +170,9 @@ namespace MP.SPEC.Components
protected override async Task OnInitializedAsync()
{
SelFilter = new SelectFluxParams();
setDtMax();
DateTime dtStart = SelFilter.dtMin != null ? (DateTime)SelFilter.dtMin : DateTime.Now.AddDays(-7);
DateTime dtEnd = SelFilter.dtMax != null ? (DateTime)SelFilter.dtMax : DateTime.Now;
setDtSnap();
DateTime dtStart = SelFilter.dtMin != null ? (DateTime)SelFilter.dtMin : DateTime.Now.AddMonths(-1);
DateTime dtEnd = SelFilter.dtMax != null ? (DateTime)SelFilter.dtMax : DateTime.Today.AddDays(1);
ListMacchine = await MDService.MacchineWithFlux(dtStart, dtEnd);
ListFlux = await MDService.ParametriGetFilt(selMacchina);
@@ -190,7 +188,7 @@ namespace MP.SPEC.Components
await FilterChanged.InvokeAsync(SelFilter);
}
protected void setDtMax()
protected void setDtSnap()
{
// copio il filtro
var currFilt = SelFilter;
@@ -199,7 +197,7 @@ namespace MP.SPEC.Components
currFilt.CurrPage = 0;
currFilt.lastUpdate = $"{DateTime.Now:yyyy/MM/dd HH:mm:ss}";
currFilt.dtMax = RoundDatetime(5);
currFilt.dtMin = RoundDatetime(5).AddHours(-numOreAnticipoSnapshot);
currFilt.dtSnapMin = RoundDatetime(5).AddHours(-numOreAnticipoSnapshot);
SelFilter = currFilt;
}
@@ -226,7 +224,7 @@ namespace MP.SPEC.Components
liveUpdate = false;
// se non ho data rif uso adesso...
DateTime dtMax = selDtMax == null ? RoundDatetime(5) : (DateTime)selDtMax;
DateTime dtMin = selDtMin == null ? RoundDatetime(5).AddHours(-numOreAnticipoSnapshot) : (DateTime)selDtMin;
DateTime dtMin = selDtSnapMin == null ? RoundDatetime(5).AddHours(-numOreAnticipoSnapshot) : (DateTime)selDtSnapMin;
// aggiungo 15 sec
dtMax = dtMax.AddSeconds(15);
await MDService.DossiersTakeParamsSnapshotLast(selMacchina, dtMin, dtMax);
@@ -314,6 +312,19 @@ namespace MP.SPEC.Components
}
}
private DateTime? selDtSnapMin
{
get => SelFilter.dtSnapMin;
set
{
if (SelFilter.dtSnapMin != value)
{
SelFilter.dtSnapMin = value;
reportChange();
}
}
}
private bool showEditPar { get; set; } = false;
private string snapMode
+28 -15
View File
@@ -160,7 +160,9 @@ namespace MP.SPEC.Data
/// <returns></returns>
public async Task<bool> ArticoliDeleteRecord(AnagArticoli currRec)
{
return await dbController.ArticoliDeleteRecord(currRec);
bool fatto = await dbController.ArticoliDeleteRecord(currRec);
await resetCacheArticoli();
return fatto;
}
/// <summary>
@@ -207,7 +209,9 @@ namespace MP.SPEC.Data
/// <returns></returns>
public async Task<bool> ArticoliUpdateRecord(AnagArticoli currRec)
{
return await dbController.ArticoliUpdateRecord(currRec);
bool fatto = await dbController.ArticoliUpdateRecord(currRec);
await resetCacheArticoli();
return fatto;
}
/// <summary>
@@ -338,7 +342,7 @@ namespace MP.SPEC.Data
/// </summary>
/// <param name="selRecord">record dossier da eliminare</param>
/// <returns></returns>
public async Task<bool> DossiersDeleteRecord(Dossiers selRecord)
public async Task<bool> DossiersDeleteRecord(DossierModel selRecord)
{
bool result = false;
Stopwatch stopWatch = new Stopwatch();
@@ -361,9 +365,9 @@ namespace MP.SPEC.Data
/// <param name="DtStart">Data minima per estrazione records</param>
/// <param name="DtEnd">Data Massima per estrazione records</param>
/// <returns></returns>
public async Task<List<Dossiers>> DossiersGetLastFilt(string IdxMacchina, string CodArticolo, DateTime DtStart, DateTime DtEnd)
public async Task<List<DossierModel>> DossiersGetLastFilt(string IdxMacchina, string CodArticolo, DateTime DtStart, DateTime DtEnd)
{
List<Dossiers>? result = new List<Dossiers>();
List<DossierModel>? result = new List<DossierModel>();
Stopwatch stopWatch = new Stopwatch();
stopWatch.Start();
string readType = "DB";
@@ -372,7 +376,7 @@ namespace MP.SPEC.Data
RedisValue rawData = redisDb.StringGet(currKey);
if (rawData.HasValue)
{
result = JsonConvert.DeserializeObject<List<Dossiers>>($"{rawData}");
result = JsonConvert.DeserializeObject<List<DossierModel>>($"{rawData}");
readType = "REDIS";
}
else
@@ -384,7 +388,7 @@ namespace MP.SPEC.Data
}
if (result == null)
{
result = new List<Dossiers>();
result = new List<DossierModel>();
}
stopWatch.Stop();
TimeSpan ts = stopWatch.Elapsed;
@@ -397,10 +401,10 @@ namespace MP.SPEC.Data
/// </summary>
/// <param name="currDoss"></param>
/// <returns></returns>
public async Task<bool> DossiersInsert(Dossiers currDoss)
public async Task<bool> DossiersInsert(DossierModel currDoss)
{
// aggiorno record sul DB
bool answ = await dbController.DossiersUpdateValore(currDoss);
bool answ = await dbController.DossiersInsert(currDoss);
return answ;
}
@@ -451,7 +455,7 @@ namespace MP.SPEC.Data
/// </summary>
/// <param name="currDoss"></param>
/// <returns></returns>
public async Task<bool> DossiersUpdateValore(Dossiers currDoss)
public async Task<bool> DossiersUpdateValore(DossierModel currDoss)
{
// aggiorno record sul DB
bool answ = await dbController.DossiersUpdateValore(currDoss);
@@ -505,18 +509,19 @@ namespace MP.SPEC.Data
/// <summary>
/// Elenco ultimi n record flux log dato macchina e flusso (ordinato x data registrazione)
/// </summary>
/// <param name="DtMax">Data massima (recupera eventi antecedenti)</param>
/// <param name="DtMax">Data massima x eventi</param>
/// <param name="DtMin">Data minima x eventi</param>
/// <param name="IdxMacchina">* = tutte, altrimenti solo x una data macchina</param>
/// <param name="CodFlux">*=tutti, altrimenti solo selezionato</param>
/// <param name="MaxRec">numero massimo record da restituire</param>
/// <returns></returns>
public async Task<List<FluxLog>> FluxLogGetLastFilt(DateTime DtMax, string IdxMacchina, string CodFlux, int MaxRec)
public async Task<List<FluxLog>> FluxLogGetLastFilt(DateTime DtMax, DateTime DtMin, string IdxMacchina, string CodFlux, int MaxRec)
{
List<FluxLog>? result = new List<FluxLog>();
Stopwatch stopWatch = new Stopwatch();
stopWatch.Start();
string readType = "DB";
string currKey = $"{redisFluxLogFilt}:{IdxMacchina}:{CodFlux}:{MaxRec}:{DtMax:yyyyMMdd}:{DtMax:HHmm}";
string currKey = $"{redisFluxLogFilt}:{IdxMacchina}:{CodFlux}:{MaxRec}:{DtMax:yyyyMMddHHmm}:{DtMin:yyyyMMddHHmm}";
// cerco in redis dato valore sel macchina...
RedisValue rawData = redisDb.StringGet(currKey);
if (rawData.HasValue)
@@ -526,7 +531,7 @@ namespace MP.SPEC.Data
}
else
{
result = await Task.FromResult(dbController.FluxLogGetLastFilt(DtMax, IdxMacchina, CodFlux, MaxRec));
result = await Task.FromResult(dbController.FluxLogGetLastFilt(DtMax, DtMin, IdxMacchina, CodFlux, MaxRec));
// serializzo e salvo...
rawData = JsonConvert.SerializeObject(result);
redisDb.StringSet(currKey, rawData, TimeSpan.FromSeconds(10));
@@ -910,7 +915,7 @@ namespace MP.SPEC.Data
return answ;
}
public async Task<bool> updateDossierValue(Dossiers currDoss, FluxLogDTO editFL)
public async Task<bool> updateDossierValue(DossierModel currDoss, FluxLogDTO editFL)
{
bool answ = false;
// recupero intero set valori dossier deserializzando...
@@ -1098,6 +1103,14 @@ namespace MP.SPEC.Data
return answ;
}
private async Task resetCacheArticoli()
{
RedisValue pattern = new RedisValue($"{redisArtByDossier}:*");
await ExecFlushRedisPattern(pattern);
pattern = new RedisValue($"{redisArtList}:*");
await ExecFlushRedisPattern(pattern);
}
#endregion Private Methods
}
}
+23 -5
View File
@@ -5,7 +5,11 @@
#region Public Constructors
public SelectFluxParams()
{ }
{
dtMin = DateTime.Today.AddMonths(-1);
dtMax = DateTime.Today.AddDays(1);
dtSnapMin = DateTime.Today.AddDays(-2);
}
#endregion Public Constructors
@@ -16,6 +20,7 @@
public DateTime? dtRif { get; set; } = null;
public DateTime? dtMax { get; set; } = null;
public DateTime? dtMin { get; set; } = null;
public DateTime? dtSnapMin { get; set; } = null;
public string IdxMacchina { get; set; } = "*";
public string lastUpdate { get; set; } = "-";
public bool LiveUpdate { get; set; } = true;
@@ -36,6 +41,7 @@
dtRif = this.dtRif,
dtMax = this.dtMax,
dtMin = this.dtMin,
dtSnapMin = this.dtSnapMin,
IdxMacchina = this.IdxMacchina,
lastUpdate = this.lastUpdate,
LiveUpdate = this.LiveUpdate,
@@ -54,6 +60,18 @@
if (IdxMacchina != item.IdxMacchina)
return false;
if (dtMax != item.dtMax)
return false;
if (dtMin != item.dtMin)
return false;
if (dtRif != item.dtRif)
return false;
if (dtSnapMin != item.dtSnapMin)
return false;
if (CodFlux != item.CodFlux)
return false;
@@ -65,11 +83,11 @@
if (TempoAgg != item.TempoAgg)
return false;
if (NumRec!= item.NumRec)
if (NumRec != item.NumRec)
return false;
if (TotCount!= item.TotCount)
if (TotCount != item.TotCount)
return false;
if (CurrPage != item.CurrPage)
+1 -1
View File
@@ -5,7 +5,7 @@
<Nullable>enable</Nullable>
<ImplicitUsings>enable</ImplicitUsings>
<RootNamespace>MP.SPEC</RootNamespace>
<Version>6.16.2211.312</Version>
<Version>6.16.2211.709</Version>
</PropertyGroup>
<ItemGroup>
+28 -20
View File
@@ -40,33 +40,21 @@
<div class="card-body">
<div class="row">
<div class="col-4">
<div class="col-3">
<div class="input-group">
<span class="input-group-text">Codice</span>
<input type="text" class="form-control" placeholder="Articolo" @bind-value="@currRecord.CodArticolo">
</div>
</div>
<div class="col-4">
<div class="col-5">
<div class="input-group">
<span class="input-group-text">Disegno</span>
<input type="text" class="form-control" placeholder="Disegno" @bind-value="@currRecord.Disegno">
</div>
</div>
<div class="col-1">
<div class="input-group" title="Tipo">
<select @bind="@currRecord.Tipo" class="form-select text-end">
@if (ListTipoArt != null)
{
foreach (var item in ListTipoArt)
{
<option value="@item.value">@item.label</option>
}
}
</select>
</div>
</div>
<div class="col-3">
<div class="col-4">
<div class="input-group" title="Azienda">
<span class="input-group-text">Azienda</span>
<select @bind="@currRecord.Azienda" class="form-select text-end">
@if (ListAziende != null)
{
@@ -81,8 +69,25 @@
</div>
</div>
<div class="row mt-2">
<div class="col-8">
<input type="text" class="form-control" placeholder="Descrizione Articolo" @bind-value="@currRecord.DescArticolo">
<div class="col-3">
<div class="input-group" title="Tipo">
<span class="input-group-text">Tipo</span>
<select @bind="@currRecord.Tipo" class="form-select text-end">
@if (ListTipoArt != null)
{
foreach (var item in ListTipoArt)
{
<option value="@item.value">@item.label</option>
}
}
</select>
</div>
</div>
<div class="col-5">
<div class="input-group">
<span class="input-group-text">Descrizione</span>
<input type="text" class="form-control" placeholder="Descrizione Articolo" @bind-value="@currRecord.DescArticolo">
</div>
</div>
<div class="col-2">
<div class="d-grid gap-2">
@@ -120,7 +125,10 @@
<thead>
<tr>
<th>
<button @onclick="() => resetSel()" class="btn btn-primary btn-sm"><i class="bi bi-arrow-counterclockwise"></i></button>
@if (currRecord != null)
{
<button @onclick="() => resetSel()" class="btn btn-primary btn-sm"><i class="bi bi-arrow-counterclockwise"></i></button>
}
</th>
<th><i class="fa-solid fa-file"></i> Articolo</th>
<th><i class="fa-solid fa-compass-drafting"></i> Disegno</th>
@@ -136,7 +144,7 @@
<tr class="@checkSelect(@record.CodArticolo)">
<td>
<button @onclick="() => selRecord(record)" class="btn btn-primary btn-sm" title="Modifica Record"><i class="bi bi-pencil-square"></i></button>
<button @onclick="() => cloneRecord(record)" class="btn btn-info btn-sm" title="Duplica Record"><i class="bi bi-clipboard-check"></i></button>
<button @onclick="() => cloneRecord(record)" class="btn btn-info btn-sm" title="Duplica Record"><i class="bi bi-clipboard-check"></i></button>
</td>
<td>
<div>@record.CodArticolo</div>
-1
View File
@@ -28,7 +28,6 @@ namespace MP.SPEC.Pages
public void Dispose()
{
//MessageService.EA_SearchUpdated -= OnSeachUpdated;
currRecord = null;
ListTipoArt = null;
ListAziende = null;
+71
View File
@@ -0,0 +1,71 @@
@page "/Contacts"
@using MP.SPEC.Data
@inject MessageService AppMService
<div class="row mx-2">
<div class="col-12 col-lg-8 offset-lg-2">
<div class="card">
<div class="card-header text-center">
<div class="row">
<div class="col-4"></div>
<div class="col-4">
<h2>@Titolo</h2>
</div>
<div class="col-4">
<div class="badge rounded-pill bg-dark px-4 py-2">
<div class="px-1">
<a class="btn text-light text-decoration-none" href="https://www.egalware.com/" target="_blank">powered by&nbsp;EgalWare <img width="24" class="img-fluid" src="images/LogoEgw.png" /></a>
</div>
</div>
</div>
</div>
</div>
<div class="card-body">
<div class="row">
<div class="col-lg-3"></div>
<div class="col-12 col-lg-6 py-3">
<img src="images/LogoMapoFull.png" class="img-fluid" />
</div>
<div class="col-lg-3"></div>
<div class="col-12">
<h4 class="card-title">@Messaggio</h4>
</div>
<div class="col-sm-4">
<h4>Sede Operativa</h4>
<address>
<strong>EgalWare s.r.l.</strong><br />
via Nazionale, 93<br />
24068 Seriate - BG<br />
<abbr title="Phone">P:</abbr>
035.290178<br />
<abbr title="Phone">P:</abbr>
035.460560
</address>
</div>
<div class="col-sm-4">
<h4>Sede Legale</h4>
<address>
<strong>EgalWare s.r.l.</strong><br />
via Nazionale, 93<br />
24068 Seriate - BG<br />
<br />
<abbr title="P.Iva">VAT:</abbr>03985390164
</address>
</div>
<div class="col-sm-4">
<h4>Supporto</h4>
<address>
<strong>Web:</strong><br />
Accedi al supporto dal <a href="https://support.egalware.com/" target="_blank">nostro sito web</a><br />
<br />
<strong>Email:</strong><br />
Scrivi un email a <a href="mailto:info@egalware.com">info at egalware.com</a>
</address>
</div>
</div>
</div>
</div>
</div>
</div>
+32
View File
@@ -0,0 +1,32 @@
namespace MP.SPEC.Pages
{
public partial class Contacts : IDisposable
{
#region Public Methods
public void Dispose()
{
GC.Collect();
}
#endregion Public Methods
#region Protected Fields
protected string Messaggio = "";
protected string Titolo = "";
#endregion Protected Fields
#region Protected Methods
protected override void OnInitialized()
{
Titolo = "MP SPEC";
Messaggio = "I nostri contattatti e siti di supporto";
AppMService.ShowSearch = false;
}
#endregion Protected Methods
}
}
+2 -2
View File
@@ -50,7 +50,7 @@ namespace MP.SPEC.Pages
isFiltering = false;
}
protected async Task selRecordDoss(Dossiers selDoss)
protected async Task selRecordDoss(DossierModel selDoss)
{
currRecordDoss = selDoss;
await Task.Delay(1);
@@ -78,7 +78,7 @@ namespace MP.SPEC.Pages
set => currFilter.CurrPage = value;
}
private Dossiers? currRecordDoss { get; set; } = null;
private DossierModel? currRecordDoss { get; set; } = null;
private bool isEditing
{
+1 -1
View File
@@ -11,7 +11,7 @@
<div class="p-2 align-content-center fs-1">
<b>MAPO SPEC</b>
</div>
<div class="p-2 bg-light">
<div class="p-2">
<img src="images/LogoEgw.png" class="image-fluid" height="64" />
</div>
</div>
+1 -1
View File
@@ -1,6 +1,6 @@
<body>
<i>Modulo MAPOSPEC </i>
<h4>Versione: 6.16.2211.312</h4>
<h4>Versione: 6.16.2211.709</h4>
<br /> Note di rilascio:
<ul>
<li>
+1 -1
View File
@@ -1 +1 @@
6.16.2211.312
6.16.2211.709
+1 -1
View File
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<item>
<version>6.16.2211.312</version>
<version>6.16.2211.709</version>
<url>https://nexus.steamware.net/repository/SWS/MP-SPEC/stable/LAST/MP.SPEC.zip</url>
<changelog>https://nexus.steamware.net/repository/SWS/MP-SPEC/stable/LAST/ChangeLog.html</changelog>
<mandatory>false</mandatory>
Binary file not shown.

After

Width:  |  Height:  |  Size: 85 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 154 KiB