From 70414dc00f4fff018e9684955268b6cfbba80eb4 Mon Sep 17 00:00:00 2001 From: Samuele Locatelli Date: Mon, 26 Feb 2024 20:05:47 +0100 Subject: [PATCH] Riorganizzazione BasePage con inheritance --- MP-TAB3/Components/IobInfoMan.razor | 10 +- MP-TAB3/Components/MachineBlock.razor | 20 ++-- MP-TAB3/MP-TAB3.csproj | 2 +- MP-TAB3/Pages/BasePage.razor | 2 + MP-TAB3/Pages/BasePage.razor.cs | 160 ++++++++++++++++++++++++++ MP-TAB3/Pages/MachineDetail.razor | 2 + MP-TAB3/Pages/MachineDetail.razor.cs | 109 +----------------- MP-TAB3/Pages/ODL.razor | 1 + MP-TAB3/Pages/ODL.razor.cs | 111 +----------------- MP-TAB3/Pages/Parameters.razor | 1 + MP-TAB3/Pages/Parameters.razor.cs | 95 +-------------- MP-TAB3/Pages/ProdStop.razor | 1 + MP-TAB3/Pages/ProdStop.razor.cs | 72 ++---------- MP-TAB3/Pages/TechSheet.razor | 1 + MP-TAB3/Pages/TechSheet.razor.cs | 85 +------------- MP-TAB3/Resources/ChangeLog.html | 2 +- MP-TAB3/Resources/VersNum.txt | 2 +- MP-TAB3/Resources/manifest.xml | 2 +- MP-TAB3/wwwroot/images/pythonLogo.png | Bin 0 -> 38355 bytes 19 files changed, 208 insertions(+), 470 deletions(-) create mode 100644 MP-TAB3/Pages/BasePage.razor create mode 100644 MP-TAB3/Pages/BasePage.razor.cs create mode 100644 MP-TAB3/wwwroot/images/pythonLogo.png diff --git a/MP-TAB3/Components/IobInfoMan.razor b/MP-TAB3/Components/IobInfoMan.razor index 1c68b7f6..e4c887e8 100644 --- a/MP-TAB3/Components/IobInfoMan.razor +++ b/MP-TAB3/Components/IobInfoMan.razor @@ -6,11 +6,15 @@
@if(infosIob.iType == MP.Data.Objects.Enums.IobType.rPi) { - + } - else if (infosIob.iType == MP.Data.Objects.Enums.IobType.WIN || infosIob.iType == MP.Data.Objects.Enums.IobType.ND) + else if (infosIob.iType == MP.Data.Objects.Enums.IobType.WIN) { - + + } + else if (infosIob.iType == MP.Data.Objects.Enums.IobType.ND) + { + }
diff --git a/MP-TAB3/Components/MachineBlock.razor b/MP-TAB3/Components/MachineBlock.razor index b52071b3..9db94763 100644 --- a/MP-TAB3/Components/MachineBlock.razor +++ b/MP-TAB3/Components/MachineBlock.razor @@ -7,13 +7,11 @@ - - - + - - - + + + @@ -32,13 +30,11 @@ else - - - + - - - + + + diff --git a/MP-TAB3/MP-TAB3.csproj b/MP-TAB3/MP-TAB3.csproj index 0012844d..b9b8d4f5 100644 --- a/MP-TAB3/MP-TAB3.csproj +++ b/MP-TAB3/MP-TAB3.csproj @@ -3,7 +3,7 @@ net6.0 enable - 6.16.2402.2618 + 6.16.2402.2620 enable MP_TAB3 diff --git a/MP-TAB3/Pages/BasePage.razor b/MP-TAB3/Pages/BasePage.razor new file mode 100644 index 00000000..c65238fb --- /dev/null +++ b/MP-TAB3/Pages/BasePage.razor @@ -0,0 +1,2 @@ + + diff --git a/MP-TAB3/Pages/BasePage.razor.cs b/MP-TAB3/Pages/BasePage.razor.cs new file mode 100644 index 00000000..6045369a --- /dev/null +++ b/MP-TAB3/Pages/BasePage.razor.cs @@ -0,0 +1,160 @@ +using Microsoft.AspNetCore.Components; +using MP.Data.DatabaseModels; +using MP.Data; +using MP.Data.Services; +using Newtonsoft.Json; +using NLog.Fluent; + +namespace MP_TAB3.Pages +{ + /// + /// Pagina base da cui ereditare metodi x refresh dati da RedisChannel (MessagePipe) + /// + public partial class BasePage : IDisposable + { + #region Public Properties + + /// + /// Dato di dettaglio MSE per macchina + /// + public MappaStatoExpl? CurrMSE { get; set; } = null; + + /// + /// Macchina selezionata + /// + public string IdxMacc { get; set; } = ""; + + [Inject] + public MessageService MsgServ { get; set; } = null!; + + [Inject] + public TabDataFeeder TDFeeder { get; set; } = null!; + + #endregion Public Properties + + #region Public Methods + + /// + /// Metodo dispose + /// + public virtual void Dispose() + { + IdxMacc = ""; + CurrMSE = null; + TDFeeder.dataPipe.EA_NewMessage -= DataPipe_EA_NewMessage; + } + + #endregion Public Methods + + #region Protected Methods + + /// + /// Override Oninit x aggancio evento update da MessagePipe + /// + /// + protected override async Task OnInitializedAsync() + { + await base.OnInitializedAsync(); + await ReloadData(); + TDFeeder.dataPipe.EA_NewMessage += DataPipe_EA_NewMessage; + } + + /// + /// Metodo refresh con controllo salvataggio in LocalStorage ogni 5 sec + /// + /// + /// + protected async Task RefreshData(List ListMSE) + { + // se vecchio salvo sul browser... + if (DateTime.Now.Subtract(lastSave).TotalSeconds > 5) + { + // salvo in LocalStorage... + await MsgServ.SaveMse(ListMSE); + lastSave = DateTime.Now; + } + if (!string.IsNullOrEmpty(IdxMacc)) + { + var rawData = ListMSE.Find(x => x.IdxMacchina == IdxMacc); + if (rawData != null) + { + CurrMSE = rawData; + } + else + { + await RefreshMBlock(); + } + } + } + + /// + /// Refresh con rilettura da LocalStorage + /// + /// + protected async Task RefreshMBlock() + { + // recupero MSE macchina.... + if (!string.IsNullOrEmpty(IdxMacc)) + { + CurrMSE = await MsgServ.GetMachineMse(IdxMacc); + } + } + + #endregion Protected Methods + + #region Private Fields + + /// + /// DateTime ultimo salvataggio in LocalStorage + /// + private DateTime lastSave = DateTime.Now; + + #endregion Private Fields + + #region Private Methods + + /// + /// Ricevuto nuovi dati da mostrare! + /// + /// + /// + /// + private void DataPipe_EA_NewMessage(object? sender, EventArgs e) + { + PubSubEventArgs currArgs = (PubSubEventArgs)e; + // conversione on-the-fly List --> allarmi + if (!string.IsNullOrEmpty(currArgs.newMessage)) + { + try + { + List? dataList = JsonConvert.DeserializeObject>(currArgs.newMessage); + if (dataList != null) + { + InvokeAsync(() => RefreshData(dataList)); + } + } + catch + { } + } + InvokeAsync(() => + { + StateHasChanged(); + }); + } + + protected virtual async Task ReloadData() + { + if (string.IsNullOrEmpty(IdxMacc)) + { + IdxMacc = await MsgServ.IdxMaccGet(); + } + // recupero MSE macchina.... + if (!string.IsNullOrEmpty(IdxMacc)) + { + CurrMSE = await MsgServ.GetMachineMse(IdxMacc); + } + } + + #endregion Private Methods + } +} \ No newline at end of file diff --git a/MP-TAB3/Pages/MachineDetail.razor b/MP-TAB3/Pages/MachineDetail.razor index 594b3b6c..4f85bf6d 100644 --- a/MP-TAB3/Pages/MachineDetail.razor +++ b/MP-TAB3/Pages/MachineDetail.razor @@ -1,5 +1,7 @@ @page "/machine-detail" +@inherits BasePage + @if (string.IsNullOrEmpty(IdxMacc) || CurrMSE == null) { diff --git a/MP-TAB3/Pages/MachineDetail.razor.cs b/MP-TAB3/Pages/MachineDetail.razor.cs index 54b1a59a..54518220 100644 --- a/MP-TAB3/Pages/MachineDetail.razor.cs +++ b/MP-TAB3/Pages/MachineDetail.razor.cs @@ -7,77 +7,31 @@ using NLog; namespace MP_TAB3.Pages { - public partial class MachineDetail : IDisposable + public partial class MachineDetail { - #region Public Methods - - public void Dispose() - { - IdxMacc = ""; - CurrMSE = null; - TDFeeder.dataPipe.EA_NewMessage -= DataPipe_EA_NewMessage; - } - - #endregion Public Methods - #region Protected Properties - protected MappaStatoExpl? CurrMSE { get; set; } = null; - - protected string IdxMacc { get; set; } = ""; - - [Inject] - protected MessageService MsgServ { get; set; } = null!; - [Inject] protected SharedMemService MStor { get; set; } = null!; [Inject] protected TabDataService TabServ { get; set; } = null!; - [Inject] - protected TabDataFeeder TDFeeder { get; set; } = null!; - #endregion Protected Properties #region Protected Methods protected override async Task OnInitializedAsync() { - await ReloadData(); - TDFeeder.dataPipe.EA_NewMessage += DataPipe_EA_NewMessage; + await base.OnInitializedAsync(); + // recupero parametri configurazione... + await setupConf(); if (enableSchedaTecnica) { checkLottiOdl(); } } - protected async Task RefreshData(List newList) - { - var ListMSE = newList; - if (!string.IsNullOrEmpty(IdxMacc)) - { - var rawData = ListMSE.Find(x => x.IdxMacchina == IdxMacc); - if (rawData != null) - { - CurrMSE = rawData; - } - else - { - await RefreshMBlock(); - } - } - } - - protected async Task RefreshMBlock() - { - // recupero MSE macchina.... - if (!string.IsNullOrEmpty(IdxMacc)) - { - CurrMSE = await MsgServ.GetMachineMse(IdxMacc); - } - } - protected void SetMacc(string selIdxMacc) { IdxMaccSubSel = selIdxMacc; @@ -88,12 +42,10 @@ namespace MP_TAB3.Pages #region Private Fields private static Logger Log = LogManager.GetCurrentClassLogger(); - private bool enableMagLotti = false; - private bool enableSchedaTecnica = false; - private string IdxMaccSubSel = ""; + private DateTime lastSave = DateTime.Now; #endregion Private Fields @@ -123,56 +75,7 @@ namespace MP_TAB3.Pages #endif } - /// - /// Ricevuto nuovi dati da mostrare! - /// - /// - /// - /// - private void DataPipe_EA_NewMessage(object? sender, EventArgs e) - { - PubSubEventArgs currArgs = (PubSubEventArgs)e; - // conversione on-the-fly List --> allarmi - if (!string.IsNullOrEmpty(currArgs.newMessage)) - { - try - { - List? dataList = JsonConvert.DeserializeObject>(currArgs.newMessage); - if (dataList != null) - { - InvokeAsync(() => RefreshData(dataList)); - } - } - catch - { } - } - InvokeAsync(() => - { - StateHasChanged(); - }); - } - - private async Task ReloadData() - { - try - { - if (string.IsNullOrEmpty(IdxMacc)) - { - IdxMacc = await MsgServ.IdxMaccGet(); - } - // recupero MSE macchina.... - if (!string.IsNullOrEmpty(IdxMacc)) - { - CurrMSE = await MsgServ.GetMachineMse(IdxMacc); - } - } - catch (Exception exc) - { - Log.Error($"Eccezione in ReloadData{Environment.NewLine}{exc}"); - } - // recupero parametri configurazione... - await setupConf(); - } + private async Task setupConf() { diff --git a/MP-TAB3/Pages/ODL.razor b/MP-TAB3/Pages/ODL.razor index 0ea5c0ad..daf48433 100644 --- a/MP-TAB3/Pages/ODL.razor +++ b/MP-TAB3/Pages/ODL.razor @@ -1,4 +1,5 @@ @page "/odl" +@inherits BasePage @if (string.IsNullOrEmpty(IdxMacc) || CurrMSE == null) { diff --git a/MP-TAB3/Pages/ODL.razor.cs b/MP-TAB3/Pages/ODL.razor.cs index e1cdeb48..21eecc75 100644 --- a/MP-TAB3/Pages/ODL.razor.cs +++ b/MP-TAB3/Pages/ODL.razor.cs @@ -7,65 +7,13 @@ using NLog; namespace MP_TAB3.Pages { - public partial class ODL : IDisposable + public partial class ODL { - #region Public Methods - - public void Dispose() - { - IdxMacc = ""; - CurrMSE = null; - TDFeeder.dataPipe.EA_NewMessage -= DataPipe_EA_NewMessage; - } - - #endregion Public Methods - - #region Protected Properties - - protected MappaStatoExpl? CurrMSE { get; set; } = null; - - protected string IdxMacc { get; set; } = ""; - - [Inject] - protected MessageService MsgServ { get; set; } = null!; - - [Inject] - protected TabDataFeeder TDFeeder { get; set; } = null!; - - #endregion Protected Properties - #region Protected Methods protected override async Task OnInitializedAsync() { - await ReloadData(); - TDFeeder.dataPipe.EA_NewMessage += DataPipe_EA_NewMessage; - } - - protected async Task RefreshData(List newList) - { - var ListMSE = newList; - if (!string.IsNullOrEmpty(IdxMacc)) - { - var rawData = ListMSE.Find(x => x.IdxMacchina == IdxMacc); - if (rawData != null) - { - CurrMSE = rawData; - } - else - { - await RefreshMBlock(); - } - } - } - - protected async Task RefreshMBlock() - { - // recupero MSE macchina.... - if (!string.IsNullOrEmpty(IdxMacc)) - { - CurrMSE = await MsgServ.GetMachineMse(IdxMacc); - } + await base.OnInitializedAsync(); } protected void SetMacc(string selIdxMacc) @@ -77,63 +25,8 @@ namespace MP_TAB3.Pages #region Private Fields - private static Logger Log = LogManager.GetCurrentClassLogger(); - private string IdxMaccSubSel = ""; #endregion Private Fields - - #region Private Methods - - /// - /// Ricevuto nuovi dati da mostrare! - /// - /// - /// - /// - private void DataPipe_EA_NewMessage(object? sender, EventArgs e) - { - PubSubEventArgs currArgs = (PubSubEventArgs)e; - // conversione on-the-fly List --> allarmi - if (!string.IsNullOrEmpty(currArgs.newMessage)) - { - try - { - List? dataList = JsonConvert.DeserializeObject>(currArgs.newMessage); - if (dataList != null) - { - InvokeAsync(() => RefreshData(dataList)); - } - } - catch - { } - } - InvokeAsync(() => - { - StateHasChanged(); - }); - } - - private async Task ReloadData() - { - try - { - if (string.IsNullOrEmpty(IdxMacc)) - { - IdxMacc = await MsgServ.IdxMaccGet(); - } - // recupero MSE macchina.... - if (!string.IsNullOrEmpty(IdxMacc)) - { - CurrMSE = await MsgServ.GetMachineMse(IdxMacc); - } - } - catch (Exception exc) - { - Log.Error($"Eccezione in ReloadData{Environment.NewLine}{exc}"); - } - } - - #endregion Private Methods } } \ No newline at end of file diff --git a/MP-TAB3/Pages/Parameters.razor b/MP-TAB3/Pages/Parameters.razor index 0d437754..92671371 100644 --- a/MP-TAB3/Pages/Parameters.razor +++ b/MP-TAB3/Pages/Parameters.razor @@ -1,4 +1,5 @@ @page "/parameters" +@inherits BasePage @if (string.IsNullOrEmpty(IdxMacc) || CurrMSE == null) { diff --git a/MP-TAB3/Pages/Parameters.razor.cs b/MP-TAB3/Pages/Parameters.razor.cs index 8c65a789..f26fc545 100644 --- a/MP-TAB3/Pages/Parameters.razor.cs +++ b/MP-TAB3/Pages/Parameters.razor.cs @@ -4,108 +4,17 @@ using MP.Data.DatabaseModels; using MP.Data.Services; using Newtonsoft.Json; - namespace MP_TAB3.Pages { - public partial class Parameters : IDisposable + public partial class Parameters { - #region Public Methods - - public void Dispose() - { - IdxMacc = ""; - CurrMSE = null; - TDFeeder.dataPipe.EA_NewMessage -= DataPipe_EA_NewMessage; - } - - #endregion Public Methods - - #region Protected Properties - - protected MappaStatoExpl? CurrMSE { get; set; } = null; - - protected string IdxMacc { get; set; } = ""; - - [Inject] - protected MessageService MsgServ { get; set; } = null!; - - [Inject] - protected TabDataFeeder TDFeeder { get; set; } = null!; - - #endregion Protected Properties - #region Protected Methods protected override async Task OnInitializedAsync() { - await ReloadData(); - TDFeeder.dataPipe.EA_NewMessage += DataPipe_EA_NewMessage; - } - - protected async Task RefreshData(List newList) - { - var ListMSE = newList; - if (!string.IsNullOrEmpty(IdxMacc)) - { - var rawData = ListMSE.Find(x => x.IdxMacchina == IdxMacc); - if (rawData != null) - { - CurrMSE = rawData; - } - else - { - await ReloadData(); - } - } - await InvokeAsync(StateHasChanged); + await base.OnInitializedAsync(); } #endregion Protected Methods - - #region Private Methods - - /// - /// Ricevuto nuovi dati da mostrare! - /// - /// - /// - /// - private void DataPipe_EA_NewMessage(object? sender, EventArgs e) - { - PubSubEventArgs currArgs = (PubSubEventArgs)e; - // conversione on-the-fly List --> allarmi - if (!string.IsNullOrEmpty(currArgs.newMessage)) - { - try - { - List? dataList = JsonConvert.DeserializeObject>(currArgs.newMessage); - if (dataList != null) - { - InvokeAsync(() => RefreshData(dataList)); - } - } - catch - { } - } - InvokeAsync(() => - { - StateHasChanged(); - }); - } - - private async Task ReloadData() - { - if (string.IsNullOrEmpty(IdxMacc)) - { - IdxMacc = await MsgServ.IdxMaccGet(); - // recupero MSE macchina.... - if (!string.IsNullOrEmpty(IdxMacc)) - { - CurrMSE = await MsgServ.GetMachineMse(IdxMacc); - } - } - } - - #endregion Private Methods } } \ No newline at end of file diff --git a/MP-TAB3/Pages/ProdStop.razor b/MP-TAB3/Pages/ProdStop.razor index 60ddaeef..e7f1d040 100644 --- a/MP-TAB3/Pages/ProdStop.razor +++ b/MP-TAB3/Pages/ProdStop.razor @@ -1,4 +1,5 @@ @page "/prod-stop" +@inherits BasePage @if (string.IsNullOrEmpty(IdxMacc) || CurrMSE == null) { diff --git a/MP-TAB3/Pages/ProdStop.razor.cs b/MP-TAB3/Pages/ProdStop.razor.cs index e4a9f1ec..9a384968 100644 --- a/MP-TAB3/Pages/ProdStop.razor.cs +++ b/MP-TAB3/Pages/ProdStop.razor.cs @@ -8,17 +8,10 @@ using NLog; namespace MP_TAB3.Pages { - public partial class ProdStop : IDisposable + public partial class ProdStop { #region Public Methods - public void Dispose() - { - IdxMacc = ""; - CurrMSE = null; - TDFeeder.dataPipe.EA_NewMessage -= DataPipe_EA_NewMessage; - } - #endregion Public Methods #region Protected Fields @@ -41,13 +34,11 @@ namespace MP_TAB3.Pages protected string alertCss { get; set; } = "alert-danger"; - protected MappaStatoExpl? CurrMSE { get; set; } = null; protected DateTime DtRif { get; set; } = DateTime.Now; protected List events2show { get; set; } = new List(); - protected string IdxMacc { get; set; } = ""; /// /// Determina se insert sia Realtime o batch con DataOra (in base a diff tra DataOra @@ -85,9 +76,6 @@ namespace MP_TAB3.Pages [Inject] protected TabDataService TabDServ { get; set; } = null!; - [Inject] - protected TabDataFeeder TDFeeder { get; set; } = null!; - #endregion Protected Properties #region Protected Methods @@ -233,6 +221,7 @@ namespace MP_TAB3.Pages protected override async Task OnInitializedAsync() { + await base.OnInitializedAsync(); dltMinRealtime = SMServ.GetConfInt("dltMinRealtime"); minAnticipoRicalcolo = SMServ.GetConfInt("minAnticipoRicalcolo"); rdm_nEvStep = SMServ.GetConfInt("rdm_nEvStep"); @@ -240,25 +229,9 @@ namespace MP_TAB3.Pages rdm_ChkOnly = SMServ.GetConfBool("rdm_ChkOnly"); // leggo gli altri dati await ReloadData(); - TDFeeder.dataPipe.EA_NewMessage += DataPipe_EA_NewMessage; } - protected async Task RefreshData(List newList) - { - var ListMSE = newList; - if (!string.IsNullOrEmpty(IdxMacc)) - { - var rawData = ListMSE.Find(x => x.IdxMacchina == IdxMacc); - if (rawData != null) - { - CurrMSE = rawData; - } - else - { - await ReloadData(); - } - } - } + protected void SetDate(DateTime newDate) { @@ -284,47 +257,16 @@ namespace MP_TAB3.Pages #region Private Methods - /// - /// Ricevuto nuovi dati da mostrare! - /// - /// - /// - /// - private void DataPipe_EA_NewMessage(object? sender, EventArgs e) - { - PubSubEventArgs currArgs = (PubSubEventArgs)e; - // conversione on-the-fly List --> allarmi - if (!string.IsNullOrEmpty(currArgs.newMessage)) - { - try - { - List? dataList = JsonConvert.DeserializeObject>(currArgs.newMessage); - if (dataList != null) - { - InvokeAsync(() => RefreshData(dataList)); - } - } - catch - { } - } - InvokeAsync(() => - { - StateHasChanged(); - }); - } - private async Task ReloadData() + + protected override async Task ReloadData() { if (string.IsNullOrEmpty(IdxMacc)) { try { - IdxMacc = await MServ.IdxMaccGet(); - // recupero MSE macchina.... - if (!string.IsNullOrEmpty(IdxMacc)) - { - CurrMSE = await MServ.GetMachineMse(IdxMacc); - } + await base.ReloadData(); + // recupero eventi var eventsAll = await TabDServ.AnagEventiGetByMacch(IdxMacc); if (eventsAll != null) { diff --git a/MP-TAB3/Pages/TechSheet.razor b/MP-TAB3/Pages/TechSheet.razor index 0ef96f07..5f8d6233 100644 --- a/MP-TAB3/Pages/TechSheet.razor +++ b/MP-TAB3/Pages/TechSheet.razor @@ -1,4 +1,5 @@ @page "/tech-sheet" +@inherits BasePage @if (string.IsNullOrEmpty(IdxMacc) || CurrMSE == null) { diff --git a/MP-TAB3/Pages/TechSheet.razor.cs b/MP-TAB3/Pages/TechSheet.razor.cs index 7ea742a9..12d248e1 100644 --- a/MP-TAB3/Pages/TechSheet.razor.cs +++ b/MP-TAB3/Pages/TechSheet.razor.cs @@ -6,65 +6,30 @@ using Newtonsoft.Json; namespace MP_TAB3.Pages { - public partial class TechSheet : IDisposable + public partial class TechSheet { - #region Public Methods - - public void Dispose() - { - IdxMacc = ""; - CurrMSE = null; - TDFeeder.dataPipe.EA_NewMessage -= DataPipe_EA_NewMessage; - } - - #endregion Public Methods - #region Protected Properties - protected MappaStatoExpl? CurrMSE { get; set; } = null; - protected string IdxMacc { get; set; } = ""; - - [Inject] - protected MessageService MsgServ { get; set; } = null!; - [Inject] protected TabDataService TabDServ { get; set; } = null!; - [Inject] - protected TabDataFeeder TDFeeder { get; set; } = null!; - #endregion Protected Properties #region Protected Methods protected override async Task OnInitializedAsync() { - await ReloadData(); - TDFeeder.dataPipe.EA_NewMessage += DataPipe_EA_NewMessage; + await base.OnInitializedAsync(); SetupConf(); } - protected async Task RefreshData(List newList) - { - var ListMSE = newList; - if (!string.IsNullOrEmpty(IdxMacc)) - { - var rawData = ListMSE.Find(x => x.IdxMacchina == IdxMacc); - if (rawData != null) - { - CurrMSE = rawData; - } - } - await InvokeAsync(StateHasChanged); - } - #endregion Protected Methods #region Private Fields - private string disMessage = "Gestione schede tecniche di attrezzaggio, collaudo e verifica procedure di setup. Il modulo opzionale � attivabile su richiesta."; + private string disMessage = "Gestione schede tecniche di attrezzaggio, collaudo e verifica procedure di setup. Il modulo opzionale ` attivabile su richiesta."; - private string disSubtitle = "Funzionalit� disattivata"; + private string disSubtitle = "Funzionalità disattivata"; private string disTitle = "Scheda Tecnica"; @@ -74,48 +39,6 @@ namespace MP_TAB3.Pages #region Private Methods - /// - /// Ricevuto nuovi dati da mostrare! - /// - /// - /// - /// - private void DataPipe_EA_NewMessage(object? sender, EventArgs e) - { - PubSubEventArgs currArgs = (PubSubEventArgs)e; - // conversione on-the-fly List --> allarmi - if (!string.IsNullOrEmpty(currArgs.newMessage)) - { - try - { - List? dataList = JsonConvert.DeserializeObject>(currArgs.newMessage); - if (dataList != null) - { - InvokeAsync(() => RefreshData(dataList)); - } - } - catch - { } - } - InvokeAsync(() => - { - StateHasChanged(); - }); - } - - private async Task ReloadData() - { - if (string.IsNullOrEmpty(IdxMacc)) - { - IdxMacc = await MsgServ.IdxMaccGet(); - // recupero MSE macchina.... - if (!string.IsNullOrEmpty(IdxMacc)) - { - CurrMSE = await MsgServ.GetMachineMse(IdxMacc); - } - } - } - private void SetupConf() { TabDServ.ConfigGetVal("enableSchedaTecnica", ref enableSchedaTecnica); diff --git a/MP-TAB3/Resources/ChangeLog.html b/MP-TAB3/Resources/ChangeLog.html index 1bd4c4f9..1df8a689 100644 --- a/MP-TAB3/Resources/ChangeLog.html +++ b/MP-TAB3/Resources/ChangeLog.html @@ -1,6 +1,6 @@ Modulo MAPOSPEC -

Versione: 6.16.2402.2618

+

Versione: 6.16.2402.2620


Note di rilascio:
  • diff --git a/MP-TAB3/Resources/VersNum.txt b/MP-TAB3/Resources/VersNum.txt index 502eda9e..9fdb0fad 100644 --- a/MP-TAB3/Resources/VersNum.txt +++ b/MP-TAB3/Resources/VersNum.txt @@ -1 +1 @@ -6.16.2402.2618 +6.16.2402.2620 diff --git a/MP-TAB3/Resources/manifest.xml b/MP-TAB3/Resources/manifest.xml index 9889819e..ccf0e254 100644 --- a/MP-TAB3/Resources/manifest.xml +++ b/MP-TAB3/Resources/manifest.xml @@ -1,6 +1,6 @@ - 6.16.2402.2618 + 6.16.2402.2620 https://nexus.steamware.net/repository/SWS/MP-TAB3/stable/LAST/MP-TAB3.zip https://nexus.steamware.net/repository/SWS/MP-TAB3/stable/LAST/ChangeLog.html false diff --git a/MP-TAB3/wwwroot/images/pythonLogo.png b/MP-TAB3/wwwroot/images/pythonLogo.png new file mode 100644 index 0000000000000000000000000000000000000000..2a5507984bc815e608ba09c40765e7d5f9597c7d GIT binary patch literal 38355 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