{"version":3,"file":"static/js/97388b47c9faef260c40.bundle.js","mappings":";mJAcYA,4TAAZ,SAAYA,GACRA,EAAAA,EAAA,qBACAA,EAAAA,EAAA,uBAFJ,CAAYA,IAAAA,EAAW,KAuEjB,SAAUC,EAAuBC,EAAqCC,GACxE,MAAMC,EAAcD,EAAQE,cAAcC,MAAQH,EAAQE,cAAcC,MAAQH,EAAQE,cAAcE,MAMtG,OAJIL,GACAA,EAAiBM,WACjBN,EAAiBM,UAAUC,uBAC3BP,EAAiBM,UAAUC,sBAAsBL,EAAcD,EAAQE,eAiBxE,IAAKK,GAAZ,SAAYA,GACRA,EAAA,sCACAA,EAAA,kDACAA,EAAA,iCACAA,EAAA,wCACAA,EAAA,8CACAA,EAAA,uCACAA,EAAA,uCACAA,EAAA,oBACAA,EAAA,+BACAA,EAAA,kCACAA,EAAA,kCACAA,EAAA,qBACAA,EAAA,6BACAA,EAAA,mCACAA,EAAA,iCACAA,EAAA,mBACAA,EAAA,0BACAA,EAAA,8BACAA,EAAA,wBACAA,EAAA,YACAA,EAAA,iCACAA,EAAA,gBACAA,EAAA,mCACAA,EAAA,2DACAA,EAAA,uBACAA,EAAA,2BACAA,EAAA,gBACAA,EAAA,oBACAA,EAAA,iBACAA,EAAA,iBACAA,EAAA,mBACAA,EAAA,iCACAA,EAAA,uCACAA,EAAA,sCACAA,EAAA,0CACAA,EAAA,0CACAA,EAAA,wCACAA,EAAA,kCACAA,EAAA,qBACAA,EAAA,wBACAA,EAAA,YACAA,EAAA,0BACAA,EAAA,2CACAA,EAAA,qCACAA,EAAA,oDACAA,EAAA,sCACAA,EAAA,2BACAA,EAAA,YACAA,EAAA,oBACAA,EAAA,6BACAA,EAAA,wBACAA,EAAA,2BACAA,EAAA,8BACAA,EAAA,gCACAA,EAAA,+BACAA,EAAA,oCACAA,EAAA,uBACAA,EAAA,yBACAA,EAAA,gDACAA,EAAA,qBACAA,EAAA,6BACAA,EAAA,gBA9DJ,CAAYA,IAAAA,EAAiB,KAoG7B,IAAqBC,EAAmBC,EAAxC,cAAiDC,EAAAA,cA2C7CC,YAAYC,GAAgC,IAAAC,EAAAC,EAAAC,EAAAC,EACxCC,MAAML,GA/BO,KAAAM,SAA8CR,EAAAA,YAiJ9C,KAAAS,aAAe,KAE5B,MAUMC,EAxUWR,CAAAA,IAAuB,IAAAS,EAC5C,MAAM,QAAEC,EAAO,QAAEC,GAAYX,EAC7B,OAAQU,GACJ,KAAKzB,EAAY2B,QACb,GAAIC,EAAAA,GAASC,WAAaC,OAAOC,WAAY,CACzC,MAAMC,EAAeN,MAAAA,OAAO,EAAPA,EAASM,aAC9B,GAAIA,EACA,OAAIA,EAAaC,IAAMH,OAAOC,YAAcC,EAAaC,GAAGC,EACjD,KACAF,EAAaG,IAAML,OAAOC,YAAcC,EAAaG,GAAGD,EACxD,KACAF,EAAaI,IAAMN,OAAOC,YAAcC,EAAaI,GAAGF,EACxD,KACAF,EAAaK,IAAMP,OAAOC,YAAcC,EAAaK,GAAGH,EACxD,KAEJ,KAIf,MAAO,KACX,KAAKlC,EAAYsC,SAEb,MAD2C,YAA1BZ,MAAAA,GAAe,QAARF,EAAPE,EAASa,cAAM,IAAAf,OAAA,EAAfA,EAAiBgB,MAAoB,KAAO,KAEjE,QACI,MAAO,OA+SWC,CAAS,CAAEhB,QAASzB,EAAY2B,QAASD,QAV/C,CACZM,aAAc,CACVC,GAAI,CAAEC,EAAG,KACTC,GAAI,CAAED,EAAG,KACTE,GAAI,CAAEF,EAAG,MACTG,GAAI,CAAEH,EAAG,MACTQ,GAAI,CAAER,EAAG,UAKjB,MAAyB,OAAlBX,GAA4C,OAAlBA,GAkFpB,KAAAoB,aAAe,KAEI,KAA5BC,KAAKC,MAAMC,cACXF,KAAKG,SAAS,CAAED,aAAc,MAGlC,MAAME,EAAeC,WAAWL,KAAKC,MAAMC,cAE3C,GAAII,MAAMF,GAENJ,KAAKG,SAAS,CAAED,aAAcF,KAAKO,UAAUC,QAAQ,SAClD,CACH,IAAIC,EAAaC,KAAKC,IAAIX,KAAK7B,MAAMyC,IAAKF,KAAKE,IAAIZ,KAAKO,UAAWH,IAG/DJ,KAAKa,wBAA0BJ,EAAaT,KAAKa,wBAA2B,IAC5EJ,EAAaC,KAAKI,KAAKL,EAAaT,KAAKa,wBAA0Bb,KAAKa,wBAGxEJ,IAAeL,GACfJ,KAAKG,SAAS,CAAED,aAAcO,EAAWD,QAAQ,OAnOzD,IAAIO,EAAc/C,EAAoBgD,aAAaL,IAC/CM,EAAcjD,EAAoBgD,aAAaJ,IAC/CM,EAAqBlD,EAAoBgD,aAAaE,mBAE/B,IAAAC,EAAAC,EArOFC,EAAmB/D,EAAqCK,EAAeD,EAqO5FS,EAAMmD,kBACNP,EAAmD,QAAxCI,EAAGhD,EAAMmD,gBAAgBC,uBAAe,IAAAJ,EAAAA,EAAInD,EAAoBgD,aAAaL,IACxFO,EAA6D,QAA3CE,EAAGjD,EAAMmD,gBAAgBE,0BAAkB,IAAAJ,EAAAA,EAAIpD,EAAoBgD,aAAaE,oBAGtGlB,KAAKC,MAAQ,CACTwB,YAAY,EACZvB,aAAc/B,EAAMmD,gBACdP,EAAc,EACVA,EAAYP,QAAQ,GACpBU,EAAqB,EACrBA,EAAmBV,QAAQ,GAC3B,OAC0B,QADpBpC,EACQ,QADRC,EACVF,EAAMuD,oBAAY,IAAArD,OAAA,EAAlBA,EAAoBmC,QAAQ,UAAE,IAAApC,EAAAA,EAAI,QAE5C4B,KAAK2B,aAAe3B,KAAK2B,aAAaC,KAAK5B,MAC3CA,KAAK6B,aAAe7B,KAAK6B,aAAaD,KAAK5B,MAC3CA,KAAK8B,cAAgB9B,KAAK8B,cAAcF,KAAK5B,MAC7CA,KAAKzC,SAvPoB8D,EAuPO,QAvPY/D,EAuPH0C,KAAK7B,MAAMb,iBAvP6BK,EAuPV,GApPjD,CACtBoE,gBAAiBV,EACjB5D,cAAe,CACXuE,OALS1E,GAAoBA,EAAiB2E,SAAW3E,EAAiB2E,SAAW,GAMrFC,MALW5E,GAAoBA,EAAiB6E,WAAa7E,EAAiB6E,WAAa,GAM3FxE,MAAAA,EACAD,MAAAA,EACA0E,MAAOf,KA8OXrB,KAAKO,UAAuB,QAAdjC,EAAGyC,SAAW,IAAAzC,EAAAA,EAAIN,EAAoBgD,aAAaL,IACjEX,KAAKqC,UAAYpB,MAAAA,EAAAA,EAAejD,EAAoBgD,aAAaJ,IACjEZ,KAAKa,uBAA2C,QAArBtC,EAAG2C,SAAkB,IAAA3C,EAAAA,EAAIP,EAAoBgD,aAAaE,mBAtDlF,gCACH/C,EACA8B,GAAgC,IAAAqC,EAEhC,MAAMC,uWAASC,CAAA,GAAQvC,GAEnB9B,EAAMsE,WAAaxC,EAAMwB,aACzBc,EAAUd,YAAa,GAG3B,IAAIiB,EAAerC,WAAWJ,EAAMC,cAQlC,IAAAyC,IALIxE,EAAMsE,UAAYxC,EAAMwB,YACO,QAAhCa,EAACnE,EAAMyE,iCAAyB,IAAAN,GAAAA,GACZ,IAAjBI,GACAvE,EAAMuD,cACNvD,EAAMuD,aAAe1D,EAAoBgD,aAAaL,OAE1D+B,EAAiC,QAArBC,EAAGxE,EAAMuD,oBAAY,IAAAiB,EAAAA,EAAI,EACrCJ,EAAUd,YAAa,GAG3B,OAAOc,EAkCJM,SAAM,IAAAC,EAAAC,EACT,MAAMC,EAAgBhD,KAAKC,MAAMC,aAC3B+C,EAA8B,GAAGjD,KAAK7B,MAAM+E,+CAC5CC,EAA6B,GAAGnD,KAAK7B,MAAMiF,+CAC3CC,EAAqBhD,WAAW2C,GAAiBhD,KAAKa,uBACtDyC,EAAoBjD,WAAW2C,IAAkBhD,KAAKO,UAAY,GAAKP,KAAK7B,MAAMoF,YAAqC,IAAvBF,EAChGG,EAAoBnD,WAAW2C,IAAkBS,OAAOzD,KAAKqC,YAAcrC,KAAK7B,MAAMoF,WACtFnD,EAAeC,WAAW2C,GAChChD,KAAKzC,QAAQE,cAAcE,MAAQG,EAAkB4F,kBACrD,MAAMC,EAAsBtG,EAAuB2C,KAAK7B,MAAMb,iBAAmB0C,KAAKzC,SACtFyC,KAAKzC,QAAQE,cAAcE,MAAQG,EAAkB8F,kBACrD,MAAMC,EAAsBxG,EAAuB2C,KAAK7B,MAAMb,iBAAmB0C,KAAKzC,SAChFuG,EAAiB,GAAoC,QAApChB,EAAG9C,KAAK7B,MAAM4F,8BAAsB,IAAAjB,EAAAA,EAAI,MAAMzC,WAAW2C,KAEhF,IAAIgB,EAAsB,GACtBV,EAEAU,EAAsB,WACfhE,KAAK7B,MAAMsE,WAElBuB,EAAsB,cAE1B,IAAIC,EAAsB,GAS1B,OARIT,EAEAS,EAAsB,WACfjE,KAAK7B,MAAMsE,WAElBwB,EAAsB,cAItBhG,EAAAA,cAAAA,EAAAA,SAAA,KACIA,EAAAA,cAAA,OAAKiG,UAAU,WAAWC,GAAInE,KAAK7B,MAAMgG,IACrClG,EAAAA,cAAA,SAAAmG,OAAAC,OAAA,CACI5B,SAAUzC,KAAK7B,MAAMsE,UAAYa,EACjCgB,MAAOhB,EAAoB,GAAKtD,KAAK7B,MAAMoG,yBAC3CL,UAAW,gCAAgCF,IAC3CQ,QAASxE,KAAK6B,aAAY,gBACXyB,EAAiB,aACpB,GAAGtD,KAAK7B,MAAMoG,2BAC1BE,MAAM,aACFd,GAEJ1F,EAAAA,cAAA,QAAMiG,UAAWjB,KAErBhF,EAAAA,cAAA,SACIyG,KAAK,OACLR,UAAU,iBACVS,MAAO3B,EACP4B,SAAU5E,KAAK8B,cACf+C,OAAQ7E,KAAKD,aAAY,YACf,SAAQ,aACNC,KAAKtB,eAAiBoF,EAAiB,GAAoC,QAApCf,EAAG/C,KAAK7B,MAAM4F,8BAAsB,IAAAhB,EAAAA,EAAI,KAC3F+B,KAAK,aAAY,gBACF9E,KAAKO,UAAS,gBACdP,KAAKqC,UAAS,gBACdjC,EACf2E,IAAK/E,KAAKvB,SACVgE,SAAUzC,KAAK7B,MAAMsE,SACrB9B,IAAKX,KAAKO,UACVK,IAAKZ,KAAKqC,YAEdpE,EAAAA,cAAA,SAAAmG,OAAAC,OAAA,CACI5B,SAAUzC,KAAK7B,MAAMsE,UAAYe,EACjCc,MAAOd,EAAoB,GAAKxD,KAAK7B,MAAM6G,yBAC3Cd,UAAW,gCAAgCD,IAC3CO,QAASxE,KAAK2B,aAAY,gBACX6B,EAAiB,aACpB,GAAGxD,KAAK7B,MAAM6G,2BAC1BP,MAAM,aACFZ,GAEJ5F,EAAAA,cAAA,QAAMiG,UAAWf,OA2B7BxB,eACJ,IAAIsD,GAAiB,EACrB,MAAMC,EAAe7E,WAAWL,KAAKC,MAAMC,cAE3C,IAAIiF,EAEAD,EAAelF,KAAK7B,MAAMyC,KAC1BqE,GAAiB,EACjBE,EAAkBD,EAAe,IAEjCD,GAAiB,EACjBE,EAAkBnF,KAAK7B,MAAMyC,KAG7BZ,KAAKa,wBAA0BsE,EAAkBnF,KAAKa,wBAA2B,IACjFsE,EAAkBzE,KAAKI,KAAKqE,EAAkBnF,KAAKa,wBAA0Bb,KAAKa,wBAGlFoE,GAAkBjF,KAAK7B,MAAMyG,UACzB5E,KAAK7B,MAAMyG,SAASO,IACpBnF,KAAKG,SAAS,CAAED,aAAciF,EAAgB3E,QAAQ,KAK1DqB,eACJ,IAAIoD,GAAiB,EACrB,MAAMC,EAAe7E,WAAWL,KAAKC,MAAMC,cAC3C,IAAIiF,EAEAD,EAAelF,KAAKO,WACpB0E,GAAiB,EACjBE,EAAkBD,EAAe,IAEjCD,GAAiB,EACjBE,EAAkBnF,KAAKO,WAGvBP,KAAKa,wBAA0BsE,EAAkBnF,KAAKa,wBAA2B,IACjFsE,EAAkBzE,KAAK0E,MAAMD,EAAkBnF,KAAKa,wBAA0Bb,KAAKa,uBAC/EsE,EAAkBnF,KAAKO,YACvB4E,EAAkBnF,KAAKO,YAI3B0E,GAAkBjF,KAAK7B,MAAMyG,UACzB5E,KAAK7B,MAAMyG,SAASO,IACpBnF,KAAKG,SAAS,CAAED,aAAciF,EAAgB3E,QAAQ,KAK1DsB,cAAcuD,GAClB,IAAIV,EAAQU,EAAEC,OAAOX,MAGrB,GAAc,KAAVA,EACA3E,KAAKG,SAAS,CAAED,aAAc,UAC3B,GAAI,yBAAyBqF,KAAKZ,GAAQ,CAE7C,MAAMa,EAAiBb,EAAMc,QAAQ,IAAK,KAC1CzF,KAAKG,SAAS,CAAED,aAAcsF,IAE9BE,GAAAA,EAAS,KACL1F,KAAK7B,MAAMyG,UAAY5E,KAAK7B,MAAMyG,SAASvE,WAAWL,KAAKC,MAAMC,eAEjE,MAAMyF,EACF3F,KAAKvB,UAAYuB,KAAKvB,SAASmH,SAAW5F,KAAKvB,SAASmH,mBAAmBC,kBAAoB7F,KAAKvB,SAASmH,QAC7GD,IACAA,EAAaG,aAAa,gBAAiB9F,KAAKC,MAAMC,cACtDyF,EAAaG,aAAa,QAAS9F,KAAKC,MAAMC,iBAEnD,IATHwF,MA5OM3H,EAAAiD,aAAmD,CAC7DL,IAAK,EACLC,IAAK,IACLM,mBAAoB,IACpBgC,oBAAqB,eACrBE,oBAAqB,eANRrF,EAAmBC,GAAA+H,EAAAA,EAAAA,IAAA,CADvCC,EAAAA,IACoBjI,wHC1MrB,MA2CA,EA3CuBkI,IAAgI,IAAAC,EAAA,IAA/H,QAAEC,EAAO,MAAEC,EAAK,QAAEtH,EAAO,OAAEuH,GAAgGJ,EAC/I,MAAMK,EAAaH,GAAUI,EAAAA,EAAAA,uBAAkC,QAAbL,EAACC,EAAQK,YAAI,IAAAN,EAAAA,EAAI,GAAIC,EAAQM,SAAU3H,EAAQ4H,mBAAeC,GAAa,IACtHC,EAAaC,IAAkBC,EAAAA,EAAAA,WAAS,GACzCC,EAASX,EAAQ,EAEjBY,EAAiBC,IACnBJ,EAAeI,IAGnB,OACIhJ,IAAAA,cAAAA,IAAAA,SAAA,KACIA,IAAAA,cAAA,QACIiG,UAAU,iCACVC,GAAI,WAAWiC,IACfc,aAAcA,IAAMF,GAAc,GAClCG,aAAcA,IAAMH,GAAc,GAClCI,MAAO,CAAEC,SAAU,WAAYN,OAAQA,GACvCvC,QAASA,IAAMtF,OAAOoI,SAASC,KAAOjB,GAE1B,cAAXD,EAAyBpI,IAAAA,cAAA,QAAMiG,UAAU,oCAAmCjG,IAAAA,cAAA,OAAKiG,UAAU,oBAAoBsD,IAAKrB,EAAQsB,gBAAiBC,IAAKvB,EAAQK,OAAQvI,IAAAA,cAAA,QAAMiG,UAAU,8BAA6BjG,IAAAA,cAAA,KAAGsJ,KAAMjB,GAAaH,EAAQK,QAC7OvI,IAAAA,cAAA,QAAMiG,UAAU,8BAA6BjG,IAAAA,cAAA,KAAGsJ,KAAMjB,GAAaH,EAAQK,QAEhFvI,IAAAA,cAAC0J,EAAAA,EAAO,CACJzD,UAAU,sBACV0D,UAAU,SACVC,OAAQjB,EACRtB,OAAQ,WAAWc,IACnB0B,OAAQA,IAAMd,GAAeJ,GAC7BQ,MAAO,CAAEL,OAAQA,EAAS,IAE1B9I,IAAAA,cAAC8J,EAAAA,EAAa,MACd9J,IAAAA,cAAC+J,EAAAA,EAAW,CACR9D,UAAU,4BACVgD,aAAcA,IAAMF,GAAc,GAClCG,aAAcA,IAAMH,GAAc,IAElC/I,IAAAA,cAAA,OAAKiG,UAAU,6BAA6BsD,IAAKrB,EAAQsB,gBAAiBC,IAAKvB,EAAQK,8aC2C3G,SAASyB,EAAyBC,EAA2BC,GAAiC,IAAAC,EAAAC,EAC1F,IAAKF,IAAgBA,EAAYG,gBAC7B,OAAO,KAGX,MACMC,EADcL,EACkCM,IAAIC,OAAOF,kCAE3DG,EAEL,QAFsBN,EAAGD,EAAYG,gBAAgBK,MAClDC,IAAc,IAAAC,EAAA,OAA0B,QAAtBA,EAAAD,EAAeE,eAAO,IAAAD,OAAA,EAAtBA,EAAwBE,uBAAwBR,YACrE,IAAAH,OAAA,EAFyBA,EAEvBY,SAEH,IAAKC,EAAAA,gBAAgBC,YAAYR,GAC7B,OAAO,KAIX,OAD6E,QAA1DL,EAAGK,EAAkBC,MAAKQ,IAA2B,IAAnBA,EAAKC,mBAAmB,IAAAf,EAAAA,EAAIK,EAAkB,GA2BvG,SAASW,EAAiBC,EAA+BpB,EAA2BqB,GAChF,MAAMC,EAAY,IAAIC,IAAIH,EAAuBpB,EAAYwB,QAAQC,YAAYC,SAC7EJ,EAAUK,OACVL,EAAUK,QAAU,IAAIN,IAExBC,EAAUK,QAAUN,EAIxB,OADmB,IAAIE,IAAID,EAAUjC,MACnBuC,SAAWN,EAAUK,OAQ3C,SAASE,EAA2BC,GAChC,OAAKA,EAID/L,IAAAA,cAAA,OAAKiG,UAAU,gCACXjG,IAAAA,cAAA,YAAO+L,IAJJ,KA2Vf,SAASC,EACLC,EACAC,EACAC,EACAC,EACAC,EACAC,GAEA,MAAMC,EAA2BC,EAAmBH,EAAaC,MAAAA,EAAAA,EAA4B,IAC7F,MAAO,GAAGL,MAAAA,EAAAA,EAAQ,MAAMC,MAAAA,EAAAA,EAAS,MAAMO,EAAmBN,EAAQC,KAC9DG,EAA2B,IAAIA,IAA6B,KAQpE,SAASE,EAAmBN,EAAiBO,GACzC,GAAIP,GAAUO,EAAiB,CAC3B,MAAMC,EAAgBR,EAAO5J,QAAQ,GACrC,OAAOqK,EAAAA,EAAAA,QAAOF,GAAmB,GAAIC,EAAe,KAExD,MAAO,GAGX,SAASH,EAAmBH,EAAsBC,GAC9C,OAAID,GAAeC,GACRM,EAAAA,EAAAA,QAAON,GAA4B,GAAID,GAE3C,GAmCX,SAASQ,EACLhM,EACAiM,EACA5G,EACA6G,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,GAEA,MAAMpF,EAAyB,CAE3BqF,iBAAkBR,EAAoBS,gBAAkBC,EAAAA,YAAYC,OAASD,EAAAA,YAAYE,YAGvFzB,EAAsBoB,MAAAA,EAAAA,EAAgB,CACxCM,UAAWb,EAAoBa,UAC/BC,cAAed,EAAoBe,MACnCC,wBAAyBhB,EAAoBe,MAC7CE,gBAAiBjB,EAAoBiB,gBAAkBjB,EAAoBiB,gBAAkBjB,EAAoBe,MACjHG,gBAAiBlB,EAAoBkB,gBAAkBlB,EAAoBkB,gBAAkBlB,EAAoBe,OAGrH,OACI9N,IAAAA,cAACkO,EAAAA,eAAc,CACXrN,QAASA,EACTqF,GAAIA,EACJ4G,SAAUA,EACV5E,QAASA,EACTiG,KAAM,CAAEjC,MAAAA,GACRc,YAAaA,EACbC,cAAeA,EACfC,kBAAmBA,EACnBE,qBAAsBA,EACtBC,eAAgBA,IAK5B,SAASe,EACLC,EACAlN,EACAmN,EACAC,EACAC,EACA3N,GAAsC,IAAA4N,EAEtC,IAAKH,IAAanN,IAAiBkN,EAC/B,OAAO,KAGX,MAAMK,EAAgB7N,MAAAA,GAAmB,QAAZ4N,EAAP5N,EAAS0J,IAAIC,cAAM,IAAAiE,OAAA,EAAnBA,EAAqBE,qBAE3C,IAAIC,EAAsBL,EADIG,GAEDH,IACzBK,EAAsB,GAAGL,KAHCG,KAK9B,MAAMG,EAAkB,CACpBtF,IAAK+E,EACLE,QAASA,GAAoB,GAC7BM,YAAaF,GAEXG,EAAa,CACf5N,aAAAA,EACAkN,cAAAA,GAGJ,OADAU,EAAWV,cAAcW,iBAAkB,EAEvChP,IAAAA,cAACiP,EAAAA,GAAK9I,OAAAC,OAAA,CACF8I,eAAgBrO,MAAAA,OAAO,EAAPA,EAAS4H,cAAcyG,gBACnCL,EACAE,EAAU,CACdI,oBAAoB,QACpBC,qBAAmB,KAKxB,MAAMC,EAAoEC,EAAAA,GAAiBC,wBAEhG,+WAAShL,CAAA,CAAIiL,UA5auCxH,IAsBjD,IAAAC,EAAAwH,EAAAC,EAAAC,EAAA,IAtBkD,KACnDxB,EAAI,QACJtN,EAAO,cACPwN,EAAa,YACbrB,EAAW,cACXC,EAAa,kBACbC,EAAiB,iBACjBC,EAAgB,gBAChBT,EAAe,qBACfkD,EAAoB,UACpBC,EAAS,SACT/C,EAAQ,GACR5G,EAAE,iBACF7G,EAAgB,gBAChByQ,EAAe,wBACfC,EAAuB,4BACvBC,EAA2B,qBAC3B5C,EAAoB,eACpBC,EAAc,eACd4C,EAAc,wBACdC,EAAuB,oBACvBC,GACHnI,EACG,MAAME,EAAUiG,EAAKjG,QACfoF,EAAea,EAAKb,aAE1B,IAAIjF,GAAaC,EAAAA,EAAAA,uBAAmC,QAAdL,EAACC,MAAAA,OAAO,EAAPA,EAASK,YAAI,IAAAN,EAAAA,EAAI,GAAqB,QAAnBwH,EAAEvH,MAAAA,OAAO,EAAPA,EAASM,gBAAQ,IAAAiH,EAAAA,EAAIjK,OAAO4K,UAAWvP,EAAQ4H,mBAAeC,GACtHmH,IACAxH,EAAa+C,EAAiB/C,EAAYxH,EAAS,cAEvD,MAAMwP,EAAiF,QAAxDX,EArInC,SAA6CzF,EAA2BC,GACpE,MAAMoG,EAAgBtG,EAAyBC,EAAaC,GACtDqG,EAAyBD,MAAAA,OAAa,EAAbA,EAAeE,iBAC9C,OAAKxF,EAAAA,gBAAgBC,YAAYsF,IAI1BE,EAAAA,EAAAA,kBAAiBF,EAAuB,GAAItG,EAAYwB,QAAQC,aAH5DxB,MAAAA,OAAW,EAAXA,EAAaV,gBAiIUkH,CAAoC7P,EAASqH,UAAQ,IAAAwH,EAAAA,EAAIxH,MAAAA,OAAO,EAAPA,EAASsB,gBAC9FmH,EAA2F,QAAnEhB,EAjDlC,SACI1F,EACA5B,EACA6B,GAEA,MAAMoG,EAAgBtG,EAAyBC,EAAaC,GAC5D,OAAKoG,MAAAA,GAAAA,EAAeM,YASbxF,EAAiB/C,EAAY4B,EADhB,GAJAA,EACkCM,IAAIC,OAAOF,qCAEtCuG,mBAAmBP,EAAcM,gBANjDvI,EA0CsByI,CAAmCjQ,EAASwH,EAAYH,UAAQ,IAAAyH,EAAAA,EAAItH,GAC9F0I,EAAgBC,IAAqBnI,EAAAA,EAAAA,UAAiB8H,IACtDM,EAAiBC,IAAsBrI,EAAAA,EAAAA,UAA6BwH,GAC3ErQ,IAAAA,WAAgB,KACZgR,EAAkBL,GAClBO,EAAmBb,KACpB,CAAChI,EAAYsI,EAA0BN,IAC1C,MAAOc,IAAuBtI,EAAAA,EAAAA,UAAS,IAAIuI,EAAAA,YAErCC,EAAmBxQ,EAAQ0J,IAAIC,OAAO6G,iBAGtC/G,EADczJ,EACkC0J,IAAIC,OAAOF,kCAO3DgH,EAAwBtR,IAAAA,aAC1B,CAACiK,EAA2BsH,KACxB,MAAMC,EAAgBD,EAAWC,cAEjC,GADAL,EAAoBM,SAASD,EAAeD,GACxCG,EAAAA,iBAAiBC,mBAAmBJ,EAAW7K,OAC/C,OAEJ,MAAM4E,EAAc,GAAGkG,KAAiBD,EAAW7K,QACnD,IAAIkL,EAA2B,GAC/B,GAAIb,EAAec,SAASL,GAAgB,CACxC,MAAMM,EAAS,IAAItG,IAAIuF,EAAgB9G,EAAYwB,QAAQC,YAAYC,SACvEmG,EAAOC,aAAaC,OAAOR,GAC3BI,EAA2BxG,EAAiB0G,EAAOG,WAAYpR,EAASyK,QAExEsG,EAA2BxG,EAAiB2F,EAAgBlQ,EAASyK,GAGzE,GADA0F,EAAkBY,GACdJ,IAAkBlH,EAAmC,CACrD,MAAM4H,EAAwBlH,EAAAA,gBAAgBC,YAAYsG,EAAWY,kBAC/DZ,EAAWY,iBAAiB,QAC5BzJ,EACA0J,GAAc3B,EAAAA,EAAAA,kBAAiByB,EAAuBjI,EAAYwB,QAAQC,aAChFwF,EAAmBkB,MAG3B,CAACjB,EAAqBtQ,EAASkQ,IAGnC,IAAK7I,EACD,OAAO,KA8FX,MAAM5I,GAAU+S,EAAAA,EAAAA,kBAAiB,QAAShT,EAAmB,GAAI6I,EAAQM,SAASyJ,YAE5EK,IAAYlT,EAAAA,EAAAA,wBAAuBC,EAAmBC,GAGtDiT,GAAyB1R,EAAQ0J,IAAIC,QAA0D,oBAAhD3J,EAAQ0J,IAAIC,OAAOgI,yBAExE,OACIxS,IAAAA,cAAAA,IAAAA,SAAA,KACKgQ,EACGhQ,IAAAA,cAAA,IAAAmG,OAAAC,OAAA,CACIkD,KAAMyH,EACNxK,SAASkM,EAAAA,EAAAA,kBAAiBpT,EAAmBC,EAAS4I,EAAQK,MAAM,aACxDyD,EACR9D,EAAQK,KACR1H,EAAQ6R,iBAAiBC,eAAezK,EAAQ4F,OAChD5F,EAAQ0K,cACRlG,EACAxE,EAAQ2K,aACRjD,GAEJ3J,UAAU,eACNqM,IAEJtS,IAAAA,cAAA,OAAKiG,UAAU,mCACXjG,IAAAA,cAAA,OAAKiG,UAAU,sBACVmI,EACGC,EACAxN,EAAQ4K,QAAQtK,aAChB8P,EACA/I,EAAQsB,gBACRtB,EAAQK,KACR1H,IAGRb,IAAAA,cAAA,OAAKiG,UAAU,kCACXjG,IAAAA,cAAA,MAAIiG,UAAU,4BAA4BiC,EAAQK,MACjDsE,EACGhM,EACAiM,EACA5G,EACAgC,EACA8E,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,GAEHiF,IAA0BzG,EAA2B5D,EAAQ4K,uBAuE/DC,GAtEoB7K,EAAQ8K,YAuE5ChT,IAAAA,cAAA,KAAGiG,UAAU,qBAAqB8M,QAlE7B/S,IAAAA,cAAA,IAAAmG,OAAAC,OAAA,CACIkD,KAAMyH,EACNxK,SAASkM,EAAAA,EAAAA,kBAAiBpT,EAAmBC,EAAS4I,EAAQK,MAAM,aACxDyD,EACR9D,EAAQK,KACR1H,EAAQ6R,iBAAiBC,eAAezK,EAAQ4F,OAChD5F,EAAQ0K,cACRlG,GAEJzG,UAAU,eACNqM,IAEJtS,IAAAA,cAAA,OAAKiG,UAAU,sBACVmI,EACGC,EACAxN,EAAQ4K,QAAQtK,aAChB8P,EACA/I,EAAQsB,gBACRtB,EAAQK,KACR1H,IAGRb,IAAAA,cAAA,OAAKiG,UAAU,wBACXjG,IAAAA,cAAA,MAAIiG,UAAU,sBAAsBiC,EAAQK,MAC3CsE,EACGhM,EACAiM,EACA5G,EACAgC,EACA8E,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,GAEHiF,IAA0BzG,EAA2B5D,EAAQ4K,yBApKjDG,GAwKA/K,EAAQmC,iBAlKjCrK,IAAAA,cAAA,OAAKiG,UAAU,2BACVgN,GAAgBC,KAAKhI,IAAwB,IAAAiI,EAAAC,EAAAC,EAAAC,EAC1C,MAAMC,EAAsD,QAApCJ,EAAe,QAAfC,EAAGlI,EAAKL,eAAO,IAAAuI,OAAA,EAAZA,EAActI,2BAAmB,IAAAqI,EAAAA,EAAI,GAChE,IAxBhB,SAAgC3B,GAC5B,MACMgC,EADoB3S,EACiC0J,IAAIC,OAAOiJ,wBACtE,OACIzI,EAAAA,gBAAgBC,YAAYuI,KAC3BA,EAAiC3B,SAAS6B,EAAAA,eAAeC,OAC1DH,EAAiC3B,SAASL,EAAc1G,qBAkB3C8I,CAAuBL,GACxB,OAAO,KAGX,MACMjJ,EADczJ,EACkC0J,IAAIC,OAAOF,kCAC3DkH,EAAgB+B,EAChBM,EAiBA,QAjBQR,EACG,QADHC,EACVpI,EAAKH,gBAAQ,IAAAuI,OAAA,EAAbA,EAAeJ,KAAiB3B,IAAa,IAAAuC,EAAAC,EAAAC,EAAAC,EACzC,MAAO,CACHC,OAAQ,GAAgB,QAAhBJ,EAAG5I,EAAK1C,gBAAQ,IAAAsL,EAAAA,EAAI,MAAMP,KAA4C,QAA1BQ,EAAIxC,EAAWX,mBAAW,IAAAmD,EAAAA,EAAI,KAClFrN,MAA6B,QAAxBsN,EAAEzC,EAAWX,mBAAW,IAAAoD,EAAAA,EAAI,GACjCxC,cAAAA,EACA2C,aAAc5C,EAAW6C,mBACzB9F,SAAUiD,EAAW8C,eACrBlC,iBAAkBZ,EAAWf,iBAC7B8D,UAAW/C,EAAWpG,UACtBgF,oBAAqBA,GAAsBvD,EAAAA,EAAAA,QAAOuD,EAAqBqB,GAAiB,GACxF+C,WACIlD,IACAnB,MAAAA,GAEC,QAFsB+D,EAAvB/D,EAAyBxF,MACrB8J,IAAqB,IAAAC,EAAA,OAAID,EAAsB9N,SAAiC,QAA5B+N,EAAMlD,EAAWX,mBAAW,IAAA6D,EAAAA,EAAI,cACvF,IAAAR,OAAA,EAFDA,EAEGM,uBAEb,IAAAlB,EAAAA,EAAI,GAQV,OANI7B,IAAkBlH,GAClBU,EAAAA,gBAAgBC,YAAY4I,KAC3BA,EAASa,MAAKC,GAAUA,EAAOL,cAEhCT,EAAS,GAAGS,WAAY,GAGxBtU,IAAAA,cAAC4U,EAAAA,gCAA+B,CAC5B/T,QAASA,EACTgT,SAAUA,EACVgB,kBAAmBvD,EACnBwD,IAAK5J,EAAK1C,eA5CnB,MAuKL3H,EAAQ0J,IAAIC,OAAOuK,YA0CjC,SACI9K,EACA+K,EACAC,EACAC,EACAC,EACAC,EACAxF,GAEA,IAAKsF,EACD,OAAO,KAGX,MAAMG,GAAgBF,MAAAA,OAAY,EAAZA,EAAclD,kBAAcvJ,EAC5C0D,EAAsBK,EAAmByI,EAAWE,GACpD9I,EAA2BE,EAAmBhH,OAAO6P,GAAgBzF,GAE3E,OACI5P,IAAAA,cAACsV,EAAAA,gBAAe,CACZzU,QAASoJ,EACT/D,GAAI+O,EACJnI,SAAUkI,EACVE,UAAWA,EACXK,YAAaF,EACbG,UAAQ,EACRJ,UAAWhJ,EACXwD,qBAAsBtD,EACtB6B,KAAM,KApEFsH,CAAa5U,EAASiM,EAAU5G,EAAIgC,EAAQ0K,cAAe1K,EAAQ2K,aAAcnG,EAAiBkD,IArU/E8F,GAsUIzF,IArU+B,KAA/ByF,GAK/B1V,IAAAA,cAAA,OAAKiG,UAAU,6BACXjG,IAAAA,cAAA,YAAO0V,KALJ,KAqUF5F,GAtHT,SAAyB6F,EAA4BzK,GACjD,GAAkB,OAAdyK,EACA,OAEJ,MAAMC,EAAyCzE,EAAoB0E,YAAY3C,KAAsBW,IAC1F,CACHiC,oBAAoBC,EAAAA,EAAAA,4CAA2ClC,EAASrC,eACxEwE,eAAgB,CACZxN,SAAU,EACVyN,MAAOpC,EAASnN,WAI5B,OAAO1G,IAAAA,aAAmB2V,EAAiC,CAAEO,kBAAmBhL,EAAM0K,mBAAAA,IAyG9DO,CAAgBrG,EAAiB5H,EAAQM,UAC5DuH,GArTb,SACIA,EACA7H,EACAkO,GAGA,OADAC,EAAAA,EAAAA,mBAAkBD,GACXpW,IAAAA,aAAmB+P,EAA+C,CAAE7H,QAAAA,EAASkO,UAAAA,IA+ShDE,CAA8BvG,EAAyB7H,GAASqO,EAAAA,EAAAA,IAAa1V,EAAQ4K,WAxU7H,IAAmCiK,GA2JEzC,GAgMVF,KA9aG,KAsjB9B","sources":["webpack://jansen-adventureworks/./src/themes/jansen-adventureworks/views/components/IncrementalQuantity.tsx?9858","webpack://jansen-adventureworks/./src/themes/jansen-adventureworks/views/components/product-popover.component.tsx?6b34","webpack://jansen-adventureworks/./src/modules/adventureworks/views/components/product.component.tsx?fd23"],"sourcesContent":["/*!\r\n * Copyright (c) Microsoft Corporation.\r\n * All rights reserved. See LICENSE in the project root for license information.\r\n */\r\n\r\nimport { IRequestContext } from '@msdyn365-commerce/core';\r\nimport { debounce } from 'lodash';\r\nimport { observer } from 'mobx-react';\r\nimport * as React from 'react';\r\nimport { ITelemetry } from '@msdyn365-commerce/telemetry-internal';\r\nimport { IDictionary } from '@msdyn365-commerce/core';\r\nimport MsDyn365 from '@msdyn365-commerce/core';\r\nimport { ProductBehavior } from '@msdyn365-commerce/retail-proxy';\r\n\r\nexport enum VariantType {\r\n Browser,\r\n Viewport\r\n}\r\n\r\n/**\r\n * Returns the payload Object.\r\n * @param {string} contentCategory - Content Category.\r\n * @param {IModule} props - Module props.\r\n * @param {string} moduleName - Module Name.\r\n * @param eventType\r\n * @param telemetryContent\r\n * @param {string} etext - Etext Name.\r\n * @param {string} recid - Recid Name.\r\n */\r\nexport function getPayloadObject(eventType: string, telemetryContent: ITelemetryContent, etext: string, recid?: string): IPayLoad {\r\n const pageName = telemetryContent && telemetryContent.pageName ? telemetryContent.pageName : '';\r\n const moduleName = telemetryContent && telemetryContent.moduleName ? telemetryContent.moduleName : '';\r\n const payload: IPayLoad = {\r\n contentCategory: eventType,\r\n contentAction: {\r\n pgname: pageName,\r\n mname: moduleName,\r\n etext,\r\n recid,\r\n etype: eventType\r\n }\r\n };\r\n return payload;\r\n}\r\n\r\nexport interface IMobileProps {\r\n variant?: VariantType;\r\n context?: IRequestContext;\r\n}\r\n\r\nexport const isMobile = (props: IMobileProps) => {\r\n const { variant, context } = props;\r\n switch (variant) {\r\n case VariantType.Browser:\r\n if (MsDyn365.isBrowser && window.innerWidth) {\r\n const gridSettings = context?.gridSettings;\r\n if (gridSettings) {\r\n if (gridSettings.xs && window.innerWidth <= gridSettings.xs.w) {\r\n return 'xs';\r\n } else if (gridSettings.sm && window.innerWidth <= gridSettings.sm.w) {\r\n return 'sm';\r\n } else if (gridSettings.md && window.innerWidth <= gridSettings.md.w) {\r\n return 'md';\r\n } else if (gridSettings.lg && window.innerWidth <= gridSettings.lg.w) {\r\n return 'lg';\r\n }\r\n return 'xl';\r\n }\r\n }\r\n\r\n return 'lg';\r\n case VariantType.Viewport:\r\n const viewport = context?.device?.Type === 'Mobile' ? 'xs' : 'lg';\r\n return viewport;\r\n default:\r\n return 'lg';\r\n }\r\n};\r\n\r\n/**\r\n * Returns the telemetry Attributes.\r\n * @param {IModule} props - Module Props.\r\n * @param telemetryContent\r\n * @param {IPayLoad} payLoad - Pay Load.\r\n */\r\nexport function getTelemetryAttributes(telemetryContent: ITelemetryContent, payLoad: IPayLoad): IDictionary | undefined {\r\n const contentData = payLoad.contentAction.recid ? payLoad.contentAction.recid : payLoad.contentAction.etext;\r\n const attributes: IDictionary | undefined =\r\n telemetryContent &&\r\n telemetryContent.telemetry &&\r\n telemetryContent.telemetry.setTelemetryAttribute &&\r\n telemetryContent.telemetry.setTelemetryAttribute(contentData!, payLoad.contentAction);\r\n return attributes;\r\n}\r\n\r\nexport interface IContentAction {\r\n pgname: string;\r\n mname: string;\r\n etext?: string;\r\n recid?: string;\r\n etype?: string;\r\n}\r\n\r\nexport interface IPayLoad {\r\n contentCategory: string;\r\n contentAction: IContentAction;\r\n}\r\n\r\nexport enum TelemetryConstant {\r\n ShopSimliarLooks = 'shop similar looks',\r\n ShopSimliarDescription = 'shop similar description',\r\n PickupInStore = 'pick up in store',\r\n PreferredStore = 'set as preferred store',\r\n RemovePreferredStore = 'remove preferred store',\r\n IncrementQuantity = 'Increment quantity',\r\n DecrementQuantity = 'Decrement quantity',\r\n Checkout = 'Checkout',\r\n GuestCheckout = 'Guest checkout',\r\n BackToShopping = 'Back to shopping',\r\n ApplyPromoCode = 'Apply promo code',\r\n ViewMore = 'View more',\r\n OrderDetails = 'Order details',\r\n AvailablePoints = 'Available points',\r\n ExpiringPoints = 'Expiring points',\r\n AddUser = 'Add user',\r\n BuyItAgain = 'Buy it again',\r\n ContactNumber = 'ContactNumber',\r\n CheckoutChange = 'Change',\r\n Save = 'Save',\r\n SaveContinue = 'Save and Continue',\r\n Cancel = 'Cancel',\r\n DeliveryOptions = 'Delivery options',\r\n CheckoutTermsAndConditions = 'Checkout terms and conditions',\r\n ExpandAll = 'Expand all',\r\n CollapseAll = 'Collapse all',\r\n Expand = 'Expand',\r\n Collapse = 'Collapse',\r\n SignIn = 'Sign in',\r\n SignUp = 'Sign up',\r\n SignOut = 'Sign out',\r\n SwitchCustomer = 'Switch Customer',\r\n LoyaltyDetailLink = 'Loyalty detail ink',\r\n LoyaltyTermsLink = 'Loyalty terms link',\r\n LoyaltyTermsCancel = 'Loyalty terms cancel',\r\n LoyaltyTermsSubmit = 'Loyalty terms submit',\r\n LoyaltyTermsAgree = 'Loyalty terms agree',\r\n RemoveCartItem = 'Remove cart item',\r\n EditCart = 'Edit cart',\r\n BackToTop = 'Back to top',\r\n Logo = 'Logo',\r\n NavIcon = 'Navigation icon',\r\n ViewBagAndCheckout = 'View bag and checkout',\r\n ContinueShopping = 'Continue shopping',\r\n AddOrderTemplateToCart = 'Add order template to cart',\r\n PromoBannerClose = 'Close promo banner',\r\n WriteReview = 'Write Review',\r\n Next = 'Next',\r\n Previous = 'Previous',\r\n SubmitReview = 'Submit review',\r\n SuccessButton = 'Success',\r\n SearchStore = 'Search store',\r\n ShowAllStore = 'Show all store',\r\n ToggleMapView = 'Toggle map view',\r\n PrivacyPolicy = 'Privacy policy',\r\n ViewShoppingBag = 'View shopping bag',\r\n MyProfile = 'My profile',\r\n seeDetails = 'See Details',\r\n CurrentDistributor = 'Set as current distributor',\r\n ViewMode = 'View mode',\r\n ApplyRefiner = 'Apply Refiner',\r\n Search = 'Search'\r\n}\r\n\r\ninterface ITelemetryContent {\r\n pageName: string;\r\n moduleName: string;\r\n telemetry?: ITelemetry;\r\n}\r\n\r\ninterface IIncrementalQuantityState {\r\n isUpdating: boolean;\r\n currentInput: string;\r\n}\r\n\r\ninterface IIncrementalQuantityProps {\r\n min?: number;\r\n max: number;\r\n multipleOfQuantity: number;\r\n currentCount?: number;\r\n disabled?: boolean;\r\n incrementGlyphClass?: string;\r\n decrementGlyphClass?: string;\r\n decrementButtonAriaLabel?: string;\r\n incrementButtonAriaLabel?: string;\r\n minQuantityText: string;\r\n maxQuantityText: string;\r\n inputQuantityAriaLabel?: string;\r\n isGiftCard?: boolean;\r\n id?: string;\r\n telemetryContent?: ITelemetryContent;\r\n applyDefaultOrderSettings?: boolean;\r\n onChange?(newValue: number): boolean;\r\n productBehavior: ProductBehavior;\r\n}\r\n/**\r\n * Quantity Component - This component is used to add or remove quantity.\r\n */\r\n@observer\r\nexport default class IncrementalQuantity extends React.PureComponent {\r\n public static defaultProps: Partial = {\r\n min: 1,\r\n max: 999,\r\n multipleOfQuantity: 0.01,\r\n decrementGlyphClass: 'fas fa-minus',\r\n incrementGlyphClass: 'fas fa-plus'\r\n };\r\n\r\n private _minValue: number;\r\n private _maxValue: number;\r\n private _multipleQuantityValue: number;\r\n\r\n private readonly inputRef: React.RefObject = React.createRef();\r\n\r\n private readonly payLoad: IPayLoad;\r\n\r\n public static getDerivedStateFromProps(\r\n props: Readonly,\r\n state: IIncrementalQuantityState\r\n ): IIncrementalQuantityState {\r\n const nextState = { ...state };\r\n\r\n if (props.disabled && !state.isUpdating) {\r\n nextState.isUpdating = true;\r\n }\r\n\r\n let updatedValue = parseFloat(state.currentInput);\r\n\r\n if (\r\n (!props.disabled && state.isUpdating) ||\r\n ((props.applyDefaultOrderSettings ?? false) &&\r\n updatedValue === 1.0 &&\r\n props.currentCount &&\r\n props.currentCount > IncrementalQuantity.defaultProps.min!)\r\n ) {\r\n updatedValue = props.currentCount ?? 1.0;\r\n nextState.isUpdating = false;\r\n }\r\n\r\n return nextState;\r\n }\r\n\r\n constructor(props: IIncrementalQuantityProps) {\r\n super(props);\r\n\r\n let minQuantity = IncrementalQuantity.defaultProps.min!;\r\n let maxQuantity = IncrementalQuantity.defaultProps.max!;\r\n let multipleOfQuantity = IncrementalQuantity.defaultProps.multipleOfQuantity!;\r\n\r\n if (props.productBehavior) {\r\n minQuantity = props.productBehavior.MinimumQuantity ?? IncrementalQuantity.defaultProps.min!;\r\n multipleOfQuantity = props.productBehavior.MultipleOfQuantity ?? IncrementalQuantity.defaultProps.multipleOfQuantity!;\r\n }\r\n\r\n this.state = {\r\n isUpdating: false,\r\n currentInput: props.productBehavior\r\n ? minQuantity > 0\r\n ? minQuantity.toFixed(2)\r\n : multipleOfQuantity > 0\r\n ? multipleOfQuantity.toFixed(2)\r\n : '1.00'\r\n : props.currentCount?.toFixed(2) ?? '1.00'\r\n };\r\n this._onIncrement = this._onIncrement.bind(this);\r\n this._onDecrement = this._onDecrement.bind(this);\r\n this._handleChange = this._handleChange.bind(this);\r\n this.payLoad = getPayloadObject('click', this.props.telemetryContent!, '');\r\n this._minValue = minQuantity ?? IncrementalQuantity.defaultProps.min!;\r\n this._maxValue = maxQuantity ?? IncrementalQuantity.defaultProps.max!;\r\n this._multipleQuantityValue = multipleOfQuantity ?? IncrementalQuantity.defaultProps.multipleOfQuantity!;\r\n }\r\n\r\n public render(): JSX.Element {\r\n const currentValue1 = this.state.currentInput;\r\n const glyphMinusClassName: string = `${this.props.decrementGlyphClass!} quantity__controls-glyph`;\r\n const glyphPlusClassName: string = `${this.props.incrementGlyphClass!} quantity__controls-glyph`;\r\n const nextDecrementValue = parseFloat(currentValue1) - this._multipleQuantityValue;\r\n const decrementDisabled = parseFloat(currentValue1) <= this._minValue + 1 || this.props.isGiftCard || nextDecrementValue === 0;\r\n const incrementDisabled = parseFloat(currentValue1) >= Number(this._maxValue) || this.props.isGiftCard;\r\n const currentValue = parseFloat(currentValue1);\r\n this.payLoad.contentAction.etext = TelemetryConstant.DecrementQuantity;\r\n const decrementAttributes = getTelemetryAttributes(this.props.telemetryContent!, this.payLoad);\r\n this.payLoad.contentAction.etext = TelemetryConstant.IncrementQuantity;\r\n const incrementAttributes = getTelemetryAttributes(this.props.telemetryContent!, this.payLoad);\r\n const ariaLablelText = `${this.props.inputQuantityAriaLabel ?? ''} ${parseFloat(currentValue1)}`;\r\n\r\n let extraClassDecrement = '';\r\n if (decrementDisabled) {\r\n // The quantity has reached its boundaries (max or min)\r\n extraClassDecrement = 'disabled';\r\n } else if (this.props.disabled) {\r\n // This.props.disabled shows if the state is not succeded yet\r\n extraClassDecrement = 'transition';\r\n }\r\n let extraClassIncrement = '';\r\n if (incrementDisabled) {\r\n // The quantity has reached its boundaries (max or min)\r\n extraClassIncrement = 'disabled';\r\n } else if (this.props.disabled) {\r\n // This.props.disabled shows if the state is not succeded yet\r\n extraClassIncrement = 'transition';\r\n }\r\n\r\n return (\r\n <>\r\n
\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n
\r\n \r\n );\r\n }\r\n\r\n /**\r\n * It checks if its in mobile view or not.\r\n * @returns Boolean.\r\n */\r\n private readonly isMobileView = (): boolean => {\r\n // eslint-disable-next-line @typescript-eslint/consistent-type-assertions -- Added gridsetting values.\r\n const context = {\r\n gridSettings: {\r\n xs: { w: 767 },\r\n sm: { w: 991 },\r\n md: { w: 1199 },\r\n lg: { w: 1599 },\r\n xl: { w: 1600 }\r\n }\r\n } as IRequestContext;\r\n\r\n const isMobileCheck = isMobile({ variant: VariantType.Browser, context });\r\n return isMobileCheck === 'xs' || isMobileCheck === 'sm';\r\n };\r\n\r\n private _onIncrement(): void {\r\n let invokeCallback = false;\r\n const currQuantity = parseFloat(this.state.currentInput);\r\n\r\n let updatedQuantity: number;\r\n\r\n if (currQuantity < this.props.max) {\r\n invokeCallback = true;\r\n updatedQuantity = currQuantity + 1;\r\n } else {\r\n invokeCallback = false;\r\n updatedQuantity = this.props.max;\r\n }\r\n\r\n if (this._multipleQuantityValue && updatedQuantity % this._multipleQuantityValue !== 0) {\r\n updatedQuantity = Math.ceil(updatedQuantity / this._multipleQuantityValue) * this._multipleQuantityValue;\r\n }\r\n\r\n if (invokeCallback && this.props.onChange) {\r\n if (this.props.onChange(updatedQuantity)) {\r\n this.setState({ currentInput: updatedQuantity.toFixed(2) });\r\n }\r\n }\r\n }\r\n\r\n private _onDecrement(): void {\r\n let invokeCallback = false;\r\n const currQuantity = parseFloat(this.state.currentInput);\r\n let updatedQuantity: number;\r\n\r\n if (currQuantity > this._minValue) {\r\n invokeCallback = true;\r\n updatedQuantity = currQuantity - 1;\r\n } else {\r\n invokeCallback = false;\r\n updatedQuantity = this._minValue;\r\n }\r\n\r\n if (this._multipleQuantityValue && updatedQuantity % this._multipleQuantityValue !== 0) {\r\n updatedQuantity = Math.floor(updatedQuantity / this._multipleQuantityValue) * this._multipleQuantityValue;\r\n if (updatedQuantity < this._minValue) {\r\n updatedQuantity = this._minValue;\r\n }\r\n }\r\n\r\n if (invokeCallback && this.props.onChange) {\r\n if (this.props.onChange(updatedQuantity)) {\r\n this.setState({ currentInput: updatedQuantity.toFixed(2) });\r\n }\r\n }\r\n }\r\n\r\n private _handleChange(e: React.ChangeEvent): void {\r\n let value = e.target.value;\r\n\r\n // If the input field is empty, we update the state to an empty field.\r\n if (value === '') {\r\n this.setState({ currentInput: '' });\r\n } else if (/^[0-9]*[.]?[0-9]{0,2}$/.test(value)) {\r\n // Converts the comma to a dot and stores the valid value in the state.\r\n const formattedValue = value.replace(',', '.');\r\n this.setState({ currentInput: formattedValue });\r\n\r\n debounce(() => {\r\n this.props.onChange && this.props.onChange(parseFloat(this.state.currentInput));\r\n\r\n const inputElement =\r\n this.inputRef && this.inputRef.current && this.inputRef.current instanceof HTMLInputElement && this.inputRef.current;\r\n if (inputElement) {\r\n inputElement.setAttribute('aria-valuenow', this.state.currentInput);\r\n inputElement.setAttribute('value', this.state.currentInput);\r\n }\r\n }, 1000)();\r\n }\r\n }\r\n\r\n /**\r\n * Validates min and updates.\r\n */\r\n private readonly _validateMin = (): void => {\r\n // If the input field is empty, we update the state to an empty field.\r\n if (this.state.currentInput === '') {\r\n this.setState({ currentInput: '1' });\r\n }\r\n\r\n const currentValue = parseFloat(this.state.currentInput);\r\n\r\n if (isNaN(currentValue)) {\r\n // If the value is invalid, we set it to the minimum value.\r\n this.setState({ currentInput: this._minValue.toFixed(2) });\r\n } else {\r\n let validValue = Math.min(this.props.max, Math.max(this._minValue, currentValue));\r\n\r\n // Check if the value is a multiple of multipleOfQuantity\r\n if (this._multipleQuantityValue && validValue % this._multipleQuantityValue !== 0) {\r\n validValue = Math.ceil(validValue / this._multipleQuantityValue) * this._multipleQuantityValue;\r\n }\r\n\r\n if (validValue !== currentValue) {\r\n this.setState({ currentInput: validValue.toFixed(2) });\r\n }\r\n }\r\n };\r\n}\r\n","import React, { useState } from 'react';\r\nimport { Popover, PopoverHeader, PopoverBody } from 'reactstrap';\r\nimport { ProductSearchResult } from '@msdyn365-commerce/retail-proxy';\r\nimport { ICoreContext } from '@msdyn365-commerce/core';\r\nimport { getProductPageUrlSync } from '@msdyn365-commerce-modules/retail-actions';\r\n\r\nconst ProductPopover = ({ product, index, context, layout }: { product: ProductSearchResult; index: number; context: ICoreContext; layout: String }) => {\r\n const productUrl = product ? getProductPageUrlSync(product.Name ?? '', product.RecordId, context.actionContext, undefined) : '';\r\n const [popoverOpen, setPopoverOpen] = useState(false);\r\n const zIndex = index + 1;\r\n\r\n const togglePopover = (isVisible: boolean) => {\r\n setPopoverOpen(isVisible);\r\n };\r\n\r\n return (\r\n <>\r\n togglePopover(false)}\r\n onMouseLeave={() => togglePopover(false)}\r\n style={{ position: 'relative', zIndex: zIndex }}\r\n onClick={() => window.location.href = productUrl}\r\n >\r\n {layout === 'imagelist' ? {product.Name}{product.Name} :\r\n {product.Name}}\r\n \r\n togglePopover(!popoverOpen)}\r\n style={{ zIndex: zIndex + 1 }}\r\n >\r\n \r\n togglePopover(false)}\r\n onMouseLeave={() => togglePopover(false)}\r\n >\r\n {product.Name}\r\n \r\n \r\n \r\n );\r\n};\r\n\r\nexport default ProductPopover;\r\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { IProductsDimensionsAvailabilities } from '@msdyn365-commerce/commerce-entities';\nimport {\n IPriceComponentResources,\n ISwatchItem,\n PriceComponent,\n ProductComponentSwatchComponent,\n RatingComponent\n} from '@msdyn365-commerce/components';\nimport {\n getCatalogId,\n IAny,\n IComponent,\n IComponentProps,\n ICoreContext,\n IGeneric,\n IGridSettings,\n IImageData,\n IImageSettings,\n Image,\n msdyn365Commerce\n} from '@msdyn365-commerce/core';\nimport {\n AttributeSwatch,\n AttributeValue,\n ProductDimension,\n ProductPrice,\n ProductSearchResult,\n ProductType,\n SimpleProduct\n} from '@msdyn365-commerce/retail-proxy';\nimport {\n ArrayExtensions,\n convertDimensionTypeToProductDimensionType,\n Dictionary,\n DimensionTypes,\n generateImageUrl,\n getProductPageUrlSync,\n IDimensionsApp,\n StringExtensions,\n validateCatalogId\n} from '@msdyn365-commerce-modules/retail-actions';\nimport {\n format,\n getPayloadObject,\n getTelemetryAttributes,\n ITelemetryContent,\n onTelemetryClick\n} from '@msdyn365-commerce-modules/utilities';\nimport React, { useState } from 'react';\n\nexport interface IProductComponentProps extends IComponentProps<{ product?: ProductSearchResult; productPrice?: ProductPrice }> {\n className?: string;\n imageSettings?: IImageSettings;\n savingsText?: string;\n freePriceText?: string;\n originalPriceText?: string;\n currentPriceText?: string;\n ratingAriaLabel?: string;\n ratingCountAriaLabel?: string;\n allowBack?: boolean;\n telemetryContent?: ITelemetryContent;\n quickViewButton?: React.ReactNode;\n productComparisonButton?: React.ReactNode;\n isEnabledProductDescription?: boolean;\n isPriceMinMaxEnabled?: boolean;\n priceResources?: IPriceComponentResources;\n inventoryLabel?: string;\n dimensionAvailabilities?: IProductsDimensionsAvailabilities[];\n swatchItemAriaLabel?: string;\n}\n\nexport interface IProductComponent extends IComponent {}\n\nconst PriceComponentActions = {};\n\n/**\n * Gets the product page url from the default swatch selected.\n * @param productData - Product card to be rendered.\n * @returns The default color swatch selected if any.\n */\nfunction getDefaultSwatchSelected(coreContext: ICoreContext, productData?: ProductSearchResult): AttributeSwatch | null {\n if (!productData || !productData.AttributeValues) {\n return null;\n }\n\n const siteContext = coreContext as ICoreContext;\n const dimensionToPreSelectInProductCard = siteContext.app.config.dimensionToPreSelectInProductCard;\n\n const attributeSwatches = productData.AttributeValues.find(\n attributeValue => attributeValue.KeyName?.toLocaleLowerCase() === dimensionToPreSelectInProductCard\n )?.Swatches;\n\n if (!ArrayExtensions.hasElements(attributeSwatches)) {\n return null;\n }\n\n const defaultSwatch = attributeSwatches.find(item => item.IsDefault === true) ?? attributeSwatches[0];\n return defaultSwatch;\n}\n\n/**\n * Gets the product image from the default swatch selected.\n * @param coreContext - Context of the module using the component.\n * @param productData - Product card to be rendered.\n * @returns The product card image url.\n */\nfunction getProductImageUrlFromDefaultSwatch(coreContext: ICoreContext, productData?: ProductSearchResult): string | undefined {\n const defaultSwatch = getDefaultSwatchSelected(coreContext, productData);\n const swatchProductImageUrls = defaultSwatch?.ProductImageUrls;\n if (!ArrayExtensions.hasElements(swatchProductImageUrls)) {\n return productData?.PrimaryImageUrl;\n }\n\n return generateImageUrl(swatchProductImageUrls[0], coreContext.request.apiSettings);\n}\n\n/**\n * Updates the product url link to product details page.\n * @param productDetailsPageUrl - Product page url.\n * @param coreContext - Context of the module using the component.\n * @param queryString - Querystring to be added to the URL.\n * @returns The update product page url.\n */\nfunction updateProductUrl(productDetailsPageUrl: string, coreContext: ICoreContext, queryString: string): string {\n const sourceUrl = new URL(productDetailsPageUrl, coreContext.request.apiSettings.baseUrl);\n if (sourceUrl.search) {\n sourceUrl.search += `&${queryString}`;\n } else {\n sourceUrl.search += queryString;\n }\n\n const updatedUrl = new URL(sourceUrl.href);\n return updatedUrl.pathname + sourceUrl.search;\n}\n\n/**\n * Gets the react node for product unit of measure display.\n * @param unitOfMeasure - DefaultUnitOfMeasure property from product.\n * @returns The node representing markup for unit of measure component.\n */\nfunction renderProductUnitOfMeasure(unitOfMeasure?: string): JSX.Element | null {\n if (!unitOfMeasure) {\n return null;\n }\n return (\n
\n {unitOfMeasure}\n
\n );\n}\n\n/**\n * Gets the react node for product availability.\n * @param inventoryAvailabilityLabel - The product information.\n * @returns The node representing markup for product availability.\n */\nfunction renderProductAvailability(inventoryAvailabilityLabel: string | undefined): JSX.Element | null {\n if (!inventoryAvailabilityLabel || inventoryAvailabilityLabel === '') {\n return null;\n }\n\n return (\n
\n {inventoryAvailabilityLabel}\n
\n );\n}\n\n/**\n * Renders product comparison button similar to the quick view button.\n * @param productComparisonButton - React element of the button.\n * @param product - Current product info.\n * @param catalogId - Current catalog.\n * @returns React element for the specific product.\n */\nfunction renderProductComparisonButton(\n productComparisonButton: React.ReactNode,\n product: ProductSearchResult,\n catalogId: number\n): JSX.Element | undefined {\n validateCatalogId(catalogId);\n return React.cloneElement(productComparisonButton as React.ReactElement, { product, catalogId });\n}\n\n/**\n * Gets the product page url from the default swatch selected.\n * @param coreContext - Context of the module using the component.\n * @param productUrl - Product page url for the product card.\n * @param productData - Product card to be rendered.\n * @returns The product card image url.\n */\nfunction getProductPageUrlFromDefaultSwatch(\n coreContext: ICoreContext,\n productUrl: string,\n productData?: ProductSearchResult\n): string | undefined {\n const defaultSwatch = getDefaultSwatchSelected(coreContext, productData);\n if (!defaultSwatch?.SwatchValue) {\n return productUrl;\n }\n\n const siteContext = coreContext as ICoreContext;\n const dimensionToPreSelectInProductCard = siteContext.app.config.dimensionToPreSelectInProductCard;\n\n const queryStringEncoded = encodeURIComponent(defaultSwatch.SwatchValue);\n const queryString = `${dimensionToPreSelectInProductCard}=${queryStringEncoded}`;\n return updateProductUrl(productUrl, coreContext, queryString);\n}\n\nconst ProductCard: React.FC = ({\n data,\n context,\n imageSettings,\n savingsText,\n freePriceText,\n originalPriceText,\n currentPriceText,\n ratingAriaLabel,\n ratingCountAriaLabel,\n allowBack,\n typeName,\n id,\n telemetryContent,\n quickViewButton,\n productComparisonButton,\n isEnabledProductDescription,\n isPriceMinMaxEnabled,\n priceResources,\n inventoryLabel,\n dimensionAvailabilities,\n swatchItemAriaLabel\n}) => {\n const product = data.product;\n const productPrice = data.productPrice;\n\n let productUrl = getProductPageUrlSync(product?.Name ?? '', product?.RecordId ?? Number.MIN_VALUE, context.actionContext, undefined);\n if (allowBack) {\n productUrl = updateProductUrl(productUrl, context, 'back=true');\n }\n const productImageUrlFromSwatch = getProductImageUrlFromDefaultSwatch(context, product) ?? product?.PrimaryImageUrl;\n const productPageUrlFromSwatch = getProductPageUrlFromDefaultSwatch(context, productUrl, product) ?? productUrl;\n const [productPageUrl, setProductPageUrl] = useState(productPageUrlFromSwatch);\n const [productImageUrl, setProductImageUrl] = useState(productImageUrlFromSwatch);\n React.useEffect(() => {\n setProductPageUrl(productPageUrlFromSwatch);\n setProductImageUrl(productImageUrlFromSwatch);\n }, [productUrl, productPageUrlFromSwatch, productImageUrlFromSwatch]);\n const [selectedSwatchItems] = useState(new Dictionary());\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment,@typescript-eslint/no-unsafe-member-access -- app context is generic\n const enableStockCheck = context.app.config.enableStockCheck;\n\n const siteContext = context as ICoreContext;\n const dimensionToPreSelectInProductCard = siteContext.app.config.dimensionToPreSelectInProductCard;\n\n /**\n * Updates the product page and Image url based on swatch selected.\n * @param coreContext - Context of the caller.\n * @param swatchItem - Dimension swatch selected.\n */\n const updatePageAndImageUrl = React.useCallback(\n (coreContext: ICoreContext, swatchItem: ISwatchItem) => {\n const dimensionType = swatchItem.dimensionType;\n selectedSwatchItems.setValue(dimensionType, swatchItem);\n if (StringExtensions.isNullOrWhitespace(swatchItem.value)) {\n return;\n }\n const queryString = `${dimensionType}=${swatchItem.value}`;\n let productPageUrlWithSwatch = '';\n if (productPageUrl.includes(dimensionType)) {\n const newUrl = new URL(productPageUrl, coreContext.request.apiSettings.baseUrl);\n newUrl.searchParams.delete(dimensionType);\n productPageUrlWithSwatch = updateProductUrl(newUrl.toString(), context, queryString);\n } else {\n productPageUrlWithSwatch = updateProductUrl(productPageUrl, context, queryString);\n }\n setProductPageUrl(productPageUrlWithSwatch);\n if (dimensionType === dimensionToPreSelectInProductCard) {\n const swatchProductImageUrl = ArrayExtensions.hasElements(swatchItem.productImageUrls)\n ? swatchItem.productImageUrls[0]\n : undefined;\n const newImageUrl = generateImageUrl(swatchProductImageUrl, coreContext.request.apiSettings);\n setProductImageUrl(newImageUrl);\n }\n },\n [selectedSwatchItems, context, productPageUrl]\n );\n\n if (!product) {\n return null;\n }\n\n /**\n * Checks if rendering the particular dimensions is allowed for product card.\n * @param dimensionType - Dimension to be displayed.\n * @returns Updates the state with new product page url.\n */\n function shouldDisplayDimension(dimensionType: string): boolean {\n const dimensionsContext = context as ICoreContext;\n const dimensionsToDisplayOnProductCard = dimensionsContext.app.config.dimensionsInProductCard;\n return (\n ArrayExtensions.hasElements(dimensionsToDisplayOnProductCard) &&\n !dimensionsToDisplayOnProductCard.includes(DimensionTypes.none) &&\n dimensionsToDisplayOnProductCard.includes(dimensionType.toLocaleLowerCase() as DimensionTypes)\n );\n }\n\n /**\n * Gets the react node for product dimension as swatch.\n * @param attributeValues - Attribute value property from product.\n * @returns The node representing markup for unit of measure component.\n */\n function renderProductDimensions(attributeValues?: AttributeValue[]): JSX.Element | null {\n if (!attributeValues) {\n return null;\n }\n\n return (\n
\n {attributeValues.map((item: AttributeValue) => {\n const dimensionTypeValue = item.KeyName?.toLocaleLowerCase() ?? '';\n if (!shouldDisplayDimension(dimensionTypeValue)) {\n return null;\n }\n\n const siteContext = context as ICoreContext;\n const dimensionToPreSelectInProductCard = siteContext.app.config.dimensionToPreSelectInProductCard;\n const dimensionType = dimensionTypeValue as DimensionTypes;\n const swatches =\n item.Swatches?.map(swatchItem => {\n return {\n itemId: `${item.RecordId ?? ''}-${dimensionTypeValue}-${swatchItem.SwatchValue ?? ''}`,\n value: swatchItem.SwatchValue ?? '',\n dimensionType,\n colorHexCode: swatchItem.SwatchColorHexCode,\n imageUrl: swatchItem.SwatchImageUrl,\n productImageUrls: swatchItem.ProductImageUrls,\n isDefault: swatchItem.IsDefault,\n swatchItemAriaLabel: swatchItemAriaLabel ? format(swatchItemAriaLabel, dimensionType) : '',\n isDisabled:\n enableStockCheck &&\n dimensionAvailabilities?.find(\n dimensionAvailability => dimensionAvailability.value === (swatchItem.SwatchValue ?? '')\n )?.isDisabled\n };\n }) ?? [];\n if (\n dimensionType === dimensionToPreSelectInProductCard &&\n ArrayExtensions.hasElements(swatches) &&\n !swatches.some(swatch => swatch.isDefault)\n ) {\n swatches[0].isDefault = true;\n }\n return (\n \n );\n })}\n
\n );\n }\n\n function renderQuickView(quickview: React.ReactNode, item?: number): JSX.Element | undefined {\n if (quickview === null) {\n return undefined;\n }\n const selectedDimensions: ProductDimension[] = selectedSwatchItems.getValues().map(swatches => {\n return {\n DimensionTypeValue: convertDimensionTypeToProductDimensionType(swatches.dimensionType),\n DimensionValue: {\n RecordId: 0,\n Value: swatches.value\n }\n };\n });\n return React.cloneElement(quickview as React.ReactElement, { selectedProductId: item, selectedDimensions });\n }\n\n // Construct telemetry attribute to render\n const payLoad = getPayloadObject('click', telemetryContent!, '', product.RecordId.toString());\n\n const attribute = getTelemetryAttributes(telemetryContent!, payLoad);\n\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access -- -- Do not need type check for appsettings\n const isUnitOfMeasureEnabled = context.app.config && context.app.config.unitOfMeasureDisplayType === 'buyboxAndBrowse';\n\n return (\n <>\n {isEnabledProductDescription ? (\n \n
\n
\n {renderProductPlacementImage(\n imageSettings,\n context.request.gridSettings,\n productImageUrl,\n product.PrimaryImageUrl,\n product.Name,\n context\n )}\n
\n
\n

{product.Name}

\n {renderPrice(\n context,\n typeName,\n id,\n product,\n savingsText,\n freePriceText,\n originalPriceText,\n currentPriceText,\n isPriceMinMaxEnabled,\n priceResources,\n productPrice\n )}\n {isUnitOfMeasureEnabled && renderProductUnitOfMeasure(product.DefaultUnitOfMeasure)}\n {renderDescription(product.Description)}\n
\n
\n \n ) : (\n \n
\n {renderProductPlacementImage(\n imageSettings,\n context.request.gridSettings,\n productImageUrl,\n product.PrimaryImageUrl,\n product.Name,\n context\n )}\n
\n
\n

{product.Name}

\n {renderPrice(\n context,\n typeName,\n id,\n product,\n savingsText,\n freePriceText,\n originalPriceText,\n currentPriceText,\n isPriceMinMaxEnabled,\n priceResources,\n productPrice\n )}\n {isUnitOfMeasureEnabled && renderProductUnitOfMeasure(product.DefaultUnitOfMeasure)}\n
\n \n )}\n {renderProductDimensions(product.AttributeValues)}\n {!context.app.config.hideRating &&\n renderRating(context, typeName, id, product.AverageRating, product.TotalRatings, ratingAriaLabel, ratingCountAriaLabel)}\n {renderProductAvailability(inventoryLabel)}\n {quickViewButton && renderQuickView(quickViewButton, product.RecordId)}\n {productComparisonButton && renderProductComparisonButton(productComparisonButton, product, getCatalogId(context.request))}\n \n );\n};\n\nfunction renderLabel(\n name?: string,\n price?: string,\n rating?: number,\n ratingAriaLabelText?: string,\n reviewCount?: number,\n ratingCountAriaLabelText?: string\n): string {\n const reviewCountArialableText = getReviewAriaLabel(reviewCount, ratingCountAriaLabelText ?? '');\n return `${name ?? ''} ${price ?? ''} ${getRatingAriaLabel(rating, ratingAriaLabelText)}${\n reviewCountArialableText ? ` ${reviewCountArialableText}` : ''\n }`;\n}\n\nfunction renderDescription(description?: string): JSX.Element | null {\n return

{description}

;\n}\n\nfunction getRatingAriaLabel(rating?: number, ratingAriaLabel?: string): string {\n if (rating && ratingAriaLabel) {\n const roundedRating = rating.toFixed(2);\n return format(ratingAriaLabel || '', roundedRating, '5');\n }\n return '';\n}\n\nfunction getReviewAriaLabel(reviewCount?: number, ratingCountAriaLabelText?: string): string {\n if (reviewCount && ratingCountAriaLabelText) {\n return format(ratingCountAriaLabelText || '', reviewCount);\n }\n return '';\n}\n\nfunction renderRating(\n coreContext: ICoreContext,\n moduleTypeName: string,\n moduleId: string,\n avgRating?: number,\n totalRatings?: number,\n ariaLabel?: string,\n ratingCountAriaLabel?: string\n): JSX.Element | null {\n if (!avgRating) {\n return null;\n }\n\n const numberRatings = totalRatings?.toString() || undefined;\n const ratingAriaLabelText = getRatingAriaLabel(avgRating, ariaLabel);\n const ratingCountAriaLabelText = getReviewAriaLabel(Number(numberRatings), ratingCountAriaLabel);\n\n return (\n \n );\n}\n\nfunction renderPrice(\n context: ICoreContext,\n typeName: string,\n id: string,\n productSearchResult: ProductSearchResult,\n savingsText?: string,\n freePriceText?: string,\n originalPriceText?: string,\n currentPriceText?: string,\n isPriceMinMaxEnabled?: boolean,\n priceResources?: IPriceComponentResources,\n productPrice?: ProductPrice\n): JSX.Element | null {\n const product: SimpleProduct = {\n // This is a fake product. The product type is only used for price component to determine if it should show price range or not.\n ProductTypeValue: productSearchResult.IsMasterProduct ? ProductType.Master : ProductType.Standalone\n } as SimpleProduct;\n\n const price: ProductPrice = productPrice ?? {\n BasePrice: productSearchResult.BasePrice,\n AdjustedPrice: productSearchResult.Price,\n CustomerContextualPrice: productSearchResult.Price,\n MaxVariantPrice: productSearchResult.MaxVariantPrice ? productSearchResult.MaxVariantPrice : productSearchResult.Price,\n MinVariantPrice: productSearchResult.MinVariantPrice ? productSearchResult.MinVariantPrice : productSearchResult.Price\n };\n\n return (\n \n );\n}\n\nfunction renderProductPlacementImage(\n imageSettings?: IImageSettings,\n gridSettings?: IGridSettings,\n imageUrl?: string,\n fallbackImageUrl?: string,\n altText?: string,\n context?: ICoreContext>\n): JSX.Element | null {\n if (!imageUrl || !gridSettings || !imageSettings) {\n return null;\n }\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-unsafe-assignment -- Site level config can be of any type.\n const contextConfig = context?.app.config?.placeholderImageName;\n const emptyPlaceHolderImage = contextConfig as string;\n let fallbackImageSource = fallbackImageUrl;\n if (emptyPlaceHolderImage && fallbackImageUrl) {\n fallbackImageSource = `${fallbackImageUrl},${emptyPlaceHolderImage}`;\n }\n const img: IImageData = {\n src: imageUrl,\n altText: altText ? altText : '',\n fallBackSrc: fallbackImageSource\n };\n const imageProps = {\n gridSettings,\n imageSettings\n };\n imageProps.imageSettings.cropFocalRegion = true;\n return (\n \n );\n}\n\nexport const ProductComponent: React.FunctionComponent = msdyn365Commerce.createComponentOverride<\n IProductComponent\n>('Product', { component: ProductCard, ...PriceComponentActions });\n\nexport default ProductComponent;\n"],"names":["VariantType","getTelemetryAttributes","telemetryContent","payLoad","contentData","contentAction","recid","etext","telemetry","setTelemetryAttribute","TelemetryConstant","IncrementalQuantity","IncrementalQuantity_1","React","constructor","props","_props$currentCount$t","_props$currentCount","_minQuantity","_multipleOfQuantity","super","inputRef","isMobileView","isMobileCheck","_context$device","variant","context","Browser","MsDyn365","isBrowser","window","innerWidth","gridSettings","xs","w","sm","md","lg","Viewport","device","Type","isMobile","xl","_validateMin","this","state","currentInput","setState","currentValue","parseFloat","isNaN","_minValue","toFixed","validValue","Math","min","max","_multipleQuantityValue","ceil","minQuantity","defaultProps","maxQuantity","multipleOfQuantity","_props$productBehavio","_props$productBehavio2","eventType","productBehavior","MinimumQuantity","MultipleOfQuantity","isUpdating","currentCount","_onIncrement","bind","_onDecrement","_handleChange","contentCategory","pgname","pageName","mname","moduleName","etype","_maxValue","_props$applyDefaultOr","nextState","_objectSpread","disabled","updatedValue","_props$currentCount2","applyDefaultOrderSettings","render","_this$props$inputQuan","_this$props$inputQuan2","currentValue1","glyphMinusClassName","decrementGlyphClass","glyphPlusClassName","incrementGlyphClass","nextDecrementValue","decrementDisabled","isGiftCard","incrementDisabled","Number","DecrementQuantity","decrementAttributes","IncrementQuantity","incrementAttributes","ariaLablelText","inputQuantityAriaLabel","extraClassDecrement","extraClassIncrement","className","id","Object","assign","title","decrementButtonAriaLabel","onClick","color","type","value","onChange","onBlur","role","ref","incrementButtonAriaLabel","invokeCallback","currQuantity","updatedQuantity","floor","e","target","test","formattedValue","replace","_debounce","inputElement","current","HTMLInputElement","setAttribute","__decorate","observer","_ref","_product$Name","product","index","layout","productUrl","getProductPageUrlSync","Name","RecordId","actionContext","undefined","popoverOpen","setPopoverOpen","useState","zIndex","togglePopover","isVisible","onMouseEnter","onMouseLeave","style","position","location","href","src","PrimaryImageUrl","alt","Popover","placement","isOpen","toggle","PopoverHeader","PopoverBody","getDefaultSwatchSelected","coreContext","productData","_productData$Attribut","_attributeSwatches$fi","AttributeValues","dimensionToPreSelectInProductCard","app","config","attributeSwatches","find","attributeValue","_attributeValue$KeyNa","KeyName","toLocaleLowerCase","Swatches","ArrayExtensions","hasElements","item","IsDefault","updateProductUrl","productDetailsPageUrl","queryString","sourceUrl","URL","request","apiSettings","baseUrl","search","pathname","renderProductUnitOfMeasure","unitOfMeasure","renderLabel","name","price","rating","ratingAriaLabelText","reviewCount","ratingCountAriaLabelText","reviewCountArialableText","getReviewAriaLabel","getRatingAriaLabel","ratingAriaLabel","roundedRating","format","renderPrice","typeName","productSearchResult","savingsText","freePriceText","originalPriceText","currentPriceText","isPriceMinMaxEnabled","priceResources","productPrice","ProductTypeValue","IsMasterProduct","ProductType","Master","Standalone","BasePrice","AdjustedPrice","Price","CustomerContextualPrice","MaxVariantPrice","MinVariantPrice","PriceComponent","data","renderProductPlacementImage","imageSettings","imageUrl","fallbackImageUrl","altText","_context$app$config","contextConfig","placeholderImageName","fallbackImageSource","img","fallBackSrc","imageProps","cropFocalRegion","Image","requestContext","loadFailureBehavior","bypassHideOnFailure","ProductComponent","msdyn365Commerce","createComponentOverride","component","_product$RecordId","_getProductImageUrlFr","_getProductPageUrlFro","ratingCountAriaLabel","allowBack","quickViewButton","productComparisonButton","isEnabledProductDescription","inventoryLabel","dimensionAvailabilities","swatchItemAriaLabel","MIN_VALUE","productImageUrlFromSwatch","defaultSwatch","swatchProductImageUrls","ProductImageUrls","generateImageUrl","getProductImageUrlFromDefaultSwatch","productPageUrlFromSwatch","SwatchValue","encodeURIComponent","getProductPageUrlFromDefaultSwatch","productPageUrl","setProductPageUrl","productImageUrl","setProductImageUrl","selectedSwatchItems","Dictionary","enableStockCheck","updatePageAndImageUrl","swatchItem","dimensionType","setValue","StringExtensions","isNullOrWhitespace","productPageUrlWithSwatch","includes","newUrl","searchParams","delete","toString","swatchProductImageUrl","productImageUrls","newImageUrl","getPayloadObject","attribute","isUnitOfMeasureEnabled","unitOfMeasureDisplayType","onTelemetryClick","cultureFormatter","formatCurrency","AverageRating","TotalRatings","DefaultUnitOfMeasure","description","Description","attributeValues","map","_item$KeyName$toLocal","_item$KeyName","_item$Swatches$map","_item$Swatches","dimensionTypeValue","dimensionsToDisplayOnProductCard","dimensionsInProductCard","DimensionTypes","none","shouldDisplayDimension","swatches","_item$RecordId","_swatchItem$SwatchVal","_swatchItem$SwatchVal2","_dimensionAvailabilit","itemId","colorHexCode","SwatchColorHexCode","SwatchImageUrl","isDefault","isDisabled","dimensionAvailability","_swatchItem$SwatchVal3","some","swatch","ProductComponentSwatchComponent","onSelectDimension","key","hideRating","moduleTypeName","moduleId","avgRating","totalRatings","ariaLabel","numberRatings","RatingComponent","ratingCount","readOnly","renderRating","inventoryAvailabilityLabel","quickview","selectedDimensions","getValues","DimensionTypeValue","convertDimensionTypeToProductDimensionType","DimensionValue","Value","selectedProductId","renderQuickView","catalogId","validateCatalogId","renderProductComparisonButton","getCatalogId"],"sourceRoot":""}