{"version":3,"file":"static/js/9f6de6218685afc1b550.bundle.js","mappings":"sxBAyCM,MAAOA,EAqBTC,YACIC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,GAcG,KAAAC,YAAc,KACjB,MAAMR,EAAmBS,EAAAA,EAAA,GAClBC,KAAKV,oBAAoBW,SACzBC,EAAAA,EAAAA,IAAKF,KAAKV,oBAAoBa,UAWrC,OARiBC,EAAAA,EAAAA,eACb,GAAGJ,KAAKZ,YAAYY,KAAKJ,UAAUI,KAAKR,UAAYQ,KAAKP,cAAcO,KAAKH,aAAaG,KAAKT,SAASc,KAEnGC,GAAW,GAAGA,EAAQC,iBAAmBD,EAAQE,sBAAwB,KAAOF,EAAQG,uBAAyB,aAChHC,EAAAA,EAAAA,iBAAgBpB,KACrBU,KAAKX,YACLW,KAAKJ,SAKN,KAAAe,mBAAqB,IAAM,yBAE3B,KAAAC,cAAgB,IAAiB,UA/BpCZ,KAAKZ,SAAWA,EAChBY,KAAKX,YAAcA,EACnBW,KAAKR,SAAWA,EAChBQ,KAAKP,WAAaA,EAClBO,KAAKV,oBAAsBA,EAC3BU,KAAKT,SAAWA,EAChBS,KAAKN,kBAAoBA,EACzBM,KAAKL,qBAAuBA,EAC5BK,KAAKJ,OAASA,EACdI,KAAKH,UAAYA,MAAAA,EAAAA,EAAa,GAgD/B,MAAMgB,EAA4BA,CACrCC,EACAC,KAEA,MAAM3B,EACyC,aAA3C0B,EAAKE,eAAeC,UAAU7B,UAA4B0B,EAAKE,eAAeE,OAASJ,EAAKE,eAAeE,MAAMC,WAC3G,WACA,SAEJ7B,EAAsB8B,EAAAA,yBAAyBC,cAAcP,GAAMQ,oBACnEC,GAAgBC,EAAAA,EAAAA,IAAuBV,EAAKE,gBAC5CtB,MAxHoB+B,EAwHqBX,KAvH9BW,EAAUC,aAAiDC,IAAvCF,EAAUC,OAAOhC,oBAA0E,IAAvC+B,EAAUC,OAAOhC,mBAD9G,IAA8B+B,EAyH1B,MAAM9B,EA7GV,SAA+B8B,GAA+D,IAAAG,EAC1F,QAAyB,QAAjBA,EAACH,EAAUC,cAAM,IAAAE,IAAhBA,EAAkBC,oBA4GEC,CAAsBhB,GAC7CjB,GAAYkC,EAAAA,EAAAA,IAAajB,EAAKE,gBAMpC,GAJIF,EAAKE,eAAeE,OAASJ,EAAKE,eAAeE,MAAMc,UACvD1C,EAAoBa,QAAU,CAAE8B,QAAuBC,KAAKC,MAAMC,mBAAmBtB,EAAKE,eAAeE,MAAMc,YAGlG,aAAb5C,EACA,OAAO,IAAI2B,EACP3B,EACA0B,EAAKE,eAAe3B,YACpBC,EACAiC,IACET,EAAKE,eAAeC,UAAUoB,QAAWvB,EAAKE,eAAeE,OAASJ,EAAKE,eAAeE,MAAMC,YAAe,QACjHQ,EACAjC,EACAC,EACAmB,EAAKE,eAAepB,OACpBC,GAED,GAAiB,WAAbT,GAAyB0B,EAAKE,eAAeE,OAASJ,EAAKE,eAAeE,MAAMoB,EACvF,OAAO,IAAIvB,EACP3B,EACA0B,EAAKE,eAAe3B,YACpBC,EACAiC,OACAI,EACAb,EAAKE,eAAeE,MAAMoB,EAC1B5C,EACAC,EACAmB,EAAKE,eAAepB,OACpBC,GAED,GACU,WAAbT,GACA0B,EAAKE,eAAeE,OACpBJ,EAAKE,eAAeE,MAAMqB,WAC1BzB,EAAKE,eAAeE,MAAMsB,eAE1B,OAAO,IAAIzB,EACP3B,EACA0B,EAAKE,eAAe3B,YACpBC,EACAiC,OACAI,EACAO,KAAKO,UAAU,CAAEC,UAAW5B,EAAKE,eAAeE,MAAMqB,UAAWI,eAAgB7B,EAAKE,eAAeE,MAAMsB,iBAC3G9C,EACAC,EACAmB,EAAKE,eAAepB,OACpBC,GAIR,MAAM,IAAI+C,MAAM,0D,0RCpLd,MAAOC,UAA0C3D,EAAAA,EAGnDC,YAAmB2D,GAAyE,IAA7CC,EAAAC,UAAAC,OAAA,QAAAtB,IAAAqB,UAAA,GAAAA,UAAA,GAA4C,EACvFE,MACIJ,EAAM1D,SACN0D,EAAMzD,YACNyD,EAAMxD,oBAGN,QAGAqC,EAGA,IAGA,GAGA,OAGAA,EACAmB,EAAMjD,WAUP,KAAAC,YAAc,KAAcM,EAAAA,EAAAA,eAAc,cAAeJ,KAAKX,aAM9D,KAAAsB,mBAAqB,IAAc,cAMnC,KAAAC,cAAgB,IAAiB,cAnBpCZ,KAAK+C,kCAAoCA,GAiD1C,MAKP,GALgCI,EAAAA,EAAAA,IAA2B,CACvDC,GAAI,4EACJC,OAvBJC,eAAsBR,EAA0CS,GAAuB,IAAAC,EAYnF,OAA6F,QAA7FA,SAXuBC,EAAAA,EAAAA,GACnB,CACIC,QAAS,CACLC,UAAWb,EAAMzD,YAAYuE,UAC7BC,UAAWf,EAAMjD,YAGzBiD,EAAMxD,oBACNiE,IAGYO,MAAKxD,GAAWA,EAAQyD,WAAajB,EAAMC,2CAAkC,IAAAS,EAAAA,EAAI,Q,ICtBzFQ,E,gmBA7BN,MAAOC,UAAyC/E,EAAAA,EAAtDC,c,oBAKW,KAAAwB,mBAAqB,IAAc,0BAMnC,KAAAC,cAAgB,IAEG,aAAlBZ,KAAKZ,UACJY,KAAKT,UAAYS,KAAKT,SAAS0D,OAAS,GACxCjD,KAAKV,qBACFU,KAAKV,oBAAoBa,SACzBH,KAAKV,oBAAoBa,QAAQ8B,SACjCjC,KAAKV,oBAAoBa,QAAQ8B,QAAQgB,OAAS,EAE/C,UAEJ,gBAOf,SAAYe,GAIRA,EAAA,kBAKAA,EAAA,kBAKAA,EAAA,kBAdJ,CAAYA,IAAAA,EAAoC,KA+FzCV,eAAeY,EAClBC,EACAZ,EACAa,EACAC,GAEA,MAEMC,EAAiCH,EAAqB9D,KAAIkE,IAAsB,IAAAC,EAClF,MAAMC,GAAcC,EAAAA,EAAAA,yBAAwBH,EAAqBhB,EAAQvC,eAAe3B,aAOzB,IAAAsF,GAL3DF,IACAF,EAAoBK,gBAAkBH,GAIL,QAArCD,EAAIjB,EAAQvC,eAAe6D,IAAInD,cAAM,IAAA8C,GAAjCA,EAAmCM,0BACnCP,EAAoBQ,MAAOC,EAAAA,EAAAA,GACvBT,EAAoBU,gBACpBV,EAAoBQ,KACa,QADTJ,EACxBpB,EAAQvC,eAAe6D,IAAInD,cAAM,IAAAiD,OAAA,EAAjCA,EAAmCO,+BAI3C,OAAOX,KAKX,GACIhB,EAAQvC,eAAe6D,IAAInD,OAAOyD,iBAAmBC,EAAAA,gBAAgBC,YACd,IAAvD9B,EAAQvC,eAAe6D,IAAInD,OAAO4D,iBAElC,MAAO,CACHC,SAAUjB,EACVkB,MAAOpB,MAAAA,EAAAA,EA7BqB,GAiCpC,MAAMqB,EAAyBpB,MAAAA,EAAAA,QAAwCqB,EAAAA,EAAAA,gCAA+B,CAAEC,cAAepC,IA0BvH,MAAO,CACHgC,SAFoBK,EAvBDtB,EAA+BjE,KAAIkE,IACtD,GAAIsB,EAAAA,gBAAgBC,YAAYvB,EAAoBU,iBAChD,IAAK,MAAMc,KAAWxB,EAAoBU,gBAElCZ,QACqB1C,IAArBoE,EAAQhC,UACRgC,EAAQhC,WAAaM,EAA8B2B,mCAEG,QAAtDzC,EAAQvC,eAAe6D,IAAInD,OAAOuE,iBAClCF,EAAQG,YAAc7B,EAA8B8B,wCAMpDJ,EAAQG,UAAY,IAKhC,OAAO3B,KAGoDhB,EAAQvC,eAAe3B,aAGlFmG,MAAOpB,MAAAA,EAAAA,EA7DyB,EA+DhCgC,gCAAiCX,EAAyBA,EAAuBO,uCAAoCrE,EACrH0E,kCAAmCZ,EAC7BA,EAAuBa,kDACvB3E,GAIR,SAAUiE,EACZW,EACAlH,GACwB,IAAxBmH,EAAAxD,UAAAC,OAAA,QAAAtB,IAAAqB,UAAA,GAAAA,UAAA,GAAuB,EAEvB,MAAMyD,EAAiD,GAkCvD,OAjCAF,MAAAA,GAAAA,EAAgBG,SAASC,IAAgC,IAAAC,EAAAC,EAAAC,EACrD,MAAMC,EAA+B,QAA1BH,EAAGD,EAAQ1B,uBAAe,IAAA2B,GAA8D,QAA9DA,EAAvBA,EAAyB9C,MAAKkD,IAAS,IAAAC,EAAA,MAAsC,WAApB,QAAdA,EAAAD,EAAUjC,YAAI,IAAAkC,OAAA,EAAdA,EAAgBC,yBAA0B,IAAAN,OAAA,EAArFA,EAAuFV,UAC/FiB,GAA0BJ,MAAAA,OAAK,EAALA,EAAOK,MAAM,OAAQ,GAE/CC,GAAsC,QAAvBR,EAAAF,EAAQ1B,uBAAe,IAAA4B,GAAsE,QAAtEA,EAAvBA,EAAyB/C,MAAKkD,IAAS,IAAAM,EAAA,MAAsC,mBAApB,QAAdA,EAAAN,EAAUjC,YAAI,IAAAuC,OAAA,EAAdA,EAAgBJ,yBAAkC,IAAAL,OAAA,EAA7FA,EAA+FX,YAAa,GACjI,IAAIqB,EAAmC,GACvC,IAAIC,EAAAA,EAAAA,IAAaH,GAAe,CAC5B,MAAMI,EAAmBvF,KAAKC,MAAMkF,GACpC,IAAK,IAAIK,EAAI,EAAGA,EAAIP,EAAclE,OAAQyE,IAAK,CAC3C,MAAMC,EAAyBF,EAAiB3D,MAAM8D,GAA0BA,EAAKC,MAAQV,EAAcO,KACvGC,GACAJ,EAAcO,KAAKH,IAM/BJ,EAAgBA,EAAcQ,MAAK,CAACC,EAAGC,KAAK,IAAAC,EAAAC,EAAAC,EAAAC,EACxC,OAAwB,QAAjBH,EAAS,QAATC,EAACF,EAAEK,cAAM,IAAAH,OAAA,EAARA,EAAUlF,cAAM,IAAAiF,EAAAA,EAAI,IAAsB,QAArBE,EAAa,QAAbC,EAAKL,EAAEM,cAAM,IAAAD,OAAA,EAARA,EAAUpF,cAAM,IAAAmF,EAAAA,EAAI,MAEtD5B,EAAe,GAAKe,EAActE,OAASuD,IAC3Ce,EAAgBA,EAAcgB,MAAM,EAAG/B,IAE9B,QAAbM,EAAAS,SAAa,IAAAT,GAAbA,EAAeJ,SAASK,IAA0B,IAAAyB,EAAAC,EAAAC,EAC9C,MAAMC,EAAI5I,EAAA,GAAqC4G,GACzCiC,GAAWC,EAAAA,EAAAA,mBAAiBC,EAAAA,EAAAA,GAAgC,QAAfN,EAAC7B,EAAQoC,cAAM,IAAAP,EAAAA,EAAI,GAAa,QAAXC,EAAE1B,EAAMc,WAAG,IAAAY,EAAAA,EAAI,IAAKpJ,GAC5FsJ,EAAK/D,gBAAkBgE,EACvBD,EAAKK,aAAejC,EAAMuB,QAAU,GACpCK,EAAKM,aAAelC,EAAMc,KAAO,GACjCc,EAAKO,UAAmC,QAA1BR,EAAG/B,EAAQwC,uBAAe,IAAAT,EAAAA,EAAI/B,EAAQ5C,SACpD0C,EAAgBqB,KAAKa,SAGtBlC,EA+FJ,MAAM2C,GAAmBjG,EAAAA,EAAAA,IAA2B,CACvDC,GAAI,qFACJC,OAxFJC,eAAsBR,EAAyCS,GAAuB,IAAA8F,EAAAC,EAAAC,EAAAC,EAAAC,EAClF,IAAIC,EACAC,EACJ,MAAMC,EAA6C,GACnDA,EAAoBlG,QAAU,CAAEC,UAAWJ,EAAQvC,eAAe3B,YAAYuE,UAAWC,UAAWf,EAAMjD,WAC1G+J,EAAoBC,WAAa/G,EAAMvD,SACvCqK,EAAoBE,kBAAoBhH,EAAMpD,kBAC9CkK,EAAoBG,sBAAuB,EAC3C,MAEM1F,QAAsCqB,EAAAA,EAAAA,gCAA+B,CAAEC,cAAepC,IAE5F,IAAqC,QAAjC8F,EAAA9F,EAAQvC,eAAe6D,IAAInD,cAAM,IAAA2H,OAAA,EAAjCA,EAAmCW,+BAAgChG,EAAqCiG,QAAS,CACjH,MAAMC,QApKd5G,eACIR,EACAS,EACAc,GAA4D,IAAA8F,EAE5D,MAAMC,EAAe,IAAIvH,EAAkCC,EAAOuB,EAA8B2B,mCAE1FqE,QAAyBC,EAA2BF,EAAc7G,GAGxE,OAKK,QALL4G,EACIE,MAAAA,OAAgB,EAAhBA,EAAkBE,OAAOzG,MACrB6D,GACIA,EAAMnH,uBAAyB6D,EAA8B8B,uCAC7DwB,EAAMlH,wBAA0B4D,EAA8B8B,+CACrE,IAAAgE,EAAAA,EAAI,KAqJsBK,CAAqC1H,EAAOS,EAASc,IAClCuF,EAAoBC,WAAWY,MACzE9C,GAASA,EAAMpH,mBAAoB2J,MAAAA,OAAY,EAAZA,EAAc3J,oBAEP2J,GAC1CN,EAAoBC,WAAW/B,KAAKoC,GAI5C,IACqC,QAAjCZ,EAAA/F,EAAQvC,eAAe6D,IAAInD,cAAM,IAAA4H,OAAA,EAAjCA,EAAmCU,+BAAgChG,EAAqC0G,SACxGrG,EAA8BiC,6CAChC,KAAAqE,EAAAC,EACE9H,EAAMxD,oBAAoBa,QAA2C,QAApCwK,EAAG7H,EAAMxD,oBAAoBa,eAAO,IAAAwK,EAAAA,EAAI,GACzE7H,EAAMxD,oBAAoBa,QAAQ8B,QAAmD,QAA5C2I,EAAG9H,EAAMxD,oBAAoBa,QAAQ8B,eAAO,IAAA2I,EAAAA,EAAI,GACzF,MAAMC,EAAiB,QAAQxG,EAA8BiC,+CAChCxD,EAAMxD,oBAAoBa,QAAQ8B,QAAQwI,MAAKK,GAAUA,EAAOC,aAAeF,KAExG/H,EAAMxD,oBAAoBa,QAAQ8B,QAAQ6F,KAAK,CAC3CiD,WAAYF,EACZG,cAAc,IAK1B,GAAuB,aAAnBlI,EAAM1D,UAAuD,QAAhCmK,EAAIhG,EAAQvC,eAAeE,aAAK,IAAAqI,GAA5BA,EAA8BpI,WAAY,CAC3E,IAAI2B,EAAMtD,SAUN,MAAM,IAAIoD,MAAM,wFAThBgH,EAAoBqB,YAAc,CAACnI,EAAMtD,UAhCnB,GAiCtBkK,GAAUwB,EAAAA,EAAAA,uBACN,CACIvF,cAAepC,EACfjE,oBAAqBwD,EAAMxD,qBAE/BsK,QAKL,GAAI9G,EAAMrD,YAA0C,QAAhC+J,EAAIjG,EAAQvC,eAAeE,aAAK,IAAAsI,GAA5BA,EAA8BlH,EACzDsH,EAAoBuB,gBAAkBrI,EAAMrD,WAC5CiK,GAAUwB,EAAAA,EAAAA,uBACN,CACIvF,cAAepC,EACfjE,oBAAqBwD,EAAMxD,qBAE/BsK,OAED,MAAI9G,EAAMrD,YAA0C,QAAhCgK,EAAIlG,EAAQvC,eAAeE,aAAK,IAAAuI,GAA5BA,EAA8BlH,WAAagB,EAAQvC,eAAeE,MAAMsB,gBAmBnG,MAAM,IAAII,MAAM,qGAnBmG,CACnH,MAAMwI,EAAelJ,KAAKC,MAAMW,EAAMrD,YAEtC,GADAkK,EAAkB0B,OAAOD,EAAa1I,WAClC2I,OAAOC,MAAM3B,GACb,MAAM,IAAI/G,MAAM,mDACb,IAAKwI,EAAazI,eACrB,MAAM,IAAIC,MAAM,0CAEhBgH,EAAoB2B,qBAAuBH,EAAazI,eACxDiH,EAAoB4B,IAAM,CAAC7B,GA7DL,GA8DtBD,GAAUwB,EAAAA,EAAAA,uBACN,CACIvF,cAAepC,EACfjE,oBAAqBwD,EAAMxD,qBAE/BsK,IAQZ,OAAO1F,QAD4BwF,EACSnG,EAASmG,EAAQ+B,SAASjG,MAAOnB,IAM7EvB,MAzQiBhC,IACjB,MAAMgC,GAAQjC,EAAAA,EAAAA,GAA0BC,EAAMmD,GAc9C,OAXInB,EAAMxD,oBAAoBW,QAAUa,EAAKY,SACzCoB,EAAMxD,oBAAoBW,OAAOyL,IAAM5K,EAAKY,OAAOiK,cAAgB,GAInE7I,EAAMxD,oBAAoBW,QAAUa,EAAKE,eAAeE,OAASJ,EAAKE,eAAeE,MAAM0K,OAC3F9I,EAAMxD,oBAAoBW,OAAO4L,MAAQ/K,EAAKE,eAAeE,MAAM0K,MAGvE9I,EAAMxD,oBAAoBkG,OAAQ,EAE3B1C,KA6PX,K,iDCpWOQ,eAAeG,EAClBqI,EACAxM,EACAyM,GAEA,OAAOC,EAAAA,EAAAA,+BAA8B,CAAErG,cAAeoG,EAAKzM,oBAAAA,GAAuBwM,GAAgBG,MAC7FC,IACG,IAAKA,EAED,OADAH,EAAII,MAAM,sDACyB,GAGvC,MAAMC,GAAUF,GAAmB,IAAI7L,KAAKgM,GAA6DA,IAEzG,OAAsB,IAAlBD,EAAOnJ,QACP8I,EAAII,MAAM,8EACyB,IAGhCC,O,8GCrBnB,MAAME,EAAwB,CAC1B,gBACA,uBACA,kBACA,qBACA,wBACA,YAQS9K,EAA0BR,IACnC,MAAMuL,EAAyBC,EAAuC,WAAYxL,GAClF,OAAKuL,GAA4D,IAAlCA,EAAuBtJ,OAIxBsJ,EACzBlM,KAAIoM,IACD,IACI,MAAMC,EAAqC,GAI3C,OAHAJ,EAAsB5F,SAAQ,CAACiG,EAAYC,KACvCF,EAAcC,GAAcF,EAAkBG,MAE3CF,EACT,MAAAG,GACE,WAGPC,OAAOC,SAfD,IA2CFC,EAAmBA,CAACC,EAAc1N,EAAkC2N,EAA+BC,KAE5G,QAAiBxL,IAAbpC,EAAwB,CACxB,GAAwB,IAApBA,EAAS0D,OACTgK,EAAQG,aAAaC,OAAO,gBACzB,CACH,MAAMC,EAAiB/N,EAASwI,MAAK,CAACwF,EAAOC,IACzCD,EAAMhN,iBAAmBiN,EAAOjN,iBAAmBgN,EAAMhN,gBAAkBiN,EAAOjN,gBAAkB,GAAK,IAE7G0M,EAAQG,aAAaK,IAAI,WAAYvL,KAAKO,UA9BrBlD,CAAAA,IAC7B,MAAMmO,EAA4C,GAUlD,OARAnO,EAASmH,SAAQpG,IACb,MAAMmM,EAAyC,GAC/CH,EAAsB5F,SAAQiG,IAC1BF,EAAkB3E,KAAKxH,EAAQqM,OAEnCe,EAAmB5F,KAAK2E,MAGrBiB,GAmBqDC,CAAiBL,KAKzE,OADAL,EAAQG,aAAaC,OAAO,QACrBJ,EAAQW,KAGnB,YAAuBjM,IAAnBuL,GAC8B,IAA1BA,EAAejK,OACfgK,EAAQG,aAAaC,OAAO,WAE5BJ,EAAQG,aAAaK,IAAI,UAAWvL,KAAKO,UAAUyK,IAIvDD,EAAQG,aAAaC,OAAO,QACrBJ,EAAQW,OAGfT,GACAF,EAAQG,aAAaK,IAAI,OAAQN,EAAUU,YAGxCZ,EAAQW,OAQNpB,EAAkBA,CAAI3E,EAAa7G,IACxCA,EAAeE,OAASF,EAAeE,MAAM2G,GACnC3F,KAAKC,MAAMC,mBAAmBpB,EAAeE,MAAM2G,KAE1D,KAOEiG,EAAiB9M,GACtB+M,EAAAA,GAASC,UACF,IAAIC,IAAIC,OAAOC,SAASP,MAI/B5M,EAAeoN,IAAIC,WAAWT,KACvB,IAAIK,IAAIjN,EAAeoN,IAAIC,WAAWT,MAE1C,IAAIK,IAAsBjN,EAAeoN,IAAIC,a,+BC7HjD,MAAMrJ,EAAoB,WAIrB,IAAAsJ,EAAA,IAHRC,EAAAvL,UAAAC,OAAA,QAAAtB,IAAAqB,UAAA,GAAAA,UAAA,GAA+B,GAC/BwL,EAAAxL,UAAAC,OAAA,QAAAtB,IAAAqB,UAAA,GAAAA,UAAA,GAAsB,GACtBkC,EAAAlC,UAAAC,OAAA,QAAAtB,IAAAqB,UAAA,GAAAA,UAAA,GAAuC,sBAEvC,IAAIyL,EAAYF,EAAWzK,MAAK4K,GAAKA,EAAE3J,OAASG,IAC5CyJ,EAAyC,QAA7BL,EAAGE,MAAAA,OAAW,EAAXA,EAAapH,MAAM,KAAK,UAAE,IAAAkH,EAAAA,EAAI,GAEjD,OADAK,EAAeA,EAAaC,cACxBH,MAAAA,GAAAA,EAAWvI,UACJ,GAAGyI,KAAgBF,MAAAA,OAAS,EAATA,EAAWvI,YAGlCsI,I,mDCpBJ,MAAM1F,EAAoBA,CAACzG,EAAgBwM,IACvC,YAAYxM,KAAUwM,gBAGpBC,EAAyBA,CAACnI,EAAwBtH,KAAyD,IAAA0P,EAAAvG,EACpH,MAAMqG,EAA2B,QAArBE,EAAGpI,EAAQqI,kBAAU,IAAAD,GAA6C,QAA7CA,EAAlBA,EAAoBjL,MAAK8D,GAAoC,IAA5BA,EAAKqH,4BAAyB,IAAAF,GAAgB,QAAhBA,EAA/DA,EAAiEG,sBAAc,IAAAH,OAAA,EAA/EA,EAAiFI,MAEhG,OADiBtG,EAAAA,EAAAA,kBAAiBC,EAAgC,QAAfN,EAAC7B,EAAQoC,cAAM,IAAAP,EAAAA,EAAI,GAAIqG,MAAAA,EAAAA,EAAU,IAAKxP","sources":["webpack://Msdyn365.Commerce.Online/./src/modules/only-c-search-result-container/actions/base-collection-action.ts?a242","webpack://Msdyn365.Commerce.Online/./src/modules/only-c-search-result-container/actions/get-inventory-refiners.ts?bcb1","webpack://Msdyn365.Commerce.Online/./src/modules/only-c-search-result-container/actions/get-full-products-by-collection.ts?3d18","webpack://Msdyn365.Commerce.Online/./src/modules/only-c-search-result-container/actions/get-product-refiner-hierarchy.ts?b7b1","webpack://Msdyn365.Commerce.Online/./src/modules/only-c-search-result-container/actions/url-utils.ts?8913","webpack://Msdyn365.Commerce.Online/./src/shared/functions/get-commercial-name.ts?6aba","webpack://Msdyn365.Commerce.Online/./src/shared/functions/image-path.ts?9fa5"],"sourcesContent":["/*--------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * See License.txt in the project root for license information.\r\n *--------------------------------------------------------------*/\r\n\r\nimport { CacheType, getCatalogId, IActionInput, IAny, ICommerceApiSettings, ICreateActionContext, IGeneric } from '@msdyn365-commerce/core';\r\nimport { convertToString, IQueryResultSettings, ProductRefinerValue, SortColumn } from '@msdyn365-commerce/retail-proxy';\r\nimport { buildCacheKey, QueryResultSettingsProxy } from '@msdyn365-commerce-modules/retail-actions';\r\nimport { toJS } from 'mobx';\r\n\r\nimport { hydrateRefinersFromUrl } from './url-utils';\r\n\r\n/**\r\n * Export listPageType.\r\n */\r\nexport type listPageType = 'Category' | 'Search' | 'Unknown';\r\n\r\n/**\r\n * Get include attributes from config.\r\n * @param inputData - ICreateActionContext.\r\n * @returns Boolean.\r\n */\r\nfunction getIncludeAttributes(inputData: ICreateActionContext, IGeneric>): boolean {\r\n if (inputData && inputData.config && inputData.config.includeAttributes !== undefined && inputData.config.includeAttributes === true) {\r\n return true;\r\n }\r\n return false;\r\n}\r\n\r\n/**\r\n * Get updateRefinerPanel from config.\r\n * @param inputData - ICreateActionContext.\r\n * @returns Boolean.\r\n */\r\nfunction getUpdateRefinerPanel(inputData: ICreateActionContext, IGeneric>): boolean {\r\n return !!inputData.config?.updateRefinerPanel;\r\n}\r\n\r\n/**\r\n * BaseCollection Action Input.\r\n */\r\nexport class BaseCollectionInput implements IActionInput {\r\n public pageType: listPageType;\r\n\r\n public category: number | undefined;\r\n\r\n public searchText: string | undefined;\r\n\r\n public refiners: ProductRefinerValue[];\r\n\r\n public queryResultSettings: IQueryResultSettings;\r\n\r\n public apiSettings: ICommerceApiSettings;\r\n\r\n public includeAttributes: boolean | undefined;\r\n\r\n public locale?: string;\r\n\r\n public isUpdateRefinerPanel?: boolean;\r\n\r\n public catalogId?: number;\r\n\r\n public constructor(\r\n pageType: listPageType,\r\n apiSettings: ICommerceApiSettings,\r\n queryResultSettings: IQueryResultSettings,\r\n refiners: ProductRefinerValue[],\r\n category: number | undefined,\r\n searchText: string | undefined,\r\n includeAttributes: boolean | undefined,\r\n isUpdateRefinerPanel?: boolean | undefined,\r\n locale?: string,\r\n catalogId?: number\r\n ) {\r\n this.pageType = pageType;\r\n this.apiSettings = apiSettings;\r\n this.category = category;\r\n this.searchText = searchText;\r\n this.queryResultSettings = queryResultSettings;\r\n this.refiners = refiners;\r\n this.includeAttributes = includeAttributes;\r\n this.isUpdateRefinerPanel = isUpdateRefinerPanel;\r\n this.locale = locale;\r\n this.catalogId = catalogId ?? 0;\r\n }\r\n\r\n public getCacheKey = () => {\r\n const queryResultSettings = {\r\n ...this.queryResultSettings.Paging,\r\n ...toJS(this.queryResultSettings.Sorting)\r\n };\r\n\r\n const cacheKey = buildCacheKey(\r\n `${this.pageType}-${this.locale}-${this.category || this.searchText}-${this.catalogId}-${this.refiners.map(\r\n // eslint-disable-next-line @typescript-eslint/restrict-plus-operands\r\n refiner => `${refiner.RefinerRecordId + (refiner.LeftValueBoundString || '') + (refiner.RightValueBoundString || '')}-`\r\n )}-${convertToString(queryResultSettings)}`,\r\n this.apiSettings,\r\n this.locale\r\n );\r\n return cacheKey;\r\n };\r\n\r\n public getCacheObjectType = () => 'CollectionActionResult';\r\n\r\n public dataCacheType = (): CacheType => 'request';\r\n}\r\n\r\n// TODO: Create a data model here or import one to capture the response of the action\r\nexport interface IGetFullProductsByCollectionData {\r\n text: string;\r\n}\r\n\r\nexport type CollectionClassConstructor = new (\r\n pageType: listPageType,\r\n apiSettings: ICommerceApiSettings,\r\n queryResultSettings: IQueryResultSettings,\r\n refiners: ProductRefinerValue[],\r\n category: number | undefined,\r\n searchText: string | undefined,\r\n includeAttributes: boolean | undefined,\r\n isUpdateRefinerPanel?: boolean | undefined,\r\n locale?: string,\r\n catalogId?: number\r\n) => BaseCollectionInput;\r\n\r\n/**\r\n * TODO: Use this function to create the input required to make the action call.\r\n * @param args\r\n * @param inputClassConstuctor\r\n */\r\nexport const createBaseCollectionInput = (\r\n args: ICreateActionContext,\r\n inputClassConstuctor: CollectionClassConstructor\r\n): BaseCollectionInput => {\r\n const pageType =\r\n args.requestContext.urlTokens.pageType === 'Category' || (args.requestContext.query && args.requestContext.query.categoryId)\r\n ? 'Category'\r\n : 'Search';\r\n\r\n const queryResultSettings = QueryResultSettingsProxy.fromInputData(args).QueryResultSettings;\r\n const queryRefiners = hydrateRefinersFromUrl(args.requestContext);\r\n const includeAttributes = getIncludeAttributes(args);\r\n const isUpdateRefinerPanel = getUpdateRefinerPanel(args);\r\n const catalogId = getCatalogId(args.requestContext);\r\n\r\n if (args.requestContext.query && args.requestContext.query.sorting) {\r\n queryResultSettings.Sorting = { Columns: JSON.parse(decodeURIComponent(args.requestContext.query.sorting)) };\r\n }\r\n\r\n if (pageType === 'Category') {\r\n return new inputClassConstuctor(\r\n pageType,\r\n args.requestContext.apiSettings,\r\n queryResultSettings,\r\n queryRefiners,\r\n +(args.requestContext.urlTokens.itemId || (args.requestContext.query && args.requestContext.query.categoryId) || 0),\r\n undefined,\r\n includeAttributes,\r\n isUpdateRefinerPanel,\r\n args.requestContext.locale,\r\n catalogId\r\n );\r\n } else if (pageType === 'Search' && args.requestContext.query && args.requestContext.query.q) {\r\n return new inputClassConstuctor(\r\n pageType,\r\n args.requestContext.apiSettings,\r\n queryResultSettings,\r\n queryRefiners,\r\n undefined,\r\n args.requestContext.query.q,\r\n includeAttributes,\r\n isUpdateRefinerPanel,\r\n args.requestContext.locale,\r\n catalogId\r\n );\r\n } else if (\r\n pageType === 'Search' &&\r\n args.requestContext.query &&\r\n args.requestContext.query.productId &&\r\n args.requestContext.query.recommendation\r\n ) {\r\n return new inputClassConstuctor(\r\n pageType,\r\n args.requestContext.apiSettings,\r\n queryResultSettings,\r\n queryRefiners,\r\n undefined,\r\n JSON.stringify({ ProductId: args.requestContext.query.productId, Recommendation: args.requestContext.query.recommendation }),\r\n includeAttributes,\r\n isUpdateRefinerPanel,\r\n args.requestContext.locale,\r\n catalogId\r\n );\r\n }\r\n\r\n throw new Error('[getFullProductsForCollection]Unable to create input');\r\n};\r\n","/*--------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * See License.txt in the project root for license information.\r\n *--------------------------------------------------------------*/\r\n\r\n/* eslint-disable no-duplicate-imports */\r\nimport { IProductRefinerHierarchy } from '@msdyn365-commerce/commerce-entities';\r\nimport { CacheType, createObservableDataAction, IAction, IActionContext, IActionInput } from '@msdyn365-commerce/core';\r\nimport { buildCacheKey } from '@msdyn365-commerce-modules/retail-actions';\r\n\r\nimport { BaseCollectionInput } from './base-collection-action';\r\nimport { getProductRefinerHierarchy } from './get-product-refiner-hierarchy';\r\n\r\n/**\r\n * InventoryInStockRefinerValue Input action.\r\n */\r\nexport class InventoryInStockRefinerValueInput extends BaseCollectionInput implements IActionInput {\r\n public inventoryProductAttributeRecordId: number;\r\n\r\n public constructor(input: BaseCollectionInput, inventoryProductAttributeRecordId: number = 0) {\r\n super(\r\n input.pageType,\r\n input.apiSettings,\r\n input.queryResultSettings,\r\n\r\n // Parameter - refiners\r\n [],\r\n\r\n // Parameter - category\r\n undefined,\r\n\r\n // Parameter - searchText\r\n '',\r\n\r\n // Parameter - includeAttributes\r\n false,\r\n\r\n // Parameter - isUpdateRefinerPanel\r\n false,\r\n\r\n // Parameter - locale\r\n undefined,\r\n input.catalogId\r\n );\r\n\r\n this.inventoryProductAttributeRecordId = inventoryProductAttributeRecordId;\r\n }\r\n\r\n /**\r\n * GetCacheKey.\r\n * @returns - Returns string.\r\n */\r\n public getCacheKey = (): string => buildCacheKey('RefinerList', this.apiSettings);\r\n\r\n /**\r\n * GetCacheObjectType.\r\n * @returns - Returns string.\r\n */\r\n public getCacheObjectType = (): string => 'RefinerList';\r\n\r\n /**\r\n * DataCacheType.\r\n * @returns - CacheType string.\r\n */\r\n public dataCacheType = (): CacheType => 'application';\r\n}\r\n\r\n/**\r\n * Action method returns inventory in stock refiners.\r\n * @param input - InventoryInStockRefinerValueInput.\r\n * @param context - IActionContext.\r\n * @returns - Promise.\r\n */\r\nasync function action(input: InventoryInStockRefinerValueInput, context: IActionContext): Promise {\r\n const refiners = await getProductRefinerHierarchy(\r\n {\r\n Context: {\r\n ChannelId: input.apiSettings.channelId,\r\n CatalogId: input.catalogId\r\n }\r\n },\r\n input.queryResultSettings,\r\n context\r\n );\r\n\r\n return refiners.find(refiner => refiner.RecordId === input.inventoryProductAttributeRecordId) ?? null;\r\n}\r\n\r\n/**\r\n * Action.\r\n * @param id - Id.\r\n * @param action - Action.\r\n * @returns - Results.\r\n */\r\nexport const actionDataAction = createObservableDataAction({\r\n id: '@msdyn365-commerce-modules/search-result-container/get-inventory-refiners',\r\n action: action as IAction\r\n});\r\n\r\nexport default actionDataAction;\r\n","/*--------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * See License.txt in the project root for license information.\r\n *--------------------------------------------------------------*/\r\n\r\nimport {\r\n CacheType,\r\n createObservableDataAction,\r\n IAction,\r\n IActionContext,\r\n IActionInput,\r\n ICreateActionContext\r\n} from '@msdyn365-commerce/core';\r\nimport { ICommerceApiSettings } from '@msdyn365-commerce/core-internal';\r\n\r\nimport {\r\n AsyncResult,\r\n ChannelInventoryConfiguration,\r\n ProductRefinerValue,\r\n ProductSearchCriteria,\r\n ProductSearchResult\r\n} from '@msdyn365-commerce/retail-proxy';\r\nimport { searchByCriteriaAsync } from '@msdyn365-commerce/retail-proxy/dist/DataActions/ProductsDataActions.g';\r\nimport { getInventoryConfigurationAsync } from '@msdyn365-commerce/retail-proxy/dist/DataActions/StoreOperationsDataActions.g';\r\nimport { ArrayExtensions, generateProductImageUrl, InventoryLevels, generateImageUrl } from '@msdyn365-commerce-modules/retail-actions';\r\nimport { BaseCollectionInput, createBaseCollectionInput } from './base-collection-action';\r\nimport getInventoryRefinersAction, { InventoryInStockRefinerValueInput } from './get-inventory-refiners';\r\nimport { _isValidJson, _readFromSessionStorage } from '../../../utils/helper';\r\nimport { generateImagePath } from '../../../shared/functions/image-path';\r\nimport { getCommercialName } from '../../../shared/functions/get-commercial-name';\r\n\r\n/**\r\n * GetFullProductsByCollection Action Input.\r\n */\r\nexport class GetFullProductsByCollectionInput extends BaseCollectionInput implements IActionInput {\r\n /**\r\n * The cache object type.\r\n * @returns The cache object type.\r\n */\r\n public getCacheObjectType = (): string => 'FullProductSearchResult';\r\n\r\n /**\r\n * The data cache type.\r\n * @returns The data cache type.\r\n */\r\n public dataCacheType = (): CacheType => {\r\n if (\r\n this.pageType !== 'Category' ||\r\n (this.refiners && this.refiners.length > 0) ||\r\n (this.queryResultSettings &&\r\n this.queryResultSettings.Sorting &&\r\n this.queryResultSettings.Sorting.Columns &&\r\n this.queryResultSettings.Sorting.Columns.length > 0)\r\n ) {\r\n return 'request';\r\n }\r\n return 'application';\r\n };\r\n}\r\n\r\n/**\r\n * This setting defines inventory filtering options.\r\n */\r\nexport enum ProductListInventoryFilteringOptions {\r\n /**\r\n * Filter out all products out of stock.\r\n */\r\n HideOOS = 'hideOOS',\r\n\r\n /**\r\n * Sort products by availability, OOS goes last.\r\n */\r\n SortOOS = 'sortOOS',\r\n\r\n /**\r\n * No filtering selected.\r\n */\r\n Default = 'default'\r\n}\r\n\r\n/**\r\n * The full product search result with count interface.\r\n */\r\ninterface IFullProductsSearchResultsWithCount {\r\n products: ProductSearchResultExtended[];\r\n count: number;\r\n channelInventoryConfigurationId?: number;\r\n inventoryAwareSortableAttributeId?: number;\r\n}\r\n\r\nexport interface ProductSearchResultExtended extends ProductSearchResult {\r\n variantsizes?: string[];\r\n variantColor?: string;\r\n variantId?: number;\r\n}\r\n\r\nexport interface IProductSlicing {\r\n key?: string;\r\n values?: string[];\r\n}\r\n\r\n/**\r\n * CreateInput function which creates and actionInput used to fetch products for a list page.\r\n * @param args - The API arguments.\r\n * @returns IActionInput - The action input.\r\n */\r\nconst createInput = (args: ICreateActionContext<{ itemsPerPage: number; includedAttributes: boolean | undefined }>): IActionInput => {\r\n const input = createBaseCollectionInput(args, GetFullProductsByCollectionInput);\r\n\r\n // Set Top\r\n if (input.queryResultSettings.Paging && args.config) {\r\n input.queryResultSettings.Paging.Top = args.config.itemsPerPage || 1;\r\n }\r\n\r\n // Set Skip\r\n if (input.queryResultSettings.Paging && args.requestContext.query && args.requestContext.query.skip) {\r\n input.queryResultSettings.Paging.Skip = +args.requestContext.query.skip;\r\n }\r\n\r\n input.queryResultSettings.count = true;\r\n\r\n return input;\r\n};\r\n\r\n/**\r\n * Returns sorted products based on availability.\r\n * @param input - The GetFullProductsByCollectionInput input.\r\n * @param context - The context.\r\n * @param channelInventoryConfiguration - The channelInventoryConfiguration.\r\n * @returns Refiners.\r\n */\r\nasync function getInventoryInStockRefinerValueAsync(\r\n input: GetFullProductsByCollectionInput,\r\n context: IActionContext,\r\n channelInventoryConfiguration: ChannelInventoryConfiguration\r\n): Promise {\r\n const refinerInput = new InventoryInStockRefinerValueInput(input, channelInventoryConfiguration.InventoryProductAttributeRecordId);\r\n\r\n const inventoryRefiner = await getInventoryRefinersAction(refinerInput, context);\r\n\r\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition -- inventoryRefiner may be null\r\n return (\r\n inventoryRefiner?.Values.find(\r\n value =>\r\n value.LeftValueBoundString !== channelInventoryConfiguration.InventoryOutOfStockAttributeValueText &&\r\n value.RightValueBoundString !== channelInventoryConfiguration.InventoryOutOfStockAttributeValueText\r\n ) ?? null\r\n );\r\n}\r\n\r\n/**\r\n * Returns list of products based on inventory information.\r\n * @param productSearchResults - The products.\r\n * @param context - The context.\r\n * @param metadataCount - The metadata count.\r\n * @param channelInventoryConfiguration - The channel inventory configuration.\r\n * @returns List of product based on the inventory information.\r\n */\r\nexport async function returnProducts(\r\n productSearchResults: ProductSearchResult[],\r\n context: IActionContext,\r\n metadataCount: number | undefined,\r\n channelInventoryConfiguration?: ChannelInventoryConfiguration\r\n): Promise {\r\n const defaultProductCount: number = 0;\r\n\r\n const productSearchResultsWithImages = productSearchResults.map(productSearchResult => {\r\n const newImageUrl = generateProductImageUrl(productSearchResult, context.requestContext.apiSettings);\r\n\r\n if (newImageUrl) {\r\n productSearchResult.PrimaryImageUrl = newImageUrl;\r\n }\r\n\r\n //Use CommercialStyleName\r\n if (context.requestContext.app.config?.useCommercialStyleName) {\r\n productSearchResult.Name = getCommercialName(\r\n productSearchResult.AttributeValues,\r\n productSearchResult.Name,\r\n context.requestContext.app.config?.commercialStyleNameAttribute\r\n );\r\n }\r\n\r\n return productSearchResult;\r\n });\r\n\r\n // If inventory level is threshold or inventory check is disabled then return the list of products without the inventory configuration\r\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access -- read config file.\r\n if (\r\n context.requestContext.app.config.inventoryLevel === InventoryLevels.threshold ||\r\n context.requestContext.app.config.enableStockCheck === false\r\n ) {\r\n return {\r\n products: productSearchResultsWithImages,\r\n count: metadataCount ?? defaultProductCount\r\n };\r\n }\r\n\r\n const inventoryConfiguration = channelInventoryConfiguration ?? (await getInventoryConfigurationAsync({ callerContext: context }));\r\n\r\n const mappedProducts = productSearchResultsWithImages.map(productSearchResult => {\r\n if (ArrayExtensions.hasElements(productSearchResult.AttributeValues)) {\r\n for (const element of productSearchResult.AttributeValues) {\r\n if (\r\n channelInventoryConfiguration &&\r\n element.RecordId !== undefined &&\r\n element.RecordId === channelInventoryConfiguration.InventoryProductAttributeRecordId &&\r\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access -- read config file.\r\n context.requestContext.app.config.inventoryRanges !== 'all' &&\r\n element.TextValue !== channelInventoryConfiguration.InventoryOutOfStockAttributeValueText\r\n ) {\r\n // If same RecordId then it means that is the Inventory attribute\r\n // Based on the inventory range (and filtering options), the inventory label will be displayed\r\n // If Inventory range is 'All' then in stock and out of stock labels are shown, else only OOS\r\n // if the text value is different that the channelInventoryConfiguration.InventoryOutOfStockAttributeValueText then is in stock\r\n element.TextValue = '';\r\n }\r\n }\r\n }\r\n\r\n return productSearchResult;\r\n });\r\n // VSI Customization - For vairent Display\r\n const variantProducts = expandWithSizeVariants(mappedProducts, context.requestContext.apiSettings);\r\n return {\r\n products: variantProducts,\r\n count: metadataCount ?? defaultProductCount,\r\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition -- check config.\r\n channelInventoryConfigurationId: inventoryConfiguration ? inventoryConfiguration.InventoryProductAttributeRecordId : undefined,\r\n inventoryAwareSortableAttributeId: inventoryConfiguration\r\n ? inventoryConfiguration.ProductAvailabilitySortableAttributeRecordId\r\n : undefined\r\n };\r\n}\r\n\r\nexport function expandWithSizeVariants(\r\n mappedProducts: ProductSearchResult[],\r\n apiSettings: ICommerceApiSettings,\r\n variantLimit: number = 0\r\n): ProductSearchResultExtended[] {\r\n const variantProducts: ProductSearchResultExtended[] = [];\r\n mappedProducts?.forEach((product: ProductSearchResult) => {\r\n const color = product.AttributeValues?.find(attribute => attribute.Name?.toLowerCase() === 'color')?.TextValue;\r\n const splittedColor: string[] = color?.split('|') || [];\r\n\r\n const colorSlicing = product.AttributeValues?.find(attribute => attribute.Name?.toLowerCase() === 'color slicing')?.TextValue || '';\r\n let selectedColor: IProductSlicing[] = [];\r\n if (_isValidJson(colorSlicing)) {\r\n const colorSlicingData = JSON.parse(colorSlicing);\r\n for (let i = 0; i < splittedColor.length; i++) {\r\n const value: IProductSlicing = colorSlicingData.find((item: { key: string }) => item.key === splittedColor[i]);\r\n if (value) {\r\n selectedColor.push(value);\r\n }\r\n }\r\n }\r\n\r\n //sort by sizes, largest first so front end code can choose to show items with most sizes\r\n selectedColor = selectedColor.sort((a, b) => {\r\n return (b.values?.length ?? 0) - (a.values?.length ?? 0);\r\n });\r\n if (variantLimit > 0 && selectedColor.length > variantLimit) {\r\n selectedColor = selectedColor.slice(0, variantLimit);\r\n }\r\n selectedColor?.forEach((color: IProductSlicing) => {\r\n const prod: ProductSearchResultExtended = { ...product };\r\n const imageUrl = generateImageUrl(generateImagePath(product.ItemId ?? '', color.key ?? ''), apiSettings);\r\n prod.PrimaryImageUrl = imageUrl;\r\n prod.variantsizes = color.values || [];\r\n prod.variantColor = color.key || '';\r\n prod.variantId = product.MasterProductId ?? product.RecordId;\r\n variantProducts.push(prod);\r\n });\r\n });\r\n return variantProducts;\r\n}\r\n\r\n/**\r\n * Action function to fetch products for a list page.\r\n * @param input - The input.\r\n * @param context - The context.\r\n * @returns IFullProductsSearchResultsWithCount - The full product search result with count.\r\n */\r\nasync function action(input: GetFullProductsByCollectionInput, context: IActionContext): Promise {\r\n let promise: AsyncResult;\r\n let searchProductId;\r\n const searchCriteriaInput: ProductSearchCriteria = {};\r\n searchCriteriaInput.Context = { ChannelId: context.requestContext.apiSettings.channelId, CatalogId: input.catalogId };\r\n searchCriteriaInput.Refinement = input.refiners;\r\n searchCriteriaInput.IncludeAttributes = input.includeAttributes;\r\n searchCriteriaInput.SkipVariantExpansion = true;\r\n const defaultNumber: number = 0;\r\n\r\n const channelInventoryConfiguration = await getInventoryConfigurationAsync({ callerContext: context });\r\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access -- app configs are of generic type\r\n if (context.requestContext.app.config?.productListInventoryDisplay === ProductListInventoryFilteringOptions.HideOOS) {\r\n const refinerValue = await getInventoryInStockRefinerValueAsync(input, context, channelInventoryConfiguration);\r\n const isInventoryAvailableRefinerValueExist = searchCriteriaInput.Refinement.some(\r\n value => value.RefinerRecordId === refinerValue?.RefinerRecordId\r\n );\r\n if (!isInventoryAvailableRefinerValueExist && refinerValue) {\r\n searchCriteriaInput.Refinement.push(refinerValue);\r\n }\r\n }\r\n\r\n if (\r\n context.requestContext.app.config?.productListInventoryDisplay === ProductListInventoryFilteringOptions.SortOOS &&\r\n channelInventoryConfiguration.ProductAvailabilitySortableAttributeRecordId\r\n ) {\r\n input.queryResultSettings.Sorting = input.queryResultSettings.Sorting ?? {};\r\n input.queryResultSettings.Sorting.Columns = input.queryResultSettings.Sorting.Columns ?? [];\r\n const sortColumnName = `Attr_${channelInventoryConfiguration.ProductAvailabilitySortableAttributeRecordId}`;\r\n const isSortAttributeExist = input.queryResultSettings.Sorting.Columns.some(column => column.ColumnName === sortColumnName);\r\n if (!isSortAttributeExist) {\r\n input.queryResultSettings.Sorting.Columns.push({\r\n ColumnName: sortColumnName,\r\n IsDescending: true\r\n });\r\n }\r\n }\r\n\r\n if (input.pageType === 'Category' || context.requestContext.query?.categoryId) {\r\n if (input.category) {\r\n searchCriteriaInput.CategoryIds = [input.category || defaultNumber];\r\n promise = searchByCriteriaAsync(\r\n {\r\n callerContext: context,\r\n queryResultSettings: input.queryResultSettings\r\n },\r\n searchCriteriaInput\r\n );\r\n } else {\r\n throw new Error('[GetFullProductsForCollection]Category Page Detected, but no global categoryId found');\r\n }\r\n } else if (input.searchText && context.requestContext.query?.q) {\r\n searchCriteriaInput.SearchCondition = input.searchText;\r\n promise = searchByCriteriaAsync(\r\n {\r\n callerContext: context,\r\n queryResultSettings: input.queryResultSettings\r\n },\r\n searchCriteriaInput\r\n );\r\n } else if (input.searchText && context.requestContext.query?.productId && context.requestContext.query.recommendation) {\r\n const searchObject = JSON.parse(input.searchText);\r\n searchProductId = Number(searchObject.ProductId);\r\n if (Number.isNaN(searchProductId)) {\r\n throw new Error('Failed to cast search product id into a number.');\r\n } else if (!searchObject.Recommendation) {\r\n throw new Error('Failed to retrieve the Recommendation.');\r\n } else {\r\n searchCriteriaInput.RecommendationListId = searchObject.Recommendation;\r\n searchCriteriaInput.Ids = [searchProductId || defaultNumber];\r\n promise = searchByCriteriaAsync(\r\n {\r\n callerContext: context,\r\n queryResultSettings: input.queryResultSettings\r\n },\r\n searchCriteriaInput\r\n );\r\n }\r\n } else {\r\n throw new Error('[GetFullProductsForCollection]Search Page Detected, but no q= or productId= query parameter found');\r\n }\r\n\r\n const productSearchResults = await promise;\r\n return returnProducts(productSearchResults, context, promise.metadata.count, channelInventoryConfiguration);\r\n}\r\n\r\nexport const actionDataAction = createObservableDataAction({\r\n id: '@msdyn365-commerce-modules/search-result-container/get-full-products-by-collection',\r\n action: action as IAction,\r\n input: createInput\r\n});\r\n\r\nexport default actionDataAction;\r\n","/*--------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * See License.txt in the project root for license information.\r\n *--------------------------------------------------------------*/\r\n\r\n/* eslint-disable no-duplicate-imports */\r\nimport { IProductRefinerHierarchy } from '@msdyn365-commerce/commerce-entities';\r\nimport { IActionContext } from '@msdyn365-commerce/core';\r\nimport { IQueryResultSettings, ProductRefiner, ProductSearchCriteria } from '@msdyn365-commerce/retail-proxy';\r\nimport { getProductSearchRefinersAsync } from '@msdyn365-commerce/retail-proxy/dist/DataActions/ProductsDataActions.g';\r\n\r\n/**\r\n * Uses Bulk refiner API to get refiners and child refiner values.\r\n * @param searchCriteria Product search criteria.\r\n * @param maxItems Max items.\r\n * @param queryResultSettings\r\n * @param ctx Action context.\r\n */\r\nexport async function getProductRefinerHierarchy(\r\n searchCriteria: ProductSearchCriteria,\r\n queryResultSettings: IQueryResultSettings,\r\n ctx: IActionContext\r\n): Promise {\r\n return getProductSearchRefinersAsync({ callerContext: ctx, queryResultSettings }, searchCriteria).then(\r\n (productRefiners: ProductRefiner[]) => {\r\n if (!productRefiners) {\r\n ctx.trace('[getRefinersByCriteriaAction] returned no refiners');\r\n return [];\r\n }\r\n\r\n const result = (productRefiners || []).map((productRefiner: ProductRefiner) => productRefiner);\r\n\r\n if (result.length === 0) {\r\n ctx.trace('[getRefinersByCriteriaAction] returned no IProductRefinerHierarchy objects');\r\n return [];\r\n }\r\n\r\n return result;\r\n }\r\n );\r\n}\r\n","/*--------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * See License.txt in the project root for license information.\r\n *--------------------------------------------------------------*/\r\n\r\nimport MsDyn365, { IRequestContext } from '@msdyn365-commerce/core';\r\nimport { ProductRefinerValue, SortColumn } from '@msdyn365-commerce/retail-proxy';\r\n\r\n/**\r\n * Refiner Compression:\r\n * Refiners contains a non-trivial amount of data that is required to successfully make\r\n * a refiner-based API call. To allow for deep-linking of refiners in the URL, refiner data\r\n * must be compressed so that URL max length is not exceeded. Refiners will be compressed into\r\n * the following array style index-based format:\r\n * [DataTypeValue, LeftValueBoundString, RefinerRecordId, RefinerSourceValue, RightValueBoundString, UnitText].\r\n */\r\nconst compressedRefinerKeys = [\r\n 'DataTypeValue',\r\n 'LeftValueBoundString',\r\n 'RefinerRecordId',\r\n 'RefinerSourceValue',\r\n 'RightValueBoundString',\r\n 'UnitText'\r\n];\r\n\r\n/**\r\n * Hydrates compressed refiner data from URL.\r\n * @param fullUrl The full URL of the page.\r\n * @param requestContext\r\n */\r\nexport const hydrateRefinersFromUrl = (requestContext: IRequestContext): ProductRefinerValue[] => {\r\n const compressedRefinerArray = parseQueryParam<(string | number)[][]>('refiners', requestContext);\r\n if (!compressedRefinerArray || compressedRefinerArray.length === 0) {\r\n return [];\r\n }\r\n\r\n return compressedRefinerArray\r\n .map(compressedRefiner => {\r\n try {\r\n const parsedRefiner: ProductRefinerValue = {};\r\n compressedRefinerKeys.forEach((refinerKey, index) => {\r\n parsedRefiner[refinerKey] = compressedRefiner[index];\r\n });\r\n return parsedRefiner;\r\n } catch {\r\n return undefined;\r\n }\r\n })\r\n .filter(Boolean);\r\n};\r\n\r\n/**\r\n * Compressed a list of refiners for use in URLs.\r\n * @param refiners The uncompressed refiners.\r\n */\r\nexport const compressRefiners = (refiners: ProductRefinerValue[]) => {\r\n const compressedRefiners: (string | number)[][] = [];\r\n\r\n refiners.forEach(refiner => {\r\n const compressedRefiner: (string | number)[] = [];\r\n compressedRefinerKeys.forEach(refinerKey => {\r\n compressedRefiner.push(refiner[refinerKey]);\r\n });\r\n compressedRefiners.push(compressedRefiner);\r\n });\r\n\r\n return compressedRefiners;\r\n};\r\n\r\n/**\r\n * Method which creates a URL contiaining serialized active refiners.\r\n * @param fullUrl The Current URL of the page.\r\n * @param refiners The refiners which should be added to the URL.\r\n * @param sortingColumns\r\n * @param skipCount\r\n */\r\nexport const buildListPageUrl = (fullUrl: URL, refiners?: ProductRefinerValue[], sortingColumns?: SortColumn[], skipCount?: number) => {\r\n // Refiner Change flow\r\n if (refiners !== undefined) {\r\n if (refiners.length === 0) {\r\n fullUrl.searchParams.delete('refiners');\r\n } else {\r\n const sortedRefiners = refiners.sort((first, second) =>\r\n first.RefinerRecordId && second.RefinerRecordId && first.RefinerRecordId > second.RefinerRecordId ? 1 : -1\r\n );\r\n fullUrl.searchParams.set('refiners', JSON.stringify(compressRefiners(sortedRefiners)));\r\n }\r\n\r\n // Adding or removing a refiner means we want to always load page 1\r\n fullUrl.searchParams.delete('skip');\r\n return fullUrl.href;\r\n }\r\n\r\n if (sortingColumns !== undefined) {\r\n if (sortingColumns.length === 0) {\r\n fullUrl.searchParams.delete('sorting');\r\n } else {\r\n fullUrl.searchParams.set('sorting', JSON.stringify(sortingColumns));\r\n }\r\n\r\n // Changing the sort means always load page 1\r\n fullUrl.searchParams.delete('skip');\r\n return fullUrl.href;\r\n }\r\n\r\n if (skipCount) {\r\n fullUrl.searchParams.set('skip', skipCount.toString());\r\n }\r\n\r\n return fullUrl.href;\r\n};\r\n\r\n/**\r\n * Parses a query param from the query object of the request context.\r\n * @param key The query parameter key.\r\n * @param requestContext The request context.\r\n */\r\nexport const parseQueryParam = (key: string, requestContext: IRequestContext): T | null => {\r\n if (requestContext.query && requestContext.query[key]) {\r\n return JSON.parse(decodeURIComponent(requestContext.query[key]));\r\n }\r\n return null;\r\n};\r\n\r\n/**\r\n * Gets the current URL of the page from the request context.\r\n * @param requestContext The request context.\r\n */\r\nexport const getCurrentUrl = (requestContext: IRequestContext): URL => {\r\n if (MsDyn365.isBrowser) {\r\n return new URL(window.location.href);\r\n }\r\n\r\n // NOTE: Typing on requestURL is incorrect\r\n if (requestContext.url.requestUrl.href) {\r\n return new URL(requestContext.url.requestUrl.href);\r\n }\r\n return new URL((requestContext.url.requestUrl));\r\n};\r\n","/**\r\n * Centralised location for checkout generic data updates\r\n */\r\nimport { AttributeValue } from '@msdyn365-commerce/retail-proxy';\r\n\r\n/**\r\n * Gets the CommercialName from a list of attributes - returns the product name if no commercial name attribute is present\r\n * @param attributes\r\n * @param productName\r\n * @param commercialStyleNameAttribute\r\n * @returns\r\n */\r\nexport const getCommercialName = (\r\n attributes: AttributeValue[] = [],\r\n productName: string = '',\r\n commercialStyleNameAttribute: string = 'CommercialStyleName'\r\n): string => {\r\n var styleName = attributes.find(x => x.Name === commercialStyleNameAttribute);\r\n var productBrand = productName?.split(' ')[0] ?? '';\r\n productBrand = productBrand.toUpperCase();\r\n if (styleName?.TextValue) {\r\n return `${productBrand} ${styleName?.TextValue}`;\r\n }\r\n\r\n return productName;\r\n};\r\n","import { SimpleProduct } from '@msdyn365-commerce/retail-proxy';\r\nimport { generateImageUrl } from '@msdyn365-commerce-modules/retail-actions';\r\nimport { ICommerceApiSettings } from '@msdyn365-commerce/core';\r\n\r\nexport const generateImagePath = (itemId: string, colour: string): string => {\r\n return `Products/${itemId}_${colour}_000_001.jpg`;\r\n};\r\n\r\nexport const generateColourImageUrl = (product: SimpleProduct, apiSettings: ICommerceApiSettings): string | undefined => {\r\n const colour = product.Dimensions?.find(item => item.DimensionTypeValue === 1)?.DimensionValue?.Value;\r\n const imageUrl = generateImageUrl(generateImagePath(product.ItemId ?? '', colour ?? ''), apiSettings);\r\n return imageUrl;\r\n};\r\n"],"names":["BaseCollectionInput","constructor","pageType","apiSettings","queryResultSettings","refiners","category","searchText","includeAttributes","isUpdateRefinerPanel","locale","catalogId","getCacheKey","_objectSpread","this","Paging","toJS","Sorting","buildCacheKey","map","refiner","RefinerRecordId","LeftValueBoundString","RightValueBoundString","convertToString","getCacheObjectType","dataCacheType","createBaseCollectionInput","args","inputClassConstuctor","requestContext","urlTokens","query","categoryId","QueryResultSettingsProxy","fromInputData","QueryResultSettings","queryRefiners","hydrateRefinersFromUrl","inputData","config","undefined","_inputData$config","updateRefinerPanel","getUpdateRefinerPanel","getCatalogId","sorting","Columns","JSON","parse","decodeURIComponent","itemId","q","productId","recommendation","stringify","ProductId","Recommendation","Error","InventoryInStockRefinerValueInput","input","inventoryProductAttributeRecordId","arguments","length","super","createObservableDataAction","id","action","async","context","_refiners$find","getProductRefinerHierarchy","Context","ChannelId","channelId","CatalogId","find","RecordId","ProductListInventoryFilteringOptions","GetFullProductsByCollectionInput","returnProducts","productSearchResults","metadataCount","channelInventoryConfiguration","productSearchResultsWithImages","productSearchResult","_context$requestConte","newImageUrl","generateProductImageUrl","_context$requestConte2","PrimaryImageUrl","app","useCommercialStyleName","Name","getCommercialName","AttributeValues","commercialStyleNameAttribute","inventoryLevel","InventoryLevels","threshold","enableStockCheck","products","count","inventoryConfiguration","getInventoryConfigurationAsync","callerContext","expandWithSizeVariants","ArrayExtensions","hasElements","element","InventoryProductAttributeRecordId","inventoryRanges","TextValue","InventoryOutOfStockAttributeValueText","channelInventoryConfigurationId","inventoryAwareSortableAttributeId","ProductAvailabilitySortableAttributeRecordId","mappedProducts","variantLimit","variantProducts","forEach","product","_product$AttributeVal","_product$AttributeVal2","_selectedColor","color","attribute","_attribute$Name","toLowerCase","splittedColor","split","colorSlicing","_attribute$Name2","selectedColor","_isValidJson","colorSlicingData","i","value","item","key","push","sort","a","b","_b$values$length","_b$values","_a$values$length","_a$values","values","slice","_product$ItemId","_color$key","_product$MasterProduc","prod","imageUrl","generateImageUrl","generateImagePath","ItemId","variantsizes","variantColor","variantId","MasterProductId","actionDataAction","_context$requestConte3","_context$requestConte4","_context$requestConte5","_context$requestConte6","_context$requestConte7","promise","searchProductId","searchCriteriaInput","Refinement","IncludeAttributes","SkipVariantExpansion","productListInventoryDisplay","HideOOS","refinerValue","_inventoryRefiner$Val","refinerInput","inventoryRefiner","getInventoryRefinersAction","Values","getInventoryInStockRefinerValueAsync","some","SortOOS","_input$queryResultSet","_input$queryResultSet2","sortColumnName","column","ColumnName","IsDescending","CategoryIds","searchByCriteriaAsync","SearchCondition","searchObject","Number","isNaN","RecommendationListId","Ids","metadata","Top","itemsPerPage","skip","Skip","searchCriteria","ctx","getProductSearchRefinersAsync","then","productRefiners","trace","result","productRefiner","compressedRefinerKeys","compressedRefinerArray","parseQueryParam","compressedRefiner","parsedRefiner","refinerKey","index","_unused","filter","Boolean","buildListPageUrl","fullUrl","sortingColumns","skipCount","searchParams","delete","sortedRefiners","first","second","set","compressedRefiners","compressRefiners","href","toString","getCurrentUrl","MsDyn365","isBrowser","URL","window","location","url","requestUrl","_productName$split$","attributes","productName","styleName","x","productBrand","toUpperCase","colour","generateColourImageUrl","_product$Dimensions","Dimensions","DimensionTypeValue","DimensionValue","Value"],"sourceRoot":""}