From 39bfd3889e902a8c0f266e8c6a41c30885d327c5 Mon Sep 17 00:00:00 2001 From: Samuele Locatelli Date: Tue, 21 Oct 2025 19:12:54 +0200 Subject: [PATCH 01/26] Modifica da testare con nuovo nuget --- Test.UI/Components/Pages/EditJWD.razor.cs | 2 +- Test.UI/appsettings.json | 4 ++++ WebWindowComplex/WebWindowComplex.csproj | 4 +++- WebWindowConfigurator/WebWindowConfigurator.csproj | 4 +++- 4 files changed, 11 insertions(+), 3 deletions(-) diff --git a/Test.UI/Components/Pages/EditJWD.razor.cs b/Test.UI/Components/Pages/EditJWD.razor.cs index 5b21eb7..928c418 100644 --- a/Test.UI/Components/Pages/EditJWD.razor.cs +++ b/Test.UI/Components/Pages/EditJWD.razor.cs @@ -29,7 +29,7 @@ namespace Test.UI.Components.Pages #region Public Methods /// - /// Comparatore euqlity obj dizionario + /// Comparatore equality obj dizionario /// /// /// diff --git a/Test.UI/appsettings.json b/Test.UI/appsettings.json index a54d3bc..e0a0df8 100644 --- a/Test.UI/appsettings.json +++ b/Test.UI/appsettings.json @@ -13,7 +13,11 @@ "PubChannel": "EgwEngineInput", "SubChannel": "EgwEngineOutput", "SvgChannel": "Egw:svg:img", + "ShapeChannel": "Egw:shape:curr", + "HwOptChannel": "Egw:hw:opt", + "ProfListChannel": "Egw:prof:list", "BomChannel": "Egw:bom", + "UpdateChannel": "Egw:update", "Prog.ApiUrl": "https://office.egalware.com/lux/srv/api", "ImageBaseUrl": "window", "GenericBaseUrl": "generic", diff --git a/WebWindowComplex/WebWindowComplex.csproj b/WebWindowComplex/WebWindowComplex.csproj index 8a8a518..6d3232c 100644 --- a/WebWindowComplex/WebWindowComplex.csproj +++ b/WebWindowComplex/WebWindowComplex.csproj @@ -6,7 +6,7 @@ net8.0 enable enable - 2.7.10.2117 + 2.7.10.2118 Annamaria Sassi Egalware Componente gestione Configurazioni avanzate Window per LUX @@ -39,3 +39,5 @@ + + diff --git a/WebWindowConfigurator/WebWindowConfigurator.csproj b/WebWindowConfigurator/WebWindowConfigurator.csproj index 18da0ef..60b6d3f 100644 --- a/WebWindowConfigurator/WebWindowConfigurator.csproj +++ b/WebWindowConfigurator/WebWindowConfigurator.csproj @@ -6,7 +6,7 @@ net8.0 enable enable - 2.7.10.2117 + 2.7.10.2118 Annamaria Sassi Egalware Componente gestione JWD per LUX @@ -115,6 +115,8 @@ + + From b7a349701956b24326e7a01e60f3e6d589b806c1 Mon Sep 17 00:00:00 2001 From: Samuele Locatelli Date: Wed, 22 Oct 2025 12:51:30 +0200 Subject: [PATCH 02/26] Update componenti comunicazione + inizio modifica gestione calcolo shape --- Test.UI/Components/Pages/Aedifica.razor.cs | 6 +- Test.UI/Components/Pages/EditJWD.razor.cs | 6 +- Test.UI/Components/Pages/Gerarchia.razor.cs | 6 +- Test.UI/Components/Pages/Home.razor.cs | 6 +- .../Pages/TestComponentJWD.razor.cs | 6 +- .../Pages/TestComponentTemplate.razor.cs | 6 +- Test.UI/Test.UI.csproj | 4 +- Test.UI/appsettings.json | 15 ++--- WebWindowComplex/Json/JsonUtility.cs | 2 +- WebWindowComplex/Models/Area.cs | 12 ++-- WebWindowComplex/Models/Fill.cs | 6 +- WebWindowComplex/Models/Frame.cs | 6 +- .../Models/OnReqShapeEventArgs.cs | 28 +++++++++ WebWindowComplex/Models/Sash.cs | 61 ++++++++++++++++--- WebWindowComplex/Models/SashDimension.cs | 4 +- WebWindowComplex/Models/Split.cs | 6 +- WebWindowComplex/Models/Splitted.cs | 6 +- WebWindowComplex/TableComp.razor.cs | 21 ++++++- WebWindowComplex/WebWindowComplex.csproj | 6 +- .../WebWindowConfigurator.csproj | 6 +- 20 files changed, 157 insertions(+), 62 deletions(-) create mode 100644 WebWindowComplex/Models/OnReqShapeEventArgs.cs diff --git a/Test.UI/Components/Pages/Aedifica.razor.cs b/Test.UI/Components/Pages/Aedifica.razor.cs index 6acc280..263b519 100644 --- a/Test.UI/Components/Pages/Aedifica.razor.cs +++ b/Test.UI/Components/Pages/Aedifica.razor.cs @@ -27,7 +27,7 @@ namespace Test.UI.Components.Pages public void Dispose() { - DLService.CalcDonePipe.EA_NewMessage -= CalcDonePipe_EA_NewMessage; + DLService.PipeSvg.EA_NewMessage -= PipeSvg_EA_NewMessage; } protected MarkupString JsonSer @@ -40,7 +40,7 @@ namespace Test.UI.Components.Pages protected override async Task OnInitializedAsync() { ConfInit(); - DLService.CalcDonePipe.EA_NewMessage += CalcDonePipe_EA_NewMessage; + DLService.PipeSvg.EA_NewMessage += PipeSvg_EA_NewMessage; //await ReloadData(); await Task.Delay(1); } @@ -67,7 +67,7 @@ namespace Test.UI.Components.Pages } } - private async void CalcDonePipe_EA_NewMessage(object? sender, EventArgs e) + private async void PipeSvg_EA_NewMessage(object? sender, EventArgs e) { // aggiorno visualizzazione PubSubEventArgs currArgs = (PubSubEventArgs)e; diff --git a/Test.UI/Components/Pages/EditJWD.razor.cs b/Test.UI/Components/Pages/EditJWD.razor.cs index 928c418..2966db4 100644 --- a/Test.UI/Components/Pages/EditJWD.razor.cs +++ b/Test.UI/Components/Pages/EditJWD.razor.cs @@ -61,7 +61,7 @@ namespace Test.UI.Components.Pages public void Dispose() { - DLService.CalcDonePipe.EA_NewMessage -= CalcDonePipe_EA_NewMessage; + DLService.PipeSvg.EA_NewMessage -= PipeSvg_EA_NewMessage; } #endregion Public Methods @@ -174,7 +174,7 @@ namespace Test.UI.Components.Pages CurrJwd = InitialJwd, SvgPreview = currSvg }; - DLService.CalcDonePipe.EA_NewMessage += CalcDonePipe_EA_NewMessage; + DLService.PipeSvg.EA_NewMessage += PipeSvg_EA_NewMessage; } #endregion Protected Methods @@ -207,7 +207,7 @@ namespace Test.UI.Components.Pages #region Private Methods - private async void CalcDonePipe_EA_NewMessage(object? sender, EventArgs e) + private async void PipeSvg_EA_NewMessage(object? sender, EventArgs e) { // aggiorno visualizzazione PubSubEventArgs currArgs = (PubSubEventArgs)e; diff --git a/Test.UI/Components/Pages/Gerarchia.razor.cs b/Test.UI/Components/Pages/Gerarchia.razor.cs index 010780f..39bcbad 100644 --- a/Test.UI/Components/Pages/Gerarchia.razor.cs +++ b/Test.UI/Components/Pages/Gerarchia.razor.cs @@ -25,7 +25,7 @@ namespace Test.UI.Components.Pages public void Dispose() { - DLService.CalcDonePipe.EA_NewMessage -= CalcDonePipe_EA_NewMessage; + DLService.PipeSvg.EA_NewMessage -= PipeSvg_EA_NewMessage; } #endregion Public Methods @@ -96,7 +96,7 @@ namespace Test.UI.Components.Pages SelColorMaterial = "Black"; SelMaterial = "Pine"; SelGlass = "4T/16/4T"; - DLService.CalcDonePipe.EA_NewMessage += CalcDonePipe_EA_NewMessage; + DLService.PipeSvg.EA_NewMessage += PipeSvg_EA_NewMessage; await ReloadData(); } @@ -123,7 +123,7 @@ namespace Test.UI.Components.Pages #region Private Methods - private async void CalcDonePipe_EA_NewMessage(object? sender, EventArgs e) + private async void PipeSvg_EA_NewMessage(object? sender, EventArgs e) { // aggiorno visualizzazione PubSubEventArgs currArgs = (PubSubEventArgs)e; diff --git a/Test.UI/Components/Pages/Home.razor.cs b/Test.UI/Components/Pages/Home.razor.cs index b28dd71..e749c4c 100644 --- a/Test.UI/Components/Pages/Home.razor.cs +++ b/Test.UI/Components/Pages/Home.razor.cs @@ -20,7 +20,7 @@ namespace Test.UI.Components.Pages public void Dispose() { - DLService.CalcDonePipe.EA_NewMessage -= CalcDonePipe_EA_NewMessage; + DLService.PipeSvg.EA_NewMessage -= PipeSvg_EA_NewMessage; } #endregion Public Methods @@ -62,7 +62,7 @@ namespace Test.UI.Components.Pages { isLoading = true; ConfInit(); - DLService.CalcDonePipe.EA_NewMessage += CalcDonePipe_EA_NewMessage; + DLService.PipeSvg.EA_NewMessage += PipeSvg_EA_NewMessage; await ReloadData(); } @@ -105,7 +105,7 @@ namespace Test.UI.Components.Pages #region Private Methods - private async void CalcDonePipe_EA_NewMessage(object? sender, EventArgs e) + private async void PipeSvg_EA_NewMessage(object? sender, EventArgs e) { // aggiorno visualizzazione PubSubEventArgs currArgs = (PubSubEventArgs)e; diff --git a/Test.UI/Components/Pages/TestComponentJWD.razor.cs b/Test.UI/Components/Pages/TestComponentJWD.razor.cs index 6e8cd90..38f9c50 100644 --- a/Test.UI/Components/Pages/TestComponentJWD.razor.cs +++ b/Test.UI/Components/Pages/TestComponentJWD.razor.cs @@ -25,7 +25,7 @@ namespace Test.UI.Components.Pages public void Dispose() { - DLService.CalcDonePipe.EA_NewMessage -= CalcDonePipe_EA_NewMessage; + DLService.PipeSvg.EA_NewMessage -= PipeSvg_EA_NewMessage; } #endregion Public Methods @@ -98,7 +98,7 @@ namespace Test.UI.Components.Pages //SelGlass = "4T/16/4T"; InitialJwd = File.ReadAllText("Data\\FinDueAnteBottomFisso.jwd"); currJwd = InitialJwd; - DLService.CalcDonePipe.EA_NewMessage += CalcDonePipe_EA_NewMessage; + DLService.PipeSvg.EA_NewMessage += PipeSvg_EA_NewMessage; await ReloadData(); } @@ -125,7 +125,7 @@ namespace Test.UI.Components.Pages #region Private Methods - private async void CalcDonePipe_EA_NewMessage(object? sender, EventArgs e) + private async void PipeSvg_EA_NewMessage(object? sender, EventArgs e) { // aggiorno visualizzazione PubSubEventArgs currArgs = (PubSubEventArgs)e; diff --git a/Test.UI/Components/Pages/TestComponentTemplate.razor.cs b/Test.UI/Components/Pages/TestComponentTemplate.razor.cs index faeb0d8..efb1b5d 100644 --- a/Test.UI/Components/Pages/TestComponentTemplate.razor.cs +++ b/Test.UI/Components/Pages/TestComponentTemplate.razor.cs @@ -25,7 +25,7 @@ namespace Test.UI.Components.Pages public void Dispose() { - DLService.CalcDonePipe.EA_NewMessage -= CalcDonePipe_EA_NewMessage; + DLService.PipeSvg.EA_NewMessage -= PipeSvg_EA_NewMessage; } #endregion Public Methods @@ -96,7 +96,7 @@ namespace Test.UI.Components.Pages SelColorMaterial = "Black"; SelMaterial = "Pine"; SelGlass = "4T/16/4T"; - DLService.CalcDonePipe.EA_NewMessage += CalcDonePipe_EA_NewMessage; + DLService.PipeSvg.EA_NewMessage += PipeSvg_EA_NewMessage; await ReloadData(); } @@ -123,7 +123,7 @@ namespace Test.UI.Components.Pages #region Private Methods - private async void CalcDonePipe_EA_NewMessage(object? sender, EventArgs e) + private async void PipeSvg_EA_NewMessage(object? sender, EventArgs e) { // aggiorno visualizzazione PubSubEventArgs currArgs = (PubSubEventArgs)e; diff --git a/Test.UI/Test.UI.csproj b/Test.UI/Test.UI.csproj index 7368494..4fc0374 100644 --- a/Test.UI/Test.UI.csproj +++ b/Test.UI/Test.UI.csproj @@ -34,8 +34,8 @@ - - + + diff --git a/Test.UI/appsettings.json b/Test.UI/appsettings.json index e0a0df8..b1e6c3b 100644 --- a/Test.UI/appsettings.json +++ b/Test.UI/appsettings.json @@ -10,20 +10,21 @@ "Redis": "redis.ufficio:26379, serviceName=devel, DefaultDatabase=6, keepAlive=180, connectTimeout=15000, syncTimeout=15000, asyncTimeout=15000, abortConnect=false, ssl=false, allowAdmin=true" }, "ServerConf": { - "PubChannel": "EgwEngineInput", - "SubChannel": "EgwEngineOutput", - "SvgChannel": "Egw:svg:img", - "ShapeChannel": "Egw:shape:curr", + "BomChannel": "Egw:bom", + "HwListChannel": "Egw:hw:list", "HwOptChannel": "Egw:hw:opt", "ProfListChannel": "Egw:prof:list", - "BomChannel": "Egw:bom", + "PubChannel": "EgwEngineInput", + "ShapeChannel": "Egw:shape:curr", + "SubChannel": "EgwEngineOutput", + "SvgChannel": "Egw:svg:img", "UpdateChannel": "Egw:update", "Prog.ApiUrl": "https://office.egalware.com/lux/srv/api", "ImageBaseUrl": "window", "GenericBaseUrl": "generic", - "ImageLiveTag": "svg", - "ImageFileTag": "svgfile", "ImageCalcTag": "svg-preview", + "ImageFileTag": "svgfile", + "ImageLiveTag": "svg", "CalcTag": "calc" } } diff --git a/WebWindowComplex/Json/JsonUtility.cs b/WebWindowComplex/Json/JsonUtility.cs index c60fe9b..8a67060 100644 --- a/WebWindowComplex/Json/JsonUtility.cs +++ b/WebWindowComplex/Json/JsonUtility.cs @@ -399,7 +399,7 @@ namespace WebWindowComplex.Json foreach (var Joint in m_JointList) newSash.JointList.Add(Joint.Deserialize((Area)ParentArea)); newSash.SetSelFamilyHardwareFromIndex(Hardware); - newSash.RefreshHardwareList(); + newSash.ReqRefreshShape(); newSash.SetSelHardwareFromId(Hardware); foreach (var Area in AreaList) { diff --git a/WebWindowComplex/Models/Area.cs b/WebWindowComplex/Models/Area.cs index 8cac943..2d5de4e 100644 --- a/WebWindowComplex/Models/Area.cs +++ b/WebWindowComplex/Models/Area.cs @@ -47,16 +47,16 @@ namespace WebWindowComplex.Models } } - public int IdGroup + public int GroupId { get { - return m_IdGroup; + return m_GroupId; } set { - m_IdGroup = value; + m_GroupId = value; } } @@ -115,7 +115,7 @@ namespace WebWindowComplex.Models { // seleziono la famiglia del primo hw trovato... SashArea.SelFamilyHardware = listHwValid.FamilyName; - SashArea.RefreshHardwareList(); + SashArea.ReqRefreshShape(); if (SashArea.HardwareList.Count == 0) { SashArea.Remove(); @@ -196,7 +196,7 @@ namespace WebWindowComplex.Models public void SetIdGroup(int nIdGroup) { - m_IdGroup = nIdGroup; + m_GroupId = nIdGroup; } public void SwapAree() @@ -243,7 +243,7 @@ namespace WebWindowComplex.Models private List m_AreaList = new List(); private AreaTypes m_AreaType; - private int m_IdGroup; + private int m_GroupId; private Area m_ParentArea; #endregion Private Fields diff --git a/WebWindowComplex/Models/Fill.cs b/WebWindowComplex/Models/Fill.cs index 5fe8ee1..be23281 100644 --- a/WebWindowComplex/Models/Fill.cs +++ b/WebWindowComplex/Models/Fill.cs @@ -86,9 +86,9 @@ namespace WebWindowComplex.Models internal override JsonArea Serialize() { - if (nCounterGroup < IdGroup) - Area.nCounterGroup = IdGroup; - JsonFill JsonFill = new JsonFill(FillType, IdGroup); + if (nCounterGroup < GroupId) + Area.nCounterGroup = GroupId; + JsonFill JsonFill = new JsonFill(FillType, GroupId); foreach (var Area in AreaList) JsonFill.AreaList.Add(Area.Serialize()); return JsonFill; diff --git a/WebWindowComplex/Models/Frame.cs b/WebWindowComplex/Models/Frame.cs index c83b55c..7434d54 100644 --- a/WebWindowComplex/Models/Frame.cs +++ b/WebWindowComplex/Models/Frame.cs @@ -240,9 +240,9 @@ namespace WebWindowComplex.Models internal override JsonArea Serialize() { Area.nCounterGroup = 0; - if (nCounterGroup < IdGroup) - Area.nCounterGroup = IdGroup; - JsonFrame JsonFrame = new JsonFrame(m_Shape, m_bBottomRail, m_nBottomRailQty, IdGroup); + if (nCounterGroup < GroupId) + Area.nCounterGroup = GroupId; + JsonFrame JsonFrame = new JsonFrame(m_Shape, m_bBottomRail, m_nBottomRailQty, GroupId); foreach (var Dimension in DimensionList) JsonFrame.DimensionList.Add(Dimension.Serialize()); foreach (var Joint in JointList) diff --git a/WebWindowComplex/Models/OnReqShapeEventArgs.cs b/WebWindowComplex/Models/OnReqShapeEventArgs.cs new file mode 100644 index 0000000..a90de9a --- /dev/null +++ b/WebWindowComplex/Models/OnReqShapeEventArgs.cs @@ -0,0 +1,28 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace WebWindowComplex.Models +{ + public class OnReqShapeEventArgs : EventArgs + { + #region Public Fields + + public string sJwd; + public int groupId; + + #endregion Public Fields + + #region Public Constructors + + public OnReqShapeEventArgs(string sJwd, int nGroupId) + { + this.sJwd = sJwd; + this.groupId = nGroupId; + } + + #endregion Public Constructors + } +} \ No newline at end of file diff --git a/WebWindowComplex/Models/Sash.cs b/WebWindowComplex/Models/Sash.cs index 67c8924..219bb2c 100644 --- a/WebWindowComplex/Models/Sash.cs +++ b/WebWindowComplex/Models/Sash.cs @@ -11,6 +11,19 @@ namespace WebWindowComplex.Models { public class Sash : Area { + + public event EventHandler OnReqShape = delegate { }; + + internal void OnReqShapePreview(string sJwd, int groupId) + { + OnReqShapeEventArgs e = new OnReqShapeEventArgs(sJwd, groupId); + EventHandler handler = OnReqShape; + if (handler != null) + { + handler(this, e); + } + } + #region Public Fields // Lista hardware completa passata dal chiamante del componente @@ -211,7 +224,7 @@ namespace WebWindowComplex.Models } } } - RefreshHardwareList(); + ReqRefreshShape(); RefreshHardwareOptionList(); SetFirstHardware(); m_ParentWindow.OnUpdatePreview(m_ParentWindow.sSerialized()); @@ -304,7 +317,7 @@ namespace WebWindowComplex.Models set { m_SelFamilyHardware = value; - RefreshHardwareList(); + ReqRefreshShape(); RefreshHardwareOptionList(); SetFirstHardware(); m_ParentWindow.OnUpdatePreview(m_ParentWindow.sSerialized()); @@ -454,7 +467,7 @@ namespace WebWindowComplex.Models newSash.SetOrientationSashType(OrientationSashType); newSash.SetSashBottomRailQty(SashBottomRailQty); newSash.SetSelFamilyHardwareFromIndex(SelHardware.Id); - newSash.RefreshHardwareList(); + newSash.ReqRefreshShape(); newSash.RefreshHardwareOptionList(); newSash.SetSelHardware(SelHardware); for (int i = 0; i < SashList.Count; i++) @@ -477,17 +490,45 @@ namespace WebWindowComplex.Models return newSash; } + /// + /// Richiesta calcolo shape corrente + /// + public void ReqRefreshShape() + { + if (m_HardwareCompleteList != null && m_HardwareCompleteList.Count > 0) + { + m_HardwareList.Clear(); + // reset shape corrente + m_CurrShape = ""; + + // chiamata evento calcolo shape: gruppo da calcolare + OnReqShapePreview(m_ParentWindow.sSerialized(), GroupId); + } + } + + /// + /// Agfgiornamento HW List conseguente a ricezione nuiova Shape + /// + /// + public void UpdateShape(string newShape) + { + m_CurrShape = newShape; + RefreshHardwareList(); + } + + /// + /// Update valori ammissibili x HW list + /// public void RefreshHardwareList() { if (m_HardwareCompleteList != null && m_HardwareCompleteList.Count > 0) { m_HardwareList.Clear(); - string sSashShape = FindSashShape(); Enums.OpeningTypes sOpeningType = ConvertOpeningType(); var iComp = StringComparison.InvariantCultureIgnoreCase; var rawList = m_HardwareCompleteList .Where(x => x.Id == "000000" || - (!string.IsNullOrEmpty(m_SelFamilyHardware) && x.FamilyName.Equals(m_SelFamilyHardware, iComp) && x.SashQty == nSashQty && x.Shape.Equals(sSashShape, iComp) && x.OpeningType == sOpeningType) + (!string.IsNullOrEmpty(m_SelFamilyHardware) && x.FamilyName.Equals(m_SelFamilyHardware, iComp) && x.SashQty == nSashQty && x.Shape.Equals(m_CurrShape, iComp) && x.OpeningType == sOpeningType) ) .ToList(); if (rawList != null && rawList.Count > 0) @@ -501,6 +542,7 @@ namespace WebWindowComplex.Models } } + public void Remove() { ParentArea.AreaList.Remove(this); @@ -528,7 +570,7 @@ namespace WebWindowComplex.Models newSash.SetSashBottomRail(false); newSash.SetSashBottomRailQty(0); newSash.SelFamilyHardware = Sash.s_FamilyHardwareList.First(); - newSash.RefreshHardwareList(); + newSash.ReqRefreshShape(); newSash.RefreshHardwareOptionList(); newSash.SetFirstHardware(); return newSash; @@ -621,9 +663,9 @@ namespace WebWindowComplex.Models internal override JsonArea Serialize() { - if (nCounterGroup < IdGroup) - Area.nCounterGroup = IdGroup; - JsonSash JsonSash = new JsonSash(m_bIsSashVertical, m_SashType, m_bSashBottomRail, m_nSashBottomRailQty, m_SelHardware.Id, IdGroup); + if (nCounterGroup < GroupId) + Area.nCounterGroup = GroupId; + JsonSash JsonSash = new JsonSash(m_bIsSashVertical, m_SashType, m_bSashBottomRail, m_nSashBottomRailQty, m_SelHardware.Id, GroupId); foreach (var SashDimension in SashList) JsonSash.SashList.Add(SashDimension.Serialize()); foreach (var Joint in JointList) @@ -766,6 +808,7 @@ namespace WebWindowComplex.Models private List m_SashList = new List(); private SashTypes m_SashType; private string m_SelFamilyHardware; + private string m_CurrShape = ""; private Hardware m_SelHardware; private OrientationSash m_SelOrientationSashType; diff --git a/WebWindowComplex/Models/SashDimension.cs b/WebWindowComplex/Models/SashDimension.cs index cde5c8c..3fbd106 100644 --- a/WebWindowComplex/Models/SashDimension.cs +++ b/WebWindowComplex/Models/SashDimension.cs @@ -229,7 +229,7 @@ namespace WebWindowComplex.Models set { m_SelOpeningType = value; - m_Parent.RefreshHardwareList(); + m_Parent.ReqRefreshShape(); m_Parent.RefreshHardwareOptionList(); m_Parent.SetFirstHardware(); } @@ -244,7 +244,7 @@ namespace WebWindowComplex.Models set { m_SelOpeningType = (Openings)IdNameStruct.IdFromInd(value, m_OpeningTypeList); - m_Parent.RefreshHardwareList(); + m_Parent.ReqRefreshShape(); m_Parent.RefreshHardwareOptionList(); m_Parent.SetFirstHardware(); m_Parent.ParentWindow.OnUpdatePreview(m_Parent.ParentWindow.sSerialized()); diff --git a/WebWindowComplex/Models/Split.cs b/WebWindowComplex/Models/Split.cs index 8481927..9a4f779 100644 --- a/WebWindowComplex/Models/Split.cs +++ b/WebWindowComplex/Models/Split.cs @@ -371,9 +371,9 @@ namespace WebWindowComplex.Models internal override JsonArea Serialize() { - if (nCounterGroup < IdGroup) - Area.nCounterGroup = IdGroup; - JsonSplit JsonSplit = new JsonSplit(m_SelSplitShape, IdGroup); + if (nCounterGroup < GroupId) + Area.nCounterGroup = GroupId; + JsonSplit JsonSplit = new JsonSplit(m_SelSplitShape, GroupId); //foreach (var SplitPosition in m_SplitPositionList) // JsonSplit.SplitPositionList.Add(SplitPosition.Serialize()); JsonSplit.SplitStartVert = bSplitStartVert; diff --git a/WebWindowComplex/Models/Splitted.cs b/WebWindowComplex/Models/Splitted.cs index 17ba514..8549716 100644 --- a/WebWindowComplex/Models/Splitted.cs +++ b/WebWindowComplex/Models/Splitted.cs @@ -44,9 +44,9 @@ namespace WebWindowComplex.Models internal override JsonArea Serialize() { - if (nCounterGroup < IdGroup) - Area.nCounterGroup = IdGroup; - JsonSplitted JsonSplitted = new JsonSplitted(IdGroup); + if (nCounterGroup < GroupId) + Area.nCounterGroup = GroupId; + JsonSplitted JsonSplitted = new JsonSplitted(GroupId); foreach (var Area in AreaList) JsonSplitted.AreaList.Add(Area.Serialize()); return JsonSplitted; diff --git a/WebWindowComplex/TableComp.razor.cs b/WebWindowComplex/TableComp.razor.cs index 768d747..2494eea 100644 --- a/WebWindowComplex/TableComp.razor.cs +++ b/WebWindowComplex/TableComp.razor.cs @@ -482,8 +482,9 @@ namespace WebWindowComplex /// /// Richiesta Shape compatibile da JWD /// + /// ID numerico del gruppo da valutare /// - protected async Task DoReqShape() + protected async Task DoReqShape(int groupId) { if (m_CurrWindow != null) { @@ -500,6 +501,7 @@ namespace WebWindowComplex Args.Add("Mode", $"{(int)Enums.QuestionModes.HARDWARE}"); Args.Add("SubMode", $"{(int)Enums.QuestionHwSubModes.SASHSHAPE}"); Args.Add("Jwd", CurrJwd); + Args.Add("GroupId", $"{groupId}"); await EC_DoUpdate.InvokeAsync(Args); } } @@ -1183,7 +1185,7 @@ namespace WebWindowComplex /// private async Task UpdateSash(Sash newSash) { - SearchSash(m_Frame, newSash.IdGroup, newSash); + SearchSash(m_Frame, newSash.GroupId, newSash); await DoPreviewSvg(); } @@ -1197,6 +1199,19 @@ namespace WebWindowComplex await DoReqOptHardware(); } + + /// + /// Aggiornamento shape dato GroupId + /// + /// nuova sash + /// + private async Task UpdateShape(int groupId) + { + await DoReqShape(groupId); + } + + + /// /// Cerca e aggiorna la sash /// @@ -1206,7 +1221,7 @@ namespace WebWindowComplex /// public Area SearchSash(Area currentArea, int idSearch, Sash newSash) { - if (currentArea.IdGroup == idSearch && currentArea.AreaType.Equals(AreaTypes.SASH)) + if (currentArea.GroupId == idSearch && currentArea.AreaType.Equals(AreaTypes.SASH)) { currentArea = newSash; return currentArea; diff --git a/WebWindowComplex/WebWindowComplex.csproj b/WebWindowComplex/WebWindowComplex.csproj index 6d3232c..1ec8c7d 100644 --- a/WebWindowComplex/WebWindowComplex.csproj +++ b/WebWindowComplex/WebWindowComplex.csproj @@ -6,7 +6,7 @@ net8.0 enable enable - 2.7.10.2118 + 2.7.10.2212 Annamaria Sassi Egalware Componente gestione Configurazioni avanzate Window per LUX @@ -41,3 +41,7 @@ + + + + diff --git a/WebWindowConfigurator/WebWindowConfigurator.csproj b/WebWindowConfigurator/WebWindowConfigurator.csproj index 60b6d3f..f28acee 100644 --- a/WebWindowConfigurator/WebWindowConfigurator.csproj +++ b/WebWindowConfigurator/WebWindowConfigurator.csproj @@ -6,7 +6,7 @@ net8.0 enable enable - 2.7.10.2118 + 2.7.10.2212 Annamaria Sassi Egalware Componente gestione JWD per LUX @@ -115,6 +115,10 @@ + + + + From fad95d22b6784d1982c9181cbe6ce7bd10679d64 Mon Sep 17 00:00:00 2001 From: Annamaria Sassi Date: Wed, 22 Oct 2025 16:48:04 +0200 Subject: [PATCH 03/26] Correzioni --- WebWindowComplex/Compo/AreaSplit.razor | 2 +- WebWindowComplex/Compo/AreaSplit.razor.cs | 26 ++++++++++++ WebWindowComplex/Compo/CardFill.razor | 7 +++- WebWindowComplex/Compo/CardFill.razor.cs | 16 ++++++++ WebWindowComplex/Compo/CardSashGroup.razor | 40 ++++++++++++------- WebWindowComplex/Models/Area.cs | 3 +- WebWindowComplex/Models/Fill.cs | 6 ++- WebWindowComplex/Models/Sash.cs | 18 ++++++--- WebWindowComplex/Models/Split.cs | 2 +- WebWindowComplex/TableComp.razor | 22 +++++++++- WebWindowComplex/TableComp.razor.cs | 16 +++++++- WebWindowComplex/WebWindowComplex.csproj | 14 ++++++- .../WebWindowConfigurator.csproj | 23 ++++++++++- 13 files changed, 164 insertions(+), 31 deletions(-) diff --git a/WebWindowComplex/Compo/AreaSplit.razor b/WebWindowComplex/Compo/AreaSplit.razor index dcd0424..4b2664d 100644 --- a/WebWindowComplex/Compo/AreaSplit.razor +++ b/WebWindowComplex/Compo/AreaSplit.razor @@ -6,7 +6,7 @@
- +
diff --git a/WebWindowComplex/Compo/AreaSplit.razor.cs b/WebWindowComplex/Compo/AreaSplit.razor.cs index c7c87b4..61e8cac 100644 --- a/WebWindowComplex/Compo/AreaSplit.razor.cs +++ b/WebWindowComplex/Compo/AreaSplit.razor.cs @@ -32,6 +32,12 @@ namespace WebWindowComplex.Compo [Parameter] public EventCallback EC_CopySash { get; set; } + /// + /// Evento per aggiungere Sash + /// + [Parameter] + public EventCallback EC_AddSash { get; set; } + #endregion Public Properties #region Private Methods @@ -50,6 +56,18 @@ namespace WebWindowComplex.Compo await EC_CopySash.InvokeAsync(Args); } + /// + /// Sollevo evento richiesta copia sash + /// + /// + private async Task RaiseAddSash(Splitted item) + { + var Args = new DataAreaSplitted + { + splitted = item + }; + await EC_AddSash.InvokeAsync(Args); + } #endregion Private Methods } @@ -62,4 +80,12 @@ namespace WebWindowComplex.Compo public Splitted splitted { get; set; } public int index { get; set; } } + + /// + /// Classe per raggruppare oggetti che servono per aggiungere Sash + /// + public class DataAreaSplitted + { + public Splitted splitted { get; set; } + } } \ No newline at end of file diff --git a/WebWindowComplex/Compo/CardFill.razor b/WebWindowComplex/Compo/CardFill.razor index f09bdec..5d40cd8 100644 --- a/WebWindowComplex/Compo/CardFill.razor +++ b/WebWindowComplex/Compo/CardFill.razor @@ -47,7 +47,12 @@ { @if (currSplitted.AreaList.First().Equals(CurrItem)) { - + + } } diff --git a/WebWindowComplex/Compo/CardFill.razor.cs b/WebWindowComplex/Compo/CardFill.razor.cs index 36e4f4f..1ec78ca 100644 --- a/WebWindowComplex/Compo/CardFill.razor.cs +++ b/WebWindowComplex/Compo/CardFill.razor.cs @@ -38,6 +38,12 @@ namespace WebWindowComplex.Compo [Parameter] public EventCallback EC_CopySash { get; set; } + /// + /// Evento per aggiungere sash + /// + [Parameter] + public EventCallback EC_AddSash { get; set; } + /// /// Evento per tornare nella pagine Tree /// @@ -97,6 +103,16 @@ namespace WebWindowComplex.Compo await EC_CopySash.InvokeAsync(Args); } + /// + /// Sollevo evento per aggiungere sash + /// + /// + /// + protected async Task AddSash(DataAreaSplitted Args) + { + await EC_AddSash.InvokeAsync(Args); + } + #endregion Protected Methods #region Private Methods diff --git a/WebWindowComplex/Compo/CardSashGroup.razor b/WebWindowComplex/Compo/CardSashGroup.razor index 82a0e57..21edcb5 100644 --- a/WebWindowComplex/Compo/CardSashGroup.razor +++ b/WebWindowComplex/Compo/CardSashGroup.razor @@ -92,22 +92,34 @@ }
-
- - + + +
+ } + else + { +
+ + -
+ else + { + @foreach (var hlItem in CurrItem.HardwareList) + { + + } + } + + + } diff --git a/WebWindowComplex/Models/Area.cs b/WebWindowComplex/Models/Area.cs index 2d5de4e..006f067 100644 --- a/WebWindowComplex/Models/Area.cs +++ b/WebWindowComplex/Models/Area.cs @@ -114,11 +114,10 @@ namespace WebWindowComplex.Models if (listHwValid != null) { // seleziono la famiglia del primo hw trovato... - SashArea.SelFamilyHardware = listHwValid.FamilyName; + SashArea.SetSelFamilyHardware(listHwValid.FamilyName); SashArea.ReqRefreshShape(); if (SashArea.HardwareList.Count == 0) { - SashArea.Remove(); answ = true; } else diff --git a/WebWindowComplex/Models/Fill.cs b/WebWindowComplex/Models/Fill.cs index be23281..49d4def 100644 --- a/WebWindowComplex/Models/Fill.cs +++ b/WebWindowComplex/Models/Fill.cs @@ -94,10 +94,14 @@ namespace WebWindowComplex.Models return JsonFill; } + internal void SetSelFillType(FillTypes value) + { + m_SelFillType = value; + //m_ParentWindow.OnUpdatePreview(m_ParentWindow.sSerialized()); + } internal void SetFillType(FillTypes value) { m_SelFillType = value; - m_ParentWindow.OnUpdatePreview(m_ParentWindow.sSerialized()); } #endregion Internal Methods diff --git a/WebWindowComplex/Models/Sash.cs b/WebWindowComplex/Models/Sash.cs index 219bb2c..4d4a4fb 100644 --- a/WebWindowComplex/Models/Sash.cs +++ b/WebWindowComplex/Models/Sash.cs @@ -44,6 +44,10 @@ namespace WebWindowComplex.Models #region Public Properties + public string sSashShape + { + get => m_CurrShape; + } public bool bIsMeasureGlass { get @@ -316,10 +320,7 @@ namespace WebWindowComplex.Models } set { - m_SelFamilyHardware = value; - ReqRefreshShape(); - RefreshHardwareOptionList(); - SetFirstHardware(); + SetSelFamilyHardware(value); m_ParentWindow.OnUpdatePreview(m_ParentWindow.sSerialized()); } } @@ -569,7 +570,7 @@ namespace WebWindowComplex.Models newSash.JointList.Add(new Joint(newSash, JointIndex + 1, Joints.FULL_H)); newSash.SetSashBottomRail(false); newSash.SetSashBottomRailQty(0); - newSash.SelFamilyHardware = Sash.s_FamilyHardwareList.First(); + newSash.SetSelFamilyHardware(Sash.s_FamilyHardwareList.First()); newSash.ReqRefreshShape(); newSash.RefreshHardwareOptionList(); newSash.SetFirstHardware(); @@ -750,6 +751,13 @@ namespace WebWindowComplex.Models m_SashType = SashType; } + public void SetSelFamilyHardware(string sFamilyHw) + { + m_SelFamilyHardware = sFamilyHw; + ReqRefreshShape(); + RefreshHardwareOptionList(); + SetFirstHardware(); + } internal string SetSelFamilyHardwareFromIndex(string codHardware) { if (string.IsNullOrEmpty(m_SelFamilyHardware)) diff --git a/WebWindowComplex/Models/Split.cs b/WebWindowComplex/Models/Split.cs index 9a4f779..dd96fde 100644 --- a/WebWindowComplex/Models/Split.cs +++ b/WebWindowComplex/Models/Split.cs @@ -445,7 +445,7 @@ namespace WebWindowComplex.Models internal void SetSplitStartVert(bool SplitStartVert) { - bSplitStartVert = SplitStartVert; + m_bSplitStartVert = SplitStartVert; } #endregion Internal Methods diff --git a/WebWindowComplex/TableComp.razor b/WebWindowComplex/TableComp.razor index 1689d5c..659575c 100644 --- a/WebWindowComplex/TableComp.razor +++ b/WebWindowComplex/TableComp.razor @@ -166,12 +166,30 @@ } else { - + + } } else if (currStep == CompileStep.General) { - + + } diff --git a/WebWindowComplex/TableComp.razor.cs b/WebWindowComplex/TableComp.razor.cs index 2494eea..46d20f0 100644 --- a/WebWindowComplex/TableComp.razor.cs +++ b/WebWindowComplex/TableComp.razor.cs @@ -831,7 +831,7 @@ namespace WebWindowComplex { foreach (Fill currFill in FillList) { - currFill.SetFillType(type); + currFill.SetSelFillType(type); } await DoPreviewSvg(); } @@ -871,7 +871,7 @@ namespace WebWindowComplex private async Task ChangeOneFill(FillTypes type) { Fill fillChange = FillList.ElementAt(currFill); - fillChange.SetFillType(type); + fillChange.SetSelFillType(type); await DoPreviewSvg(); } @@ -961,6 +961,18 @@ namespace WebWindowComplex await DoPreviewSvg(); } + /// + /// Metodo per aggiungere una Sash + /// + /// + /// + private async Task AddSash(DataAreaSplitted Args) + { + Splitted currSplitted = Args.splitted; + bError = currSplitted.AddFirstSash(); + await DoPreviewSvg(); + } + /// /// Metodo per copiare una Sash intera /// diff --git a/WebWindowComplex/WebWindowComplex.csproj b/WebWindowComplex/WebWindowComplex.csproj index 1ec8c7d..03f83b0 100644 --- a/WebWindowComplex/WebWindowComplex.csproj +++ b/WebWindowComplex/WebWindowComplex.csproj @@ -6,7 +6,7 @@ net8.0 enable enable - 2.7.10.2212 + 2.7.10.2216 Annamaria Sassi Egalware Componente gestione Configurazioni avanzate Window per LUX @@ -37,6 +37,18 @@ + + + + + + + + + + + + diff --git a/WebWindowConfigurator/WebWindowConfigurator.csproj b/WebWindowConfigurator/WebWindowConfigurator.csproj index f28acee..97cee3d 100644 --- a/WebWindowConfigurator/WebWindowConfigurator.csproj +++ b/WebWindowConfigurator/WebWindowConfigurator.csproj @@ -6,7 +6,7 @@ net8.0 enable enable - 2.7.10.2212 + 2.7.10.2216 Annamaria Sassi Egalware Componente gestione JWD per LUX @@ -104,6 +104,27 @@ + + + + + + + + + + + + + + + + + + + + + From aa956217ebf8bc8109fd5694d353f3915ada61c7 Mon Sep 17 00:00:00 2001 From: Annamaria Sassi Date: Wed, 22 Oct 2025 17:00:44 +0200 Subject: [PATCH 04/26] Aggiornato nome IdGroup in GroupId --- Test.UI/Data/AntaDoppia.jwd | 12 +++--- Test.UI/Data/AntaSingola.jwd | 6 +-- Test.UI/Data/FinDueAnteBottomFisso.jwd | 20 +++++----- Test.UI/Data/FinestraDueAnteSeparate.jwd | 16 ++++---- Test.UI/Data/FinestraSplitGrid.jwd | 28 +++++++------- Test.UI/Data/FinestraSplitVert.jwd | 12 +++--- WebWindowComplex/Json/JsonUtility.cs | 38 +++++++++---------- WebWindowComplex/Models/Area.cs | 4 +- WebWindowComplex/Models/Fill.cs | 4 +- WebWindowComplex/Models/Sash.cs | 4 +- WebWindowComplex/Models/Split.cs | 4 +- WebWindowComplex/Models/Splitted.cs | 4 +- WebWindowComplex/WebWindowComplex.csproj | 2 + .../WebWindowConfigurator.csproj | 2 + 14 files changed, 80 insertions(+), 76 deletions(-) diff --git a/Test.UI/Data/AntaDoppia.jwd b/Test.UI/Data/AntaDoppia.jwd index daa1816..b81a6b1 100644 --- a/Test.UI/Data/AntaDoppia.jwd +++ b/Test.UI/Data/AntaDoppia.jwd @@ -38,7 +38,7 @@ ], "BottomRail": false, "BottomRailQty": 0, - "IdGroup": 1, + "GroupId": 1, "AreaList": [ { "bIsSashVertical": true, @@ -76,13 +76,13 @@ } ], "Hardware": "000631", - "IdGroup": 2, + "GroupId": 2, "AreaList": [ { - "IdGroup": 3, + "GroupId": 3, "AreaList": [ { - "IdGroup": 4, + "GroupId": 4, "FillType": "GLASS", "AreaList": [], "AreaType": "FILL" @@ -91,11 +91,11 @@ "AreaType": "SPLITTED" }, { - "IdGroup": 5, + "GroupId": 5, "AreaList": [ { "FillType": "GLASS", - "IdGroup": 6, + "GroupId": 6, "AreaList": [], "AreaType": "FILL" } diff --git a/Test.UI/Data/AntaSingola.jwd b/Test.UI/Data/AntaSingola.jwd index 60f3330..6252894 100644 --- a/Test.UI/Data/AntaSingola.jwd +++ b/Test.UI/Data/AntaSingola.jwd @@ -38,7 +38,7 @@ ], "BottomRail": false, "BottomRailQty": 0, - "IdGroup": 1, + "GroupId": 1, "AreaList": [ { "bIsSashVertical": true, @@ -70,11 +70,11 @@ } ], "Hardware": "000635", - "IdGroup": 2, + "GroupId": 2, "AreaList": [ { "FillType": "GLASS", - "IdGroup": 3, + "GroupId": 3, "AreaList": [], "AreaType": "FILL" } diff --git a/Test.UI/Data/FinDueAnteBottomFisso.jwd b/Test.UI/Data/FinDueAnteBottomFisso.jwd index f36e5e4..2131e76 100644 --- a/Test.UI/Data/FinDueAnteBottomFisso.jwd +++ b/Test.UI/Data/FinDueAnteBottomFisso.jwd @@ -38,7 +38,7 @@ ], "BottomRail": false, "BottomRailQty": 0, - "IdGroup": 1, + "GroupId": 1, "AreaList": [ { "SplitShape": "HORIZONTAL", @@ -54,14 +54,14 @@ "dDimension": 60.0 } ], - "IdGroup": 2, + "GroupId": 2, "AreaList": [ { - "IdGroup": 3, + "GroupId": 3, "AreaList": [ { "FillType": "GLASS", - "IdGroup": 4, + "GroupId": 4, "AreaList": [], "AreaType": "FILL" } @@ -69,7 +69,7 @@ "AreaType": "SPLITTED" }, { - "IdGroup": 5, + "GroupId": 5, "AreaList": [ { "bIsSashVertical": true, @@ -107,14 +107,14 @@ } ], "Hardware": "000631", - "IdGroup": 6, + "GroupId": 6, "AreaList": [ { - "IdGroup": 7, + "GroupId": 7, "AreaList": [ { "FillType": "GLASS", - "IdGroup": 8, + "GroupId": 8, "AreaList": [], "AreaType": "FILL" } @@ -122,11 +122,11 @@ "AreaType": "SPLITTED" }, { - "IdGroup": 9, + "GroupId": 9, "AreaList": [ { "FillType": "GLASS", - "IdGroup": 10, + "GroupId": 10, "AreaList": [], "AreaType": "FILL" } diff --git a/Test.UI/Data/FinestraDueAnteSeparate.jwd b/Test.UI/Data/FinestraDueAnteSeparate.jwd index 5bedcb0..c8f8e3a 100644 --- a/Test.UI/Data/FinestraDueAnteSeparate.jwd +++ b/Test.UI/Data/FinestraDueAnteSeparate.jwd @@ -43,7 +43,7 @@ ], "BottomRail": false, "BottomRailQty": 0, - "IdGroup": 1, + "GroupId": 1, "AreaList": [ { "SplitShape": "VERTICAL", @@ -59,10 +59,10 @@ } ], "SplitHorizList": [], - "IdGroup": 2, + "GroupId": 2, "AreaList": [ { - "IdGroup": 3, + "GroupId": 3, "AreaList": [ { "bIsSashVertical": true, @@ -96,11 +96,11 @@ "BottomRail": false, "BottomRailQty": 0, "Hardware": "000000", - "IdGroup": 4, + "GroupId": 4, "AreaList": [ { "FillType": "GLASS", - "IdGroup": 5, + "GroupId": 5, "AreaList": [], "AreaType": "FILL" } @@ -111,7 +111,7 @@ "AreaType": "SPLITTED" }, { - "IdGroup": 6, + "GroupId": 6, "AreaList": [ { "bIsSashVertical": true, @@ -145,11 +145,11 @@ "BottomRail": false, "BottomRailQty": 0, "Hardware": "000000", - "IdGroup": 7, + "GroupId": 7, "AreaList": [ { "FillType": "GLASS", - "IdGroup": 8, + "GroupId": 8, "AreaList": [], "AreaType": "FILL" } diff --git a/Test.UI/Data/FinestraSplitGrid.jwd b/Test.UI/Data/FinestraSplitGrid.jwd index ba61d49..07d1781 100644 --- a/Test.UI/Data/FinestraSplitGrid.jwd +++ b/Test.UI/Data/FinestraSplitGrid.jwd @@ -38,7 +38,7 @@ ], "BottomRail": false, "BottomRailQty": 0, - "IdGroup": 1, + "GroupId": 1, "AreaList": [ { "SplitShape": "GRID", @@ -67,14 +67,14 @@ "dDimension": 30.0 } ], - "IdGroup": 2, + "GroupId": 2, "AreaList": [ { - "IdGroup": 3, + "GroupId": 3, "AreaList": [ { "FillType": "GLASS", - "IdGroup": 4, + "GroupId": 4, "AreaList": [], "AreaType": "FILL" } @@ -82,11 +82,11 @@ "AreaType": "SPLITTED" }, { - "IdGroup": 5, + "GroupId": 5, "AreaList": [ { "FillType": "GLASS", - "IdGroup": 6, + "GroupId": 6, "AreaList": [], "AreaType": "FILL" } @@ -94,11 +94,11 @@ "AreaType": "SPLITTED" }, { - "IdGroup": 7, + "GroupId": 7, "AreaList": [ { "FillType": "GLASS", - "IdGroup": 8, + "GroupId": 8, "AreaList": [], "AreaType": "FILL" } @@ -106,11 +106,11 @@ "AreaType": "SPLITTED" }, { - "IdGroup": 9, + "GroupId": 9, "AreaList": [ { "FillType": "GLASS", - "IdGroup": 10, + "GroupId": 10, "AreaList": [], "AreaType": "FILL" } @@ -118,11 +118,11 @@ "AreaType": "SPLITTED" }, { - "IdGroup": 11, + "GroupId": 11, "AreaList": [ { "FillType": "GLASS", - "IdGroup": 12, + "GroupId": 12, "AreaList": [], "AreaType": "FILL" } @@ -130,11 +130,11 @@ "AreaType": "SPLITTED" }, { - "IdGroup": 13, + "GroupId": 13, "AreaList": [ { "FillType": "GLASS", - "IdGroup": 14, + "GroupId": 14, "AreaList": [], "AreaType": "FILL" } diff --git a/Test.UI/Data/FinestraSplitVert.jwd b/Test.UI/Data/FinestraSplitVert.jwd index 2651f19..0290ae0 100644 --- a/Test.UI/Data/FinestraSplitVert.jwd +++ b/Test.UI/Data/FinestraSplitVert.jwd @@ -38,7 +38,7 @@ ], "BottomRail": false, "BottomRailQty": 0, - "IdGroup": 1, + "GroupId": 1, "AreaList": [ { "SplitShape": "VERTICAL", @@ -54,14 +54,14 @@ } ], "SplitHorizList": [], - "IdGroup": 2, + "GroupId": 2, "AreaList": [ { - "IdGroup": 3, + "GroupId": 3, "AreaList": [ { "FillType": "GLASS", - "IdGroup": 4, + "GroupId": 4, "AreaList": [], "AreaType": "FILL" } @@ -69,11 +69,11 @@ "AreaType": "SPLITTED" }, { - "IdGroup": 5, + "GroupId": 5, "AreaList": [ { "FillType": "GLASS", - "IdGroup": 6, + "GroupId": 6, "AreaList": [], "AreaType": "FILL" } diff --git a/WebWindowComplex/Json/JsonUtility.cs b/WebWindowComplex/Json/JsonUtility.cs index 8a67060..70cb19a 100644 --- a/WebWindowComplex/Json/JsonUtility.cs +++ b/WebWindowComplex/Json/JsonUtility.cs @@ -106,17 +106,17 @@ namespace WebWindowComplex.Json public class JsonArea { - private int m_nIdGroup; + private int m_nGroupId; [JsonProperty] - public int IdGroup + public int GroupId { get { - return m_nIdGroup; + return m_nGroupId; } set { - m_nIdGroup = value; + m_nGroupId = value; } } @@ -233,18 +233,18 @@ namespace WebWindowComplex.Json { } - public JsonFrame(Shapes Shape, bool BottomRail, int BottomRailQty, int nIdGroup) : base(AreaTypes.FRAME) + public JsonFrame(Shapes Shape, bool BottomRail, int BottomRailQty, int nGroupId) : base(AreaTypes.FRAME) { m_Shape = Shape; m_bBottomRail = BottomRail; m_nBottomRailQty = BottomRailQty; - IdGroup = nIdGroup; + GroupId = nGroupId; } internal override Area Deserialize(Area ParentArea, Window ParentWindow) { Frame newFrame = new Frame(null, ParentWindow); - newFrame.SetIdGroup(IdGroup); + newFrame.SetGroupId(GroupId); newFrame.SetAreaType(AreaTypes.FRAME); newFrame.SetSelShape(m_Shape); newFrame.SetBottomRail(m_bBottomRail); @@ -371,20 +371,20 @@ namespace WebWindowComplex.Json { } - public JsonSash(bool bIsSashVertical, SashTypes SashType, bool SashBottomRail, int SashBottomRailQty, string Hardware, int nIdGroup) : base(AreaTypes.SASH) + public JsonSash(bool bIsSashVertical, SashTypes SashType, bool SashBottomRail, int SashBottomRailQty, string Hardware, int nGroupId) : base(AreaTypes.SASH) { m_bIsSashVertical = bIsSashVertical; m_SashType = SashType; m_bBottomRail = SashBottomRail; m_nBottomRailQty = SashBottomRailQty; m_Hardware = Hardware; - IdGroup = nIdGroup; + GroupId = nGroupId; } internal override Area Deserialize(Area ParentArea, Window ParentWindow) { Sash newSash = new Sash(ParentArea, ParentWindow); - newSash.SetIdGroup(IdGroup); + newSash.SetGroupId(GroupId); newSash.SetAreaType(AreaTypes.SASH); newSash.SetSashQty(m_SashList.Count); newSash.SetIsSashVertical(m_bIsSashVertical); @@ -476,16 +476,16 @@ namespace WebWindowComplex.Json { } - public JsonSplit(SplitShapes SplitShape, int nIdGroup) : base(AreaTypes.SPLIT) + public JsonSplit(SplitShapes SplitShape, int nGroupId) : base(AreaTypes.SPLIT) { m_SplitShape = SplitShape; - IdGroup = nIdGroup; + GroupId = nGroupId; } internal override Area Deserialize(Area ParentArea, Window ParentWindow) { Split Split = new Split(ParentArea, ParentWindow); - Split.SetIdGroup(IdGroup); + Split.SetGroupId(GroupId); Split.SetAreaType(AreaTypes.SPLIT); Split.SetSplitShape(m_SplitShape, true); Split.SetSplitStartVert(m_SplitStartVert); @@ -530,15 +530,15 @@ namespace WebWindowComplex.Json public JsonSplitted() : base(AreaTypes.SPLITTED) { } - public JsonSplitted(int nIdGroup) : base(AreaTypes.SPLITTED) + public JsonSplitted(int nGroupId) : base(AreaTypes.SPLITTED) { - IdGroup = nIdGroup; + GroupId = nGroupId; } internal override Area Deserialize(Area ParentArea, Window ParentWindow) { Splitted newSplitted = new Splitted(ParentArea, ParentWindow); - newSplitted.SetIdGroup(IdGroup); + newSplitted.SetGroupId(GroupId); newSplitted.SetAreaType(AreaTypes.SPLITTED); //Split.AppliedDone(); foreach (var Area in AreaList) @@ -575,16 +575,16 @@ namespace WebWindowComplex.Json { } - public JsonFill(FillTypes FillType, int nIdGroup) : base(AreaTypes.FILL) + public JsonFill(FillTypes FillType, int nGroupId) : base(AreaTypes.FILL) { m_FillType = FillType; - IdGroup = nIdGroup; + GroupId = nGroupId; } internal override Area Deserialize(Area ParentArea, Window ParentWindow) { Fill Fill = new Fill(ParentArea, ParentWindow); - Fill.SetIdGroup(IdGroup); + Fill.SetGroupId(GroupId); Fill.SetAreaType(AreaTypes.FILL); Fill.SetFillType(m_FillType); //Fill.AppliedDone(); diff --git a/WebWindowComplex/Models/Area.cs b/WebWindowComplex/Models/Area.cs index 006f067..babf1b9 100644 --- a/WebWindowComplex/Models/Area.cs +++ b/WebWindowComplex/Models/Area.cs @@ -193,9 +193,9 @@ namespace WebWindowComplex.Models public abstract Area Copy(Area ParentArea); - public void SetIdGroup(int nIdGroup) + public void SetGroupId(int nGroupId) { - m_GroupId = nIdGroup; + m_GroupId = nGroupId; } public void SwapAree() diff --git a/WebWindowComplex/Models/Fill.cs b/WebWindowComplex/Models/Fill.cs index 49d4def..6126005 100644 --- a/WebWindowComplex/Models/Fill.cs +++ b/WebWindowComplex/Models/Fill.cs @@ -64,7 +64,7 @@ namespace WebWindowComplex.Models { Fill newFill = new Fill(newParentArea, m_ParentWindow); AddCounterGroup(); - newFill.SetIdGroup(nCounterGroup); + newFill.SetGroupId(nCounterGroup); newFill.SetFillType(SelFillType); newFill.SetAreaType(AreaType); return newFill; @@ -78,7 +78,7 @@ namespace WebWindowComplex.Models { Fill Fill = new Fill(AreaParent, AreaParent.ParentWindow); AddCounterGroup(); - Fill.SetIdGroup(nCounterGroup); + Fill.SetGroupId(nCounterGroup); Fill.SetAreaType(AreaTypes.FILL); Fill.SetFillType(FillType); return Fill; diff --git a/WebWindowComplex/Models/Sash.cs b/WebWindowComplex/Models/Sash.cs index 4d4a4fb..8919117 100644 --- a/WebWindowComplex/Models/Sash.cs +++ b/WebWindowComplex/Models/Sash.cs @@ -460,7 +460,7 @@ namespace WebWindowComplex.Models { Sash newSash = new Sash(newParentArea, m_ParentWindow); AddCounterGroup(); - newSash.SetIdGroup(nCounterGroup); + newSash.SetGroupId(nCounterGroup); newSash.SetAreaType(AreaType); // Imposta la quantità di ante e definisce SashDimension di ogni anta ai valori di default newSash.SetSashQty(nSashQty); @@ -561,7 +561,7 @@ namespace WebWindowComplex.Models { Sash newSash = new Sash(Area, Area.ParentWindow); AddCounterGroup(); - newSash.SetIdGroup(nCounterGroup); + newSash.SetGroupId(nCounterGroup); newSash.SetAreaType(AreaTypes.SASH); newSash.SetSashQty(1); newSash.SetOrientationSashType(OrientationSash.VERTICAL); diff --git a/WebWindowComplex/Models/Split.cs b/WebWindowComplex/Models/Split.cs index dd96fde..e845b3e 100644 --- a/WebWindowComplex/Models/Split.cs +++ b/WebWindowComplex/Models/Split.cs @@ -316,7 +316,7 @@ namespace WebWindowComplex.Models { Split newSplit = new Split(newParentArea, ParentWindow); AddCounterGroup(); - newSplit.SetIdGroup(nCounterGroup); + newSplit.SetGroupId(nCounterGroup); newSplit.SetSplitStartVert(bSplitStartVert); newSplit.SetSplitQtyVert(nSplitQtyVert); for (int i = 0; i < SplitVertList.Count; i++) @@ -363,7 +363,7 @@ namespace WebWindowComplex.Models { Split Split = new Split(Area, Area.ParentWindow); AddCounterGroup(); - Split.SetIdGroup(nCounterGroup); + Split.SetGroupId(nCounterGroup); Split.SetAreaType(AreaTypes.SPLIT); Split.SetSplitShape(SplitShape, true); return Split; diff --git a/WebWindowComplex/Models/Splitted.cs b/WebWindowComplex/Models/Splitted.cs index 8549716..012c38d 100644 --- a/WebWindowComplex/Models/Splitted.cs +++ b/WebWindowComplex/Models/Splitted.cs @@ -19,7 +19,7 @@ namespace WebWindowComplex.Models { Splitted newSplitted = new Splitted(newParentArea, ParentWindow); AddCounterGroup(); - newSplitted.SetIdGroup(nCounterGroup); + newSplitted.SetGroupId(nCounterGroup); newSplitted.SetAreaType(AreaType); foreach (var item in AreaList) { @@ -37,7 +37,7 @@ namespace WebWindowComplex.Models { Splitted Splitted = new Splitted(ParentArea, ParentArea.ParentWindow); AddCounterGroup(); - Splitted.SetIdGroup(nCounterGroup); + Splitted.SetGroupId(nCounterGroup); Splitted.SetAreaType(AreaTypes.SPLITTED); return Splitted; } diff --git a/WebWindowComplex/WebWindowComplex.csproj b/WebWindowComplex/WebWindowComplex.csproj index 03f83b0..a3bb4df 100644 --- a/WebWindowComplex/WebWindowComplex.csproj +++ b/WebWindowComplex/WebWindowComplex.csproj @@ -54,6 +54,8 @@ + + diff --git a/WebWindowConfigurator/WebWindowConfigurator.csproj b/WebWindowConfigurator/WebWindowConfigurator.csproj index 97cee3d..18a7ee5 100644 --- a/WebWindowConfigurator/WebWindowConfigurator.csproj +++ b/WebWindowConfigurator/WebWindowConfigurator.csproj @@ -142,6 +142,8 @@ + + From 6b9ab0421ce7fd2635b3d40ed6725a8c1722b797 Mon Sep 17 00:00:00 2001 From: Samuele Locatelli Date: Wed, 22 Oct 2025 19:14:19 +0200 Subject: [PATCH 05/26] update parziale calcolo shape --- Test.UI/Components/Pages/EditJWD.razor.cs | 110 +++++++++++---------- WebWindowComplex/Compo/CardFrame.razor | 11 +-- WebWindowComplex/Compo/CardFrame.razor.cs | 23 ++++- WebWindowComplex/Compo/CardSashGroup.razor | 13 ++- WebWindowComplex/DTO/LivePayload.cs | 11 ++- WebWindowComplex/DictUtils.cs | 42 ++++++++ WebWindowComplex/TableComp.razor | 10 +- WebWindowComplex/TableComp.razor.cs | 20 +++- WebWindowComplex/WebWindowComplex.csproj | 18 +++- 9 files changed, 189 insertions(+), 69 deletions(-) create mode 100644 WebWindowComplex/DictUtils.cs diff --git a/Test.UI/Components/Pages/EditJWD.razor.cs b/Test.UI/Components/Pages/EditJWD.razor.cs index 2966db4..1569213 100644 --- a/Test.UI/Components/Pages/EditJWD.razor.cs +++ b/Test.UI/Components/Pages/EditJWD.razor.cs @@ -28,40 +28,11 @@ namespace Test.UI.Components.Pages #region Public Methods - /// - /// Comparatore equality obj dizionario - /// - /// - /// - /// - /// - /// - public bool DictionariesEqual(Dictionary dict1, Dictionary dict2) - { - // Handle null cases - if (dict1 == null || dict2 == null) - return dict1 == dict2; - - // Quick size check - if (dict1.Count != dict2.Count) - return false; - - // Compare each key-value pair - foreach (var kvp in dict1) - { - if (!dict2.TryGetValue(kvp.Key, out TValue value)) - return false; // Key missing in dict2 - - if (!EqualityComparer.Default.Equals(kvp.Value, value)) - return false; // Value mismatch - } - - return true; - } public void Dispose() { DLService.PipeSvg.EA_NewMessage -= PipeSvg_EA_NewMessage; + DLService.PipeShape.EA_NewMessage -= PipeShape_EA_NewMessage; } #endregion Public Methods @@ -175,6 +146,7 @@ namespace Test.UI.Components.Pages SvgPreview = currSvg }; DLService.PipeSvg.EA_NewMessage += PipeSvg_EA_NewMessage; + DLService.PipeShape.EA_NewMessage += PipeShape_EA_NewMessage; } #endregion Protected Methods @@ -182,24 +154,41 @@ namespace Test.UI.Components.Pages #region Private Fields private string apiUrl = ""; + private string calcTag = ""; + private string CalcUid = "CurrWindow"; + private string cFileHardware = "Hardware/Setup.json"; + private string cFileTemplate = "Data/Setup.json"; + private string colorMassUpdate; + private TemplateSelectDTO? currSel = null; + private string currSvg = ""; private string familyHWMassUpdate; + private string GenericBasePath = ""; + private string glassMassUpdate; + private Hardware hardwareMassUpdate; + private string imgBasePath = ""; + private string materialMassUpdate; + private string outClose = ""; + private string outSave = ""; + private string profileMassUpdate; - private string subChannel = ""; + + private string svgChannel = ""; + private string shapeChannel = ""; private string windowUid = "CurrWindow"; @@ -207,23 +196,6 @@ namespace Test.UI.Components.Pages #region Private Methods - private async void PipeSvg_EA_NewMessage(object? sender, EventArgs e) - { - // aggiorno visualizzazione - PubSubEventArgs currArgs = (PubSubEventArgs)e; - // conversione on-the-fly SVG da mostrare - if (!string.IsNullOrEmpty(currArgs.newMessage)) - { - if (currArgs.msgUid.Equals($"{subChannel}:{windowUid}")) - { - currSvg = currArgs.newMessage; - CurrData.SvgPreview = currArgs.newMessage; - } - await InvokeAsync(StateHasChanged); - } - await Task.Delay(1); - } - /// /// Effettua chiusura oggetto con eventuale save /// @@ -240,7 +212,9 @@ namespace Test.UI.Components.Pages imgBasePath = Config.GetValue("ServerConf:ImageBaseUrl") ?? ""; GenericBasePath = Config.GetValue("ServerConf:GenericBaseUrl") ?? ""; calcTag = Config.GetValue("ServerConf:CalcTag") ?? ""; - subChannel = Config.GetValue("ServerConf:SvgChannel") ?? ""; + svgChannel = Config.GetValue("ServerConf:SvgChannel") ?? ""; + shapeChannel = Config.GetValue("ServerConf:ShapeChannel") ?? ""; + } private async Task ExecRequest(Dictionary CurrArgs) @@ -254,7 +228,7 @@ namespace Test.UI.Components.Pages CurrData.CurrJwd = currJwd; } // se il SSE variato --> invio - if (!currJwd.Equals(prevJwd) || !DictionariesEqual(m_CurrArgs, CurrArgs)) + if (!currJwd.Equals(prevJwd) || !EgwCoreLib.Lux.Core.DictUtils.DictAreEqual(m_CurrArgs, CurrArgs)) { m_CurrArgs = CurrArgs; prevJwd = currJwd; @@ -266,6 +240,42 @@ namespace Test.UI.Components.Pages } } + private async void PipeShape_EA_NewMessage(object? sender, EventArgs e) + { + // aggiorno visualizzazione + PubSubEventArgs currArgs = (PubSubEventArgs)e; + // conversione on-the-fly SVG da mostrare + if (!string.IsNullOrEmpty(currArgs.newMessage)) + { + if (currArgs.msgUid.Equals($"{shapeChannel}:{windowUid}")) + { +#if false + // verifica del groupID... + CurrData.Shape = "Rectangle";// currArgs.newMessage; +#endif + } + await InvokeAsync(StateHasChanged); + } + await Task.Delay(1); + } + + private async void PipeSvg_EA_NewMessage(object? sender, EventArgs e) + { + // aggiorno visualizzazione + PubSubEventArgs currArgs = (PubSubEventArgs)e; + // conversione on-the-fly SVG da mostrare + if (!string.IsNullOrEmpty(currArgs.newMessage)) + { + if (currArgs.msgUid.Equals($"{svgChannel}:{windowUid}")) + { + currSvg = currArgs.newMessage; + CurrData.SvgPreview = currArgs.newMessage; + } + await InvokeAsync(StateHasChanged); + } + await Task.Delay(1); + } + /// /// Rilettura dati /// diff --git a/WebWindowComplex/Compo/CardFrame.razor b/WebWindowComplex/Compo/CardFrame.razor index d14199e..c5c2d09 100644 --- a/WebWindowComplex/Compo/CardFrame.razor +++ b/WebWindowComplex/Compo/CardFrame.razor @@ -16,7 +16,7 @@
- @@ -62,17 +62,17 @@
- +
- +
- +
@@ -84,7 +84,7 @@
- @if (SashList.Count == 0) + @if (SashList.Count == 0) {
Bottom rail
@@ -105,4 +105,3 @@ { } - \ No newline at end of file diff --git a/WebWindowComplex/Compo/CardFrame.razor.cs b/WebWindowComplex/Compo/CardFrame.razor.cs index 1f33a46..df31459 100644 --- a/WebWindowComplex/Compo/CardFrame.razor.cs +++ b/WebWindowComplex/Compo/CardFrame.razor.cs @@ -32,11 +32,17 @@ namespace WebWindowComplex.Compo public EventCallback EC_ReqClose { get; set; } /// - /// Evento per cambiare tutti i Joints + /// Evento per aggiornare info frame (es cambaire tutti i Joints) /// [Parameter] public EventCallback EC_UpdateFrame { get; set; } + /// + /// Evento per richiesta calcolo Shape + /// + [Parameter] + public EventCallback EC_UpdateShape { get; set; } + /// /// Frame corrente /// @@ -65,6 +71,7 @@ namespace WebWindowComplex.Compo /// private async Task AddSash() { + await EC_UpdateShape.InvokeAsync(FrameWindow); await EC_AddSash.InvokeAsync(true); } @@ -111,10 +118,24 @@ namespace WebWindowComplex.Compo if (updRec != null) { currRec = updRec; + await EC_UpdateShape.InvokeAsync(FrameWindow); await EC_UpdateFrame.InvokeAsync(FrameWindow); } } + protected int SelShapeIndex + { + get => FrameWindow.SelShapeIndex; + set + { + if (FrameWindow.SelShapeIndex != value) + { + FrameWindow.SelShapeIndex = value; + _ = EC_UpdateShape.InvokeAsync(FrameWindow); + } + } + } + /// /// Report aggiornamento joint /// diff --git a/WebWindowComplex/Compo/CardSashGroup.razor b/WebWindowComplex/Compo/CardSashGroup.razor index 21edcb5..40601fd 100644 --- a/WebWindowComplex/Compo/CardSashGroup.razor +++ b/WebWindowComplex/Compo/CardSashGroup.razor @@ -96,8 +96,8 @@ {
- +
} @@ -106,7 +106,12 @@
} diff --git a/WebWindowComplex/DTO/LivePayload.cs b/WebWindowComplex/DTO/LivePayload.cs index db8e240..a941711 100644 --- a/WebWindowComplex/DTO/LivePayload.cs +++ b/WebWindowComplex/DTO/LivePayload.cs @@ -1,4 +1,5 @@ -using System; +using EgwCoreLib.Utils; +using System; using System.Collections.Generic; using System.Linq; using System.Text; @@ -24,9 +25,9 @@ namespace WebWindowComplex.DTO public string SvgPreview { get; set; } = string.Empty; /// - /// Shape da verifica JWD + /// Dizionario Shape da verifica JWD /// - public string Shape { get; set; } = string.Empty; + public Dictionary DictShape { get; set; } = new Dictionary(); /// /// XML opzioni HW da verifica JWD @@ -51,10 +52,10 @@ namespace WebWindowComplex.DTO return false; if (SvgPreview != item.SvgPreview) return false; - if (Shape != item.Shape) - return false; if (OptionsXml != item.OptionsXml) return false; + if (!DictUtils.DictAreEqual(DictShape, item.DictShape)) + return false; return true; } diff --git a/WebWindowComplex/DictUtils.cs b/WebWindowComplex/DictUtils.cs new file mode 100644 index 0000000..de75e4e --- /dev/null +++ b/WebWindowComplex/DictUtils.cs @@ -0,0 +1,42 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace WebWindowComplex +{ + public class DictUtils + { + /// + /// Comparatore equality obj dizionario + /// + /// + /// + /// + /// + /// + public static bool DictAreEqual(Dictionary dict1, Dictionary dict2) + { + // Handle null cases + if (dict1 == null || dict2 == null) + return dict1 == dict2; + + // Quick size check + if (dict1.Count != dict2.Count) + return false; + + // Compare each key-value pair + foreach (var kvp in dict1) + { + if (!dict2.TryGetValue(kvp.Key, out TValue value)) + return false; // Key missing in dict2 + + if (!EqualityComparer.Default.Equals(kvp.Value, value)) + return false; // Value mismatch + } + + return true; + } + } +} diff --git a/WebWindowComplex/TableComp.razor b/WebWindowComplex/TableComp.razor index 659575c..4e52613 100644 --- a/WebWindowComplex/TableComp.razor +++ b/WebWindowComplex/TableComp.razor @@ -124,7 +124,15 @@ { m_PreviousWindow = m_CurrWindow; } - + } else if (currStep == CompileStep.Split) { diff --git a/WebWindowComplex/TableComp.razor.cs b/WebWindowComplex/TableComp.razor.cs index 46d20f0..fb4b2b2 100644 --- a/WebWindowComplex/TableComp.razor.cs +++ b/WebWindowComplex/TableComp.razor.cs @@ -582,7 +582,9 @@ namespace WebWindowComplex { CurrJwd = LiveData.CurrJwd, OptionsXml = LiveData.OptionsXml, - Shape = LiveData.Shape, +#if false + Shape = LiveData.Shape, +#endif SvgPreview = LiveData.SvgPreview }; m_SelSVG = LiveData.SvgPreview; @@ -1189,6 +1191,22 @@ namespace WebWindowComplex FrameWindow = newFrame; await DoPreviewSvg(); } + /// + /// Aggiornamento Shape x ogni Group di Sash della finestra + /// + /// + /// + private async Task UpdateShape(Frame newFrame) + { + FrameWindow = newFrame; + // ciclo x ogni group della mia frame + foreach (var item in SashList) + { + await DoReqShape(item.GroupId); + } + } + + /// /// Aggiornamento Sash e Frame diff --git a/WebWindowComplex/WebWindowComplex.csproj b/WebWindowComplex/WebWindowComplex.csproj index a3bb4df..f36fcc3 100644 --- a/WebWindowComplex/WebWindowComplex.csproj +++ b/WebWindowComplex/WebWindowComplex.csproj @@ -6,7 +6,7 @@ net8.0 enable enable - 2.7.10.2216 + 2.7.10.2219 Annamaria Sassi Egalware Componente gestione Configurazioni avanzate Window per LUX @@ -49,6 +49,22 @@ + + + + + + + + + + + + + + + + From 38ab3eee81cdeabb536f062dac7fc21047d580d1 Mon Sep 17 00:00:00 2001 From: Samuele Locatelli Date: Wed, 22 Oct 2025 19:20:31 +0200 Subject: [PATCH 06/26] Ancora update x gestione ritorno dizionario forme validate --- Test.UI/Components/Pages/EditJWD.razor.cs | 25 +++++++++++++------ WebWindowComplex/TableComp.razor.cs | 4 +-- WebWindowComplex/WebWindowComplex.csproj | 2 ++ .../WebWindowConfigurator.csproj | 4 ++- 4 files changed, 24 insertions(+), 11 deletions(-) diff --git a/Test.UI/Components/Pages/EditJWD.razor.cs b/Test.UI/Components/Pages/EditJWD.razor.cs index 1569213..d3d3379 100644 --- a/Test.UI/Components/Pages/EditJWD.razor.cs +++ b/Test.UI/Components/Pages/EditJWD.razor.cs @@ -48,6 +48,8 @@ namespace Test.UI.Components.Pages protected Dictionary m_CurrArgs = new Dictionary(); protected string prevJwd = ""; + protected Dictionary currGroupShape = new Dictionary(); + /// /// Configurazione elenchi anagrafiche /// @@ -143,7 +145,8 @@ namespace Test.UI.Components.Pages CurrData = new LivePayload() { CurrJwd = InitialJwd, - SvgPreview = currSvg + SvgPreview = currSvg, + DictShape = currGroupShape }; DLService.PipeSvg.EA_NewMessage += PipeSvg_EA_NewMessage; DLService.PipeShape.EA_NewMessage += PipeShape_EA_NewMessage; @@ -214,7 +217,7 @@ namespace Test.UI.Components.Pages calcTag = Config.GetValue("ServerConf:CalcTag") ?? ""; svgChannel = Config.GetValue("ServerConf:SvgChannel") ?? ""; shapeChannel = Config.GetValue("ServerConf:ShapeChannel") ?? ""; - + } private async Task ExecRequest(Dictionary CurrArgs) @@ -241,18 +244,26 @@ namespace Test.UI.Components.Pages } private async void PipeShape_EA_NewMessage(object? sender, EventArgs e) - { + { // aggiorno visualizzazione PubSubEventArgs currArgs = (PubSubEventArgs)e; // conversione on-the-fly SVG da mostrare if (!string.IsNullOrEmpty(currArgs.newMessage)) { - if (currArgs.msgUid.Equals($"{shapeChannel}:{windowUid}")) + if (currArgs.msgUid.StartsWith($"{shapeChannel}:{windowUid}:")) { -#if false + int groupId = 0; // verifica del groupID... - CurrData.Shape = "Rectangle";// currArgs.newMessage; -#endif + int.TryParse(currArgs.msgUid.Replace($"{shapeChannel}:{windowUid}:", ""), out groupId); + if (currGroupShape.ContainsKey(groupId)) + { + currGroupShape[groupId] = currArgs.newMessage; + } + else + { + currGroupShape.Add(groupId, currArgs.newMessage); + } + CurrData.DictShape = currGroupShape; } await InvokeAsync(StateHasChanged); } diff --git a/WebWindowComplex/TableComp.razor.cs b/WebWindowComplex/TableComp.razor.cs index fb4b2b2..c745f40 100644 --- a/WebWindowComplex/TableComp.razor.cs +++ b/WebWindowComplex/TableComp.razor.cs @@ -582,9 +582,7 @@ namespace WebWindowComplex { CurrJwd = LiveData.CurrJwd, OptionsXml = LiveData.OptionsXml, -#if false - Shape = LiveData.Shape, -#endif + DictShape = LiveData.DictShape, SvgPreview = LiveData.SvgPreview }; m_SelSVG = LiveData.SvgPreview; diff --git a/WebWindowComplex/WebWindowComplex.csproj b/WebWindowComplex/WebWindowComplex.csproj index f36fcc3..ca37ebc 100644 --- a/WebWindowComplex/WebWindowComplex.csproj +++ b/WebWindowComplex/WebWindowComplex.csproj @@ -72,6 +72,8 @@ + + diff --git a/WebWindowConfigurator/WebWindowConfigurator.csproj b/WebWindowConfigurator/WebWindowConfigurator.csproj index 18a7ee5..ba95b44 100644 --- a/WebWindowConfigurator/WebWindowConfigurator.csproj +++ b/WebWindowConfigurator/WebWindowConfigurator.csproj @@ -6,7 +6,7 @@ net8.0 enable enable - 2.7.10.2216 + 2.7.10.2219 Annamaria Sassi Egalware Componente gestione JWD per LUX @@ -144,6 +144,8 @@ + + From e68847318f4698ff3565c116c411f6753210673b Mon Sep 17 00:00:00 2001 From: Annamaria Sassi Date: Thu, 23 Oct 2025 09:50:12 +0200 Subject: [PATCH 07/26] - Aggiornato readme - Piccole correzioni --- README.md | 137 ++++++++++-------- WebWindowComplex/Compo/AreaFrame.razor | 2 +- WebWindowComplex/Compo/AreaSash.razor | 2 +- WebWindowComplex/Models/Area.cs | 4 +- WebWindowComplex/TableComp.razor | 34 +++-- WebWindowComplex/TableComp.razor.cs | 33 ++--- WebWindowComplex/WebWindowComplex.csproj | 5 +- .../WebWindowConfigurator.csproj | 6 +- 8 files changed, 131 insertions(+), 92 deletions(-) diff --git a/README.md b/README.md index e68c0b7..e908008 100644 --- a/README.md +++ b/README.md @@ -1,93 +1,112 @@ # WebWindowConfigurator +Componente per configurare un serramento partendo da un JWD. +Durante la configurazione ad ogni cambiamento viene aggiornata l'immagine del serramento. -## Getting started +## Requisiti -To make it easy for you to get started with GitLab, here's a list of recommended next steps. +I requisiti per utilizzare il componente sono: + - JWD da modificare + - Lista delle famiglie hardware + - Lista hardware + - Lista dei materiali + - Lista dei colori dei materiali + - Lista dei vetri ammessi + - Lista dei profili gestiti -Already a pro? Just edit this README.md and make it your own. Want to make it easy? [Use the template at the bottom](#editing-this-readme)! +## Funzionalità componente -## Add your files +Il componente permette i seguenti comportamenti principali: -- [ ] [Create](https://docs.gitlab.com/ee/user/project/repository/web_editor.html#create-a-file) or [upload](https://docs.gitlab.com/ee/user/project/repository/web_editor.html#upload-a-file) files -- [ ] [Add files using the command line](https://docs.gitlab.com/topics/git/add_files/#add-files-to-a-git-repository) or push an existing Git repository with the following command: + - Aggiungere un gruppo di ante al telaio, + - Aggiungere uno split al telaio o a un anta, + - Copiare il contenuto di un'anta in un'altra anta, + - Eliminare un gruppo di ante, + - Eliminare uno split -``` -cd existing_repo -git remote add origin https://gitlab.steamware.net/etis/webwindowconfigurator.git -git branch -M main -git push -uf origin main -``` +## JWD -## Integrate with your tools +Il JWD descrive la struttura e le caratteristiche di un serramento. -- [ ] [Set up project integrations](https://gitlab.steamware.net/etis/webwindowconfigurator/-/settings/integrations) +Un serramento è composto da un determinato tipo di elementi: + - Telaio (obbligatorio) + - Divisione (facoltativa) + - Gruppo ante (facoltativo) + - Riempimento (obbligatorio almeno un riempimento) -## Collaborate with your team +All'intero serramento sono associate le seguenti caratteristiche: + - Profilo; + - Materiale; + - Vetro; + - Colore serramento. -- [ ] [Invite team members and collaborators](https://docs.gitlab.com/ee/user/project/members/) -- [ ] [Create a new merge request](https://docs.gitlab.com/ee/user/project/merge_requests/creating_merge_requests.html) -- [ ] [Automatically close issues from merge requests](https://docs.gitlab.com/ee/user/project/issues/managing_issues.html#closing-issues-automatically) -- [ ] [Enable merge request approvals](https://docs.gitlab.com/ee/user/project/merge_requests/approvals/) -- [ ] [Set auto-merge](https://docs.gitlab.com/user/project/merge_requests/auto_merge/) +### Telaio (Frame) -## Test and Deploy +Al frame sono associate le seguenti caratteristiche: + - Forma; + - Dimensioni; + - Soglia; + - Giunti; + - Quantità bottom Rail. -Use the built-in continuous integration in GitLab. +### Divisione (Split) -- [ ] [Get started with GitLab CI/CD](https://docs.gitlab.com/ee/ci/quick_start/) -- [ ] [Analyze your code for known vulnerabilities with Static Application Security Testing (SAST)](https://docs.gitlab.com/ee/user/application_security/sast/) -- [ ] [Deploy to Kubernetes, Amazon EC2, or Amazon ECS using Auto Deploy](https://docs.gitlab.com/ee/topics/autodevops/requirements.html) -- [ ] [Use pull-based deployments for improved Kubernetes management](https://docs.gitlab.com/ee/user/clusters/agent/) -- [ ] [Set up protected environments](https://docs.gitlab.com/ee/ci/environments/protected_environments.html) +Uno split genera sempre almeno due sottoaree contenenti ognuna un riempimento (Fill) di tipo vetro. +Se ci sono solo due sottoaree generate da uno split, si possono scambiare tra di loro. -*** +Uno split può essere: + - Orizzontale, definisco il numero di split orizzontali e l'altezza delle nuove aree orizzontali formate; + - Verticale, definisco il numero di split verticali e la larghezza delle nuove aree verticali formate; + - A griglia, definisco il numero di split orizzontali e verticali e l'altezza delle aree orizzontali e la larghezza delle aree verticali. -# Editing this README +### Gruppo di ante (Sash group) -When you're ready to make this README your own, just edit this file and use the handy template below (or feel free to structure it however you want - this is just a starting point!). Thanks to [makeareadme.com](https://www.makeareadme.com/) for this template. +Al gruppo di ante sono associate le seguenti caratteristiche: + - Numero di ante; + - Orientamento; + - Quantità bottom rail; + - Giunti; + - Codice hardware. -## Suggestions for a good README +#### Singola anta -Every project is different, so consider which of these sections apply to yours. The sections used in the template are suggestions for most open source projects. Also keep in mind that while a README can be too long and detailed, too long is better than too short. If you think your README is too long, consider utilizing another form of documentation rather than cutting out information. +La singola anta ha associate le seguenti caratteristiche: + - Tipologia di apertura; + - Dimensione; + - Se ha la maniglia. -## Name -Choose a self-explaining name for your project. +#### Hardware -## Description -Let people know what your project can do specifically. Provide context and add a link to any reference visitors might be unfamiliar with. A list of Features or a Background subsection can also be added here. If there are alternatives to your project, this is a good place to list differentiating factors. +Per calcolare la lista di hardware ammessi data una famiglia di hardware servono i seguenti dati: + - Forma del gruppo di ante (tramite richiesta al programma di calcolo); + - Apertura dell'anta con la maniglia; + - Numero di ante; + - Posizione anta battente (nel caso di tre o più ante, bisogna sapere se l'anta con la maniglia è incernierata al telaio o a un'altra anta). -## Badges -On some READMEs, you may see small images that convey metadata, such as whether or not all the tests are passing for the project. You can use Shields to add some to your README. Many services also have instructions for adding a badge. +La richiesta della forma del gruppo di ante viene trasmessa se si cambiano i seguenti parametri: + - Forma del telaio; + - Dimensioni del telaio; + - Aggiunta di uno split; + - ELiminazione di uno split. -## Visuals -Depending on what you are making, it can be a good idea to include screenshots or even a video (you'll frequently see GIFs rather than actual videos). Tools like ttygif can help, but check out Asciinema for a more sophisticated method. +La lista degli hardware viene aggiornata se si cambiano i seguenti parametri: + - Forma del gruppo di ante; + - Numero ante nello stesso gruppo di ante; + - Se si sposta l'anta e cambia il tipo di apertura e/o la posizione dell'anta battente. -## Installation -Within a particular ecosystem, there may be a common way of installing things, such as using Yarn, NuGet, or Homebrew. However, consider the possibility that whoever is reading your README is a novice and would like more guidance. Listing specific steps helps remove ambiguity and gets people to using your project as quickly as possible. If it only runs in a specific context like a particular programming language version or operating system or has dependencies that have to be installed manually, also add a Requirements subsection. +### Riempimento (Fill) -## Usage -Use examples liberally, and show the expected output if you can. It's helpful to have inline the smallest example of usage that you can demonstrate, while providing links to more sophisticated examples if they are too long to reasonably include in the README. - -## Support -Tell people where they can go to for help. It can be any combination of an issue tracker, a chat room, an email address, etc. +Descrive il tipo di riempimento: vetro o pannello. ## Roadmap -If you have ideas for releases in the future, it is a good idea to list them in the README. -## Contributing -State if you are open to contributions and what your requirements are for accepting them. - -For people who want to make changes to your project, it's helpful to have some documentation on how to get started. Perhaps there is a script that they should run or some environment variables that they need to set. Make these steps explicit. These instructions could also be useful to your future self. - -You can also document commands to lint the code or run tests. These steps help to ensure high code quality and reduce the likelihood that the changes inadvertently break something. Having instructions for running tests is especially helpful if it requires external setup, such as starting a Selenium server for testing in a browser. - -## Authors and acknowledgment -Show your appreciation to those who have contributed to the project. +Mancano: + - [ ] Gestione richiesta forma del gruppo di ante; + - [ ] Calcolare svg solo dopo che si hanno i dati bloccanti; + - [ ] Gestione e inserimento opzioni hardware in CardSashGroup ; + - [ ] Filtrare hardware utilizzando anche la posizione dell'anta battente. ## License For open source projects, say how it is licensed. -## Project status -If you have run out of energy or time for your project, put a note at the top of the README saying that development has slowed down or stopped completely. Someone may choose to fork your project or volunteer to step in as a maintainer or owner, allowing your project to keep going. You can also make an explicit request for maintainers. diff --git a/WebWindowComplex/Compo/AreaFrame.razor b/WebWindowComplex/Compo/AreaFrame.razor index 749d861..19908a6 100644 --- a/WebWindowComplex/Compo/AreaFrame.razor +++ b/WebWindowComplex/Compo/AreaFrame.razor @@ -8,7 +8,7 @@ @if (CurrSashList.Count == 0 && CurrSplitList.Count == 0) {
- +
}
diff --git a/WebWindowComplex/Compo/AreaSash.razor b/WebWindowComplex/Compo/AreaSash.razor index e053a2d..b5f958a 100644 --- a/WebWindowComplex/Compo/AreaSash.razor +++ b/WebWindowComplex/Compo/AreaSash.razor @@ -37,7 +37,7 @@
- +
diff --git a/WebWindowComplex/Models/Area.cs b/WebWindowComplex/Models/Area.cs index babf1b9..f4c3306 100644 --- a/WebWindowComplex/Models/Area.cs +++ b/WebWindowComplex/Models/Area.cs @@ -154,8 +154,10 @@ namespace WebWindowComplex.Models return answ; } - public void AddSplit(Area ParentArea) + public void AddSplit() { + // Salvo il parent + Area ParentArea = AreaList[0].ParentArea; List ContentArea = new List(); // Salvo gli oggetti già presenti e li cancello da AreaList ContentArea.Add(AreaList[0]); diff --git a/WebWindowComplex/TableComp.razor b/WebWindowComplex/TableComp.razor index 4e52613..c415f98 100644 --- a/WebWindowComplex/TableComp.razor +++ b/WebWindowComplex/TableComp.razor @@ -116,7 +116,10 @@ } @if (currStep == CompileStep.Tree) { - + + } else if (currStep == CompileStep.Frame) { @@ -125,14 +128,15 @@ m_PreviousWindow = m_CurrWindow; } + SashList="m_SashList" + SplitList="m_SplitList" + EC_ChangeAllJoints="ChangeAllJoints" + EC_AddSash="() => AddSashToFrame(FrameWindow!)" + EC_AddSplit="() => AddSplitToFrame(FrameWindow!)" + EC_ReqClose="ReturnTree" + EC_UpdateShape="UpdateShape" + EC_UpdateFrame="UpdateFrame"> + } else if (currStep == CompileStep.Split) { @@ -142,7 +146,15 @@ } else { - + + } } else if (currStep == CompileStep.Sash) @@ -181,7 +193,7 @@ SplittedList="m_SplittedList" EC_ChangeAllType="ChangeAllFill" EC_ChangeType="ChangeOneFill" - EC_AddSash="AddSash" + EC_AddSash="AddSashIntoSplit" EC_CopySash="CopySash" EC_ReqClose="ReturnTree"> diff --git a/WebWindowComplex/TableComp.razor.cs b/WebWindowComplex/TableComp.razor.cs index c745f40..a5cd775 100644 --- a/WebWindowComplex/TableComp.razor.cs +++ b/WebWindowComplex/TableComp.razor.cs @@ -789,6 +789,11 @@ namespace WebWindowComplex bError = f.AddFirstSash(); } + private void AddSplitToFrame(Frame f) + { + f.AddSplit(); + } + /// /// Metodo per andare allo step successivo /// @@ -966,7 +971,7 @@ namespace WebWindowComplex /// /// /// - private async Task AddSash(DataAreaSplitted Args) + private async Task AddSashIntoSplit(DataAreaSplitted Args) { Splitted currSplitted = Args.splitted; bError = currSplitted.AddFirstSash(); @@ -1204,7 +1209,15 @@ namespace WebWindowComplex } } - + /// + /// Aggiornamento shape dato GroupId + /// + /// nuova sash + /// + private async Task UpdateShape(int groupId) + { + await DoReqShape(groupId); + } /// /// Aggiornamento Sash e Frame @@ -1213,7 +1226,7 @@ namespace WebWindowComplex /// private async Task UpdateSash(Sash newSash) { - SearchSash(m_Frame, newSash.GroupId, newSash); + SearchSash(FrameWindow, newSash.GroupId, newSash); await DoPreviewSvg(); } @@ -1227,19 +1240,6 @@ namespace WebWindowComplex await DoReqOptHardware(); } - - /// - /// Aggiornamento shape dato GroupId - /// - /// nuova sash - /// - private async Task UpdateShape(int groupId) - { - await DoReqShape(groupId); - } - - - /// /// Cerca e aggiorna la sash /// @@ -1265,7 +1265,6 @@ namespace WebWindowComplex return null; } - #endregion Private Methods } } \ No newline at end of file diff --git a/WebWindowComplex/WebWindowComplex.csproj b/WebWindowComplex/WebWindowComplex.csproj index ca37ebc..78293cc 100644 --- a/WebWindowComplex/WebWindowComplex.csproj +++ b/WebWindowComplex/WebWindowComplex.csproj @@ -6,7 +6,7 @@ net8.0 enable enable - 2.7.10.2219 + 2.7.10.2309 Annamaria Sassi Egalware Componente gestione Configurazioni avanzate Window per LUX @@ -73,6 +73,9 @@ + + + diff --git a/WebWindowConfigurator/WebWindowConfigurator.csproj b/WebWindowConfigurator/WebWindowConfigurator.csproj index ba95b44..4bc6a2a 100644 --- a/WebWindowConfigurator/WebWindowConfigurator.csproj +++ b/WebWindowConfigurator/WebWindowConfigurator.csproj @@ -6,7 +6,7 @@ net8.0 enable enable - 2.7.10.2219 + 2.7.10.2309 Annamaria Sassi Egalware Componente gestione JWD per LUX @@ -144,6 +144,10 @@ + + + + From f3ad3e4ce48ca30d12e94e83e3651e214349e3de Mon Sep 17 00:00:00 2001 From: Samuele Locatelli Date: Thu, 23 Oct 2025 10:26:50 +0200 Subject: [PATCH 08/26] Renaming forme (Frame) + readme --- README.md | 14 ++++ README.pdf | Bin 0 -> 61696 bytes Test.UI/Hardware/Setup.json | 76 +++++++++--------- WebWindowComplex/Models/Area.cs | 2 +- WebWindowComplex/Models/Sash.cs | 2 +- WebWindowComplex/WebWindowComplex.csproj | 1 + .../WebWindowConfigurator.csproj | 1 + WebWindowTest/Window.cs | 2 +- 8 files changed, 57 insertions(+), 41 deletions(-) create mode 100644 README.pdf diff --git a/README.md b/README.md index e908008..01aafd9 100644 --- a/README.md +++ b/README.md @@ -50,6 +50,18 @@ Al frame sono associate le seguenti caratteristiche: - Giunti; - Quantità bottom Rail. +#### Forme Telaio + +Le forme ammesse per il telaio sono le seguenti: + - Arc + - Circle + - Custom + - FullArc + - Rectangle + - SemiArc + - SemiFullArc + - Trapezoid + ### Divisione (Split) Uno split genera sempre almeno due sottoaree contenenti ognuna un riempimento (Fill) di tipo vetro. @@ -99,6 +111,8 @@ La lista degli hardware viene aggiornata se si cambiano i seguenti parametri: Descrive il tipo di riempimento: vetro o pannello. + + ## Roadmap Mancano: diff --git a/README.pdf b/README.pdf new file mode 100644 index 0000000000000000000000000000000000000000..e72c279144e43d96365e070bc9fc4a7d01227708 GIT binary patch literal 61696 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 literal 0 HcmV?d00001 diff --git a/Test.UI/Hardware/Setup.json b/Test.UI/Hardware/Setup.json index 25b20a0..69b182c 100644 --- a/Test.UI/Hardware/Setup.json +++ b/Test.UI/Hardware/Setup.json @@ -4,7 +4,7 @@ "familyName": "ArTech", "description": "ArTech_Aria12", "openingType": "TiltTurn", - "shape": "Rectangular", + "shape": "Rectangle", "sashQty": 3, "sashPosition": 1 }, @@ -13,7 +13,7 @@ "familyName": "ArTechPlana", "description": "ArTechPlana_Aria4", "openingType": "TurnOnly", - "shape": "Rectangular", + "shape": "Rectangle", "sashQty": 2, "sashPosition": 1 }, @@ -31,7 +31,7 @@ "familyName": "ArTechPlana", "description": "ArTechPlana_Aria4", "openingType": "TurnOnly", - "shape": "Rectangular", + "shape": "Rectangle", "sashQty": 1, "sashPosition": 1 }, @@ -58,7 +58,7 @@ "familyName": "ArTechPlana", "description": "ArTechPlana_Aria4", "openingType": "TiltTurn", - "shape": "Rectangular", + "shape": "Rectangle", "sashQty": 3, "sashPosition": 1 }, @@ -67,7 +67,7 @@ "familyName": "ArTech", "description": "ArTech_Aria12", "openingType": "TurnOnly", - "shape": "Rectangular", + "shape": "Rectangle", "sashQty": 2, "sashPosition": 1 }, @@ -94,7 +94,7 @@ "familyName": "ArTechPlana", "description": "ArTechPlana_Aria4", "openingType": "TiltTurn", - "shape": "Rectangular", + "shape": "Rectangle", "sashQty": 1, "sashPosition": 1 }, @@ -112,7 +112,7 @@ "familyName": "ArTech", "description": "ArTech_Aria4", "openingType": "TiltTurn", - "shape": "Rectangular", + "shape": "Rectangle", "sashQty": 2, "sashPosition": 1 }, @@ -130,7 +130,7 @@ "familyName": "ArTech", "description": "ArTech_Aria4_Centrale", "openingType": "TurnOnly", - "shape": "Rectangular", + "shape": "Rectangle", "sashQty": 3, "sashPosition": 2 }, @@ -139,7 +139,7 @@ "familyName": "ArTech", "description": "ArTech_Aria12", "openingType": "TiltTurn", - "shape": "Trapezoidal", + "shape": "Trapezoid", "sashQty": 2, "sashPosition": 1 }, @@ -148,7 +148,7 @@ "familyName": "ArTech", "description": "ArTech_Aria4_CerniereScomparsa", "openingType": "TiltTurn", - "shape": "Rectangular", + "shape": "Rectangle", "sashQty": 3, "sashPosition": 1 }, @@ -157,7 +157,7 @@ "familyName": "ArTech", "description": "ArTech_Aria12", "openingType": "TiltTurn", - "shape": "Rectangular", + "shape": "Rectangle", "sashQty": 1, "sashPosition": 1 }, @@ -166,7 +166,7 @@ "familyName": "ArTechPlana", "description": "ArTechPlana_Aria12", "openingType": "TurnOnly", - "shape": "Rectangular", + "shape": "Rectangle", "sashQty": 2, "sashPosition": 1 }, @@ -175,7 +175,7 @@ "familyName": "ArTech", "description": "ArTech_Aria12", "openingType": "TurnOnly", - "shape": "Rectangular", + "shape": "Rectangle", "sashQty": 4, "sashPosition": 2 }, @@ -193,7 +193,7 @@ "familyName": "ArTechPlana", "description": "ArTechPlana_Aria12_Centrale", "openingType": "TurnOnly", - "shape": "Rectangular", + "shape": "Rectangle", "sashQty": 3, "sashPosition": 2 }, @@ -220,7 +220,7 @@ "familyName": "ArTechPlana", "description": "ArTechPlana_Aria12", "openingType": "TiltTurn", - "shape": "Rectangular", + "shape": "Rectangle", "sashQty": 1, "sashPosition": 1 }, @@ -229,7 +229,7 @@ "familyName": "ArTechPlana", "description": "ArTechPlana_Aria4", "openingType": "TurnOnly", - "shape": "Rectangular", + "shape": "Rectangle", "sashQty": 4, "sashPosition": 2 }, @@ -238,7 +238,7 @@ "familyName": "ArTech", "description": "ArTech_Aria12", "openingType": "TiltTurn", - "shape": "Rectangular", + "shape": "Rectangle", "sashQty": 2, "sashPosition": 1 }, @@ -247,7 +247,7 @@ "familyName": "ArTechPlana", "description": "ArTechPlana_Aria4_Centrale", "openingType": "TurnOnly", - "shape": "Rectangular", + "shape": "Rectangle", "sashQty": 3, "sashPosition": 2 }, @@ -256,7 +256,7 @@ "familyName": "ArTech", "description": "ArTech_Aria4", "openingType": "TiltTurn", - "shape": "Rectangular", + "shape": "Rectangle", "sashQty": 3, "sashPosition": 1 }, @@ -265,7 +265,7 @@ "familyName": "ArTech", "description": "ArTech_Aria12_Centrale", "openingType": "TurnOnly", - "shape": "Rectangular", + "shape": "Rectangle", "sashQty": 3, "sashPosition": 2 }, @@ -292,7 +292,7 @@ "familyName": "ArTechPlana", "description": "ArTechPlana_Aria12", "openingType": "TiltTurn", - "shape": "Rectangular", + "shape": "Rectangle", "sashQty": 2, "sashPosition": 1 }, @@ -301,7 +301,7 @@ "familyName": "ArTechPlana", "description": "ArTechPlana_Aria12", "openingType": "TurnOnly", - "shape": "Rectangular", + "shape": "Rectangle", "sashQty": 1, "sashPosition": 1 }, @@ -337,7 +337,7 @@ "familyName": "ArTech", "description": "ArTech_Aria4", "openingType": "TurnOnly", - "shape": "Rectangular", + "shape": "Rectangle", "sashQty": 4, "sashPosition": 2 }, @@ -346,7 +346,7 @@ "familyName": "ArTech", "description": "ArTech_Aria4", "openingType": "TiltTurn", - "shape": "Rectangular", + "shape": "Rectangle", "sashQty": 1, "sashPosition": 1 }, @@ -373,7 +373,7 @@ "familyName": "ArTech", "description": "ArTech_Aria12_Laterale", "openingType": "TurnOnly", - "shape": "Rectangular", + "shape": "Rectangle", "sashQty": 3, "sashPosition": 1 }, @@ -382,7 +382,7 @@ "familyName": "ArTech", "description": "ArTech_Aria4", "openingType": "TiltTurn", - "shape": "Trapezoidal", + "shape": "Trapezoid", "sashQty": 2, "sashPosition": 1 }, @@ -391,7 +391,7 @@ "familyName": "ArTechPlana", "description": "ArTechPlana_Aria4_Laterale", "openingType": "TurnOnly", - "shape": "Rectangular", + "shape": "Rectangle", "sashQty": 3, "sashPosition": 1 }, @@ -400,7 +400,7 @@ "familyName": "ArTech", "description": "ArTech_Aria12_CernieraScomparsa", "openingType": "TiltTurn", - "shape": "Rectangular", + "shape": "Rectangle", "sashQty": 3, "sashPosition": 1 }, @@ -436,7 +436,7 @@ "familyName": "ArTech", "description": "ArTech_Aria4_Laterale", "openingType": "TurnOnly", - "shape": "Rectangular", + "shape": "Rectangle", "sashQty": 3, "sashPosition": 1 }, @@ -454,7 +454,7 @@ "familyName": "ArTech", "description": "ArTech_Aria4", "openingType": "TurnOnly", - "shape": "Rectangular", + "shape": "Rectangle", "sashQty": 2, "sashPosition": 1 }, @@ -463,7 +463,7 @@ "familyName": "ArTech", "description": "ArTech_Aria4", "openingType": "TurnOnly", - "shape": "Rectangular", + "shape": "Rectangle", "sashQty": 1, "sashPosition": 1 }, @@ -499,7 +499,7 @@ "familyName": "ArTechPlana", "description": "ArTechPlana_Aria12_Laterale", "openingType": "TurnOnly", - "shape": "Rectangular", + "shape": "Rectangle", "sashQty": 3, "sashPosition": 1 }, @@ -508,7 +508,7 @@ "familyName": "ArTechPlana", "description": "ArTechPlana_Aria12", "openingType": "TurnOnly", - "shape": "Rectangular", + "shape": "Rectangle", "sashQty": 4, "sashPosition": 2 }, @@ -535,7 +535,7 @@ "familyName": "ArTechPlana", "description": "ArTechPlana_Aria4", "openingType": "TiltTurn", - "shape": "Rectangular", + "shape": "Rectangle", "sashQty": 2, "sashPosition": 1 }, @@ -553,7 +553,7 @@ "familyName": "ArTechPlana", "description": "ArTechPlana_Aria12", "openingType": "TiltTurn", - "shape": "Rectangular", + "shape": "Rectangle", "sashQty": 3, "sashPosition": 1 }, @@ -562,7 +562,7 @@ "familyName": "ArTech", "description": "ArTech_Aria12", "openingType": "TurnOnly", - "shape": "Rectangular", + "shape": "Rectangle", "sashQty": 1, "sashPosition": 1 }, @@ -580,7 +580,7 @@ "familyName": "ArTech", "description": "ArTech_Aria12", "openingType": "TiltTurn", - "shape": "Trapezoidal", + "shape": "Trapezoid", "sashQty": 1, "sashPosition": 1 }, @@ -607,7 +607,7 @@ "familyName": "ArTech", "description": "ArTech_Aria4", "openingType": "TiltTurn", - "shape": "Trapezoidal", + "shape": "Trapezoid", "sashQty": 1, "sashPosition": 1 } diff --git a/WebWindowComplex/Models/Area.cs b/WebWindowComplex/Models/Area.cs index f4c3306..eb8d2ec 100644 --- a/WebWindowComplex/Models/Area.cs +++ b/WebWindowComplex/Models/Area.cs @@ -257,7 +257,7 @@ namespace WebWindowComplex.Models /// private string FindSashShape() { - return "Rectangular"; + return "Rectangle"; } #endregion Private Methods diff --git a/WebWindowComplex/Models/Sash.cs b/WebWindowComplex/Models/Sash.cs index 8919117..abbbe3a 100644 --- a/WebWindowComplex/Models/Sash.cs +++ b/WebWindowComplex/Models/Sash.cs @@ -846,7 +846,7 @@ namespace WebWindowComplex.Models private string FindSashShape() { - return "Rectangular"; + return "Rectangle"; } #endregion Private Methods diff --git a/WebWindowComplex/WebWindowComplex.csproj b/WebWindowComplex/WebWindowComplex.csproj index 78293cc..e39f3fb 100644 --- a/WebWindowComplex/WebWindowComplex.csproj +++ b/WebWindowComplex/WebWindowComplex.csproj @@ -78,5 +78,6 @@ + diff --git a/WebWindowConfigurator/WebWindowConfigurator.csproj b/WebWindowConfigurator/WebWindowConfigurator.csproj index 4bc6a2a..3884f9d 100644 --- a/WebWindowConfigurator/WebWindowConfigurator.csproj +++ b/WebWindowConfigurator/WebWindowConfigurator.csproj @@ -151,5 +151,6 @@ + diff --git a/WebWindowTest/Window.cs b/WebWindowTest/Window.cs index bffa8bb..ef4cca0 100644 --- a/WebWindowTest/Window.cs +++ b/WebWindowTest/Window.cs @@ -1222,7 +1222,7 @@ namespace WebWindowTest } private string FindSashShape() { - return "Rectangular"; + return "Rectangle"; } internal Enums.OpeningTypes GetOpeningType(Openings OpeningType) { From 1ed1658195107b0aad99efdb9bb71fa9c3bcae82 Mon Sep 17 00:00:00 2001 From: Samuele Locatelli Date: Thu, 23 Oct 2025 12:38:45 +0200 Subject: [PATCH 09/26] update x gestioen richeiste forme + svg corrette --- Test.UI/Components/Pages/EditJWD.razor.cs | 11 +- Test.UI/Test.UI.csproj | 4 +- WebWindowComplex/Compo/CardSashGroup.razor | 2 +- WebWindowComplex/Models/Sash.cs | 124 ++++++++++-------- WebWindowComplex/TableComp.razor.cs | 87 ++++++++++-- WebWindowComplex/WebWindowComplex.csproj | 22 +++- .../WebWindowConfigurator.csproj | 22 +++- 7 files changed, 195 insertions(+), 77 deletions(-) diff --git a/Test.UI/Components/Pages/EditJWD.razor.cs b/Test.UI/Components/Pages/EditJWD.razor.cs index d3d3379..2eec95d 100644 --- a/Test.UI/Components/Pages/EditJWD.razor.cs +++ b/Test.UI/Components/Pages/EditJWD.razor.cs @@ -125,7 +125,7 @@ namespace Test.UI.Components.Pages protected override async Task OnInitializedAsync() { ConfInit(); - InitialJwd = File.ReadAllText("Data\\AntaSingola.jwd"); + InitialJwd = File.ReadAllText("Data\\FinestraDueAnteSeparate.jwd"); currJwd = InitialJwd; // rileggo altri dati await ReloadData(); @@ -250,8 +250,11 @@ namespace Test.UI.Components.Pages // conversione on-the-fly SVG da mostrare if (!string.IsNullOrEmpty(currArgs.newMessage)) { - if (currArgs.msgUid.StartsWith($"{shapeChannel}:{windowUid}:")) + if (currArgs.msgUid.StartsWith($"{shapeChannel}:{windowUid}")) { + // deserializzo il dizionario delle risposte... + var rawDict = JsonConvert.DeserializeObject>(currArgs.newMessage); +#if false int groupId = 0; // verifica del groupID... int.TryParse(currArgs.msgUid.Replace($"{shapeChannel}:{windowUid}:", ""), out groupId); @@ -262,7 +265,9 @@ namespace Test.UI.Components.Pages else { currGroupShape.Add(groupId, currArgs.newMessage); - } + } +#endif + currGroupShape = rawDict ?? new Dictionary(); CurrData.DictShape = currGroupShape; } await InvokeAsync(StateHasChanged); diff --git a/Test.UI/Test.UI.csproj b/Test.UI/Test.UI.csproj index 4fc0374..f4e6014 100644 --- a/Test.UI/Test.UI.csproj +++ b/Test.UI/Test.UI.csproj @@ -34,8 +34,8 @@ - - + + diff --git a/WebWindowComplex/Compo/CardSashGroup.razor b/WebWindowComplex/Compo/CardSashGroup.razor index 40601fd..97374a8 100644 --- a/WebWindowComplex/Compo/CardSashGroup.razor +++ b/WebWindowComplex/Compo/CardSashGroup.razor @@ -81,7 +81,7 @@
- @if (string.IsNullOrEmpty(CurrItem.sSashShape)) - { + @if (string.IsNullOrEmpty(CurrItem.SashShape)) + {
@@ -28,8 +28,8 @@
- - @@ -37,7 +37,7 @@
- Qty bottom rail + Qty bottom rail
@@ -77,8 +77,8 @@
- - @if (Sash.s_FamilyHardwareList == null || Sash.s_FamilyHardwareList.Count == 0) { @@ -93,10 +93,10 @@
@if (string.IsNullOrEmpty(CurrItem.SashShape)) - { + {
- -
@@ -104,29 +104,51 @@ else {
- - @foreach (var hlItem in CurrItem.HardwareList) { } - @*@if (CurrItem.HardwareList == null || CurrItem.HardwareList.Count == 0) - { - - } - else - { - @foreach (var hlItem in CurrItem.HardwareList) - { - - } - }*@
}
+
+
+
+
+
Hardware option
+
+
+ @if (CurrItem.HwdOptionList.Count > 0) + { + @foreach (var currOpt in CurrItem.HwdOptionList) + { + switch (currOpt.Type) + { + case AGBOption.HDWOPTIONTYPES.COMBO: + { + AGBOptionCombo currOptCombo = (AGBOptionCombo)currOpt; + + break; + } + case AGBOption.HDWOPTIONTYPES.TEXT: + { + AGBOptionText currOptText = (AGBOptionText)currOpt; +
+ @(currOptText.sName) + +
+ break; + } + } + } + } +
+
diff --git a/WebWindowComplex/Compo/CardSashGroup.razor.cs b/WebWindowComplex/Compo/CardSashGroup.razor.cs index 3c045ee..555ce9f 100644 --- a/WebWindowComplex/Compo/CardSashGroup.razor.cs +++ b/WebWindowComplex/Compo/CardSashGroup.razor.cs @@ -67,12 +67,14 @@ namespace WebWindowComplex.Compo [Parameter] public List SashList { get; set; } = null!; + public AGBOption CurrAGBOpt; + #endregion Public Properties #region Protected Properties /// - /// + /// Selezione hardware /// protected string SelHwType { @@ -162,6 +164,23 @@ namespace WebWindowComplex.Compo } } + /// + /// Report aggiornamento Option Combo + /// + /// + /// + private async Task UpdateOpt(AGBOptionCombo updRec) + { + // cerco il record + var currRec = CurrItem.HwdOptionList.FirstOrDefault(x => x.sName == updRec.sName && x.sDescription == updRec.sDescription); + // lo aggiorno + if (updRec != null) + { + currRec = updRec; + await EC_UpdateSash.InvokeAsync(CurrItem); + } + } + #endregion Private Methods } } \ No newline at end of file diff --git a/WebWindowComplex/Compo/EditJoint.razor b/WebWindowComplex/Compo/EditJoint.razor index 1ffcd67..0d8232c 100644 --- a/WebWindowComplex/Compo/EditJoint.razor +++ b/WebWindowComplex/Compo/EditJoint.razor @@ -1,7 +1,7 @@ @using static WebWindowComplex.LayoutConst
- diff --git a/WebWindowComplex/Compo/EditOptionCombo.razor b/WebWindowComplex/Compo/EditOptionCombo.razor new file mode 100644 index 0000000..e02c3a3 --- /dev/null +++ b/WebWindowComplex/Compo/EditOptionCombo.razor @@ -0,0 +1,9 @@ +
+ + +
\ No newline at end of file diff --git a/WebWindowComplex/Compo/EditOptionCombo.razor.cs b/WebWindowComplex/Compo/EditOptionCombo.razor.cs new file mode 100644 index 0000000..13b0c35 --- /dev/null +++ b/WebWindowComplex/Compo/EditOptionCombo.razor.cs @@ -0,0 +1,36 @@ +using Microsoft.AspNetCore.Components; +using WebWindowComplex.Models; + +namespace WebWindowComplex.Compo +{ + public partial class EditOptionCombo + { + #region Public Properties + + [Parameter] + public AGBOptionCombo CurrOpt { get; set; } = null!; + + [Parameter] + public EventCallback EC_Update { get; set; } + + #endregion Public Properties + + #region Private Properties + + private string CurrValue + { + get => CurrOpt.sValue.sValue; + set + { + if (CurrOpt.sValue.sValue != value) + { + CurrOpt.sValue = CurrOpt.ValueList.FirstOrDefault(x => x.sValue == value); + _ = EC_Update.InvokeAsync(CurrOpt); + } + } + } + + #endregion Private Properties + + } +} \ No newline at end of file diff --git a/WebWindowComplex/Models/ParametriOpzioni.cs b/WebWindowComplex/Models/AGBOption.cs similarity index 93% rename from WebWindowComplex/Models/ParametriOpzioni.cs rename to WebWindowComplex/Models/AGBOption.cs index 5ad6324..e144eb7 100644 --- a/WebWindowComplex/Models/ParametriOpzioni.cs +++ b/WebWindowComplex/Models/AGBOption.cs @@ -7,11 +7,11 @@ using static WebWindowComplex.Json.WindowConst; namespace WebWindowComplex.Models { - public partial class ParametriOpzioni + public partial class AGBOption { #region Public Constructors - public ParametriOpzioni(ParametriOpzioniParametri HdwOptionParam) + public AGBOption(ParametriOpzioniParametri HdwOptionParam) { m_sName = HdwOptionParam.NomeParametro; m_sDescription = HdwOptionParam.DescrizioneParametro; diff --git a/WebWindowComplex/Models/AGBOptionCombo.cs b/WebWindowComplex/Models/AGBOptionCombo.cs index 8413114..dfc41e4 100644 --- a/WebWindowComplex/Models/AGBOptionCombo.cs +++ b/WebWindowComplex/Models/AGBOptionCombo.cs @@ -6,7 +6,7 @@ using System.Threading.Tasks; namespace WebWindowComplex.Models { - public class AGBOptionCombo : ParametriOpzioni + public class AGBOptionCombo : AGBOption { #region Public Constructors diff --git a/WebWindowComplex/Models/AGBOptionText.cs b/WebWindowComplex/Models/AGBOptionText.cs index 252c814..32bcc35 100644 --- a/WebWindowComplex/Models/AGBOptionText.cs +++ b/WebWindowComplex/Models/AGBOptionText.cs @@ -6,7 +6,7 @@ using System.Threading.Tasks; namespace WebWindowComplex.Models { - public class AGBOptionText : ParametriOpzioni + public class AGBOptionText : AGBOption { #region Public Constructors diff --git a/WebWindowComplex/Models/Area.cs b/WebWindowComplex/Models/Area.cs index 719d4eb..65f52d7 100644 --- a/WebWindowComplex/Models/Area.cs +++ b/WebWindowComplex/Models/Area.cs @@ -98,67 +98,86 @@ namespace WebWindowComplex.Models m_CounterGroup++; } - public bool AddFirstSash() + public void AddFirstSash() { - bool answ = false; // Salvo il parent Area ParentArea = AreaList[0].ParentArea; // Creo area sash di default Sash SashArea = Sash.CreateSash(ParentArea); - // ricerco tra tutti gli hw disponibili... - - string sShape = FindSashShape(); - var listHwValid = Sash - .m_HardwareCompleteList - .Where(x => x.Shape == sShape && x.SashQty == 1) - .FirstOrDefault(); - if (listHwValid != null) - { - // seleziono la famiglia del primo hw trovato... - SashArea.SetSelFamilyHardware(listHwValid.FamilyName); -#if false - SashArea.ReqRefreshShape(); -#endif - SashArea.RefreshHardwareList(); - if (SashArea.HardwareList.Count == 0) - { - //answ = true; - SashArea.SetSelHardwareFromId("000000"); - } - else - { - SashArea.SetSelHardwareFromId(SashArea.HardwareList.First().Id); - } - // Salvo gli oggetti già presenti e li cancello da AreaList - List ContentArea = new List(); - ContentArea.Add(AreaList[0]); - AreaList.Remove(AreaList[0]); - // Aggiungo area - AreaList.Add(SashArea); - if (SashArea.nSashQty == 1) - { - // Inserisco il riempimento precedente - AreaList[0].AreaList.Add(ContentArea[0]); - AreaList[0].AreaList[0].SetParentArea(AreaList[0]); - } - else - { - // All'area Sash aggiunto uno Splitted per ogni anta - for (int i = 1; i < SashArea.nSashQty; i++) - { - AreaList[0].AreaList.Add(Splitted.CreateSplitted(SashArea)); - } - Fill fill2 = (Fill)ContentArea[0]; - for (int i = 1; i < SashArea.nSashQty; i++) - { - AreaList[0].AreaList[1].AreaList.Add(Fill.CreateFill(AreaList[0].AreaList[1], fill2.FillType)); - } - } - ParentWindow.OnUpdatePreview(ParentWindow.sSerialized()); - } - return answ; + // Inserisco famiglia hardware vuota + SashArea.SetSelFamilyHardware(""); + // Inserisco hardware di default + SashArea.SetSelHardwareFromId("000000"); + // Salvo gli oggetti già presenti e li cancello da AreaList + List ContentArea = new List(); + ContentArea.Add(AreaList[0]); + AreaList.Remove(AreaList[0]); + // Aggiungo area + AreaList.Add(SashArea); + // Inserisco il riempimento precedente + AreaList[0].AreaList.Add(ContentArea[0]); + AreaList[0].AreaList[0].SetParentArea(AreaList[0]); + ParentWindow.OnUpdatePreview(ParentWindow.sSerialized()); } + // public void AddFirstSash() + // { + // // Salvo il parent + // Area ParentArea = AreaList[0].ParentArea; + // // Creo area sash di default + // Sash SashArea = Sash.CreateSash(ParentArea); + // // ricerco tra tutti gli hw disponibili... + // string sShape = FindSashShape(); + // var listHwValid = Sash + // .m_HardwareCompleteList + // .Where(x => x.Shape == sShape && x.SashQty == 1) + // .FirstOrDefault(); + // if (listHwValid != null) + // { + // // seleziono la famiglia del primo hw trovato... + // SashArea.SetSelFamilyHardware(listHwValid.FamilyName); + //#if false + // SashArea.ReqRefreshShape(); + //#endif + // SashArea.RefreshHardwareList(); + // if (SashArea.HardwareList.Count == 0) + // { + // //answ = true; + // SashArea.SetSelHardwareFromId("000000"); + // } + // else + // { + // SashArea.SetSelHardwareFromId(SashArea.HardwareList.First().Id); + // } + // // Salvo gli oggetti già presenti e li cancello da AreaList + // List ContentArea = new List(); + // ContentArea.Add(AreaList[0]); + // AreaList.Remove(AreaList[0]); + // // Aggiungo area + // AreaList.Add(SashArea); + // if (SashArea.nSashQty == 1) + // { + // // Inserisco il riempimento precedente + // AreaList[0].AreaList.Add(ContentArea[0]); + // AreaList[0].AreaList[0].SetParentArea(AreaList[0]); + // } + // else + // { + // // All'area Sash aggiunto uno Splitted per ogni anta + // for (int i = 1; i < SashArea.nSashQty; i++) + // { + // AreaList[0].AreaList.Add(Splitted.CreateSplitted(SashArea)); + // } + // Fill fill2 = (Fill)ContentArea[0]; + // for (int i = 1; i < SashArea.nSashQty; i++) + // { + // AreaList[0].AreaList[1].AreaList.Add(Fill.CreateFill(AreaList[0].AreaList[1], fill2.FillType)); + // } + // } + // ParentWindow.OnUpdatePreview(ParentWindow.sSerialized()); + // } + // } + public void AddSplit() { // Salvo il parent @@ -254,17 +273,6 @@ namespace WebWindowComplex.Models #endregion Private Fields - #region Private Methods - /// - /// MockUp chiamata a c++ x scelta forma sash per Hw - /// - /// - private string FindSashShape() - { - return "Rectangle"; - } - - #endregion Private Methods } } \ No newline at end of file diff --git a/WebWindowComplex/Models/OnReqHwOptEventArgs.cs b/WebWindowComplex/Models/OnReqHwOptEventArgs.cs new file mode 100644 index 0000000..9e58da1 --- /dev/null +++ b/WebWindowComplex/Models/OnReqHwOptEventArgs.cs @@ -0,0 +1,28 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace WebWindowComplex.Models +{ + public class OnReqHwOptEventArgs : EventArgs + { + #region Public Fields + + public string sJwd; + public string sCodHw; + + #endregion Public Fields + + #region Public Constructors + + public OnReqHwOptEventArgs(string sJwd, string sCodHw) + { + this.sJwd = sJwd; + this.sCodHw = sCodHw; + } + + #endregion Public Constructors + } +} \ No newline at end of file diff --git a/WebWindowComplex/Models/Sash.cs b/WebWindowComplex/Models/Sash.cs index 767a381..2c5dd6e 100644 --- a/WebWindowComplex/Models/Sash.cs +++ b/WebWindowComplex/Models/Sash.cs @@ -1,9 +1,11 @@ using Egw.Window.Data; using System; using System.Collections.Generic; +using System.Data.SqlTypes; using System.Linq; using System.Text; using System.Threading.Tasks; +using System.Xml.Serialization; using WebWindowComplex.Json; using static WebWindowComplex.Json.WindowConst; @@ -32,6 +34,7 @@ namespace WebWindowComplex.Models #region Public Events public event EventHandler OnReqShape = delegate { }; + public event EventHandler OnReqHwOption = delegate { }; #endregion Public Events @@ -77,7 +80,7 @@ namespace WebWindowComplex.Models } } - public List HwdOptionList + public List HwdOptionList { get { @@ -323,75 +326,7 @@ namespace WebWindowComplex.Models set { m_SelHardware = value; - // if (m_SelHardware != null && m_SelHardware.sId != "000000") - // { - // string sHwdOptPath = ""; - // var gf = EgtLuaCreateGlobTable("WDG"); - // var tft = EgtLuaSetGlobIntVar("WDG.AREAID", m_nAreaId); - // var tfy = EgtLuaSetGlobStringVar("WDG.HDWFAVOURITE", value.sId); - // SashDimension HandleSash = m_SashList.FirstOrDefault(x => x.bHasHandle); - // string sHandle = "Dx"; - // switch (GetOpeningSide(HandleSash.OpeningType)) - // { - // case object _ when OpeningSides.LEFT: - // { - // sHandle = "Sx"; - // break; - // } - - // case object _ when OpeningSides.RIGHT: - // { - // sHandle = "Dx"; - // break; - // } - // } - // var tfd = EgtLuaSetGlobStringVar("WDG.HDWHANDLE", sHandle); - // var tlt = EgtLuaCallFunction("WinCreate_GetHardwareOptionPath"); - // var tltf = EgtLuaGetGlobStringVar("WDG.HWDOPTPATH", sHwdOptPath); - // if (!string.IsNullOrWhiteSpace(sHwdOptPath)) - // { - // XmlSerializer serializer = new XmlSerializer(typeof(ParametriOpzioni)); - // ParametriOpzioni HwdOptions = null/* TODO Change to default(_) if this is not a reference type */; - // string sHdwOptPath = Path.ChangeExtension(sHwdOptPath, ".opt"); - // bool bHdwOptFound = false; - // for (var WaitIndex = 0; WaitIndex <= 100; WaitIndex++) - // { - // if (File.Exists(sHdwOptPath)) - // { - // bHdwOptFound = true; - // break; - // } - // System.Threading.Thread.Sleep(100); - // } - // if (bHdwOptFound) - // { - // string sHwdOptText = ""; - // try - // { - // sHwdOptText = File.ReadAllText(sHdwOptPath); - // } - // catch (Exception ex) - // { - // EgtOutLog("Hardware file opt not found or read!"); - // } - // if (!string.IsNullOrWhiteSpace(sHwdOptText)) - // { - // using (TextReader reader = new StringReader(sHwdOptText)) - // { - // HwdOptions = serializer.Deserialize(reader); - // } - // if (!IsNothing(HwdOptions)) - // { - // m_HwdOptionList.Clear(); - // foreach (var HdwOption in HwdOptions.Items) - // m_HwdOptionList.Add(new AGBOption(HdwOption)); - // NotifyPropertyChanged(nameof(HwdOptionList)); - // } - // } - // } - // var ud = EgtLuaResetGlobVar("WDG"); - // } - // } + ReqRefreshHwOption(); } } @@ -404,6 +339,7 @@ namespace WebWindowComplex.Models set { m_SelHardware = m_HardwareList.FirstOrDefault(x => !string.IsNullOrEmpty(value) && x.Id.Equals(value)) ?? new Hardware("", "", "", Enums.OpeningTypes.Null, "", 0, 0); + ReqRefreshHwOption(); ParentWindow.OnUpdatePreview(ParentWindow.sSerialized()); } } @@ -537,6 +473,16 @@ namespace WebWindowComplex.Models } } + /// + /// Richiesta calcolo hardware option list + /// + public void ReqRefreshHwOption() + { + HwdOptionList.Clear(); + // chiamata evento calcolo opzioni hardware + OnReqHwOptionPreview(m_ParentWindow.sSerialized(), SelHardware.Id); + } + public void SetSelFamilyHardware(string sFamilyHw) { m_SelFamilyHardware = sFamilyHw; @@ -556,7 +502,19 @@ namespace WebWindowComplex.Models public void UpdateShape(string newShape) { m_CurrShape = newShape; + // la famiglia hw è vuota seleziono il primo hardware valido e utilizzo la sua famiglia + if(string.IsNullOrEmpty(m_SelFamilyHardware) || m_SelFamilyHardware == "") + { + var listHwValid = Sash + .m_HardwareCompleteList + .Where(x => x.Shape == m_CurrShape && x.SashQty == nSashQty && x.OpeningType == ConvertOpeningType()) + .FirstOrDefault(); + SetSelFamilyHardware(listHwValid.FamilyName); + } RefreshHardwareList(); + // se il vecchio hw selezionato non va più bene viene selezionato il primo della lista + if(!HardwareList.Contains(m_SelHardware) && m_SelHardware.Shape != m_CurrShape) + SetFirstHardware(); } #endregion Public Methods @@ -673,6 +631,16 @@ namespace WebWindowComplex.Models } } + internal void OnReqHwOptionPreview(string sJwd, string codHw) + { + OnReqHwOptEventArgs e = new OnReqHwOptEventArgs(sJwd, codHw); + EventHandler handler = OnReqHwOption; + if (handler != null) + { + handler(this, e); + } + } + internal void RefreshHardwareOptionList() { m_HwdOptionList.Clear(); @@ -697,6 +665,7 @@ namespace WebWindowComplex.Models if (m_HardwareList.Count > 0) { m_SelHardware = m_HardwareList.First(); + ReqRefreshHwOption(); } } @@ -718,6 +687,37 @@ namespace WebWindowComplex.Models } } + internal void SetHardwareOption(string OptionXml) + { + if (!string.IsNullOrEmpty(OptionXml)) + { + ParametriOpzioni HwdOptions = null; + XmlSerializer serializer = new XmlSerializer(typeof(ParametriOpzioni)); + StringReader reader = new StringReader(OptionXml); + HwdOptions = (ParametriOpzioni)serializer.Deserialize(reader); + if (HwdOptions.Items != null) + { + m_HwdOptionList.Clear(); + foreach (var HdwOption in HwdOptions.Items) + { + switch (HdwOption.Tipo) + { + case "Text": + { + m_HwdOptionList.Add(new AGBOptionText(HdwOption)); + break; + } + case "List": + { + m_HwdOptionList.Add(new AGBOptionCombo(HdwOption)); + break; + } + } + } + } + } + } + internal void SetOrientationSashType(OrientationSash value) { m_SelOrientationSashType = value; @@ -794,6 +794,7 @@ namespace WebWindowComplex.Models SelHardware = m_HardwareList.FirstOrDefault(x => x.Id.Equals(sId)) ?? new Hardware(CustomHwId, "", "", Enums.OpeningTypes.Null, "", 0, 0); if (SelHardware.Id == "") SelHardware = m_HardwareList.First(); + ReqRefreshHwOption(); } #endregion Internal Methods @@ -816,7 +817,7 @@ namespace WebWindowComplex.Models private string m_CurrShape = ""; private List m_HardwareList = new List(); - private List m_HwdOptionList = new List(); + private List m_HwdOptionList = new List(); private List m_JointList = new List(); @@ -858,11 +859,6 @@ namespace WebWindowComplex.Models return answ; } - private string FindSashShape() - { - return "Rectangle"; - } - #endregion Private Methods } } \ No newline at end of file diff --git a/WebWindowComplex/ParametriOpzioni.cs b/WebWindowComplex/ParametriOpzioni.cs index b055d1e..90c5c39 100644 --- a/WebWindowComplex/ParametriOpzioni.cs +++ b/WebWindowComplex/ParametriOpzioni.cs @@ -11,7 +11,7 @@ namespace WebWindowComplex private ParametriOpzioniParametri[] itemsField; /// - //[System.Xml.Serialization.XmlElementAttribute("Parametri", Form = System.Xml.Schema.XmlSchemaForm.Unqualified)] + [System.Xml.Serialization.XmlElementAttribute("Parametri", Form = System.Xml.Schema.XmlSchemaForm.Unqualified)] public ParametriOpzioniParametri[] Items { get @@ -42,7 +42,7 @@ namespace WebWindowComplex private ParametriOpzioniParametriOpzioni[] opzioniField; /// - //[System.Xml.Serialization.XmlElementAttribute(Form = System.Xml.Schema.XmlSchemaForm.Unqualified)] + [System.Xml.Serialization.XmlElementAttribute(Form = System.Xml.Schema.XmlSchemaForm.Unqualified)] public string NomeParametro { get @@ -56,7 +56,7 @@ namespace WebWindowComplex } /// - //[System.Xml.Serialization.XmlElementAttribute(Form = System.Xml.Schema.XmlSchemaForm.Unqualified)] + [System.Xml.Serialization.XmlElementAttribute(Form = System.Xml.Schema.XmlSchemaForm.Unqualified)] public string DescrizioneParametro { get @@ -70,7 +70,7 @@ namespace WebWindowComplex } /// - //[System.Xml.Serialization.XmlElementAttribute(Form = System.Xml.Schema.XmlSchemaForm.Unqualified)] + [System.Xml.Serialization.XmlElementAttribute(Form = System.Xml.Schema.XmlSchemaForm.Unqualified)] public string ValoreCorrente { get @@ -84,7 +84,7 @@ namespace WebWindowComplex } /// - //[System.Xml.Serialization.XmlElementAttribute(Form = System.Xml.Schema.XmlSchemaForm.Unqualified)] + [System.Xml.Serialization.XmlElementAttribute(Form = System.Xml.Schema.XmlSchemaForm.Unqualified)] public string Tipo { get @@ -98,7 +98,7 @@ namespace WebWindowComplex } /// - //[System.Xml.Serialization.XmlElementAttribute(Form = System.Xml.Schema.XmlSchemaForm.Unqualified)] + [System.Xml.Serialization.XmlElementAttribute(Form = System.Xml.Schema.XmlSchemaForm.Unqualified)] public string Visible { get @@ -112,7 +112,7 @@ namespace WebWindowComplex } /// - //[System.Xml.Serialization.XmlElementAttribute(Form = System.Xml.Schema.XmlSchemaForm.Unqualified)] + [System.Xml.Serialization.XmlElementAttribute(Form = System.Xml.Schema.XmlSchemaForm.Unqualified)] public string RicalcolaSeModificato { get @@ -126,7 +126,7 @@ namespace WebWindowComplex } /// - //[System.Xml.Serialization.XmlElementAttribute("Opzioni", Form = System.Xml.Schema.XmlSchemaForm.Unqualified)] + [System.Xml.Serialization.XmlElementAttribute("Opzioni", Form = System.Xml.Schema.XmlSchemaForm.Unqualified)] public ParametriOpzioniParametriOpzioni[] Opzioni { get @@ -149,7 +149,7 @@ namespace WebWindowComplex private string valoreField; /// - //[System.Xml.Serialization.XmlElementAttribute(Form = System.Xml.Schema.XmlSchemaForm.Unqualified)] + [System.Xml.Serialization.XmlElementAttribute(Form = System.Xml.Schema.XmlSchemaForm.Unqualified)] public string NomeParametro { get @@ -163,7 +163,7 @@ namespace WebWindowComplex } /// - //[System.Xml.Serialization.XmlElementAttribute(Form = System.Xml.Schema.XmlSchemaForm.Unqualified)] + [System.Xml.Serialization.XmlElementAttribute(Form = System.Xml.Schema.XmlSchemaForm.Unqualified)] public string DescrizioneOpzione { get @@ -177,7 +177,7 @@ namespace WebWindowComplex } /// - //[System.Xml.Serialization.XmlElementAttribute(Form = System.Xml.Schema.XmlSchemaForm.Unqualified)] + [System.Xml.Serialization.XmlElementAttribute(Form = System.Xml.Schema.XmlSchemaForm.Unqualified)] public string Valore { get diff --git a/WebWindowComplex/TableComp.razor.cs b/WebWindowComplex/TableComp.razor.cs index 227d29a..4f7ebb2 100644 --- a/WebWindowComplex/TableComp.razor.cs +++ b/WebWindowComplex/TableComp.razor.cs @@ -696,6 +696,18 @@ namespace WebWindowComplex } if (updRequested) { + // se mancasse xml opzioni hardware lo chiedo + if (string.IsNullOrEmpty(LiveData.OptionsXml)) + { + foreach(var item in SashList) + { + string req = item.SelHardware.Id; + if (string.IsNullOrEmpty(req)) + { + await DoReqOptHardware(); + } + } + } // se mancasse dizionario forme chiamo quello if (LiveData.DictShape.Count == 0) { @@ -750,11 +762,16 @@ namespace WebWindowComplex // Inserisco le forme ricevuto nei sash group foreach (var item in LiveData.DictShape) { - Sash sashNewShape = SashList.Where(x => x.GroupId == item.Key).ToList().First(); - sashNewShape.SashShape = item.Value; - sashNewShape.UpdateShape(item.Value); + Sash sashFromGroupId = SashList.Where(x => x.GroupId == item.Key).ToList().First(); + sashFromGroupId.SashShape = item.Value; + sashFromGroupId.UpdateShape(item.Value); } - // aggiorno SVG + } + // se ho le opzioni hw le aggiungo + if (!string.IsNullOrEmpty(LiveData.OptionsXml)) + { + foreach (var item in SashList) + item.SetHardwareOption(LiveData.OptionsXml); } } @@ -871,16 +888,21 @@ namespace WebWindowComplex /// /// /// - private async Task AddSashIntoSplit(DataAreaSplitted Args) + private void AddSashIntoSplit(DataAreaSplitted Args) { Splitted currSplitted = Args.splitted; - bError = currSplitted.AddFirstSash(); - await DoPreviewSvg(); + currSplitted.AddFirstSash(); + // ricalcolo liste + UpdateLists(); + // richiedo update shape + List reqList = SashList.Select(x => x.GroupId).ToList(); + _ = DoReqShape(reqList); + //await DoPreviewSvg(); } private void AddSashToFrame(Frame f) { - bError = f.AddFirstSash(); + f.AddFirstSash(); // ricalcolo liste UpdateLists(); // richiedo update shape @@ -1288,7 +1310,9 @@ namespace WebWindowComplex /// nuova sash /// private async Task UpdateHwOptions(Sash newSash) - { + { + // richiesta calcolo opzioni hardware per la singola sash group + string req = newSash.SelHardware.Id; await DoReqOptHardware(); } diff --git a/WebWindowComplex/WebWindowComplex.csproj b/WebWindowComplex/WebWindowComplex.csproj index 63f768a..268a014 100644 --- a/WebWindowComplex/WebWindowComplex.csproj +++ b/WebWindowComplex/WebWindowComplex.csproj @@ -6,7 +6,7 @@ net8.0 enable enable - 2.7.10.2317 + 2.7.10.2713 Annamaria Sassi Egalware Componente gestione Configurazioni avanzate Window per LUX @@ -123,6 +123,20 @@ + + + + + + + + + + + + + + diff --git a/WebWindowConfigurator/WebWindowConfigurator.csproj b/WebWindowConfigurator/WebWindowConfigurator.csproj index 7e103b8..40ee117 100644 --- a/WebWindowConfigurator/WebWindowConfigurator.csproj +++ b/WebWindowConfigurator/WebWindowConfigurator.csproj @@ -6,7 +6,7 @@ net8.0 enable enable - 2.7.10.2317 + 2.7.10.2713 Annamaria Sassi Egalware Componente gestione JWD per LUX @@ -210,6 +210,8 @@ + + From f187bbe5c5e6ed1bc41100375c37939fceedb43b Mon Sep 17 00:00:00 2001 From: Annamaria Sassi Date: Mon, 27 Oct 2025 14:40:15 +0100 Subject: [PATCH 13/26] Correzione struttura select --- WebWindowComplex/Compo/AreaSash.razor | 8 +++---- WebWindowComplex/Compo/CardFrame.razor | 10 ++++---- WebWindowComplex/Compo/CardSplit.razor | 20 ++++++++-------- WebWindowComplex/Compo/EditDimensions.razor | 2 +- WebWindowComplex/Compo/EditJoint.razor | 2 +- WebWindowComplex/Compo/General.razor | 24 +++++++++---------- WebWindowComplex/WebWindowComplex.csproj | 7 +++++- .../WebWindowConfigurator.csproj | 4 +++- 8 files changed, 42 insertions(+), 35 deletions(-) diff --git a/WebWindowComplex/Compo/AreaSash.razor b/WebWindowComplex/Compo/AreaSash.razor index b5f958a..8f50168 100644 --- a/WebWindowComplex/Compo/AreaSash.razor +++ b/WebWindowComplex/Compo/AreaSash.razor @@ -3,8 +3,8 @@
Sash @(CurrSashGroup.SashList.Count == 1 ? "" : (IndexSash + 1))
- - @@ -26,10 +26,10 @@
- +
- +
@if (!(CurrAnta.AreaList[0] is Split)) diff --git a/WebWindowComplex/Compo/CardFrame.razor b/WebWindowComplex/Compo/CardFrame.razor index c5c2d09..a01154e 100644 --- a/WebWindowComplex/Compo/CardFrame.razor +++ b/WebWindowComplex/Compo/CardFrame.razor @@ -15,8 +15,8 @@
- - @@ -45,8 +45,8 @@
Threshold
- - @@ -91,7 +91,7 @@
- Quantity + Quantity
diff --git a/WebWindowComplex/Compo/CardSplit.razor b/WebWindowComplex/Compo/CardSplit.razor index f2fa5e4..55b2a7e 100644 --- a/WebWindowComplex/Compo/CardSplit.razor +++ b/WebWindowComplex/Compo/CardSplit.razor @@ -32,8 +32,8 @@
- - @@ -47,7 +47,7 @@ {
- QtyVert + QtyVert
@@ -56,7 +56,7 @@ {
- QtyHoriz + QtyHoriz
@@ -69,7 +69,7 @@ @foreach (var dim in CurrItem.SplitVertList) {
- Width + Width %
@@ -79,7 +79,7 @@ @foreach (var dim in CurrItem.SplitHorizList) {
- Height + Height %
@@ -92,7 +92,7 @@ {
- Height + Height %
@@ -105,7 +105,7 @@ {
- Width + Width %
@@ -119,10 +119,10 @@
- +
- +
diff --git a/WebWindowComplex/Compo/EditDimensions.razor b/WebWindowComplex/Compo/EditDimensions.razor index 9ac6cfe..76255e9 100644 --- a/WebWindowComplex/Compo/EditDimensions.razor +++ b/WebWindowComplex/Compo/EditDimensions.razor @@ -1,6 +1,6 @@ 
- @CurrRec.sName + @CurrRec.sName mm
diff --git a/WebWindowComplex/Compo/EditJoint.razor b/WebWindowComplex/Compo/EditJoint.razor index 0d8232c..95e89fd 100644 --- a/WebWindowComplex/Compo/EditJoint.razor +++ b/WebWindowComplex/Compo/EditJoint.razor @@ -1,6 +1,6 @@ @using static WebWindowComplex.LayoutConst
- + + +
- - @foreach (string profile in ListPayload.Profile) { @@ -41,8 +41,8 @@
- - @foreach (string glass in ListPayload.Glass) { @@ -50,8 +50,8 @@
- - @@ -65,8 +65,8 @@
- - @foreach (string colorMaterial in ListPayload.ColorMaterial) { @@ -74,8 +74,8 @@
- - diff --git a/WebWindowComplex/WebWindowComplex.csproj b/WebWindowComplex/WebWindowComplex.csproj index 268a014..a1ab187 100644 --- a/WebWindowComplex/WebWindowComplex.csproj +++ b/WebWindowComplex/WebWindowComplex.csproj @@ -6,7 +6,7 @@ net8.0 enable enable - 2.7.10.2713 + 2.7.10.2714 Annamaria Sassi Egalware Componente gestione Configurazioni avanzate Window per LUX @@ -146,6 +146,11 @@ + + + + + diff --git a/WebWindowConfigurator/WebWindowConfigurator.csproj b/WebWindowConfigurator/WebWindowConfigurator.csproj index 40ee117..9b8287e 100644 --- a/WebWindowConfigurator/WebWindowConfigurator.csproj +++ b/WebWindowConfigurator/WebWindowConfigurator.csproj @@ -6,7 +6,7 @@ net8.0 enable enable - 2.7.10.2713 + 2.7.10.2714 Annamaria Sassi Egalware Componente gestione JWD per LUX @@ -212,6 +212,8 @@ + + From 960d20e256c80cff69aeb70b5754df8f91efecae Mon Sep 17 00:00:00 2001 From: Annamaria Sassi Date: Mon, 27 Oct 2025 16:32:07 +0100 Subject: [PATCH 14/26] Aggiornato gestione AGBOptionText --- WebWindowComplex/Compo/CardSashGroup.razor | 17 +++--- WebWindowComplex/Compo/CardSashGroup.razor.cs | 22 +++++++- WebWindowComplex/Compo/EditOptionText.razor | 9 ++++ .../Compo/EditOptionText.razor.cs | 36 +++++++++++++ WebWindowComplex/Json/WindowConst.cs | 7 +++ WebWindowComplex/Models/AGBOption.cs | 15 +----- WebWindowComplex/Models/AGBOptionCombo.cs | 3 +- WebWindowComplex/Models/AGBOptionText.cs | 52 ++++++++++++++++++- WebWindowComplex/Models/Sash.cs | 20 +++---- WebWindowComplex/WebWindowComplex.csproj | 10 +++- .../WebWindowConfigurator.csproj | 13 ++++- 11 files changed, 164 insertions(+), 40 deletions(-) create mode 100644 WebWindowComplex/Compo/EditOptionText.razor create mode 100644 WebWindowComplex/Compo/EditOptionText.razor.cs diff --git a/WebWindowComplex/Compo/CardSashGroup.razor b/WebWindowComplex/Compo/CardSashGroup.razor index f67b953..b793057 100644 --- a/WebWindowComplex/Compo/CardSashGroup.razor +++ b/WebWindowComplex/Compo/CardSashGroup.razor @@ -1,4 +1,4 @@ -@using static WebWindowComplex.LayoutConst +@using static WebWindowComplex.Json.WindowConst
@@ -123,25 +123,22 @@
Hardware option
- @if (CurrItem.HwdOptionList.Count > 0) + @if (CurrItem.HwOptionList.Count > 0) { - @foreach (var currOpt in CurrItem.HwdOptionList) + @foreach (var currOpt in CurrItem.HwOptionList) { switch (currOpt.Type) { - case AGBOption.HDWOPTIONTYPES.COMBO: + case HwOptionTypes.COMBO: { AGBOptionCombo currOptCombo = (AGBOptionCombo)currOpt; - + break; } - case AGBOption.HDWOPTIONTYPES.TEXT: + case HwOptionTypes.TEXT: { AGBOptionText currOptText = (AGBOptionText)currOpt; -
- @(currOptText.sName) - -
+ break; } } diff --git a/WebWindowComplex/Compo/CardSashGroup.razor.cs b/WebWindowComplex/Compo/CardSashGroup.razor.cs index 555ce9f..c36f31a 100644 --- a/WebWindowComplex/Compo/CardSashGroup.razor.cs +++ b/WebWindowComplex/Compo/CardSashGroup.razor.cs @@ -1,5 +1,6 @@ using Microsoft.AspNetCore.Components; using WebWindowComplex.Models; +using static WebWindowComplex.Json.WindowConst; namespace WebWindowComplex.Compo { @@ -169,10 +170,27 @@ namespace WebWindowComplex.Compo /// /// /// - private async Task UpdateOpt(AGBOptionCombo updRec) + private async Task UpdateOptCombo(AGBOptionCombo updRec) { // cerco il record - var currRec = CurrItem.HwdOptionList.FirstOrDefault(x => x.sName == updRec.sName && x.sDescription == updRec.sDescription); + var currRec = CurrItem.HwOptionList.FirstOrDefault(x => x.sName == updRec.sName && x.sDescription == updRec.sDescription); + // lo aggiorno + if (updRec != null) + { + currRec = updRec; + await EC_UpdateSash.InvokeAsync(CurrItem); + } + } + + /// + /// Report aggiornamento Option Text + /// + /// + /// + private async Task UpdateOptText(AGBOptionText updRec) + { + // cerco il record + var currRec = CurrItem.HwOptionList.FirstOrDefault(x => x.sName == updRec.sName && x.sDescription == updRec.sDescription); // lo aggiorno if (updRec != null) { diff --git a/WebWindowComplex/Compo/EditOptionText.razor b/WebWindowComplex/Compo/EditOptionText.razor new file mode 100644 index 0000000..a26b8f6 --- /dev/null +++ b/WebWindowComplex/Compo/EditOptionText.razor @@ -0,0 +1,9 @@ +
+ + +
\ No newline at end of file diff --git a/WebWindowComplex/Compo/EditOptionText.razor.cs b/WebWindowComplex/Compo/EditOptionText.razor.cs new file mode 100644 index 0000000..55b5d12 --- /dev/null +++ b/WebWindowComplex/Compo/EditOptionText.razor.cs @@ -0,0 +1,36 @@ +using Microsoft.AspNetCore.Components; +using WebWindowComplex.Models; + +namespace WebWindowComplex.Compo +{ + public partial class EditOptionText + { + #region Public Properties + + [Parameter] + public AGBOptionText CurrOpt { get; set; } = null!; + + [Parameter] + public EventCallback EC_Update { get; set; } + + #endregion Public Properties + + #region Private Properties + + private string CurrValue + { + get => CurrOpt.sValue; + set + { + if (CurrOpt.sValue != value) + { + CurrOpt.sValue = CurrOpt.ValueList.FirstOrDefault(x => x == value); + _ = EC_Update.InvokeAsync(CurrOpt); + } + } + } + + #endregion Private Properties + + } +} \ No newline at end of file diff --git a/WebWindowComplex/Json/WindowConst.cs b/WebWindowComplex/Json/WindowConst.cs index c9eb397..2eedc6f 100644 --- a/WebWindowComplex/Json/WindowConst.cs +++ b/WebWindowComplex/Json/WindowConst.cs @@ -110,6 +110,13 @@ namespace WebWindowComplex.Json HORIZONTAL = 2 } + public enum HwOptionTypes : int + { + TEXT = 1, + LENGHT = 2, + COMBO = 3 + } + // Specifies the display state of an element. public enum Visibility { diff --git a/WebWindowComplex/Models/AGBOption.cs b/WebWindowComplex/Models/AGBOption.cs index e144eb7..e92e902 100644 --- a/WebWindowComplex/Models/AGBOption.cs +++ b/WebWindowComplex/Models/AGBOption.cs @@ -20,17 +20,6 @@ namespace WebWindowComplex.Models #endregion Public Constructors - #region Public Enums - - public enum HDWOPTIONTYPES : int - { - TEXT = 1, - LENGHT = 2, - COMBO = 3 - } - - #endregion Public Enums - #region Public Properties public Visibility OptVisibility @@ -57,7 +46,7 @@ namespace WebWindowComplex.Models } } - public HDWOPTIONTYPES Type + public HwOptionTypes Type { get { @@ -69,7 +58,7 @@ namespace WebWindowComplex.Models #region Protected Fields - protected HDWOPTIONTYPES m_Type; + protected HwOptionTypes m_Type; #endregion Protected Fields diff --git a/WebWindowComplex/Models/AGBOptionCombo.cs b/WebWindowComplex/Models/AGBOptionCombo.cs index dfc41e4..4cbe031 100644 --- a/WebWindowComplex/Models/AGBOptionCombo.cs +++ b/WebWindowComplex/Models/AGBOptionCombo.cs @@ -3,6 +3,7 @@ using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; +using static WebWindowComplex.Json.WindowConst; namespace WebWindowComplex.Models { @@ -12,7 +13,7 @@ namespace WebWindowComplex.Models public AGBOptionCombo(ParametriOpzioniParametri HdwOptionParam) : base(HdwOptionParam) { - m_Type = HDWOPTIONTYPES.COMBO; + m_Type = HwOptionTypes.COMBO; foreach (var Value in HdwOptionParam.Opzioni) m_ValueList.Add(new AGBOptionParameter(Value.Valore, Value.DescrizioneOpzione)); m_sValue = m_ValueList.FirstOrDefault(x => x.sValue == HdwOptionParam.ValoreCorrente) ?? new AGBOptionParameter("", ""); diff --git a/WebWindowComplex/Models/AGBOptionText.cs b/WebWindowComplex/Models/AGBOptionText.cs index 32bcc35..fbb5b6d 100644 --- a/WebWindowComplex/Models/AGBOptionText.cs +++ b/WebWindowComplex/Models/AGBOptionText.cs @@ -3,17 +3,55 @@ using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; +using static WebWindowComplex.Json.WindowConst; namespace WebWindowComplex.Models { + //public class AGBOptionText : AGBOption + //{ + // #region Public Constructors + + // public AGBOptionText(ParametriOpzioniParametri HdwOptionParam) : base(HdwOptionParam) + // { + // m_Type = HdwOptionTypes.TEXT; + // m_sValue = HdwOptionParam.ValoreCorrente; + // } + + // #endregion Public Constructors + + // #region Public Properties + + // public string sValue + // { + // get + // { + // return m_sValue; + // } + // set + // { + // m_sValue = value; + // } + // } + + // #endregion Public Properties + + // #region Private Fields + + // private string m_sValue; + + // #endregion Private Fields + //} + public class AGBOptionText : AGBOption { #region Public Constructors public AGBOptionText(ParametriOpzioniParametri HdwOptionParam) : base(HdwOptionParam) { - m_Type = HDWOPTIONTYPES.TEXT; - m_sValue = HdwOptionParam.ValoreCorrente; + m_Type = HwOptionTypes.TEXT; + foreach (var Value in HdwOptionParam.Opzioni) + m_ValueList.Add(Value.Valore); + m_sValue = m_ValueList.FirstOrDefault(x => x == HdwOptionParam.ValoreCorrente) ?? ""; } #endregion Public Constructors @@ -32,12 +70,22 @@ namespace WebWindowComplex.Models } } + public List ValueList + { + get + { + return m_ValueList; + } + } + #endregion Public Properties #region Private Fields private string m_sValue; + private List m_ValueList = new List(); #endregion Private Fields } + } \ No newline at end of file diff --git a/WebWindowComplex/Models/Sash.cs b/WebWindowComplex/Models/Sash.cs index 2c5dd6e..b9ee70b 100644 --- a/WebWindowComplex/Models/Sash.cs +++ b/WebWindowComplex/Models/Sash.cs @@ -80,7 +80,7 @@ namespace WebWindowComplex.Models } } - public List HwdOptionList + public List HwOptionList { get { @@ -478,7 +478,7 @@ namespace WebWindowComplex.Models /// public void ReqRefreshHwOption() { - HwdOptionList.Clear(); + HwOptionList.Clear(); // chiamata evento calcolo opzioni hardware OnReqHwOptionPreview(m_ParentWindow.sSerialized(), SelHardware.Id); } @@ -513,7 +513,7 @@ namespace WebWindowComplex.Models } RefreshHardwareList(); // se il vecchio hw selezionato non va più bene viene selezionato il primo della lista - if(!HardwareList.Contains(m_SelHardware) && m_SelHardware.Shape != m_CurrShape) + if(!HardwareList.Contains(m_SelHardware) || m_SelHardware.Shape != m_CurrShape) SetFirstHardware(); } @@ -691,25 +691,25 @@ namespace WebWindowComplex.Models { if (!string.IsNullOrEmpty(OptionXml)) { - ParametriOpzioni HwdOptions = null; + ParametriOpzioni HwOptions = null; XmlSerializer serializer = new XmlSerializer(typeof(ParametriOpzioni)); StringReader reader = new StringReader(OptionXml); - HwdOptions = (ParametriOpzioni)serializer.Deserialize(reader); - if (HwdOptions.Items != null) + HwOptions = (ParametriOpzioni)serializer.Deserialize(reader); + if (HwOptions.Items != null) { m_HwdOptionList.Clear(); - foreach (var HdwOption in HwdOptions.Items) + foreach (var HwOption in HwOptions.Items) { - switch (HdwOption.Tipo) + switch (HwOption.Tipo) { case "Text": { - m_HwdOptionList.Add(new AGBOptionText(HdwOption)); + m_HwdOptionList.Add(new AGBOptionText(HwOption)); break; } case "List": { - m_HwdOptionList.Add(new AGBOptionCombo(HdwOption)); + m_HwdOptionList.Add(new AGBOptionCombo(HwOption)); break; } } diff --git a/WebWindowComplex/WebWindowComplex.csproj b/WebWindowComplex/WebWindowComplex.csproj index a1ab187..6a261f2 100644 --- a/WebWindowComplex/WebWindowComplex.csproj +++ b/WebWindowComplex/WebWindowComplex.csproj @@ -6,7 +6,7 @@ net8.0 enable enable - 2.7.10.2714 + 2.7.10.2716 Annamaria Sassi Egalware Componente gestione Configurazioni avanzate Window per LUX @@ -148,6 +148,14 @@ + + + + + + + + diff --git a/WebWindowConfigurator/WebWindowConfigurator.csproj b/WebWindowConfigurator/WebWindowConfigurator.csproj index 9b8287e..9ddb469 100644 --- a/WebWindowConfigurator/WebWindowConfigurator.csproj +++ b/WebWindowConfigurator/WebWindowConfigurator.csproj @@ -6,7 +6,7 @@ net8.0 enable enable - 2.7.10.2714 + 2.7.10.2716 Annamaria Sassi Egalware Componente gestione JWD per LUX @@ -205,6 +205,17 @@ + + + + + + + + + + + From eaea52f45d3d36ae997ab5dbd6b117ea4d7a0186 Mon Sep 17 00:00:00 2001 From: Annamaria Sassi Date: Tue, 28 Oct 2025 15:04:04 +0100 Subject: [PATCH 15/26] Serializzazione hw option nel JWD --- Test.UI/Data/AntaDoppia.jwd | 90 ++++++++++--------- WebWindowComplex/Json/JsonUtility.cs | 60 +++++++++++++ WebWindowComplex/Models/AGBOption.cs | 17 +++- WebWindowComplex/Models/AGBOptionCombo.cs | 11 +++ WebWindowComplex/Models/AGBOptionText.cs | 11 +++ WebWindowComplex/Models/Sash.cs | 2 + WebWindowComplex/TableComp.razor | 9 +- WebWindowComplex/TableComp.razor.cs | 16 +++- WebWindowComplex/WebWindowComplex.csproj | 3 +- .../WebWindowConfigurator.csproj | 11 ++- 10 files changed, 175 insertions(+), 55 deletions(-) diff --git a/Test.UI/Data/AntaDoppia.jwd b/Test.UI/Data/AntaDoppia.jwd index b81a6b1..86e2fa4 100644 --- a/Test.UI/Data/AntaDoppia.jwd +++ b/Test.UI/Data/AntaDoppia.jwd @@ -10,30 +10,30 @@ { "nIndex": 1, "sName": "Width", - "dValue": 1200.0 + "dValue": 800.0 }, { "nIndex": 2, "sName": "Height", - "dValue": 1500.0 + "dValue": 1200.0 } ], "JointList": [ { "nIndex": 1, - "JointType": "FULL_V" + "JointType": "FULL_H" }, { "nIndex": 2, - "JointType": "FULL_V" + "JointType": "FULL_H" }, { "nIndex": 3, - "JointType": "FULL_V" + "JointType": "FULL_H" }, { "nIndex": 4, - "JointType": "FULL_V" + "JointType": "FULL_H" } ], "BottomRail": false, @@ -45,62 +45,72 @@ "SashList": [ { "nSashId": 1, - "OpeningType": "TURNONLY_LEFT", - "bHasHandle": false, - "dDimension": 50.0 - }, - { - "nSashId": 2, - "OpeningType": "TILTTURN_RIGHT", + "OpeningType": "TILTTURN_LEFT", "bHasHandle": true, - "dDimension": 50.0 + "dDimension": 100.0 } ], "SashType": "NULL", "JointList": [ { "nIndex": 1, - "JointType": "FULL_V" + "JointType": "FULL_H" }, { "nIndex": 2, - "JointType": "FULL_V" + "JointType": "FULL_H" }, { "nIndex": 3, - "JointType": "FULL_V" + "JointType": "FULL_H" }, { "nIndex": 4, - "JointType": "FULL_V" + "JointType": "FULL_H" + } + ], + "BottomRail": false, + "BottomRailQty": 0, + "Hardware": "000632", + "HwOptionList": [ + { + "Name": "Entrata", + "Value": "15 mm", + "Type": "Combo" + }, + { + "Name": "LavManigliaPassante", + "Value": "No", + "Type": "Combo" + }, + { + "Name": "PosizioneForoCilindro", + "Value": "Cilindro sopra la maniglia", + "Type": "Combo" + }, + { + "Name": "ModelloCilindro", + "Value": "Nessun cilindro", + "Type": "Combo" + }, + { + "Name": "LavCilindroPassante", + "Value": "No", + "Type": "Combo" + }, + { + "Name": "HMan", + "Value": "", + "Type": "Text" } ], - "Hardware": "000631", "GroupId": 2, "AreaList": [ { + "FillType": "GLASS", "GroupId": 3, - "AreaList": [ - { - "GroupId": 4, - "FillType": "GLASS", - "AreaList": [], - "AreaType": "FILL" - } - ], - "AreaType": "SPLITTED" - }, - { - "GroupId": 5, - "AreaList": [ - { - "FillType": "GLASS", - "GroupId": 6, - "AreaList": [], - "AreaType": "FILL" - } - ], - "AreaType": "SPLITTED" + "AreaList": [], + "AreaType": "FILL" } ], "AreaType": "SASH" diff --git a/WebWindowComplex/Json/JsonUtility.cs b/WebWindowComplex/Json/JsonUtility.cs index 70cb19a..110e931 100644 --- a/WebWindowComplex/Json/JsonUtility.cs +++ b/WebWindowComplex/Json/JsonUtility.cs @@ -367,6 +367,20 @@ namespace WebWindowComplex.Json } } + private List m_HwOptionList = new List(); + [JsonProperty] + public List HwOptionList + { + get + { + return m_HwOptionList; + } + set + { + m_HwOptionList = value; + } + } + public JsonSash() : base(AreaTypes.SASH) { } @@ -401,6 +415,8 @@ namespace WebWindowComplex.Json newSash.SetSelFamilyHardwareFromIndex(Hardware); newSash.ReqRefreshShape(); newSash.SetSelHardwareFromId(Hardware); + //foreach (var HwOption in m_HwOptionList) + // newSash.HwOptionList.Add(HwOption.Deserialize()); foreach (var Area in AreaList) { var AreaDeserealized = Area.Deserialize(newSash, ParentWindow); @@ -640,6 +656,50 @@ namespace WebWindowComplex.Json } } + public class JsonHwOption + { + private string m_Name; + [JsonProperty] + public string Name + { + get + { + return m_Name; + } + set + { + m_Name = value; + } + } + + private string m_Value; + [JsonProperty] + public string Value + { + get + { + return m_Value; + } + set + { + m_Value = value; + } + } + + public JsonHwOption(string sName, string sValue) + { + m_Name = sName; + m_Value = sValue; + } + + //internal AGBOption Deserialize() + //{ + // AGBOption newOption = new AGBOption(m_Name, m_Value); + // return newOption; + //} + + } + public class JsonFrameDimension { private int m_nIndex; diff --git a/WebWindowComplex/Models/AGBOption.cs b/WebWindowComplex/Models/AGBOption.cs index e92e902..f6e3f36 100644 --- a/WebWindowComplex/Models/AGBOption.cs +++ b/WebWindowComplex/Models/AGBOption.cs @@ -3,6 +3,7 @@ using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; +using WebWindowComplex.Json; using static WebWindowComplex.Json.WindowConst; namespace WebWindowComplex.Models @@ -11,11 +12,16 @@ namespace WebWindowComplex.Models { #region Public Constructors + /// + /// Costruttore partendo da xml + /// + /// public AGBOption(ParametriOpzioniParametri HdwOptionParam) { m_sName = HdwOptionParam.NomeParametro; m_sDescription = HdwOptionParam.DescrizioneParametro; - m_OptVisibility = Visibility.VISIBLE; // If(HdwOptionParam.Visible.ToLower = "true", Visibility.Visible, Visibility.Collapsed) + m_OptVisibility = Visibility.VISIBLE; + // If(HdwOptionParam.Visible.ToLower = "true", Visibility.Visible, Visibility.Collapsed) } #endregion Public Constructors @@ -56,6 +62,15 @@ namespace WebWindowComplex.Models #endregion Public Properties + #region Internal Methods + + internal virtual JsonHwOption Serialize() + { + return null; + } + + #endregion Internal Methods + #region Protected Fields protected HwOptionTypes m_Type; diff --git a/WebWindowComplex/Models/AGBOptionCombo.cs b/WebWindowComplex/Models/AGBOptionCombo.cs index 4cbe031..352fe03 100644 --- a/WebWindowComplex/Models/AGBOptionCombo.cs +++ b/WebWindowComplex/Models/AGBOptionCombo.cs @@ -3,6 +3,7 @@ using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; +using WebWindowComplex.Json; using static WebWindowComplex.Json.WindowConst; namespace WebWindowComplex.Models @@ -45,6 +46,16 @@ namespace WebWindowComplex.Models #endregion Public Properties + #region Internal Methods + + internal override JsonHwOption Serialize() + { + JsonHwOption JsonHwOption = new JsonHwOption(sName, m_sValue.sDescription); + return JsonHwOption; + } + + #endregion Internal Methods + #region Private Fields private AGBOptionParameter m_sValue; diff --git a/WebWindowComplex/Models/AGBOptionText.cs b/WebWindowComplex/Models/AGBOptionText.cs index fbb5b6d..d325dbb 100644 --- a/WebWindowComplex/Models/AGBOptionText.cs +++ b/WebWindowComplex/Models/AGBOptionText.cs @@ -3,6 +3,7 @@ using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; +using WebWindowComplex.Json; using static WebWindowComplex.Json.WindowConst; namespace WebWindowComplex.Models @@ -80,6 +81,16 @@ namespace WebWindowComplex.Models #endregion Public Properties + #region Internal Methods + + internal override JsonHwOption Serialize() + { + JsonHwOption JsonHwOption = new JsonHwOption(sName, m_sValue); + return JsonHwOption; + } + + #endregion Internal Methods + #region Private Fields private string m_sValue; diff --git a/WebWindowComplex/Models/Sash.cs b/WebWindowComplex/Models/Sash.cs index b9ee70b..349d67e 100644 --- a/WebWindowComplex/Models/Sash.cs +++ b/WebWindowComplex/Models/Sash.cs @@ -655,6 +655,8 @@ namespace WebWindowComplex.Models JsonSash.SashList.Add(SashDimension.Serialize()); foreach (var Joint in JointList) JsonSash.JointList.Add(Joint.Serialize()); + foreach (var HwOption in HwOptionList) + JsonSash.HwOptionList.Add(HwOption.Serialize()); foreach (var Area in AreaList) JsonSash.AreaList.Add(Area.Serialize()); return JsonSash; diff --git a/WebWindowComplex/TableComp.razor b/WebWindowComplex/TableComp.razor index c415f98..37e7422 100644 --- a/WebWindowComplex/TableComp.razor +++ b/WebWindowComplex/TableComp.razor @@ -236,11 +236,4 @@ } } } -
- -@if (bError) -{ - -} \ No newline at end of file +
\ No newline at end of file diff --git a/WebWindowComplex/TableComp.razor.cs b/WebWindowComplex/TableComp.razor.cs index 4f7ebb2..bb0f976 100644 --- a/WebWindowComplex/TableComp.razor.cs +++ b/WebWindowComplex/TableComp.razor.cs @@ -571,8 +571,6 @@ namespace WebWindowComplex { // reset editLock... editLock = false; - // reset variabile errori - bError = false; listErrPre = new Dictionary(); listErrLink = new Dictionary(); listWarnings = new Dictionary(); @@ -732,6 +730,10 @@ namespace WebWindowComplex } } + /// + /// Metodo per costruire oggetti della Window + /// + /// protected void setCurrWindow(JsonWindow WindowFromJson) { if (m_CurrWindow != null) @@ -812,8 +814,6 @@ namespace WebWindowComplex #region Private Fields - private bool bError = false; - private int currAnta = 0; private int currFill = -1; @@ -900,6 +900,10 @@ namespace WebWindowComplex //await DoPreviewSvg(); } + /// + /// Metodo per aggiungere una sash di default al Frame + /// + /// private void AddSashToFrame(Frame f) { f.AddFirstSash(); @@ -910,6 +914,10 @@ namespace WebWindowComplex _ = DoReqShape(reqList); } + /// + /// Metodo per aggiungere uno split di default al Frame + /// + /// private void AddSplitToFrame(Frame f) { f.AddSplit(); diff --git a/WebWindowComplex/WebWindowComplex.csproj b/WebWindowComplex/WebWindowComplex.csproj index 6a261f2..92e4482 100644 --- a/WebWindowComplex/WebWindowComplex.csproj +++ b/WebWindowComplex/WebWindowComplex.csproj @@ -6,7 +6,7 @@ net8.0 enable enable - 2.7.10.2716 + 2.7.10.2815 Annamaria Sassi Egalware Componente gestione Configurazioni avanzate Window per LUX @@ -163,5 +163,6 @@ + diff --git a/WebWindowConfigurator/WebWindowConfigurator.csproj b/WebWindowConfigurator/WebWindowConfigurator.csproj index 9ddb469..74ab599 100644 --- a/WebWindowConfigurator/WebWindowConfigurator.csproj +++ b/WebWindowConfigurator/WebWindowConfigurator.csproj @@ -6,7 +6,7 @@ net8.0 enable enable - 2.7.10.2716 + 2.7.10.2815 Annamaria Sassi Egalware Componente gestione JWD per LUX @@ -218,6 +218,15 @@ + + + + + + + + + From 3f8f97c29e4dcec8dae39289f6e2efd088eee0ee Mon Sep 17 00:00:00 2001 From: Samuele Locatelli Date: Wed, 29 Oct 2025 12:38:46 +0100 Subject: [PATCH 16/26] update x dizionario optionsXML --- Test.UI/Components/Pages/EditJWD.razor.cs | 34 +++++++++++++--- WebWindowComplex/DTO/LivePayload.cs | 6 +-- WebWindowComplex/TableComp.razor.cs | 40 +++++++++++++------ WebWindowComplex/WebWindowComplex.csproj | 14 ++++++- .../WebWindowConfigurator.csproj | 15 ++++++- 5 files changed, 85 insertions(+), 24 deletions(-) diff --git a/Test.UI/Components/Pages/EditJWD.razor.cs b/Test.UI/Components/Pages/EditJWD.razor.cs index 0e14743..3dd9cb9 100644 --- a/Test.UI/Components/Pages/EditJWD.razor.cs +++ b/Test.UI/Components/Pages/EditJWD.razor.cs @@ -49,7 +49,7 @@ namespace Test.UI.Components.Pages protected string currJwd = "..."; protected Dictionary m_CurrArgs = new Dictionary(); protected Dictionary currGroupShape = new Dictionary(); - protected string currHwOption = ""; + protected Dictionary currHwOption = new Dictionary(); /// /// Configurazione elenchi anagrafiche @@ -147,7 +147,7 @@ namespace Test.UI.Components.Pages CurrJwd = InitialJwd, SvgPreview = currSvg, DictShape = currGroupShape, - OptionsXml = currHwOption + DictOptionsXml = currHwOption }; DLService.PipeSvg.EA_NewMessage += PipeSvg_EA_NewMessage; DLService.PipeShape.EA_NewMessage += PipeShape_EA_NewMessage; @@ -274,10 +274,32 @@ namespace Test.UI.Components.Pages { if (currArgs.msgUid.StartsWith($"{hwOptionChannel}:{windowUid}")) { - // deserializzo il dizionario delle risposte... - //var rawAns = JsonConvert.DeserializeObject(currArgs.newMessage); - currHwOption = currArgs.newMessage; - CurrData.OptionsXml = currHwOption; + /*-------------------------------------- + * FixMe Todo levare !!! + * - try/catch deserializzazione + * - se fallisse metto le stesse opzioni a ttuti i GroupId + **--------------------------------------*/ + Dictionary rawDict = new Dictionary(); + try + { + // deserializzo il dizionario delle risposte... + rawDict = JsonConvert.DeserializeObject>(currArgs.newMessage) ?? new Dictionary(); + } + catch + { } + if (rawDict.Count == 0) + { + //se il dizionario delle shape esiste uso quello... + if (CurrData.DictShape.Count > 0) + { + foreach (var item in CurrData.DictShape) + { + rawDict.Add(item.Key, currArgs.newMessage); + } + } + } + currHwOption = rawDict ?? new Dictionary(); + CurrData.DictOptionsXml = currHwOption; } await InvokeAsync(StateHasChanged); } diff --git a/WebWindowComplex/DTO/LivePayload.cs b/WebWindowComplex/DTO/LivePayload.cs index a941711..2a35b0f 100644 --- a/WebWindowComplex/DTO/LivePayload.cs +++ b/WebWindowComplex/DTO/LivePayload.cs @@ -30,9 +30,9 @@ namespace WebWindowComplex.DTO public Dictionary DictShape { get; set; } = new Dictionary(); /// - /// XML opzioni HW da verifica JWD + /// Dizionario XML opzioni HW da verifica JWD x GroupId /// - public string OptionsXml { get; set; } = string.Empty; + public Dictionary DictOptionsXml { get; set; } = new Dictionary(); #endregion Public Properties @@ -52,7 +52,7 @@ namespace WebWindowComplex.DTO return false; if (SvgPreview != item.SvgPreview) return false; - if (OptionsXml != item.OptionsXml) + if (!DictUtils.DictAreEqual(DictOptionsXml, item.DictOptionsXml)) return false; if (!DictUtils.DictAreEqual(DictShape, item.DictShape)) return false; diff --git a/WebWindowComplex/TableComp.razor.cs b/WebWindowComplex/TableComp.razor.cs index bb0f976..d36fb35 100644 --- a/WebWindowComplex/TableComp.razor.cs +++ b/WebWindowComplex/TableComp.razor.cs @@ -477,8 +477,9 @@ namespace WebWindowComplex /// /// Richiesta calcolo Options HW da JWD /// + /// Lista degli ID numerici dei gruppi da valutare /// - protected async Task DoReqOptHardware() + protected async Task DoReqOptHardware(List groupIdList) { if (m_CurrWindow != null) { @@ -495,6 +496,8 @@ namespace WebWindowComplex Args.Add("Mode", $"{(int)Enums.QuestionModes.HARDWARE}"); Args.Add("SubMode", $"{(int)Enums.QuestionHwSubModes.HARDWAREOPTIONS}"); Args.Add("Jwd", CurrJwd); + string listGroupId = JsonConvert.SerializeObject(groupIdList); + Args.Add("GroupId", listGroupId); await EC_DoUpdate.InvokeAsync(Args); } } @@ -599,7 +602,7 @@ namespace WebWindowComplex prevLiveData = new LivePayload() { CurrJwd = LiveData.CurrJwd, - OptionsXml = LiveData.OptionsXml, + DictOptionsXml = LiveData.DictOptionsXml, DictShape = LiveData.DictShape, SvgPreview = LiveData.SvgPreview }; @@ -695,15 +698,19 @@ namespace WebWindowComplex if (updRequested) { // se mancasse xml opzioni hardware lo chiedo - if (string.IsNullOrEmpty(LiveData.OptionsXml)) + if (LiveData.DictOptionsXml.Count == 0) { - foreach(var item in SashList) + List reqList = SashList.Select(x => x.GroupId).ToList(); + //foreach (var item in SashList) + //{ + // string req = item.SelHardware.Id; + // if (string.IsNullOrEmpty(req)) + // { + // } + //} + if (reqList.Count > 0) { - string req = item.SelHardware.Id; - if (string.IsNullOrEmpty(req)) - { - await DoReqOptHardware(); - } + await DoReqOptHardware(reqList); } } // se mancasse dizionario forme chiamo quello @@ -770,10 +777,15 @@ namespace WebWindowComplex } } // se ho le opzioni hw le aggiungo - if (!string.IsNullOrEmpty(LiveData.OptionsXml)) + if (LiveData.DictOptionsXml.Count > 0) { foreach (var item in SashList) - item.SetHardwareOption(LiveData.OptionsXml); + { + if (LiveData.DictOptionsXml.ContainsKey(item.GroupId)) + { + item.SetHardwareOption(LiveData.DictOptionsXml[item.GroupId]); + } + } } } @@ -1318,10 +1330,12 @@ namespace WebWindowComplex /// nuova sash /// private async Task UpdateHwOptions(Sash newSash) - { + { // richiesta calcolo opzioni hardware per la singola sash group string req = newSash.SelHardware.Id; - await DoReqOptHardware(); + List reqList = new List() { newSash.GroupId }; + // chiamo con gruppo della nuova sash + await DoReqOptHardware(reqList); } /// diff --git a/WebWindowComplex/WebWindowComplex.csproj b/WebWindowComplex/WebWindowComplex.csproj index 92e4482..9ad9288 100644 --- a/WebWindowComplex/WebWindowComplex.csproj +++ b/WebWindowComplex/WebWindowComplex.csproj @@ -6,7 +6,7 @@ net8.0 enable enable - 2.7.10.2815 + 2.7.10.2912 Annamaria Sassi Egalware Componente gestione Configurazioni avanzate Window per LUX @@ -153,6 +153,18 @@ + + + + + + + + + + + + diff --git a/WebWindowConfigurator/WebWindowConfigurator.csproj b/WebWindowConfigurator/WebWindowConfigurator.csproj index 74ab599..10be022 100644 --- a/WebWindowConfigurator/WebWindowConfigurator.csproj +++ b/WebWindowConfigurator/WebWindowConfigurator.csproj @@ -6,7 +6,7 @@ net8.0 enable enable - 2.7.10.2815 + 2.7.10.2912 Annamaria Sassi Egalware Componente gestione JWD per LUX @@ -223,6 +223,19 @@ + + + + + + + + + + + + + From 86fe130edf24e46f3203e07a996fb1d5aa499473 Mon Sep 17 00:00:00 2001 From: Annamaria Sassi Date: Wed, 29 Oct 2025 14:42:02 +0100 Subject: [PATCH 17/26] Selezione hw option --- Test.UI/Data/AntaDoppia.jwd | 18 ++++------ WebWindowComplex/Json/JsonUtility.cs | 2 ++ WebWindowComplex/Models/Sash.cs | 33 +++++++++++++++++++ WebWindowComplex/TableComp.razor.cs | 4 +++ WebWindowComplex/WebWindowComplex.csproj | 7 +++- .../WebWindowConfigurator.csproj | 8 ++++- 6 files changed, 58 insertions(+), 14 deletions(-) diff --git a/Test.UI/Data/AntaDoppia.jwd b/Test.UI/Data/AntaDoppia.jwd index 86e2fa4..a44e672 100644 --- a/Test.UI/Data/AntaDoppia.jwd +++ b/Test.UI/Data/AntaDoppia.jwd @@ -75,33 +75,27 @@ "HwOptionList": [ { "Name": "Entrata", - "Value": "15 mm", - "Type": "Combo" + "Value": "15 mm" }, { "Name": "LavManigliaPassante", - "Value": "No", - "Type": "Combo" + "Value": "No" }, { "Name": "PosizioneForoCilindro", - "Value": "Cilindro sopra la maniglia", - "Type": "Combo" + "Value": "Cilindro sopra la maniglia" }, { "Name": "ModelloCilindro", - "Value": "Nessun cilindro", - "Type": "Combo" + "Value": "Nessun cilindro" }, { "Name": "LavCilindroPassante", - "Value": "No", - "Type": "Combo" + "Value": "No" }, { "Name": "HMan", - "Value": "", - "Type": "Text" + "Value": "" } ], "GroupId": 2, diff --git a/WebWindowComplex/Json/JsonUtility.cs b/WebWindowComplex/Json/JsonUtility.cs index 110e931..f8d35e0 100644 --- a/WebWindowComplex/Json/JsonUtility.cs +++ b/WebWindowComplex/Json/JsonUtility.cs @@ -416,6 +416,8 @@ namespace WebWindowComplex.Json newSash.ReqRefreshShape(); newSash.SetSelHardwareFromId(Hardware); //foreach (var HwOption in m_HwOptionList) + // newSash.SelHwOptionList.Add(HwOption.Name, HwOption.Value); + //foreach (var HwOption in m_HwOptionList) // newSash.HwOptionList.Add(HwOption.Deserialize()); foreach (var Area in AreaList) { diff --git a/WebWindowComplex/Models/Sash.cs b/WebWindowComplex/Models/Sash.cs index 349d67e..7fd3216 100644 --- a/WebWindowComplex/Models/Sash.cs +++ b/WebWindowComplex/Models/Sash.cs @@ -88,6 +88,15 @@ namespace WebWindowComplex.Models } } + public Dictionary SelHwOptionList + { + get + { + return m_SelHwdOptionList; + } + } + + public List JointList { get @@ -718,6 +727,29 @@ namespace WebWindowComplex.Models } } } + //if (SelHwOptionList.Count > 0) + //{ + // foreach(var selHwOption in SelHwOptionList) + // { + // var HwOption = HwOptionList.Where(x => x.sName == selHwOption.Key).First(); + // switch (HwOption.Type) + // { + // case HwOptionTypes.COMBO: + // { + // AGBOptionCombo OptCombo = (AGBOptionCombo)HwOption; + // var selValue = OptCombo.ValueList.Where(x => x.sDescription == selHwOption.Value).First(); + // OptCombo.sValue = selValue; + // break; + // } + // case HwOptionTypes.TEXT: + // { + // AGBOptionText OptText = (AGBOptionText)HwOption; + // OptText.sValue = selHwOption.Value; + // break; + // } + // } + // } + //} } internal void SetOrientationSashType(OrientationSash value) @@ -820,6 +852,7 @@ namespace WebWindowComplex.Models private List m_HardwareList = new List(); private List m_HwdOptionList = new List(); + private Dictionary m_SelHwdOptionList = new Dictionary(); private List m_JointList = new List(); diff --git a/WebWindowComplex/TableComp.razor.cs b/WebWindowComplex/TableComp.razor.cs index d36fb35..36a0ea7 100644 --- a/WebWindowComplex/TableComp.razor.cs +++ b/WebWindowComplex/TableComp.razor.cs @@ -771,6 +771,10 @@ namespace WebWindowComplex // Inserisco le forme ricevuto nei sash group foreach (var item in LiveData.DictShape) { + //if (LiveData.DictShape.ContainsKey(item.GroupId)) + //{ + // item.UpdateShape(LiveData.DictOptionsXml[item.GroupId]); + //} Sash sashFromGroupId = SashList.Where(x => x.GroupId == item.Key).ToList().First(); sashFromGroupId.SashShape = item.Value; sashFromGroupId.UpdateShape(item.Value); diff --git a/WebWindowComplex/WebWindowComplex.csproj b/WebWindowComplex/WebWindowComplex.csproj index 9ad9288..08a8c58 100644 --- a/WebWindowComplex/WebWindowComplex.csproj +++ b/WebWindowComplex/WebWindowComplex.csproj @@ -6,7 +6,7 @@ net8.0 enable enable - 2.7.10.2912 + 2.7.10.2914 Annamaria Sassi Egalware Componente gestione Configurazioni avanzate Window per LUX @@ -172,6 +172,11 @@ + + + + + diff --git a/WebWindowConfigurator/WebWindowConfigurator.csproj b/WebWindowConfigurator/WebWindowConfigurator.csproj index 10be022..162964d 100644 --- a/WebWindowConfigurator/WebWindowConfigurator.csproj +++ b/WebWindowConfigurator/WebWindowConfigurator.csproj @@ -6,7 +6,7 @@ net8.0 enable enable - 2.7.10.2912 + 2.7.10.2914 Annamaria Sassi Egalware Componente gestione JWD per LUX @@ -243,6 +243,12 @@ + + + + + + From 1525dd1da1e6cd6ceaff75ca418ced42055c339a Mon Sep 17 00:00:00 2001 From: Samuele Locatelli Date: Wed, 29 Oct 2025 16:19:24 +0100 Subject: [PATCH 18/26] Fix x evitare doppia chiamata iniziale --- Test.UI/Components/Pages/EditJWD.razor.cs | 105 +++++++++++------- WebWindowComplex/WebWindowComplex.csproj | 4 +- .../WebWindowConfigurator.csproj | 6 +- 3 files changed, 72 insertions(+), 43 deletions(-) diff --git a/Test.UI/Components/Pages/EditJWD.razor.cs b/Test.UI/Components/Pages/EditJWD.razor.cs index 3dd9cb9..364dac9 100644 --- a/Test.UI/Components/Pages/EditJWD.razor.cs +++ b/Test.UI/Components/Pages/EditJWD.razor.cs @@ -28,7 +28,6 @@ namespace Test.UI.Components.Pages #region Public Methods - public void Dispose() { DLService.PipeSvg.EA_NewMessage -= PipeSvg_EA_NewMessage; @@ -45,11 +44,11 @@ namespace Test.UI.Components.Pages /// protected LivePayload CurrData = new LivePayload(); - protected string prevJwd = ""; - protected string currJwd = "..."; - protected Dictionary m_CurrArgs = new Dictionary(); protected Dictionary currGroupShape = new Dictionary(); protected Dictionary currHwOption = new Dictionary(); + protected string currJwd = "..."; + protected Dictionary m_CurrArgs = new Dictionary(); + protected string prevJwd = ""; /// /// Configurazione elenchi anagrafiche @@ -123,6 +122,17 @@ namespace Test.UI.Components.Pages #region Protected Methods + protected override void OnAfterRender(bool firstRender) + { + if (firstRender) + { + // This only runs once the interactive circuit is established + Console.WriteLine("Now interactive!"); + // JS interop or data fetches go here + isInteractive = true; + } + } + protected override async Task OnInitializedAsync() { ConfInit(); @@ -182,8 +192,14 @@ namespace Test.UI.Components.Pages private Hardware hardwareMassUpdate; + private string hwOptionChannel = ""; private string imgBasePath = ""; + /// + /// Semaforo x definire se sia già in modalità ionterattiva o di prerendering + /// + private bool isInteractive = false; + private string materialMassUpdate; private string outClose = ""; @@ -192,10 +208,8 @@ namespace Test.UI.Components.Pages private string profileMassUpdate; - private string svgChannel = ""; private string shapeChannel = ""; - private string hwOptionChannel = ""; - + private string svgChannel = ""; private string windowUid = "CurrWindow"; #endregion Private Fields @@ -223,46 +237,36 @@ namespace Test.UI.Components.Pages hwOptionChannel = Config.GetValue("ServerConf:HwOptChannel") ?? ""; } + /// + /// Esecuzione richiesta + /// + /// + /// private async Task ExecRequest(Dictionary CurrArgs) { - outClose = ""; - outSave = ""; - // verifico se contiene JWD, lo aggiorno - if (CurrArgs.ContainsKey("Jwd")) + // Proseguo solo se sono in interattivo (NO prerender pagina) + if (isInteractive) { - currJwd = CurrArgs["Jwd"]; - CurrData.CurrJwd = currJwd; - } - // se il SSE variato --> invio - if (!currJwd.Equals(prevJwd) || !EgwCoreLib.Lux.Core.DictUtils.DictAreEqual(m_CurrArgs, CurrArgs)) - { - m_CurrArgs = CurrArgs; - prevJwd = currJwd; - CalcRequestDTO calcRequestDTO = new CalcRequestDTO(); - calcRequestDTO.EnvType = EgwMultiEngineManager.Data.Constants.EXECENVIRONMENTS.WINDOW; - calcRequestDTO.DictExec = m_CurrArgs; - // chiamo la chiamata POST alla API, che manda la richiesta via REDIS - await ICService.CallRestPost($"{apiUrl}/{GenericBasePath}", $"{calcTag}/{CalcUid}", calcRequestDTO); - } - } - - private async void PipeShape_EA_NewMessage(object? sender, EventArgs e) - { - // aggiorno visualizzazione - PubSubEventArgs currArgs = (PubSubEventArgs)e; - // conversione on-the-fly SVG da mostrare - if (!string.IsNullOrEmpty(currArgs.newMessage) && currArgs.newMessage.Length > 2) - { - if (currArgs.msgUid.StartsWith($"{shapeChannel}:{windowUid}")) + outClose = ""; + outSave = ""; + // verifico se contiene JWD, lo aggiorno + if (CurrArgs.ContainsKey("Jwd")) { - // deserializzo il dizionario delle risposte... - var rawDict = JsonConvert.DeserializeObject>(currArgs.newMessage); - currGroupShape = rawDict ?? new Dictionary(); - CurrData.DictShape = currGroupShape; + currJwd = CurrArgs["Jwd"]; + CurrData.CurrJwd = currJwd; + } + // se il SSE variato --> invio + if (!currJwd.Equals(prevJwd) || !EgwCoreLib.Lux.Core.DictUtils.DictAreEqual(m_CurrArgs, CurrArgs)) + { + m_CurrArgs = CurrArgs; + prevJwd = currJwd; + CalcRequestDTO calcRequestDTO = new CalcRequestDTO(); + calcRequestDTO.EnvType = EgwMultiEngineManager.Data.Constants.EXECENVIRONMENTS.WINDOW; + calcRequestDTO.DictExec = m_CurrArgs; + // chiamo la chiamata POST alla API, che manda la richiesta via REDIS + await ICService.CallRestPost($"{apiUrl}/{GenericBasePath}", $"{calcTag}/{CalcUid}", calcRequestDTO); } - await InvokeAsync(StateHasChanged); } - await Task.Delay(1); } private async void PipeHwOption_EA_NewMessage(object? sender, EventArgs e) @@ -306,6 +310,25 @@ namespace Test.UI.Components.Pages await Task.Delay(1); } + private async void PipeShape_EA_NewMessage(object? sender, EventArgs e) + { + // aggiorno visualizzazione + PubSubEventArgs currArgs = (PubSubEventArgs)e; + // conversione on-the-fly SVG da mostrare + if (!string.IsNullOrEmpty(currArgs.newMessage) && currArgs.newMessage.Length > 2) + { + if (currArgs.msgUid.StartsWith($"{shapeChannel}:{windowUid}")) + { + // deserializzo il dizionario delle risposte... + var rawDict = JsonConvert.DeserializeObject>(currArgs.newMessage); + currGroupShape = rawDict ?? new Dictionary(); + CurrData.DictShape = currGroupShape; + } + await InvokeAsync(StateHasChanged); + } + await Task.Delay(1); + } + private async void PipeSvg_EA_NewMessage(object? sender, EventArgs e) { // aggiorno visualizzazione diff --git a/WebWindowComplex/WebWindowComplex.csproj b/WebWindowComplex/WebWindowComplex.csproj index 08a8c58..e1e04cf 100644 --- a/WebWindowComplex/WebWindowComplex.csproj +++ b/WebWindowComplex/WebWindowComplex.csproj @@ -6,7 +6,7 @@ net8.0 enable enable - 2.7.10.2914 + 2.7.10.2916 Annamaria Sassi Egalware Componente gestione Configurazioni avanzate Window per LUX @@ -180,6 +180,8 @@ + + diff --git a/WebWindowConfigurator/WebWindowConfigurator.csproj b/WebWindowConfigurator/WebWindowConfigurator.csproj index 162964d..3568d74 100644 --- a/WebWindowConfigurator/WebWindowConfigurator.csproj +++ b/WebWindowConfigurator/WebWindowConfigurator.csproj @@ -6,7 +6,7 @@ net8.0 enable enable - 2.7.10.2914 + 2.7.10.2916 Annamaria Sassi Egalware Componente gestione JWD per LUX @@ -251,6 +251,10 @@ + + + + From 9d4d6128c321b1b05b2c510fcc77719c8de196b1 Mon Sep 17 00:00:00 2001 From: Samuele Locatelli Date: Wed, 29 Oct 2025 16:52:59 +0100 Subject: [PATCH 19/26] Fix chiamata senza HW iniziale + altre in ordine --- WebWindowComplex/Models/Area.cs | 2 +- WebWindowComplex/Models/Fill.cs | 4 +- WebWindowComplex/Models/Frame.cs | 4 +- WebWindowComplex/Models/Sash.cs | 7 ++- WebWindowComplex/Models/Split.cs | 4 +- WebWindowComplex/Models/Splitted.cs | 4 +- WebWindowComplex/Models/Window.cs | 9 ++- WebWindowComplex/TableComp.razor.cs | 55 ++++++++++++------- WebWindowComplex/WebWindowComplex.csproj | 16 ++++++ .../WebWindowConfigurator.csproj | 19 +++++++ 10 files changed, 89 insertions(+), 35 deletions(-) diff --git a/WebWindowComplex/Models/Area.cs b/WebWindowComplex/Models/Area.cs index 65f52d7..858f6de 100644 --- a/WebWindowComplex/Models/Area.cs +++ b/WebWindowComplex/Models/Area.cs @@ -239,7 +239,7 @@ namespace WebWindowComplex.Models #region Internal Methods - internal abstract JsonArea Serialize(); + internal abstract JsonArea Serialize(bool hideHw); internal void SetAreaType(AreaTypes AreaType) { diff --git a/WebWindowComplex/Models/Fill.cs b/WebWindowComplex/Models/Fill.cs index 6126005..27cb798 100644 --- a/WebWindowComplex/Models/Fill.cs +++ b/WebWindowComplex/Models/Fill.cs @@ -84,13 +84,13 @@ namespace WebWindowComplex.Models return Fill; } - internal override JsonArea Serialize() + internal override JsonArea Serialize(bool hideHw) { if (nCounterGroup < GroupId) Area.nCounterGroup = GroupId; JsonFill JsonFill = new JsonFill(FillType, GroupId); foreach (var Area in AreaList) - JsonFill.AreaList.Add(Area.Serialize()); + JsonFill.AreaList.Add(Area.Serialize(hideHw)); return JsonFill; } diff --git a/WebWindowComplex/Models/Frame.cs b/WebWindowComplex/Models/Frame.cs index 7434d54..7ec1e72 100644 --- a/WebWindowComplex/Models/Frame.cs +++ b/WebWindowComplex/Models/Frame.cs @@ -237,7 +237,7 @@ namespace WebWindowComplex.Models return NewFrame; } - internal override JsonArea Serialize() + internal override JsonArea Serialize(bool hideHw) { Area.nCounterGroup = 0; if (nCounterGroup < GroupId) @@ -248,7 +248,7 @@ namespace WebWindowComplex.Models foreach (var Joint in JointList) JsonFrame.JointList.Add(Joint.Serialize()); foreach (var Area in AreaList) - JsonFrame.AreaList.Add(Area.Serialize()); + JsonFrame.AreaList.Add(Area.Serialize(hideHw)); return JsonFrame; } diff --git a/WebWindowComplex/Models/Sash.cs b/WebWindowComplex/Models/Sash.cs index 7fd3216..2c19ef9 100644 --- a/WebWindowComplex/Models/Sash.cs +++ b/WebWindowComplex/Models/Sash.cs @@ -655,11 +655,12 @@ namespace WebWindowComplex.Models m_HwdOptionList.Clear(); } - internal override JsonArea Serialize() + internal override JsonArea Serialize(bool hideHw) { if (nCounterGroup < GroupId) Area.nCounterGroup = GroupId; - JsonSash JsonSash = new JsonSash(m_bIsSashVertical, m_SashType, m_bSashBottomRail, m_nSashBottomRailQty, m_SelHardware.Id, GroupId); + string currHwId = hideHw ? CustomHwId : m_SelHardware.Id; + JsonSash JsonSash = new JsonSash(m_bIsSashVertical, m_SashType, m_bSashBottomRail, m_nSashBottomRailQty, currHwId, GroupId); foreach (var SashDimension in SashList) JsonSash.SashList.Add(SashDimension.Serialize()); foreach (var Joint in JointList) @@ -667,7 +668,7 @@ namespace WebWindowComplex.Models foreach (var HwOption in HwOptionList) JsonSash.HwOptionList.Add(HwOption.Serialize()); foreach (var Area in AreaList) - JsonSash.AreaList.Add(Area.Serialize()); + JsonSash.AreaList.Add(Area.Serialize(hideHw)); return JsonSash; } diff --git a/WebWindowComplex/Models/Split.cs b/WebWindowComplex/Models/Split.cs index e845b3e..d0b49b6 100644 --- a/WebWindowComplex/Models/Split.cs +++ b/WebWindowComplex/Models/Split.cs @@ -369,7 +369,7 @@ namespace WebWindowComplex.Models return Split; } - internal override JsonArea Serialize() + internal override JsonArea Serialize(bool hideHw) { if (nCounterGroup < GroupId) Area.nCounterGroup = GroupId; @@ -382,7 +382,7 @@ namespace WebWindowComplex.Models foreach (var SplitHoriz in m_SplitHorizList) JsonSplit.SplitHorizList.Add(SplitHoriz.Serialize()); foreach (var Area in AreaList) - JsonSplit.AreaList.Add(Area.Serialize()); + JsonSplit.AreaList.Add(Area.Serialize(hideHw)); return JsonSplit; } diff --git a/WebWindowComplex/Models/Splitted.cs b/WebWindowComplex/Models/Splitted.cs index 012c38d..02baf89 100644 --- a/WebWindowComplex/Models/Splitted.cs +++ b/WebWindowComplex/Models/Splitted.cs @@ -42,13 +42,13 @@ namespace WebWindowComplex.Models return Splitted; } - internal override JsonArea Serialize() + internal override JsonArea Serialize(bool hideHw) { if (nCounterGroup < GroupId) Area.nCounterGroup = GroupId; JsonSplitted JsonSplitted = new JsonSplitted(GroupId); foreach (var Area in AreaList) - JsonSplitted.AreaList.Add(Area.Serialize()); + JsonSplitted.AreaList.Add(Area.Serialize(hideHw)); return JsonSplitted; } diff --git a/WebWindowComplex/Models/Window.cs b/WebWindowComplex/Models/Window.cs index 4b37f20..cbe80e5 100644 --- a/WebWindowComplex/Models/Window.cs +++ b/WebWindowComplex/Models/Window.cs @@ -103,11 +103,16 @@ namespace WebWindowComplex.Models } } - internal JsonWindow Serialize() + /// + /// Serializzazione dell'oggetto windows + /// + /// Hide hw x preview SVG veloci + /// + internal JsonWindow Serialize(bool hideHw = false) { JsonWindow JsonWindow = new JsonWindow(sProfilePath, sMaterial, sColorMaterial, sGlass); foreach (var Area in AreaList) - JsonWindow.AreaList.Add(Area.Serialize()); + JsonWindow.AreaList.Add(Area.Serialize(hideHw)); return JsonWindow; } diff --git a/WebWindowComplex/TableComp.razor.cs b/WebWindowComplex/TableComp.razor.cs index 36a0ea7..befd99b 100644 --- a/WebWindowComplex/TableComp.razor.cs +++ b/WebWindowComplex/TableComp.razor.cs @@ -452,15 +452,19 @@ namespace WebWindowComplex /// /// Richiesta update anteprima SVG /// + /// Forza richiesta anche con JWD invariato + /// Nasconde hw (def. false) poiché senza è piu rapido /// - protected async Task DoPreviewSvg(bool doForce = false) + protected async Task DoPreviewSvg(bool doForce = false, bool hideHw = false) { if (m_CurrWindow != null) { #if DEBUG - var CurrJwd = JsonConvert.SerializeObject(m_CurrWindow.Serialize(), Formatting.Indented); + var CurrJwd = JsonConvert.SerializeObject(m_CurrWindow.Serialize(false), Formatting.Indented); + var CalcJwd = JsonConvert.SerializeObject(m_CurrWindow.Serialize(hideHw), Formatting.Indented); #else - var CurrJwd = JsonConvert.SerializeObject(m_CurrWindow.Serialize()); + var CurrJwd = JsonConvert.SerializeObject(m_CurrWindow.Serialize(false)); + var CalcJwd = JsonConvert.SerializeObject(m_CurrWindow.Serialize(hideHw)); #endif // verifico variazione JWD if (!prevJwd.Equals(CurrJwd) || doForce) @@ -468,7 +472,7 @@ namespace WebWindowComplex prevJwd = CurrJwd; Dictionary Args = new Dictionary(); Args.Add("Mode", $"{(int)Enums.QuestionModes.PREVIEW}"); - Args.Add("Jwd", CurrJwd); + Args.Add("Jwd", CalcJwd); await EC_DoUpdate.InvokeAsync(Args); } } @@ -564,7 +568,7 @@ namespace WebWindowComplex protected override void OnAfterRender(bool firstRender) { - isLoading = false; + isRendered = true; } /// @@ -579,6 +583,8 @@ namespace WebWindowComplex listWarnings = new Dictionary(); } + private bool firstDisplay = true; + /// /// Gestione update post ricezione parametri da controllo chiamante /// @@ -697,31 +703,37 @@ namespace WebWindowComplex } if (updRequested) { - // se mancasse xml opzioni hardware lo chiedo - if (LiveData.DictOptionsXml.Count == 0) - { - List reqList = SashList.Select(x => x.GroupId).ToList(); - //foreach (var item in SashList) - //{ - // string req = item.SelHardware.Id; - // if (string.IsNullOrEmpty(req)) - // { - // } - //} - if (reqList.Count > 0) - { - await DoReqOptHardware(reqList); - } - } + // se mancasse dizionario forme chiamo quello if (LiveData.DictShape.Count == 0) { + if (firstDisplay && isRendered) + { + firstDisplay = false; + // preview SVG senza HW + await DoPreviewSvg(true, true); + } List reqList = SashList.Select(x => x.GroupId).ToList(); if (reqList.Count > 0) { await DoReqShape(reqList); } } + // se mancasse xml opzioni hardware lo chiedo + else if (LiveData.DictOptionsXml.Count == 0) + { + if (firstDisplay && isRendered) + { + firstDisplay = false; + // preview SVG senza HW + await DoPreviewSvg(true, true); + } + List reqList = SashList.Select(x => x.GroupId).ToList(); + if (reqList.Count > 0) + { + await DoReqOptHardware(reqList); + } + } else { // chiedo SVG @@ -846,6 +858,7 @@ namespace WebWindowComplex /// Booleana fase loading /// private bool isLoading = false; + private bool isRendered = false; /// /// ELenco errori di coerenza/link dati (vanno risolti per disegnare/procedere) diff --git a/WebWindowComplex/WebWindowComplex.csproj b/WebWindowComplex/WebWindowComplex.csproj index e1e04cf..c722e95 100644 --- a/WebWindowComplex/WebWindowComplex.csproj +++ b/WebWindowComplex/WebWindowComplex.csproj @@ -168,6 +168,22 @@ + + + + + + + + + + + + + + + + diff --git a/WebWindowConfigurator/WebWindowConfigurator.csproj b/WebWindowConfigurator/WebWindowConfigurator.csproj index 3568d74..0f07a09 100644 --- a/WebWindowConfigurator/WebWindowConfigurator.csproj +++ b/WebWindowConfigurator/WebWindowConfigurator.csproj @@ -240,6 +240,25 @@ + + + + + + + + + + + + + + + + + + + From 2e4bc8b4d354bf859a152ae827f194cf493ff52d Mon Sep 17 00:00:00 2001 From: Annamaria Sassi Date: Thu, 30 Oct 2025 14:52:12 +0100 Subject: [PATCH 20/26] Aggiunta serializzazione e deserializzazione Hw option --- Test.UI/Components/Pages/EditJWD.razor.cs | 2 +- Test.UI/Data/AntaSingola.jwd | 26 ++++++++ WebWindowComplex/Compo/AreaHwOption.razor | 32 ++++++++++ WebWindowComplex/Compo/AreaHwOption.razor.cs | 49 +++++++++++++++ WebWindowComplex/Compo/CardSashGroup.razor | 5 +- WebWindowComplex/Json/JsonUtility.cs | 4 +- WebWindowComplex/Models/Sash.cs | 59 +++++++++++-------- WebWindowComplex/TableComp.razor.cs | 2 +- WebWindowComplex/WebWindowComplex.csproj | 8 ++- .../WebWindowConfigurator.csproj | 30 +++++++++- 10 files changed, 183 insertions(+), 34 deletions(-) create mode 100644 WebWindowComplex/Compo/AreaHwOption.razor create mode 100644 WebWindowComplex/Compo/AreaHwOption.razor.cs diff --git a/Test.UI/Components/Pages/EditJWD.razor.cs b/Test.UI/Components/Pages/EditJWD.razor.cs index 364dac9..1b5abca 100644 --- a/Test.UI/Components/Pages/EditJWD.razor.cs +++ b/Test.UI/Components/Pages/EditJWD.razor.cs @@ -137,7 +137,7 @@ namespace Test.UI.Components.Pages { ConfInit(); //InitialJwd = File.ReadAllText("Data\\FinestraDueAnteSeparate.jwd"); - InitialJwd = File.ReadAllText("Data\\AntaDoppia.jwd"); + InitialJwd = File.ReadAllText("Data\\AntaSingola.jwd"); currJwd = InitialJwd; // rileggo altri dati await ReloadData(); diff --git a/Test.UI/Data/AntaSingola.jwd b/Test.UI/Data/AntaSingola.jwd index 6252894..1b4c092 100644 --- a/Test.UI/Data/AntaSingola.jwd +++ b/Test.UI/Data/AntaSingola.jwd @@ -70,6 +70,32 @@ } ], "Hardware": "000635", + "HwOptionList": [ + { + "Name": "Entrata", + "Value": "15 mm" + }, + { + "Name": "LavManigliaPassante", + "Value": "No" + }, + { + "Name": "PosizioneForoCilindro", + "Value": "Cilindro sopra la maniglia" + }, + { + "Name": "ModelloCilindro", + "Value": "Nessun cilindro" + }, + { + "Name": "LavCilindroPassante", + "Value": "No" + }, + { + "Name": "HMan", + "Value": "400" + } + ], "GroupId": 2, "AreaList": [ { diff --git a/WebWindowComplex/Compo/AreaHwOption.razor b/WebWindowComplex/Compo/AreaHwOption.razor new file mode 100644 index 0000000..7eb168f --- /dev/null +++ b/WebWindowComplex/Compo/AreaHwOption.razor @@ -0,0 +1,32 @@ +@using static WebWindowComplex.Json.WindowConst + +@if (CurrSash.HwOptionList.Count > 0) +{ +
+
+
+
+
Hardware option
+
+
+ @foreach (var currOpt in CurrSash.HwOptionList) + { + switch (currOpt.Type) + { + case HwOptionTypes.COMBO: + { + AGBOptionCombo currOptCombo = (AGBOptionCombo)currOpt; + + break; + } + case HwOptionTypes.TEXT: + { + AGBOptionText currOptText = (AGBOptionText)currOpt; + + break; + } + } + } +
+
+} \ No newline at end of file diff --git a/WebWindowComplex/Compo/AreaHwOption.razor.cs b/WebWindowComplex/Compo/AreaHwOption.razor.cs new file mode 100644 index 0000000..ba75421 --- /dev/null +++ b/WebWindowComplex/Compo/AreaHwOption.razor.cs @@ -0,0 +1,49 @@ +using Microsoft.AspNetCore.Components; +using System.Runtime.CompilerServices; +using WebWindowComplex.Models; +using static WebWindowComplex.Json.WindowConst; + +namespace WebWindowComplex.Compo +{ + public partial class AreaHwOption + { + /// + /// Sash corrente rispetto alla lista Sash + /// + [Parameter] + public Sash CurrSash { get; set; } = null!; + + /// + /// Evento per aggiornare gli hardware option di tipo combo + /// + [Parameter] + public EventCallback EC_UpdateHwOptCombo { get; set; } + + /// + /// Evento per aggiornare gli hardware option di tipo text + /// + [Parameter] + public EventCallback EC_UpdateHwOptText { get; set; } + + /// + /// Report aggiornamento Option Combo + /// + /// + /// + private async Task RaiseOptCombo(AGBOptionCombo updRec) + { + await EC_UpdateHwOptCombo.InvokeAsync(updRec); + } + + /// + /// Report aggiornamento Option Text + /// + /// + /// + private async Task RaiseOptText(AGBOptionText updRec) + { + await EC_UpdateHwOptText.InvokeAsync(updRec); + } + + } +} \ No newline at end of file diff --git a/WebWindowComplex/Compo/CardSashGroup.razor b/WebWindowComplex/Compo/CardSashGroup.razor index b793057..3384dc4 100644 --- a/WebWindowComplex/Compo/CardSashGroup.razor +++ b/WebWindowComplex/Compo/CardSashGroup.razor @@ -116,7 +116,8 @@ }
-
+ + @*
@@ -145,7 +146,7 @@ } }
-
+
*@
diff --git a/WebWindowComplex/Json/JsonUtility.cs b/WebWindowComplex/Json/JsonUtility.cs index f8d35e0..f66b5ac 100644 --- a/WebWindowComplex/Json/JsonUtility.cs +++ b/WebWindowComplex/Json/JsonUtility.cs @@ -415,8 +415,8 @@ namespace WebWindowComplex.Json newSash.SetSelFamilyHardwareFromIndex(Hardware); newSash.ReqRefreshShape(); newSash.SetSelHardwareFromId(Hardware); - //foreach (var HwOption in m_HwOptionList) - // newSash.SelHwOptionList.Add(HwOption.Name, HwOption.Value); + foreach (var HwOption in m_HwOptionList) + newSash.SelHwOptionList.Add(HwOption.Name, HwOption.Value); //foreach (var HwOption in m_HwOptionList) // newSash.HwOptionList.Add(HwOption.Deserialize()); foreach (var Area in AreaList) diff --git a/WebWindowComplex/Models/Sash.cs b/WebWindowComplex/Models/Sash.cs index 2c19ef9..ce3ed2e 100644 --- a/WebWindowComplex/Models/Sash.cs +++ b/WebWindowComplex/Models/Sash.cs @@ -96,7 +96,6 @@ namespace WebWindowComplex.Models } } - public List JointList { get @@ -665,8 +664,16 @@ namespace WebWindowComplex.Models JsonSash.SashList.Add(SashDimension.Serialize()); foreach (var Joint in JointList) JsonSash.JointList.Add(Joint.Serialize()); - foreach (var HwOption in HwOptionList) - JsonSash.HwOptionList.Add(HwOption.Serialize()); + if(HwOptionList.Count > 0) + { + foreach (var HwOption in HwOptionList) + JsonSash.HwOptionList.Add(HwOption.Serialize()); + } + else + { + foreach (var HwOption in SelHwOptionList) + JsonSash.HwOptionList.Add(new JsonHwOption(HwOption.Key, HwOption.Value)); + } foreach (var Area in AreaList) JsonSash.AreaList.Add(Area.Serialize(hideHw)); return JsonSash; @@ -728,29 +735,29 @@ namespace WebWindowComplex.Models } } } - //if (SelHwOptionList.Count > 0) - //{ - // foreach(var selHwOption in SelHwOptionList) - // { - // var HwOption = HwOptionList.Where(x => x.sName == selHwOption.Key).First(); - // switch (HwOption.Type) - // { - // case HwOptionTypes.COMBO: - // { - // AGBOptionCombo OptCombo = (AGBOptionCombo)HwOption; - // var selValue = OptCombo.ValueList.Where(x => x.sDescription == selHwOption.Value).First(); - // OptCombo.sValue = selValue; - // break; - // } - // case HwOptionTypes.TEXT: - // { - // AGBOptionText OptText = (AGBOptionText)HwOption; - // OptText.sValue = selHwOption.Value; - // break; - // } - // } - // } - //} + if (SelHwOptionList.Count > 0) + { + foreach (var selHwOption in SelHwOptionList) + { + var HwOption = HwOptionList.Where(x => x.sName == selHwOption.Key).First(); + switch (HwOption.Type) + { + case HwOptionTypes.COMBO: + { + AGBOptionCombo OptCombo = (AGBOptionCombo)HwOption; + var selValue = OptCombo.ValueList.Where(x => x.sDescription == selHwOption.Value).First(); + OptCombo.sValue = selValue; + break; + } + case HwOptionTypes.TEXT: + { + AGBOptionText OptText = (AGBOptionText)HwOption; + OptText.sValue = selHwOption.Value; + break; + } + } + } + } } internal void SetOrientationSashType(OrientationSash value) diff --git a/WebWindowComplex/TableComp.razor.cs b/WebWindowComplex/TableComp.razor.cs index befd99b..652ca8d 100644 --- a/WebWindowComplex/TableComp.razor.cs +++ b/WebWindowComplex/TableComp.razor.cs @@ -602,7 +602,7 @@ namespace WebWindowComplex if (ListPayload.IsValid()) { // SOLO SE modificato live data... - if (prevLiveData == null || !prevLiveData.Equals(LiveData)) + if (prevLiveData == null || !prevLiveData.Equals(LiveData)) { updRequested = true; prevLiveData = new LivePayload() diff --git a/WebWindowComplex/WebWindowComplex.csproj b/WebWindowComplex/WebWindowComplex.csproj index c722e95..9ae30ab 100644 --- a/WebWindowComplex/WebWindowComplex.csproj +++ b/WebWindowComplex/WebWindowComplex.csproj @@ -6,7 +6,7 @@ net8.0 enable enable - 2.7.10.2916 + 2.7.10.3014 Annamaria Sassi Egalware Componente gestione Configurazioni avanzate Window per LUX @@ -194,6 +194,12 @@ + + + + + + diff --git a/WebWindowConfigurator/WebWindowConfigurator.csproj b/WebWindowConfigurator/WebWindowConfigurator.csproj index 0f07a09..98c9676 100644 --- a/WebWindowConfigurator/WebWindowConfigurator.csproj +++ b/WebWindowConfigurator/WebWindowConfigurator.csproj @@ -6,7 +6,7 @@ net8.0 enable enable - 2.7.10.2916 + 2.7.10.3014 Annamaria Sassi Egalware Componente gestione JWD per LUX @@ -259,6 +259,34 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + From 16cf5eda54a7ddcaf89de7084eae42225e846185 Mon Sep 17 00:00:00 2001 From: Samuele Locatelli Date: Thu, 30 Oct 2025 15:19:39 +0100 Subject: [PATCH 21/26] update x forzare refresh --- WebWindowComplex/Models/Sash.cs | 10 +++++++++- WebWindowComplex/WebWindowComplex.csproj | 7 ++++++- WebWindowConfigurator/WebWindowConfigurator.csproj | 7 ++++++- 3 files changed, 21 insertions(+), 3 deletions(-) diff --git a/WebWindowComplex/Models/Sash.cs b/WebWindowComplex/Models/Sash.cs index ce3ed2e..5217695 100644 --- a/WebWindowComplex/Models/Sash.cs +++ b/WebWindowComplex/Models/Sash.cs @@ -1,4 +1,5 @@ using Egw.Window.Data; +using Newtonsoft.Json; using System; using System.Collections.Generic; using System.Data.SqlTypes; @@ -116,7 +117,7 @@ namespace WebWindowComplex.Models } set { - if (value >= 0 && value <= 4) + if (value >= 0 && value <= 3) { if (value > m_SashList.Count) { @@ -228,9 +229,16 @@ namespace WebWindowComplex.Models } } } + // arriva come terzo evento refresh!!! +#if false + // calcolo senza hw + m_ParentWindow.OnUpdatePreview(JsonConvert.SerializeObject(m_ParentWindow.Serialize(true))); +#endif + // continuo refresh ReqRefreshShape(); RefreshHardwareOptionList(); SetFirstHardware(); + // da vedere: dovrebbe esserci un unico oggetto tra JsonConvert.SerializeObject(m_ParentWindow.Serialize(true) e m_ParentWindow.sSerialized() m_ParentWindow.OnUpdatePreview(m_ParentWindow.sSerialized()); } } diff --git a/WebWindowComplex/WebWindowComplex.csproj b/WebWindowComplex/WebWindowComplex.csproj index 9ae30ab..842e83a 100644 --- a/WebWindowComplex/WebWindowComplex.csproj +++ b/WebWindowComplex/WebWindowComplex.csproj @@ -6,7 +6,7 @@ net8.0 enable enable - 2.7.10.3014 + 2.7.10.3015 Annamaria Sassi Egalware Componente gestione Configurazioni avanzate Window per LUX @@ -201,6 +201,11 @@ + + + + + diff --git a/WebWindowConfigurator/WebWindowConfigurator.csproj b/WebWindowConfigurator/WebWindowConfigurator.csproj index 98c9676..7482096 100644 --- a/WebWindowConfigurator/WebWindowConfigurator.csproj +++ b/WebWindowConfigurator/WebWindowConfigurator.csproj @@ -6,7 +6,7 @@ net8.0 enable enable - 2.7.10.3014 + 2.7.10.3015 Annamaria Sassi Egalware Componente gestione JWD per LUX @@ -301,6 +301,11 @@ + + + + + From fe1e7735e367fa3ec31310fd316279b551e7c1e9 Mon Sep 17 00:00:00 2001 From: Annamaria Sassi Date: Thu, 30 Oct 2025 17:50:57 +0100 Subject: [PATCH 22/26] Aggiornata nQtySash --- .../Models/OnReqHwOptEventArgs.cs | 6 ++-- WebWindowComplex/Models/Sash.cs | 12 ++++---- WebWindowComplex/Models/Window.cs | 4 +-- WebWindowComplex/WebWindowComplex.csproj | 25 ++++++++++++++++- .../WebWindowConfigurator.csproj | 28 ++++++++++++++++++- 5 files changed, 63 insertions(+), 12 deletions(-) diff --git a/WebWindowComplex/Models/OnReqHwOptEventArgs.cs b/WebWindowComplex/Models/OnReqHwOptEventArgs.cs index 9e58da1..234cb3d 100644 --- a/WebWindowComplex/Models/OnReqHwOptEventArgs.cs +++ b/WebWindowComplex/Models/OnReqHwOptEventArgs.cs @@ -11,16 +11,16 @@ namespace WebWindowComplex.Models #region Public Fields public string sJwd; - public string sCodHw; + public int nGroupId; #endregion Public Fields #region Public Constructors - public OnReqHwOptEventArgs(string sJwd, string sCodHw) + public OnReqHwOptEventArgs(string sJwd, int nGroupId) { this.sJwd = sJwd; - this.sCodHw = sCodHw; + this.nGroupId = nGroupId; } #endregion Public Constructors diff --git a/WebWindowComplex/Models/Sash.cs b/WebWindowComplex/Models/Sash.cs index 5217695..636d240 100644 --- a/WebWindowComplex/Models/Sash.cs +++ b/WebWindowComplex/Models/Sash.cs @@ -233,12 +233,13 @@ namespace WebWindowComplex.Models #if false // calcolo senza hw m_ParentWindow.OnUpdatePreview(JsonConvert.SerializeObject(m_ParentWindow.Serialize(true))); + m_ParentWindow.OnUpdatePreview(m_ParentWindow.sSerialized(true)); #endif // continuo refresh - ReqRefreshShape(); + //ReqRefreshShape(); + RefreshHardwareList(); RefreshHardwareOptionList(); SetFirstHardware(); - // da vedere: dovrebbe esserci un unico oggetto tra JsonConvert.SerializeObject(m_ParentWindow.Serialize(true) e m_ParentWindow.sSerialized() m_ParentWindow.OnUpdatePreview(m_ParentWindow.sSerialized()); } } @@ -496,7 +497,7 @@ namespace WebWindowComplex.Models { HwOptionList.Clear(); // chiamata evento calcolo opzioni hardware - OnReqHwOptionPreview(m_ParentWindow.sSerialized(), SelHardware.Id); + OnReqHwOptionPreview(m_ParentWindow.sSerialized(), GroupId); } public void SetSelFamilyHardware(string sFamilyHw) @@ -647,9 +648,9 @@ namespace WebWindowComplex.Models } } - internal void OnReqHwOptionPreview(string sJwd, string codHw) + internal void OnReqHwOptionPreview(string sJwd, int groupId) { - OnReqHwOptEventArgs e = new OnReqHwOptEventArgs(sJwd, codHw); + OnReqHwOptEventArgs e = new OnReqHwOptEventArgs(sJwd, groupId); EventHandler handler = OnReqHwOption; if (handler != null) { @@ -660,6 +661,7 @@ namespace WebWindowComplex.Models internal void RefreshHardwareOptionList() { m_HwdOptionList.Clear(); + //ReqRefreshHwOption(); } internal override JsonArea Serialize(bool hideHw) diff --git a/WebWindowComplex/Models/Window.cs b/WebWindowComplex/Models/Window.cs index cbe80e5..24440a4 100644 --- a/WebWindowComplex/Models/Window.cs +++ b/WebWindowComplex/Models/Window.cs @@ -116,9 +116,9 @@ namespace WebWindowComplex.Models return JsonWindow; } - internal string sSerialized() + internal string sSerialized(bool hideHw = false) { - return JsonConvert.SerializeObject(Serialize(), Formatting.Indented); + return JsonConvert.SerializeObject(Serialize(hideHw), Formatting.Indented); } #endregion Internal Methods diff --git a/WebWindowComplex/WebWindowComplex.csproj b/WebWindowComplex/WebWindowComplex.csproj index 842e83a..fc2cdb5 100644 --- a/WebWindowComplex/WebWindowComplex.csproj +++ b/WebWindowComplex/WebWindowComplex.csproj @@ -6,7 +6,7 @@ net8.0 enable enable - 2.7.10.3015 + 2.7.10.3017 Annamaria Sassi Egalware Componente gestione Configurazioni avanzate Window per LUX @@ -192,6 +192,29 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/WebWindowConfigurator/WebWindowConfigurator.csproj b/WebWindowConfigurator/WebWindowConfigurator.csproj index 7482096..dea51fc 100644 --- a/WebWindowConfigurator/WebWindowConfigurator.csproj +++ b/WebWindowConfigurator/WebWindowConfigurator.csproj @@ -6,7 +6,7 @@ net8.0 enable enable - 2.7.10.3015 + 2.7.10.3017 Annamaria Sassi Egalware Componente gestione JWD per LUX @@ -292,6 +292,32 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + From 64a2019b6d69a4a151842e646132ca19b7324e28 Mon Sep 17 00:00:00 2001 From: Annamaria Sassi Date: Fri, 31 Oct 2025 14:52:04 +0100 Subject: [PATCH 23/26] Aggiornati jwd con nuovi nomi variabili e hw option --- Test.UI/Data/AntaDoppia.jwd | 86 ++++++++++------ Test.UI/Data/AntaSingola.jwd | 50 ++++----- Test.UI/Data/FinDueAnteBottomFisso.jwd | 80 +++++++++----- Test.UI/Data/FinestraDueAnteSeparate.jwd | 126 +++++++++++++++++------ Test.UI/Data/FinestraSplitGrid.jwd | 40 +++---- Test.UI/Data/FinestraSplitVert.jwd | 28 ++--- 6 files changed, 266 insertions(+), 144 deletions(-) diff --git a/Test.UI/Data/AntaDoppia.jwd b/Test.UI/Data/AntaDoppia.jwd index a44e672..eeb3733 100644 --- a/Test.UI/Data/AntaDoppia.jwd +++ b/Test.UI/Data/AntaDoppia.jwd @@ -8,31 +8,31 @@ "Shape": "RECTANGLE", "DimensionList": [ { - "nIndex": 1, - "sName": "Width", - "dValue": 800.0 + "Index": 1, + "Name": "Width", + "Value": 800.0 }, { - "nIndex": 2, - "sName": "Height", - "dValue": 1200.0 + "Index": 2, + "Name": "Height", + "Value": 1200.0 } ], "JointList": [ { - "nIndex": 1, + "Index": 1, "JointType": "FULL_H" }, { - "nIndex": 2, + "Index": 2, "JointType": "FULL_H" }, { - "nIndex": 3, + "Index": 3, "JointType": "FULL_H" }, { - "nIndex": 4, + "Index": 4, "JointType": "FULL_H" } ], @@ -41,70 +41,98 @@ "GroupId": 1, "AreaList": [ { - "bIsSashVertical": true, + "IsSashVertical": true, "SashList": [ { - "nSashId": 1, + "SashId": 1, "OpeningType": "TILTTURN_LEFT", - "bHasHandle": true, - "dDimension": 100.0 + "HasHandle": true, + "Dimension": 50.0 + }, + { + "SashId": 2, + "OpeningType": "TURNONLY_RIGHT", + "HasHandle": false, + "Dimension": 50.0 } ], "SashType": "NULL", "JointList": [ { - "nIndex": 1, + "Index": 1, "JointType": "FULL_H" }, { - "nIndex": 2, + "Index": 2, "JointType": "FULL_H" }, { - "nIndex": 3, + "Index": 3, "JointType": "FULL_H" }, { - "nIndex": 4, + "Index": 4, "JointType": "FULL_H" } ], "BottomRail": false, "BottomRailQty": 0, - "Hardware": "000632", + "Hardware": "000633", "HwOptionList": [ { "Name": "Entrata", - "Value": "15 mm" + "Value": "15" }, { "Name": "LavManigliaPassante", - "Value": "No" + "Value": "false" }, { "Name": "PosizioneForoCilindro", - "Value": "Cilindro sopra la maniglia" + "Value": "sotto" + }, + { + "Name": "Deviatore", + "Value": "false" }, { "Name": "ModelloCilindro", - "Value": "Nessun cilindro" + "Value": "c999" }, { "Name": "LavCilindroPassante", - "Value": "No" + "Value": "false" }, { "Name": "HMan", - "Value": "" + "Value": "400" } ], "GroupId": 2, "AreaList": [ { - "FillType": "GLASS", - "GroupId": 3, - "AreaList": [], - "AreaType": "FILL" + "GroupId": 4, + "AreaList": [ + { + "FillType": "GLASS", + "GroupId": 3, + "AreaList": [], + "AreaType": "FILL" + } + ], + "AreaType": "SPLITTED" + }, + { + "GroupId": 5, + "AreaList": [ + { + "FillType": "GLASS", + "GroupId": 6, + "AreaList": [], + "AreaType": "FILL" + } + ], + "AreaType": "SPLITTED" } ], "AreaType": "SASH" diff --git a/Test.UI/Data/AntaSingola.jwd b/Test.UI/Data/AntaSingola.jwd index 1b4c092..4ccc9d1 100644 --- a/Test.UI/Data/AntaSingola.jwd +++ b/Test.UI/Data/AntaSingola.jwd @@ -8,31 +8,31 @@ "Shape": "RECTANGLE", "DimensionList": [ { - "nIndex": 1, - "sName": "Width", - "dValue": 800.0 + "Index": 1, + "Name": "Width", + "Value": 800.0 }, { - "nIndex": 2, - "sName": "Height", - "dValue": 1200.0 + "Index": 2, + "Name": "Height", + "Value": 1200.0 } ], "JointList": [ { - "nIndex": 1, + "Index": 1, "JointType": "FULL_H" }, { - "nIndex": 2, + "Index": 2, "JointType": "FULL_H" }, { - "nIndex": 3, + "Index": 3, "JointType": "FULL_H" }, { - "nIndex": 4, + "Index": 4, "JointType": "FULL_H" } ], @@ -41,31 +41,31 @@ "GroupId": 1, "AreaList": [ { - "bIsSashVertical": true, + "IsSashVertical": true, "SashList": [ { - "nSashId": 1, + "SashId": 1, "OpeningType": "TILTTURN_LEFT", - "bHasHandle": true, - "dDimension": 100.0 + "HasHandle": true, + "Dimension": 100.0 } ], "SashType": "NULL", "JointList": [ { - "nIndex": 1, + "Index": 1, "JointType": "FULL_H" }, { - "nIndex": 2, + "Index": 2, "JointType": "FULL_H" }, { - "nIndex": 3, + "Index": 3, "JointType": "FULL_H" }, { - "nIndex": 4, + "Index": 4, "JointType": "FULL_H" } ], @@ -73,23 +73,27 @@ "HwOptionList": [ { "Name": "Entrata", - "Value": "15 mm" + "Value": "15" }, { "Name": "LavManigliaPassante", - "Value": "No" + "Value": "false" }, { "Name": "PosizioneForoCilindro", - "Value": "Cilindro sopra la maniglia" + "Value": "sotto" + }, + { + "Name": "Deviatore", + "Value": "false" }, { "Name": "ModelloCilindro", - "Value": "Nessun cilindro" + "Value": "c999" }, { "Name": "LavCilindroPassante", - "Value": "No" + "Value": "false" }, { "Name": "HMan", diff --git a/Test.UI/Data/FinDueAnteBottomFisso.jwd b/Test.UI/Data/FinDueAnteBottomFisso.jwd index 2131e76..c1d8530 100644 --- a/Test.UI/Data/FinDueAnteBottomFisso.jwd +++ b/Test.UI/Data/FinDueAnteBottomFisso.jwd @@ -8,31 +8,31 @@ "Shape": "RECTANGLE", "DimensionList": [ { - "nIndex": 1, - "sName": "Width", - "dValue": 1500.0 + "Index": 1, + "Name": "Width", + "Value": 1500.0 }, { - "nIndex": 2, - "sName": "Height", - "dValue": 2100.0 + "Index": 2, + "Name": "Height", + "Value": 2100.0 } ], "JointList": [ { - "nIndex": 1, + "Index": 1, "JointType": "FULL_H" }, { - "nIndex": 2, + "Index": 2, "JointType": "FULL_H" }, { - "nIndex": 3, + "Index": 3, "JointType": "FULL_H" }, { - "nIndex": 4, + "Index": 4, "JointType": "FULL_H" } ], @@ -46,12 +46,12 @@ "SplitVertList": [], "SplitHorizList": [ { - "bIsRelative": true, - "dDimension": 40.0 + "IsRelative": true, + "Dimension": 40.0 }, { - "bIsRelative": true, - "dDimension": 60.0 + "IsRelative": true, + "Dimension": 60.0 } ], "GroupId": 2, @@ -72,41 +72,71 @@ "GroupId": 5, "AreaList": [ { - "bIsSashVertical": true, + "IsSashVertical": true, "SashList": [ { - "nSashId": 1, + "SashId": 1, "OpeningType": "TURNONLY_LEFT", - "bHasHandle": false, - "dDimension": 50.0 + "HasHandle": false, + "Dimension": 50.0 }, { - "nSashId": 2, + "SashId": 2, "OpeningType": "TILTTURN_RIGHT", - "bHasHandle": true, - "dDimension": 50.0 + "HasHandle": true, + "Dimension": 50.0 } ], "SashType": "NULL", "JointList": [ { - "nIndex": 1, + "Index": 1, "JointType": "FULL_H" }, { - "nIndex": 2, + "Index": 2, "JointType": "FULL_H" }, { - "nIndex": 3, + "Index": 3, "JointType": "FULL_H" }, { - "nIndex": 4, + "Index": 4, "JointType": "FULL_H" } ], "Hardware": "000631", + "HwOptionList": [ + { + "Name": "Entrata", + "Value": "15" + }, + { + "Name": "LavManigliaPassante", + "Value": "false" + }, + { + "Name": "PosizioneForoCilindro", + "Value": "sotto" + }, + { + "Name": "Deviatore", + "Value": "false" + }, + { + "Name": "ModelloCilindro", + "Value": "c999" + }, + { + "Name": "LavCilindroPassante", + "Value": "false" + }, + { + "Name": "HMan", + "Value": "400" + } + ], "GroupId": 6, "AreaList": [ { diff --git a/Test.UI/Data/FinestraDueAnteSeparate.jwd b/Test.UI/Data/FinestraDueAnteSeparate.jwd index c8f8e3a..e4392b0 100644 --- a/Test.UI/Data/FinestraDueAnteSeparate.jwd +++ b/Test.UI/Data/FinestraDueAnteSeparate.jwd @@ -8,36 +8,36 @@ "Shape": "DOUBLECHAMFER", "DimensionList": [ { - "nIndex": 1, - "sName": "Width", - "dValue": 1500.0 + "Index": 1, + "Name": "Width", + "Value": 1500.0 }, { - "nIndex": 2, - "sName": "Height", - "dValue": 1500.0 + "Index": 2, + "Name": "Height", + "Value": 1500.0 }, { - "nIndex": 3, - "sName": "Full Height", - "dValue": 1800.0 + "Index": 3, + "Name": "Full Height", + "Value": 1800.0 } ], "JointList": [ { - "nIndex": 1, + "Index": 1, "JointType": "FULL_H" }, { - "nIndex": 2, + "Index": 2, "JointType": "FULL_H" }, { - "nIndex": 3, + "Index": 3, "JointType": "FULL_H" }, { - "nIndex": 4, + "Index": 4, "JointType": "FULL_H" } ], @@ -50,12 +50,12 @@ "SplitStartVert": true, "SplitVertList": [ { - "bIsRelative": true, - "dDimension": 50.0 + "IsRelative": true, + "Dimension": 50.0 }, { - "bIsRelative": true, - "dDimension": 50.0 + "IsRelative": true, + "Dimension": 50.0 } ], "SplitHorizList": [], @@ -65,37 +65,67 @@ "GroupId": 3, "AreaList": [ { - "bIsSashVertical": true, + "IsSashVertical": true, "SashList": [ { - "nSashId": 1, + "SashId": 1, "OpeningType": "TILTTURN_LEFT", - "bHasHandle": true, - "dDimension": 100.0 + "HasHandle": true, + "Dimension": 100.0 } ], "SashType": "NULL", "JointList": [ { - "nIndex": 1, + "Index": 1, "JointType": "FULL_H" }, { - "nIndex": 2, + "Index": 2, "JointType": "FULL_H" }, { - "nIndex": 3, + "Index": 3, "JointType": "FULL_H" }, { - "nIndex": 4, + "Index": 4, "JointType": "FULL_H" } ], "BottomRail": false, "BottomRailQty": 0, "Hardware": "000000", + "HwOptionList": [ + { + "Name": "Entrata", + "Value": "15" + }, + { + "Name": "LavManigliaPassante", + "Value": "false" + }, + { + "Name": "PosizioneForoCilindro", + "Value": "sotto" + }, + { + "Name": "Deviatore", + "Value": "false" + }, + { + "Name": "ModelloCilindro", + "Value": "c999" + }, + { + "Name": "LavCilindroPassante", + "Value": "false" + }, + { + "Name": "HMan", + "Value": "400" + } + ], "GroupId": 4, "AreaList": [ { @@ -114,37 +144,67 @@ "GroupId": 6, "AreaList": [ { - "bIsSashVertical": true, + "IsSashVertical": true, "SashList": [ { - "nSashId": 1, + "SashId": 1, "OpeningType": "TILTTURN_RIGHT", - "bHasHandle": true, - "dDimension": 100.0 + "HasHandle": true, + "Dimension": 100.0 } ], "SashType": "NULL", "JointList": [ { - "nIndex": 1, + "Index": 1, "JointType": "FULL_H" }, { - "nIndex": 2, + "Index": 2, "JointType": "FULL_H" }, { - "nIndex": 3, + "Index": 3, "JointType": "FULL_H" }, { - "nIndex": 4, + "Index": 4, "JointType": "FULL_H" } ], "BottomRail": false, "BottomRailQty": 0, "Hardware": "000000", + "HwOptionList": [ + { + "Name": "Entrata", + "Value": "15" + }, + { + "Name": "LavManigliaPassante", + "Value": "false" + }, + { + "Name": "PosizioneForoCilindro", + "Value": "sotto" + }, + { + "Name": "Deviatore", + "Value": "false" + }, + { + "Name": "ModelloCilindro", + "Value": "c999" + }, + { + "Name": "LavCilindroPassante", + "Value": "false" + }, + { + "Name": "HMan", + "Value": "400" + } + ], "GroupId": 7, "AreaList": [ { diff --git a/Test.UI/Data/FinestraSplitGrid.jwd b/Test.UI/Data/FinestraSplitGrid.jwd index 07d1781..2782718 100644 --- a/Test.UI/Data/FinestraSplitGrid.jwd +++ b/Test.UI/Data/FinestraSplitGrid.jwd @@ -8,31 +8,31 @@ "Shape": "RECTANGLE", "DimensionList": [ { - "nIndex": 1, - "sName": "Width", - "dValue": 1500.0 + "Index": 1, + "Name": "Width", + "Value": 1500.0 }, { - "nIndex": 2, - "sName": "Height", - "dValue": 1800.0 + "Index": 2, + "Name": "Height", + "Value": 1800.0 } ], "JointList": [ { - "nIndex": 1, + "Index": 1, "JointType": "FULL_H" }, { - "nIndex": 2, + "Index": 2, "JointType": "FULL_H" }, { - "nIndex": 3, + "Index": 3, "JointType": "FULL_H" }, { - "nIndex": 4, + "Index": 4, "JointType": "FULL_H" } ], @@ -45,26 +45,26 @@ "SplitStartVert": false, "SplitVertList": [ { - "bIsRelative": true, - "dDimension": 50.0 + "IsRelative": true, + "Dimension": 50.0 }, { - "bIsRelative": true, - "dDimension": 50.0 + "IsRelative": true, + "Dimension": 50.0 } ], "SplitHorizList": [ { - "bIsRelative": true, - "dDimension": 30.0 + "IsRelative": true, + "Dimension": 30.0 }, { - "bIsRelative": true, - "dDimension": 40.0 + "IsRelative": true, + "Dimension": 40.0 }, { - "bIsRelative": true, - "dDimension": 30.0 + "IsRelative": true, + "Dimension": 30.0 } ], "GroupId": 2, diff --git a/Test.UI/Data/FinestraSplitVert.jwd b/Test.UI/Data/FinestraSplitVert.jwd index 0290ae0..d3feecc 100644 --- a/Test.UI/Data/FinestraSplitVert.jwd +++ b/Test.UI/Data/FinestraSplitVert.jwd @@ -8,31 +8,31 @@ "Shape": "RECTANGLE", "DimensionList": [ { - "nIndex": 1, - "sName": "Width", - "dValue": 1500.0 + "Index": 1, + "Name": "Width", + "Value": 1500.0 }, { - "nIndex": 2, - "sName": "Height", - "dValue": 1800.0 + "Index": 2, + "Name": "Height", + "Value": 1800.0 } ], "JointList": [ { - "nIndex": 1, + "Index": 1, "JointType": "FULL_H" }, { - "nIndex": 2, + "Index": 2, "JointType": "FULL_H" }, { - "nIndex": 3, + "Index": 3, "JointType": "FULL_H" }, { - "nIndex": 4, + "Index": 4, "JointType": "FULL_H" } ], @@ -45,12 +45,12 @@ "SplitStartVert": true, "SplitVertList": [ { - "bIsRelative": true, - "dDimension": 50.0 + "IsRelative": true, + "Dimension": 50.0 }, { - "bIsRelative": true, - "dDimension": 50.0 + "IsRelative": true, + "Dimension": 50.0 } ], "SplitHorizList": [], From 0caf3ef83b4ee5957d57f52ff99a0d7103423c76 Mon Sep 17 00:00:00 2001 From: Annamaria Sassi Date: Fri, 31 Oct 2025 14:53:18 +0100 Subject: [PATCH 24/26] Aggiornati eventi ricalcolo hw option e forma ante --- Test.UI/Components/Pages/EditJWD.razor.cs | 4 +- WebWindowComplex/Compo/CardSashGroup.razor.cs | 4 +- WebWindowComplex/Json/JsonUtility.cs | 88 +++++++++---------- WebWindowComplex/Models/AGBOptionCombo.cs | 2 +- WebWindowComplex/Models/Area.cs | 1 + WebWindowComplex/Models/Sash.cs | 58 ++++++------ WebWindowComplex/Models/Window.cs | 22 +++++ WebWindowComplex/TableComp.razor.cs | 31 ++++++- WebWindowComplex/WebWindowComplex.csproj | 18 +++- .../WebWindowConfigurator.csproj | 22 ++++- 10 files changed, 167 insertions(+), 83 deletions(-) diff --git a/Test.UI/Components/Pages/EditJWD.razor.cs b/Test.UI/Components/Pages/EditJWD.razor.cs index 1b5abca..44beea9 100644 --- a/Test.UI/Components/Pages/EditJWD.razor.cs +++ b/Test.UI/Components/Pages/EditJWD.razor.cs @@ -126,8 +126,6 @@ namespace Test.UI.Components.Pages { if (firstRender) { - // This only runs once the interactive circuit is established - Console.WriteLine("Now interactive!"); // JS interop or data fetches go here isInteractive = true; } @@ -137,7 +135,7 @@ namespace Test.UI.Components.Pages { ConfInit(); //InitialJwd = File.ReadAllText("Data\\FinestraDueAnteSeparate.jwd"); - InitialJwd = File.ReadAllText("Data\\AntaSingola.jwd"); + InitialJwd = File.ReadAllText("Data\\AntaDoppia.jwd"); currJwd = InitialJwd; // rileggo altri dati await ReloadData(); diff --git a/WebWindowComplex/Compo/CardSashGroup.razor.cs b/WebWindowComplex/Compo/CardSashGroup.razor.cs index c36f31a..b9c3517 100644 --- a/WebWindowComplex/Compo/CardSashGroup.razor.cs +++ b/WebWindowComplex/Compo/CardSashGroup.razor.cs @@ -178,7 +178,7 @@ namespace WebWindowComplex.Compo if (updRec != null) { currRec = updRec; - await EC_UpdateSash.InvokeAsync(CurrItem); + await EC_UpdateSashHardware.InvokeAsync(CurrItem); } } @@ -195,7 +195,7 @@ namespace WebWindowComplex.Compo if (updRec != null) { currRec = updRec; - await EC_UpdateSash.InvokeAsync(CurrItem); + await EC_UpdateSashHardware.InvokeAsync(CurrItem); } } diff --git a/WebWindowComplex/Json/JsonUtility.cs b/WebWindowComplex/Json/JsonUtility.cs index f66b5ac..960ead1 100644 --- a/WebWindowComplex/Json/JsonUtility.cs +++ b/WebWindowComplex/Json/JsonUtility.cs @@ -233,12 +233,12 @@ namespace WebWindowComplex.Json { } - public JsonFrame(Shapes Shape, bool BottomRail, int BottomRailQty, int nGroupId) : base(AreaTypes.FRAME) + public JsonFrame(Shapes Shape, bool BottomRail, int BottomRailQty, int GroupId) : base(AreaTypes.FRAME) { m_Shape = Shape; m_bBottomRail = BottomRail; m_nBottomRailQty = BottomRailQty; - GroupId = nGroupId; + base.GroupId = GroupId; } internal override Area Deserialize(Area ParentArea, Window ParentWindow) @@ -251,7 +251,7 @@ namespace WebWindowComplex.Json newFrame.SetBottomRailQty(m_nBottomRailQty); //Frame.AppliedDone(); for (var DimensionIndex = 0; DimensionIndex <= m_DimensionList.Count - 1; DimensionIndex++) - newFrame.DimensionList[DimensionIndex].dValue = m_DimensionList[DimensionIndex].dValue; + newFrame.DimensionList[DimensionIndex].dValue = m_DimensionList[DimensionIndex].Value; for (var JointIndex = 0; JointIndex <= m_JointList.Count - 1; JointIndex++) newFrame.JointList[JointIndex].SetSelJointType(m_JointList[JointIndex].JointType); foreach (var Area in AreaList) @@ -270,7 +270,7 @@ namespace WebWindowComplex.Json { private bool m_bIsSashVertical; [JsonProperty] - public bool bIsSashVertical + public bool IsSashVertical { get { @@ -385,14 +385,14 @@ namespace WebWindowComplex.Json { } - public JsonSash(bool bIsSashVertical, SashTypes SashType, bool SashBottomRail, int SashBottomRailQty, string Hardware, int nGroupId) : base(AreaTypes.SASH) + public JsonSash(bool IsSashVertical, SashTypes SashType, bool SashBottomRail, int SashBottomRailQty, string Hardware, int GroupId) : base(AreaTypes.SASH) { - m_bIsSashVertical = bIsSashVertical; + m_bIsSashVertical = IsSashVertical; m_SashType = SashType; m_bBottomRail = SashBottomRail; m_nBottomRailQty = SashBottomRailQty; m_Hardware = Hardware; - GroupId = nGroupId; + base.GroupId = GroupId; } internal override Area Deserialize(Area ParentArea, Window ParentWindow) @@ -407,8 +407,8 @@ namespace WebWindowComplex.Json for (var SashIndex = 0; SashIndex <= m_SashList.Count - 1; SashIndex++) { newSash.SashList[SashIndex].SetOpeningType(m_SashList[SashIndex].OpeningType); - newSash.SashList[SashIndex].SetHasHandle(m_SashList[SashIndex].bHasHandle); - newSash.SashList[SashIndex].SetDimension(m_SashList[SashIndex].dDimension); + newSash.SashList[SashIndex].SetHasHandle(m_SashList[SashIndex].HasHandle); + newSash.SashList[SashIndex].SetDimension(m_SashList[SashIndex].Dimension); } foreach (var Joint in m_JointList) newSash.JointList.Add(Joint.Deserialize((Area)ParentArea)); @@ -494,10 +494,10 @@ namespace WebWindowComplex.Json { } - public JsonSplit(SplitShapes SplitShape, int nGroupId) : base(AreaTypes.SPLIT) + public JsonSplit(SplitShapes SplitShape, int GroupId) : base(AreaTypes.SPLIT) { m_SplitShape = SplitShape; - GroupId = nGroupId; + base.GroupId = GroupId; } internal override Area Deserialize(Area ParentArea, Window ParentWindow) @@ -515,8 +515,8 @@ namespace WebWindowComplex.Json Split.SetSplitQtyVert(m_SplitVertList.Count - 1, true); for (var SplitIndex = 0; SplitIndex <= m_SplitVertList.Count - 1; SplitIndex++) { - Split.SplitVertList[SplitIndex].SetIsRelative(m_SplitVertList[SplitIndex].bIsRelative); - Split.SplitVertList[SplitIndex].SetDimension(m_SplitVertList[SplitIndex].dDimension); + Split.SplitVertList[SplitIndex].SetIsRelative(m_SplitVertList[SplitIndex].IsRelative); + Split.SplitVertList[SplitIndex].SetDimension(m_SplitVertList[SplitIndex].Dimension); } } if (m_SplitHorizList.Count == 0) @@ -527,8 +527,8 @@ namespace WebWindowComplex.Json Split.SetSplitQtyHoriz(m_SplitHorizList.Count - 1, true); for (var SplitIndex = 0; SplitIndex <= m_SplitHorizList.Count - 1; SplitIndex++) { - Split.SplitHorizList[SplitIndex].SetIsRelative(m_SplitHorizList[SplitIndex].bIsRelative); - Split.SplitHorizList[SplitIndex].SetDimension(m_SplitHorizList[SplitIndex].dDimension); + Split.SplitHorizList[SplitIndex].SetIsRelative(m_SplitHorizList[SplitIndex].IsRelative); + Split.SplitHorizList[SplitIndex].SetDimension(m_SplitHorizList[SplitIndex].Dimension); } } foreach (var Area in AreaList) @@ -548,9 +548,9 @@ namespace WebWindowComplex.Json public JsonSplitted() : base(AreaTypes.SPLITTED) { } - public JsonSplitted(int nGroupId) : base(AreaTypes.SPLITTED) + public JsonSplitted(int GroupId) : base(AreaTypes.SPLITTED) { - GroupId = nGroupId; + base.GroupId = GroupId; } internal override Area Deserialize(Area ParentArea, Window ParentWindow) @@ -593,10 +593,10 @@ namespace WebWindowComplex.Json { } - public JsonFill(FillTypes FillType, int nGroupId) : base(AreaTypes.FILL) + public JsonFill(FillTypes FillType, int GroupId) : base(AreaTypes.FILL) { m_FillType = FillType; - GroupId = nGroupId; + base.GroupId = GroupId; } internal override Area Deserialize(Area ParentArea, Window ParentWindow) @@ -622,7 +622,7 @@ namespace WebWindowComplex.Json { private int m_nIndex; [JsonProperty] - public int nIndex + public int Index { get { @@ -645,9 +645,9 @@ namespace WebWindowComplex.Json } } - public JsonJoint(int nIndex, Joints JointType) + public JsonJoint(int Index, Joints JointType) { - m_nIndex = nIndex; + m_nIndex = Index; m_JointType = JointType; } @@ -688,10 +688,10 @@ namespace WebWindowComplex.Json } } - public JsonHwOption(string sName, string sValue) + public JsonHwOption(string Name, string Value) { - m_Name = sName; - m_Value = sValue; + m_Name = Name; + m_Value = Value; } //internal AGBOption Deserialize() @@ -706,7 +706,7 @@ namespace WebWindowComplex.Json { private int m_nIndex; [JsonProperty] - public int nIndex + public int Index { get { @@ -716,7 +716,7 @@ namespace WebWindowComplex.Json private string m_sName; [JsonProperty] - public string sName + public string Name { get { @@ -726,7 +726,7 @@ namespace WebWindowComplex.Json private double m_dValue; [JsonProperty] - public double dValue + public double Value { get { @@ -738,11 +738,11 @@ namespace WebWindowComplex.Json } } - public JsonFrameDimension(int nIndex, string sName, double dValue) + public JsonFrameDimension(int Index, string Name, double Value) { - m_nIndex = nIndex; - m_sName = sName; - m_dValue = dValue; + m_nIndex = Index; + m_sName = Name; + m_dValue = Value; } } @@ -750,7 +750,7 @@ namespace WebWindowComplex.Json { private int m_nSashId; [JsonProperty] - public int nSashId + public int SashId { get { @@ -771,7 +771,7 @@ namespace WebWindowComplex.Json private bool m_bHasHandle; [JsonProperty] - public bool bHasHandle + public bool HasHandle { get { @@ -785,7 +785,7 @@ namespace WebWindowComplex.Json private double m_dDimension; [JsonProperty] - public double dDimension + public double Dimension { get { @@ -797,12 +797,12 @@ namespace WebWindowComplex.Json } } - public JsonSashDimension(Openings OpeningType, bool bHasHandle, double dDimension, int nSashId) + public JsonSashDimension(Openings OpeningType, bool HasHandle, double Dimension, int SashId) { m_OpeningType = OpeningType; - m_bHasHandle = bHasHandle; - m_dDimension = dDimension; - m_nSashId = nSashId; + m_bHasHandle = HasHandle; + m_dDimension = Dimension; + m_nSashId = SashId; } } @@ -810,7 +810,7 @@ namespace WebWindowComplex.Json { private bool m_bIsRelative = false; [JsonProperty] - public bool bIsRelative + public bool IsRelative { get { @@ -820,7 +820,7 @@ namespace WebWindowComplex.Json private double m_dDimension; [JsonProperty] - public double dDimension + public double Dimension { get { @@ -832,10 +832,10 @@ namespace WebWindowComplex.Json } } - public JsonSplitDimension(bool bIsRelative, double dDimension) + public JsonSplitDimension(bool IsRelative, double Dimension) { - m_bIsRelative = bIsRelative; - m_dDimension = dDimension; + m_bIsRelative = IsRelative; + m_dDimension = Dimension; } } diff --git a/WebWindowComplex/Models/AGBOptionCombo.cs b/WebWindowComplex/Models/AGBOptionCombo.cs index 352fe03..7d4f5ea 100644 --- a/WebWindowComplex/Models/AGBOptionCombo.cs +++ b/WebWindowComplex/Models/AGBOptionCombo.cs @@ -50,7 +50,7 @@ namespace WebWindowComplex.Models internal override JsonHwOption Serialize() { - JsonHwOption JsonHwOption = new JsonHwOption(sName, m_sValue.sDescription); + JsonHwOption JsonHwOption = new JsonHwOption(sName, m_sValue.sValue); return JsonHwOption; } diff --git a/WebWindowComplex/Models/Area.cs b/WebWindowComplex/Models/Area.cs index 858f6de..5292492 100644 --- a/WebWindowComplex/Models/Area.cs +++ b/WebWindowComplex/Models/Area.cs @@ -117,6 +117,7 @@ namespace WebWindowComplex.Models // Inserisco il riempimento precedente AreaList[0].AreaList.Add(ContentArea[0]); AreaList[0].AreaList[0].SetParentArea(AreaList[0]); + // Richiesta SVG con hardware di default ParentWindow.OnUpdatePreview(ParentWindow.sSerialized()); } diff --git a/WebWindowComplex/Models/Sash.cs b/WebWindowComplex/Models/Sash.cs index 636d240..c96580d 100644 --- a/WebWindowComplex/Models/Sash.cs +++ b/WebWindowComplex/Models/Sash.cs @@ -34,8 +34,8 @@ namespace WebWindowComplex.Models #region Public Events - public event EventHandler OnReqShape = delegate { }; - public event EventHandler OnReqHwOption = delegate { }; + //public event EventHandler OnReqShape = delegate { }; + //public event EventHandler OnReqHwOption = delegate { }; #endregion Public Events @@ -233,8 +233,8 @@ namespace WebWindowComplex.Models #if false // calcolo senza hw m_ParentWindow.OnUpdatePreview(JsonConvert.SerializeObject(m_ParentWindow.Serialize(true))); - m_ParentWindow.OnUpdatePreview(m_ParentWindow.sSerialized(true)); #endif + m_ParentWindow.OnUpdatePreview(m_ParentWindow.sSerialized(true)); // continuo refresh //ReqRefreshShape(); RefreshHardwareList(); @@ -486,7 +486,7 @@ namespace WebWindowComplex.Models m_CurrShape = ""; // chiamata evento calcolo shape: gruppo da calcolare - OnReqShapePreview(m_ParentWindow.sSerialized(), GroupId); + m_ParentWindow.OnReqShapePreview(m_ParentWindow.sSerialized(), GroupId); } } @@ -497,7 +497,7 @@ namespace WebWindowComplex.Models { HwOptionList.Clear(); // chiamata evento calcolo opzioni hardware - OnReqHwOptionPreview(m_ParentWindow.sSerialized(), GroupId); + m_ParentWindow.OnReqHwOptionPreview(m_ParentWindow.sSerialized(), GroupId ); } public void SetSelFamilyHardware(string sFamilyHw) @@ -552,7 +552,7 @@ namespace WebWindowComplex.Models newSash.SetSashBottomRail(false); newSash.SetSashBottomRailQty(0); newSash.SetSelFamilyHardware(Sash.s_FamilyHardwareList.First()); - newSash.ReqRefreshShape(); + //newSash.ReqRefreshShape(); newSash.RefreshHardwareOptionList(); newSash.SetFirstHardware(); return newSash; @@ -638,25 +638,25 @@ namespace WebWindowComplex.Models } } - internal void OnReqShapePreview(string sJwd, int groupId) - { - OnReqShapeEventArgs e = new OnReqShapeEventArgs(sJwd, groupId); - EventHandler handler = OnReqShape; - if (handler != null) - { - handler(this, e); - } - } + //internal void OnReqShapePreview(string sJwd, int groupId) + //{ + // OnReqShapeEventArgs e = new OnReqShapeEventArgs(sJwd, groupId); + // EventHandler handler = OnReqShape; + // if (handler != null) + // { + // handler(this, e); + // } + //} - internal void OnReqHwOptionPreview(string sJwd, int groupId) - { - OnReqHwOptEventArgs e = new OnReqHwOptEventArgs(sJwd, groupId); - EventHandler handler = OnReqHwOption; - if (handler != null) - { - handler(this, e); - } - } + //internal void OnReqHwOptionPreview(string sJwd, int groupId) + //{ + // OnReqHwOptEventArgs e = new OnReqHwOptEventArgs(sJwd, groupId); + // EventHandler handler = OnReqHwOption; + // if (handler != null) + // { + // handler(this, e); + // } + //} internal void RefreshHardwareOptionList() { @@ -755,7 +755,7 @@ namespace WebWindowComplex.Models case HwOptionTypes.COMBO: { AGBOptionCombo OptCombo = (AGBOptionCombo)HwOption; - var selValue = OptCombo.ValueList.Where(x => x.sDescription == selHwOption.Value).First(); + var selValue = OptCombo.ValueList.Where(x => x.sValue == selHwOption.Value).First(); OptCombo.sValue = selValue; break; } @@ -841,12 +841,12 @@ namespace WebWindowComplex.Models internal void SetSelHardwareFromId(string sId) { if (m_HardwareList.Count == 0) - SelHardware = m_HardwareCompleteList.FirstOrDefault(x => x.Id.Equals(sId)) ?? new Hardware(CustomHwId, "", "", Enums.OpeningTypes.Null, "", 0, 0); + m_SelHardware = m_HardwareCompleteList.FirstOrDefault(x => x.Id.Equals(sId)) ?? new Hardware(CustomHwId, "", "", Enums.OpeningTypes.Null, "", 0, 0); else - SelHardware = m_HardwareList.FirstOrDefault(x => x.Id.Equals(sId)) ?? new Hardware(CustomHwId, "", "", Enums.OpeningTypes.Null, "", 0, 0); + m_SelHardware = m_HardwareList.FirstOrDefault(x => x.Id.Equals(sId)) ?? new Hardware(CustomHwId, "", "", Enums.OpeningTypes.Null, "", 0, 0); if (SelHardware.Id == "") - SelHardware = m_HardwareList.First(); - ReqRefreshHwOption(); + m_SelHardware = m_HardwareList.First(); + //ReqRefreshHwOption(); } #endregion Internal Methods diff --git a/WebWindowComplex/Models/Window.cs b/WebWindowComplex/Models/Window.cs index 24440a4..ab31bdc 100644 --- a/WebWindowComplex/Models/Window.cs +++ b/WebWindowComplex/Models/Window.cs @@ -20,6 +20,8 @@ namespace WebWindowComplex.Models #region Public Events public event EventHandler OnPreview = delegate { }; + public event EventHandler OnReqShape = delegate { }; + public event EventHandler OnReqHwOption = delegate { }; #endregion Public Events @@ -103,6 +105,26 @@ namespace WebWindowComplex.Models } } + internal void OnReqShapePreview(string sJwd, int groupId) + { + OnReqShapeEventArgs e = new OnReqShapeEventArgs(sJwd, groupId); + EventHandler handler = OnReqShape; + if (handler != null) + { + handler(this, e); + } + } + + internal void OnReqHwOptionPreview(string sJwd, int groupId) + { + OnReqHwOptEventArgs e = new OnReqHwOptEventArgs(sJwd, groupId); + EventHandler handler = OnReqHwOption; + if (handler != null) + { + handler(this, e); + } + } + /// /// Serializzazione dell'oggetto windows /// diff --git a/WebWindowComplex/TableComp.razor.cs b/WebWindowComplex/TableComp.razor.cs index 652ca8d..4697947 100644 --- a/WebWindowComplex/TableComp.razor.cs +++ b/WebWindowComplex/TableComp.razor.cs @@ -74,6 +74,8 @@ namespace WebWindowComplex if (m_CurrWindow != null) { m_CurrWindow.OnPreview -= M_CurrWindow_OnPreview; + m_CurrWindow.OnReqHwOption -= M_CurrWindow_OnHwOption; + m_CurrWindow.OnReqShape -= M_CurrWindow_OnShape; m_CurrWindow = null; } } @@ -758,10 +760,14 @@ namespace WebWindowComplex if (m_CurrWindow != null) { m_CurrWindow.OnPreview -= M_CurrWindow_OnPreview; + m_CurrWindow.OnReqHwOption -= M_CurrWindow_OnHwOption; + m_CurrWindow.OnReqShape -= M_CurrWindow_OnShape; m_CurrWindow = null; } m_CurrWindow = WindowFromJson.Deserialize(); m_CurrWindow.OnPreview += M_CurrWindow_OnPreview; + m_CurrWindow.OnReqHwOption += M_CurrWindow_OnHwOption; + m_CurrWindow.OnReqShape += M_CurrWindow_OnShape; // Recupero dimensioni Frame e Joint del frame della finestra precedente if (m_PreviousWindow != null) { @@ -926,7 +932,6 @@ namespace WebWindowComplex // richiedo update shape List reqList = SashList.Select(x => x.GroupId).ToList(); _ = DoReqShape(reqList); - //await DoPreviewSvg(); } /// @@ -1161,6 +1166,28 @@ namespace WebWindowComplex _ = EC_DoUpdate.InvokeAsync(Args); } + private void M_CurrWindow_OnHwOption(object? sender, OnReqHwOptEventArgs e) + { + Dictionary Args = new Dictionary(); + Args.Add("Mode", $"{(int)Enums.QuestionModes.HARDWARE}"); + Args.Add("SubMode", $"{(int)Enums.QuestionHwSubModes.HARDWAREOPTIONS}"); + Args.Add("Jwd", e.sJwd); + string listGroupId = JsonConvert.SerializeObject(new List { e.nGroupId }); + Args.Add("GroupId", listGroupId); + _ = EC_DoUpdate.InvokeAsync(Args); + } + + private void M_CurrWindow_OnShape(object? sender, OnReqShapeEventArgs e) + { + Dictionary Args = new Dictionary(); + Args.Add("Mode", $"{(int)Enums.QuestionModes.HARDWARE}"); + Args.Add("SubMode", $"{(int)Enums.QuestionHwSubModes.SASHSHAPE}"); + Args.Add("Jwd", e.sJwd); + string listGroupId = JsonConvert.SerializeObject(new List { e.groupId }); + Args.Add("GroupId", listGroupId); + _ = EC_DoUpdate.InvokeAsync(Args); + } + /// /// Calcola larghezza colonna contenente nav da mostrare /// @@ -1349,7 +1376,7 @@ namespace WebWindowComplex private async Task UpdateHwOptions(Sash newSash) { // richiesta calcolo opzioni hardware per la singola sash group - string req = newSash.SelHardware.Id; + //string req = newSash.SelHardware.Id; List reqList = new List() { newSash.GroupId }; // chiamo con gruppo della nuova sash await DoReqOptHardware(reqList); diff --git a/WebWindowComplex/WebWindowComplex.csproj b/WebWindowComplex/WebWindowComplex.csproj index fc2cdb5..9e0959b 100644 --- a/WebWindowComplex/WebWindowComplex.csproj +++ b/WebWindowComplex/WebWindowComplex.csproj @@ -6,7 +6,7 @@ net8.0 enable enable - 2.7.10.3017 + 2.7.10.3114 Annamaria Sassi Egalware Componente gestione Configurazioni avanzate Window per LUX @@ -218,6 +218,22 @@ + + + + + + + + + + + + + + + + diff --git a/WebWindowConfigurator/WebWindowConfigurator.csproj b/WebWindowConfigurator/WebWindowConfigurator.csproj index dea51fc..f4c5bb5 100644 --- a/WebWindowConfigurator/WebWindowConfigurator.csproj +++ b/WebWindowConfigurator/WebWindowConfigurator.csproj @@ -6,7 +6,7 @@ net8.0 enable enable - 2.7.10.3017 + 2.7.10.3114 Annamaria Sassi Egalware Componente gestione JWD per LUX @@ -318,6 +318,26 @@ + + + + + + + + + + + + + + + + + + + + From 86f3d59a981717dbf4b5c819a1a8a2b737508045 Mon Sep 17 00:00:00 2001 From: Annamaria Sassi Date: Mon, 3 Nov 2025 15:27:41 +0100 Subject: [PATCH 25/26] - Aggiunto componente Hw Option e sua gestione - Utilizzate liste nei select (forma frame, tipo apertura sash, forma split) --- WebWindowComplex/Compo/AreaHwOption.razor | 59 ++++---- WebWindowComplex/Compo/AreaHwOption.razor.cs | 18 +++ WebWindowComplex/Compo/AreaSash.razor | 8 +- WebWindowComplex/Compo/CardFrame.razor | 15 +- WebWindowComplex/Compo/CardFrame.razor.cs | 4 +- WebWindowComplex/Compo/CardSashGroup.razor | 99 +++++-------- WebWindowComplex/Compo/CardSashGroup.razor.cs | 16 ++ WebWindowComplex/Compo/CardSplit.razor | 8 +- WebWindowComplex/Compo/CardTree.razor | 7 +- WebWindowComplex/Models/Frame.cs | 8 +- WebWindowComplex/Models/Sash.cs | 21 +-- WebWindowComplex/Models/SashDimension.cs | 22 ++- WebWindowComplex/Models/Split.cs | 6 +- WebWindowComplex/TableComp.razor | 1 + WebWindowComplex/TableComp.razor.cs | 140 ++++++------------ WebWindowComplex/WebWindowComplex.csproj | 10 +- .../WebWindowConfigurator.csproj | 16 +- 17 files changed, 238 insertions(+), 220 deletions(-) diff --git a/WebWindowComplex/Compo/AreaHwOption.razor b/WebWindowComplex/Compo/AreaHwOption.razor index 7eb168f..ab8235d 100644 --- a/WebWindowComplex/Compo/AreaHwOption.razor +++ b/WebWindowComplex/Compo/AreaHwOption.razor @@ -1,32 +1,33 @@ @using static WebWindowComplex.Json.WindowConst -@if (CurrSash.HwOptionList.Count > 0) -{ -
-
-
-
-
Hardware option
-
-
- @foreach (var currOpt in CurrSash.HwOptionList) - { - switch (currOpt.Type) - { - case HwOptionTypes.COMBO: - { - AGBOptionCombo currOptCombo = (AGBOptionCombo)currOpt; - - break; - } - case HwOptionTypes.TEXT: - { - AGBOptionText currOptText = (AGBOptionText)currOpt; - - break; - } - } - } -
+
+
+
Hardware option
-} \ No newline at end of file +
+ +
+
+
+ @if (!hwOptCollapsed) + { + @foreach (var currOpt in CurrSash.HwOptionList) + { + switch (currOpt.Type) + { + case HwOptionTypes.COMBO: + { + AGBOptionCombo currOptCombo = (AGBOptionCombo)currOpt; + + break; + } + case HwOptionTypes.TEXT: + { + AGBOptionText currOptText = (AGBOptionText)currOpt; + + break; + } + } + } + } +
\ No newline at end of file diff --git a/WebWindowComplex/Compo/AreaHwOption.razor.cs b/WebWindowComplex/Compo/AreaHwOption.razor.cs index ba75421..8262460 100644 --- a/WebWindowComplex/Compo/AreaHwOption.razor.cs +++ b/WebWindowComplex/Compo/AreaHwOption.razor.cs @@ -1,5 +1,6 @@ using Microsoft.AspNetCore.Components; using System.Runtime.CompilerServices; +using System.Threading.Tasks; using WebWindowComplex.Models; using static WebWindowComplex.Json.WindowConst; @@ -25,6 +26,23 @@ namespace WebWindowComplex.Compo [Parameter] public EventCallback EC_UpdateHwOptText { get; set; } + /// + /// Evento per chiamare la prima volta la lista delle opzioni + /// + [Parameter] + public EventCallback EC_FirstHwOptionList { get; set; } + + private bool hwOptCollapsed = true; + + private async Task changeCollapsed() + { + hwOptCollapsed = !hwOptCollapsed; + if(CurrSash.HwOptionList.Count == 0) + { + await EC_FirstHwOptionList.InvokeAsync(CurrSash.GroupId); + } + } + /// /// Report aggiornamento Option Combo /// diff --git a/WebWindowComplex/Compo/AreaSash.razor b/WebWindowComplex/Compo/AreaSash.razor index 8f50168..ed32baf 100644 --- a/WebWindowComplex/Compo/AreaSash.razor +++ b/WebWindowComplex/Compo/AreaSash.razor @@ -5,7 +5,11 @@
diff --git a/WebWindowComplex/Compo/CardFrame.razor b/WebWindowComplex/Compo/CardFrame.razor index a01154e..61f1efe 100644 --- a/WebWindowComplex/Compo/CardFrame.razor +++ b/WebWindowComplex/Compo/CardFrame.razor @@ -17,14 +17,18 @@
@@ -103,5 +107,10 @@ @if (!(FrameWindow.AreaList[0] is Split) || (SashList.Count == 0 && SplitList.Count == 0)) { - + + } diff --git a/WebWindowComplex/Compo/CardFrame.razor.cs b/WebWindowComplex/Compo/CardFrame.razor.cs index df31459..efacc89 100644 --- a/WebWindowComplex/Compo/CardFrame.razor.cs +++ b/WebWindowComplex/Compo/CardFrame.razor.cs @@ -71,7 +71,7 @@ namespace WebWindowComplex.Compo /// private async Task AddSash() { - await EC_UpdateShape.InvokeAsync(FrameWindow); + //await EC_UpdateShape.InvokeAsync(FrameWindow); await EC_AddSash.InvokeAsync(true); } @@ -130,6 +130,8 @@ namespace WebWindowComplex.Compo { if (FrameWindow.SelShapeIndex != value) { + //foreach(var s in SashList) + // s.SelHardwareFromId = "000000"; FrameWindow.SelShapeIndex = value; _ = EC_UpdateShape.InvokeAsync(FrameWindow); } diff --git a/WebWindowComplex/Compo/CardSashGroup.razor b/WebWindowComplex/Compo/CardSashGroup.razor index 3384dc4..8ced13c 100644 --- a/WebWindowComplex/Compo/CardSashGroup.razor +++ b/WebWindowComplex/Compo/CardSashGroup.razor @@ -46,32 +46,6 @@
-
-
Joints
-
-
-
- -
-
-
-
- -
-
-
-
- -
-
-
- @foreach (Joint joint in CurrItem.JointList) - { - - } -
-
-
Hardware
@@ -97,7 +71,7 @@
} @@ -105,7 +79,7 @@ {
- @foreach (var hlItem in CurrItem.HardwareList) { @@ -113,40 +87,40 @@ }
+ + + } +
+
+
+
+
Joints
+
+
+
+ +
+
+
+
+ +
+
+
+
+ +
+
+
+ @foreach (Joint joint in CurrItem.JointList) + { + }
- - @*
-
-
-
-
Hardware option
-
-
- @if (CurrItem.HwOptionList.Count > 0) - { - @foreach (var currOpt in CurrItem.HwOptionList) - { - switch (currOpt.Type) - { - case HwOptionTypes.COMBO: - { - AGBOptionCombo currOptCombo = (AGBOptionCombo)currOpt; - - break; - } - case HwOptionTypes.TEXT: - { - AGBOptionText currOptText = (AGBOptionText)currOpt; - - break; - } - } - } - } -
-
*@
@@ -155,7 +129,12 @@
@for (int i = 0; i < CurrItem.SashList.Count; i++) { - + + }
diff --git a/WebWindowComplex/Compo/CardSashGroup.razor.cs b/WebWindowComplex/Compo/CardSashGroup.razor.cs index b9c3517..833bab4 100644 --- a/WebWindowComplex/Compo/CardSashGroup.razor.cs +++ b/WebWindowComplex/Compo/CardSashGroup.razor.cs @@ -62,6 +62,12 @@ namespace WebWindowComplex.Compo [Parameter] public EventCallback EC_UpdateSashHardware { get; set; } + /// + /// Evento per richiedere la prima volta le opzioni hardware + /// + [Parameter] + public EventCallback EC_CallFirstHwOpt { get; set; } + /// /// Lista di sash /// @@ -199,6 +205,16 @@ namespace WebWindowComplex.Compo } } + /// + /// Prima chiamata hw option list + /// + /// + /// + private async Task FirstHwOptionList(int groupId) + { + await EC_CallFirstHwOpt.InvokeAsync(groupId); + } + #endregion Private Methods } } \ No newline at end of file diff --git a/WebWindowComplex/Compo/CardSplit.razor b/WebWindowComplex/Compo/CardSplit.razor index 55b2a7e..bead55d 100644 --- a/WebWindowComplex/Compo/CardSplit.razor +++ b/WebWindowComplex/Compo/CardSplit.razor @@ -34,10 +34,14 @@
diff --git a/WebWindowComplex/Compo/CardTree.razor b/WebWindowComplex/Compo/CardTree.razor index 214df6d..9e7c659 100644 --- a/WebWindowComplex/Compo/CardTree.razor +++ b/WebWindowComplex/Compo/CardTree.razor @@ -9,29 +9,34 @@ { CompileStep cs = CompileStep.Frame; int ind = -1; + string s = "Vai a step "; @if (j + 1 == ItemTableList[i].Col) { @if (ItemTableList[i].Type is Json.WindowConst.AreaTypes.FRAME) { cs = CompileStep.Frame; + s = s + cs.ToString(); } else if (ItemTableList[i].Type is Json.WindowConst.AreaTypes.SPLIT) { cs = CompileStep.Split; ind = ItemTableList[i].IndexItem; + s = s + cs.ToString() + ((ind + 1) > 0 ? (ind + 1): ""); } else if (ItemTableList[i].Type is Json.WindowConst.AreaTypes.SASH) { cs = CompileStep.Sash; ind = ItemTableList[i].IndexItem; + s = s + cs.ToString() + ((ind + 1) > 0 ? (ind + 1) : ""); } else if (ItemTableList[i].Type is Json.WindowConst.AreaTypes.FILL) { cs = CompileStep.Fill; ind = ItemTableList[i].IndexItem; + s = s + cs.ToString() + ((ind + 1) > 0 ? (ind + 1) : ""); } - + } else diff --git a/WebWindowComplex/Models/Frame.cs b/WebWindowComplex/Models/Frame.cs index 7ec1e72..4ef5eb4 100644 --- a/WebWindowComplex/Models/Frame.cs +++ b/WebWindowComplex/Models/Frame.cs @@ -79,11 +79,13 @@ namespace WebWindowComplex.Models { get { - return IdNameStruct.IndFromId((int)m_Shape, m_ShapeList); + //return IdNameStruct.IndFromId((int)m_Shape, m_ShapeList); + return (int)m_Shape; } set { - Shapes SelShape = (Shapes)IdNameStruct.IdFromInd(value, m_ShapeList); + //Shapes SelShape = (Shapes)IdNameStruct.IdFromInd(value, m_ShapeList); + Shapes SelShape = (Shapes)value; if (m_Shape != SelShape) { // salvo vecchie dimensioni @@ -194,7 +196,7 @@ namespace WebWindowComplex.Models } m_Shape = SelShape; } - m_ParentWindow.OnUpdatePreview(m_ParentWindow.sSerialized()); + //m_ParentWindow.OnUpdatePreview(m_ParentWindow.sSerialized()); } } diff --git a/WebWindowComplex/Models/Sash.cs b/WebWindowComplex/Models/Sash.cs index c96580d..85ce272 100644 --- a/WebWindowComplex/Models/Sash.cs +++ b/WebWindowComplex/Models/Sash.cs @@ -229,14 +229,7 @@ namespace WebWindowComplex.Models } } } - // arriva come terzo evento refresh!!! -#if false - // calcolo senza hw - m_ParentWindow.OnUpdatePreview(JsonConvert.SerializeObject(m_ParentWindow.Serialize(true))); -#endif - m_ParentWindow.OnUpdatePreview(m_ParentWindow.sSerialized(true)); - // continuo refresh - //ReqRefreshShape(); + //m_ParentWindow.OnUpdatePreview(m_ParentWindow.sSerialized(true)); RefreshHardwareList(); RefreshHardwareOptionList(); SetFirstHardware(); @@ -355,9 +348,9 @@ namespace WebWindowComplex.Models } set { - m_SelHardware = m_HardwareList.FirstOrDefault(x => !string.IsNullOrEmpty(value) && x.Id.Equals(value)) ?? new Hardware("", "", "", Enums.OpeningTypes.Null, "", 0, 0); - ReqRefreshHwOption(); - ParentWindow.OnUpdatePreview(ParentWindow.sSerialized()); + m_SelHardware = m_HardwareList.FirstOrDefault(x => !string.IsNullOrEmpty(value) && x.Id.Equals(value)) ?? new Hardware(CustomHwId, "", "", Enums.OpeningTypes.Null, "", 0, 0); + //ReqRefreshHwOption(); + //ParentWindow.OnUpdatePreview(ParentWindow.sSerialized()); } } @@ -415,10 +408,10 @@ namespace WebWindowComplex.Models newSash.SetIsSashVertical(bIsSashVertical); newSash.SetOrientationSashType(OrientationSashType); newSash.SetSashBottomRailQty(SashBottomRailQty); - newSash.SetSelFamilyHardwareFromIndex(SelHardware.Id); + newSash.SetSelFamilyHardwareFromIndex(m_SelHardware.Id); newSash.ReqRefreshShape(); newSash.RefreshHardwareOptionList(); - newSash.SetSelHardware(SelHardware); + newSash.SetSelHardware(m_SelHardware); for (int i = 0; i < SashList.Count; i++) { //Cancello SashDimension di default e aggiungo la copia @@ -694,7 +687,7 @@ namespace WebWindowComplex.Models if (m_HardwareList.Count > 0) { m_SelHardware = m_HardwareList.First(); - ReqRefreshHwOption(); + //ReqRefreshHwOption(); } } diff --git a/WebWindowComplex/Models/SashDimension.cs b/WebWindowComplex/Models/SashDimension.cs index 3fbd106..7703010 100644 --- a/WebWindowComplex/Models/SashDimension.cs +++ b/WebWindowComplex/Models/SashDimension.cs @@ -106,7 +106,7 @@ namespace WebWindowComplex.Models set { m_bHasHandle = value; - m_Parent.ParentWindow.OnUpdatePreview(m_Parent.ParentWindow.sSerialized()); + //m_Parent.ParentWindow.OnUpdatePreview(m_Parent.ParentWindow.sSerialized()); } } @@ -239,15 +239,23 @@ namespace WebWindowComplex.Models { get { - return IdNameStruct.IndFromId((int)m_SelOpeningType, m_OpeningTypeList); + //return IdNameStruct.IndFromId((int)m_SelOpeningType, m_OpeningTypeList); + return (int)m_SelOpeningType; } set { - m_SelOpeningType = (Openings)IdNameStruct.IdFromInd(value, m_OpeningTypeList); - m_Parent.ReqRefreshShape(); - m_Parent.RefreshHardwareOptionList(); - m_Parent.SetFirstHardware(); - m_Parent.ParentWindow.OnUpdatePreview(m_Parent.ParentWindow.sSerialized()); + //Openings newOpening = (Openings)IdNameStruct.IdFromInd(value, m_OpeningTypeList); + Openings newOpening = (Openings)value; + if ((newOpening != Openings.TILTTURN_LEFT && newOpening != Openings.TILTTURN_RIGHT) || + (newOpening == Openings.TILTTURN_LEFT && m_bHasHandle) || + (newOpening == Openings.TILTTURN_RIGHT && m_bHasHandle)) + { + m_SelOpeningType = newOpening; + m_Parent.ReqRefreshShape(); + m_Parent.RefreshHardwareOptionList(); + m_Parent.SetFirstHardware(); + m_Parent.ParentWindow.OnUpdatePreview(m_Parent.ParentWindow.sSerialized()); + } } } diff --git a/WebWindowComplex/Models/Split.cs b/WebWindowComplex/Models/Split.cs index d0b49b6..885e9b8 100644 --- a/WebWindowComplex/Models/Split.cs +++ b/WebWindowComplex/Models/Split.cs @@ -222,11 +222,13 @@ namespace WebWindowComplex.Models { get { - return IdNameStruct.IndFromId((int)m_SelSplitShape, m_SplitShapeList); + //return IdNameStruct.IndFromId((int)m_SelSplitShape, m_SplitShapeList); + return (int)m_SelSplitShape; } set { - m_SelSplitShape = (SplitShapes)IdNameStruct.IdFromInd(value, m_SplitShapeList); + //m_SelSplitShape = (SplitShapes)IdNameStruct.IdFromInd(value, m_SplitShapeList); + m_SelSplitShape = (SplitShapes)value; // Cancello elementi nello split e azzero quantità orizzontale e verticale AreaList.Clear(); SetSplitQtyVert(0); diff --git a/WebWindowComplex/TableComp.razor b/WebWindowComplex/TableComp.razor index 37e7422..c63c04a 100644 --- a/WebWindowComplex/TableComp.razor +++ b/WebWindowComplex/TableComp.razor @@ -174,6 +174,7 @@ EC_RemoveArea="RemoveArea" EC_UpdateSash="UpdateSash" EC_UpdateSashHardware="UpdateHwOptions" + EC_CallFirstHwOpt="CallFirstHwOpt" EC_ReqClose="ReturnTree"> } diff --git a/WebWindowComplex/TableComp.razor.cs b/WebWindowComplex/TableComp.razor.cs index 4697947..e244d2c 100644 --- a/WebWindowComplex/TableComp.razor.cs +++ b/WebWindowComplex/TableComp.razor.cs @@ -187,7 +187,7 @@ namespace WebWindowComplex { if (s.Equals(currSash)) { - // Per ogni anta della Sash setto bHasHandle + // Per ogni anta della Sash setto HasHandle foreach (SashDimension item in s.SashList) { if (item.Equals(sashDim)) @@ -201,15 +201,19 @@ namespace WebWindowComplex switch (item.SelOpeningType) { case Openings.TILTTURN_LEFT: - item.SetOpeningType(Openings.TURNONLY_LEFT); - break; - + { + item.SetOpeningType(Openings.TURNONLY_LEFT); + break; + } case Openings.TILTTURN_RIGHT: - item.SetOpeningType(Openings.TURNONLY_RIGHT); - break; - + { + item.SetOpeningType(Openings.TURNONLY_RIGHT); + break; + } default: - break; + { + break; + } } } item.bHasHandle = false; @@ -217,6 +221,9 @@ namespace WebWindowComplex } } } + currSash.RefreshHardwareList(); + currSash.SetFirstHardware(); + _ = DoPreviewSvg(); } /// @@ -485,7 +492,7 @@ namespace WebWindowComplex /// /// Lista degli ID numerici dei gruppi da valutare /// - protected async Task DoReqOptHardware(List groupIdList) + protected async Task DoReqOptHardware(List groupIdList, bool isFirst = false) { if (m_CurrWindow != null) { @@ -495,7 +502,7 @@ namespace WebWindowComplex var CurrJwd = JsonConvert.SerializeObject(m_CurrWindow.Serialize()); #endif // verifico variazione JWD - if (!prevJwd.Equals(CurrJwd)) + if (!prevJwd.Equals(CurrJwd) || isFirst) { prevJwd = CurrJwd; Dictionary Args = new Dictionary(); @@ -636,69 +643,6 @@ namespace WebWindowComplex } } checkWarnings(); -#if false - // controllo sia popolato anche per la componente LIVE - if (LiveData.IsValid()) - { - // SOLO SE modificato live data... - if (prevLiveData == null || !prevLiveData.Equals(LiveData)) - { - prevLiveData = new LivePayload() - { - CurrJwd = LiveData.CurrJwd, - OptionsXml = LiveData.OptionsXml, - DictShape = LiveData.DictShape, - SvgPreview = LiveData.SvgPreview - }; - m_SelSVG = LiveData.SvgPreview; - // Aggiornati parametri di ingresso selezionati - UpdateSelParameter(); - JsonWindow WindowFromJson = new JsonWindow("", "", "", ""); - // provo a deserializzare - try - { - WindowFromJson = JsonConvert.DeserializeObject(LiveData.CurrJwd, new PolymorphicJsonConverter()) ?? new JsonWindow("", "", "", ""); - setCurrWindow(WindowFromJson); - //SOLO SE non sono in edit... - if (!editLock) - { - currStep = CompileStep.Tree; - } - } - // altrimenti errore! - catch (Exception ex) - { - listErrLink.Add("Window", $"Deserializing Error:{Environment.NewLine}{ex}"); - } - updateSvg = true; - } - checkWarnings(); - } - else if (CurrSelection != null && CurrSelection.Template != null) - { - // Se viene passato il template selezionato oppure se non è ancora stato selezionato un template oppure se si cambia template di selezione - if (m_SelTemplate == null || (m_SelTemplate != null && CurrSelection.Template.nIndex != m_SelTemplate.nIndex) && !string.IsNullOrEmpty(CurrSelection.Template.JWD)) - { - m_SelTemplate = CurrSelection.Template; - // Aggiornamento parametri di ingresso selezionati - UpdateSelParameter(); - JsonWindow WindowFromJson = new JsonWindow("", "", "", ""); - // provo a deserializzare - try - { - WindowFromJson = JsonConvert.DeserializeObject(m_SelTemplate.JWD, new PolymorphicJsonConverter()) ?? new JsonWindow("", "", "", ""); - setCurrWindow(WindowFromJson); - currStep = CompileStep.Template; - } - // altrimenti errore! - catch (Exception ex) - { - listErrLink.Add("Window", $"Deserializing Error:{Environment.NewLine}{ex}"); - } - } - updateSvg = true; - } -#endif if (SashList.Count > 0) { currAnta = 0; @@ -721,21 +665,21 @@ namespace WebWindowComplex await DoReqShape(reqList); } } - // se mancasse xml opzioni hardware lo chiedo - else if (LiveData.DictOptionsXml.Count == 0) - { - if (firstDisplay && isRendered) - { - firstDisplay = false; - // preview SVG senza HW - await DoPreviewSvg(true, true); - } - List reqList = SashList.Select(x => x.GroupId).ToList(); - if (reqList.Count > 0) - { - await DoReqOptHardware(reqList); - } - } + //// se mancasse xml opzioni hardware lo chiedo + //else if (LiveData.DictOptionsXml.Count == 0) + //{ + // if (firstDisplay && isRendered) + // { + // firstDisplay = false; + // // preview SVG senza HW + // await DoPreviewSvg(true, true); + // } + // List reqList = SashList.Select(x => x.GroupId).ToList(); + // if (reqList.Count > 0) + // { + // await DoReqOptHardware(reqList); + // } + //} else { // chiedo SVG @@ -1249,6 +1193,7 @@ namespace WebWindowComplex /// private void RemoveArea(Area currArea) { + //LiveData.DictShape.Clear(); if (currArea is Split) ((Split)currArea).Remove(); else if (currArea is Sash) @@ -1382,6 +1327,18 @@ namespace WebWindowComplex await DoReqOptHardware(reqList); } + /// + /// Prima chiamata alle opzioni hardware + /// + /// Group Id del sash group di cui si vuole Hw option + /// + private async Task CallFirstHwOpt(int groupId) + { + bool isFirst = true; + List reqList = new List() { groupId }; + await DoReqOptHardware(reqList, isFirst); + } + /// /// Aggiornamento Sash e Frame /// @@ -1400,16 +1357,11 @@ namespace WebWindowComplex /// private async Task UpdateShape(Frame newFrame) { + //LiveData.DictShape.Clear(); FrameWindow = newFrame; // ciclo x ogni group della mia frame List reqList = SashList.Select(x => x.GroupId).ToList(); await DoReqShape(reqList); -#if false - foreach (var item in SashList) - { - await DoReqShape(item.GroupId); - } -#endif } /// diff --git a/WebWindowComplex/WebWindowComplex.csproj b/WebWindowComplex/WebWindowComplex.csproj index 9e0959b..0aa7741 100644 --- a/WebWindowComplex/WebWindowComplex.csproj +++ b/WebWindowComplex/WebWindowComplex.csproj @@ -6,7 +6,7 @@ net8.0 enable enable - 2.7.10.3114 + 2.7.11.315 Annamaria Sassi Egalware Componente gestione Configurazioni avanzate Window per LUX @@ -242,6 +242,14 @@ + + + + + + + + diff --git a/WebWindowConfigurator/WebWindowConfigurator.csproj b/WebWindowConfigurator/WebWindowConfigurator.csproj index f4c5bb5..4b25143 100644 --- a/WebWindowConfigurator/WebWindowConfigurator.csproj +++ b/WebWindowConfigurator/WebWindowConfigurator.csproj @@ -6,7 +6,7 @@ net8.0 enable enable - 2.7.10.3114 + 2.7.11.315 Annamaria Sassi Egalware Componente gestione JWD per LUX @@ -343,6 +343,20 @@ + + + + + + + + + + + + + + From d384b9d5ed4cfc919f24cfbb93eb61b576d4d892 Mon Sep 17 00:00:00 2001 From: Annamaria Sassi Date: Mon, 3 Nov 2025 15:41:35 +0100 Subject: [PATCH 26/26] Aggiornati nomi tipologie aperture sash --- WebWindowComplex/Models/SashDimension.cs | 37 +++++++++++++------ WebWindowComplex/WebWindowComplex.csproj | 3 ++ .../WebWindowConfigurator.csproj | 3 ++ 3 files changed, 31 insertions(+), 12 deletions(-) diff --git a/WebWindowComplex/Models/SashDimension.cs b/WebWindowComplex/Models/SashDimension.cs index 7703010..c03399f 100644 --- a/WebWindowComplex/Models/SashDimension.cs +++ b/WebWindowComplex/Models/SashDimension.cs @@ -310,18 +310,31 @@ namespace WebWindowComplex.Models private List m_OpeningTypeList = new List { - new IdNameStruct((int)Openings.TURNONLY_LEFT, ">"), - new IdNameStruct((int)Openings.TURNONLY_RIGHT, "<"), - new IdNameStruct((int)Openings.TILTTURN_LEFT, ">*"), - new IdNameStruct((int)Openings.TILTTURN_RIGHT, "<*"), - new IdNameStruct((int)Openings.TILTONLY_TOP, "˄"), - new IdNameStruct((int)Openings.TILTONLY_BOTTOM, "˅"), - new IdNameStruct((int)Openings.PIVOT, "◊"), - new IdNameStruct((int)Openings.FIXED, "X"), - new IdNameStruct((int)Openings.COMPLANARSLIDE_LEFT, "-→"), - new IdNameStruct((int)Openings.COMPLANARSLIDE_RIGHT, "←-"), - new IdNameStruct((int)Openings.LIFTSLIDE_LEFT, "┌→"), - new IdNameStruct((int)Openings.LIFTSLIDE_RIGHT, "←┐") + new IdNameStruct((int)Openings.TURNONLY_LEFT, "A bandiera sinistra"), + new IdNameStruct((int)Openings.TURNONLY_RIGHT, "A bandiera destra"), + new IdNameStruct((int)Openings.TILTTURN_LEFT, "Ad anta-ribalta sinistra"), + new IdNameStruct((int)Openings.TILTTURN_RIGHT, "Ad anta-ribalta destra"), + new IdNameStruct((int)Openings.TILTONLY_TOP, "Solo verso alto"), + new IdNameStruct((int)Openings.TILTONLY_BOTTOM, "Solo verso basso"), + new IdNameStruct((int)Openings.PIVOT, "Pivot"), + new IdNameStruct((int)Openings.FIXED, "Fissa"), + new IdNameStruct((int)Openings.COMPLANARSLIDE_LEFT, "Complanare sinistra"), + new IdNameStruct((int)Openings.COMPLANARSLIDE_RIGHT, "Complanare destra"), + new IdNameStruct((int)Openings.LIFTSLIDE_LEFT, "Scorrevole sinistra"), + new IdNameStruct((int)Openings.LIFTSLIDE_RIGHT, "Scorrevole destra") + + //new IdNameStruct((int)Openings.TURNONLY_LEFT, ">"), + //new IdNameStruct((int)Openings.TURNONLY_RIGHT, "<"), + //new IdNameStruct((int)Openings.TILTTURN_LEFT, ">*"), + //new IdNameStruct((int)Openings.TILTTURN_RIGHT, "<*"), + //new IdNameStruct((int)Openings.TILTONLY_TOP, "˄"), + //new IdNameStruct((int)Openings.TILTONLY_BOTTOM, "˅"), + //new IdNameStruct((int)Openings.PIVOT, "◊"), + //new IdNameStruct((int)Openings.FIXED, "X"), + //new IdNameStruct((int)Openings.COMPLANARSLIDE_LEFT, "-→"), + //new IdNameStruct((int)Openings.COMPLANARSLIDE_RIGHT, "←-"), + //new IdNameStruct((int)Openings.LIFTSLIDE_LEFT, "┌→"), + //new IdNameStruct((int)Openings.LIFTSLIDE_RIGHT, "←┐") }; // reference diff --git a/WebWindowComplex/WebWindowComplex.csproj b/WebWindowComplex/WebWindowComplex.csproj index 0aa7741..732ce7a 100644 --- a/WebWindowComplex/WebWindowComplex.csproj +++ b/WebWindowComplex/WebWindowComplex.csproj @@ -255,6 +255,9 @@ + + + diff --git a/WebWindowConfigurator/WebWindowConfigurator.csproj b/WebWindowConfigurator/WebWindowConfigurator.csproj index 4b25143..b3ffd65 100644 --- a/WebWindowConfigurator/WebWindowConfigurator.csproj +++ b/WebWindowConfigurator/WebWindowConfigurator.csproj @@ -368,6 +368,9 @@ + + +