From 94744e55bd20047213c29cc859d6e8f1693a9741 Mon Sep 17 00:00:00 2001 From: Marcel Ferreira Date: Fri, 10 Oct 2025 21:27:18 -0700 Subject: [PATCH 1/6] Support new MSAPP format: Add ControlPropertyState and Category fields to schema classes --- .../EditorState/DynamicPropertyState.cs | 3 +++ src/PAModel/EditorState/PropertyState.cs | 1 + src/PAModel/IR/IRStateHelpers.cs | 26 ++++++++++++++----- src/PAModel/Schemas/adhoc/Control.cs | 6 +++++ 4 files changed, 30 insertions(+), 6 deletions(-) diff --git a/src/PAModel/EditorState/DynamicPropertyState.cs b/src/PAModel/EditorState/DynamicPropertyState.cs index 4396425f..2835a954 100644 --- a/src/PAModel/EditorState/DynamicPropertyState.cs +++ b/src/PAModel/EditorState/DynamicPropertyState.cs @@ -15,6 +15,9 @@ public class DynamicPropertyState public PropertyState Property { get; set; } + // Object with additional properties like AFDDataSourceName, etc. + public object ControlPropertyState { get; set; } + [JsonExtensionData] public Dictionary ExtensionData { get; set; } } diff --git a/src/PAModel/EditorState/PropertyState.cs b/src/PAModel/EditorState/PropertyState.cs index d72b978d..e755f0bb 100644 --- a/src/PAModel/EditorState/PropertyState.cs +++ b/src/PAModel/EditorState/PropertyState.cs @@ -16,6 +16,7 @@ public class PropertyState public string PropertyName { get; set; } public string NameMap { get; set; } public string RuleProviderType { get; set; } // = "Unknown"; + public string Category { get; set; } [JsonExtensionData] public Dictionary ExtensionData { get; set; } } diff --git a/src/PAModel/IR/IRStateHelpers.cs b/src/PAModel/IR/IRStateHelpers.cs index 3aefef65..0c5afb01 100644 --- a/src/PAModel/IR/IRStateHelpers.cs +++ b/src/PAModel/IR/IRStateHelpers.cs @@ -5,6 +5,7 @@ using Microsoft.PowerPlatform.Formulas.Tools.ControlTemplates; using Microsoft.PowerPlatform.Formulas.Tools.EditorState; using System.Linq; +using System.Text.Json; using Microsoft.AppMagic.Authoring.Persistence; using Microsoft.PowerPlatform.Formulas.Tools.Schemas; using static Microsoft.PowerPlatform.Formulas.Tools.ControlInfoJson; @@ -292,14 +293,14 @@ private static (PropertyNode prop, PropertyState state) SplitProperty(RuleEntry { var script = rule.InvariantScript; var prop = new PropertyNode() { Expression = new ExpressionNode() { Expression = script }, Identifier = rule.Property }; - var state = new PropertyState() { PropertyName = rule.Property, ExtensionData = rule.ExtensionData, NameMap = rule.NameMap, RuleProviderType = rule.RuleProviderType }; + var state = new PropertyState() { PropertyName = rule.Property, ExtensionData = rule.ExtensionData, NameMap = rule.NameMap, RuleProviderType = rule.RuleProviderType, Category = rule.Category }; return (prop, state); } private static (PropertyNode prop, DynamicPropertyState state) SplitDynamicProperty(DynamicPropertyJson dynamicProperty) { var (prop, propertyState) = SplitProperty(dynamicProperty.Rule); - var state = new DynamicPropertyState() { PropertyName = propertyState.PropertyName, Property = propertyState, ExtensionData = dynamicProperty.ExtensionData }; + var state = new DynamicPropertyState() { PropertyName = propertyState.PropertyName, Property = propertyState, ExtensionData = dynamicProperty.ExtensionData, ControlPropertyState = dynamicProperty.ControlPropertyState }; return (prop, state); } @@ -358,8 +359,13 @@ private static (Item item, int index) CombineIRAndState(BlockNode blockNode, Err var dynamicProperties = new List(); foreach (var propIR in blockNode.Properties) { - // Dynamic properties could be null for the galleryTemplateTemplate - if (isInResponsiveLayout && state.DynamicProperties != null && DynamicProperties.IsResponsiveLayoutProperty(propIR.Identifier)) + // Dynamic properties could be null for the galleryTemplateTemplate + var isDynamicProperty = state.DynamicProperties != null && + ((isInResponsiveLayout && DynamicProperties.IsResponsiveLayoutProperty(propIR.Identifier)) || + // Check if property is dynamic (responsive layout or has metadata like ControlPropertyState) + state.DynamicProperties.Any(dp => dp.PropertyName == propIR.Identifier)); + + if (isDynamicProperty) { dynamicProperties.Add(CombineDynamicPropertyIRAndState(propIR, state)); } @@ -374,7 +380,7 @@ private static (Item item, int index) CombineIRAndState(BlockNode blockNode, Err // Add dummy dynamic output props in the state at the end foreach (var dynPropState in state.DynamicProperties.Where(propState => propState.Property == null)) { - dynamicProperties.Add(new DynamicPropertyJson() { PropertyName = dynPropState.PropertyName }); + dynamicProperties.Add(new DynamicPropertyJson() { PropertyName = dynPropState.PropertyName }); } // Reorder to preserve roundtripping @@ -603,6 +609,7 @@ private static RuleEntry GetPropertyEntry(ControlState state, ErrorContainer err property.ExtensionData = propState.ExtensionData; property.NameMap = propState.NameMap; property.RuleProviderType = propState.RuleProviderType; + property.Category = propState.Category; } else { @@ -634,18 +641,25 @@ private static DynamicPropertyJson GetDynamicPropertyEntry(ControlState state, s { InvariantScript = expression, Property = propName, + Category = propState.Property.Category, ExtensionData = propState.Property.ExtensionData, NameMap = propState.Property.NameMap, RuleProviderType = propState.Property.RuleProviderType }; property.ExtensionData = propState.ExtensionData; } + + // Preserve ControlPropertyState + if (propState.ControlPropertyState != null) + { + property.ControlPropertyState = JsonSerializer.SerializeToElement(propState.ControlPropertyState); + } } else { property.Rule = new RuleEntry() { - InvariantScript = expression, + InvariantScript = expression, RuleProviderType = "Unknown" }; } diff --git a/src/PAModel/Schemas/adhoc/Control.cs b/src/PAModel/Schemas/adhoc/Control.cs index 2b467a93..c7fb6791 100644 --- a/src/PAModel/Schemas/adhoc/Control.cs +++ b/src/PAModel/Schemas/adhoc/Control.cs @@ -22,6 +22,8 @@ public class RuleEntry public string RuleProviderType { get; set; } // = "Unknown"; + public string Category { get; set; } + [JsonExtensionData] public Dictionary ExtensionData { get; set; } @@ -105,6 +107,10 @@ public class DynamicPropertyJson { public string PropertyName { get; set; } public RuleEntry Rule { get; set; } + + // object with additional properties + public JsonElement ControlPropertyState { get; set; } + [JsonExtensionData] public Dictionary ExtensionData { get; set; } From 875df3a0b087e15102bbadb00ee17522a2ef71a4 Mon Sep 17 00:00:00 2001 From: Marcel Ferreira Date: Fri, 10 Oct 2025 21:56:41 -0700 Subject: [PATCH 2/6] Fix JsonElement serialization error for ControlPropertyState in dynamic properties. Add app with categoty and ControlPropertyState to test (RoundripTests) --- src/PAModel/IR/IRStateHelpers.cs | 14 +++++++++++--- src/PAModel/Schemas/adhoc/Control.cs | 4 ++-- ...AppWithCategoryAndControlPropertyState.msapp | Bin 0 -> 20863 bytes 3 files changed, 13 insertions(+), 5 deletions(-) create mode 100644 src/PAModelTests/Apps/AppWithCategoryAndControlPropertyState.msapp diff --git a/src/PAModel/IR/IRStateHelpers.cs b/src/PAModel/IR/IRStateHelpers.cs index 0c5afb01..4770d28e 100644 --- a/src/PAModel/IR/IRStateHelpers.cs +++ b/src/PAModel/IR/IRStateHelpers.cs @@ -360,7 +360,7 @@ private static (Item item, int index) CombineIRAndState(BlockNode blockNode, Err foreach (var propIR in blockNode.Properties) { // Dynamic properties could be null for the galleryTemplateTemplate - var isDynamicProperty = state.DynamicProperties != null && + var isDynamicProperty = state.DynamicProperties != null && ((isInResponsiveLayout && DynamicProperties.IsResponsiveLayoutProperty(propIR.Identifier)) || // Check if property is dynamic (responsive layout or has metadata like ControlPropertyState) state.DynamicProperties.Any(dp => dp.PropertyName == propIR.Identifier)); @@ -380,7 +380,15 @@ private static (Item item, int index) CombineIRAndState(BlockNode blockNode, Err // Add dummy dynamic output props in the state at the end foreach (var dynPropState in state.DynamicProperties.Where(propState => propState.Property == null)) { - dynamicProperties.Add(new DynamicPropertyJson() { PropertyName = dynPropState.PropertyName }); + var dummyProp = new DynamicPropertyJson() { PropertyName = dynPropState.PropertyName }; + + // Preserve ControlPropertyState if it exists + if (dynPropState.ControlPropertyState != null) + { + dummyProp.ControlPropertyState = JsonSerializer.SerializeToElement(dynPropState.ControlPropertyState); + } + + dynamicProperties.Add(dummyProp); } // Reorder to preserve roundtripping @@ -659,7 +667,7 @@ private static DynamicPropertyJson GetDynamicPropertyEntry(ControlState state, s { property.Rule = new RuleEntry() { - InvariantScript = expression, + InvariantScript = expression, RuleProviderType = "Unknown" }; } diff --git a/src/PAModel/Schemas/adhoc/Control.cs b/src/PAModel/Schemas/adhoc/Control.cs index c7fb6791..8769b3d0 100644 --- a/src/PAModel/Schemas/adhoc/Control.cs +++ b/src/PAModel/Schemas/adhoc/Control.cs @@ -23,7 +23,7 @@ public class RuleEntry public string RuleProviderType { get; set; } // = "Unknown"; public string Category { get; set; } - + [JsonExtensionData] public Dictionary ExtensionData { get; set; } @@ -109,7 +109,7 @@ public class DynamicPropertyJson public RuleEntry Rule { get; set; } // object with additional properties - public JsonElement ControlPropertyState { get; set; } + public JsonElement? ControlPropertyState { get; set; } [JsonExtensionData] public Dictionary ExtensionData { get; set; } diff --git a/src/PAModelTests/Apps/AppWithCategoryAndControlPropertyState.msapp b/src/PAModelTests/Apps/AppWithCategoryAndControlPropertyState.msapp new file mode 100644 index 0000000000000000000000000000000000000000..5e1656da6e88fed36ab331b8f0df38db722cd091 GIT binary patch literal 20863 zcmeFZ^RFn~vMxMr+qP}n#+tU)v~Am3)3$BfwryK??f0B~_w1bg!}kZ=PM&nes7{Sh z)k#%%J(Zy#4Ge+;00001@IfP`#nl36Ve)t6@E1^jL1$*+WMO7w>tMn&&Iskl03$G` za|;Lh;sIv=_oBs>!e-RWh$}ro7sUNJV2{RZGGZG?upc%*1wxd`bzW-c^Pmb!W0083#ux;}0w zI2$Ji%@A(IeeJ2!6?w6Jb3UeYGmW&jTZur7+N$);C#v+SNGDj;;tV|(RjcG9{;L$s z_pPMR$d*!3$Mngwk;xpwazG=;4E^6N|8Jv|b1)-}!2keY5CH(-|30DMU~6aM;ACOq z_>W;x>KiuL>PBa=UTL2 zHQr0x*p4HmB}j^Xtm$d^9AEbor`yWf58nUFx0G!SDE7 zb-iDMD1u-ll=6N2Kk*H1Ff_fR1&D_~Ex?F?l4-g+V zw7Dy5>g@R2y$+`Oq~};{xU}j(&C=0N@Q|_00I4`eNO1P9bi^(l(Q`wK;Wsk7IoyDJ8p|ve4|e8nkV014o8PcJ z_-EMqvQ)?+;6wgU3wV1l)P}3Y^DOKd1;*RtU^Xg^`d%Lgh$+A}3;N?sY%b~*OrUI~ zrhl$xN`XoB@5mQ zuw>;T?S;AMVB|9s&H^mKc5a1(Os9NSZfrinJK-z^yBb; zmp~EVSS2QVis}UrR>l)3Cnbgw5A_QLw6ze`-UB$Sr>7N*3>-<=hGAnD(*dn35M$JTL zr=<)YS<@+M2W%(^lj}f2NW_{G5!%gu6OTQR*ac66_bnWOpgwwc_~|9_4J|4b+W+}! zDDgcvmNIfsA)d#POC(J$JPz+BJy+0{4BqFIbd50^GLtOM93nsW2;X?e=gIYGkUE

