@memberjunction/ng-record-changes 6.2.0-edge.5 → 6.2.0-edge.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"file":"ng-record-changes.component.js","sourceRoot":"","sources":["../../src/lib/ng-record-changes.component.ts","../../src/lib/ng-record-changes.component.html"],"names":[],"mappings":"AAAA,OAAO,EACL,SAAS,EACT,YAAY,EACZ,KAAK,EAGL,MAAM,EAEN,uBAAuB,EACvB,iBAAiB,GAElB,MAAM,eAAe,CAAC;AAGvB,OAAO,EAKL,iBAAiB,EACjB,OAAO,GACR,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AAEnE,OAAO,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAE1D,OAAO,EAAE,oBAAoB,EAAE,MAAM,+BAA+B,CAAC;AACrE,OAAO,EAAE,SAAS,EAAE,SAAS,EAAU,MAAM,MAAM,CAAC;;;;;;;;;;;;;;;;;ICjBhD,gCAAiE;;;IAYvD,+BAA8B;IAAA,YAAyB;IAAA,iBAAO;;;IAAhC,cAAyB;IAAzB,gDAAyB;;;IAQ3D,+BAA+B;IAC7B,wBAA2C;IAAC,mCAC9C;IAAA,iBAAM;;;IAEN,qCAC2D;;;IAIvD,+BAAqE;IACnE,wBAAkD;IAClD,gCAAiC;IAAA,YAAgB;IAAA,iBAAO;IAEtD,AADF,gCAAiC,eACgD;IAAA,YAAkB;IAAA,iBAAO;IACxG,gCAAkC;IAAA,YAAgE;IAEtG,AADE,AADoG,iBAAO,EACpG,EACH;;;;IAPqB,6DAAyC;IAEjC,eAAgB;IAAhB,mCAAgB;IAEZ,eAA2C;IAA3C,0DAA2C;IAAC,cAAkB;IAAlB,qCAAkB;IAC/D,eAAgE;IAAhE,2FAAgE;;;IAP1G,+BAA4B;IAC1B,uHASC;IACH,iBAAM;;;IAVJ,cASC;IATD,kCASC;;;IAYH,AALF,0CAIe,cACoB;IAC/B,wBAAyC;IACzC,4BAAM;IAAA,qEAAqD;IAE/D,AADE,AAD6D,iBAAO,EAC9D,EACS;;;;IAwCT,kCAIgB;IADd,uQAAS,8BAAoB,KAAC;IAE9B,wBAA2D;IAC3D,YACA;IAAA,gCAAmC;IAAA,YAAgB;IACrD,AADqD,iBAAO,EACnD;;;;IANP,AADA,4DAAyC,yDACkB;IAGxD,cAAgC;IAAhC,cAAA,4CAAgC,CAAA;IACnC,cACA;IADA,8CACA;IAAmC,eAAgB;IAAhB,mCAAgB;;;IARvD,uJAUC;;;IAVD,sCAUC;;;IAWK,gCAAmC;IAAA,YAA8B;IAAA,iBAAO;;;IAArC,cAA8B;IAA9B,qDAA8B;;;;IAY7D,AADF,iCAA0G,gBAGpE;IAAlC,uRAAU,+BAAoB,KAAC;IAFjC,iBAEoC;IACpC,wBAA2D;IAC3D,gCAAuC;IAAA,YAAgB;IAAA,iBAAO;IAC9D,gCAAuC;IAAA,YAAgB;IACzD,AADyD,iBAAO,EACxD;;;;IAP8B,gFAAmE;IAErG,cAAoC;IAApC,6DAAoC;IAEnC,cAAgC;IAAhC,cAAA,6CAAgC,CAAA;IACI,eAAgB;IAAhB,oCAAgB;IAChB,eAAgB;IAAhB,oCAAgB;;;;IAV7D,+BAAyE;IAAhC,kPAAS,4BAAqB,KAAC;IAAC,iBAAM;IAE7E,AADF,+BAAoD,cACX;IAAA,yBAAS;IAAA,iBAAM;IACtD,oKASC;IAEC,AADF,+BAAwC,iBACkE;IAA/D,+NAAS,sBAAe,wBAAE,4BAAqB,KAAC;IACvF,2BACF;IAAA,iBAAS;IACT,kCAAsF;IAA9C,qPAAS,4BAAqB,KAAC;IACrE,uBACF;IAEJ,AADE,AADE,iBAAS,EACL,EACF;;;IAlBJ,eASC;IATD,sCASC;;;;IA1BL,AADF,+BAAqC,iBAInB;IADd,uOAAS,6BAAsB,KAAC;IAEhC,wBAAsD;IACtD,8BACA;IAAA,oJAAoC;IAGpC,wBAAoF;IACtF,iBAAS;IAET,yIAA0B;IAyB5B,iBAAM;;;IApCF,cAA6C;IAA7C,6DAA6C;IAK7C,eAEC;IAFD,8DAEC;IAIH,eAwBC;IAxBD,oDAwBC;;;IAvCH,AAbF,0HAA2B,+GAalB;;;IAbT,oDAsDC;;;;IAKH,+BAA+B;IAC7B,YACA;IAAA,kCAA+D;IAAzB,0NAAS,qBAAc,KAAC;IAAC,6BAAa;IAC9E,AAD8E,iBAAS,EACjF;;;IAFJ,cACA;IADA,2GACA;;;;IAOA,0CAM8B;IAA5B,oOAAU,qBAAc,KAAC;IAN3B,iBAM8B;;;IAmCV,YACF;;;;IADE,iFACF;;;;IAPF,6BAEuF;IADrF,yRAAS,gDAAqC,KAAC;IAE/C,wBAAmD;IACnD,YACA;;IAAA,kKAAsB;IAGxB,iBAAI;;;;IANF,6GAAoF;IAEpF,eACA;IADA,kMACA;IAAA,eAEC;IAFD,6CAEC;;;IAGH,gCACuD;IACrD,wBAAgE;IAChE,+CACF;IAAA,iBAAO;;;IALP,AAVF,6JAAyD,0IAUhD;;;;;IAVT,+FAgBC;;;IAyBC,AADF,sCAAsC,eACE;IAAA,sBAAM;IAAA,iBAAO;IACnD,gCAAqC;IAAA,YAAY;IACnD,AADmD,iBAAO,EAC7C;;IAD0B,eAAY;IAAZ,yBAAY;;;IAQ7C,AADF,+BAA0B,cACI;IAAA,YAAuB;IAAA,iBAAM;IAEvD,AADF,+BAA6B,eACF;IAAA,YAAiB;IAE9C,AADE,AAD4C,iBAAO,EAC7C,EACF;;;IAJwB,eAAuB;IAAvB,2CAAuB;IAExB,eAAiB;IAAjB,qCAAiB;;;IAJhD,6LAOC;;;;IAPD,cAAA,mCAAwB,CAOvB;;;IARH,mKAA6B;;;IAA7B,oDASC;;;IAED,+BAA8B;IAC5B,wBAAoD;IACpD,sEACF;IAAA,iBAAM;;;IAQE,+BAA4B;IAC1B,2BAAwJ;IACxJ,gCAAgC;IAAA,YAAkE;IAAA,iBAAO;IAEzG,AADA,wBAAuE,eACiF;IACxJ,iCAAgK;IAAA,YAAkE;IACpO,AADoO,iBAAO,EACrO;;;IALsB,cAA0D;IAAC,AAA3D,2EAA0D,8DAA4D;IAChH,eAAkE;IAAlE,0FAAkE;IAExE,eAA0D;IAAC,AAA3D,2EAA0D,8DAA4D;IAChH,cAA8D;IAAC,AAA/D,+EAA8D,mEAAiE;IAAC,cAAkE;IAAlE,0FAAkE;;;IAIlO,AADF,+BAA8B,gBACH;IAAA,YAA8B;IAAA,iBAAO;IAC9D,wBAAuE;IACvE,gCAAyB;IAAA,YAA8B;IACzD,AADyD,iBAAO,EAC1D;;;IAHqB,eAA8B;IAA9B,kDAA8B;IAE9B,eAA8B;IAA9B,kDAA8B;;;IAGzD,0BAA0D;;;IAAhC,8DAAyB;;;IAGjD,AADF,+BAA8B,gBACH;IAAA,YAA8B;IAAA,iBAAO;IAC9D,wBAAuE;IACvE,gCAAyB;IAAA,YAA8B;IACzD,AADyD,iBAAO,EAC1D;;;IAHqB,eAA8B;IAA9B,kDAA8B;IAE9B,eAA8B;IAA9B,kDAA8B;;;IAtB7D,AADF,+BAA0B,cACI;IAAA,YAAoB;IAAA,iBAAM;IACtD,+BAA6B;IAiBzB,AAFA,AANA,AARF,qLAAkC,8JAQiC,8JAMzC,8JAEjB;IAQb,AADE,iBAAM,EACF;;;IA1BwB,eAAoB;IAApB,wCAAoB;IAE9C,eAsBC;IAtBD,iJAsBC;;;IA1BP,+KA6BC;;;;IA7BD,cAAA,kCAAuB,CA6BtB;;;IAID,+BAAyB;IACvB,yBAAsD;IACtD,YACF;IAAA,iBAAM;;;IADJ,eACF;IADE,oDACF;;;IAIA,+BAAuB;IACrB,yBAAmE;IACnE,gCAA0B;IAAA,YAAqB;IACjD,AADiD,iBAAM,EACjD;;;IADsB,eAAqB;IAArB,yCAAqB;;;;IAS/C,AADF,+BAA+B,kBAGoC;IAD/D,2TAAS,2CAAgC,KAAC;IAE1C,wBAAgE;IAChE,gDACF;IACF,AADE,iBAAS,EACL;;;IAxFV,+BAA0B;IAMxB,uKAA2C;IAuBzC,AALA,AAXF,qJAAgC,0IAWO,+HAK9B;IAkCT,gKAAuB;IAOvB,gKAAuB;IAUvB,gKAA+E;IAUjF,iBAAM;;;;;IApFJ,cAKC;IALD,qFAKC;IAED,cAgDC;IAhDD,yFAgDC;IAED,eAKC;IALD,8CAKC;IAED,cAKC;IALD,8CAKC;IAKD,cASC;IATD,wHASC;;;;IA/IP,+BAWC;IADC,0QAAW,mDAAwC,KAAC;IAGpD,+BAAiE;IAArC,gQAAS,qCAA0B,KAAC;IAE5D,AADF,+BAAiC,eAEiC;IAAA,YAAmC;IAAA,iBAAO;IAC1G,gCAA8B;IAAA,YAA8B;IAAA,iBAAO;IAGnE,sIAA4B;IAmB9B,iBAAM;IAGF,AADF,AADF,+BAA0B,cACE,eACD;IAAA,aAAkC;IAAA,iBAAM;IAC/D,aACF;IAAA,iBAAM;IACN,iCAA0E;IAAA,aAAkC;IAAA,iBAAO;IACnH,iCAAqE;IAAA,aAAmB;IAAA,iBAAO;IAC/F,iCAAqE;IAAA,aAAmB;IAAA,iBAAO;IAC/F,yBAA2E;IAE/E,AADE,iBAAM,EACF;IAGN,mJAAoC;IA6FtC,iBAAM;;;;IA/IJ,6DAA6C;IAG7C,AADA,AADA,mEAA+C,oDACD,mEACe;;IAUnD,eAAyD;IAAzD,6EAAyD;IAAC,cAAmC;IAAnC,8DAAmC;IACrE,eAA8B;IAA9B,yDAA8B;IAG5D,cAkBC;IAlBD,0DAkBC;IAIwB,eAAkC;IAAlC,6DAAkC;IACzD,cACF;IADE,2EACF;IAC2B,cAA8C;IAA9C,uEAA8C;IAAC,cAAkC;IAAlC,6DAAkC;IAC/E,cAAuC;IAAvC,uDAAuC;IAAC,cAAmB;IAAnB,uCAAmB;IAC3D,cAAuC;IAAvC,uDAAuC;IAAC,cAAmB;IAAnB,uCAAmB;IAM5F,eA4FC;IA5FD,mEA4FC;;;IApJL,AADF,+BAA2B,cACE;IAAA,YAAiB;IAAA,iBAAM;IAElD,8IAoJC;IACH,iBAAM;;;IAvJuB,eAAiB;IAAjB,qCAAiB;IAE5C,cAoJC;IApJD,gCAoJC;;;IAxJL,sIA0JC;;;IA1JD,gCA0JC;;;;IAtQD,AADF,AADF,+BAA4B,UACrB,aACuB;IAAA,8BAAc;IAAA,iBAAK;IAC7C,+BAA8B;IAAA,YAA4B;IAC5D,AAD4D,iBAAM,EAC5D;IAEJ,AADF,+BAA4B,cACG;IAC3B,wBAAuD;IACvD,YACF;IAAA,iBAAM;IACN,gCAA6B;IAAA,aAA2K;IAE5M,AADE,AAD0M,iBAAM,EAC1M,EACF;IAKJ,AADF,gCAA2B,eACG;IAC1B,yBAAqD;IACrD,kCAOE;IAHA,mUAAwB;IACxB,0MAAS,uBAAgB,KAAC;IAG9B,AARE,iBAOE,EACE;IAEN,mCAAsG;IAAxC,2MAAS,sBAAe,KAAC;IACrF,yBAA0D;IAAC,sBAC7D;IAAA,iBAAS;IAET,6GAA2B;IAyD7B,iBAAM;IAEN,wHAA+C;IAQ/C,gCAA6G;IASzG,AARF,mIAAiC,uFAQxB;IA6JX,iBAAM;;;IAvQ4B,eAA4B;IAA5B,mDAA4B;IAKxD,eACF;IADE,8DACF;IAC6B,eAA2K;IAA3K,0NAA2K;IAatM,eAAwB;IAAxB,iDAAwB;IAMG,cAA8B;IAA9B,8CAA8B;IAI7D,eAwDC;IAxDD,sDAwDC;IAGH,cAKC;IALD,iFAKC;IAGwB,cAAmF;;IAC1G,cAoKC;IApKD,4DAoKC;;;;IAzTD,AADF,AADF,AAFF,8BAA0B,aAEO,aACC,aACC;IAC3B,uBAAmD;IACnD,4BAAM;IAAA,8BAAc;IAAA,iBAAO;IAC3B,uGAA+B;IAGjC,iBAAM;IACN,kCAAgH;IAA5E,0LAAS,yBAAkB,KAAC;IAC9D,wBAAgC;IAAC,+BACnC;IACF,AADE,iBAAS,EACL;IAQJ,AAHA,AAJF,yGAAuB,8FAIiB,mFAG/B;IAcX,iBAAM;IAcJ,AAZF,oHAA6B,0EAYpB;IA8QX,iBAAM;;;IAzTE,eAEC;IAFD,yDAEC;IAML,eAoBC;IApBD,0FAoBC;IAGH,eAyRC;IAzRD,wDAyRC;;;;IAeH,gCAAkE;IAAnC,wLAAS,+BAAwB,KAAC;IAC/D,gCAAoE;IAAnC,oHAAS,wBAAwB,IAAC;IACjE,4CAIsC;IAApC,AADA,8MAAW,6BAAsB,KAAC,yLACxB,+BAAwB,KAAC;IAGzC,AADE,AADE,iBAAkB,EACd,EACF;;;IANA,eAAuC;IACvC,AADA,4DAAuC,qGAC4B;;AD9P7E;;;;;;;;;;;;;GAaG;AASH,MAAM,OAAO,sBAAuB,SAAQ,oBAAoB;IAiJpD;IACA;IACA;IACA;IAnJH,SAAS,GAAG,KAAK,CAAC;IAClB,SAAS,GAAG,KAAK,CAAC;IACf,YAAY,GAAG,IAAI,YAAY,EAAE,CAAC;IAE5C;;;;;;OAMG;IACO,YAAY,GAAG,IAAI,CAAC,YAAY,CAAC;IAClC,MAAM,CAAc;IAE7B,wFAAwF;IAC/E,YAAY,GAAG,KAAK,CAAC;IAE9B;;;;OAIG;IACO,gBAAgB,GAAG,IAAI,YAAY,EAAuB,CAAC;IAErE,QAAQ,GAA2B,EAAE,CAAC;IAEtC,wCAAwC;IACxC,IAAI,QAAQ;QACV,OAAO,IAAI,CAAC,QAAQ,CAAC;IACvB,CAAC;IACD,wCAAwC;IACxC,IAAI,QAAQ,CAAC,KAA6B;QACxC,IAAI,CAAC,QAAQ,GAAG,KAAK,CAAC;IACxB,CAAC;IACD,YAAY,GAA2B,EAAE,CAAC;IAE1C,4CAA4C;IAC5C,IAAI,YAAY;QACd,OAAO,IAAI,CAAC,YAAY,CAAC;IAC3B,CAAC;IACD,4CAA4C;IAC5C,IAAI,YAAY,CAAC,KAA6B;QAC5C,IAAI,CAAC,YAAY,GAAG,KAAK,CAAC;IAC5B,CAAC;IAED;;;;;;OAMG;IACK,YAAY,GAAG,IAAI,GAAG,EAAgC,CAAC;IAC/D,UAAU,GAAgB,EAAE,CAAC;IAE7B,0CAA0C;IAC1C,IAAI,UAAU;QACZ,OAAO,IAAI,CAAC,UAAU,CAAC;IACzB,CAAC;IACD,0CAA0C;IAC1C,IAAI,UAAU,CAAC,KAAkB;QAC/B,IAAI,CAAC,UAAU,GAAG,KAAK,CAAC;IAC1B,CAAC;IACD,aAAa,GAAgB,IAAI,GAAG,EAAE,CAAC;IAEvC,6CAA6C;IAC7C,IAAI,aAAa;QACf,OAAO,IAAI,CAAC,aAAa,CAAC;IAC5B,CAAC;IACD,6CAA6C;IAC7C,IAAI,aAAa,CAAC,KAAkB;QAClC,IAAI,CAAC,aAAa,GAAG,KAAK,CAAC;IAC7B,CAAC;IAED,yEAAyE;IACzE,oBAAoB,GAAgC,IAAI,CAAC;IACzD,2DAA2D;IAC3D,qBAAqB,GAAG,KAAK,CAAC;IAC9B,0FAA0F;IAC1F,WAAW,GAAG,KAAK,CAAC;IAEpB,sBAAsB;IACtB,YAAY,GAAkB,EAAE,CAAC;IACjC,eAAe,GAAG,KAAK,CAAC;IACxB,gBAAgB,GAAG,KAAK,CAAC;IAEzB,oBAAoB;IACpB,UAAU,GAAG,EAAE,CAAC;IAEhB,0CAA0C;IAC1C,IAAI,UAAU;QACZ,OAAO,IAAI,CAAC,UAAU,CAAC;IACzB,CAAC;IACD,0CAA0C;IAC1C,IAAI,UAAU,CAAC,KAAK;QAClB,IAAI,CAAC,UAAU,GAAG,KAAK,CAAC;IAC1B,CAAC;IACD,uEAAuE;IACvE,YAAY,GAAG,EAAE,CAAC;IAElB,4CAA4C;IAC5C,IAAI,YAAY;QACd,OAAO,IAAI,CAAC,YAAY,CAAC;IAC3B,CAAC;IACD,4CAA4C;IAC5C,IAAI,YAAY,CAAC,KAAK;QACpB,IAAI,CAAC,YAAY,GAAG,KAAK,CAAC;IAC5B,CAAC;IACD,cAAc,GAAG,EAAE,CAAC;IAEpB,8CAA8C;IAC9C,IAAI,cAAc;QAChB,OAAO,IAAI,CAAC,cAAc,CAAC;IAC7B,CAAC;IACD,8CAA8C;IAC9C,IAAI,cAAc,CAAC,KAAK;QACtB,IAAI,CAAC,cAAc,GAAG,KAAK,CAAC;IAC9B,CAAC;IACD,kEAAkE;IAClE,cAAc,GAA4B,EAAE,CAAC;IAC7C,4CAA4C;IAC5C,kBAAkB,GAAG,KAAK,CAAC;IAC3B,wEAAwE;IACxE,mBAAmB,GAAkB,IAAI,CAAC;IAE1C;;;;OAIG;IACH,gBAAgB,GAAiB,EAAE,CAAC;IAEpC,kFAAkF;IACjE,kBAAkB,GAAG,CAAC,CAAC;IAExC;;;;;OAKG;IACK,cAAc,GAAwB,IAAI,CAAC;IAEnD,YACU,GAAsB,EACtB,MAAc,EACd,qBAA4C,EAC5C,SAAuB;QAC7B,KAAK,EAAE,CAAC;QAJF,QAAG,GAAH,GAAG,CAAmB;QACtB,WAAM,GAAN,MAAM,CAAQ;QACd,0BAAqB,GAArB,qBAAqB,CAAuB;QAC5C,cAAS,GAAT,SAAS,CAAc;IACpB,CAAC;IAEd,QAAQ;QACN,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YAChB,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC;YACtB,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC;YACtB,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE,CAAC;YACxB,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,MAAM,CAAC,UAAU,EAAE,EAAE,EAAE,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;YAChF,IAAI,CAAC,gBAAgB,EAAE,CAAC;YACxB,IAAI,CAAC,sBAAsB,EAAE,CAAC;QAChC,CAAC;IACH,CAAC;IAED,WAAW;QACT,IAAI,CAAC,cAAc,EAAE,WAAW,EAAE,CAAC;QACnC,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC;IAC7B,CAAC;IAED;;;;;;OAMG;IACK,sBAAsB;QAC5B,IAAI,CAAC,IAAI,CAAC,MAAM;YAAE,OAAO;QACzB,IAAI,CAAC,cAAc,EAAE,WAAW,EAAE,CAAC;QACnC,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC,MAAM,CAAC,oBAAoB,CAAC,CAAC,KAAsB,EAAE,EAAE;YAChF,IAAI,KAAK,EAAE,IAAI,KAAK,MAAM,EAAE,CAAC;gBAC3B,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC;YACxC,CAAC;QACH,CAAC,CAAC,CAAC;IACL,CAAC;IAED;;;OAGG;IACI,OAAO;QACZ,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YAChB,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC;YACtB,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE,CAAC;YACxB,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,MAAM,CAAC,UAAU,EAAE,EAAE,EAAE,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;QAClF,CAAC;IACH,CAAC;IAEM,OAAO;QACZ,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC;QACvB,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE,CAAC;QACxB,4DAA4D;QAC5D,UAAU,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,YAAY,CAAC,IAAI,EAAE,EAAE,GAAG,CAAC,CAAC;IAClD,CAAC;IAEM,KAAK,CAAC,iBAAiB,CAAC,IAAkB,EAAE,OAAe,EAAE,UAAkB;QACpF,IAAI,IAAI,IAAI,UAAU,EAAE,CAAC;YACvB,MAAM,EAAE,GAAG,IAAI,CAAC,aAAa,CAAC;YAC9B,MAAM,UAAU,GAAG,EAAE,CAAC,YAAY,CAAC,UAAU,CAAC,CAAC;YAC/C,IAAI,OAAO,GAA2B,EAAE,CAAC;YACzC,IAAI,UAAU,EAAE,kBAAkB,EAAE,CAAC;gBACnC,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC,oBAAoB,CAAC,EAAE,CAAC,CAAC,OAAO,CAAuB;oBACpF,UAAU,EAAE,oBAAoB;oBAChC,WAAW,EAAE,WAAW,UAAU,mBAAmB,IAAI,CAAC,oBAAoB,EAAE,GAAG;oBACnF,OAAO,EAAE,gBAAgB;oBACzB,UAAU,EAAE,eAAe;iBAC5B,CAAC,CAAC;gBACH,IAAI,QAAQ,CAAC,OAAO;oBAAE,OAAO,GAAG,QAAQ,CAAC,OAAO,CAAC;YACnD,CAAC;YACD,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE;gBACnB,IAAI,OAAO,EAAE,CAAC;oBACZ,IAAI,CAAC,QAAQ,GAAG,OAAO,CAAC,IAAI,CAC1B,CAAC,CAAuB,EAAE,CAAuB,EAAE,EAAE,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,OAAO,EAAE,GAAG,IAAI,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,OAAO,EAAE,CACxH,CAAC;oBACF,IAAI,CAAC,oBAAoB,EAAE,CAAC;oBAC5B,IAAI,CAAC,uBAAuB,EAAE,CAAC;oBAC/B,IAAI,CAAC,YAAY,EAAE,CAAC;oBACpB,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC;gBACzB,CAAC;qBAAM,CAAC;oBACN,IAAI,CAAC,qBAAqB,CAAC,wBAAwB,CACjD,oCAAoC,UAAU,qBAAqB,IAAI,CAAC,QAAQ,EAAE,GAAG,EACrF,OAAO,CACR,CAAC;oBACF,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC;gBACzB,CAAC;gBACD,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE,CAAC;YAC1B,CAAC,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,mEAAmE;IAEnE,cAAc;QACZ,IAAI,CAAC,YAAY,EAAE,CAAC;IACtB,CAAC;IAED,8CAA8C;IAC9C,cAAc;QACZ,OAAO,IAAI,CAAC,cAAc,EAAE,CAAC;IAC/B,CAAC;IAED,cAAc;QACZ,IAAI,CAAC,YAAY,EAAE,CAAC;IACtB,CAAC;IAED;;OAEG;IACI,aAAa;QAClB,KAAK,MAAM,CAAC,IAAI,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC;YAAE,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC;QACjF,IAAI,CAAC,YAAY,EAAE,CAAC;IACtB,CAAC;IAED;;OAEG;IACI,UAAU,CAAC,GAAW;QAC3B,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC;QACrD,IAAI,CAAC,YAAY,EAAE,CAAC;IACtB,CAAC;IAED;;OAEG;IACH,IAAW,aAAa;QACtB,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IAC1D,CAAC;IAED;;OAEG;IACH,IAAW,mBAAmB;QAC5B,OAAO,IAAI,CAAC,gBAAgB,CAAC,MAAM,GAAG,CAAC,CAAC;IAC1C,CAAC;IAED;;;OAGG;IACH,IAAW,kBAAkB;QAC3B,OAAO,IAAI,CAAC,gBAAgB,CAAC,MAAM,GAAG,IAAI,CAAC,kBAAkB,CAAC;IAChE,CAAC;IAED,sFAAsF;IACtF,IAAW,wBAAwB;QACjC,OAAO,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;IAClE,CAAC;IAEM,oBAAoB;QACzB,IAAI,CAAC,kBAAkB,GAAG,CAAC,IAAI,CAAC,kBAAkB,CAAC;QACnD,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE,CAAC;IAC1B,CAAC;IAEM,mBAAmB;QACxB,IAAI,CAAC,kBAAkB,GAAG,KAAK,CAAC;QAChC,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE,CAAC;IAC1B,CAAC;IAEM,YAAY;QACjB,IAAI,CAAC,UAAU,GAAG,EAAE,CAAC;QACrB,KAAK,MAAM,CAAC,IAAI,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC;YAAE,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC;QACjF,IAAI,CAAC,YAAY,EAAE,CAAC;IACtB,CAAC;IAED;;;OAGG;IACK,uBAAuB;QAC7B,MAAM,MAAM,GAA2B,EAAE,CAAC;QAC1C,IAAI,YAAY,GAAG,CAAC,CAAC;QAErB,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;YAC9B,MAAM,IAAI,GAAG,CAAC,CAAC,IAAI,IAAI,QAAQ,CAAC;YAChC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;YACvC,IAAI,IAAI,CAAC,eAAe,CAAC,CAAC,CAAC;gBAAE,YAAY,EAAE,CAAC;QAC9C,CAAC;QAED,MAAM,KAAK,GAAiB,EAAE,CAAC;QAC/B,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC;YAChC,KAAK,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,QAAQ,EAAE,KAAK,EAAE,SAAS,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,CAAC,QAAQ,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC,CAAC;QAC5G,CAAC;QACD,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC;YAChC,KAAK,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,QAAQ,EAAE,KAAK,EAAE,SAAS,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,CAAC,QAAQ,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC,CAAC;QAC7G,CAAC;QACD,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC;YAChC,KAAK,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,QAAQ,EAAE,KAAK,EAAE,SAAS,EAAE,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,MAAM,CAAC,QAAQ,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC,CAAC;QAC9G,CAAC;QACD,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC;YAClC,KAAK,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,UAAU,EAAE,KAAK,EAAE,WAAW,EAAE,IAAI,EAAE,WAAW,EAAE,KAAK,EAAE,MAAM,CAAC,UAAU,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC,CAAC;QACrH,CAAC;QACD,IAAI,YAAY,GAAG,CAAC,EAAE,CAAC;YACrB,KAAK,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,SAAS,EAAE,KAAK,EAAE,UAAU,EAAE,IAAI,EAAE,sBAAsB,EAAE,KAAK,EAAE,YAAY,EAAE,OAAO,EAAE,SAAS,EAAE,CAAC,CAAC;QAC3H,CAAC;QAED,mCAAmC;QACnC,MAAM,SAAS,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;QACjD,KAAK,MAAM,CAAC,IAAI,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC,EAAE,CAAC;YACjD,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC;gBAAE,OAAO,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC;QACvD,CAAC;QACD,KAAK,MAAM,CAAC,IAAI,KAAK,EAAE,CAAC;YACtB,IAAI,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,SAAS;gBAAE,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;QACnF,CAAC;QAED,IAAI,CAAC,gBAAgB,GAAG,KAAK,CAAC;IAChC,CAAC;IAEO,eAAe,CAAC,CAAuB;QAC7C,OAAO,CAAC,CAAC,MAAM,KAAK,SAAS,IAAK,CAAS,CAAC,cAAc,IAAI,IAAI,CAAC;IACrE,CAAC;IAEO,YAAY;QAClB,IAAI,QAAQ,GAAG,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC;QAElC,IAAI,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE,EAAE,CAAC;YAC3B,MAAM,MAAM,GAAG,IAAI,CAAC,UAAU,CAAC,WAAW,EAAE,CAAC;YAC7C,QAAQ,GAAG,QAAQ,CAAC,MAAM,CACxB,MAAM,CAAC,EAAE,CACP,MAAM,CAAC,kBAAkB,EAAE,WAAW,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC;gBACzD,MAAM,CAAC,IAAI,EAAE,WAAW,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC;gBAC3C,MAAM,CAAC,QAAQ,EAAE,WAAW,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC,CAClD,CAAC;QACJ,CAAC;QAED,+GAA+G;QAC/G,MAAM,YAAY,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,CAAC;QAC1F,IAAI,YAAY,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC5B,QAAQ,GAAG,QAAQ,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE;gBAClC,KAAK,MAAM,GAAG,IAAI,YAAY,EAAE,CAAC;oBAC/B,IAAI,GAAG,KAAK,SAAS,EAAE,CAAC;wBACtB,IAAI,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC;4BAAE,OAAO,IAAI,CAAC;oBAChD,CAAC;yBAAM,CAAC;wBACN,IAAI,MAAM,CAAC,IAAI,KAAK,GAAG;4BAAE,OAAO,IAAI,CAAC;oBACvC,CAAC;gBACH,CAAC;gBACD,OAAO,KAAK,CAAC;YACf,CAAC,CAAC,CAAC;QACL,CAAC;QAED,IAAI,CAAC,YAAY,GAAG,QAAQ,CAAC;QAC7B,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;QAC1D,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE,CAAC;IAC1B,CAAC;IAED,mEAAmE;IAE5D,KAAK,CAAC,gBAAgB;QAC3B,IAAI,CAAC,IAAI,CAAC,MAAM;YAAE,OAAO;QAEzB,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC;QAC5B,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE,CAAC;QAExB,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,EAAE,CAAC;YAC3C,MAAM,QAAQ,GAAG,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,oBAAoB,EAAE,CAAC;YAE/D,MAAM,EAAE,GAAG,OAAO,CAAC,oBAAoB,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;YAC5D,MAAM,WAAW,GAAG,MAAM,EAAE,CAAC,OAAO,CAA6B;gBAC/D,UAAU,EAAE,yBAAyB;gBACrC,MAAM,EAAE,CAAC,gBAAgB,CAAC;gBAC1B,WAAW,EAAE,aAAa,QAAQ,mBAAmB,QAAQ,GAAG;gBAChE,UAAU,EAAE,QAAQ;aACrB,CAAC,CAAC;YAEH,IAAI,CAAC,WAAW,CAAC,OAAO,IAAI,WAAW,CAAC,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBAC7D,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE;oBACnB,IAAI,CAAC,YAAY,GAAG,EAAE,CAAC;oBACvB,IAAI,CAAC,eAAe,GAAG,KAAK,CAAC;oBAC7B,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE,CAAC;gBAC1B,CAAC,CAAC,CAAC;gBACH,OAAO;YACT,CAAC;YAED,MAAM,QAAQ,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,WAAW,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC;YAC9E,MAAM,aAAa,GAAG,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YAE9D,MAAM,YAAY,GAAG,MAAM,EAAE,CAAC,OAAO,CAQlC;gBACD,UAAU,EAAE,oBAAoB;gBAChC,MAAM,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,aAAa,EAAE,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAE,gBAAgB,CAAC;gBACvF,WAAW,EAAE,UAAU,aAAa,GAAG;gBACvC,OAAO,EAAE,qBAAqB;gBAC9B,UAAU,EAAE,QAAQ;aACrB,CAAC,CAAC;YAEH,IAAI,YAAY,CAAC,OAAO,EAAE,CAAC;gBACzB,IAAI,CAAC,YAAY,GAAG,YAAY,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;oBACjD,EAAE,EAAE,CAAC,CAAC,EAAE;oBACR,IAAI,EAAE,CAAC,CAAC,IAAI;oBACZ,WAAW,EAAE,CAAC,CAAC,WAAW;oBAC1B,KAAK,EAAE,CAAC,CAAC,KAAK;oBACd,MAAM,EAAE,CAAC,CAAC,MAAM;oBAChB,SAAS,EAAE,CAAC,CAAC,cAAc;oBAC3B,SAAS,EAAE,CAAC,CAAC,SAAS;iBACvB,CAAC,CAAC,CAAC;YACN,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CAAC,0CAA0C,EAAE,KAAK,CAAC,CAAC;YACjE,IAAI,CAAC,YAAY,GAAG,EAAE,CAAC;QACzB,CAAC;gBAAS,CAAC;YACT,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE;gBACnB,IAAI,CAAC,eAAe,GAAG,KAAK,CAAC;gBAC7B,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE,CAAC;YAC1B,CAAC,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAEM,gBAAgB;QACrB,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC;QAC7B,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE,CAAC;IAC1B,CAAC;IAEM,cAAc,CAAC,KAAgD;QACpE,IAAI,CAAC,gBAAgB,GAAG,KAAK,CAAC;QAC9B,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE,CAAC;QACxB,IAAI,CAAC,gBAAgB,EAAE,CAAC;QACxB,IAAI,CAAC,qBAAqB,CAAC,wBAAwB,CACjD,8BAA8B,KAAK,CAAC,SAAS,YAAY,KAAK,CAAC,SAAS,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,EAC3F,MAAM,EACN,IAAI,CACL,CAAC;IACJ,CAAC;IAEM,sBAAsB;QAC3B,IAAI,CAAC,gBAAgB,GAAG,KAAK,CAAC;QAC9B,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE,CAAC;IAC1B,CAAC;IAEM,mBAAmB,CAAC,MAAc;QACvC,QAAQ,MAAM,EAAE,CAAC;YACf,KAAK,QAAQ,CAAC,CAAC,OAAO,qBAAqB,CAAC;YAC5C,KAAK,UAAU,CAAC,CAAC,OAAO,uBAAuB,CAAC;YAChD,KAAK,UAAU,CAAC,CAAC,OAAO,uBAAuB,CAAC;YAChD,OAAO,CAAC,CAAC,OAAO,EAAE,CAAC;QACrB,CAAC;IACH,CAAC;IAED,mDAAmD;IAC5C,mBAAmB,CAAC,MAAc;QACvC,OAAO,IAAI,CAAC,mBAAmB,CAAC,MAAM,CAAC,CAAC;IAC1C,CAAC;IAED,mEAAmE;IAEnE,eAAe,CAAC,QAAgB;QAC9B,IAAI,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC;YACrC,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;QACtC,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QACnC,CAAC;QACD,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE,CAAC;IAC1B,CAAC;IAED,+CAA+C;IAC/C,eAAe,CAAC,QAAgB;QAC9B,OAAO,IAAI,CAAC,eAAe,CAAC,QAAQ,CAAC,CAAC;IACxC,CAAC;IAED,qBAAqB,CAAC,KAAoB,EAAE,QAAgB;QAC1D,IAAI,KAAK,CAAC,GAAG,KAAK,OAAO,IAAI,KAAK,CAAC,GAAG,KAAK,GAAG,EAAE,CAAC;YAC/C,KAAK,CAAC,cAAc,EAAE,CAAC;YACvB,IAAI,CAAC,eAAe,CAAC,QAAQ,CAAC,CAAC;QACjC,CAAC;IACH,CAAC;IAED,qDAAqD;IACrD,qBAAqB,CAAC,KAAoB,EAAE,QAAgB;QAC1D,OAAO,IAAI,CAAC,qBAAqB,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;IACrD,CAAC;IAED;;;;;;OAMG;IACH,gBAAgB,CAAC,MAA4B,EAAE,KAAiB;QAC9D,KAAK,CAAC,eAAe,EAAE,CAAC;QACxB,IAAI,CAAC,oBAAoB,GAAG,MAAM,CAAC;QACnC,IAAI,CAAC,qBAAqB,GAAG,IAAI,CAAC;QAClC,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE,CAAC;IAC1B,CAAC;IAED;;;;OAIG;IACH,uBAAuB,CAAC,MAA0B;QAChD,IAAI,CAAC,IAAI,CAAC,oBAAoB;YAAE,OAAO;QAEvC,MAAM,MAAM,GAAG,IAAI,CAAC,oBAAoB,CAAC;QACzC,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC;QACxB,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE,CAAC;QAExB,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC;YACzB,cAAc,EAAE,MAAM,CAAC,cAAc;YACrC,SAAS,EAAE,MAAM,CAAC,SAAS;YAC3B,aAAa,EAAE,MAAM,CAAC,IAAI,IAAI,EAAE;YAChC,MAAM,EAAE,MAAM,CAAC,MAAM;YACrB,WAAW,EAAE,MAAM,CAAC,WAAW;SAChC,CAAC,CAAC;QAEH,yEAAyE;QACzE,UAAU,CAAC,GAAG,EAAE;YACd,IAAI,CAAC,qBAAqB,GAAG,KAAK,CAAC;YACnC,IAAI,CAAC,oBAAoB,GAAG,IAAI,CAAC;YACjC,IAAI,CAAC,WAAW,GAAG,KAAK,CAAC;YACzB,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE,CAAC;QAC1B,CAAC,EAAE,GAAG,CAAC,CAAC;IACV,CAAC;IAED;;OAEG;IACH,uBAAuB;QACrB,IAAI,CAAC,qBAAqB,GAAG,KAAK,CAAC;QACnC,IAAI,CAAC,oBAAoB,GAAG,IAAI,CAAC;QACjC,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE,CAAC;IAC1B,CAAC;IAED,mEAAmE;IAEnE;;;;OAIG;IACI,2BAA2B,CAAC,MAA4B;QAC7D,MAAM,QAAQ,GAAI,MAAc,CAAC,cAAc,CAAC;QAChD,IAAI,CAAC,QAAQ;YAAE,OAAO,IAAI,CAAC;QAC3B,OAAO,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC,IAAI,IAAI,CAAC;IAChE,CAAC;IAED,2DAA2D;IACpD,2BAA2B,CAAC,MAA4B;QAC7D,OAAO,IAAI,CAAC,2BAA2B,CAAC,MAAM,CAAC,CAAC;IAClD,CAAC;IAED;;;OAGG;IACK,oBAAoB;QAC1B,IAAI,CAAC,YAAY,CAAC,KAAK,EAAE,CAAC;QAC1B,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;YAC9B,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;QAChD,CAAC;IACH,CAAC;IAED;;;OAGG;IACI,YAAY,CAAC,MAA4B;QAC9C,OAAO,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC;IACtC,CAAC;IAED,4CAA4C;IACrC,YAAY,CAAC,MAA4B;QAC9C,OAAO,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC;IACnC,CAAC;IAED;;;;;OAKG;IACI,kBAAkB,CAAC,MAA4B;QACpD,OAAO,IAAI,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,KAAK,MAAM,CAAC;IACjE,CAAC;IAED,kDAAkD;IAC3C,kBAAkB,CAAC,MAA4B;QACpD,OAAO,IAAI,CAAC,kBAAkB,CAAC,MAAM,CAAC,CAAC;IACzC,CAAC;IAED;;;OAGG;IACI,kBAAkB,CAAC,YAAkC,EAAE,KAAiB;QAC7E,KAAK,CAAC,eAAe,EAAE,CAAC;QACxB,IAAI,CAAC,mBAAmB,GAAG,YAAY,CAAC,EAAE,CAAC;QAC3C,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC;QACxC,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE,CAAC;QAExB,oCAAoC;QACpC,UAAU,CAAC,GAAG,EAAE;YACd,IAAI,IAAI,CAAC,mBAAmB,IAAI,UAAU,CAAC,IAAI,CAAC,mBAAmB,EAAE,YAAY,CAAC,EAAE,CAAC,EAAE,CAAC;gBACtF,IAAI,CAAC,mBAAmB,GAAG,IAAI,CAAC;gBAChC,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE,CAAC;YAC1B,CAAC;QACH,CAAC,EAAE,IAAI,CAAC,CAAC;QAET,mBAAmB;QACnB,UAAU,CAAC,GAAG,EAAE;YACd,MAAM,EAAE,GAAG,QAAQ,CAAC,aAAa,CAAC,oBAAoB,YAAY,CAAC,EAAE,IAAI,CAAC,CAAC;YAC3E,EAAE,EAAE,cAAc,CAAC,EAAE,QAAQ,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAC;QAC9D,CAAC,EAAE,EAAE,CAAC,CAAC;IACT,CAAC;IAED,kEAAkE;IAE1D,eAAe,CAAC,OAA+B;QACrD,MAAM,MAAM,GAAG,IAAI,GAAG,EAAkC,CAAC;QAEzD,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;YAC7B,MAAM,KAAK,GAAG,IAAI,CAAC,oBAAoB,CAAC,IAAI,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC;YACpE,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC;gBACvB,MAAM,CAAC,GAAG,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;YACxB,CAAC;YACD,MAAM,CAAC,GAAG,CAAC,KAAK,CAAE,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAClC,CAAC;QAED,OAAO,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC;IAC3F,CAAC;IAEO,oBAAoB,CAAC,IAAU;QACrC,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,MAAM,KAAK,GAAG,IAAI,IAAI,CAAC,GAAG,CAAC,WAAW,EAAE,EAAE,GAAG,CAAC,QAAQ,EAAE,EAAE,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;QACzE,MAAM,MAAM,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,EAAE,IAAI,CAAC,QAAQ,EAAE,EAAE,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC;QAC7E,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,OAAO,EAAE,GAAG,MAAM,CAAC,OAAO,EAAE,CAAC,GAAG,QAAQ,CAAC,CAAC;QAE7E,MAAM,SAAS,GAAG,IAAI,IAAI,CAAC,cAAc,CAAC,OAAO,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,GAAG,EAAE,SAAS,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QAErH,IAAI,QAAQ,KAAK,CAAC;YAAE,OAAO,gBAAgB,SAAS,EAAE,CAAC;QACvD,IAAI,QAAQ,KAAK,CAAC;YAAE,OAAO,oBAAoB,SAAS,EAAE,CAAC;QAC3D,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,mEAAmE;IAEnE,sBAAsB,CAAC,IAAY;QACjC,QAAQ,IAAI,EAAE,CAAC;YACb,KAAK,QAAQ,CAAC,CAAC,OAAO,aAAa,CAAC;YACpC,KAAK,QAAQ,CAAC,CAAC,OAAO,aAAa,CAAC;YACpC,KAAK,QAAQ,CAAC,CAAC,OAAO,aAAa,CAAC;YACpC,KAAK,UAAU,CAAC,CAAC,OAAO,eAAe,CAAC;YACxC,OAAO,CAAC,CAAC,OAAO,aAAa,CAAC;QAChC,CAAC;IACH,CAAC;IAED,sDAAsD;IACtD,sBAAsB,CAAC,IAAY;QACjC,OAAO,IAAI,CAAC,sBAAsB,CAAC,IAAI,CAAC,CAAC;IAC3C,CAAC;IAED,sBAAsB,CAAC,IAAY;QACjC,QAAQ,IAAI,EAAE,CAAC;YACb,KAAK,QAAQ,CAAC,CAAC,OAAO,SAAS,CAAC;YAChC,KAAK,QAAQ,CAAC,CAAC,OAAO,SAAS,CAAC;YAChC,KAAK,UAAU,CAAC,CAAC,OAAO,UAAU,CAAC;YACnC,OAAO,CAAC,CAAC,OAAO,IAAI,CAAC;QACvB,CAAC;IACH,CAAC;IAED,sDAAsD;IACtD,sBAAsB,CAAC,IAAY;QACjC,OAAO,IAAI,CAAC,sBAAsB,CAAC,IAAI,CAAC,CAAC;IAC3C,CAAC;IAED;;;;;OAKG;IACH,qBAAqB,CAAC,MAA4B;QAChD,IAAI,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC;YAAE,OAAO,SAAS,CAAC;QAChD,OAAO,IAAI,CAAC,sBAAsB,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IAClD,CAAC;IAED,qDAAqD;IACrD,qBAAqB,CAAC,MAA4B;QAChD,OAAO,IAAI,CAAC,qBAAqB,CAAC,MAAM,CAAC,CAAC;IAC5C,CAAC;IAED;;;;OAIG;IACH,gBAAgB,CAAC,MAA4B;QAC3C,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC;YAAE,OAAO,IAAI,CAAC;QAC5C,MAAM,MAAM,GAAI,MAAuD,CAAC,aAAa,CAAC;QACtF,OAAO,MAAM,IAAI,MAAM,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC;IAC5D,CAAC;IAED,gDAAgD;IAChD,gBAAgB,CAAC,MAA4B;QAC3C,OAAO,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAAC,CAAC;IACvC,CAAC;IAED,cAAc,CAAC,MAAc;QAC3B,IAAI,MAAM,KAAK,SAAS;YAAE,OAAO,gBAAgB,CAAC;QAClD,IAAI,MAAM,KAAK,UAAU;YAAE,OAAO,iBAAiB,CAAC;QACpD,OAAO,iBAAiB,CAAC;IAC3B,CAAC;IAED,8CAA8C;IAC9C,cAAc,CAAC,MAAc;QAC3B,OAAO,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC;IACrC,CAAC;IAED,cAAc,CAAC,MAAc;QAC3B,QAAQ,MAAM,EAAE,CAAC;YACf,KAAK,UAAU,CAAC,CAAC,OAAO,iBAAiB,CAAC;YAC1C,KAAK,SAAS,CAAC,CAAC,OAAO,gBAAgB,CAAC;YACxC,KAAK,OAAO,CAAC,CAAC,OAAO,cAAc,CAAC;YACpC,OAAO,CAAC,CAAC,OAAO,gBAAgB,CAAC;QACnC,CAAC;IACH,CAAC;IAED,8CAA8C;IAC9C,cAAc,CAAC,MAAc;QAC3B,OAAO,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC;IACrC,CAAC;IAED,oBAAoB,CAAC,MAA4B;QAC/C,OAAO,GAAG,MAAM,CAAC,IAAI,OAAO,MAAM,CAAC,IAAI,IAAI,cAAc,OAAO,IAAI,CAAC,kBAAkB,CAAC,MAAM,CAAC,SAAS,CAAC,EAAE,CAAC;IAC9G,CAAC;IAED,oDAAoD;IACpD,oBAAoB,CAAC,MAA4B;QAC/C,OAAO,IAAI,CAAC,oBAAoB,CAAC,MAAM,CAAC,CAAC;IAC3C,CAAC;IAED,eAAe,CAAC,IAAmB;QACjC,IAAI,CAAC,IAAI;YAAE,OAAO,GAAG,CAAC;QACtB,IAAI,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;YACvB,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;YACjC,OAAO,KAAK,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC;QAC7C,CAAC;QACD,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QACvC,IAAI,KAAK,CAAC,MAAM,IAAI,CAAC,EAAE,CAAC;YACtB,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC;QACnD,CAAC;QACD,OAAO,IAAI,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC;IAC5C,CAAC;IAED,+CAA+C;IAC/C,eAAe,CAAC,IAAmB;QACjC,OAAO,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC;IACpC,CAAC;IAED,kBAAkB,CAAC,IAAmB;QACpC,IAAI,CAAC,IAAI;YAAE,OAAO,SAAS,CAAC;QAC5B,IAAI,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC;YAAE,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QAClD,OAAO,IAAI,CAAC;IACd,CAAC;IAED,kDAAkD;IAClD,kBAAkB,CAAC,IAAmB;QACpC,OAAO,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,CAAC;IACvC,CAAC;IAED,yBAAyB;QACvB,MAAM,KAAK,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC;QACtE,OAAO,KAAK,CAAC,IAAI,CAAC;IACpB,CAAC;IAED,yDAAyD;IACzD,yBAAyB;QACvB,OAAO,IAAI,CAAC,yBAAyB,EAAE,CAAC;IAC1C,CAAC;IAED,UAAU,CAAC,IAAU;QACnB,OAAO,IAAI,IAAI,CAAC,cAAc,CAAC,OAAO,EAAE;YACtC,IAAI,EAAE,SAAS;YACf,MAAM,EAAE,SAAS;YACjB,MAAM,EAAE,IAAI;SACb,CAAC,CAAC,MAAM,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;IAC5B,CAAC;IAED,0CAA0C;IAC1C,UAAU,CAAC,IAAU;QACnB,OAAO,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;IAC/B,CAAC;IAED,kBAAkB,CAAC,IAAU;QAC3B,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,MAAM,MAAM,GAAG,GAAG,CAAC,OAAO,EAAE,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,CAAC;QACxD,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,KAAK,CAAC,CAAC;QAC5C,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,GAAG,EAAE,CAAC,CAAC;QAC5C,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,GAAG,EAAE,CAAC,CAAC;QAE5C,IAAI,QAAQ,GAAG,CAAC;YAAE,OAAO,UAAU,CAAC;QACpC,IAAI,QAAQ,GAAG,EAAE;YAAE,OAAO,GAAG,QAAQ,OAAO,QAAQ,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC;QAC1E,IAAI,SAAS,GAAG,EAAE;YAAE,OAAO,GAAG,SAAS,QAAQ,SAAS,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC;QAC9E,IAAI,QAAQ,GAAG,CAAC;YAAE,OAAO,GAAG,QAAQ,OAAO,QAAQ,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC;QAEzE,OAAO,IAAI,IAAI,CAAC,cAAc,CAAC,OAAO,EAAE;YACtC,KAAK,EAAE,OAAO;YACd,GAAG,EAAE,SAAS;YACd,IAAI,EAAE,QAAQ,GAAG,GAAG,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS;SAC7C,CAAC,CAAC,MAAM,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;IAC5B,CAAC;IAED,kDAAkD;IAClD,kBAAkB,CAAC,IAAU;QAC3B,OAAO,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,CAAC;IACvC,CAAC;IAED,kBAAkB,CAAC,IAAU;QAC3B,OAAO,IAAI,IAAI,CAAC,cAAc,CAAC,OAAO,EAAE;YACtC,IAAI,EAAE,SAAS;YACf,KAAK,EAAE,MAAM;YACb,GAAG,EAAE,SAAS;YACd,IAAI,EAAE,SAAS;YACf,MAAM,EAAE,SAAS;YACjB,MAAM,EAAE,IAAI;YACZ,YAAY,EAAE,OAAO;SACtB,CAAC,CAAC,MAAM,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;IAC5B,CAAC;IAED,kDAAkD;IAClD,kBAAkB,CAAC,IAAU;QAC3B,OAAO,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,CAAC;IACvC,CAAC;IAED,mEAAmE;IAEnE,gBAAgB,CAAC,MAA4B;QAC3C,sEAAsE;QACtE,mEAAmE;QACnE,oEAAoE;QACpE,yBAAyB;QACzB,IAAI,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,EAAE,CAAC;YAC9B,MAAM,GAAG,GAAG,IAAI,CAAC,2BAA2B,CAAC,MAAM,CAAC,CAAC;YACrD,IAAI,GAAG;gBAAE,OAAO,eAAe,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,SAAS,CAAC,UAAU,CAAC;YACxE,OAAO,+BAA+B,CAAC;QACzC,CAAC;QACD,IAAI,MAAM,CAAC,IAAI,KAAK,QAAQ;YAAE,OAAO,gBAAgB,CAAC;QACtD,IAAI,MAAM,CAAC,IAAI,KAAK,QAAQ;YAAE,OAAO,gBAAgB,CAAC;QACtD,IAAI,MAAM,CAAC,IAAI,KAAK,UAAU;YAAE,OAAO,MAAM,CAAC,kBAAkB,IAAI,mBAAmB,CAAC;QAExF,IAAI,CAAC;YACH,MAAM,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,WAAW,IAAI,IAAI,CAAC,CAAC;YAC3D,MAAM,UAAU,GAAG,IAAI,CAAC,wBAAwB,CAAC,WAAW,CAAC,CAAC;YAC9D,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC;gBAAE,OAAO,2BAA2B,CAAC;YAEhE,OAAO,IAAI,CAAC,qBAAqB,CAAC,UAAU,CAAC,CAAC;QAChD,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,MAAM,CAAC,kBAAkB,IAAI,cAAc,CAAC;QACrD,CAAC;IACH,CAAC;IAED,gDAAgD;IAChD,gBAAgB,CAAC,MAA4B;QAC3C,OAAO,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAAC,CAAC;IACvC,CAAC;IAED,oBAAoB,CAAC,MAA4B;QAC/C,IAAI,CAAC;YACH,IAAI,CAAC,MAAM,CAAC,cAAc;gBAAE,OAAO,CAAC,CAAC;YACrC,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC;YACjD,OAAO,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,MAAM,CAAC,MAAM,CACzC,CAAC,CAAkB,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,IAAI,IAAI,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,EAAE,CACxE,CAAC,MAAM,CAAC;QACX,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,CAAC,CAAC;QACX,CAAC;IACH,CAAC;IAED,oDAAoD;IACpD,oBAAoB,CAAC,MAA4B;QAC/C,OAAO,IAAI,CAAC,oBAAoB,CAAC,MAAM,CAAC,CAAC;IAC3C,CAAC;IAEO,wBAAwB,CAAC,WAA+C;QAC9E,OAAO,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE;YAC7C,MAAM,UAAU,GAAG,WAAW,CAAC,QAAQ,CAAC,CAAC;YACzC,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,MAAM,CAAC,IAAI,CAC9C,CAAC,CAAkB,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,KAAK,UAAU,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,WAAW,EAAE,CAC/F,CAAC;YACF,OAAO,KAAK,EAAE,iBAAiB,IAAI,UAAU,CAAC,KAAK,IAAI,QAAQ,CAAC;QAClE,CAAC,CAAC,CAAC;IACL,CAAC;IAEO,qBAAqB,CAAC,UAAoB;QAChD,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,GAAG,UAAU,CAAC,CAAC,CAAC,UAAU,CAAC;QAC/D,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,GAAG,UAAU,CAAC,CAAC,CAAC,QAAQ,UAAU,CAAC,CAAC,CAAC,UAAU,CAAC;QACpF,IAAI,UAAU,CAAC,MAAM,IAAI,CAAC,EAAE,CAAC;YAC3B,MAAM,IAAI,GAAG,UAAU,CAAC,UAAU,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;YAC/C,OAAO,GAAG,UAAU,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,IAAI,UAAU,CAAC;QACtE,CAAC;QACD,MAAM,SAAS,GAAG,UAAU,CAAC,MAAM,GAAG,CAAC,CAAC;QACxC,OAAO,GAAG,UAAU,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,SAAS,eAAe,SAAS,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,UAAU,CAAC;IACjH,CAAC;IAED,kEAAkE;IAElE,eAAe,CAAC,MAA4B;QAC1C,IAAI,CAAC;YACH,MAAM,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,WAAW,IAAI,IAAI,CAAC,CAAC;YAC3D,OAAO,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC,IAAI,CAAC,oBAAoB,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;QACpG,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,EAAE,CAAC;QACZ,CAAC;IACH,CAAC;IAED,+CAA+C;IAC/C,eAAe,CAAC,MAA4B;QAC1C,OAAO,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC;IACtC,CAAC;IAEO,oBAAoB,CAAC,UAAsE;QACjG,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,MAAM,CAAC,IAAI,CAC9C,CAAC,CAAkB,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,KAAK,UAAU,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,WAAW,EAAE,CAC/F,CAAC;QAEF,MAAM,SAAS,GAAG,IAAI,CAAC,iBAAiB,CAAC,KAAK,CAAC,CAAC;QAChD,MAAM,YAAY,GAAG,iBAAiB,CAAC,UAAU,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;QACnE,MAAM,YAAY,GAAG,iBAAiB,CAAC,UAAU,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;QAEnE,IAAI,QAA8B,CAAC;QACnC,IAAI,SAAS,KAAK,MAAM,IAAI,YAAY,KAAK,YAAY,EAAE,CAAC;YAC1D,QAAQ,GAAG,IAAI,CAAC,gBAAgB,CAAC,YAAY,EAAE,YAAY,CAAC,CAAC;QAC/D,CAAC;QAED,OAAO;YACL,KAAK,EAAE,UAAU,CAAC,KAAK,IAAI,EAAE;YAC7B,WAAW,EAAE,KAAK,EAAE,iBAAiB,IAAI,UAAU,CAAC,KAAK,IAAI,EAAE;YAC/D,QAAQ,EAAE,YAAY;YACtB,QAAQ,EAAE,YAAY;YACtB,SAAS;YACT,QAAQ;SACT,CAAC;IACJ,CAAC;IAEO,iBAAiB,CAAC,KAAkC;QAC1D,IAAI,CAAC,KAAK;YAAE,OAAO,MAAM,CAAC;QAC1B,IAAI,KAAK,CAAC,MAAM,KAAK,iBAAiB,CAAC,OAAO;YAAE,OAAO,SAAS,CAAC;QACjE,IAAI,KAAK,CAAC,MAAM,KAAK,iBAAiB,CAAC,IAAI;YAAE,OAAO,MAAM,CAAC;QAC3D,IAAI,KAAK,CAAC,MAAM,KAAK,iBAAiB,CAAC,MAAM;YAAE,OAAO,QAAQ,CAAC;QAC/D,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,gBAAgB,CAAC,MAA4B;QAC3C,IAAI,CAAC;YACH,IAAI,CAAC,MAAM,CAAC,cAAc;gBAAE,OAAO,EAAE,CAAC;YAEtC,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC;YACjD,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,MAAM,CAAC;YAE7C,OAAO,MAAM;iBACV,MAAM,CAAC,CAAC,KAAsB,EAAE,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,IAAI,IAAI,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;iBAC3F,GAAG,CAAC,CAAC,KAAsB,EAAE,EAAE,CAAC,CAAC;gBAChC,IAAI,EAAE,KAAK,CAAC,IAAI;gBAChB,WAAW,EAAE,KAAK,CAAC,iBAAiB;gBACpC,KAAK,EAAE,iBAAiB,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,KAAK,CAAC;aACpD,CAAC,CAAC,CAAC;QACR,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,EAAE,CAAC;QACZ,CAAC;IACH,CAAC;IAED,gDAAgD;IAChD,gBAAgB,CAAC,MAA4B;QAC3C,OAAO,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAAC,CAAC;IACvC,CAAC;IAED,mEAAmE;IAEnE,mEAAmE;IAE3D,gBAAgB,CAAC,QAAgB,EAAE,QAAgB;QACzD,IAAI,CAAC,QAAQ,IAAI,CAAC,QAAQ,EAAE,CAAC;YAC3B,OAAO,IAAI,CAAC,SAAS,CAAC,uBAAuB,CAAC,oDAAoD,CAAC,CAAC;QACtG,CAAC;QAED,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,OAAO,IAAI,CAAC,SAAS,CAAC,uBAAuB,CAAC,+BAA+B,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;QACnH,CAAC;QAED,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,OAAO,IAAI,CAAC,SAAS,CAAC,uBAAuB,CAAC,iCAAiC,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;QACrH,CAAC;QAED,MAAM,WAAW,GAAG,IAAI,CAAC,iBAAiB,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;QAC/D,MAAM,KAAK,GAAG,WAAW,CAAC,CAAC,CAAC,SAAS,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;QAE1F,MAAM,IAAI,GAAG,KAAK;aACf,GAAG,CAAC,CAAC,IAAY,EAAE,EAAE;YACpB,MAAM,OAAO,GAAG,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YAC5C,IAAI,IAAI,CAAC,KAAK;gBAAE,OAAO,+BAA+B,OAAO,SAAS,CAAC;YACvE,IAAI,IAAI,CAAC,OAAO;gBAAE,OAAO,iCAAiC,OAAO,SAAS,CAAC;YAC3E,OAAO,mCAAmC,OAAO,SAAS,CAAC;QAC7D,CAAC,CAAC;aACD,IAAI,CAAC,EAAE,CAAC,CAAC;QAEZ,OAAO,IAAI,CAAC,SAAS,CAAC,uBAAuB,CAAC,IAAI,CAAC,CAAC;IACtD,CAAC;IAEO,iBAAiB,CAAC,QAAgB,EAAE,QAAgB;QAC1D,MAAM,gBAAgB,GAAG,CAAC,IAAY,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC;QAC5F,MAAM,UAAU,GAAG,CAAC,IAAY,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,GAAG,EAAE,CAAC;QAEtD,OAAO,CAAC,gBAAgB,CAAC,QAAQ,CAAC,IAAI,gBAAgB,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,IAAI,UAAU,CAAC,QAAQ,CAAC,CAAC,CAAC;IACtH,CAAC;IAEO,UAAU,CAAC,IAAY;QAC7B,MAAM,GAAG,GAAG,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;QAC1C,GAAG,CAAC,WAAW,GAAG,IAAI,CAAC;QACvB,OAAO,GAAG,CAAC,SAAS,CAAC;IACvB,CAAC;gHAviCU,sBAAsB;6DAAtB,sBAAsB;YCxHnC,yCAOuB;YAArB,6GAAU,aAAS,IAAC;YAEpB,+FAAiB;YAIjB,yFAAkB;YAqUlB,mDAMiD;YAA/C,AADA,iJAAoB,mCAA+B,IAAC,8HAChC,6BAAyB,IAAC;YAChD,iBAA2B;YAE3B,wFAAwB;YAY1B,iBAAiB;;YAjWf,AADA,AADA,AADA,AADA,AADA,8BAAgB,mCACkB,0BACb,mBACH,mBACA,sBACG;YAGrB,cAEC;YAFD,wCAEC;YAED,cAkUC;YAlUD,yCAkUC;YAIC,cAAiC;YAGjC,AADA,AADA,AADA,mDAAiC,gBAClB,0CACsB,0BAChB;YAKvB,cAWC;YAXD,+CAWC;;;iFD9OU,sBAAsB;cARlC,SAAS;6BACI,KAAK,YACP,mBAAmB,mBAGZ,uBAAuB,CAAC,MAAM,iBAChC,iBAAiB,CAAC,IAAI;;kBAKpC,MAAM;;kBASN,MAAM;;kBACN,KAAK;;kBAGL,KAAK;;kBAOL,MAAM;;kFAvBI,sBAAsB","sourcesContent":["import {\n Component,\n EventEmitter,\n Input,\n OnDestroy,\n OnInit,\n Output,\n ChangeDetectorRef,\n ChangeDetectionStrategy,\n ViewEncapsulation,\n NgZone,\n} from '@angular/core';\nimport { DomSanitizer, SafeHtml } from '@angular/platform-browser';\nimport { Subscription } from 'rxjs';\nimport {\n BaseEntity,\n BaseEntityEvent,\n CompositeKey,\n EntityFieldInfo,\n EntityFieldTSType,\n RunView,\n} from '@memberjunction/core';\nimport { UUIDsEqual, NormalizeUUID } from '@memberjunction/global';\nimport { MJRecordChangeEntity } from '@memberjunction/core-entities';\nimport { FormatChangeValue } from './format-change-value';\nimport { MJNotificationService } from '@memberjunction/ng-notifications';\nimport { BaseAngularComponent } from '@memberjunction/ng-base-types';\nimport { diffChars, diffWords, Change } from 'diff';\nimport { RestoreCommitEvent } from './restore-preview-panel/restore-preview-panel.component';\n\n/** Lightweight shape for displaying a version label associated with this record */\ninterface RecordLabel {\n ID: string;\n Name: string;\n Description: string | null;\n Scope: string;\n Status: string;\n CreatedAt: Date;\n ItemCount: number;\n}\n\n/**\n * Event payload emitted when the user confirms a restore.\n *\n * The host component (typically `record-form-container`) is responsible for:\n * 1. Reloading the live record (concurrency safety),\n * 2. Calling `record.SetRestoreContext(SourceChangeID, Reason)`,\n * 3. Calling `record.Set(FieldName, Value)` for each entry in `FieldValues`,\n * 4. Calling `record.Save()`,\n * 5. Calling `record.ClearRestoreContext()` after the save returns.\n *\n * The provider will write a new RecordChange row with `Source='Restore'`,\n * `RestoredFromID = SourceChangeID`, and `RestoreReason = Reason` —\n * producing the auditable lineage chain.\n */\nexport interface RestoreVersionEvent {\n /** ID of the historical RecordChange row whose state is being restored. */\n SourceChangeID: string;\n /** When the historical change was made. */\n ChangedAt: Date;\n /** Display name / email of who made the historical change. */\n ChangedByUser: string;\n /** Optional user-entered reason for the restore. */\n Reason: string | null;\n /** Selected field values, ready to pass to BaseEntity.Set(). */\n FieldValues: Array<{ FieldName: string; Value: unknown }>;\n}\n\n/** A single field change with type-aware rendering info (timeline display only). */\nexport interface FieldChangeInfo {\n field: string;\n displayName: string;\n oldValue: string;\n newValue: string;\n fieldType: 'boolean' | 'date' | 'number' | 'text';\n diffHtml?: SafeHtml;\n}\n\n/** A group of changes that share the same date. */\nexport interface DateGroup {\n label: string;\n changes: MJRecordChangeEntity[];\n}\n\n/** A conditional filter pill (one per type/source actually present in loaded data). */\nexport interface FilterPill {\n /** Unique key for selection state ('Update', 'Create', 'Delete', 'Snapshot', 'Restore'). */\n Key: string;\n /** User-facing label (pluralized: 'Updates', 'Restored', etc.). */\n Label: string;\n /** Font Awesome icon class. */\n Icon: string;\n /** Number of changes of this kind in the loaded data. */\n Count: number;\n /** Selection style — neutral type pill or violet restore pill. */\n Variant: 'type' | 'restore';\n}\n\n/**\n * Slide-out timeline of all changes to a single record. Hosts the reusable\n * {@link RestorePreviewPanelComponent} for the actual restore confirmation\n * flow, and exposes a `RestoreRequested` event the host can act on to\n * persist the restore.\n *\n * @example\n * <mj-record-changes\n * [record]=\"myEntity\"\n * [AllowRestore]=\"true\"\n * (dialogClosed)=\"showHistory = false\"\n * (RestoreRequested)=\"onRestoreRequested($event)\">\n * </mj-record-changes>\n */\n@Component({\n standalone: false,\n selector: 'mj-record-changes',\n templateUrl: './ng-record-changes.component.html',\n styleUrls: ['./ng-record-changes.component.css'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n})\nexport class RecordChangesComponent extends BaseAngularComponent implements OnInit, OnDestroy {\n public IsLoading = false;\n public IsVisible = false;\n @Output() DialogClosed = new EventEmitter();\n\n /**\n * @deprecated Use {@link DialogClosed}.\n *\n * The same emitter under the old binding name, so a template still binding\n * (dialogClosed) keeps working. Must stay AFTER DialogClosed: class fields\n * initialise in order, and the other way round this captures undefined.\n */\n @Output() dialogClosed = this.DialogClosed;\n @Input() record!: BaseEntity;\n\n /** Whether to show a \"Restore\" button on each historical version row. Default false. */\n @Input() AllowRestore = false;\n\n /**\n * Emitted when the user confirms a restore in the preview panel.\n * The host is responsible for applying the snapshot to the record and\n * saving with `record.SetRestoreContext()` set first.\n */\n @Output() RestoreRequested = new EventEmitter<RestoreVersionEvent>();\n\n ViewData: MJRecordChangeEntity[] = [];\n\n /** @deprecated Use {@link ViewData}. */\n get viewData(): MJRecordChangeEntity[] {\n return this.ViewData;\n }\n /** @deprecated Use {@link ViewData}. */\n set viewData(value: MJRecordChangeEntity[]) {\n this.ViewData = value;\n }\n FilteredData: MJRecordChangeEntity[] = [];\n\n /** @deprecated Use {@link FilteredData}. */\n get filteredData(): MJRecordChangeEntity[] {\n return this.FilteredData;\n }\n /** @deprecated Use {@link FilteredData}. */\n set filteredData(value: MJRecordChangeEntity[]) {\n this.FilteredData = value;\n }\n\n /**\n * Change lookup keyed by NormalizeUUID(ID), rebuilt whenever {@link viewData}\n * loads. Lets {@link getRestoredFromSourceChange} resolve a restore row's\n * source change in O(1) instead of an O(rows) `UUIDsEqual` scan — which was\n * previously executed twice per restore row per CD cycle (once in the\n * template `@if` and once inside `getChangeSummary`), giving O(rows^2)/CD.\n */\n private viewDataById = new Map<string, MJRecordChangeEntity>();\n DateGroups: DateGroup[] = [];\n\n /** @deprecated Use {@link DateGroups}. */\n get dateGroups(): DateGroup[] {\n return this.DateGroups;\n }\n /** @deprecated Use {@link DateGroups}. */\n set dateGroups(value: DateGroup[]) {\n this.DateGroups = value;\n }\n ExpandedItems: Set<string> = new Set();\n\n /** @deprecated Use {@link ExpandedItems}. */\n get expandedItems(): Set<string> {\n return this.ExpandedItems;\n }\n /** @deprecated Use {@link ExpandedItems}. */\n set expandedItems(value: Set<string>) {\n this.ExpandedItems = value;\n }\n\n /** The change record currently selected for restore preview, or null. */\n RestorePreviewChange: MJRecordChangeEntity | null = null;\n /** Visibility of the embedded restore preview slide-in. */\n RestorePreviewVisible = false;\n /** Whether the restore commit is in progress (between confirmation and host response). */\n IsRestoring = false;\n\n // Version label state\n RecordLabels: RecordLabel[] = [];\n IsLoadingLabels = false;\n ShowCreateWizard = false;\n\n // Filter properties\n SearchTerm = '';\n\n /** @deprecated Use {@link SearchTerm}. */\n get searchTerm() {\n return this.SearchTerm;\n }\n /** @deprecated Use {@link SearchTerm}. */\n set searchTerm(value) {\n this.SearchTerm = value;\n }\n /** Single selected type filter (legacy, kept for backwards compat). */\n SelectedType = '';\n\n /** @deprecated Use {@link SelectedType}. */\n get selectedType() {\n return this.SelectedType;\n }\n /** @deprecated Use {@link SelectedType}. */\n set selectedType(value) {\n this.SelectedType = value;\n }\n SelectedSource = '';\n\n /** @deprecated Use {@link SelectedSource}. */\n get selectedSource() {\n return this.SelectedSource;\n }\n /** @deprecated Use {@link SelectedSource}. */\n set selectedSource(value) {\n this.SelectedSource = value;\n }\n /** Map of Key → selected, used by the conditional chip system. */\n ChipSelections: Record<string, boolean> = {};\n /** Whether the overflow popover is open. */\n ShowFilterOverflow = false;\n /** Highlighted change ID for the lineage-jump indicator (transient). */\n HighlightedChangeID: string | null = null;\n\n /**\n * Conditional filter pills derived from loaded data. Always includes 'All'\n * implicitly. Other pills only render when at least one matching change\n * exists. Overflows into a popover when the count exceeds 2.\n */\n ConditionalPills: FilterPill[] = [];\n\n /** Threshold above which conditional chips collapse into the overflow popover. */\n private readonly OVERFLOW_THRESHOLD = 2;\n\n /**\n * Subscription to the record's BaseEntity event stream. We listen for\n * 'save' events and auto-refresh the timeline so the user immediately\n * sees the new RecordChange row produced by either a normal save or a\n * restore. Cleaned up in ngOnDestroy.\n */\n private _entitySaveSub: Subscription | null = null;\n\n constructor(\n private cdr: ChangeDetectorRef,\n private ngZone: NgZone,\n private mjNotificationService: MJNotificationService,\n private sanitizer: DomSanitizer,\n ) { super(); }\n\n ngOnInit(): void {\n if (this.record) {\n this.IsLoading = true;\n this.IsVisible = true;\n this.cdr.markForCheck();\n this.LoadRecordChanges(this.record.PrimaryKey, '', this.record.EntityInfo.Name);\n this.LoadRecordLabels();\n this.subscribeToRecordSaves();\n }\n }\n\n ngOnDestroy(): void {\n this._entitySaveSub?.unsubscribe();\n this._entitySaveSub = null;\n }\n\n /**\n * Wires up an event handler on the live record so the timeline auto-\n * refreshes immediately after any save lands — including the one\n * produced by the restore flow. Without this the user sees their record\n * update in the form but the panel above still shows the pre-restore\n * change list, which is confusing.\n */\n private subscribeToRecordSaves(): void {\n if (!this.record) return;\n this._entitySaveSub?.unsubscribe();\n this._entitySaveSub = this.record.RegisterEventHandler((event: BaseEntityEvent) => {\n if (event?.type === 'save') {\n this.ngZone.run(() => this.Refresh());\n }\n });\n }\n\n /**\n * Reloads the record changes list from the database.\n * Called by the parent container after a save completes while the drawer is open.\n */\n public Refresh(): void {\n if (this.record) {\n this.IsLoading = true;\n this.cdr.markForCheck();\n this.LoadRecordChanges(this.record.PrimaryKey, '', this.record.EntityInfo.Name);\n }\n }\n\n public OnClose(): void {\n this.IsVisible = false;\n this.cdr.markForCheck();\n // Allow the slide-out animation to complete before emitting\n setTimeout(() => this.DialogClosed.emit(), 300);\n }\n\n public async LoadRecordChanges(pkey: CompositeKey, appName: string, entityName: string): Promise<void> {\n if (pkey && entityName) {\n const md = this.ProviderToUse;\n const entityInfo = md.EntityByName(entityName);\n let changes: MJRecordChangeEntity[] = [];\n if (entityInfo?.TrackRecordChanges) {\n const rvResult = await RunView.FromMetadataProvider(md).RunView<MJRecordChangeEntity>({\n EntityName: 'MJ: Record Changes',\n ExtraFilter: `Entity='${entityName}' AND RecordID='${pkey.ToConcatenatedString()}'`,\n OrderBy: 'ChangedAt DESC',\n ResultType: 'entity_object',\n });\n if (rvResult.Success) changes = rvResult.Results;\n }\n this.ngZone.run(() => {\n if (changes) {\n this.ViewData = changes.sort(\n (a: MJRecordChangeEntity, b: MJRecordChangeEntity) => new Date(b.ChangedAt).getTime() - new Date(a.ChangedAt).getTime(),\n );\n this.rebuildViewDataIndex();\n this.rebuildConditionalPills();\n this.applyFilters();\n this.IsLoading = false;\n } else {\n this.mjNotificationService.CreateSimpleNotification(\n `Error loading record changes for ${entityName} with primary key ${pkey.ToString()}.`,\n 'error',\n );\n this.IsLoading = false;\n }\n this.cdr.markForCheck();\n });\n }\n }\n\n // ─── Filter & Search ────────────────────────────────────────────\n\n OnSearchChange(): void {\n this.applyFilters();\n }\n\n /** @deprecated Use {@link OnSearchChange}. */\n onSearchChange(): void {\n return this.OnSearchChange();\n }\n\n onFilterChange(): void {\n this.applyFilters();\n }\n\n /**\n * Toggles the \"All\" pill — clears every conditional selection.\n */\n public SelectAllPill(): void {\n for (const k of Object.keys(this.ChipSelections)) this.ChipSelections[k] = false;\n this.applyFilters();\n }\n\n /**\n * Toggles a conditional pill on/off.\n */\n public TogglePill(key: string): void {\n this.ChipSelections[key] = !this.ChipSelections[key];\n this.applyFilters();\n }\n\n /**\n * Returns true when no conditional pills are selected (i.e. \"All\" mode).\n */\n public get IsAllSelected(): boolean {\n return !Object.values(this.ChipSelections).some(v => v);\n }\n\n /**\n * Whether any conditional pills are actually visible at all.\n */\n public get HasConditionalPills(): boolean {\n return this.ConditionalPills.length > 0;\n }\n\n /**\n * True when the conditional chips should collapse into an overflow popover\n * because there are more than the threshold.\n */\n public get UseOverflowPopover(): boolean {\n return this.ConditionalPills.length > this.OVERFLOW_THRESHOLD;\n }\n\n /** Number of currently selected conditional pills (for the popover trigger label). */\n public get SelectedConditionalCount(): number {\n return Object.values(this.ChipSelections).filter(v => v).length;\n }\n\n public ToggleFilterOverflow(): void {\n this.ShowFilterOverflow = !this.ShowFilterOverflow;\n this.cdr.markForCheck();\n }\n\n public CloseFilterOverflow(): void {\n this.ShowFilterOverflow = false;\n this.cdr.markForCheck();\n }\n\n public ClearFilters(): void {\n this.SearchTerm = '';\n for (const k of Object.keys(this.ChipSelections)) this.ChipSelections[k] = false;\n this.applyFilters();\n }\n\n /**\n * Builds the list of conditional pills from currently loaded data —\n * a pill only appears for change types/sources that actually exist.\n */\n private rebuildConditionalPills(): void {\n const counts: Record<string, number> = {};\n let restoreCount = 0;\n\n for (const c of this.ViewData) {\n const type = c.Type ?? 'Update';\n counts[type] = (counts[type] ?? 0) + 1;\n if (this.isRestoreChange(c)) restoreCount++;\n }\n\n const pills: FilterPill[] = [];\n if ((counts['Update'] ?? 0) > 0) {\n pills.push({ Key: 'Update', Label: 'Updates', Icon: 'fa-pen', Count: counts['Update'], Variant: 'type' });\n }\n if ((counts['Create'] ?? 0) > 0) {\n pills.push({ Key: 'Create', Label: 'Creates', Icon: 'fa-plus', Count: counts['Create'], Variant: 'type' });\n }\n if ((counts['Delete'] ?? 0) > 0) {\n pills.push({ Key: 'Delete', Label: 'Deletes', Icon: 'fa-trash', Count: counts['Delete'], Variant: 'type' });\n }\n if ((counts['Snapshot'] ?? 0) > 0) {\n pills.push({ Key: 'Snapshot', Label: 'Snapshots', Icon: 'fa-camera', Count: counts['Snapshot'], Variant: 'type' });\n }\n if (restoreCount > 0) {\n pills.push({ Key: 'Restore', Label: 'Restored', Icon: 'fa-clock-rotate-left', Count: restoreCount, Variant: 'restore' });\n }\n\n // Initialize/prune selection state\n const validKeys = new Set(pills.map(p => p.Key));\n for (const k of Object.keys(this.ChipSelections)) {\n if (!validKeys.has(k)) delete this.ChipSelections[k];\n }\n for (const p of pills) {\n if (this.ChipSelections[p.Key] === undefined) this.ChipSelections[p.Key] = false;\n }\n\n this.ConditionalPills = pills;\n }\n\n private isRestoreChange(c: MJRecordChangeEntity): boolean {\n return c.Source === 'Restore' || (c as any).RestoredFromID != null;\n }\n\n private applyFilters(): void {\n let filtered = [...this.ViewData];\n\n if (this.SearchTerm.trim()) {\n const search = this.SearchTerm.toLowerCase();\n filtered = filtered.filter(\n change =>\n change.ChangesDescription?.toLowerCase().includes(search) ||\n change.User?.toLowerCase().includes(search) ||\n change.Comments?.toLowerCase().includes(search),\n );\n }\n\n // Apply conditional pill filters — if any are selected, only show changes matching ANY of them (OR semantics).\n const selectedKeys = Object.keys(this.ChipSelections).filter(k => this.ChipSelections[k]);\n if (selectedKeys.length > 0) {\n filtered = filtered.filter(change => {\n for (const key of selectedKeys) {\n if (key === 'Restore') {\n if (this.isRestoreChange(change)) return true;\n } else {\n if (change.Type === key) return true;\n }\n }\n return false;\n });\n }\n\n this.FilteredData = filtered;\n this.DateGroups = this.buildDateGroups(this.FilteredData);\n this.cdr.markForCheck();\n }\n\n // ─── Version Labels ─────────────────────────────────────────────\n\n public async LoadRecordLabels(): Promise<void> {\n if (!this.record) return;\n\n this.IsLoadingLabels = true;\n this.cdr.markForCheck();\n\n try {\n const entityId = this.record.EntityInfo.ID;\n const recordId = this.record.PrimaryKey.ToConcatenatedString();\n\n const rv = RunView.FromMetadataProvider(this.ProviderToUse);\n const itemsResult = await rv.RunView<{ VersionLabelID: string }>({\n EntityName: 'MJ: Version Label Items',\n Fields: ['VersionLabelID'],\n ExtraFilter: `EntityID='${entityId}' AND RecordID='${recordId}'`,\n ResultType: 'simple',\n });\n\n if (!itemsResult.Success || itemsResult.Results.length === 0) {\n this.ngZone.run(() => {\n this.RecordLabels = [];\n this.IsLoadingLabels = false;\n this.cdr.markForCheck();\n });\n return;\n }\n\n const labelIds = [...new Set(itemsResult.Results.map(i => i.VersionLabelID))];\n const labelIdFilter = labelIds.map(id => `'${id}'`).join(',');\n\n const labelsResult = await rv.RunView<{\n ID: string;\n Name: string;\n Description: string | null;\n Scope: string;\n Status: string;\n ItemCount: number;\n __mj_CreatedAt: Date;\n }>({\n EntityName: 'MJ: Version Labels',\n Fields: ['ID', 'Name', 'Description', 'Scope', 'Status', 'ItemCount', '__mj_CreatedAt'],\n ExtraFilter: `ID IN (${labelIdFilter})`,\n OrderBy: '__mj_CreatedAt DESC',\n ResultType: 'simple',\n });\n\n if (labelsResult.Success) {\n this.RecordLabels = labelsResult.Results.map(l => ({\n ID: l.ID,\n Name: l.Name,\n Description: l.Description,\n Scope: l.Scope,\n Status: l.Status,\n CreatedAt: l.__mj_CreatedAt,\n ItemCount: l.ItemCount,\n }));\n }\n } catch (error) {\n console.error('Error loading version labels for record:', error);\n this.RecordLabels = [];\n } finally {\n this.ngZone.run(() => {\n this.IsLoadingLabels = false;\n this.cdr.markForCheck();\n });\n }\n }\n\n public OpenCreateWizard(): void {\n this.ShowCreateWizard = true;\n this.cdr.markForCheck();\n }\n\n public OnLabelCreated(event: { LabelCount: number; ItemCount: number }): void {\n this.ShowCreateWizard = false;\n this.cdr.markForCheck();\n this.LoadRecordLabels();\n this.mjNotificationService.CreateSimpleNotification(\n `Version label created with ${event.ItemCount} snapshot${event.ItemCount !== 1 ? 's' : ''}`,\n 'info',\n 2000,\n );\n }\n\n public OnLabelCreateCancelled(): void {\n this.ShowCreateWizard = false;\n this.cdr.markForCheck();\n }\n\n public GetLabelStatusClass(status: string): string {\n switch (status) {\n case 'Active': return 'label-status-active';\n case 'Archived': return 'label-status-archived';\n case 'Restored': return 'label-status-restored';\n default: return '';\n }\n }\n\n /** @deprecated Use {@link GetLabelStatusClass}. */\n public getLabelStatusClass(status: string): string {\n return this.GetLabelStatusClass(status);\n }\n\n // ─── Timeline Interaction ───────────────────────────────────────\n\n ToggleExpansion(changeId: string): void {\n if (this.ExpandedItems.has(changeId)) {\n this.ExpandedItems.delete(changeId);\n } else {\n this.ExpandedItems.add(changeId);\n }\n this.cdr.markForCheck();\n }\n\n /** @deprecated Use {@link ToggleExpansion}. */\n toggleExpansion(changeId: string): void {\n return this.ToggleExpansion(changeId);\n }\n\n OnTimelineItemKeydown(event: KeyboardEvent, changeId: string): void {\n if (event.key === 'Enter' || event.key === ' ') {\n event.preventDefault();\n this.ToggleExpansion(changeId);\n }\n }\n\n /** @deprecated Use {@link OnTimelineItemKeydown}. */\n onTimelineItemKeydown(event: KeyboardEvent, changeId: string): void {\n return this.OnTimelineItemKeydown(event, changeId);\n }\n\n /**\n * Opens the embedded restore preview panel for a given change record.\n * The panel computes a full-record diff (current vs the change's\n * FullRecordJSON snapshot) — this is the semantic-correctness fix:\n * we restore TO the state at that point in time, not just undo the\n * one delta the user clicked.\n */\n OnRestoreVersion(change: MJRecordChangeEntity, event: MouseEvent): void {\n event.stopPropagation();\n this.RestorePreviewChange = change;\n this.RestorePreviewVisible = true;\n this.cdr.markForCheck();\n }\n\n /**\n * Called when the user confirms the restore in the embedded panel.\n * Translates the panel's RestoreCommitEvent into the broader-shape\n * RestoreVersionEvent the host is wired to handle.\n */\n OnRestorePanelConfirmed(commit: RestoreCommitEvent): void {\n if (!this.RestorePreviewChange) return;\n\n const change = this.RestorePreviewChange;\n this.IsRestoring = true;\n this.cdr.markForCheck();\n\n this.RestoreRequested.emit({\n SourceChangeID: commit.SourceChangeID,\n ChangedAt: change.ChangedAt,\n ChangedByUser: change.User || '',\n Reason: commit.Reason,\n FieldValues: commit.FieldValues,\n });\n\n // Close the panel after a brief delay so the host has a moment to react.\n setTimeout(() => {\n this.RestorePreviewVisible = false;\n this.RestorePreviewChange = null;\n this.IsRestoring = false;\n this.cdr.markForCheck();\n }, 500);\n }\n\n /**\n * Called when the user dismisses the restore preview without confirming.\n */\n OnRestorePanelCancelled(): void {\n this.RestorePreviewVisible = false;\n this.RestorePreviewChange = null;\n this.cdr.markForCheck();\n }\n\n // ─── Lineage chip ───────────────────────────────────────────────\n\n /**\n * Returns the source change for a given restored row, if found in the\n * currently loaded changes. Returns null when the source isn't loaded\n * (e.g., it's been pruned from history) or when this row isn't a restore.\n */\n public GetRestoredFromSourceChange(change: MJRecordChangeEntity): MJRecordChangeEntity | null {\n const sourceId = (change as any).RestoredFromID;\n if (!sourceId) return null;\n return this.viewDataById.get(NormalizeUUID(sourceId)) ?? null;\n }\n\n /** @deprecated Use {@link GetRestoredFromSourceChange}. */\n public getRestoredFromSourceChange(change: MJRecordChangeEntity): MJRecordChangeEntity | null {\n return this.GetRestoredFromSourceChange(change);\n }\n\n /**\n * Rebuilds {@link viewDataById} from the current {@link viewData}. Called once\n * per data load so source-change resolution is an O(1) Map read.\n */\n private rebuildViewDataIndex(): void {\n this.viewDataById.clear();\n for (const c of this.ViewData) {\n this.viewDataById.set(NormalizeUUID(c.ID), c);\n }\n }\n\n /**\n * True when the row was produced by a restore operation (either the\n * `Source` is `'Restore'` OR `RestoredFromID` is populated).\n */\n public IsRestoreRow(change: MJRecordChangeEntity): boolean {\n return this.isRestoreChange(change);\n }\n\n /** @deprecated Use {@link IsRestoreRow}. */\n public isRestoreRow(change: MJRecordChangeEntity): boolean {\n return this.IsRestoreRow(change);\n }\n\n /**\n * True when this change is the most recent in the loaded history.\n * `viewData` is sorted DESC by `ChangedAt`, so the most recent is index 0.\n * Restoring to the most recent version is a no-op, so the timeline hides\n * the Restore button on this row.\n */\n public IsMostRecentChange(change: MJRecordChangeEntity): boolean {\n return this.ViewData.length > 0 && this.ViewData[0] === change;\n }\n\n /** @deprecated Use {@link IsMostRecentChange}. */\n public isMostRecentChange(change: MJRecordChangeEntity): boolean {\n return this.IsMostRecentChange(change);\n }\n\n /**\n * Click handler for the lineage chip — scrolls/highlights the source\n * change row in the timeline. Auto-clears after a few seconds.\n */\n public JumpToSourceChange(sourceChange: MJRecordChangeEntity, event: MouseEvent): void {\n event.stopPropagation();\n this.HighlightedChangeID = sourceChange.ID;\n this.ExpandedItems.add(sourceChange.ID);\n this.cdr.markForCheck();\n\n // Auto-clear the highlight after 3s\n setTimeout(() => {\n if (this.HighlightedChangeID && UUIDsEqual(this.HighlightedChangeID, sourceChange.ID)) {\n this.HighlightedChangeID = null;\n this.cdr.markForCheck();\n }\n }, 3000);\n\n // Scroll into view\n setTimeout(() => {\n const el = document.querySelector(`[data-change-id=\"${sourceChange.ID}\"]`);\n el?.scrollIntoView({ behavior: 'smooth', block: 'center' });\n }, 50);\n }\n\n // ─── Date Grouping ─────────────────────────────────────────────\n\n private buildDateGroups(changes: MJRecordChangeEntity[]): DateGroup[] {\n const groups = new Map<string, MJRecordChangeEntity[]>();\n\n for (const change of changes) {\n const label = this.formatDateGroupLabel(new Date(change.ChangedAt));\n if (!groups.has(label)) {\n groups.set(label, []);\n }\n groups.get(label)!.push(change);\n }\n\n return Array.from(groups.entries()).map(([label, items]) => ({ label, changes: items }));\n }\n\n private formatDateGroupLabel(date: Date): string {\n const now = new Date();\n const today = new Date(now.getFullYear(), now.getMonth(), now.getDate());\n const target = new Date(date.getFullYear(), date.getMonth(), date.getDate());\n const diffDays = Math.floor((today.getTime() - target.getTime()) / 86400000);\n\n const formatted = new Intl.DateTimeFormat('en-US', { month: 'short', day: 'numeric', year: 'numeric' }).format(date);\n\n if (diffDays === 0) return `Today \\u2014 ${formatted}`;\n if (diffDays === 1) return `Yesterday \\u2014 ${formatted}`;\n return formatted;\n }\n\n // ─── Display Helpers ────────────────────────────────────────────\n\n GetChangeTypeCardClass(type: string): string {\n switch (type) {\n case 'Create': return 'type-create';\n case 'Update': return 'type-update';\n case 'Delete': return 'type-delete';\n case 'Snapshot': return 'type-snapshot';\n default: return 'type-update';\n }\n }\n\n /** @deprecated Use {@link GetChangeTypeCardClass}. */\n getChangeTypeCardClass(type: string): string {\n return this.GetChangeTypeCardClass(type);\n }\n\n GetChangeTypeBadgeText(type: string): string {\n switch (type) {\n case 'Create': return 'Created';\n case 'Delete': return 'Deleted';\n case 'Snapshot': return 'Snapshot';\n default: return type;\n }\n }\n\n /** @deprecated Use {@link GetChangeTypeBadgeText}. */\n getChangeTypeBadgeText(type: string): string {\n return this.GetChangeTypeBadgeText(type);\n }\n\n /**\n * Badge text for the row's primary type tag. For restore rows we override\n * the underlying `Type='Update'` and show \"Restore\" instead — matches the\n * mockup's intent of treating restore as a first-class operation in the\n * timeline rather than a flavor of update.\n */\n GetEffectiveBadgeText(change: MJRecordChangeEntity): string {\n if (this.IsRestoreRow(change)) return 'Restore';\n return this.GetChangeTypeBadgeText(change.Type);\n }\n\n /** @deprecated Use {@link GetEffectiveBadgeText}. */\n getEffectiveBadgeText(change: MJRecordChangeEntity): string {\n return this.GetEffectiveBadgeText(change);\n }\n\n /**\n * Optional restore reason — pulled from the dynamic `RestoreReason`\n * column added by the lineage migration. Returns null when not present\n * or not a restore row.\n */\n GetRestoreReason(change: MJRecordChangeEntity): string | null {\n if (!this.IsRestoreRow(change)) return null;\n const reason = (change as unknown as { RestoreReason?: string | null }).RestoreReason;\n return reason && reason.trim().length > 0 ? reason : null;\n }\n\n /** @deprecated Use {@link GetRestoreReason}. */\n getRestoreReason(change: MJRecordChangeEntity): string | null {\n return this.GetRestoreReason(change);\n }\n\n GetSourceClass(source: string): string {\n if (source === 'Restore') return 'source-restore';\n if (source === 'Internal') return 'source-internal';\n return 'source-external';\n }\n\n /** @deprecated Use {@link GetSourceClass}. */\n getSourceClass(source: string): string {\n return this.GetSourceClass(source);\n }\n\n GetStatusClass(status: string): string {\n switch (status) {\n case 'Complete': return 'status-complete';\n case 'Pending': return 'status-pending';\n case 'Error': return 'status-error';\n default: return 'status-unknown';\n }\n }\n\n /** @deprecated Use {@link GetStatusClass}. */\n getStatusClass(status: string): string {\n return this.GetStatusClass(status);\n }\n\n GetTimelineItemLabel(change: MJRecordChangeEntity): string {\n return `${change.Type} by ${change.User || 'Unknown User'} on ${this.FormatFullDateTime(change.ChangedAt)}`;\n }\n\n /** @deprecated Use {@link GetTimelineItemLabel}. */\n getTimelineItemLabel(change: MJRecordChangeEntity): string {\n return this.GetTimelineItemLabel(change);\n }\n\n GetUserInitials(user: string | null): string {\n if (!user) return '?';\n if (user.includes('@')) {\n const local = user.split('@')[0];\n return local.substring(0, 2).toUpperCase();\n }\n const parts = user.trim().split(/\\s+/);\n if (parts.length >= 2) {\n return (parts[0][0] + parts[1][0]).toUpperCase();\n }\n return user.substring(0, 2).toUpperCase();\n }\n\n /** @deprecated Use {@link GetUserInitials}. */\n getUserInitials(user: string | null): string {\n return this.GetUserInitials(user);\n }\n\n GetUserDisplayName(user: string | null): string {\n if (!user) return 'Unknown';\n if (user.includes('@')) return user.split('@')[0];\n return user;\n }\n\n /** @deprecated Use {@link GetUserDisplayName}. */\n getUserDisplayName(user: string | null): string {\n return this.GetUserDisplayName(user);\n }\n\n GetUniqueContributorCount(): number {\n const users = new Set(this.ViewData.map(c => c.User).filter(Boolean));\n return users.size;\n }\n\n /** @deprecated Use {@link GetUniqueContributorCount}. */\n getUniqueContributorCount(): number {\n return this.GetUniqueContributorCount();\n }\n\n FormatTime(date: Date): string {\n return new Intl.DateTimeFormat('en-US', {\n hour: 'numeric',\n minute: '2-digit',\n hour12: true,\n }).format(new Date(date));\n }\n\n /** @deprecated Use {@link FormatTime}. */\n formatTime(date: Date): string {\n return this.FormatTime(date);\n }\n\n FormatRelativeTime(date: Date): string {\n const now = new Date();\n const diffMs = now.getTime() - new Date(date).getTime();\n const diffMins = Math.floor(diffMs / 60000);\n const diffHours = Math.floor(diffMins / 60);\n const diffDays = Math.floor(diffHours / 24);\n\n if (diffMins < 1) return 'Just now';\n if (diffMins < 60) return `${diffMins} min${diffMins > 1 ? 's' : ''} ago`;\n if (diffHours < 24) return `${diffHours} hour${diffHours > 1 ? 's' : ''} ago`;\n if (diffDays < 7) return `${diffDays} day${diffDays > 1 ? 's' : ''} ago`;\n\n return new Intl.DateTimeFormat('en-US', {\n month: 'short',\n day: 'numeric',\n year: diffDays > 365 ? 'numeric' : undefined,\n }).format(new Date(date));\n }\n\n /** @deprecated Use {@link FormatRelativeTime}. */\n formatRelativeTime(date: Date): string {\n return this.FormatRelativeTime(date);\n }\n\n FormatFullDateTime(date: Date): string {\n return new Intl.DateTimeFormat('en-US', {\n year: 'numeric',\n month: 'long',\n day: 'numeric',\n hour: 'numeric',\n minute: 'numeric',\n hour12: true,\n timeZoneName: 'short',\n }).format(new Date(date));\n }\n\n /** @deprecated Use {@link FormatFullDateTime}. */\n formatFullDateTime(date: Date): string {\n return this.FormatFullDateTime(date);\n }\n\n // ─── Change Summary ─────────────────────────────────────────────\n\n GetChangeSummary(change: MJRecordChangeEntity): string {\n // Restore rows get a distinctive summary so the timeline reads like a\n // sentence — \"Restored to 5:56 PM version\" rather than yet another\n // \"Name and Description changed\". The lineage chip carries the full\n // source-version detail.\n if (this.IsRestoreRow(change)) {\n const src = this.GetRestoredFromSourceChange(change);\n if (src) return `Restored to ${this.FormatTime(src.ChangedAt)} version`;\n return 'Restored from earlier version';\n }\n if (change.Type === 'Create') return 'Record created';\n if (change.Type === 'Delete') return 'Record deleted';\n if (change.Type === 'Snapshot') return change.ChangesDescription || 'Snapshot captured';\n\n try {\n const changesJson = JSON.parse(change.ChangesJSON || '{}');\n const fieldNames = this.extractFieldDisplayNames(changesJson);\n if (fieldNames.length === 0) return 'No field changes detected';\n\n return this.buildFieldListSummary(fieldNames);\n } catch {\n return change.ChangesDescription || 'Changes made';\n }\n }\n\n /** @deprecated Use {@link GetChangeSummary}. */\n getChangeSummary(change: MJRecordChangeEntity): string {\n return this.GetChangeSummary(change);\n }\n\n GetCreatedFieldCount(change: MJRecordChangeEntity): number {\n try {\n if (!change.FullRecordJSON) return 0;\n const record = JSON.parse(change.FullRecordJSON);\n return this.record.EntityInfo.Fields.filter(\n (f: EntityFieldInfo) => record[f.Name] != null && record[f.Name] !== '',\n ).length;\n } catch {\n return 0;\n }\n }\n\n /** @deprecated Use {@link GetCreatedFieldCount}. */\n getCreatedFieldCount(change: MJRecordChangeEntity): number {\n return this.GetCreatedFieldCount(change);\n }\n\n private extractFieldDisplayNames(changesJson: Record<string, { field?: string }>): string[] {\n return Object.keys(changesJson).map(fieldKey => {\n const changeInfo = changesJson[fieldKey];\n const field = this.record.EntityInfo.Fields.find(\n (f: EntityFieldInfo) => f.Name.trim().toLowerCase() === changeInfo.field?.trim().toLowerCase(),\n );\n return field?.DisplayNameOrName || changeInfo.field || fieldKey;\n });\n }\n\n private buildFieldListSummary(fieldNames: string[]): string {\n if (fieldNames.length === 1) return `${fieldNames[0]} changed`;\n if (fieldNames.length === 2) return `${fieldNames[0]} and ${fieldNames[1]} changed`;\n if (fieldNames.length <= 4) {\n const last = fieldNames[fieldNames.length - 1];\n return `${fieldNames.slice(0, -1).join(', ')}, and ${last} changed`;\n }\n const remaining = fieldNames.length - 3;\n return `${fieldNames.slice(0, 3).join(', ')}, and ${remaining} other field${remaining > 1 ? 's' : ''} changed`;\n }\n\n // ─── Field Changes (type-aware) ────────────────────────────────\n\n GetFieldChanges(change: MJRecordChangeEntity): FieldChangeInfo[] {\n try {\n const changesJson = JSON.parse(change.ChangesJSON || '{}');\n return Object.keys(changesJson).map(fieldKey => this.buildFieldChangeInfo(changesJson[fieldKey]));\n } catch {\n return [];\n }\n }\n\n /** @deprecated Use {@link GetFieldChanges}. */\n getFieldChanges(change: MJRecordChangeEntity): FieldChangeInfo[] {\n return this.GetFieldChanges(change);\n }\n\n private buildFieldChangeInfo(changeInfo: { field?: string; oldValue?: unknown; newValue?: unknown }): FieldChangeInfo {\n const field = this.record.EntityInfo.Fields.find(\n (f: EntityFieldInfo) => f.Name.trim().toLowerCase() === changeInfo.field?.trim().toLowerCase(),\n );\n\n const fieldType = this.classifyFieldType(field);\n const formattedOld = FormatChangeValue(changeInfo.oldValue, field);\n const formattedNew = FormatChangeValue(changeInfo.newValue, field);\n\n let diffHtml: SafeHtml | undefined;\n if (fieldType === 'text' && formattedOld !== formattedNew) {\n diffHtml = this.generateDiffHtml(formattedOld, formattedNew);\n }\n\n return {\n field: changeInfo.field || '',\n displayName: field?.DisplayNameOrName || changeInfo.field || '',\n oldValue: formattedOld,\n newValue: formattedNew,\n fieldType,\n diffHtml,\n };\n }\n\n private classifyFieldType(field: EntityFieldInfo | undefined): 'boolean' | 'date' | 'number' | 'text' {\n if (!field) return 'text';\n if (field.TSType === EntityFieldTSType.Boolean) return 'boolean';\n if (field.TSType === EntityFieldTSType.Date) return 'date';\n if (field.TSType === EntityFieldTSType.Number) return 'number';\n return 'text';\n }\n\n GetCreatedFields(change: MJRecordChangeEntity): Array<{ name: string; displayName: string; value: string }> {\n try {\n if (!change.FullRecordJSON) return [];\n\n const record = JSON.parse(change.FullRecordJSON);\n const fields = this.record.EntityInfo.Fields;\n\n return fields\n .filter((field: EntityFieldInfo) => record[field.Name] != null && record[field.Name] !== '')\n .map((field: EntityFieldInfo) => ({\n name: field.Name,\n displayName: field.DisplayNameOrName,\n value: FormatChangeValue(record[field.Name], field),\n }));\n } catch {\n return [];\n }\n }\n\n /** @deprecated Use {@link GetCreatedFields}. */\n getCreatedFields(change: MJRecordChangeEntity): Array<{ name: string; displayName: string; value: string }> {\n return this.GetCreatedFields(change);\n }\n\n // ─── Value Formatting ───────────────────────────────────────────\n\n // ─── Diff Generation (text fields only) ─────────────────────────\n\n private generateDiffHtml(oldValue: string, newValue: string): SafeHtml {\n if (!oldValue && !newValue) {\n return this.sanitizer.bypassSecurityTrustHtml('<span class=\"rc-diff-unchanged\">(no change)</span>');\n }\n\n if (!oldValue) {\n return this.sanitizer.bypassSecurityTrustHtml(`<span class=\"rc-diff-added\">${this.escapeHtml(newValue)}</span>`);\n }\n\n if (!newValue) {\n return this.sanitizer.bypassSecurityTrustHtml(`<span class=\"rc-diff-removed\">${this.escapeHtml(oldValue)}</span>`);\n }\n\n const useWordDiff = this.shouldUseWordDiff(oldValue, newValue);\n const diffs = useWordDiff ? diffWords(oldValue, newValue) : diffChars(oldValue, newValue);\n\n const html = diffs\n .map((part: Change) => {\n const escaped = this.escapeHtml(part.value);\n if (part.added) return `<span class=\"rc-diff-added\">${escaped}</span>`;\n if (part.removed) return `<span class=\"rc-diff-removed\">${escaped}</span>`;\n return `<span class=\"rc-diff-unchanged\">${escaped}</span>`;\n })\n .join('');\n\n return this.sanitizer.bypassSecurityTrustHtml(html);\n }\n\n private shouldUseWordDiff(oldValue: string, newValue: string): boolean {\n const hasMultipleWords = (text: string) => text.includes(' ') && text.split(' ').length > 3;\n const isLongText = (text: string) => text.length > 50;\n\n return (hasMultipleWords(oldValue) || hasMultipleWords(newValue)) && (isLongText(oldValue) || isLongText(newValue));\n }\n\n private escapeHtml(text: string): string {\n const div = document.createElement('div');\n div.textContent = text;\n return div.innerHTML;\n }\n}\n","<mj-slide-panel\n [Mode]=\"'slide'\"\n [Title]=\"'Record Changes History'\"\n [Visible]=\"IsVisible\"\n [Resizable]=\"true\"\n [MinWidthPx]=\"400\"\n [MaxWidthRatio]=\"0.6\"\n (Closed)=\"OnClose()\">\n\n @if (IsLoading) {\n <mj-loading text=\"Loading history...\" size=\"medium\"></mj-loading>\n }\n\n @if (!IsLoading) {\n <div class=\"rc-container\">\n <!-- Version Labels Section -->\n <div class=\"rc-labels-section\">\n <div class=\"rc-labels-header\">\n <div class=\"rc-labels-title\">\n <i class=\"fa-solid fa-tags\" aria-hidden=\"true\"></i>\n <span>Version Labels</span>\n @if (RecordLabels.length > 0) {\n <span class=\"rc-labels-count\">{{ RecordLabels.length }}</span>\n }\n </div>\n <button class=\"rc-create-label-btn\" (click)=\"OpenCreateWizard()\" title=\"Create a version label for this record\">\n <i class=\"fa-solid fa-plus\"></i> Create Label\n </button>\n </div>\n @if (IsLoadingLabels) {\n <div class=\"rc-labels-loading\">\n <i class=\"fa-solid fa-spinner fa-spin\"></i> Loading labels...\n </div>\n } @else if (RecordLabels.length === 0) {\n <mj-empty-state class=\"rc-labels-empty\" Size=\"compact\"\n Icon=\"\" Title=\"No version labels for this record yet.\" />\n } @else {\n <div class=\"rc-labels-list\">\n @for (label of RecordLabels; track label.ID) {\n <div class=\"rc-label-chip\" [title]=\"label.Description || label.Name\">\n <i class=\"fa-solid fa-tag rc-label-chip-icon\"></i>\n <span class=\"rc-label-chip-name\">{{ label.Name }}</span>\n <span class=\"rc-label-chip-meta\">\n <span class=\"rc-label-chip-status\" [class]=\"getLabelStatusClass(label.Status)\">{{ label.Status }}</span>\n <span class=\"rc-label-chip-items\">{{ label.ItemCount }} item{{ label.ItemCount !== 1 ? 's' : '' }}</span>\n </span>\n </div>\n }\n </div>\n }\n </div>\n\n @if (viewData.length === 0) {\n <!-- Empty state -->\n <mj-empty-state\n Icon=\"fa-solid fa-clock-rotate-left\"\n Title=\"No Change History\"\n Message=\"This record doesn't have any tracked changes yet. Changes will appear here automatically as edits are made.\"\n Size=\"large\">\n <div class=\"rc-empty-state-hint\">\n <i class=\"fa-solid fa-shield-halved\"></i>\n <span>Record change tracking is managed at the entity level</span>\n </div>\n </mj-empty-state>\n } @else {\n <!-- Page Header -->\n <div class=\"rc-page-header\">\n <div>\n <h2 class=\"rc-page-title\">Change History</h2>\n <div class=\"rc-page-subtitle\">{{ record.EntityInfo.Name }}</div>\n </div>\n <div class=\"rc-header-meta\">\n <div class=\"rc-entity-badge\">\n <i class=\"fa-solid fa-database\" aria-hidden=\"true\"></i>\n {{ record.EntityInfo.Name }}\n </div>\n <div class=\"rc-change-count\">{{ viewData.length }} change{{ viewData.length !== 1 ? 's' : '' }} &middot; {{ getUniqueContributorCount() }} contributor{{ getUniqueContributorCount() !== 1 ? 's' : '' }}</div>\n </div>\n </div>\n\n <!-- Filter Bar — chips render only for change types/sources actually present in loaded data.\n When more than 2 conditional chips would render, they collapse into a \"More filters\" popover. -->\n <div class=\"rc-filter-bar\">\n <div class=\"rc-search-wrap\">\n <i class=\"fa-solid fa-search\" aria-hidden=\"true\"></i>\n <input\n class=\"rc-search-box\"\n type=\"text\"\n placeholder=\"Search changes...\"\n [(ngModel)]=\"searchTerm\"\n (input)=\"onSearchChange()\"\n aria-label=\"Search record changes\"\n />\n </div>\n\n <button class=\"rc-filter-pill\" [class.active]=\"IsAllSelected\" (click)=\"SelectAllPill()\" type=\"button\">\n <i class=\"fa-solid fa-layer-group\" aria-hidden=\"true\"></i> All\n </button>\n\n @if (HasConditionalPills) {\n @if (!UseOverflowPopover) {\n <!-- 1-2 conditional pills: render inline -->\n @for (pill of ConditionalPills; track pill.Key) {\n <button class=\"rc-filter-pill\"\n [class.active]=\"ChipSelections[pill.Key]\"\n [class.rc-filter-pill-restore]=\"pill.Variant === 'restore'\"\n (click)=\"TogglePill(pill.Key)\"\n type=\"button\">\n <i class=\"fa-solid {{ pill.Icon }}\" aria-hidden=\"true\"></i>\n {{ pill.Label }}\n <span class=\"rc-filter-pill-count\">{{ pill.Count }}</span>\n </button>\n }\n } @else {\n <!-- 3+ conditional pills: overflow popover -->\n <div class=\"rc-filter-overflow-wrap\">\n <button class=\"rc-filter-pill rc-filter-pill-overflow\"\n [class.active]=\"SelectedConditionalCount > 0\"\n (click)=\"ToggleFilterOverflow()\"\n type=\"button\">\n <i class=\"fa-solid fa-sliders\" aria-hidden=\"true\"></i>\n More filters\n @if (SelectedConditionalCount > 0) {\n <span class=\"rc-filter-pill-count\">{{ SelectedConditionalCount }}</span>\n }\n <i class=\"fa-solid fa-chevron-down rc-filter-overflow-caret\" aria-hidden=\"true\"></i>\n </button>\n\n @if (ShowFilterOverflow) {\n <!-- Backdrop: clicks close the popover -->\n <div class=\"rc-filter-overflow-backdrop\" (click)=\"CloseFilterOverflow()\"></div>\n <div class=\"rc-filter-overflow-popover\" role=\"menu\">\n <div class=\"rc-filter-overflow-header\">Filter by</div>\n @for (pill of ConditionalPills; track pill.Key) {\n <label class=\"rc-filter-overflow-row\" [class.rc-filter-overflow-row-restore]=\"pill.Variant === 'restore'\">\n <input type=\"checkbox\"\n [checked]=\"ChipSelections[pill.Key]\"\n (change)=\"TogglePill(pill.Key)\" />\n <i class=\"fa-solid {{ pill.Icon }}\" aria-hidden=\"true\"></i>\n <span class=\"rc-filter-overflow-label\">{{ pill.Label }}</span>\n <span class=\"rc-filter-overflow-count\">{{ pill.Count }}</span>\n </label>\n }\n <div class=\"rc-filter-overflow-actions\">\n <button class=\"rc-filter-overflow-clear\" (click)=\"SelectAllPill(); CloseFilterOverflow()\" type=\"button\">\n Clear all\n </button>\n <button class=\"rc-filter-overflow-done\" (click)=\"CloseFilterOverflow()\" type=\"button\">\n Done\n </button>\n </div>\n </div>\n }\n </div>\n }\n }\n </div>\n\n @if (filteredData.length !== viewData.length) {\n <div class=\"rc-filter-results\">\n Showing {{ filteredData.length }} of {{ viewData.length }} changes\n <button class=\"rc-clear-filters-link\" (click)=\"ClearFilters()\">Clear filters</button>\n </div>\n }\n\n <!-- Timeline -->\n <div class=\"rc-timeline\" [attr.aria-label]=\"'Timeline of changes for ' + record.EntityInfo.Name + ' record'\">\n @if (filteredData.length === 0) {\n <mj-empty-state\n Variant=\"no-results\"\n Icon=\"fa-solid fa-filter\"\n Title=\"No changes match your current filters\"\n ActionText=\"Clear filters\"\n ActionIcon=\"fa-solid fa-rotate-left\"\n (Action)=\"ClearFilters()\" />\n } @else {\n @for (group of dateGroups; track group.label) {\n <div class=\"rc-date-group\">\n <div class=\"rc-date-label\">{{ group.label }}</div>\n\n @for (change of group.changes; track change.ID) {\n <div\n class=\"rc-card\"\n [attr.data-change-id]=\"change.ID\"\n [class]=\"getChangeTypeCardClass(change.Type)\"\n [class.expanded]=\"expandedItems.has(change.ID)\"\n [class.rc-card-restore]=\"isRestoreRow(change)\"\n [class.rc-card-highlight]=\"HighlightedChangeID === change.ID\"\n [attr.tabindex]=\"0\"\n [attr.aria-expanded]=\"expandedItems.has(change.ID)\"\n [attr.aria-label]=\"getTimelineItemLabel(change)\"\n (keydown)=\"onTimelineItemKeydown($event, change.ID)\"\n >\n <!-- Card Header -->\n <div class=\"rc-card-header\" (click)=\"toggleExpansion(change.ID)\">\n <div class=\"rc-card-header-left\">\n <span class=\"rc-card-type-badge\"\n [class.rc-card-type-badge-restore]=\"isRestoreRow(change)\">{{ getEffectiveBadgeText(change) }}</span>\n <span class=\"rc-card-summary\">{{ getChangeSummary(change) }}</span>\n\n <!-- Lineage chip — visible when this row was produced by a restore -->\n @if (isRestoreRow(change)) {\n @if (getRestoredFromSourceChange(change); as srcChange) {\n <a class=\"rc-restored-chip\"\n (click)=\"JumpToSourceChange(srcChange, $event)\"\n [title]=\"'Jump to source version (' + formatFullDateTime(srcChange.ChangedAt) + ')'\">\n <i class=\"fa-solid fa-link\" aria-hidden=\"true\"></i>\n Restored from {{ formatTime(srcChange.ChangedAt) }} {{ srcChange.ChangedAt ? 'on ' + (srcChange.ChangedAt | date:'mediumDate') : '' }}\n @if (srcChange.User) {\n by {{ getUserDisplayName(srcChange.User) }}\n }\n </a>\n } @else {\n <span class=\"rc-restored-chip rc-restored-chip-orphan\"\n title=\"Source version was not loaded into this view\">\n <i class=\"fa-solid fa-clock-rotate-left\" aria-hidden=\"true\"></i>\n Restored from earlier version\n </span>\n }\n }\n </div>\n <div class=\"rc-card-meta\">\n <div class=\"rc-card-user\">\n <div class=\"rc-avatar\">{{ getUserInitials(change.User) }}</div>\n {{ getUserDisplayName(change.User) }}\n </div>\n <span class=\"rc-card-time\" [title]=\"formatFullDateTime(change.ChangedAt)\">{{ formatTime(change.ChangedAt) }}</span>\n <span class=\"rc-card-source\" [class]=\"getSourceClass(change.Source)\">{{ change.Source }}</span>\n <span class=\"rc-card-status\" [class]=\"getStatusClass(change.Status)\">{{ change.Status }}</span>\n <i class=\"fa-solid fa-chevron-down rc-card-chevron\" aria-hidden=\"true\"></i>\n </div>\n </div>\n\n <!-- Card Body (expanded) -->\n @if (expandedItems.has(change.ID)) {\n <div class=\"rc-card-body\">\n <!-- Restore reason (when present) — Notion/Linear-style\n blockquote: a thin violet left bar + italic text,\n with a tiny \"Reason\" prefix. No box, no header,\n no large vertical footprint. Reads as a\n justification note rather than a callout. -->\n @if (getRestoreReason(change); as reason) {\n <blockquote class=\"rc-restore-reason\">\n <span class=\"rc-restore-reason-label\">Reason</span>\n <span class=\"rc-restore-reason-text\">{{ reason }}</span>\n </blockquote>\n }\n\n @if (change.Type === 'Create') {\n @if (change.FullRecordJSON) {\n @for (field of getCreatedFields(change); track field.name) {\n <div class=\"rc-field-row\">\n <div class=\"rc-field-label\">{{ field.displayName }}</div>\n <div class=\"rc-field-values\">\n <span class=\"rc-val-new\">{{ field.value }}</span>\n </div>\n </div>\n }\n }\n } @else if (change.Type === 'Delete') {\n <div class=\"rc-deletion-note\">\n <i class=\"fa-solid fa-trash\" aria-hidden=\"true\"></i>\n This record was permanently removed from the system.\n </div>\n } @else {\n <!-- Update / Snapshot / Restore: type-aware field changes -->\n @for (fc of getFieldChanges(change); track fc.field) {\n <div class=\"rc-field-row\">\n <div class=\"rc-field-label\">{{ fc.displayName }}</div>\n <div class=\"rc-field-values\">\n @if (fc.fieldType === 'boolean') {\n <div class=\"rc-bool-change\">\n <span class=\"rc-bool-dot\" [class.on]=\"fc.oldValue === 'true' || fc.oldValue === '1'\" [class.off]=\"fc.oldValue !== 'true' && fc.oldValue !== '1'\"></span>\n <span class=\"rc-bool-label old\">{{ fc.oldValue === 'true' || fc.oldValue === '1' ? 'Yes' : 'No' }}</span>\n <i class=\"fa-solid fa-arrow-right rc-val-arrow\" aria-hidden=\"true\"></i>\n <span class=\"rc-bool-dot\" [class.on]=\"fc.newValue === 'true' || fc.newValue === '1'\" [class.off]=\"fc.newValue !== 'true' && fc.newValue !== '1'\"></span>\n <span class=\"rc-bool-label new\" [class.active]=\"fc.newValue === 'true' || fc.newValue === '1'\" [class.inactive]=\"fc.newValue !== 'true' && fc.newValue !== '1'\">{{ fc.newValue === 'true' || fc.newValue === '1' ? 'Yes' : 'No' }}</span>\n </div>\n } @else if (fc.fieldType === 'date' || fc.fieldType === 'number') {\n <div class=\"rc-atomic-change\">\n <span class=\"rc-val-old\">{{ fc.oldValue || '(empty)' }}</span>\n <i class=\"fa-solid fa-arrow-right rc-val-arrow\" aria-hidden=\"true\"></i>\n <span class=\"rc-val-new\">{{ fc.newValue || '(empty)' }}</span>\n </div>\n } @else if (fc.diffHtml) {\n <div class=\"rc-text-diff\" [innerHTML]=\"fc.diffHtml\"></div>\n } @else {\n <div class=\"rc-atomic-change\">\n <span class=\"rc-val-old\">{{ fc.oldValue || '(empty)' }}</span>\n <i class=\"fa-solid fa-arrow-right rc-val-arrow\" aria-hidden=\"true\"></i>\n <span class=\"rc-val-new\">{{ fc.newValue || '(empty)' }}</span>\n </div>\n }\n </div>\n </div>\n }\n }\n\n @if (change.Comments) {\n <div class=\"rc-comments\">\n <i class=\"fa-solid fa-comment\" aria-hidden=\"true\"></i>\n {{ change.Comments }}\n </div>\n }\n\n @if (change.ErrorLog) {\n <div class=\"rc-errors\">\n <i class=\"fa-solid fa-exclamation-triangle\" aria-hidden=\"true\"></i>\n <pre class=\"rc-error-log\">{{ change.ErrorLog }}</pre>\n </div>\n }\n\n <!-- Restore action: shown for Update, Create, and Snapshot rows.\n Hidden on Delete rows (handled via the Recycle Bin path)\n and on the most recent change (restoring to current state is a no-op). -->\n @if (AllowRestore && change.Type !== 'Delete' && !isMostRecentChange(change)) {\n <div class=\"rc-restore-action\">\n <button class=\"rc-restore-btn\"\n (click)=\"OnRestoreVersion(change, $event)\"\n title=\"Restore the entire record to its state at this version\">\n <i class=\"fa-solid fa-clock-rotate-left\" aria-hidden=\"true\"></i>\n Restore record to this version\n </button>\n </div>\n }\n </div>\n }\n </div>\n }\n </div>\n }\n }\n </div>\n }\n </div>\n }\n\n <!-- Restore preview slide-in (reusable component) -->\n <mj-restore-preview-panel\n [Visible]=\"RestorePreviewVisible\"\n [Mode]=\"'live'\"\n [RecordChange]=\"RestorePreviewChange\"\n [LiveRecord]=\"record\"\n (RestoreConfirmed)=\"OnRestorePanelConfirmed($event)\"\n (RestoreCancelled)=\"OnRestorePanelCancelled()\">\n </mj-restore-preview-panel>\n\n @if (ShowCreateWizard) {\n <div class=\"rc-wizard-overlay\" (click)=\"OnLabelCreateCancelled()\">\n <div class=\"rc-wizard-container\" (click)=\"$event.stopPropagation()\">\n <mj-label-create\n [PreselectedEntity]=\"record.EntityInfo\"\n [PreselectedRecordIds]=\"[record.PrimaryKey.KeyValuePairs[0].Value]\"\n (Created)=\"OnLabelCreated($event)\"\n (Cancel)=\"OnLabelCreateCancelled()\">\n </mj-label-create>\n </div>\n </div>\n }\n</mj-slide-panel>\n"]}
1
+ {"version":3,"file":"ng-record-changes.component.js","sourceRoot":"","sources":["../../src/lib/ng-record-changes.component.ts","../../src/lib/ng-record-changes.component.html"],"names":[],"mappings":"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","sourcesContent":["import {\n Component,\n EventEmitter,\n Input,\n OnDestroy,\n OnInit,\n Output,\n ChangeDetectorRef,\n ChangeDetectionStrategy,\n ViewEncapsulation,\n NgZone,\n} from '@angular/core';\nimport { DomSanitizer, SafeHtml } from '@angular/platform-browser';\nimport { Subscription } from 'rxjs';\nimport {\n BaseEntity,\n BaseEntityEvent,\n CompositeKey,\n EntityFieldInfo,\n EntityFieldTSType,\n RunView,\n} from '@memberjunction/core';\nimport { UUIDsEqual, NormalizeUUID } from '@memberjunction/global';\nimport { MJRecordChangeEntity } from '@memberjunction/core-entities';\nimport { FormatChangeValue } from './format-change-value';\nimport { MJNotificationService } from '@memberjunction/ng-notifications';\nimport { BaseAngularComponent } from '@memberjunction/ng-base-types';\nimport {\n MJBurstClusterItem,\n MJBurstClusterCategory,\n MJBurstClusterResolution,\n MJBurstClusterCoalesceStrategy,\n MJAfterBurstClustersRebuildEventArgs,\n MJBurstFilterChangedEventArgs,\n} from '@memberjunction/ng-ui-components';\nimport { diffChars, diffWords, Change } from 'diff';\nimport { RestoreCommitEvent } from './restore-preview-panel/restore-preview-panel.component';\n\n/** Lightweight shape for displaying a version label associated with this record */\ninterface RecordLabel {\n ID: string;\n Name: string;\n Description: string | null;\n Scope: string;\n Status: string;\n CreatedAt: Date;\n ItemCount: number;\n}\n\n/**\n * Event payload emitted when the user confirms a restore.\n *\n * The host component (typically `record-form-container`) is responsible for:\n * 1. Reloading the live record (concurrency safety),\n * 2. Calling `record.SetRestoreContext(SourceChangeID, Reason)`,\n * 3. Calling `record.Set(FieldName, Value)` for each entry in `FieldValues`,\n * 4. Calling `record.Save()`,\n * 5. Calling `record.ClearRestoreContext()` after the save returns.\n *\n * The provider will write a new RecordChange row with `Source='Restore'`,\n * `RestoredFromID = SourceChangeID`, and `RestoreReason = Reason` —\n * producing the auditable lineage chain.\n */\nexport interface RestoreVersionEvent {\n /** ID of the historical RecordChange row whose state is being restored. */\n SourceChangeID: string;\n /** When the historical change was made. */\n ChangedAt: Date;\n /** Display name / email of who made the historical change. */\n ChangedByUser: string;\n /** Optional user-entered reason for the restore. */\n Reason: string | null;\n /** Selected field values, ready to pass to BaseEntity.Set(). */\n FieldValues: Array<{ FieldName: string; Value: unknown }>;\n}\n\n/** A single field change with type-aware rendering info (timeline display only). */\nexport interface FieldChangeInfo {\n field: string;\n displayName: string;\n oldValue: string;\n newValue: string;\n fieldType: 'boolean' | 'date' | 'number' | 'text';\n diffHtml?: SafeHtml;\n}\n\n/** A group of changes that share the same date. */\nexport interface DateGroup {\n label: string;\n changes: MJRecordChangeEntity[];\n}\n\n/** A conditional filter pill (one per type/source actually present in loaded data). */\nexport interface FilterPill {\n /** Unique key for selection state ('Update', 'Create', 'Delete', 'Snapshot', 'Restore'). */\n Key: string;\n /** User-facing label (pluralized: 'Updates', 'Restored', etc.). */\n Label: string;\n /** Font Awesome icon class. */\n Icon: string;\n /** Number of changes of this kind in the loaded data. */\n Count: number;\n /** Selection style — neutral type pill or violet restore pill. */\n Variant: 'type' | 'restore';\n}\n\n/** Individual change pip rendered inside a burst cluster card. */\nexport interface ActivityBurstPip {\n /** Normalized RecordChange ID. */\n ID: string;\n /** Visual category of the change ('create' | 'update' | 'restore'). */\n Type: 'create' | 'update' | 'restore';\n /** Hover tooltip for this specific change pip. */\n Tooltip: string;\n}\n\n/** A single active editing session / burst cluster in the Burst-Aware Cluster Strip (Option A). */\nexport interface ActivityChartBucket {\n /** Stable bucket key for selection and track-by. */\n Key: string;\n /** Short session date label (e.g. 'Today', 'Oct 15', 'Apr 12 \\'24'). */\n Label: string;\n /** Concise session summary subtitle (e.g. 'Initial creation', '4 edits', '1 restore, 2 edits'). */\n Subtitle: string;\n /** Non-linear quiet time gap label between this burst and the next burst (e.g. '11 mos quiet', '8d quiet'), or null on the final burst. */\n GapAfterLabel: string | null;\n /** Up to 12 individual change pips in chronological order within this burst. */\n Pips: ActivityBurstPip[];\n /** Number of additional changes in this burst beyond the 12 rendered pips. */\n OverflowPipCount: number;\n /** Detailed tooltip text describing the burst range and breakdown. */\n Tooltip: string;\n /** Inclusive burst start timestamp (ms). */\n StartTime: number;\n /** Inclusive burst end timestamp (ms). */\n EndTime: number;\n /** Total changes in this burst. */\n TotalCount: number;\n /** Count of standard updates in this burst. */\n UpdateCount: number;\n /** Count of create events in this burst. */\n CreateCount: number;\n /** Count of restore events in this burst. */\n RestoreCount: number;\n /** Count of delete/other events in this burst. */\n OtherCount: number;\n /** Normalized bar height percentage (22..100). */\n HeightPercent: number;\n /** Proportion of changes for Updates (0..100). */\n UpdateSharePercent: number;\n /** Proportion of changes for Creates (0..100). */\n CreateSharePercent: number;\n /** Proportion of changes for Restores (0..100). */\n RestoreSharePercent: number;\n /** Set of normalized RecordChange IDs falling into this burst. */\n ChangeIDs: Set<string>;\n}\n\n/**\n * Slide-out timeline of all changes to a single record. Hosts the reusable\n * {@link RestorePreviewPanelComponent} for the actual restore confirmation\n * flow, and exposes a `RestoreRequested` event the host can act on to\n * persist the restore.\n *\n * @example\n * <mj-record-changes\n * [record]=\"myEntity\"\n * [AllowRestore]=\"true\"\n * (dialogClosed)=\"showHistory = false\"\n * (RestoreRequested)=\"onRestoreRequested($event)\">\n * </mj-record-changes>\n */\n@Component({\n standalone: false,\n selector: 'mj-record-changes',\n templateUrl: './ng-record-changes.component.html',\n styleUrls: ['./ng-record-changes.component.css'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n})\nexport class RecordChangesComponent extends BaseAngularComponent implements OnInit, OnDestroy {\n public IsLoading = false;\n public IsVisible = false;\n @Output() DialogClosed = new EventEmitter();\n\n /**\n * @deprecated Use {@link DialogClosed}.\n *\n * The same emitter under the old binding name, so a template still binding\n * (dialogClosed) keeps working. Must stay AFTER DialogClosed: class fields\n * initialise in order, and the other way round this captures undefined.\n */\n @Output() dialogClosed = this.DialogClosed;\n @Input() record!: BaseEntity;\n\n /** Whether to show a \"Restore\" button on each historical version row. Default false. */\n @Input() AllowRestore = false;\n\n /**\n * Optional ID of the historical change currently being previewed directly\n * inside the host entity form (\"Time Travel\" mode).\n */\n @Input() PreviewedChangeID: string | null = null;\n\n /**\n * Emitted when the user toggles \"Preview in Form\" on a historical change card\n * (or clears the preview). Emits the selected {@link MJRecordChangeEntity} or\n * `null` when exiting preview.\n */\n @Output() PreviewVersionSelected = new EventEmitter<MJRecordChangeEntity | null>();\n\n /**\n * Emitted when the user confirms a restore in the preview panel.\n * The host is responsible for applying the snapshot to the record and\n * saving with `record.SetRestoreContext()` set first.\n */\n @Output() RestoreRequested = new EventEmitter<RestoreVersionEvent>();\n\n ViewData: MJRecordChangeEntity[] = [];\n\n /** @deprecated Use {@link ViewData}. */\n get viewData(): MJRecordChangeEntity[] {\n return this.ViewData;\n }\n /** @deprecated Use {@link ViewData}. */\n set viewData(value: MJRecordChangeEntity[]) {\n this.ViewData = value;\n }\n FilteredData: MJRecordChangeEntity[] = [];\n\n /** @deprecated Use {@link FilteredData}. */\n get filteredData(): MJRecordChangeEntity[] {\n return this.FilteredData;\n }\n /** @deprecated Use {@link FilteredData}. */\n set filteredData(value: MJRecordChangeEntity[]) {\n this.FilteredData = value;\n }\n\n /**\n * Change lookup keyed by NormalizeUUID(ID), rebuilt whenever {@link viewData}\n * loads. Lets {@link getRestoredFromSourceChange} resolve a restore row's\n * source change in O(1) instead of an O(rows) `UUIDsEqual` scan — which was\n * previously executed twice per restore row per CD cycle (once in the\n * template `@if` and once inside `getChangeSummary`), giving O(rows^2)/CD.\n */\n private viewDataById = new Map<string, MJRecordChangeEntity>();\n DateGroups: DateGroup[] = [];\n\n /** @deprecated Use {@link DateGroups}. */\n get dateGroups(): DateGroup[] {\n return this.DateGroups;\n }\n /** @deprecated Use {@link DateGroups}. */\n set dateGroups(value: DateGroup[]) {\n this.DateGroups = value;\n }\n ExpandedItems: Set<string> = new Set();\n\n /** @deprecated Use {@link ExpandedItems}. */\n get expandedItems(): Set<string> {\n return this.ExpandedItems;\n }\n /** @deprecated Use {@link ExpandedItems}. */\n set expandedItems(value: Set<string>) {\n this.ExpandedItems = value;\n }\n\n /** The change record currently selected for restore preview, or null. */\n RestorePreviewChange: MJRecordChangeEntity | null = null;\n /** Visibility of the embedded restore preview slide-in. */\n RestorePreviewVisible = false;\n /** Whether the restore commit is in progress (between confirmation and host response). */\n IsRestoring = false;\n\n // Version label state\n RecordLabels: RecordLabel[] = [];\n IsLoadingLabels = false;\n ShowCreateWizard = false;\n /** Controls whether the compact version labels tray is expanded in the header. */\n ShowLabelsTray = false;\n\n // Activity spark-bar chart state (powered by <mj-burst-cluster-strip> from @memberjunction/ng-ui-components)\n @Input() BurstResolution: MJBurstClusterResolution = 'auto';\n @Input() BurstCoalesceStrategy: MJBurstClusterCoalesceStrategy = 'adaptive-era';\n @Input() BurstSessionGapHours = 6;\n @Input() BurstMaxClusters = 5;\n @Input() BurstEraZoomThreshold = 10;\n @Input() AllowBurstZoom = true;\n\n BurstClusterItems: MJBurstClusterItem<MJRecordChangeEntity>[] = [];\n readonly BurstClusterCategories: MJBurstClusterCategory[] = [\n { Key: 'update', Label: 'Update', SingularLabel: 'edit', PluralLabel: 'edits', Color: 'var(--mj-brand-primary)', CssModifier: 'update' },\n { Key: 'create', Label: 'Create', SingularLabel: 'create', PluralLabel: 'creates', Color: 'var(--mj-status-success)', CssModifier: 'create' },\n { Key: 'restore', Label: 'Restore', SingularLabel: 'restore', PluralLabel: 'restores', Color: '#8b5cf6', CssModifier: 'restore' },\n ];\n ActiveBurstFilteredIDs: Set<string> | null = null;\n ActivityBuckets: ActivityChartBucket[] = [];\n SelectedBucketKey: string | null = null;\n ActivityChartGranularityLabel = '';\n\n // Cross-version comparison (vA <-> vB) state\n CompareMode = false;\n CompareBaseChangeID: string | null = null;\n CompareTargetChangeID: string | null = null;\n\n // Filter properties\n SearchTerm = '';\n\n /** @deprecated Use {@link SearchTerm}. */\n get searchTerm() {\n return this.SearchTerm;\n }\n /** @deprecated Use {@link SearchTerm}. */\n set searchTerm(value) {\n this.SearchTerm = value;\n }\n /** Single selected type filter (legacy, kept for backwards compat). */\n SelectedType = '';\n\n /** @deprecated Use {@link SelectedType}. */\n get selectedType() {\n return this.SelectedType;\n }\n /** @deprecated Use {@link SelectedType}. */\n set selectedType(value) {\n this.SelectedType = value;\n }\n SelectedSource = '';\n\n /** @deprecated Use {@link SelectedSource}. */\n get selectedSource() {\n return this.SelectedSource;\n }\n /** @deprecated Use {@link SelectedSource}. */\n set selectedSource(value) {\n this.SelectedSource = value;\n }\n /** Map of Key → selected, used by the conditional chip system. */\n ChipSelections: Record<string, boolean> = {};\n /** Whether the overflow popover is open. */\n ShowFilterOverflow = false;\n /** Highlighted change ID for the lineage-jump indicator (transient). */\n HighlightedChangeID: string | null = null;\n\n /**\n * Conditional filter pills derived from loaded data. Always includes 'All'\n * implicitly. Other pills only render when at least one matching change\n * exists. Overflows into a popover when the count exceeds 2.\n */\n ConditionalPills: FilterPill[] = [];\n\n /** Threshold above which conditional chips collapse into the overflow popover. */\n private readonly OVERFLOW_THRESHOLD = 2;\n\n /**\n * Subscription to the record's BaseEntity event stream. We listen for\n * 'save' events and auto-refresh the timeline so the user immediately\n * sees the new RecordChange row produced by either a normal save or a\n * restore. Cleaned up in ngOnDestroy.\n */\n private _entitySaveSub: Subscription | null = null;\n\n constructor(\n private cdr: ChangeDetectorRef,\n private ngZone: NgZone,\n private mjNotificationService: MJNotificationService,\n private sanitizer: DomSanitizer,\n ) { super(); }\n\n ngOnInit(): void {\n if (this.record) {\n this.IsLoading = true;\n this.IsVisible = true;\n this.cdr.markForCheck();\n this.LoadRecordChanges(this.record.PrimaryKey, '', this.record.EntityInfo.Name);\n this.LoadRecordLabels();\n this.subscribeToRecordSaves();\n }\n }\n\n ngOnDestroy(): void {\n this._entitySaveSub?.unsubscribe();\n this._entitySaveSub = null;\n }\n\n /**\n * Wires up an event handler on the live record so the timeline auto-\n * refreshes immediately after any save lands — including the one\n * produced by the restore flow. Without this the user sees their record\n * update in the form but the panel above still shows the pre-restore\n * change list, which is confusing.\n */\n private subscribeToRecordSaves(): void {\n if (!this.record) return;\n this._entitySaveSub?.unsubscribe();\n this._entitySaveSub = this.record.RegisterEventHandler((event: BaseEntityEvent) => {\n if (event?.type === 'save') {\n this.ngZone.run(() => this.Refresh());\n }\n });\n }\n\n /**\n * Reloads the record changes list from the database.\n * Called by the parent container after a save completes while the drawer is open.\n */\n public Refresh(): void {\n if (this.record) {\n this.IsLoading = true;\n this.cdr.markForCheck();\n this.LoadRecordChanges(this.record.PrimaryKey, '', this.record.EntityInfo.Name);\n }\n }\n\n public OnClose(): void {\n this.IsVisible = false;\n this.cdr.markForCheck();\n // Allow the slide-out animation to complete before emitting\n setTimeout(() => this.DialogClosed.emit(), 300);\n }\n\n public async LoadRecordChanges(pkey: CompositeKey, appName: string, entityName: string): Promise<void> {\n if (pkey && entityName) {\n const md = this.ProviderToUse;\n const entityInfo = md.EntityByName(entityName);\n let changes: MJRecordChangeEntity[] = [];\n if (entityInfo?.TrackRecordChanges) {\n const rvResult = await RunView.FromMetadataProvider(md).RunView<MJRecordChangeEntity>({\n EntityName: 'MJ: Record Changes',\n ExtraFilter: `Entity='${entityName}' AND RecordID='${pkey.ToConcatenatedString()}'`,\n OrderBy: 'ChangedAt DESC',\n ResultType: 'entity_object',\n });\n if (rvResult.Success) changes = rvResult.Results;\n }\n this.ngZone.run(() => {\n if (changes) {\n this.ViewData = changes.sort(\n (a: MJRecordChangeEntity, b: MJRecordChangeEntity) => new Date(b.ChangedAt).getTime() - new Date(a.ChangedAt).getTime(),\n );\n this.rebuildViewDataIndex();\n this.rebuildConditionalPills();\n this.rebuildActivityChart();\n this.applyFilters();\n this.IsLoading = false;\n } else {\n this.mjNotificationService.CreateSimpleNotification(\n `Error loading record changes for ${entityName} with primary key ${pkey.ToString()}.`,\n 'error',\n );\n this.IsLoading = false;\n }\n this.cdr.markForCheck();\n });\n }\n }\n\n // ─── Filter & Search ────────────────────────────────────────────\n\n OnSearchChange(): void {\n this.applyFilters();\n }\n\n /** @deprecated Use {@link OnSearchChange}. */\n onSearchChange(): void {\n return this.OnSearchChange();\n }\n\n onFilterChange(): void {\n this.applyFilters();\n }\n\n /**\n * Toggles the \"All\" pill — clears every conditional selection.\n */\n public SelectAllPill(): void {\n for (const k of Object.keys(this.ChipSelections)) this.ChipSelections[k] = false;\n this.applyFilters();\n }\n\n /**\n * Toggles a conditional pill on/off.\n */\n public TogglePill(key: string): void {\n this.ChipSelections[key] = !this.ChipSelections[key];\n this.applyFilters();\n }\n\n /**\n * Returns true when no conditional pills are selected (i.e. \"All\" mode).\n */\n public get IsAllSelected(): boolean {\n return !Object.values(this.ChipSelections).some(v => v);\n }\n\n /**\n * Whether any conditional pills are actually visible at all.\n */\n public get HasConditionalPills(): boolean {\n return this.ConditionalPills.length > 0;\n }\n\n /**\n * True when the conditional chips should collapse into an overflow popover\n * because there are more than the threshold.\n */\n public get UseOverflowPopover(): boolean {\n return this.ConditionalPills.length > this.OVERFLOW_THRESHOLD;\n }\n\n /** Number of currently selected conditional pills (for the popover trigger label). */\n public get SelectedConditionalCount(): number {\n return Object.values(this.ChipSelections).filter(v => v).length;\n }\n\n public ToggleFilterOverflow(): void {\n this.ShowFilterOverflow = !this.ShowFilterOverflow;\n this.cdr.markForCheck();\n }\n\n public CloseFilterOverflow(): void {\n this.ShowFilterOverflow = false;\n this.cdr.markForCheck();\n }\n\n public ClearFilters(): void {\n this.SearchTerm = '';\n this.SelectedBucketKey = null;\n this.ActiveBurstFilteredIDs = null;\n for (const k of Object.keys(this.ChipSelections)) this.ChipSelections[k] = false;\n this.applyFilters();\n }\n\n public ToggleLabelsTray(): void {\n this.ShowLabelsTray = !this.ShowLabelsTray;\n this.cdr.markForCheck();\n }\n\n public ToggleBucketFilter(bucketKey: string): void {\n const bucket = this.ActivityBuckets.find(b => b.Key === bucketKey);\n if (!bucket || bucket.TotalCount === 0) return;\n this.SelectedBucketKey = this.SelectedBucketKey === bucketKey ? null : bucketKey;\n this.ActiveBurstFilteredIDs = this.SelectedBucketKey ? new Set(bucket.ChangeIDs) : null;\n this.applyFilters();\n }\n\n public ClearBucketFilter(): void {\n if (!this.SelectedBucketKey && !this.ActiveBurstFilteredIDs) return;\n this.SelectedBucketKey = null;\n this.ActiveBurstFilteredIDs = null;\n this.applyFilters();\n }\n\n public OnBurstClustersRebuilt(event: MJAfterBurstClustersRebuildEventArgs<MJRecordChangeEntity>): void {\n this.ActivityChartGranularityLabel = event.GranularityLabel;\n this.ActivityBuckets = event.Clusters.map(c => {\n const updateCount = c.CategoryCounts['update'] ?? 0;\n const createCount = c.CategoryCounts['create'] ?? 0;\n const restoreCount = c.CategoryCounts['restore'] ?? 0;\n const otherCount = Math.max(0, c.TotalCount - updateCount - createCount - restoreCount);\n return {\n Key: c.Key,\n Label: c.Label,\n Subtitle: c.Subtitle,\n GapAfterLabel: c.GapAfterLabel,\n Pips: c.Pips.map(p => ({\n ID: p.ID,\n Type: (p.Category === 'create' || p.Category === 'restore' ? p.Category : 'update') as 'create' | 'update' | 'restore',\n Tooltip: p.Tooltip,\n })),\n OverflowPipCount: c.OverflowPipCount,\n Tooltip: c.Tooltip,\n StartTime: c.StartTime,\n EndTime: c.EndTime,\n TotalCount: c.TotalCount,\n UpdateCount: updateCount,\n CreateCount: createCount,\n RestoreCount: restoreCount,\n OtherCount: otherCount,\n HeightPercent: c.HeightPercent,\n UpdateSharePercent: c.CategoryShares.find(s => s.Key === 'update')?.SharePercent ?? 0,\n CreateSharePercent: c.CategoryShares.find(s => s.Key === 'create')?.SharePercent ?? 0,\n RestoreSharePercent: c.CategoryShares.find(s => s.Key === 'restore')?.SharePercent ?? 0,\n ChangeIDs: new Set(c.ItemIDs),\n };\n });\n }\n\n public OnBurstFilterChanged(event: MJBurstFilterChangedEventArgs<MJRecordChangeEntity>): void {\n this.SelectedBucketKey = event.ActiveCluster?.Key ?? null;\n this.ActiveBurstFilteredIDs = event.FilteredIDs ? new Set(event.FilteredIDs) : null;\n this.applyFilters();\n }\n\n public get SelectedBucketLabel(): string | null {\n if (!this.SelectedBucketKey) return null;\n return this.ActivityBuckets.find(b => b.Key === this.SelectedBucketKey)?.Label ?? null;\n }\n\n /**\n * Human-friendly display name for the current entity (uses `EntityInfo.DisplayNameOrName`,\n * stripping technical schema prefixes like `MJ_BizApps_Common: ` when falling back to `Name`).\n */\n public get EntityDisplayName(): string {\n const info = this.record?.EntityInfo as (typeof this.record.EntityInfo & { DisplayNameOrName?: string; DisplayName?: string }) | undefined;\n if (!info) return '';\n if (info.DisplayNameOrName && info.DisplayNameOrName.trim().length > 0) {\n return info.DisplayNameOrName.trim();\n }\n if (info.DisplayName && info.DisplayName.trim().length > 0) {\n return info.DisplayName.trim();\n }\n const rawName = info.Name || '';\n const colonIdx = rawName.indexOf(':');\n return colonIdx >= 0 ? rawName.slice(colonIdx + 1).trim() : rawName.trim();\n }\n\n /**\n * Icon class for the current entity, falling back to `fa-solid fa-layer-group`.\n */\n public get EntityIcon(): string {\n const icon = (this.record?.EntityInfo as { Icon?: string } | undefined)?.Icon;\n return icon && icon.trim().length > 0 ? icon.trim() : 'fa-solid fa-layer-group';\n }\n\n /**\n * Display name of the current record (e.g. 'Henry Grantham'), or null if unavailable.\n */\n public get RecordDisplayName(): string | null {\n const rec = this.record as (BaseEntity & {\n NameFieldValue?: unknown;\n Fields?: Array<{ Name: string; Value: unknown }>;\n }) | undefined;\n if (!rec) return null;\n const entityInfo = rec.EntityInfo as { NameField?: { Name?: string } } | undefined;\n const nameFieldName = entityInfo?.NameField?.Name;\n if (nameFieldName && Array.isArray(rec.Fields)) {\n const f = rec.Fields.find(item => item.Name === nameFieldName);\n if (f?.Value != null && String(f.Value).trim().length > 0) {\n return String(f.Value).trim();\n }\n }\n if (Array.isArray(rec.Fields)) {\n for (const candidate of ['DisplayName', 'Name', 'Title', 'FullName']) {\n const f = rec.Fields.find(item => item.Name.toLowerCase() === candidate.toLowerCase());\n if (f?.Value != null && String(f.Value).trim().length > 0) {\n return String(f.Value).trim();\n }\n }\n }\n return null;\n }\n\n /**\n * Up to 4 unique contributors for the compact avatar stack in the header.\n */\n public get TopContributors(): Array<{ Name: string; Initials: string }> {\n const seen = new Set<string>();\n const out: Array<{ Name: string; Initials: string }> = [];\n for (const c of this.ViewData) {\n const rawUser = (c.User || '').trim();\n if (!rawUser) continue;\n const key = rawUser.toLowerCase();\n if (seen.has(key)) continue;\n seen.add(key);\n out.push({\n Name: this.GetUserDisplayName(rawUser),\n Initials: this.GetUserInitials(rawUser),\n });\n if (out.length >= 4) break;\n }\n return out;\n }\n\n /**\n * Builds the list of conditional pills from currently loaded data —\n * a pill only appears for change types/sources that actually exist.\n */\n private rebuildConditionalPills(): void {\n const counts: Record<string, number> = {};\n let restoreCount = 0;\n\n for (const c of this.ViewData) {\n const type = c.Type ?? 'Update';\n counts[type] = (counts[type] ?? 0) + 1;\n if (this.isRestoreChange(c)) restoreCount++;\n }\n\n const pills: FilterPill[] = [];\n if ((counts['Update'] ?? 0) > 0) {\n pills.push({ Key: 'Update', Label: 'Updates', Icon: 'fa-pen', Count: counts['Update'], Variant: 'type' });\n }\n if ((counts['Create'] ?? 0) > 0) {\n pills.push({ Key: 'Create', Label: 'Creates', Icon: 'fa-plus', Count: counts['Create'], Variant: 'type' });\n }\n if ((counts['Delete'] ?? 0) > 0) {\n pills.push({ Key: 'Delete', Label: 'Deletes', Icon: 'fa-trash', Count: counts['Delete'], Variant: 'type' });\n }\n if ((counts['Snapshot'] ?? 0) > 0) {\n pills.push({ Key: 'Snapshot', Label: 'Snapshots', Icon: 'fa-camera', Count: counts['Snapshot'], Variant: 'type' });\n }\n if (restoreCount > 0) {\n pills.push({ Key: 'Restore', Label: 'Restored', Icon: 'fa-clock-rotate-left', Count: restoreCount, Variant: 'restore' });\n }\n\n // Initialize/prune selection state\n const validKeys = new Set(pills.map(p => p.Key));\n for (const k of Object.keys(this.ChipSelections)) {\n if (!validKeys.has(k)) delete this.ChipSelections[k];\n }\n for (const p of pills) {\n if (this.ChipSelections[p.Key] === undefined) this.ChipSelections[p.Key] = false;\n }\n\n this.ConditionalPills = pills;\n }\n\n private isRestoreChange(c: MJRecordChangeEntity): boolean {\n const withLineage = c as MJRecordChangeEntity & { RestoredFromID?: string | null };\n return c.Source === 'Restore' || withLineage.RestoredFromID != null;\n }\n\n /**\n * Builds the Burst-Aware Cluster Strip (Option A) with non-linear time-gap compression.\n * Instead of dividing wall-clock time into 12 fixed equal buckets (which leaves mostly empty\n * columns when a record has irregular bursts separated by weeks or months), changes are grouped\n * into active editing sessions separated by compact quiet-gap connectors (`⋯ 11 mos quiet ⋯`).\n */\n private rebuildActivityChart(): void {\n if (!this.ViewData || this.ViewData.length === 0) {\n this.BurstClusterItems = [];\n this.ActivityBuckets = [];\n this.ActivityChartGranularityLabel = '';\n this.SelectedBucketKey = null;\n this.ActiveBurstFilteredIDs = null;\n return;\n }\n\n const datedChanges = this.ViewData\n .map(c => ({ change: c, time: new Date(c.ChangedAt).getTime() }))\n .filter(item => Number.isFinite(item.time))\n .sort((a, b) => a.time - b.time);\n\n if (datedChanges.length === 0) {\n this.BurstClusterItems = [];\n this.ActivityBuckets = [];\n this.ActivityChartGranularityLabel = '';\n this.ActiveBurstFilteredIDs = null;\n return;\n }\n\n this.BurstClusterItems = datedChanges.map(({ change, time }) => {\n const normId = NormalizeUUID(change.ID);\n let category: 'create' | 'update' | 'restore' = 'update';\n if (this.isRestoreChange(change)) {\n category = 'restore';\n } else if (change.Type === 'Create') {\n category = 'create';\n }\n const userLabel = this.getUserDisplayName(change.User);\n const dateLabel = new Intl.DateTimeFormat('en-US', {\n month: 'short',\n day: 'numeric',\n hour: 'numeric',\n minute: '2-digit',\n }).format(new Date(time));\n return {\n ID: normId,\n Timestamp: time,\n Category: category,\n Tooltip: `${category === 'create' ? 'Created' : category === 'restore' ? 'Restored' : 'Updated'} by ${userLabel} · ${dateLabel}`,\n Data: change,\n };\n });\n\n const hourMs = 3600 * 1000;\n const sessionGapThresholdMs = this.BurstSessionGapHours * hourMs;\n const maxClusters = this.BurstMaxClusters;\n\n interface RawCluster {\n items: Array<{ change: MJRecordChangeEntity; time: number }>;\n startTime: number;\n endTime: number;\n }\n\n // 1. Group chronologically adjacent changes into initial session clusters (same calendar day or <= 6h apart)\n const clusters: RawCluster[] = [];\n for (const entry of datedChanges) {\n const prev = clusters[clusters.length - 1];\n if (!prev) {\n clusters.push({ items: [entry], startTime: entry.time, endTime: entry.time });\n continue;\n }\n const prevDate = new Date(prev.endTime);\n const currDate = new Date(entry.time);\n const sameDay =\n prevDate.getUTCFullYear() === currDate.getUTCFullYear() &&\n prevDate.getUTCMonth() === currDate.getUTCMonth() &&\n prevDate.getUTCDate() === currDate.getUTCDate();\n const withinSessionGap = (entry.time - prev.endTime) <= sessionGapThresholdMs;\n\n if (sameDay || withinSessionGap) {\n prev.items.push(entry);\n prev.endTime = entry.time;\n } else {\n clusters.push({ items: [entry], startTime: entry.time, endTime: entry.time });\n }\n }\n\n // 2. If more than maxClusters exist, iteratively merge the closest adjacent pair so the strip stays compact\n while (clusters.length > maxClusters) {\n let minGap = Infinity;\n let mergeIdx = 0;\n for (let i = 0; i < clusters.length - 1; i++) {\n const gap = clusters[i + 1].startTime - clusters[i].endTime;\n if (gap < minGap) {\n minGap = gap;\n mergeIdx = i;\n }\n }\n const left = clusters[mergeIdx];\n const right = clusters[mergeIdx + 1];\n clusters.splice(mergeIdx, 2, {\n items: [...left.items, ...right.items],\n startTime: left.startTime,\n endTime: right.endTime,\n });\n }\n\n const minTime = datedChanges[0].time;\n const maxTime = datedChanges[datedChanges.length - 1].time;\n const totalSpanMs = Math.max(0, maxTime - minTime);\n const maxCount = Math.max(1, ...clusters.map(c => c.items.length));\n\n const buckets: ActivityChartBucket[] = clusters.map((cluster, idx) => {\n let updateCount = 0;\n let createCount = 0;\n let restoreCount = 0;\n let otherCount = 0;\n const changeIds = new Set<string>();\n const pips: ActivityBurstPip[] = [];\n\n for (const { change, time } of cluster.items) {\n const normId = NormalizeUUID(change.ID);\n changeIds.add(normId);\n let pipType: 'create' | 'update' | 'restore' = 'update';\n if (this.isRestoreChange(change)) {\n restoreCount++;\n pipType = 'restore';\n } else if (change.Type === 'Create') {\n createCount++;\n pipType = 'create';\n } else if (change.Type === 'Update' || !change.Type) {\n updateCount++;\n pipType = 'update';\n } else {\n otherCount++;\n pipType = 'update';\n }\n\n if (pips.length < 12) {\n const userLabel = this.getUserDisplayName(change.User);\n const dateLabel = new Intl.DateTimeFormat('en-US', {\n month: 'short',\n day: 'numeric',\n hour: 'numeric',\n minute: '2-digit',\n }).format(new Date(time));\n pips.push({\n ID: normId,\n Type: pipType,\n Tooltip: `${pipType === 'create' ? 'Created' : pipType === 'restore' ? 'Restored' : 'Updated'} by ${userLabel} · ${dateLabel}`,\n });\n }\n }\n\n const totalCount = cluster.items.length;\n const label = this.formatBurstClusterLabel(cluster.startTime, cluster.endTime, maxTime, totalSpanMs);\n const subtitle = this.formatBurstSubtitle(totalCount, createCount, updateCount + otherCount, restoreCount);\n const nextCluster = idx < clusters.length - 1 ? clusters[idx + 1] : null;\n const gapAfterLabel = nextCluster\n ? this.formatQuietGapLabel(Math.max(0, nextCluster.startTime - cluster.endTime))\n : null;\n\n const updateShare = Math.round(((updateCount + otherCount) / totalCount) * 100);\n const createShare = Math.round((createCount / totalCount) * 100);\n const restoreShare = Math.max(0, 100 - updateShare - createShare);\n\n const parts: string[] = [];\n if (updateCount > 0) parts.push(`${updateCount} update${updateCount !== 1 ? 's' : ''}`);\n if (createCount > 0) parts.push(`${createCount} create`);\n if (restoreCount > 0) parts.push(`${restoreCount} restore${restoreCount !== 1 ? 's' : ''}`);\n if (otherCount > 0) parts.push(`${otherCount} other`);\n\n return {\n Key: `burst-${idx}-${cluster.startTime}`,\n Label: label,\n Subtitle: subtitle,\n GapAfterLabel: gapAfterLabel,\n Pips: pips,\n OverflowPipCount: Math.max(0, totalCount - pips.length),\n Tooltip: `${label} · ${totalCount} change${totalCount !== 1 ? 's' : ''} (${parts.join(', ')})`,\n StartTime: cluster.startTime,\n EndTime: cluster.endTime + 1,\n TotalCount: totalCount,\n UpdateCount: updateCount,\n CreateCount: createCount,\n RestoreCount: restoreCount,\n OtherCount: otherCount,\n HeightPercent: Math.max(22, Math.round((totalCount / maxCount) * 100)),\n UpdateSharePercent: updateShare,\n CreateSharePercent: createShare,\n RestoreSharePercent: restoreShare,\n ChangeIDs: changeIds,\n };\n });\n\n this.ActivityChartGranularityLabel =\n buckets.length === 1\n ? '1 active editing session'\n : `Editing sessions (${buckets.length} active bursts · quiet gaps compressed)`;\n this.ActivityBuckets = buckets;\n if (this.SelectedBucketKey && !buckets.some(b => b.Key === this.SelectedBucketKey)) {\n this.SelectedBucketKey = null;\n }\n }\n\n private formatBurstClusterLabel(startMs: number, endMs: number, maxTimeMs: number, totalSpanMs: number): string {\n const start = new Date(startMs);\n const end = new Date(endMs);\n const now = new Date();\n const dayMs = 24 * 3600 * 1000;\n const includeYear = start.getFullYear() !== new Date(maxTimeMs).getFullYear() || totalSpanMs > 240 * dayMs;\n\n const sameDay =\n start.getFullYear() === end.getFullYear() &&\n start.getMonth() === end.getMonth() &&\n start.getDate() === end.getDate();\n\n if (sameDay) {\n const isToday =\n start.getFullYear() === now.getFullYear() &&\n start.getMonth() === now.getMonth() &&\n start.getDate() === now.getDate();\n if (isToday) {\n return 'Today';\n }\n return new Intl.DateTimeFormat('en-US', includeYear\n ? { month: 'short', day: 'numeric', year: '2-digit' }\n : { month: 'short', day: 'numeric' }\n ).format(start);\n }\n\n if (start.getFullYear() === end.getFullYear() && start.getMonth() === end.getMonth()) {\n const monthStr = new Intl.DateTimeFormat('en-US', { month: 'short' }).format(start);\n const yrSuffix = includeYear ? ` '${String(start.getFullYear()).slice(-2)}` : '';\n return `${monthStr} ${start.getDate()}–${end.getDate()}${yrSuffix}`;\n }\n\n const fmt = new Intl.DateTimeFormat('en-US', includeYear\n ? { month: 'short', day: 'numeric', year: '2-digit' }\n : { month: 'short', day: 'numeric' }\n );\n return `${fmt.format(start)} – ${fmt.format(end)}`;\n }\n\n private formatBurstSubtitle(total: number, creates: number, updates: number, restores: number): string {\n if (creates > 0 && total === 1) {\n return 'Initial creation';\n }\n if (restores > 0 && updates > 0) {\n return `${restores} restore${restores !== 1 ? 's' : ''}, ${updates} edit${updates !== 1 ? 's' : ''}`;\n }\n if (restores > 0) {\n return `${restores} restore${restores !== 1 ? 's' : ''}`;\n }\n if (creates > 0 && updates > 0) {\n return `Created + ${updates} edit${updates !== 1 ? 's' : ''}`;\n }\n return `${total} edit${total !== 1 ? 's' : ''}`;\n }\n\n private formatQuietGapLabel(gapMs: number): string {\n const hourMs = 3600 * 1000;\n const dayMs = 24 * hourMs;\n const gapDays = gapMs / dayMs;\n if (gapDays >= 540) {\n const yrs = (gapDays / 365).toFixed(1).replace(/\\.0$/, '');\n return `${yrs} yrs quiet`;\n }\n if (gapDays >= 45) {\n return `${Math.round(gapDays / 30)} mos quiet`;\n }\n if (gapDays >= 1) {\n return `${Math.max(1, Math.round(gapDays))}d quiet`;\n }\n const gapHours = Math.max(1, Math.round(gapMs / hourMs));\n return `${gapHours}h quiet`;\n }\n\n private applyFilters(): void {\n let filtered = [...this.ViewData];\n\n if (this.ActiveBurstFilteredIDs && this.ActiveBurstFilteredIDs.size > 0) {\n filtered = filtered.filter(change => this.ActiveBurstFilteredIDs!.has(NormalizeUUID(change.ID)));\n } else if (this.SelectedBucketKey) {\n const activeBucket = this.ActivityBuckets.find(b => b.Key === this.SelectedBucketKey);\n if (activeBucket) {\n filtered = filtered.filter(change => activeBucket.ChangeIDs.has(NormalizeUUID(change.ID)));\n }\n }\n\n if (this.SearchTerm.trim()) {\n const search = this.SearchTerm.toLowerCase();\n filtered = filtered.filter(\n change =>\n change.ChangesDescription?.toLowerCase().includes(search) ||\n change.User?.toLowerCase().includes(search) ||\n change.Comments?.toLowerCase().includes(search),\n );\n }\n\n // Apply conditional pill filters — if any are selected, only show changes matching ANY of them (OR semantics).\n const selectedKeys = Object.keys(this.ChipSelections).filter(k => this.ChipSelections[k]);\n if (selectedKeys.length > 0) {\n filtered = filtered.filter(change => {\n for (const key of selectedKeys) {\n if (key === 'Restore') {\n if (this.isRestoreChange(change)) return true;\n } else {\n if (change.Type === key) return true;\n }\n }\n return false;\n });\n }\n\n this.FilteredData = filtered;\n this.DateGroups = this.buildDateGroups(this.FilteredData);\n this.cdr.markForCheck();\n }\n\n // ─── Version Labels ─────────────────────────────────────────────\n\n public async LoadRecordLabels(): Promise<void> {\n if (!this.record) return;\n\n this.IsLoadingLabels = true;\n this.cdr.markForCheck();\n\n try {\n const entityId = this.record.EntityInfo.ID;\n const recordId = this.record.PrimaryKey.ToConcatenatedString();\n\n const rv = RunView.FromMetadataProvider(this.ProviderToUse);\n const itemsResult = await rv.RunView<{ VersionLabelID: string }>({\n EntityName: 'MJ: Version Label Items',\n Fields: ['VersionLabelID'],\n ExtraFilter: `EntityID='${entityId}' AND RecordID='${recordId}'`,\n ResultType: 'simple',\n });\n\n if (!itemsResult.Success || itemsResult.Results.length === 0) {\n this.ngZone.run(() => {\n this.RecordLabels = [];\n this.IsLoadingLabels = false;\n this.cdr.markForCheck();\n });\n return;\n }\n\n const labelIds = [...new Set(itemsResult.Results.map(i => i.VersionLabelID))];\n const labelIdFilter = labelIds.map(id => `'${id}'`).join(',');\n\n const labelsResult = await rv.RunView<{\n ID: string;\n Name: string;\n Description: string | null;\n Scope: string;\n Status: string;\n ItemCount: number;\n __mj_CreatedAt: Date;\n }>({\n EntityName: 'MJ: Version Labels',\n Fields: ['ID', 'Name', 'Description', 'Scope', 'Status', 'ItemCount', '__mj_CreatedAt'],\n ExtraFilter: `ID IN (${labelIdFilter})`,\n OrderBy: '__mj_CreatedAt DESC',\n ResultType: 'simple',\n });\n\n if (labelsResult.Success) {\n this.RecordLabels = labelsResult.Results.map(l => ({\n ID: l.ID,\n Name: l.Name,\n Description: l.Description,\n Scope: l.Scope,\n Status: l.Status,\n CreatedAt: l.__mj_CreatedAt,\n ItemCount: l.ItemCount,\n }));\n }\n } catch (error) {\n console.error('Error loading version labels for record:', error);\n this.RecordLabels = [];\n } finally {\n this.ngZone.run(() => {\n this.IsLoadingLabels = false;\n this.cdr.markForCheck();\n });\n }\n }\n\n public OpenCreateWizard(): void {\n this.ShowCreateWizard = true;\n this.cdr.markForCheck();\n }\n\n public OnLabelCreated(event: { LabelCount: number; ItemCount: number }): void {\n this.ShowCreateWizard = false;\n this.cdr.markForCheck();\n this.LoadRecordLabels();\n this.mjNotificationService.CreateSimpleNotification(\n `Version label created with ${event.ItemCount} snapshot${event.ItemCount !== 1 ? 's' : ''}`,\n 'info',\n 2000,\n );\n }\n\n public OnLabelCreateCancelled(): void {\n this.ShowCreateWizard = false;\n this.cdr.markForCheck();\n }\n\n public GetLabelStatusClass(status: string): string {\n switch (status) {\n case 'Active': return 'label-status-active';\n case 'Archived': return 'label-status-archived';\n case 'Restored': return 'label-status-restored';\n default: return '';\n }\n }\n\n /** @deprecated Use {@link GetLabelStatusClass}. */\n public getLabelStatusClass(status: string): string {\n return this.GetLabelStatusClass(status);\n }\n\n // ─── Timeline Interaction ───────────────────────────────────────\n\n ToggleExpansion(changeId: string): void {\n if (this.ExpandedItems.has(changeId)) {\n this.ExpandedItems.delete(changeId);\n } else {\n this.ExpandedItems.add(changeId);\n }\n this.cdr.markForCheck();\n }\n\n /** @deprecated Use {@link ToggleExpansion}. */\n toggleExpansion(changeId: string): void {\n return this.ToggleExpansion(changeId);\n }\n\n OnTimelineItemKeydown(event: KeyboardEvent, changeId: string): void {\n if (event.key === 'Enter' || event.key === ' ') {\n event.preventDefault();\n this.ToggleExpansion(changeId);\n }\n }\n\n /** @deprecated Use {@link OnTimelineItemKeydown}. */\n onTimelineItemKeydown(event: KeyboardEvent, changeId: string): void {\n return this.OnTimelineItemKeydown(event, changeId);\n }\n\n /**\n * Opens the embedded restore preview panel for a given change record.\n * The panel computes a full-record diff (current vs the change's\n * FullRecordJSON snapshot) — this is the semantic-correctness fix:\n * we restore TO the state at that point in time, not just undo the\n * one delta the user clicked.\n */\n OnRestoreVersion(change: MJRecordChangeEntity, event: MouseEvent): void {\n event.stopPropagation();\n this.OpenRestoreForChange(change);\n }\n\n /**\n * Programmatically opens the restore confirmation panel for a specific\n * historical change (e.g., when triggered from the host form's Time-Travel\n * Preview banner).\n */\n public OpenRestoreForChange(change: MJRecordChangeEntity): void {\n this.RestorePreviewChange = change;\n this.RestorePreviewVisible = true;\n this.cdr.markForCheck();\n }\n\n /**\n * Returns true when `change` is the historical version currently being\n * previewed in the host form.\n */\n public IsChangePreviewedInForm(change: MJRecordChangeEntity): boolean {\n return this.PreviewedChangeID != null && UUIDsEqual(this.PreviewedChangeID, change.ID);\n }\n\n /**\n * Toggles in-form Time-Travel preview for the given historical change.\n */\n public OnToggleFormPreview(change: MJRecordChangeEntity, event: MouseEvent): void {\n event.stopPropagation();\n if (this.IsChangePreviewedInForm(change)) {\n this.PreviewedChangeID = null;\n this.PreviewVersionSelected.emit(null);\n } else {\n this.PreviewedChangeID = change.ID;\n this.PreviewVersionSelected.emit(change);\n }\n this.cdr.markForCheck();\n }\n\n /**\n * Returns all loaded changes that carry a `FullRecordJSON` snapshot and can\n * be previewed in the form, ordered newest-first.\n */\n public GetPreviewableChanges(): MJRecordChangeEntity[] {\n return this.ViewData.filter(c => c.Type !== 'Delete' && !!c.FullRecordJSON);\n }\n\n /**\n * Toggles Cross-Version Diff Comparison (`vA ↔ vB`) mode.\n * When entering Compare Mode with no versions selected, defaults `vB` to the\n * latest version and `vA` to the immediately preceding snapshot (or live state).\n */\n public ToggleCompareMode(): void {\n this.CompareMode = !this.CompareMode;\n if (this.CompareMode && !this.CompareBaseChangeID && !this.CompareTargetChangeID) {\n const previewable = this.GetPreviewableChanges();\n if (previewable.length >= 2) {\n this.CompareTargetChangeID = previewable[0].ID;\n this.CompareBaseChangeID = previewable[1].ID;\n } else if (previewable.length === 1) {\n this.CompareBaseChangeID = previewable[0].ID;\n this.CompareTargetChangeID = '__CURRENT__';\n }\n }\n this.cdr.markForCheck();\n }\n\n /**\n * Assigns a historical change ID (or `'__CURRENT__'`) to either the `base` (`vA`)\n * or `target` (`vB`) comparison slot.\n */\n public SelectForComparison(slot: 'base' | 'target', changeId: string | null, event?: Event): void {\n event?.stopPropagation();\n if (slot === 'base') {\n this.CompareBaseChangeID = changeId;\n } else {\n this.CompareTargetChangeID = changeId;\n }\n if (!this.CompareMode) {\n this.CompareMode = true;\n }\n this.cdr.markForCheck();\n }\n\n /**\n * Handles `<select>` change events for the `vA` and `vB` version selectors.\n */\n public OnComparisonSelectChange(slot: 'base' | 'target', event: Event): void {\n const selectEl = event.target as HTMLSelectElement | null;\n if (!selectEl) return;\n this.SelectForComparison(slot, selectEl.value || null);\n }\n\n /**\n * Swaps the selected `vA` (base) and `vB` (target) comparison versions.\n */\n public SwapComparisonVersions(): void {\n const prevBase = this.CompareBaseChangeID;\n this.CompareBaseChangeID = this.CompareTargetChangeID;\n this.CompareTargetChangeID = prevBase;\n this.cdr.markForCheck();\n }\n\n public IsChangeSelectedAsCompareBase(change: MJRecordChangeEntity): boolean {\n return (\n this.CompareBaseChangeID != null &&\n this.CompareBaseChangeID !== '__CURRENT__' &&\n UUIDsEqual(this.CompareBaseChangeID, change.ID)\n );\n }\n\n public IsChangeSelectedAsCompareTarget(change: MJRecordChangeEntity): boolean {\n return (\n this.CompareTargetChangeID != null &&\n this.CompareTargetChangeID !== '__CURRENT__' &&\n UUIDsEqual(this.CompareTargetChangeID, change.ID)\n );\n }\n\n public get CompareBaseChange(): MJRecordChangeEntity | null {\n if (!this.CompareBaseChangeID || this.CompareBaseChangeID === '__CURRENT__') {\n return null;\n }\n return this.viewDataById.get(NormalizeUUID(this.CompareBaseChangeID)) ?? null;\n }\n\n public get CompareTargetChange(): MJRecordChangeEntity | null {\n if (!this.CompareTargetChangeID || this.CompareTargetChangeID === '__CURRENT__') {\n return null;\n }\n return this.viewDataById.get(NormalizeUUID(this.CompareTargetChangeID)) ?? null;\n }\n\n public GetComparisonSlotLabel(slot: 'base' | 'target'): string {\n const id = slot === 'base' ? this.CompareBaseChangeID : this.CompareTargetChangeID;\n if (!id) return 'Select version…';\n if (id === '__CURRENT__') return 'Current Live Record';\n const change = this.viewDataById.get(NormalizeUUID(id));\n if (!change) return 'Selected version';\n return `${this.FormatRelativeTime(change.ChangedAt)} (${this.GetUserDisplayName(change.User)})`;\n }\n\n private extractSnapshotObject(changeId: string | null): Record<string, unknown> | null {\n if (!changeId) return null;\n if (changeId === '__CURRENT__') {\n const rec = this.record as (BaseEntity & {\n GetAll?: () => Record<string, unknown>;\n Fields?: Array<{ Name: string; Value: unknown }>;\n }) | undefined;\n if (!rec) return null;\n if (typeof rec.GetAll === 'function') {\n return rec.GetAll();\n }\n if (Array.isArray(rec.Fields)) {\n const snapshot: Record<string, unknown> = {};\n for (const f of rec.Fields) {\n snapshot[f.Name] = f.Value;\n }\n return snapshot;\n }\n return null;\n }\n const change = this.viewDataById.get(NormalizeUUID(changeId));\n if (!change?.FullRecordJSON) return null;\n try {\n return JSON.parse(change.FullRecordJSON) as Record<string, unknown>;\n } catch {\n return null;\n }\n }\n\n /**\n * Computes the field-by-field diff between the selected `vA` (`CompareBaseChangeID`)\n * and `vB` (`CompareTargetChangeID`) snapshots.\n */\n public GetComparisonDiffs(): FieldChangeInfo[] {\n const baseSnap = this.extractSnapshotObject(this.CompareBaseChangeID);\n const targetSnap = this.extractSnapshotObject(this.CompareTargetChangeID);\n if (!baseSnap || !targetSnap) {\n return [];\n }\n\n const entityFields = this.record?.EntityInfo?.Fields ?? [];\n const candidateNames = new Set<string>();\n for (const f of entityFields) {\n if (!f.IsPrimaryKey && !f.Name.startsWith('__mj_')) {\n candidateNames.add(f.Name);\n }\n }\n for (const key of Object.keys(baseSnap)) {\n if (!key.startsWith('__mj_') && key.toLowerCase() !== 'id') {\n candidateNames.add(key);\n }\n }\n for (const key of Object.keys(targetSnap)) {\n if (!key.startsWith('__mj_') && key.toLowerCase() !== 'id') {\n candidateNames.add(key);\n }\n }\n\n const diffs: FieldChangeInfo[] = [];\n for (const fieldName of candidateNames) {\n const fieldInfo = entityFields.find(\n (f: EntityFieldInfo) => f.Name.trim().toLowerCase() === fieldName.trim().toLowerCase(),\n );\n if (fieldInfo?.IsPrimaryKey || fieldName.startsWith('__mj_')) {\n continue;\n }\n const oldVal = baseSnap[fieldName];\n const newVal = targetSnap[fieldName];\n const formattedOld = FormatChangeValue(oldVal, fieldInfo);\n const formattedNew = FormatChangeValue(newVal, fieldInfo);\n if (formattedOld === formattedNew) {\n continue;\n }\n diffs.push(\n this.buildFieldChangeInfo({\n field: fieldInfo?.Name || fieldName,\n oldValue: oldVal,\n newValue: newVal,\n }),\n );\n }\n return diffs;\n }\n\n /**\n * Called when the user confirms the restore in the embedded panel.\n * Translates the panel's RestoreCommitEvent into the broader-shape\n * RestoreVersionEvent the host is wired to handle.\n */\n OnRestorePanelConfirmed(commit: RestoreCommitEvent): void {\n if (!this.RestorePreviewChange) return;\n\n const change = this.RestorePreviewChange;\n this.IsRestoring = true;\n this.cdr.markForCheck();\n\n this.RestoreRequested.emit({\n SourceChangeID: commit.SourceChangeID,\n ChangedAt: change.ChangedAt,\n ChangedByUser: change.User || '',\n Reason: commit.Reason,\n FieldValues: commit.FieldValues,\n });\n\n // Close the panel after a brief delay so the host has a moment to react.\n setTimeout(() => {\n this.RestorePreviewVisible = false;\n this.RestorePreviewChange = null;\n this.IsRestoring = false;\n this.cdr.markForCheck();\n }, 500);\n }\n\n /**\n * Called when the user dismisses the restore preview without confirming.\n */\n OnRestorePanelCancelled(): void {\n this.RestorePreviewVisible = false;\n this.RestorePreviewChange = null;\n this.cdr.markForCheck();\n }\n\n // ─── Lineage chip ───────────────────────────────────────────────\n\n /**\n * Returns the source change for a given restored row, if found in the\n * currently loaded changes. Returns null when the source isn't loaded\n * (e.g., it's been pruned from history) or when this row isn't a restore.\n */\n public GetRestoredFromSourceChange(change: MJRecordChangeEntity): MJRecordChangeEntity | null {\n const withLineage = change as MJRecordChangeEntity & { RestoredFromID?: string | null };\n const sourceId = withLineage.RestoredFromID;\n if (!sourceId) return null;\n return this.viewDataById.get(NormalizeUUID(sourceId)) ?? null;\n }\n\n /** @deprecated Use {@link GetRestoredFromSourceChange}. */\n public getRestoredFromSourceChange(change: MJRecordChangeEntity): MJRecordChangeEntity | null {\n return this.GetRestoredFromSourceChange(change);\n }\n\n /**\n * Rebuilds {@link viewDataById} from the current {@link viewData}. Called once\n * per data load so source-change resolution is an O(1) Map read.\n */\n private rebuildViewDataIndex(): void {\n this.viewDataById.clear();\n for (const c of this.ViewData) {\n this.viewDataById.set(NormalizeUUID(c.ID), c);\n }\n }\n\n /**\n * True when the row was produced by a restore operation (either the\n * `Source` is `'Restore'` OR `RestoredFromID` is populated).\n */\n public IsRestoreRow(change: MJRecordChangeEntity): boolean {\n return this.isRestoreChange(change);\n }\n\n /** @deprecated Use {@link IsRestoreRow}. */\n public isRestoreRow(change: MJRecordChangeEntity): boolean {\n return this.IsRestoreRow(change);\n }\n\n /**\n * True when this change is the most recent in the loaded history.\n * `viewData` is sorted DESC by `ChangedAt`, so the most recent is index 0.\n * Restoring to the most recent version is a no-op, so the timeline hides\n * the Restore button on this row.\n */\n public IsMostRecentChange(change: MJRecordChangeEntity): boolean {\n return this.ViewData.length > 0 && this.ViewData[0] === change;\n }\n\n /** @deprecated Use {@link IsMostRecentChange}. */\n public isMostRecentChange(change: MJRecordChangeEntity): boolean {\n return this.IsMostRecentChange(change);\n }\n\n /**\n * Click handler for the lineage chip — scrolls/highlights the source\n * change row in the timeline. Auto-clears after a few seconds.\n */\n public JumpToSourceChange(sourceChange: MJRecordChangeEntity, event: MouseEvent): void {\n event.stopPropagation();\n this.HighlightedChangeID = sourceChange.ID;\n this.ExpandedItems.add(sourceChange.ID);\n this.cdr.markForCheck();\n\n // Auto-clear the highlight after 3s\n setTimeout(() => {\n if (this.HighlightedChangeID && UUIDsEqual(this.HighlightedChangeID, sourceChange.ID)) {\n this.HighlightedChangeID = null;\n this.cdr.markForCheck();\n }\n }, 3000);\n\n // Scroll into view\n setTimeout(() => {\n const el = document.querySelector(`[data-change-id=\"${sourceChange.ID}\"]`);\n el?.scrollIntoView({ behavior: 'smooth', block: 'center' });\n }, 50);\n }\n\n // ─── Date Grouping ─────────────────────────────────────────────\n\n private buildDateGroups(changes: MJRecordChangeEntity[]): DateGroup[] {\n const groups = new Map<string, MJRecordChangeEntity[]>();\n\n for (const change of changes) {\n const label = this.formatDateGroupLabel(new Date(change.ChangedAt));\n if (!groups.has(label)) {\n groups.set(label, []);\n }\n groups.get(label)!.push(change);\n }\n\n return Array.from(groups.entries()).map(([label, items]) => ({ label, changes: items }));\n }\n\n private formatDateGroupLabel(date: Date): string {\n const now = new Date();\n const today = new Date(now.getFullYear(), now.getMonth(), now.getDate());\n const target = new Date(date.getFullYear(), date.getMonth(), date.getDate());\n const diffDays = Math.floor((today.getTime() - target.getTime()) / 86400000);\n\n const formatted = new Intl.DateTimeFormat('en-US', { month: 'short', day: 'numeric', year: 'numeric' }).format(date);\n\n if (diffDays === 0) return `Today \\u2014 ${formatted}`;\n if (diffDays === 1) return `Yesterday \\u2014 ${formatted}`;\n return formatted;\n }\n\n // ─── Display Helpers ────────────────────────────────────────────\n\n GetChangeTypeCardClass(type: string): string {\n switch (type) {\n case 'Create': return 'type-create';\n case 'Update': return 'type-update';\n case 'Delete': return 'type-delete';\n case 'Snapshot': return 'type-snapshot';\n default: return 'type-update';\n }\n }\n\n /** @deprecated Use {@link GetChangeTypeCardClass}. */\n getChangeTypeCardClass(type: string): string {\n return this.GetChangeTypeCardClass(type);\n }\n\n GetChangeTypeBadgeText(type: string): string {\n switch (type) {\n case 'Create': return 'Created';\n case 'Delete': return 'Deleted';\n case 'Snapshot': return 'Snapshot';\n default: return type;\n }\n }\n\n /** @deprecated Use {@link GetChangeTypeBadgeText}. */\n getChangeTypeBadgeText(type: string): string {\n return this.GetChangeTypeBadgeText(type);\n }\n\n /**\n * Badge text for the row's primary type tag. For restore rows we override\n * the underlying `Type='Update'` and show \"Restore\" instead — matches the\n * mockup's intent of treating restore as a first-class operation in the\n * timeline rather than a flavor of update.\n */\n GetEffectiveBadgeText(change: MJRecordChangeEntity): string {\n if (this.IsRestoreRow(change)) return 'Restore';\n return this.GetChangeTypeBadgeText(change.Type);\n }\n\n /** @deprecated Use {@link GetEffectiveBadgeText}. */\n getEffectiveBadgeText(change: MJRecordChangeEntity): string {\n return this.GetEffectiveBadgeText(change);\n }\n\n /**\n * Optional restore reason — pulled from the dynamic `RestoreReason`\n * column added by the lineage migration. Returns null when not present\n * or not a restore row.\n */\n GetRestoreReason(change: MJRecordChangeEntity): string | null {\n if (!this.IsRestoreRow(change)) return null;\n const reason = (change as unknown as { RestoreReason?: string | null }).RestoreReason;\n return reason && reason.trim().length > 0 ? reason : null;\n }\n\n /** @deprecated Use {@link GetRestoreReason}. */\n getRestoreReason(change: MJRecordChangeEntity): string | null {\n return this.GetRestoreReason(change);\n }\n\n GetSourceClass(source: string): string {\n if (source === 'Restore') return 'source-restore';\n if (source === 'Internal') return 'source-internal';\n return 'source-external';\n }\n\n /** @deprecated Use {@link GetSourceClass}. */\n getSourceClass(source: string): string {\n return this.GetSourceClass(source);\n }\n\n GetStatusClass(status: string): string {\n switch (status) {\n case 'Complete': return 'status-complete';\n case 'Pending': return 'status-pending';\n case 'Error': return 'status-error';\n default: return 'status-unknown';\n }\n }\n\n /** @deprecated Use {@link GetStatusClass}. */\n getStatusClass(status: string): string {\n return this.GetStatusClass(status);\n }\n\n GetTimelineItemLabel(change: MJRecordChangeEntity): string {\n return `${change.Type} by ${change.User || 'Unknown User'} on ${this.FormatFullDateTime(change.ChangedAt)}`;\n }\n\n /** @deprecated Use {@link GetTimelineItemLabel}. */\n getTimelineItemLabel(change: MJRecordChangeEntity): string {\n return this.GetTimelineItemLabel(change);\n }\n\n GetUserInitials(user: string | null): string {\n if (!user) return '?';\n if (user.includes('@')) {\n const local = user.split('@')[0];\n return local.substring(0, 2).toUpperCase();\n }\n const parts = user.trim().split(/\\s+/);\n if (parts.length >= 2) {\n return (parts[0][0] + parts[1][0]).toUpperCase();\n }\n return user.substring(0, 2).toUpperCase();\n }\n\n /** @deprecated Use {@link GetUserInitials}. */\n getUserInitials(user: string | null): string {\n return this.GetUserInitials(user);\n }\n\n GetUserDisplayName(user: string | null): string {\n if (!user) return 'Unknown';\n if (user.includes('@')) return user.split('@')[0];\n return user;\n }\n\n /** @deprecated Use {@link GetUserDisplayName}. */\n getUserDisplayName(user: string | null): string {\n return this.GetUserDisplayName(user);\n }\n\n GetUniqueContributorCount(): number {\n const users = new Set(this.ViewData.map(c => c.User).filter(Boolean));\n return users.size;\n }\n\n /** @deprecated Use {@link GetUniqueContributorCount}. */\n getUniqueContributorCount(): number {\n return this.GetUniqueContributorCount();\n }\n\n FormatTime(date: Date): string {\n return new Intl.DateTimeFormat('en-US', {\n hour: 'numeric',\n minute: '2-digit',\n hour12: true,\n }).format(new Date(date));\n }\n\n /** @deprecated Use {@link FormatTime}. */\n formatTime(date: Date): string {\n return this.FormatTime(date);\n }\n\n FormatRelativeTime(date: Date): string {\n const now = new Date();\n const diffMs = now.getTime() - new Date(date).getTime();\n const diffMins = Math.floor(diffMs / 60000);\n const diffHours = Math.floor(diffMins / 60);\n const diffDays = Math.floor(diffHours / 24);\n\n if (diffMins < 1) return 'Just now';\n if (diffMins < 60) return `${diffMins} min${diffMins > 1 ? 's' : ''} ago`;\n if (diffHours < 24) return `${diffHours} hour${diffHours > 1 ? 's' : ''} ago`;\n if (diffDays < 7) return `${diffDays} day${diffDays > 1 ? 's' : ''} ago`;\n\n return new Intl.DateTimeFormat('en-US', {\n month: 'short',\n day: 'numeric',\n year: diffDays > 365 ? 'numeric' : undefined,\n }).format(new Date(date));\n }\n\n /** @deprecated Use {@link FormatRelativeTime}. */\n formatRelativeTime(date: Date): string {\n return this.FormatRelativeTime(date);\n }\n\n FormatFullDateTime(date: Date): string {\n return new Intl.DateTimeFormat('en-US', {\n year: 'numeric',\n month: 'long',\n day: 'numeric',\n hour: 'numeric',\n minute: 'numeric',\n hour12: true,\n timeZoneName: 'short',\n }).format(new Date(date));\n }\n\n /** @deprecated Use {@link FormatFullDateTime}. */\n formatFullDateTime(date: Date): string {\n return this.FormatFullDateTime(date);\n }\n\n // ─── Change Summary ─────────────────────────────────────────────\n\n GetChangeSummary(change: MJRecordChangeEntity): string {\n // Restore rows get a distinctive summary so the timeline reads like a\n // sentence — \"Restored to 5:56 PM version\" rather than yet another\n // \"Name and Description changed\". The lineage chip carries the full\n // source-version detail.\n if (this.IsRestoreRow(change)) {\n const src = this.GetRestoredFromSourceChange(change);\n if (src) return `Restored to ${this.FormatTime(src.ChangedAt)} version`;\n return 'Restored from earlier version';\n }\n if (change.Type === 'Create') return 'Record created';\n if (change.Type === 'Delete') return 'Record deleted';\n if (change.Type === 'Snapshot') return change.ChangesDescription || 'Snapshot captured';\n\n try {\n const changesJson = JSON.parse(change.ChangesJSON || '{}');\n const fieldNames = this.extractFieldDisplayNames(changesJson);\n if (fieldNames.length === 0) return 'No field changes detected';\n\n return this.buildFieldListSummary(fieldNames);\n } catch {\n return change.ChangesDescription || 'Changes made';\n }\n }\n\n /** @deprecated Use {@link GetChangeSummary}. */\n getChangeSummary(change: MJRecordChangeEntity): string {\n return this.GetChangeSummary(change);\n }\n\n GetCreatedFieldCount(change: MJRecordChangeEntity): number {\n try {\n if (!change.FullRecordJSON) return 0;\n const record = JSON.parse(change.FullRecordJSON);\n return this.record.EntityInfo.Fields.filter(\n (f: EntityFieldInfo) => record[f.Name] != null && record[f.Name] !== '',\n ).length;\n } catch {\n return 0;\n }\n }\n\n /** @deprecated Use {@link GetCreatedFieldCount}. */\n getCreatedFieldCount(change: MJRecordChangeEntity): number {\n return this.GetCreatedFieldCount(change);\n }\n\n private extractFieldDisplayNames(changesJson: Record<string, { field?: string }>): string[] {\n return Object.keys(changesJson).map(fieldKey => {\n const changeInfo = changesJson[fieldKey];\n const field = this.record.EntityInfo.Fields.find(\n (f: EntityFieldInfo) => f.Name.trim().toLowerCase() === changeInfo.field?.trim().toLowerCase(),\n );\n return field?.DisplayNameOrName || changeInfo.field || fieldKey;\n });\n }\n\n private buildFieldListSummary(fieldNames: string[]): string {\n if (fieldNames.length === 1) return `${fieldNames[0]} changed`;\n if (fieldNames.length === 2) return `${fieldNames[0]} and ${fieldNames[1]} changed`;\n if (fieldNames.length <= 4) {\n const last = fieldNames[fieldNames.length - 1];\n return `${fieldNames.slice(0, -1).join(', ')}, and ${last} changed`;\n }\n const remaining = fieldNames.length - 3;\n return `${fieldNames.slice(0, 3).join(', ')}, and ${remaining} other field${remaining > 1 ? 's' : ''} changed`;\n }\n\n // ─── Field Changes (type-aware) ────────────────────────────────\n\n GetFieldChanges(change: MJRecordChangeEntity): FieldChangeInfo[] {\n try {\n const changesJson = JSON.parse(change.ChangesJSON || '{}');\n return Object.keys(changesJson).map(fieldKey => this.buildFieldChangeInfo(changesJson[fieldKey]));\n } catch {\n return [];\n }\n }\n\n /** @deprecated Use {@link GetFieldChanges}. */\n getFieldChanges(change: MJRecordChangeEntity): FieldChangeInfo[] {\n return this.GetFieldChanges(change);\n }\n\n private buildFieldChangeInfo(changeInfo: { field?: string; oldValue?: unknown; newValue?: unknown }): FieldChangeInfo {\n const field = this.record.EntityInfo.Fields.find(\n (f: EntityFieldInfo) => f.Name.trim().toLowerCase() === changeInfo.field?.trim().toLowerCase(),\n );\n\n const fieldType = this.classifyFieldType(field);\n const formattedOld = FormatChangeValue(changeInfo.oldValue, field);\n const formattedNew = FormatChangeValue(changeInfo.newValue, field);\n\n let diffHtml: SafeHtml | undefined;\n if (fieldType === 'text' && formattedOld !== formattedNew) {\n diffHtml = this.generateDiffHtml(formattedOld, formattedNew);\n }\n\n return {\n field: changeInfo.field || '',\n displayName: field?.DisplayNameOrName || changeInfo.field || '',\n oldValue: formattedOld,\n newValue: formattedNew,\n fieldType,\n diffHtml,\n };\n }\n\n private classifyFieldType(field: EntityFieldInfo | undefined): 'boolean' | 'date' | 'number' | 'text' {\n if (!field) return 'text';\n if (field.TSType === EntityFieldTSType.Boolean) return 'boolean';\n if (field.TSType === EntityFieldTSType.Date) return 'date';\n if (field.TSType === EntityFieldTSType.Number) return 'number';\n return 'text';\n }\n\n GetCreatedFields(change: MJRecordChangeEntity): Array<{ name: string; displayName: string; value: string }> {\n try {\n if (!change.FullRecordJSON) return [];\n\n const record = JSON.parse(change.FullRecordJSON);\n const fields = this.record.EntityInfo.Fields;\n\n return fields\n .filter((field: EntityFieldInfo) => record[field.Name] != null && record[field.Name] !== '')\n .map((field: EntityFieldInfo) => ({\n name: field.Name,\n displayName: field.DisplayNameOrName,\n value: FormatChangeValue(record[field.Name], field),\n }));\n } catch {\n return [];\n }\n }\n\n /** @deprecated Use {@link GetCreatedFields}. */\n getCreatedFields(change: MJRecordChangeEntity): Array<{ name: string; displayName: string; value: string }> {\n return this.GetCreatedFields(change);\n }\n\n // ─── Value Formatting ───────────────────────────────────────────\n\n // ─── Diff Generation (text fields only) ─────────────────────────\n\n private generateDiffHtml(oldValue: string, newValue: string): SafeHtml {\n if (!oldValue && !newValue) {\n return this.sanitizer.bypassSecurityTrustHtml('<span class=\"rc-diff-unchanged\">(no change)</span>');\n }\n\n if (!oldValue) {\n return this.sanitizer.bypassSecurityTrustHtml(`<span class=\"rc-diff-added\">${this.escapeHtml(newValue)}</span>`);\n }\n\n if (!newValue) {\n return this.sanitizer.bypassSecurityTrustHtml(`<span class=\"rc-diff-removed\">${this.escapeHtml(oldValue)}</span>`);\n }\n\n const useWordDiff = this.shouldUseWordDiff(oldValue, newValue);\n const diffs = useWordDiff ? diffWords(oldValue, newValue) : diffChars(oldValue, newValue);\n\n const html = diffs\n .map((part: Change) => {\n const escaped = this.escapeHtml(part.value);\n if (part.added) return `<span class=\"rc-diff-added\">${escaped}</span>`;\n if (part.removed) return `<span class=\"rc-diff-removed\">${escaped}</span>`;\n return `<span class=\"rc-diff-unchanged\">${escaped}</span>`;\n })\n .join('');\n\n return this.sanitizer.bypassSecurityTrustHtml(html);\n }\n\n private shouldUseWordDiff(oldValue: string, newValue: string): boolean {\n const hasMultipleWords = (text: string) => text.includes(' ') && text.split(' ').length > 3;\n const isLongText = (text: string) => text.length > 50;\n\n return (hasMultipleWords(oldValue) || hasMultipleWords(newValue)) && (isLongText(oldValue) || isLongText(newValue));\n }\n\n private escapeHtml(text: string): string {\n const div = document.createElement('div');\n div.textContent = text;\n return div.innerHTML;\n }\n}\n","<mj-slide-panel\n [Mode]=\"'slide'\"\n [Title]=\"'Record Changes History'\"\n [Visible]=\"IsVisible\"\n [Resizable]=\"true\"\n [MinWidthPx]=\"400\"\n [MaxWidthRatio]=\"0.6\"\n (Closed)=\"OnClose()\">\n\n @if (IsLoading) {\n <mj-loading text=\"Loading history...\" size=\"medium\"></mj-loading>\n }\n\n @if (!IsLoading) {\n <div class=\"rc-container\">\n <!-- Compact Context Header (Entity Display Name + Record Name + Stats + Compact Version Labels Action) -->\n <div class=\"rc-page-header\">\n <div class=\"rc-header-main\">\n <div class=\"rc-header-title-row\">\n <span class=\"rc-entity-badge rc-page-subtitle\">\n <i [class]=\"EntityIcon\" aria-hidden=\"true\"></i>\n {{ EntityDisplayName }}\n </span>\n <h2 class=\"rc-page-title\">{{ RecordDisplayName || 'Change History' }}</h2>\n </div>\n @if (viewData.length > 0) {\n <div class=\"rc-header-stats-row\">\n <span class=\"rc-change-count\">\n {{ viewData.length }} change{{ viewData.length !== 1 ? 's' : '' }} &middot;\n {{ getUniqueContributorCount() }} contributor{{ getUniqueContributorCount() !== 1 ? 's' : '' }}\n </span>\n @if (TopContributors.length > 0) {\n <div class=\"rc-contributor-stack\" aria-label=\"Contributors\">\n @for (contributor of TopContributors; track contributor.Name) {\n <span class=\"rc-contributor-avatar\" [attr.aria-label]=\"contributor.Name\" [title]=\"contributor.Name\">\n {{ contributor.Initials }}\n </span>\n }\n </div>\n }\n <span class=\"rc-latest-time\">&middot; Latest {{ formatRelativeTime(viewData[0].ChangedAt) }}</span>\n </div>\n }\n </div>\n\n <div class=\"rc-header-actions\">\n @if (GetPreviewableChanges().length > 0) {\n <button\n type=\"button\"\n class=\"rc-compare-toggle-btn\"\n [class.active]=\"CompareMode\"\n (click)=\"ToggleCompareMode()\"\n [attr.aria-pressed]=\"CompareMode\"\n aria-label=\"Compare any two versions\">\n <i class=\"fa-solid fa-code-compare\" aria-hidden=\"true\"></i>\n <span>Compare</span>\n </button>\n }\n @if (RecordLabels.length > 0) {\n <button\n type=\"button\"\n class=\"rc-labels-toggle-btn\"\n [class.active]=\"ShowLabelsTray\"\n (click)=\"ToggleLabelsTray()\"\n [attr.aria-expanded]=\"ShowLabelsTray\">\n <i class=\"fa-solid fa-tags\" aria-hidden=\"true\"></i>\n <span>{{ RecordLabels.length }} Label{{ RecordLabels.length !== 1 ? 's' : '' }}</span>\n <i class=\"fa-solid\" [class.fa-chevron-up]=\"ShowLabelsTray\" [class.fa-chevron-down]=\"!ShowLabelsTray\" aria-hidden=\"true\"></i>\n </button>\n }\n <button\n type=\"button\"\n class=\"rc-create-label-btn\"\n (click)=\"OpenCreateWizard()\"\n title=\"Create a version label snapshot for this record\">\n <i class=\"fa-solid fa-tag\" aria-hidden=\"true\"></i>\n <span>+ Label</span>\n </button>\n </div>\n </div>\n\n <!-- Cross-Version Diff Comparison Workbench (vA <-> vB) -->\n @if (CompareMode) {\n <div class=\"rc-compare-panel\" role=\"region\" aria-label=\"Cross-version diff comparison\">\n <div class=\"rc-compare-toolbar\">\n <div class=\"rc-compare-slot\">\n <span class=\"rc-compare-badge rc-compare-badge--base\">vA · Base</span>\n <select\n class=\"rc-compare-select\"\n aria-label=\"Base version vA\"\n [value]=\"CompareBaseChangeID ?? ''\"\n (change)=\"OnComparisonSelectChange('base', $event)\">\n <option value=\"__CURRENT__\" [selected]=\"CompareBaseChangeID === '__CURRENT__'\">Current Live Record</option>\n @for (ver of GetPreviewableChanges(); track ver.ID) {\n <option [value]=\"ver.ID\" [selected]=\"IsChangeSelectedAsCompareBase(ver)\">\n {{ formatFullDateTime(ver.ChangedAt) }} — {{ getUserDisplayName(ver.User) }}\n </option>\n }\n </select>\n @if (CompareBaseChange; as baseChange) {\n <button\n type=\"button\"\n class=\"rc-compare-action-btn\"\n [class.active]=\"IsChangePreviewedInForm(baseChange)\"\n (click)=\"OnToggleFormPreview(baseChange, $event)\"\n aria-label=\"Preview base version in form\">\n <i class=\"fa-solid fa-eye\" aria-hidden=\"true\"></i>\n </button>\n @if (AllowRestore) {\n <button\n type=\"button\"\n class=\"rc-compare-action-btn\"\n (click)=\"OnRestoreVersion(baseChange, $event)\"\n aria-label=\"Restore base version\">\n <i class=\"fa-solid fa-clock-rotate-left\" aria-hidden=\"true\"></i>\n </button>\n }\n }\n </div>\n\n <button\n type=\"button\"\n class=\"rc-compare-swap-btn\"\n (click)=\"SwapComparisonVersions()\"\n aria-label=\"Swap comparison versions\">\n <i class=\"fa-solid fa-right-left\" aria-hidden=\"true\"></i>\n </button>\n\n <div class=\"rc-compare-slot\">\n <span class=\"rc-compare-badge rc-compare-badge--target\">vB · Target</span>\n <select\n class=\"rc-compare-select\"\n aria-label=\"Target version vB\"\n [value]=\"CompareTargetChangeID ?? ''\"\n (change)=\"OnComparisonSelectChange('target', $event)\">\n <option value=\"__CURRENT__\" [selected]=\"CompareTargetChangeID === '__CURRENT__'\">Current Live Record</option>\n @for (ver of GetPreviewableChanges(); track ver.ID) {\n <option [value]=\"ver.ID\" [selected]=\"IsChangeSelectedAsCompareTarget(ver)\">\n {{ formatFullDateTime(ver.ChangedAt) }} — {{ getUserDisplayName(ver.User) }}\n </option>\n }\n </select>\n @if (CompareTargetChange; as targetChange) {\n <button\n type=\"button\"\n class=\"rc-compare-action-btn\"\n [class.active]=\"IsChangePreviewedInForm(targetChange)\"\n (click)=\"OnToggleFormPreview(targetChange, $event)\"\n aria-label=\"Preview target version in form\">\n <i class=\"fa-solid fa-eye\" aria-hidden=\"true\"></i>\n </button>\n @if (AllowRestore) {\n <button\n type=\"button\"\n class=\"rc-compare-action-btn\"\n (click)=\"OnRestoreVersion(targetChange, $event)\"\n aria-label=\"Restore target version\">\n <i class=\"fa-solid fa-clock-rotate-left\" aria-hidden=\"true\"></i>\n </button>\n }\n }\n </div>\n </div>\n\n @if (GetComparisonDiffs(); as compDiffs) {\n @if (compDiffs.length === 0) {\n <div class=\"rc-compare-empty\">\n <i class=\"fa-solid fa-circle-check\" aria-hidden=\"true\"></i>\n <span>No field differences between {{ GetComparisonSlotLabel('base') }} and {{ GetComparisonSlotLabel('target') }}.</span>\n </div>\n } @else {\n <div class=\"rc-compare-summary\">\n <span>{{ compDiffs.length }} field{{ compDiffs.length !== 1 ? 's' : '' }} differ between <strong>vA</strong> and <strong>vB</strong></span>\n </div>\n <div class=\"rc-compare-diff-list\">\n @for (fc of compDiffs; track fc.field) {\n <div class=\"rc-field-row\">\n <div class=\"rc-field-label\">{{ fc.displayName }}</div>\n <div class=\"rc-field-values\">\n @if (fc.fieldType === 'boolean') {\n <div class=\"rc-bool-change\">\n <span class=\"rc-bool-dot\" [class.on]=\"fc.oldValue === 'true' || fc.oldValue === '1'\" [class.off]=\"fc.oldValue !== 'true' && fc.oldValue !== '1'\"></span>\n <span class=\"rc-bool-label old\">{{ fc.oldValue === 'true' || fc.oldValue === '1' ? 'Yes' : 'No' }}</span>\n <i class=\"fa-solid fa-arrow-right rc-val-arrow\" aria-hidden=\"true\"></i>\n <span class=\"rc-bool-dot\" [class.on]=\"fc.newValue === 'true' || fc.newValue === '1'\" [class.off]=\"fc.newValue !== 'true' && fc.newValue !== '1'\"></span>\n <span class=\"rc-bool-label new\" [class.active]=\"fc.newValue === 'true' || fc.newValue === '1'\" [class.inactive]=\"fc.newValue !== 'true' && fc.newValue !== '1'\">{{ fc.newValue === 'true' || fc.newValue === '1' ? 'Yes' : 'No' }}</span>\n </div>\n } @else if (fc.fieldType === 'date' || fc.fieldType === 'number') {\n <div class=\"rc-atomic-change\">\n <span class=\"rc-val-old\">{{ fc.oldValue || '(empty)' }}</span>\n <i class=\"fa-solid fa-arrow-right rc-val-arrow\" aria-hidden=\"true\"></i>\n <span class=\"rc-val-new\">{{ fc.newValue || '(empty)' }}</span>\n </div>\n } @else if (fc.diffHtml) {\n <div class=\"rc-text-diff\" [innerHTML]=\"fc.diffHtml\"></div>\n } @else {\n <div class=\"rc-atomic-change\">\n <span class=\"rc-val-old\">{{ fc.oldValue || '(empty)' }}</span>\n <i class=\"fa-solid fa-arrow-right rc-val-arrow\" aria-hidden=\"true\"></i>\n <span class=\"rc-val-new\">{{ fc.newValue || '(empty)' }}</span>\n </div>\n }\n </div>\n </div>\n }\n </div>\n }\n }\n </div>\n }\n\n <!-- Collapsible Version Labels Tray (only takes vertical space when user opens it and labels exist) -->\n @if (ShowLabelsTray && RecordLabels.length > 0) {\n <div class=\"rc-labels-tray\">\n <div class=\"rc-labels-list\">\n @for (label of RecordLabels; track label.ID) {\n <div class=\"rc-label-chip\" [title]=\"label.Description || label.Name\">\n <i class=\"fa-solid fa-tag rc-label-chip-icon\"></i>\n <span class=\"rc-label-chip-name\">{{ label.Name }}</span>\n <span class=\"rc-label-chip-meta\">\n <span class=\"rc-label-chip-status\" [class]=\"getLabelStatusClass(label.Status)\">{{ label.Status }}</span>\n <span class=\"rc-label-chip-items\">{{ label.ItemCount }} item{{ label.ItemCount !== 1 ? 's' : '' }}</span>\n </span>\n </div>\n }\n </div>\n </div>\n }\n\n @if (viewData.length === 0) {\n <!-- Empty state -->\n <mj-empty-state\n Icon=\"fa-solid fa-clock-rotate-left\"\n Title=\"No Change History\"\n Message=\"This record doesn't have any tracked changes yet. Changes will appear here automatically as edits are made.\"\n Size=\"large\">\n <div class=\"rc-empty-state-hint\">\n <i class=\"fa-solid fa-shield-halved\"></i>\n <span>Record change tracking is managed at the entity level</span>\n </div>\n </mj-empty-state>\n } @else {\n <!-- Activity Over Time Burst-Aware Cluster Strip (Powered by @memberjunction/ng-ui-components) -->\n <mj-burst-cluster-strip\n Title=\"Editing sessions\"\n TitleIcon=\"fa-solid fa-wave-square\"\n AriaLabel=\"Change activity bursts over time\"\n ItemSingularNoun=\"change\"\n ItemPluralNoun=\"changes\"\n [Items]=\"BurstClusterItems\"\n [Categories]=\"BurstClusterCategories\"\n [Resolution]=\"BurstResolution\"\n [CoalesceStrategy]=\"BurstCoalesceStrategy\"\n [SessionGapHours]=\"BurstSessionGapHours\"\n [MaxClusters]=\"BurstMaxClusters\"\n [EraZoomThreshold]=\"BurstEraZoomThreshold\"\n [AllowZoom]=\"AllowBurstZoom\"\n [(SelectedClusterKey)]=\"SelectedBucketKey\"\n (AfterClustersRebuild)=\"OnBurstClustersRebuilt($event)\"\n (FilterChanged)=\"OnBurstFilterChanged($event)\">\n </mj-burst-cluster-strip>\n\n <!-- Filter Bar — chips render only for change types/sources actually present in loaded data.\n When more than 2 conditional chips would render, they collapse into a \"More filters\" popover. -->\n <div class=\"rc-filter-bar\">\n <div class=\"rc-search-wrap\">\n <i class=\"fa-solid fa-search\" aria-hidden=\"true\"></i>\n <input\n class=\"rc-search-box\"\n type=\"text\"\n placeholder=\"Search changes...\"\n [(ngModel)]=\"searchTerm\"\n (input)=\"onSearchChange()\"\n aria-label=\"Search record changes\"\n />\n </div>\n\n <button class=\"rc-filter-pill\" [class.active]=\"IsAllSelected\" (click)=\"SelectAllPill()\" type=\"button\">\n <i class=\"fa-solid fa-layer-group\" aria-hidden=\"true\"></i> All\n </button>\n\n @if (HasConditionalPills) {\n @if (!UseOverflowPopover) {\n <!-- 1-2 conditional pills: render inline -->\n @for (pill of ConditionalPills; track pill.Key) {\n <button class=\"rc-filter-pill\"\n [class.active]=\"ChipSelections[pill.Key]\"\n [class.rc-filter-pill-restore]=\"pill.Variant === 'restore'\"\n (click)=\"TogglePill(pill.Key)\"\n type=\"button\">\n <i class=\"fa-solid {{ pill.Icon }}\" aria-hidden=\"true\"></i>\n {{ pill.Label }}\n <span class=\"rc-filter-pill-count\">{{ pill.Count }}</span>\n </button>\n }\n } @else {\n <!-- 3+ conditional pills: overflow popover -->\n <div class=\"rc-filter-overflow-wrap\">\n <button class=\"rc-filter-pill rc-filter-pill-overflow\"\n [class.active]=\"SelectedConditionalCount > 0\"\n (click)=\"ToggleFilterOverflow()\"\n type=\"button\">\n <i class=\"fa-solid fa-sliders\" aria-hidden=\"true\"></i>\n More filters\n @if (SelectedConditionalCount > 0) {\n <span class=\"rc-filter-pill-count\">{{ SelectedConditionalCount }}</span>\n }\n <i class=\"fa-solid fa-chevron-down rc-filter-overflow-caret\" aria-hidden=\"true\"></i>\n </button>\n\n @if (ShowFilterOverflow) {\n <!-- Backdrop: clicks close the popover -->\n <div class=\"rc-filter-overflow-backdrop\" (click)=\"CloseFilterOverflow()\"></div>\n <div class=\"rc-filter-overflow-popover\" role=\"menu\">\n <div class=\"rc-filter-overflow-header\">Filter by</div>\n @for (pill of ConditionalPills; track pill.Key) {\n <label class=\"rc-filter-overflow-row\" [class.rc-filter-overflow-row-restore]=\"pill.Variant === 'restore'\">\n <input type=\"checkbox\"\n [checked]=\"ChipSelections[pill.Key]\"\n (change)=\"TogglePill(pill.Key)\" />\n <i class=\"fa-solid {{ pill.Icon }}\" aria-hidden=\"true\"></i>\n <span class=\"rc-filter-overflow-label\">{{ pill.Label }}</span>\n <span class=\"rc-filter-overflow-count\">{{ pill.Count }}</span>\n </label>\n }\n <div class=\"rc-filter-overflow-actions\">\n <button class=\"rc-filter-overflow-clear\" (click)=\"SelectAllPill(); CloseFilterOverflow()\" type=\"button\">\n Clear all\n </button>\n <button class=\"rc-filter-overflow-done\" (click)=\"CloseFilterOverflow()\" type=\"button\">\n Done\n </button>\n </div>\n </div>\n }\n </div>\n }\n }\n </div>\n\n @if (filteredData.length !== viewData.length) {\n <div class=\"rc-filter-results\">\n Showing {{ filteredData.length }} of {{ viewData.length }} changes\n <button class=\"rc-clear-filters-link\" (click)=\"ClearFilters()\">Clear filters</button>\n </div>\n }\n\n <!-- Timeline -->\n <div class=\"rc-timeline\" [attr.aria-label]=\"'Timeline of changes for ' + record.EntityInfo.Name + ' record'\">\n @if (filteredData.length === 0) {\n <mj-empty-state\n Variant=\"no-results\"\n Icon=\"fa-solid fa-filter\"\n Title=\"No changes match your current filters\"\n ActionText=\"Clear filters\"\n ActionIcon=\"fa-solid fa-rotate-left\"\n (Action)=\"ClearFilters()\" />\n } @else {\n @for (group of dateGroups; track group.label) {\n <div class=\"rc-date-group\">\n <div class=\"rc-date-label\">{{ group.label }}</div>\n\n @for (change of group.changes; track change.ID) {\n <div\n class=\"rc-card\"\n [attr.data-change-id]=\"change.ID\"\n [class]=\"getChangeTypeCardClass(change.Type)\"\n [class.expanded]=\"expandedItems.has(change.ID)\"\n [class.rc-card-restore]=\"isRestoreRow(change)\"\n [class.rc-card-highlight]=\"HighlightedChangeID === change.ID\"\n [class.rc-card-previewing]=\"IsChangePreviewedInForm(change)\"\n [attr.tabindex]=\"0\"\n [attr.aria-expanded]=\"expandedItems.has(change.ID)\"\n [attr.aria-label]=\"getTimelineItemLabel(change)\"\n (keydown)=\"onTimelineItemKeydown($event, change.ID)\"\n >\n <!-- Card Header -->\n <div class=\"rc-card-header\" (click)=\"toggleExpansion(change.ID)\">\n <div class=\"rc-card-header-left\">\n <span class=\"rc-card-type-badge\"\n [class.rc-card-type-badge-restore]=\"isRestoreRow(change)\">{{ getEffectiveBadgeText(change) }}</span>\n <span class=\"rc-card-summary\">{{ getChangeSummary(change) }}</span>\n\n @if (IsChangePreviewedInForm(change)) {\n <span class=\"rc-previewing-chip\" title=\"This version is currently rendered inside the form\">\n <i class=\"fa-solid fa-eye\" aria-hidden=\"true\"></i>\n Previewing in form\n </span>\n }\n\n <!-- Lineage chip — visible when this row was produced by a restore -->\n @if (isRestoreRow(change)) {\n @if (getRestoredFromSourceChange(change); as srcChange) {\n <a class=\"rc-restored-chip\"\n (click)=\"JumpToSourceChange(srcChange, $event)\"\n [title]=\"'Jump to source version (' + formatFullDateTime(srcChange.ChangedAt) + ')'\">\n <i class=\"fa-solid fa-link\" aria-hidden=\"true\"></i>\n Restored from {{ formatTime(srcChange.ChangedAt) }} {{ srcChange.ChangedAt ? 'on ' + (srcChange.ChangedAt | date:'mediumDate') : '' }}\n @if (srcChange.User) {\n by {{ getUserDisplayName(srcChange.User) }}\n }\n </a>\n } @else {\n <span class=\"rc-restored-chip rc-restored-chip-orphan\"\n title=\"Source version was not loaded into this view\">\n <i class=\"fa-solid fa-clock-rotate-left\" aria-hidden=\"true\"></i>\n Restored from earlier version\n </span>\n }\n }\n </div>\n <div class=\"rc-card-meta\">\n @if (CompareMode && change.FullRecordJSON && change.Type !== 'Delete') {\n <div class=\"rc-card-compare-pills\">\n <button\n type=\"button\"\n class=\"rc-card-compare-pill\"\n [class.active]=\"IsChangeSelectedAsCompareBase(change)\"\n (click)=\"SelectForComparison('base', change.ID, $event)\"\n aria-label=\"Set as Base Version A\">\n A\n </button>\n <button\n type=\"button\"\n class=\"rc-card-compare-pill rc-card-compare-pill--target\"\n [class.active]=\"IsChangeSelectedAsCompareTarget(change)\"\n (click)=\"SelectForComparison('target', change.ID, $event)\"\n aria-label=\"Set as Target Version B\">\n B\n </button>\n </div>\n }\n <div class=\"rc-card-user\">\n <div class=\"rc-avatar\">{{ getUserInitials(change.User) }}</div>\n {{ getUserDisplayName(change.User) }}\n </div>\n <span class=\"rc-card-time\" [title]=\"formatFullDateTime(change.ChangedAt)\">{{ formatTime(change.ChangedAt) }}</span>\n <span class=\"rc-card-source\" [class]=\"getSourceClass(change.Source)\">{{ change.Source }}</span>\n <span class=\"rc-card-status\" [class]=\"getStatusClass(change.Status)\">{{ change.Status }}</span>\n <i class=\"fa-solid fa-chevron-down rc-card-chevron\" aria-hidden=\"true\"></i>\n </div>\n </div>\n\n <!-- Card Body (expanded) -->\n @if (expandedItems.has(change.ID)) {\n <div class=\"rc-card-body\">\n <!-- Restore reason (when present) — Notion/Linear-style\n blockquote: a thin violet left bar + italic text,\n with a tiny \"Reason\" prefix. No box, no header,\n no large vertical footprint. Reads as a\n justification note rather than a callout. -->\n @if (getRestoreReason(change); as reason) {\n <blockquote class=\"rc-restore-reason\">\n <span class=\"rc-restore-reason-label\">Reason</span>\n <span class=\"rc-restore-reason-text\">{{ reason }}</span>\n </blockquote>\n }\n\n @if (change.Type === 'Create') {\n @if (change.FullRecordJSON) {\n @for (field of getCreatedFields(change); track field.name) {\n <div class=\"rc-field-row\">\n <div class=\"rc-field-label\">{{ field.displayName }}</div>\n <div class=\"rc-field-values\">\n <span class=\"rc-val-new\">{{ field.value }}</span>\n </div>\n </div>\n }\n }\n } @else if (change.Type === 'Delete') {\n <div class=\"rc-deletion-note\">\n <i class=\"fa-solid fa-trash\" aria-hidden=\"true\"></i>\n This record was permanently removed from the system.\n </div>\n } @else {\n <!-- Update / Snapshot / Restore: type-aware field changes -->\n @for (fc of getFieldChanges(change); track fc.field) {\n <div class=\"rc-field-row\">\n <div class=\"rc-field-label\">{{ fc.displayName }}</div>\n <div class=\"rc-field-values\">\n @if (fc.fieldType === 'boolean') {\n <div class=\"rc-bool-change\">\n <span class=\"rc-bool-dot\" [class.on]=\"fc.oldValue === 'true' || fc.oldValue === '1'\" [class.off]=\"fc.oldValue !== 'true' && fc.oldValue !== '1'\"></span>\n <span class=\"rc-bool-label old\">{{ fc.oldValue === 'true' || fc.oldValue === '1' ? 'Yes' : 'No' }}</span>\n <i class=\"fa-solid fa-arrow-right rc-val-arrow\" aria-hidden=\"true\"></i>\n <span class=\"rc-bool-dot\" [class.on]=\"fc.newValue === 'true' || fc.newValue === '1'\" [class.off]=\"fc.newValue !== 'true' && fc.newValue !== '1'\"></span>\n <span class=\"rc-bool-label new\" [class.active]=\"fc.newValue === 'true' || fc.newValue === '1'\" [class.inactive]=\"fc.newValue !== 'true' && fc.newValue !== '1'\">{{ fc.newValue === 'true' || fc.newValue === '1' ? 'Yes' : 'No' }}</span>\n </div>\n } @else if (fc.fieldType === 'date' || fc.fieldType === 'number') {\n <div class=\"rc-atomic-change\">\n <span class=\"rc-val-old\">{{ fc.oldValue || '(empty)' }}</span>\n <i class=\"fa-solid fa-arrow-right rc-val-arrow\" aria-hidden=\"true\"></i>\n <span class=\"rc-val-new\">{{ fc.newValue || '(empty)' }}</span>\n </div>\n } @else if (fc.diffHtml) {\n <div class=\"rc-text-diff\" [innerHTML]=\"fc.diffHtml\"></div>\n } @else {\n <div class=\"rc-atomic-change\">\n <span class=\"rc-val-old\">{{ fc.oldValue || '(empty)' }}</span>\n <i class=\"fa-solid fa-arrow-right rc-val-arrow\" aria-hidden=\"true\"></i>\n <span class=\"rc-val-new\">{{ fc.newValue || '(empty)' }}</span>\n </div>\n }\n </div>\n </div>\n }\n }\n\n @if (change.Comments) {\n <div class=\"rc-comments\">\n <i class=\"fa-solid fa-comment\" aria-hidden=\"true\"></i>\n {{ change.Comments }}\n </div>\n }\n\n @if (change.ErrorLog) {\n <div class=\"rc-errors\">\n <i class=\"fa-solid fa-exclamation-triangle\" aria-hidden=\"true\"></i>\n <pre class=\"rc-error-log\">{{ change.ErrorLog }}</pre>\n </div>\n }\n\n <!-- Restore & In-Form Preview actions: shown for Update, Create, and Snapshot rows.\n Hidden on Delete rows (handled via the Recycle Bin path)\n and on the most recent change (restoring/previewing current state is a no-op). -->\n @if (change.Type !== 'Delete' && !isMostRecentChange(change) && (AllowRestore || change.FullRecordJSON)) {\n <div class=\"rc-restore-action\">\n @if (change.FullRecordJSON) {\n <button\n type=\"button\"\n class=\"rc-preview-form-btn\"\n [class.rc-preview-form-btn--active]=\"IsChangePreviewedInForm(change)\"\n (click)=\"OnToggleFormPreview(change, $event)\"\n title=\"Render this historical version's field values directly inside the form\">\n <i class=\"fa-solid\" [class.fa-eye]=\"!IsChangePreviewedInForm(change)\" [class.fa-eye-slash]=\"IsChangePreviewedInForm(change)\" aria-hidden=\"true\"></i>\n {{ IsChangePreviewedInForm(change) ? 'Exit Form Preview' : 'Preview in Form' }}\n </button>\n }\n @if (AllowRestore) {\n <button\n type=\"button\"\n class=\"rc-restore-btn\"\n (click)=\"OnRestoreVersion(change, $event)\"\n title=\"Restore the entire record to its state at this version\">\n <i class=\"fa-solid fa-clock-rotate-left\" aria-hidden=\"true\"></i>\n Restore record to this version\n </button>\n }\n </div>\n }\n </div>\n }\n </div>\n }\n </div>\n }\n }\n </div>\n }\n </div>\n }\n\n <!-- Restore preview slide-in (reusable component) -->\n <mj-restore-preview-panel\n [Visible]=\"RestorePreviewVisible\"\n [Mode]=\"'live'\"\n [RecordChange]=\"RestorePreviewChange\"\n [LiveRecord]=\"record\"\n (RestoreConfirmed)=\"OnRestorePanelConfirmed($event)\"\n (RestoreCancelled)=\"OnRestorePanelCancelled()\">\n </mj-restore-preview-panel>\n\n @if (ShowCreateWizard) {\n <div class=\"rc-wizard-overlay\" (click)=\"OnLabelCreateCancelled()\">\n <div class=\"rc-wizard-container\" (click)=\"$event.stopPropagation()\">\n <mj-label-create\n [PreselectedEntity]=\"record.EntityInfo\"\n [PreselectedRecordIds]=\"[record.PrimaryKey.KeyValuePairs[0].Value]\"\n (Created)=\"OnLabelCreated($event)\"\n (Cancel)=\"OnLabelCreateCancelled()\">\n </mj-label-create>\n </div>\n </div>\n }\n</mj-slide-panel>\n"]}