qUY$|xCBb2yQ?O>629jW)MDHUW@91>Eo_OX?&V=CsVl8q9`?e~D zzhzXZbxP5!$x-WxsXI~yw2UtkeIkXn!==n?7YCT~VJ3@lBA1_trCz@qbM~h!7B+E{ zU1pvqXJcdTa5eXyJ5|JMoGo>$ZfXXF&w#jxEtfJgJz8vv(0l~yb)?8?A5XTU>*VNZ zR>>QPlHiLD?sHj&?H-L7^9&p5N_PvMF!s;#j%&EyHogr+sJf}RX2z9rJ7EgM(Md@h zGi!OKp=80Gh68>FisVyHO>_ZU{Y>nyf*NF3@uRQoaBu3nsLwy2ZvY-1R&4%b8EZ$M z4s2N`LPzP%C5#@-?P)P)2a&1t-9LYm=>JYgQI)@*`!N6jmJ|U0Nl3!BHck$% z|0JXxldM?enVkxv6oWFNA?h(xzk>yoV9Ir@{^GQehgNRs3j*OJP zZ{WcNfd~K+_DvQt|45U;)veH(UMsX&Mz)(lu4U;=3g z%G){`cb=un^y75W7dT5D_Hu>gfuF9F#*X531?>a?!hiV44%lpH!r)}Ki^KxE>~r(B z5ca*B&H$vJd+oc=Jpy6U4cl_P=6ZXD0a*@5{Z){t*OxWRGz=Y@A_25pCQz8|ah(7K zpCu5I2IA^6ScsXXWyzg;TS%H6EomLqJ38`Eu5NcR+q{)AaE9{w9sDuuLa$gr0jYJP z2B_WN(_40t}Uh#BbhjeTMhgIYv&h==0V1uQ)A7ve`6&|EZTQCi%N>a z8{CW=37$g6vYC7lKa9LPKrL50=ApO1D&iGD-JfW*;?ng!0xHr!7HEhwtFnS138eh+ zGVMCjW#5c}kx0xNKwQ|afBCMW5NSXawZtDR2>SXBw7Wz^5q6sH{IRh2d#NOl_hN6y zY&Nf6692maXp_HRqm}~FnJFcR(_Ia8AGuHx^ltm?Oa5k6hr6%M^8gv@Hdh?4w!23A z6y%%VlV90yPJ8LI@};kSCHKYmXCni^bGs&L*%eP@c$7*Q_n3dE^!Z!#&Xh=;))e1; z6hMxa+v7I!qOT`Tw*HbT%=1E%`BYn0ZB{U)ioknc|7$01r2@yq5C(cby6D0XFeO)B z?BT-*o{pA9$mZ}Ywq}w#s5{7jUr-6ejhxUOIO|Gwm1E6L;=L42<4Tj7lS+~4ey4rm zMzRN8>2=%Rw;B)@@`WhYqtovh#@!)Hk7Y2wFiRAwbt?d(iGrj^yY4fQdqk+N1c50$ zKAFsG3a4MUF3pdicZNQ+L6|Rh3TF{22#b6Hye%Dg>$A`1+K*j)HiPmO)jEI(Kn^xQ z)&G`=shp#{AVqD=RkqM7CZ$1aaxLG~`VfZ}qE9m{w}?V>eYOZ}5i{`I%HP?;E{m{N z4SemDU$BT&-Tu(fU!pY(#zyFbYI+9;_nXBnBnbMahq(1{(ncudj7Eecr3C_{O1R}*$sc}I62Y7qFj?xZq02>H~% ztP`6~Mx2GJWv?o_P#AlU3#xaXKDpR!m2dss-T4$E>y@8EKlFhc$9fN9`Csf%UscPNKr)!_ibjC%>vSV6rF87af_2Wo~rW6r#11T^ix?d@$|tZ11I2 z)3x*kUJ~1i@k&%Pu_!+(S1zL96gB9UWw7@hY3%+|fE2f~E+Ya)idq*yOJ7}ZQqOF2o@fFAdpw9esF|-=`8Wqh?Ax6J{|^pOYMM5mSRH zH>ncIi*!s<@RrI9?$kwUC(R6#reO1g@*_C`N4s=JUB9U0toC$&&@%S?0nAVesdr^S zK|$&w6k00HAJTP@1%1(A$5)P^g;76p%B+20pACJUxx_b>nei^b z?WF4cXN(`MAN%BC4EV%W{ zpjok!Act&}{TH>pSNqtXS0`E@FN5~*lSlPs6t6XpC(`5JIVb0-Rc44h?-Syc8DQ1o z9)mFC3I^wZu@TdEr3BOd@`sz`(LFz}_n`g+8v#E)tZpGcSXzAnpU6LTynK9Hx`c_h zj()kH-}rn!QoCuh5Vwk!Zkn-~&O}w*hm6N0dB*iX%8TAo>k#-iIVJ;OxYb!;{4@U6 zsJ*5wG*(dij5NrxIcC@O0Cb)vyG*b=8zHG1qj9u4W*_kQUxwU0Q;Hk($gG2O#ab9W zuQ?oAO;kZAf@N-EVhC@C8{7dEucZLRGY^JRq^cOWz`H+j%tk%8j`s(X4!by<$fi1L zjyzCr{@yl=)L7xncB>JjA*vapd}c?7?xlTZ=}j7t#4(@nv(U>axY44W8Z7!rO414F z8G6eiG7N8Jh3Xc*qE5H-_0C^N8SC_$=icEa(Jua}cwC%xlc$x|8P)DkZ1rEV1EwuX zR`myrl{m4h-^F|N>X>w8&+M>GU*n1sroIceJf(OuQGX{EPOy#MS%C-vEpa5@fim@# z6+KizUk>;Z{rgSn-yU&3+r(^hOn(QyY`0Xa7-!7_?;ZlF1WbI2F#diGk)U0;xg;h3 zkzi|WlJSMBUT!`jwI>)m(^McZ%TIu)&Cq!w%-08!f|<1vriF;JBM%pi#(;56T*x8f zR<^p&l6{LUA-h??&h!nEQ%kUGta}>ywVS!`|~Dr{Yi|i8Zuq2w1X%yZaGsI9KSMi!n=#0}l{<>oh*l8-!!(4p3?*ZixrO z23tM9`e*MGS~J%a(cD2$2<23hB~myr!EgE}KF~&1_NLthz%oT>+83Dmm!|*@-L!wS z7c8G;&+;N6p=)VPvbL+EeoL@?jI5$4{w^X^pIWFI4W4 zbMfc%`->a#ObiHA!RC(bpJ8uBWvtZr(2+alV+U0CkR&Ve925m|+0|Ic{Q%hQeErvq zdSo9xvp_8qJ?%TEk$!CCfX z(K1A45>pRd?u(;=A`uB&9#f&Dw?F4jBRo1L70D71>6D$V_V#_?bU$ymXms$rv3+c} zZ{_EQ@|@DiB#WMRNPwyHc)O)L z2YLog0@Y@MOG2n8kzq3y!!;p1IzOc5(^LCUV(DP+oi`bKk&jmo1hF%t+AbcUJqPOU zs?@S~t5Y)B89iUYNVO-SW!=kn(Y53L&^QduI*l+aCt%!c^}BrxLPNdYz=RBRgMV&F zz19#J^+GU^fqZT{R8ZUj9#9H3dewwDxrU3n{PBE>;=O8++gX4fenH|3=-;s%_{F zhk0lp?>`vv`Md7FfOsv)Ei{0BrErISg;0)Ob-T~aZEfe<5%|US8okx`;8HpKz;?+V z5_n==t1{3R$#yzycUyn_B{rR?WxG{oGSJf-m90CaIR@mM$Q6dlJS5adc|=3>YHJuR z`Yi02sCWK+1@da|&U3b?OD{0n)fCHc4GKN`;1632m^OD32CP1fp}%P#A{ zp>WzwdUBpnxIs5>RifB7gH&I?kc)K_P|C@Rc8Qq@QoFIB?DK$KhwdCN`pj~rx|&ZJ z^?f~lWwPeeKGKQ zV7OO{L0s0I5~pRK(^lahxAhLcw|wO^*k2rDm}z~j!%CgS{YJvRWq({){2n(M`ax*+ ziY&g6`{1-JMeWB;sqtoRcP_fCpZ(4bZ{70&a-7AAlc|vV(C1t89q|4yz z{RHy>!=z!k9ufpLw^^JI9;byORSbmXzmxa4uoOuUG7O5UV{zuLt3B9$Lx5kqpV#9? z6py&02Qe+@G!_Q8M>J7TAIo9qp+yLZ zT_!nH(ops}uR_ohWnk7RVIw(fAazfOg()87_FZ=OUaj8qt%a%dK`!5#-HSGH^~6Z@ zJW@pYNX4!BtnFODpXOv3Ci-~3QeTg!hQ{=WV(IFZI0i`)a>2h?E5rH`kTCjja*BM2 zW#-}A86Sh7*63%{vFg&bW_E(_gw()F%Ly11=1sC+| z8K;R3pP)eo@~SrG(o5DAA^0|Crk17ikD}e_$xW986w==|-mAXClv_K9Rfueji5GSV zxJ~>Wuv%uE;JwC36^S$vnD!zAVcDE*)zg!_dk{Pk(HLqNx4Wcu8h4|w*P2A8b|l&e z2NZ6w{I?9?1*To&`-ZfYKzEIzDs~^=Qc@BTAts0ZwhUeq^$BtGyMSWXy)oXmN;#2D ztZWm-J8Hfilr>>uYn)3%f%G8B%AhMLbiS+vW<{4)7D_HjXazb3CO-}n66CC7vKxau z{>5HC`PT$>fe<}lL9cv>A_0cGbCnfEmwx8gicuPfQf?Z+c%Mjj4b(&d3ry^ME%!PC z^YTr%_qQNhn>$a?>vbg=e&4q2`H(=sYA+{AEPV1M-fCZd|Fj^E#0i#2X~`jm$au1; zY>>hl3m{R)T=aX{U|Kf(LIG(bb=>}jP(*S$Y)Z2TjJ?v2M0p zsWd4sam~mVjX6vcVku~UC$#8Vpen4Ps=2OpC@;%tSgNQMz?_`wzSN0(z-!iI5cvtx z%D&`HEQ{jw@vlao5OcTACw!US_y3TUjJIn2IJ--F%x%TJAp)q7Lod*G@h4}>mw3pQ zX3Gh|?#??8XwGvRR)H@l>gHVsp4sW9tixqpJKNN7Z7D-JmqVRbq%IylC4dSjJ;l?5 z8F~OF^sI`nzxj!u;(>-ui?ZQm{XXI?C_ks#S}d&QsQeWt)ltCd{Wb}D;xGM)oz)x15;BU zuohVcoKG?a4z{IALjO&S4eVCHc0wKUS%~B4YFq$`sygOeuKAnVcO~g2MN0c( zNfBGWkgBjc-?=1VtGN{~c@i53JEC=^B1KW-yHUZ7cxZ9?_=crnVbX&|nZ8ToowYop zEJH=dFS|VTkFBzk=9+~GuV%WVW!Vp!v@DjpfliEq>B(|wOb;$ra=hhqopcmif9#Ew z%3=+*rOE}HB5mkd?~-Nw#X6vNa+OFHTs-I*T`?~xE*5@{E`a5kc&?`GyZ}`aRhiO& z_)Q8(nE1^fBJz(@Td!k@?Fek~-ZhrPj(B3#dUrC#c1?VldRxhd`Cw*jKSa#c+}^&BoIsK}GSw=v?S~4g~8o zblpRrJxb0B#MTY$-c4gwbJCs=@Ectn_3l z$kZuS-kW9_W9N2bkuuF>qIlUu(l|s7oQ`Q6T}o!;ORcq<(H=7Wh`T6V**c!A`%*k+ zJ=-`&tujuu7<5)KZ(>;-2;r~sO5Cr`J@MDnqbV}LU*TPP+-cWqe+z!=t~Nxl#ZGaA zRC9x`vFyEo6oBY#cgruPhqH$I#Neq1+#~?vj~_*oc9N!z2fJc8#wP15mm3yM0QDqx zfRIt$BSi+gHWip*{D?lMlf%{U_Sp61qDdOxgBr>-TN~D}@l42y=z`@J=0da$;AFd%4rPt06zsGF38!@UoA_@jO* zgC80e=FK>S--#~odhCLdFKK%X4kTMg)WY-Nc>JM28=Xq1=(lvtUK647bxpb z(XX*Lx1$Od;rKB4z#NNGustL~n5Z%~ws7=Y(C```dV|Tvih1mep&U&X; z*wW8jHS&E%;TepCB8yUmK?dpe3SxF<1l!PS9or zbVpKTMkWHmAoiwJQ)J-S9e$o*z+e$x^v>7Ei!4hx2=@bP>et|+`3sDZ2((qzv@KUu zOofVExER@_gHx*bWnhdK(}Zy^)#A+tHV020=BN`Hn3h{PRN+0q(mZe-Ak?pH8Hmi5 zBXlX#WE6X?_V|9(Cj5Vvvl5v5#6;xe_qCuDK@wcw&a^#h@FGS$!N1$Uh+&$OYjLzj zpv`9#3ImUhsdt8_@Oa^K;(ZHtUVh;Jy{Ui%BnN`7g_5CNg;M@zkS%F7YY z#q`g@&OdDnUP=>C{R{}5AE=S8!j={Kf(j^)xdaq^F@k|QrIH%NVR|>iujW+kB~z0m zlX5O&fK=YoSODG8I?xQ`bsTZ?-ypLA@pEeVYL6!M$8?3s z_QJX|VUPbv^CWj(bbd_@ zgV%EWfDy4b$$8y#j{MyU75Li{mP0up6z-v|DRsj}GHLzYzLPIQ2qjdcZx|GhD?0>K zYN!Mp9MKsxbyNL=E*4G#N8DIU=gU7O^PuHgP+~m&`+Tokhe;c`%%)Y`8)`dAi~u#< z5SBU+%E7q@T}2|;zZ`WvSwi2);qaG$NTT`WyZd0+og@Y9EJ1vPcxnK-eGFBwj$n%s zbV$nHA8|&rUx9?LNs7s&x%-Zd0EDID*+Ll5c!3Hih10K=VD7Z#dkpZ|bNcAu2Zxk} zOc;>xB2#YiAfz&??griJJZ1Pheni6gVa%V9)B{Y*$pcub07n!Ii_m=q;nV=XTm(@W z6)S2}NG!MVGKj^`wb-7hmKM)L3H6?J&+g%sgkShj=iZoAGg4-8gLKWb3o&p@ z4V+eqDzHowhAnjGH(=w6{n%+K)VeTEx!KIT#wvl-9%Za0m(V=rS5Uo$+YUXxHt0CxwwV%O5>1$Qe5E~dZX#~@=a(gB!a zIZdRR=ZE6^M*veTLYuuf>aM!B;lD0!N1O3oOR~J(Xu$aO&_Qp)$G1bD@XT*km-#HV z5wFh7v)4L@QQKoWkFPtsd+r&oF}@N7o)hq^*$)VE^FpE9tb4i$@s&L5wrg5h$e$xd z_aYEcpogK&_=0FX3L1_fZq?ZJ&PhvDuk4l7@Uu|E5OccA-1uZfIiAn5;KE#oD7sT%HjZlrTLc;Ap4oc-V%|) zc;*Dt@#_y3dm z^hAv{C;m3Jt-u z{dM4f@bO%=ic35?0Kl*S5CGcWCzMP~O&m;Yj7%K0Rm@GS|GUZWlGoC9qqTmA-tI@( z#y?k!fR^TD?$Aeip%F5!Q83e*pC$s7n2`-p<39P&$q{bax2Nzh^pk8Vk769ys;i9J zRBT|c)9m%;=ewq>iyeJ{Bv0{qw!r)S*!N}o@xYG^QTE4HBJu`KEVf8vbEZe~&B!;L z{^j{w=QH-lQzYUD(3@z0ftq&e$6Y|^kBL*egXz-Z z8h=yH&qe6R#Prcu?8M9mzRzC<@2f%HtS0c&;AiUb;s?h{XqU?)Pf{#UmSWTQ%jtXM zZme$`^XI^u=Lr8s0HIa-R}M)Hr`-(IzW6*6;S zkHMBMnfwpDH86H9X6QX#n!uhNGnAvJ0Z1f0Np3~lXbuAWXI&;M+%sSEvw@w5ghUb? z1bX`SMX@#J7dS}Tcj6Wjnl+jv@@O{TsL@_4THx~?W69ScFhVRg8n3isFEt)j!B07Ee|1T2|mLwZSg<@vZA!fOF=ljxO@*b8eLwwR(GNiz~1t+>{^A0 zdtEI7zRC1k1ej0M@PIhYt@kkHY|?I38oq`ko{&wBL}QQ}5p%yYa2m9Gp*0#jD8oI8 z(V;Q$$7+}cniv`)2UN!=lF*^dIR-N+{L3y|;WZdeC3KQ|i&oU%gSdv#mh+~2I4=^%u0*vkw zNf09o4?A{&Z=!tti0#u!>VoWS@$Kn&P`T}aV){kxw={B)nutD_~r2r_y`?4sIz)x`U`424NNKwPSZ%_VdLP`r&S7 zlfU2eK+(*IBO7A2!GGP~Lsn(>ceEmqvt6b9iqE z5qaMDROMd(d_GC9EqtJW*YwYPNUnhLKbOQN5ykK97s~gejw+a_(0v5rNousya^bF< z#oA-|5wa9dq3KG!6RyvUt=o6JTMzZ(gK#_GTF)Y24Y%v!Yc?mCCWro)Va zLRrDz2L$fB$44W`Pa-_s&_N3S>D-Q6aZ4-mb;N#iBZU(mhNub>+d#Ra)xS&csz5uVw1W_|&M#Ix6&H#pj4^DXCZ|-Q4 z+g9n;H8EgXCrx}f|9}#b0@ux?!p&IdvYENnOEo-)7V=myAgLEhykPycsNgVn2=Ga6 z|BYk~M(DA@P5(%%}M`LX43uB0OC^Yu2;3X(i-1d^%c zBwGT+`lK*!l|>nY0}}h@G&l>&=2n-7{3kEK!#B7;ua@_h87!W#6Qa5midd+gsHj@F zbyjdB=uH|(q416T5N%FxY?`UZ(8n{-zWj7SdJn{j+X;O%V9>uNX^?tUB_7sxIHhC1 zI`Sc|2CRbDe8O=axa%-aWhbM%N;fcTd3f7LQK{|HC|NWG@;+DesAQPd<2U)#SK}0T z;JfgthlZgNCdpr)*i3QQQbT)K$|^#Gc;5~yKDV)DgpB}Xb&fga95 z+^LG20BF$X(&*2&SUw=LYcWGx96j*}1HahC5$Az>5D^@?yGlilG+6D3DQ8ioH3 zEEVH`*I?HKH}yRpOQ7gHD)*aEpb&nD9|8EXty9QtVqlxwbllzy+#OQ7k)vI8kOtTP z#DcZ+$2y1>s5QH*a4cUA;Kd#$)Urj)h=?Y7)`{E_+?&JLGoVXi%m86?Ah{<3;X#B& zPKoA4WOi1u0}t?gn}Nd%kQ^adPk^l@^_OfddrB?AIAAk;d4lB={WgxI)A+=Te39YLSgz6~PTd60)i+I6 zM_&xkDB7N)VUVJME(3eGv=uXXdg|LyiG|X@>p-W&#A*->B3qh+$hgz5xwHQ%gVgl} zXgjm9EtY{vtpoudo=5bw=oA@v&mvz#<63z`!8$k3z}q+PXz)yZhFurD8d8j@Wo~`# z=ie(c;V^n~JelM5#!PPt3`6$d+FMchHj{-1$@Zuxho6B7hSA5mRoGw@doD%)CiWR^ zlnIbkhND(J*j%DDEQ`u)eZS$-N_Rld{9fes5S;yMyhKjRPwUTn0lY>kB4?=eOlXv^ zUaTRRtn|RWF3M5T#Iw-Sd1D7LD=SyaHv0a@brEgtu?TG5)OQo|{wOBAg=iw!a+Bkuj8^B*oM zB5u%U3ha!*gdRzxa9t^Oje9eH-g@K2UkPNAve!9^W~0*n-1SC@t8?*dgidFkBAw+2Op{W6HQKrw$qU7RZ@k{FN~T@1*hfZP*L5 zc4!_vp_*mYG?&9d61OIC{ovOf$|0X3L_T4p;ZZ2?ejZ^E9bSn<(pU~X`-L!CQ#42M z6Y@Scgr;v1j8p!cB?x~A0lkZdhREZSeGF8sAAGs4)Azu_8RY}!>bDJevuueWz2jg? zRlq%OTP70iKmy1#B2xNn2**`0sG7qd_Nd{#`Yt=h)ZMb@vSD)7@hkPeK(}# zV2r^hbi@$F07-jMOt=I@dPmsZy;TZ8!1biPRKoJMFjgiNT^D0pj#ZQmZBi`SN=s~2 zM|L=@mWOxbM~68D+fE;Em+ju1jc~h84&OzpK{*XNI1GM`?qy}(^NTBFxBYe^iIoCi zd{L`y64WyzG45WY8OTB8_a&TJ`2)HzhV(4cfXDvX&fAcC7&6vEm0q}0Zu;$25pe zn^{o&kiug(KvWikY2r;lnpf5BpBBAWDNWodp)11!j^$mf@C^Hn!Ly740L})$zqBnm zrwxe_%aX9I@SEVDi}90}XOG41gsxi=og2~u%SRuUo^l3@1_VF3mF#i@<`PU%zt^9M z&iAC3=2GhpG#>T`Q%PcqF$>CBUmyVAux<8eQxTzp)f9P$xuf)Rg>or9!e%^L4h zRK$aB_GAl-ujR1rYOjzT>pM@I;JSbi!?0GBo680DCHRK>N9({_EsiWTT|OAaS3Zon z*C?*J!}CbkBfj9fk7X(yEM5fQC`hj{^!sp$;MgqeQa^_-D2yhe5($ z5UR4fmq0Wz0HwuVsD^o6J~AoJnD9{u3U0NAXNGD2<(*|*33MevMm^6pobvX#xR)_6 z6q1()b2w<*K{61Mw^z!<09#|~2ol7q@D4;fa_j-p%@WedU(ih8Ggz{`;r5A%eP=(R zOiLAgA4Xwpb1rD|XsD>^4;bvvn?H#TmmUkHdTzsSRvM*^lw6{*8bN0Jxe0`xrWkVj?){Kvi0yZ|)^%wgGAu!fJttZcLg&{sEG1u!Rr4e3xE^U|Po zsxuhTBa}00+YmFbSHOf^obK%wGO$sJ`|O7w9I*`z-GOv@8ee>F5V#14oRY^$??3G` zlOrFB{&4F_nI!n-?HO@%^MQ~rsw9I90*Gw^VWfzigiZK{P`1Fbr*n+}=tDJ3*+E&} zizW9`>WrXHu#=by}L&xo?8twF9iEHzSPrXNGswnNvqSFnLUMu-Sf=$UEpz&TgYLl*%? zh8px9JHl9NS1HfRedqVhFP{eTzA!%vRRmGH$ef#;h)u<;0qF-xcQ0-1GVH~VpNv*! zbbNf*7KKAEg6La|px`8_4Xq*HI-DE�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 QmHyPn6WKgY=lie!0i@`!NB{r; literal 0 HcmV?d00001 From 571c6b3bf8615249071a004a777641475ffb8316 Mon Sep 17 00:00:00 2001 From: Marcel Ferreira Date: Fri, 10 Oct 2025 22:19:43 -0700 Subject: [PATCH 3/6] Refactor comment to clarify dynamic property check in IRStateHelpers --- src/PAModel/IR/IRStateHelpers.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/PAModel/IR/IRStateHelpers.cs b/src/PAModel/IR/IRStateHelpers.cs index 4770d28e..bce755d8 100644 --- a/src/PAModel/IR/IRStateHelpers.cs +++ b/src/PAModel/IR/IRStateHelpers.cs @@ -362,7 +362,7 @@ private static (Item item, int index) CombineIRAndState(BlockNode blockNode, Err // Dynamic properties could be null for the galleryTemplateTemplate var isDynamicProperty = state.DynamicProperties != null && ((isInResponsiveLayout && DynamicProperties.IsResponsiveLayoutProperty(propIR.Identifier)) || - // Check if property is dynamic (responsive layout or has metadata like ControlPropertyState) + // Check if property is dynamic (responsive layout or has metadata) state.DynamicProperties.Any(dp => dp.PropertyName == propIR.Identifier)); if (isDynamicProperty) From 2201af41bd4fafc4108d04a4585056dd8b7f4331 Mon Sep 17 00:00:00 2001 From: Marcel Ferreira Date: Fri, 10 Oct 2025 22:33:25 -0700 Subject: [PATCH 4/6] update formating --- src/PAModel/IR/IRStateHelpers.cs | 10 +++------- 1 file changed, 3 insertions(+), 7 deletions(-) diff --git a/src/PAModel/IR/IRStateHelpers.cs b/src/PAModel/IR/IRStateHelpers.cs index bce755d8..634ed3ee 100644 --- a/src/PAModel/IR/IRStateHelpers.cs +++ b/src/PAModel/IR/IRStateHelpers.cs @@ -359,13 +359,9 @@ private static (Item item, int index) CombineIRAndState(BlockNode blockNode, Err var dynamicProperties = new List(); foreach (var propIR in blockNode.Properties) { - // Dynamic properties could be null for the galleryTemplateTemplate - var isDynamicProperty = state.DynamicProperties != null && - ((isInResponsiveLayout && DynamicProperties.IsResponsiveLayoutProperty(propIR.Identifier)) || - // Check if property is dynamic (responsive layout or has metadata) - state.DynamicProperties.Any(dp => dp.PropertyName == propIR.Identifier)); - - if (isDynamicProperty) + // Dynamic properties could be null for the galleryTemplateTemplate + // Check if property is dynamic (responsive layout or has metadata) + if (state.DynamicProperties != null && ((isInResponsiveLayout && DynamicProperties.IsResponsiveLayoutProperty(propIR.Identifier)) || state.DynamicProperties.Any(dp => dp.PropertyName == propIR.Identifier))) { dynamicProperties.Add(CombineDynamicPropertyIRAndState(propIR, state)); } From e0d872ed33ce319ebfe6c22bf5a5e733edda027a Mon Sep 17 00:00:00 2001 From: Marcel Ferreira Date: Sat, 11 Oct 2025 20:46:17 -0700 Subject: [PATCH 5/6] Fix double serialization of ControlPropertyState by using direct assignment --- src/PAModel/EditorState/DynamicPropertyState.cs | 3 ++- src/PAModel/IR/IRStateHelpers.cs | 14 ++------------ 2 files changed, 4 insertions(+), 13 deletions(-) diff --git a/src/PAModel/EditorState/DynamicPropertyState.cs b/src/PAModel/EditorState/DynamicPropertyState.cs index 2835a954..02bafd1d 100644 --- a/src/PAModel/EditorState/DynamicPropertyState.cs +++ b/src/PAModel/EditorState/DynamicPropertyState.cs @@ -1,6 +1,7 @@ // Copyright (c) Microsoft Corporation. // Licensed under the MIT License. +using System.Text.Json; using System.Text.Json.Serialization; namespace Microsoft.PowerPlatform.Formulas.Tools.EditorState; @@ -16,7 +17,7 @@ public class DynamicPropertyState public PropertyState Property { get; set; } // Object with additional properties like AFDDataSourceName, etc. - public object ControlPropertyState { get; set; } + public JsonElement? ControlPropertyState { get; set; } [JsonExtensionData] public Dictionary ExtensionData { get; set; } diff --git a/src/PAModel/IR/IRStateHelpers.cs b/src/PAModel/IR/IRStateHelpers.cs index 634ed3ee..7dbee9e6 100644 --- a/src/PAModel/IR/IRStateHelpers.cs +++ b/src/PAModel/IR/IRStateHelpers.cs @@ -5,7 +5,6 @@ using Microsoft.PowerPlatform.Formulas.Tools.ControlTemplates; using Microsoft.PowerPlatform.Formulas.Tools.EditorState; using System.Linq; -using System.Text.Json; using Microsoft.AppMagic.Authoring.Persistence; using Microsoft.PowerPlatform.Formulas.Tools.Schemas; using static Microsoft.PowerPlatform.Formulas.Tools.ControlInfoJson; @@ -376,13 +375,7 @@ private static (Item item, int index) CombineIRAndState(BlockNode blockNode, Err // Add dummy dynamic output props in the state at the end foreach (var dynPropState in state.DynamicProperties.Where(propState => propState.Property == null)) { - var dummyProp = new DynamicPropertyJson() { PropertyName = dynPropState.PropertyName }; - - // Preserve ControlPropertyState if it exists - if (dynPropState.ControlPropertyState != null) - { - dummyProp.ControlPropertyState = JsonSerializer.SerializeToElement(dynPropState.ControlPropertyState); - } + var dummyProp = new DynamicPropertyJson() { PropertyName = dynPropState.PropertyName, ControlPropertyState = dynPropState.ControlPropertyState }; dynamicProperties.Add(dummyProp); } @@ -654,10 +647,7 @@ private static DynamicPropertyJson GetDynamicPropertyEntry(ControlState state, s } // Preserve ControlPropertyState - if (propState.ControlPropertyState != null) - { - property.ControlPropertyState = JsonSerializer.SerializeToElement(propState.ControlPropertyState); - } + property.ControlPropertyState = propState.ControlPropertyState; } else { From 7470db704c592d4a44ba2cdfa20e0e0bd849d390 Mon Sep 17 00:00:00 2001 From: Marcel Ferreira <49608668+marcelbf@users.noreply.github.com> Date: Sat, 11 Oct 2025 21:08:30 -0700 Subject: [PATCH 6/6] Update src/PAModel/IR/IRStateHelpers.cs Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- src/PAModel/IR/IRStateHelpers.cs | 1 - 1 file changed, 1 deletion(-) diff --git a/src/PAModel/IR/IRStateHelpers.cs b/src/PAModel/IR/IRStateHelpers.cs index 7dbee9e6..fde22114 100644 --- a/src/PAModel/IR/IRStateHelpers.cs +++ b/src/PAModel/IR/IRStateHelpers.cs @@ -376,7 +376,6 @@ private static (Item item, int index) CombineIRAndState(BlockNode blockNode, Err foreach (var dynPropState in state.DynamicProperties.Where(propState => propState.Property == null)) { var dummyProp = new DynamicPropertyJson() { PropertyName = dynPropState.PropertyName, ControlPropertyState = dynPropState.ControlPropertyState }; - dynamicProperties.Add(dummyProp); }