{"version":3,"file":"static/js/8ff799d08012995dd6e2.bundle.js","mappings":";oiBAqRA,MAAMA,EAAwB,CAC1BC,wBAAyBA,CAACC,EAAwBC,IACzCD,GAAYA,EAAQE,WAIlBF,EAAQE,WAAWC,KAAIC,IAC1B,OAA4C,IAAxCA,EAAiBC,mBAEbC,EAAAA,cAAA,OAAKC,IAAK,GAAGP,EAAQQ,6BAA8BC,UAAU,uCACzDH,EAAAA,cAAA,QAAMG,UAAU,wCACXR,EAAiBS,YAClBJ,EAAAA,cAAA,QAAMG,UAAU,QAAQL,EAAiBO,gBAAkBP,EAAiBO,eAAeC,SAM/D,IAAxCR,EAAiBC,mBAEbC,EAAAA,cAAA,OAAKC,IAAK,GAAGP,EAAQQ,6BAA8BC,UAAU,uCACzDH,EAAAA,cAAA,QAAMG,UAAU,wCACXR,EAAiBY,aAClBP,EAAAA,cAAA,QAAMG,UAAU,QAAuC,QAAjCK,EAAEV,EAAiBO,sBAAc,IAAAG,OAAA,EAA/BA,EAAiCF,SAM7B,IAAxCR,EAAiBC,mBAEbC,EAAAA,cAAA,OAAKC,IAAK,GAAGP,EAAQQ,6BAA8BC,UAAU,uCACzDH,EAAAA,cAAA,QAAMG,UAAU,uCACXR,EAAiBc,WAClBT,EAAAA,cAAA,QAAMG,UAAU,QAAuC,QAAjCO,EAAEZ,EAAiBO,sBAAc,IAAAK,OAAA,EAA/BA,EAAiCJ,SAM7B,IAAxCR,EAAiBC,mBAEbC,EAAAA,cAAA,OAAKC,IAAK,GAAGP,EAAQQ,6BAA8BC,UAAU,uCACzDH,EAAAA,cAAA,QAAMG,UAAU,wCACXT,EAAQiB,WAAahB,EAAiBiB,aAAejB,EAAiBkB,YACvEb,EAAAA,cAAA,QAAMG,UAAU,QAAuC,QAAjCW,EAAEhB,EAAiBO,sBAAc,IAAAS,OAAA,EAA/BA,EAAiCR,SAKlE,KAhCwC,IAAAE,EAWAE,EAWAI,KArCxC,GAkDfC,oBAAsBC,GACbA,EAAMC,KAAKC,SAASC,eAA8D,IAA7CH,EAAMC,KAAKC,SAASC,cAAcC,OAIrEJ,EAAMC,KAAKC,SAASC,cAActB,KAAI,CAACwB,EAAcC,IAEpDtB,EAAAA,cAAA,OAAKC,IAAKoB,EAAaE,SAAWD,EAAOnB,UAAU,uCAC/CH,EAAAA,cAAA,QAAMG,UAAU,wCACXkB,EAAaG,UAAYH,EAAaG,UAAY,GAAE,IAAG,IAAIR,EAAMS,UAAUC,oBAAsB,eAEtG1B,EAAAA,cAAA,QAAMG,UAAU,8BACXkB,EAAaM,cACV3B,EAAAA,cAAAA,EAAAA,SAAA,KACIA,EAAAA,cAAC4B,EAAAA,eAAc,CACXX,KACID,EAAMa,YACA,CACIC,MAAO,CACHC,wBAA0Bf,EAAMC,KAAKC,SAAuBc,mBAGpE,CACIF,MAAO,CACHC,wBAAyBf,EAAMC,KAAKC,SAASe,yBAC7CC,UAAWlB,EAAMC,KAAKC,SAASiB,iBAIjDC,QAASpB,EAAMoB,QACfC,GAAIrB,EAAMqB,GACVC,SAAUtB,EAAMsB,SAChBnC,UAAU,oCAK1BH,EAAAA,cAAA,YAAO,UAA0CuC,IAArClB,EAAamB,oBAAoCnB,EAAamB,oBAAsB,WAnCjG,KAwCfC,qBAAuBzB,GAEZ,KAgBX0B,oBAAsB1B,IAElB,GACIA,EAAMoB,QAAQO,IAAIC,UAChB5B,EAAMoB,QAAQO,IAAIC,OAAOC,0BAAkF,SAAtD7B,EAAMoB,QAAQO,IAAIC,OAAOC,0BAEhF,OAGJ,MAAMC,EAAU9B,EAAMC,KAAK6B,QAC3B,OAAKA,GAAYA,EAAQC,qBAKrB/C,EAAAA,cAAA,OAAKG,UAAU,yCACXH,EAAAA,cAAA,YAAO8C,EAAQC,4BANvB,GAUJC,oBAAsBhC,IAAyB,IAAAiC,EAC3C,MAAMC,EAAsD,QAAhCD,EAAGjC,EAAMoB,QAAQe,QAAQC,eAAO,IAAAH,OAAA,EAA7BA,EAA+BI,uBACxDC,EAA8BtC,EAAMsC,4BACpCC,EAAWvC,EAAMC,KAAKC,SAC5B,IAAIsC,GAAoB,EACuB,IAAAC,OAAXlB,IAAhCe,EACAE,KACID,EAASG,cAC0C,QAD9BD,EACrBH,EAA4BK,+BAAuB,IAAAF,IAAnDA,EAAqDG,MAAKC,GAAgBA,IAAiBN,EAASG,gBAGxGF,KAAuBD,EAASG,cAAgBH,EAASG,eAAiBR,GAE9E,IAAKM,EACD,OAGJ,MAAMM,GAAuBP,EAASQ,aAAe,IAAIC,QAAOC,GAAcA,EAAWC,aAEzF,GAAmC,IAA/BJ,EAAoB1C,OACpB,OAGJ,MAAM+C,EAAaL,EAAoBM,QAAO,CAACC,EAAaJ,IACjDI,GAAeJ,EAAWK,kBAAoB,IACtD,GAEGC,EACFvE,EAAAA,cAAC4B,EAAAA,eAAc,CACXX,KAAM,CACFa,MAAO,CACHC,wBAAyBoC,IAGjCK,cAAc,OACdpC,QAASpB,EAAMoB,QACfC,GAAIrB,EAAMqB,GACVC,SAAUtB,EAAMsB,SAChBnC,UAAU,kCAGlB,OACIH,EAAAA,cAAAA,EAAAA,SAAA,KACIA,EAAAA,cAAA,SAAOG,UAAU,gCAAgC,GAAGa,EAAMS,UAAUgD,wBACpEzE,EAAAA,cAAA,QAAMG,UAAU,kBAAkBoE,KAI9CG,mBAAqB1D,IAAyB,IAAA2D,EAC1C,MACMC,EAAmC,QAAvBD,EADD3D,EAAMC,KAAKC,SACE6C,mBAAW,IAAAY,OAAA,EAApBA,EAAsBX,QAAOa,IAAeA,EAAWX,aAE5E,OACKU,GACGA,EAAa/E,KAAI,CAACiF,EAAa7E,IACpB6E,GAAeA,EAAYR,iBAC9BtE,EAAAA,cAAA,OAAKG,UAAU,+BAA+BF,IAAKA,GAC/CD,EAAAA,cAAA,SAAOG,UAAU,sCAAsC,GAAG2E,EAAYC,gBACtE/E,EAAAA,cAAA,QAAMG,UAAU,sBACZH,EAAAA,cAAC4B,EAAAA,eAAc,CACXX,KAAM,CACFa,MAAO,CACHC,wBAAyB+C,EAAYR,mBAG7ClC,QAASpB,EAAMoB,QACfC,GAAIrB,EAAMqB,GACVC,SAAUtB,EAAMsB,SAChBnC,UAAU,0CAKtB,WAGZoC,GASRyC,2BAA6BhE,GAC8B,IAAnDA,EAAMC,KAAKC,SAAS+D,2BACb,KAEJjF,EAAAA,cAAA,OAAKG,UAAU,yCAAyCa,EAAMS,UAAUyD,4BASjFC,EAAmDnE,IACrD,MAAMoE,EAAYpE,EAAMC,KAAKC,SAASmE,UAGtC,IAFAC,EAAAA,EAAAA,mBAAkBF,KAEbG,EAAAA,EAAAA,IAAiBvE,EAAMoB,QAAQoD,cAAcC,kBAAoBL,IAAcM,EAAAA,gBAAgBC,YAAY3E,EAAMC,KAAK2E,UACvH,OAAO,KAGX,MAAMC,EAAU7E,EAAMC,KAAK2E,SAASE,MAAKC,GAAQA,EAAK7F,WAAakF,IAEnE,OAAKS,GAAYA,EAAQG,KAIlBhG,EAAAA,cAAA,OAAKG,UAAU,gCAAgC0F,EAAQG,MAHnD,MA2ZFC,EAAiEC,EAAAA,GAAiBC,wBAAmC,oXAAcC,CAAA,CAC5IC,UArZwCrF,IAAyB,IAAAsF,EAEjE,MAAM,YAAEzE,EAAW,WAAE0E,EAAU,UAAE9E,GAAcT,GACzC,QAAE8B,EAAO,SAAE5B,GAAaF,EAAMC,MAG7BuF,EAAaC,GAAmBzG,EAAAA,UAAe,GACtDA,EAAAA,WAAgB,KAER,IAAK6B,EAAa,CAEd,MAAM6E,EAAWC,GAAAA,CAAU3F,EAAMoB,QAAQoD,eACzCkB,EAASjB,eAAe9C,IAAIC,OAAOgE,kBAAmB,EAEtD,MAAMC,EAAiB,IAAIC,EAAAA,sCAAsCJ,EAASjB,eAAesB,cACzFC,EAAAA,EAAAA,mCAAkCH,EAAgBH,GAAUO,MAAKC,IAC7D,MAAMC,EAAeD,MAAAA,OAAM,EAANA,EAAQpB,MAAKsB,GACvBA,EAAMC,yBAAyBC,aAAcxE,MAAAA,OAAO,EAAPA,EAAS5C,YAE3DqH,GAA2BJ,MAAAA,OAAY,EAAZA,EAAcE,yBAAyBG,oBAAqB,EAGzFtG,EAASuG,UACTN,IACArE,MAAAA,OAAO,EAAPA,EAAS4E,iBAAkBC,EAAAA,oBAAoBC,SAC/CL,EAA2BrG,EAASuG,SAEpChB,GAAgB,GAEhBA,GAAgB,SAMjC,CAACvF,IAGJ,MAAO2G,EAAeC,GAAuB9H,EAAAA,UAAe,GAC5DA,EAAAA,WAAgB,KAER,IAAK6B,EAAa,CAEd,MAAMkG,EAAkC,CACpCC,QAAS,CAAE,CAAEC,OAAQnF,MAAAA,OAAO,EAAPA,EAASmF,SAC9BC,QAAS,CACLC,UAAWnH,EAAMoB,QAAQe,QAAQ4D,YAAYqB,UAC7C/C,WAAWgD,EAAAA,EAAAA,IAAarH,EAAMoB,QAAQe,UAE1CmF,mBAAmB,IAGvBC,EAAAA,EAAAA,uBAAsB,CAAEC,cAAexH,EAAMoB,QAAQoD,eAAiBuC,GAAUd,MAAKwB,IACjF,MAAMC,EAAkBD,EAAQ,GAC1BE,GAAeC,EAAAA,EAAAA,KAAyBF,MAAAA,OAAe,EAAfA,EAAiBG,kBAAmB,IAC5EC,KAAeH,EAAaI,EAAAA,EAAUC,WAAaL,EAAaI,EAAAA,EAAUC,YAAcD,EAAAA,EAAUE,WAClGC,KAAeP,EAAaI,EAAAA,EAAUI,cAAgBR,EAAaI,EAAAA,EAAUI,eAAiBJ,EAAAA,EAAUK,aAG1GtB,KADAgB,IAAaI,UAO9B,IAKH,MAAMG,EAAiBnI,EAAS2H,kBAAmBS,EAAAA,EAAAA,IAAsBpI,EAAS2H,iBAC5EU,EAAcF,GAAkBA,EAAeN,EAAAA,EAAUQ,aACzDC,EAAeH,GAAkBA,EAAeN,EAAAA,EAAUS,cAIhE,MAHsBH,IAAkBA,EAAeN,EAAAA,EAAUU,2BAI7D,OAAO,KAIX,MAAOC,EAAiBC,GAAyB3J,EAAAA,UAAe,GAG1D4J,EAAuBL,MAAAA,OAAW,EAAXA,EAAaM,MAAM,KAC1CC,EAAsBT,GAAkBA,EAAeU,iBAGvDC,EAA2B,CAC7BvJ,WAAYgB,EAAUhB,WACtBL,YAAaqB,EAAUrB,YACvBS,YAAaY,EAAUZ,YACvBN,aAAckB,EAAUlB,aACxBK,aAAca,EAAUb,cAEtBqJ,EAAmBnH,IAAWoH,EAAAA,EAAAA,qBAAoBpH,EAAQmF,OAAQjH,EAAMoB,QAAQoD,cAAcC,eAAesB,aAC7GoD,EAAgBnJ,EAAMmJ,cAC5BA,EAAcC,iBAAmBC,EAAAA,iBAAiBC,kBAAkBH,GACpE,MAAM,uBAAEI,GAA2BvJ,EAAMS,UACnC+I,EAAoB1H,GAAWtD,EAAsBC,wBAAwBqD,EAASkH,GACtFS,EAAqBjL,EAAsBuB,oBAAoBC,GAC/DyB,EAAuBjD,EAAsBiD,qBAAqBzB,GAClE0B,EAAsBlD,EAAsBkD,oBAAoB1B,GAChEgC,EAAsBxD,EAAsBwD,oBAAoBhC,GAChE0D,EAAqBlF,EAAsBkF,mBAAmB1D,GAC9DgE,EAA6BxF,EAAsBwF,2BAA2BhE,GAC9E0J,GAAUC,EAAAA,EAAAA,kBAAiB,QAAS3J,EAAM4J,iBAAmB,GAAI9H,MAAAA,OAAO,EAAPA,EAAS5C,SAAS2K,YACnFC,GAAgBC,EAAAA,EAAAA,wBAAuB/J,EAAM4J,iBAAmBF,GAChEM,GAAclI,MAAAA,OAAO,EAAPA,EAASkD,OAAQ9E,EAAS6D,YACxCkG,EAAgBjK,EAAMC,KAAKC,SAASgK,cAAgB,+BAAiC,+BAErFC,EAAwBA,IACtBnK,EAAMoK,aAEFpL,EAAAA,cAAA,OAAKG,UAAU,kDACXH,EAAAA,cAAA,QAAMG,UAAU,6BAChBH,EAAAA,cAAA,YAAOgB,EAAMoK,eAKlB,KAGLC,EAAmBC,IAA+C,IAAAC,EAGpE,MAAMC,EAAWC,OAAOC,SAASJ,EAAMK,OAAOC,MAAO,IAC/CC,EAAiBC,KAAKC,IAAIP,GAAYtK,EAASuG,UAAY,IAE3DuE,EAAoC,CACtCC,OAAQ/K,EAAS+G,OACjBiE,MAAMpJ,MAAAA,OAAO,EAAPA,EAASkD,OAAQ,GACvBmG,SAAUjL,EAASiB,eACnBiK,QAAS,GACTC,SAAUR,EACV/J,OAAOgB,MAAAA,OAAO,EAAPA,EAASZ,YAAahB,EAASoL,OAAS,EAC/CC,UAAuC,QAA7BhB,EAAAvK,EAAMoB,QAAQe,QAAQC,eAAO,IAAAmI,OAAA,EAA7BA,EAA+BiB,WAAY,MACrDC,cAAevL,EAASwL,qBAGxBxL,EAASuG,UAAY+D,EAAWtK,EAASuG,UAGzCkF,EAAAA,EAAAA,IAAQ,YAAaX,GAEd9K,EAASuG,UAAY+D,EAAWtK,EAASuG,WAGhDkF,EAAAA,EAAAA,IAAQ,iBAAkBX,GAI1BhL,EAAM4L,kBACN5L,EAAM4L,iBAAiB5L,EAAMC,KAAKC,SAAUuK,OAAOC,SAASJ,EAAMK,OAAOC,MAAO,IAAK5K,EAAM6L,YAkB7FC,EAAsBA,CAACT,EAAkBU,IAEvC/M,EAAAA,cAAA,UACIG,UAAU,uCAAsC,aACpCoK,EACZqB,MAAOmB,EACPC,SAAU3B,GApBCgB,CAAAA,IACnB,MAAMY,EAAQ,GAEd,IAAK,IAAIC,EAAI,EAAGA,GAAKb,EAAUa,IAC3BD,EAAME,KACFnN,EAAAA,cAAA,UAAQG,UAAU,6CAA6CyL,MAAOsB,GACjEA,IAKb,OAAOD,GAWEG,CAAcf,IAKrBgB,EAA4BA,KAC9B,MAAMJ,EAAQ,GAEd,GAAIjM,EAAMsM,aACN,OAAO,KAI6B,IAAAC,EAAnCvM,EAAMC,KAAKC,SAASgK,iBACjBlK,EAAMwM,oBAAyC,QAAnBD,EAACvM,EAAMC,KAAK6B,eAAO,IAAAyK,GAAlBA,EAAoB5M,YAAe4I,GAAgB1B,EAGhFoF,EAAME,KACFnN,EAAAA,cAAA,OAAKG,UAAWsN,GAAAA,CAAW,0BAA2B,CAAE,kBAAoD,IAAjCzM,EAAMC,KAAKC,SAASuG,YAC3FzH,EAAAA,cAAA,SAAOG,UAAU,kBAAkBsB,EAAUiM,uBAC7C1N,EAAAA,cAAA,QAAMG,UAAU,kBAAkBa,EAAMC,KAAKC,SAASuG,YAL9DwF,EAAME,KAAKL,EAAoB9L,EAAM2M,aAAe,GAAI3M,EAAM+L,mBActE,MAAMa,EAAY/L,EAAc,CAC5BC,MAAO,CACHC,wBAA0Bf,EAAMC,KAAKC,SAAuB2M,UAC5D3L,UAAWlB,EAAMC,KAAKC,SAASoL,QAEnC,CACAxK,MAAO,CACHC,wBAAyBf,EAAMC,KAAKC,SAAS4M,oBAC7C5L,UAAWlB,EAAMC,KAAKC,SAAS6M,WAKvC,GAAIvE,EAAc,CACd,MAKMwE,EALiBxE,EAAaK,MAAM,KAAKhK,KAAIoO,IAC/C,MAAMC,EAAYD,EAASpE,MAAM,KACjC,OAAO4B,OAAOyC,EAAU,OAGO9J,QAAO,CAAC+J,EAAaC,IAE7CD,GADenN,EAAM+L,gBAAkB/L,EAAM+L,gBAAkBqB,EAAeA,IAEtF,GAEHR,EAAU9L,MAAMC,0BAA4B6L,EAAU9L,MAAMC,yBAA2BiM,GACvFJ,EAAU9L,MAAMI,YAAc0L,EAAU9L,MAAMI,WAAa8L,GAmB/D,OAfAf,EAAME,KACFnN,EAAAA,cAAA,OAAKG,UAAU,gCACXH,EAAAA,cAAC4B,EAAAA,eAAc,CACXX,KAAM2M,EACNxL,QAASpB,EAAMoB,QACfC,GAAIrB,EAAMqB,GACVC,SAAUtB,EAAMsB,SAChBnC,UAAU,iBACVkO,kBAAmB5M,EAAU4M,kBAC7BC,iBAAkB7M,EAAU6M,iBAC5BC,qBAAsBvN,EAAMC,KAAKC,SAAS+D,+BAK/CgI,GAGX,GAA0B,YAAtBjM,EAAMwN,YAA2B,KAAAC,EACjC,MAAMC,EAA4B5L,MAAAA,GAAAA,EAASlD,WACrCkD,EAAQlD,WAAWwE,QAAe,CAACuK,EAAK7O,KAAoB,IAAA8O,EACxD,OAAmC,QAAnCA,EAAI9O,EAAiBO,sBAAc,IAAAuO,GAA/BA,EAAiCtO,MAC7BqO,EACO,GAAGA,MAAQ7O,EAAiBO,eAAeC,QAG/C,GAAGR,EAAiBO,eAAeC,QAGvCqO,IACR,IACH,GAEN,OACI3O,EAAAA,cAAA,OAAKG,UAAU,wCACXH,EAAAA,cAAA,OAAKG,UAAW8K,GACZjL,EAAAA,cAAC6O,EAAAA,GAAK,CACFpJ,eAAgBzE,EAAMoB,QAAQoD,cAAcC,eAC5CqJ,IAA0B,QAAvBL,EAAEzN,EAAM+N,uBAAe,IAAAN,EAAAA,EAAI,QAC9BO,YAAa/E,EACbgF,QAASjE,EACTkE,aAAclO,EAAMkO,aACpB/E,cAAeA,EACfgF,oBAAoB,WAG5BnP,EAAAA,cAAA,OAAKG,UAAU,0BACViP,EAAAA,GAASC,UAELrO,EAAMoB,QAAQO,IAAIC,OAAO0M,4BAKtBtP,EAAAA,cAAA,OAAAuP,OAAAC,OAAA,CAAMrP,UAAU,gCAAmC2K,EAAa,CAAE7K,IAAKsG,IAClEyE,GALLhL,EAAAA,cAAA,IAAAuP,OAAAC,OAAA,CAAGrP,UAAU,gCAAmC2K,EAAa,CAAE2E,KAAMlJ,EAAYtG,IAAKsG,IACjFyE,GAOT,KACmB,KAAtB0D,EAA2B1O,EAAAA,cAAA,OAAKG,UAAU,mCAAmCuO,GAA2B,GACxGhM,EAEA8D,GAAexG,EAAAA,cAAA,OAAKG,UAAU,oCAAoCa,EAAMoB,QAAQO,IAAIC,OAAO8M,uBAC3FrC,IACArM,EAAMC,KAAKC,SAASgK,eAAiBlK,EAAMC,KAAK0O,WAAa3O,EAAMS,UAAUmO,sBAC1E5P,EAAAA,cAAC6P,EAAAA,oBAAmB,CAChB1P,UAAU,wCACViC,QAASpB,EAAMoB,QACfX,UAAWT,EAAMS,UAAUmO,qBAC3BD,UAAW3O,EAAMC,KAAK0O,UACtBzO,SAAUF,EAAMC,KAAKC,YAIhCiK,KAKb,OACInL,EAAAA,cAAAA,EAAAA,SAAA,KACIA,EAAAA,cAAA,OAAKG,UAAU,iBACXH,EAAAA,cAAA,OAAKG,UAAW8K,GACZjL,EAAAA,cAAC6O,EAAAA,GAAK,CACFpJ,eAAgBzE,EAAMoB,QAAQoD,cAAcC,eAC5CqJ,IAA0B,QAAvBxI,EAAEtF,EAAM+N,uBAAe,IAAAzI,EAAAA,EAAI,GAC9B0I,YAAa/E,EACbgF,QAASjE,EACTkE,aAAclO,EAAMkO,aACpB/E,cAAeA,EACfgF,oBAAoB,WAG5BnP,EAAAA,cAAA,OAAKG,UAAU,0BACXH,EAAAA,cAAA,OAAKG,UAAU,0BACXH,EAAAA,cAACmF,EAAqBoK,OAAAC,OAAA,GAAKxO,IAC1BoO,EAAAA,GAASC,UAELrO,EAAMoB,QAAQO,IAAIC,OAAO0M,4BAKtBtP,EAAAA,cAAA,OAAAuP,OAAAC,OAAA,CAAMrP,UAAU,gCAAmC2K,EAAa,CAAE7K,IAAKsG,IAClEyE,GALLhL,EAAAA,cAAA,IAAAuP,OAAAC,OAAA,CAAGrP,UAAU,gCAAmC2K,EAAa,CAAE2E,KAAMlJ,EAAYtG,IAAKsG,IACjFyE,GAOT,KACHtF,EAAAA,gBAAgBC,YAAY6E,GACzBxK,EAAAA,cAAA,OAAKG,UAAU,mCAAmCqK,GAElD,GAEH9H,EACA+H,EACAhI,EACAzB,EAAM8O,iCAAmC9P,EAAAA,cAAA,OAAKG,UAAU,0BAA0B6C,GAClF0B,EACAM,EAEAwB,GAAexG,EAAAA,cAAA,OAAKG,UAAU,oCAAoCa,EAAMoB,QAAQO,IAAIC,OAAO8M,wBAE/FrC,IACArM,EAAMC,KAAKC,SAASgK,eAAiBlK,EAAMC,KAAK0O,WAAa3O,EAAMS,UAAUmO,sBAC1E5P,EAAAA,cAAC6P,EAAAA,oBAAmB,CAChB1P,UAAU,wCACViC,QAASpB,EAAMoB,QACfX,UAAWT,EAAMS,UAAUmO,qBAC3BD,UAAW3O,EAAMC,KAAK0O,UACtBzO,SAAUF,EAAMC,KAAKC,YAKhC0I,GACG5J,EAAAA,cAAA,OAAKG,UAAU,+BACXH,EAAAA,cAAA,KAAGG,UAAU,qCAAqC4P,KAAK,SAAQ,gBAAgBrG,EAAiBsG,QAASA,IAAMrG,GAAuBD,IACjII,GAEL9J,EAAAA,cAAA,OAAKG,UAAU,oCAAmC,eAAeuJ,GAEzDE,EAAqB/J,KAAI,CAACkG,EAAMzE,KAC5B,MAAM2O,EAAelK,EAAKmK,SAAS,KACnC,IAAIlF,EAAcjF,EAKlB,OAJIkK,IACAjF,EAAcjF,EAAKoK,QAAQ,IAAK,KAIhCnQ,EAAAA,cAAA,OAAKC,IAAKqB,EAAOnB,UAAWsN,GAAAA,CAAW,mCAAoC,CAAC,WAAcwC,KACrFjF,SAUhCG,OAQN3L,IAIP,mDCx4BA,MAAM4Q,EAA2D,GAa3D,SAAUzD,EAAQ0D,EAAmBC,GAGnBf,OAAOgB,KAAKH,EAAcC,IAAc,IAGhDG,SAAQC,GAAcL,EAAcC,GAAWI,GAAYH,KAMrE,SAAUI,EAAUD,EAAoBJ,EAAmBM,GAM7D,GAHAP,EAAcC,GAAaD,EAAcC,IAAc,GAGnDD,EAAcC,GAAWI,GACzB,MAAM,IAAIG,MAAM,sCAAsCH,MAAeJ,KAIzED,EAAcC,GAAWI,GAAcE,6DCoDrC,SAAU/H,EAAyBiI,GACrC,MAAMC,EAAS,CACXC,KAAM,IAYV,OATAF,EAAcL,SAAQQ,IAElB,GAAIA,EAAUhL,MAAQgL,EAAUC,cAAe,CAC3C,MAAMC,EAAWC,EAAYH,EAAUC,eACvCH,EAAOE,EAAUhL,MAAQgL,EAAUE,EAASE,QAC5CN,EAAOC,KAAKC,EAAUhL,MAAQkL,EAASG,SAIxCP,EAsEL,SAAUxH,EAAsBuH,GAClC,MAAMC,EAAS,GAQf,OANAD,EAAcL,SAAQQ,IACdA,EAAUhL,OACV8K,EAAOE,EAAUhL,MAAQgL,EAAUM,cAIpCR,EA4BX,SAASK,EAAYE,GAmBjB,MAZ6B,CACzB,CAACE,EAAAA,kBAAkBC,MAAY,CAACJ,OAAQ,YAAaC,KAAM,UAC3D,CAACE,EAAAA,kBAAkB/E,UAAY,CAAC4E,OAAQ,gBAAiBC,KAAM,UAC/D,CAACE,EAAAA,kBAAkBE,UAAY,CAACL,OAAQ,sBAAuBC,KAAM,QACrE,CAACE,EAAAA,kBAAkBG,SAAY,CAACN,OAAQ,aAAcC,KAAM,UAC5D,CAACE,EAAAA,kBAAkBI,SAAY,CAACP,OAAQ,eAAgBC,KAAM,SAAUO,eAAgB,gBACxF,CAACL,EAAAA,kBAAkBM,MAAY,CAACT,OAAQ,YAAaC,KAAM,SAAUO,eAAgB,eACrF,CAACL,EAAAA,kBAAkBO,WAAY,CAACV,OAAQ,eAAgBC,KAAM,UAAWO,eAAgB,gBACzF,CAACL,EAAAA,kBAAkBQ,OAAY,CAACX,OAAQ,YAAaC,KAAM,UAC3D,CAACE,EAAAA,kBAAkB1C,OAAY,CAACuC,OAAQ,YAAaC,KAAM,WAGhDA,2CC3PZ,MAAMtI,EAAY,CACrBI,YAAa,YACbE,eAAgB,iBAChB2I,yBAA0B,+BAC1BC,gBAAiB,kBACjB1I,YAAa,2BACb2I,WAAY,0BACZ1I,aAAc,4BACd2I,iBAAkB,gCAClBC,qBAAsB,8BACtB3I,yBAA0B,6CAC1B4I,wBAAyB,4CACzBC,YAAa,mBACbC,wBAAyB,oBACzBC,sBAAuB,wBACvBC,eAAgB,oBAChBC,SAAU,gBACVtJ,YAAa,cACbuJ,UAAW,oBACXC,WAAY,kBACZC,gBAAiB,qBACjBC,eAAgB,sBAChB9J,SAAU,YACV+J,WAAY,cACZC,SAAU,mBACVC,WAAY,qBACZC,UAAW,2BACXC,iBAAkB,kBAClBC,gBAAiB,iBACjBC,iBAAkB,kBAClBC,oBAAqB,qBACrBC,cAAe,qBACfC,cAAe,kBACfC,SAAU,cACVxK,UAAW,QACXyK,WAAY,cACZC,iBAAkB,WAClBC,WAAY,cACZC,eAAgB,0BAChBC,eAAgB,6BAMPC,EAAiB,CAC1BC,IAAK","sources":["webpack://bju-press/./src/themes/base/views/components/cartlineitem.component.tsx?ee83","webpack://bju-press/./src/utilities/analytics/analytics-dispatcher.ts?75be","webpack://bju-press/./src/utilities/data-attribute-parser.ts?7345","webpack://bju-press/./src/utilities/global-constants.ts?5882"],"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 MsDyn365, {\r\n IComponentProps,\r\n IGridSettings,\r\n IImageSettings,\r\n Image,\r\n isChannelTypeB2B,\r\n msdyn365Commerce,\r\n getCatalogId\r\n} from '@msdyn365-commerce/core';\r\nimport { ICartState } from '@msdyn365-commerce/global-state';\r\nimport { ChannelDeliveryOptionConfiguration, SimpleProduct, ReleasedProductType, ProductSearchCriteria } from '@msdyn365-commerce/retail-proxy';\r\nimport { CartLine, ProductCatalog, SalesLine } from '@msdyn365-commerce/retail-proxy/dist/Entities/CommerceTypes.g';\r\nimport { ArrayExtensions, getFallbackImageUrl, ObjectExtensions, validateCatalogId, getAvailabilitiesForCartLineItems, ProductAvailabilitiesForCartLineItems } from '@msdyn365-commerce-modules/retail-actions';\r\nimport { getPayloadObject, getTelemetryAttributes, ITelemetryContent } from '@msdyn365-commerce-modules/utilities';\r\nimport classNames from 'classnames';\r\nimport * as React from 'react';\r\n\r\nimport { PriceComponent, CartLinePriceEditor, ICartLinePriceEditorResources } from '@msdyn365-commerce/components';\r\n\r\nimport { convertProductAttributes } from '../../../../utilities/data-attribute-parser';\r\nimport { searchByCriteriaAsync } from '@msdyn365-commerce/retail-proxy/dist/DataActions/ProductsDataActions.g';\r\n\r\nimport { cloneDeep } from 'lodash';\r\n\r\n//----------------------------------------------------------\r\n// @CUSTOM: Kit custom imports\r\n//----------------------------------------------------------\r\nimport { attrNames } from '../../../../utilities/global-constants';\r\nimport { convertCartAttributes } from '../../../../utilities/data-attribute-parser';\r\n//----------------------------------------------------------\r\n\r\n// @CUSTOM: custom analytics imports\r\nimport { publish } from '../../../../utilities/analytics/analytics-dispatcher';\r\nimport { SingleProductEvent } from '../../../../utilities/analytics/analytics-events';\r\n\r\n/**\r\n * ICartlineResourceString: Interface for specifying the\r\n * resource strings that the component needs.\r\n */\r\nexport interface ICartlineResourceString {\r\n /**\r\n * Display string for discount label.\r\n */\r\n discountStringText: string;\r\n\r\n /**\r\n * String for size key.\r\n */\r\n sizeString: string;\r\n\r\n /**\r\n * String for color key.\r\n */\r\n colorString: string;\r\n\r\n /**\r\n * String associated with the configuration product dimension.\r\n */\r\n configString: string;\r\n\r\n /**\r\n * String for style key.\r\n */\r\n styleString: string;\r\n\r\n /**\r\n * String for amount key.\r\n */\r\n amountString?: string;\r\n\r\n /**\r\n * Display string for quantity label.\r\n */\r\n quantityDisplayString: string;\r\n\r\n /**\r\n * Display string for quantity label.\r\n */\r\n inputQuantityAriaLabel: string;\r\n\r\n /**\r\n * Aria label for the decrement button in quantity component.\r\n */\r\n decrementButtonAriaLabel?: string;\r\n\r\n /**\r\n * Aria label for the increment button in quantity component.\r\n */\r\n incrementButtonAriaLabel?: string;\r\n\r\n /**\r\n * Original text screen reader.\r\n */\r\n originalPriceText: string;\r\n\r\n /**\r\n * Current text screen reader.\r\n */\r\n currentPriceText: string;\r\n\r\n /**\r\n * Shipping Charges Text.\r\n */\r\n shippingChargesText: string;\r\n\r\n priceEditorResources?: ICartLinePriceEditorResources;\r\n\r\n /**\r\n * Sales agreement price prompt text.\r\n */\r\n salesAgreementPricePrompt?: string;\r\n\r\n /**\r\n * Shipping text.\r\n */\r\n shippingText?: string;\r\n}\r\n\r\n/**\r\n * The data about the cart line and products.\r\n */\r\nexport interface ICartLineData {\r\n cartLine: CartLine | SalesLine;\r\n cartState?: ICartState;\r\n product?: SimpleProduct;\r\n catalogs?: ProductCatalog[];\r\n}\r\n\r\nexport type CartLineDisplayMode = 'DEFAULT' | 'COMPACT';\r\n\r\n/**\r\n * ICartLineProps: The props required to render cartLineitem.\r\n */\r\nexport interface ICartLineProps extends IComponentProps {\r\n /**\r\n * The flag to change the quantity component from interactivity to static.\r\n */\r\n disableQuantityInteractivity?: boolean;\r\n\r\n /**\r\n * The primary image url.\r\n */\r\n primaryImageUrl?: string;\r\n\r\n /**\r\n * The product url.\r\n */\r\n productUrl?: string;\r\n\r\n /**\r\n * GridSettings for the product image in cartLine.\r\n */\r\n gridSettings: IGridSettings;\r\n\r\n /**\r\n * ImageSettings for the product image in cartLine.\r\n */\r\n imageSettings: IImageSettings;\r\n\r\n /**\r\n * Boolean flag to indicate if the item is out of stock.\r\n */\r\n isOutOfStock?: boolean;\r\n\r\n /**\r\n * Flag to make quantity section editable.\r\n */\r\n isQuantityEditable?: boolean;\r\n\r\n /**\r\n * Max quantity for line item.\r\n */\r\n maxQuantity?: number;\r\n\r\n /**\r\n * Current quantity for line item.\r\n */\r\n currentQuantity?: number;\r\n\r\n /**\r\n * Resource string for the component.\r\n */\r\n resources: ICartlineResourceString;\r\n\r\n /**\r\n * SalesLine flag.\r\n */\r\n isSalesLine?: boolean;\r\n\r\n /**\r\n * Error message to show in place of quantity.\r\n */\r\n errorMessage?: string;\r\n\r\n /**\r\n * Display mode to use.\r\n */\r\n displayMode?: CartLineDisplayMode;\r\n\r\n /**\r\n * Inventory information label.\r\n */\r\n inventoryInformationLabel?: string;\r\n\r\n /**\r\n * Inventory information class name.\r\n */\r\n inventoryLabelClassName?: string;\r\n\r\n /**\r\n * Flag to show/hide shipping charges for line items.\r\n */\r\n showShippingChargesForLineItems?: boolean;\r\n\r\n /**\r\n * Boolean flag to indicate if cart state status is ready.\r\n */\r\n isCartStateReady?: boolean;\r\n\r\n /**\r\n * Chanel Delivery Option configuration is from api.\r\n */\r\n channelDeliveryOptionConfig?: ChannelDeliveryOptionConfiguration;\r\n\r\n /**\r\n * The telemetry content.\r\n */\r\n telemetryContent?: ITelemetryContent;\r\n\r\n /**\r\n * The cart line index.\r\n */\r\n lineIndex?: number;\r\n\r\n /**\r\n * The cart line delivery location.\r\n */\r\n deliveryLocation?: string;\r\n\r\n /**\r\n * Quantity onChange callback.\r\n */\r\n quantityOnChange?(cartLine: CartLine, newQuantity: number, lineIndex?: number): void;\r\n}\r\n\r\ninterface IDimensionStrings {\r\n /**\r\n * String for size key.\r\n */\r\n sizeString: string;\r\n\r\n /**\r\n * String for color key.\r\n */\r\n colorString: string;\r\n\r\n /**\r\n * String associated with the configuration product dimension.\r\n */\r\n configString: string;\r\n\r\n /**\r\n * String for style key.\r\n */\r\n styleString: string;\r\n\r\n /**\r\n * String for amount key.\r\n */\r\n amountString?: string;\r\n}\r\n\r\nconst CartLineItemFunctions = {\r\n renderProductDimensions: (Product: SimpleProduct, DimensionStrings: IDimensionStrings) => {\r\n if (!Product || !Product.Dimensions) {\r\n return [];\r\n }\r\n\r\n return Product.Dimensions.map(productDimension => {\r\n if (productDimension.DimensionTypeValue === 1) {\r\n return (\r\n
\r\n \r\n {DimensionStrings.colorString}\r\n {productDimension.DimensionValue && productDimension.DimensionValue.Value}\r\n \r\n
\r\n );\r\n }\r\n\r\n if (productDimension.DimensionTypeValue === 2) {\r\n return (\r\n
\r\n \r\n {DimensionStrings.configString}\r\n {productDimension.DimensionValue?.Value}\r\n \r\n
\r\n );\r\n }\r\n\r\n if (productDimension.DimensionTypeValue === 3) {\r\n return (\r\n
\r\n \r\n {DimensionStrings.sizeString}\r\n {productDimension.DimensionValue?.Value}\r\n \r\n
\r\n );\r\n }\r\n\r\n if (productDimension.DimensionTypeValue === 4) {\r\n return (\r\n
\r\n \r\n {Product.IsGiftCard ? DimensionStrings.amountString : DimensionStrings.styleString}\r\n {productDimension.DimensionValue?.Value}\r\n \r\n
\r\n );\r\n }\r\n return null;\r\n });\r\n },\r\n renderDiscountLines: (props: ICartLineProps) => {\r\n if (!props.data.cartLine.DiscountLines || props.data.cartLine.DiscountLines.length === 0) {\r\n return null;\r\n }\r\n\r\n return props.data.cartLine.DiscountLines.map((discountLine, index) => {\r\n return (\r\n
\r\n \r\n {discountLine.OfferName ? discountLine.OfferName : ''}:{` ${props.resources.discountStringText || 'Discount'} `}\r\n \r\n \r\n {discountLine.DiscountCost && (\r\n <>\r\n \r\n \r\n )}\r\n \r\n {` (${discountLine.EffectivePercentage !== undefined ? discountLine.EffectivePercentage : ''}%)`}\r\n
\r\n );\r\n });\r\n },\r\n renderInventoryLabel: (props: ICartLineProps) => {\r\n // @CUSTOM: we do not want to show inventory status with backorders enabled\r\n return null;\r\n\r\n // if (!props.inventoryInformationLabel) {\r\n // return null;\r\n // }\r\n // const inventoryCssName = props.inventoryLabelClassName\r\n // ? `msc-cart-line__product-inventory-label ${props.inventoryLabelClassName}`\r\n // : 'msc-cart-line__product-inventory-label';\r\n // return {props.inventoryInformationLabel};\r\n },\r\n\r\n /**\r\n * Gets the react node for product unit of measure display.\r\n * @param props - ICartLineProps props.\r\n * @returns The node representing markup for unit of measure component.\r\n */\r\n renderUnitOfMeasure: (props: ICartLineProps) => {\r\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access -- Do not need type check for appsettings\r\n if (\r\n props.context.app.config &&\r\n (!props.context.app.config.unitOfMeasureDisplayType || props.context.app.config.unitOfMeasureDisplayType === 'none')\r\n ) {\r\n return undefined;\r\n }\r\n\r\n const product = props.data.product;\r\n if (!product || !product.DefaultUnitOfMeasure) {\r\n return undefined;\r\n }\r\n\r\n return (\r\n
\r\n {product.DefaultUnitOfMeasure}\r\n
\r\n );\r\n },\r\n renderShippingLabel: (props: ICartLineProps) => {\r\n const pickupDeliveryModeCode = props.context.request.channel?.PickupDeliveryModeCode;\r\n const channelDeliveryOptionConfig = props.channelDeliveryOptionConfig;\r\n const cartline = props.data.cartLine;\r\n let hasShippingMethod = false;\r\n if (channelDeliveryOptionConfig !== undefined) {\r\n hasShippingMethod = !!(\r\n cartline.DeliveryMode &&\r\n channelDeliveryOptionConfig.PickupDeliveryModeCodes?.some(deliveryMode => deliveryMode !== cartline.DeliveryMode)\r\n );\r\n } else {\r\n hasShippingMethod = !!(cartline.DeliveryMode && cartline.DeliveryMode !== pickupDeliveryModeCode);\r\n }\r\n if (!hasShippingMethod) {\r\n return undefined;\r\n }\r\n\r\n const shippingChargeLines = (cartline.ChargeLines || []).filter(chargeLine => chargeLine.IsShipping);\r\n\r\n if (shippingChargeLines.length === 0) {\r\n return undefined;\r\n }\r\n\r\n const freightFee = shippingChargeLines.reduce((chargeTotal, chargeLine) => {\r\n return chargeTotal + (chargeLine.CalculatedAmount || 0);\r\n }, 0);\r\n\r\n const priceComponent = (\r\n \r\n );\r\n return (\r\n <>\r\n \r\n {priceComponent}\r\n \r\n );\r\n },\r\n renderOtherCharges: (props: ICartLineProps) => {\r\n const cartline = props.data.cartLine;\r\n const otherCharges = cartline.ChargeLines?.filter(chargeline => !chargeline.IsShipping);\r\n\r\n return (\r\n (otherCharges &&\r\n otherCharges.map((otherCharge, key) => {\r\n return otherCharge && otherCharge.CalculatedAmount ? (\r\n
\r\n \r\n \r\n \r\n \r\n
\r\n ) : (\r\n ''\r\n );\r\n })) ||\r\n undefined\r\n );\r\n },\r\n\r\n /**\r\n * Render the sales agreement prompt.\r\n * @param props - The ICartLineProps.\r\n * @returns The JSX.Element.\r\n */\r\n renderSalesAgreementPrompt: (props: ICartLineProps): JSX.Element | null => {\r\n if (props.data.cartLine.SalesAgreementLineRecordId === 0) {\r\n return null;\r\n }\r\n return
{props.resources.salesAgreementPricePrompt}
;\r\n }\r\n};\r\n\r\n/**\r\n * Renders catalog label for the cart line.\r\n * @param props - Cart line props.\r\n * @returns Catalog label.\r\n */\r\nconst CatalogLabelComponent: React.FC = (props: ICartLineProps) => {\r\n const catalogId = props.data.cartLine.CatalogId;\r\n validateCatalogId(catalogId);\r\n\r\n if (!isChannelTypeB2B(props.context.actionContext.requestContext) || !catalogId || !ArrayExtensions.hasElements(props.data.catalogs)) {\r\n return null;\r\n }\r\n\r\n const catalog = props.data.catalogs.find(item => item.RecordId === catalogId);\r\n\r\n if (!catalog || !catalog.Name) {\r\n return null;\r\n }\r\n\r\n return
{catalog.Name}
;\r\n};\r\n\r\n// eslint-disable-next-line no-redeclare\r\nconst CartLine: React.FC = (props: ICartLineProps) => {\r\n\r\n const { isSalesLine, productUrl, resources } = props;\r\n const { product, cartLine } = props.data;\r\n\r\n // @CUSTOM: backorder customization\r\n const [isBackorder, backorderLoaded] = React.useState(false);\r\n React.useEffect(() => {\r\n\r\n if (!isSalesLine) {\r\n\r\n const cloneCtx = cloneDeep(props.context.actionContext);\r\n cloneCtx.requestContext.app.config.enableStockCheck = true;\r\n\r\n const backorderInput = new ProductAvailabilitiesForCartLineItems(cloneCtx.requestContext.apiSettings);\r\n getAvailabilitiesForCartLineItems(backorderInput, cloneCtx).then(result => {\r\n const availability = result?.find(avail => {\r\n return avail.ProductAvailableQuantity.ProductId === product?.RecordId;\r\n });\r\n const productAvailableQuantity = availability?.ProductAvailableQuantity.AvailableQuantity || 0\r\n\r\n if (\r\n cartLine.Quantity &&\r\n availability &&\r\n product?.ItemTypeValue !== ReleasedProductType.Service &&\r\n productAvailableQuantity < cartLine.Quantity\r\n ) {\r\n backorderLoaded(true);\r\n } else {\r\n backorderLoaded(false);\r\n }\r\n });\r\n\r\n }\r\n\r\n }, [cartLine]);\r\n\r\n // @CUSTOM: T&E customization\r\n const [isTestOrScore, isTestOrScoreLoaded] = React.useState(true);\r\n React.useEffect(() => {\r\n\r\n if (!isSalesLine) {\r\n\r\n const criteria: ProductSearchCriteria = {\r\n ItemIds: [ { ItemId: product?.ItemId }],\r\n Context: {\r\n ChannelId: props.context.request.apiSettings.channelId,\r\n CatalogId: getCatalogId(props.context.request)\r\n },\r\n IncludeAttributes: true\r\n };\r\n\r\n searchByCriteriaAsync({ callerContext: props.context.actionContext }, criteria).then(results => {\r\n const productWithAttr = results[0];\r\n const formattedAtr = convertProductAttributes(productWithAttr?.AttributeValues || [])\r\n const isTesting = !!(formattedAtr[attrNames.testType] && formattedAtr[attrNames.testType] !== attrNames.isNotTest);\r\n const isScoring = !!(formattedAtr[attrNames.productType] && formattedAtr[attrNames.productType] === attrNames.scoringType);\r\n\r\n if (isTesting || isScoring) {\r\n isTestOrScoreLoaded(true);\r\n } else {\r\n isTestOrScoreLoaded(false);\r\n }\r\n });\r\n }\r\n }, []);\r\n\r\n //------------------------------------------------------\r\n // @CUSTOM: Kit contents display\r\n //------------------------------------------------------\r\n const lineAttributes = cartLine.AttributeValues && convertCartAttributes(cartLine.AttributeValues);\r\n const kitContents = lineAttributes && lineAttributes[attrNames.kitContents] as string;\r\n const kitElectives = lineAttributes && lineAttributes[attrNames.kitElectives] as string;\r\n const isElective = !!(lineAttributes && lineAttributes[attrNames.kitLineParentAssociation]);\r\n\r\n // Do not return kit cart lines if elective\r\n if (isElective) {\r\n return null;\r\n }\r\n\r\n // Hooks for toggling Show Contents section\r\n const [showKitContents, toggleShowKitContents] = React.useState(false);\r\n\r\n // Formatted kit contents to display\r\n const formattedKitContents = kitContents?.split('|');\r\n const showKitContentsText = lineAttributes && lineAttributes.showContentsText;\r\n //------------------------------------------------------\r\n\r\n const destructDimensionStrings = {\r\n sizeString: resources.sizeString,\r\n colorString: resources.colorString,\r\n styleString: resources.styleString,\r\n configString: resources.configString,\r\n amountString: resources.amountString\r\n };\r\n const fallbackImageUrl = product && getFallbackImageUrl(product.ItemId, props.context.actionContext.requestContext.apiSettings);\r\n const imageSettings = props.imageSettings;\r\n imageSettings.cropFocalRegion = !ObjectExtensions.isNullOrUndefined(imageSettings);\r\n const { inputQuantityAriaLabel } = props.resources;\r\n const productDimensions = product && CartLineItemFunctions.renderProductDimensions(product, destructDimensionStrings);\r\n const renderDisountLines = CartLineItemFunctions.renderDiscountLines(props);\r\n const renderInventoryLabel = CartLineItemFunctions.renderInventoryLabel(props);\r\n const renderUnitOfMeasure = CartLineItemFunctions.renderUnitOfMeasure(props);\r\n const renderShippingLabel = CartLineItemFunctions.renderShippingLabel(props);\r\n const renderOtherCharges = CartLineItemFunctions.renderOtherCharges(props);\r\n const renderSalesAgreementPrompt = CartLineItemFunctions.renderSalesAgreementPrompt(props);\r\n const payLoad = getPayloadObject('click', props.telemetryContent!, '', product?.RecordId.toString());\r\n const prodAttribute = getTelemetryAttributes(props.telemetryContent!, payLoad);\r\n const productName = product?.Name || cartLine.Description;\r\n const imgeClassName = props.data.cartLine.IsInvoiceLine ? 'msc-cart-line__invoice-image' : 'msc-cart-line__product-image';\r\n\r\n const _generateErrorMessage = (): JSX.Element | null => {\r\n if (props.errorMessage) {\r\n return (\r\n
\r\n \r\n {props.errorMessage}\r\n
\r\n );\r\n }\r\n\r\n return null;\r\n };\r\n\r\n const _updateQuantity = (event: React.ChangeEvent) => {\r\n\r\n // @CUSTOM: publish events for add to cart or remove for analytics\r\n const newValue = Number.parseInt(event.target.value, 10)\r\n const quantityChange = Math.abs(newValue - (cartLine.Quantity || 0));\r\n\r\n const analyticsData: SingleProductEvent = {\r\n itemID: cartLine.ItemId!,\r\n name: product?.Name || '',\r\n discount: cartLine.DiscountAmount,\r\n variant: '',\r\n quantity: quantityChange,\r\n price: product?.BasePrice || cartLine.Price || 0,\r\n currency: props.context.request.channel?.Currency || 'USD',\r\n unitOfMeasure: cartLine.UnitOfMeasureSymbol\r\n };\r\n\r\n if (cartLine.Quantity && newValue > cartLine.Quantity) {\r\n\r\n // add to cart event\r\n publish('addToCart', analyticsData);\r\n\r\n } else if (cartLine.Quantity && newValue < cartLine.Quantity) {\r\n\r\n // remove from cart event\r\n publish('removeFromCart', analyticsData);\r\n }\r\n // end customization\r\n\r\n if (props.quantityOnChange) {\r\n props.quantityOnChange(props.data.cartLine, Number.parseInt(event.target.value, 10), props.lineIndex);\r\n }\r\n };\r\n\r\n const _generateMenu = (quantity: number) => {\r\n const nodes = [];\r\n\r\n for (let i = 1; i <= quantity; i++) {\r\n nodes.push(\r\n \r\n );\r\n }\r\n\r\n return nodes;\r\n };\r\n\r\n const _generateSelectMenu = (quantity: number, currentQuantity: number | undefined): JSX.Element => {\r\n return (\r\n \r\n {_generateMenu(quantity)}\r\n \r\n );\r\n };\r\n\r\n const _generateQuantityAndPrice = (): JSX.Element[] | null => {\r\n const nodes = [];\r\n\r\n if (props.isOutOfStock) {\r\n return null;\r\n }\r\n\r\n // No quantity selector for invoice line\r\n if (!props.data.cartLine.IsInvoiceLine) {\r\n if (props.isQuantityEditable && !props.data.product?.IsGiftCard && !kitContents && !isTestOrScore) { // @CUSTOM: Kit contents - only show quantity selector if product is not a kit with contents or T&E\r\n nodes.push(_generateSelectMenu(props.maxQuantity || 10, props.currentQuantity));\r\n } else {\r\n nodes.push(\r\n
\r\n \r\n {props.data.cartLine.Quantity}\r\n
\r\n );\r\n }\r\n }\r\n\r\n //--------------------------------------------------\r\n // @CUSTOM: Kit contents display - price updates\r\n //--------------------------------------------------\r\n const priceData = isSalesLine ? {\r\n price: {\r\n CustomerContextualPrice: (props.data.cartLine as SalesLine).NetAmount,\r\n BasePrice: props.data.cartLine.Price\r\n }\r\n } : {\r\n price: {\r\n CustomerContextualPrice: props.data.cartLine.NetAmountWithoutTax,\r\n BasePrice: props.data.cartLine.NetPrice\r\n }\r\n };\r\n\r\n // If kit contains electives, add price to kit item\r\n if (kitElectives) {\r\n const electivePrices = kitElectives.split('|').map(elective => {\r\n const splitData = elective.split(':');\r\n return Number(splitData[1]);\r\n });\r\n\r\n const electiveSum = electivePrices.reduce((accumulator, currentValue) => {\r\n const electivePrice = props.currentQuantity ? props.currentQuantity * currentValue : currentValue;\r\n return accumulator + electivePrice;\r\n }, 0);\r\n\r\n priceData.price.CustomerContextualPrice && (priceData.price.CustomerContextualPrice += electiveSum);\r\n priceData.price.BasePrice && (priceData.price.BasePrice += electiveSum);\r\n }\r\n //--------------------------------------------------\r\n\r\n nodes.push(\r\n
\r\n \r\n
\r\n );\r\n\r\n return nodes;\r\n };\r\n\r\n if (props.displayMode === 'COMPACT') {\r\n const reducedDimensions: string = product?.Dimensions\r\n ? product.Dimensions.reduce((str, productDimension) => {\r\n if (productDimension.DimensionValue?.Value) {\r\n if (str) {\r\n return `${str}, ${productDimension.DimensionValue.Value}`;\r\n }\r\n\r\n return `${productDimension.DimensionValue.Value}`;\r\n }\r\n\r\n return str;\r\n }, '')\r\n : '';\r\n\r\n return (\r\n
\r\n
\r\n \r\n
\r\n
\r\n {MsDyn365.isBrowser ? (\r\n // @CUSTOM: Check global config if links back to PDP should be disabled\r\n !props.context.app.config.disableCartLineProductLinks ? (\r\n \r\n {productName}\r\n \r\n ) : (\r\n \r\n {productName}\r\n \r\n )\r\n ) : null}\r\n {reducedDimensions !== '' ?
{reducedDimensions}
: ''}\r\n {renderUnitOfMeasure}\r\n {/* @CUSTOM: backorder customization */}\r\n {isBackorder &&
{props.context.app.config.backorderTextCartLine}
}\r\n {_generateQuantityAndPrice()}\r\n {props.data.cartLine.IsInvoiceLine && props.data.cartState && props.resources.priceEditorResources && (\r\n \r\n )}\r\n
\r\n {_generateErrorMessage()}\r\n
\r\n );\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 {MsDyn365.isBrowser ? (\r\n // @CUSTOM: Check global config if links back to PDP should be disabled\r\n !props.context.app.config.disableCartLineProductLinks ? (\r\n \r\n {productName}\r\n \r\n ) : (\r\n \r\n {productName}\r\n \r\n )\r\n ) : null}\r\n {ArrayExtensions.hasElements(productDimensions) ? (\r\n
{productDimensions}
\r\n ) : (\r\n ''\r\n )}\r\n {renderUnitOfMeasure}\r\n {renderDisountLines}\r\n {renderInventoryLabel}\r\n {props.showShippingChargesForLineItems &&
{renderShippingLabel}
}\r\n {renderOtherCharges}\r\n {renderSalesAgreementPrompt}\r\n {/* @CUSTOM: backorder customization */}\r\n {isBackorder &&
{props.context.app.config.backorderTextCartLine}
}\r\n
\r\n {_generateQuantityAndPrice()}\r\n {props.data.cartLine.IsInvoiceLine && props.data.cartState && props.resources.priceEditorResources && (\r\n \r\n )}\r\n
\r\n {/* @CUSTOM: Kit contents display */}\r\n {formattedKitContents && (\r\n
\r\n toggleShowKitContents(!showKitContents)}>\r\n {showKitContentsText}\r\n \r\n
\r\n {\r\n formattedKitContents.map((item, index) => {\r\n const isCustomized = item.includes('*');\r\n let productName = item;\r\n if (isCustomized) {\r\n productName = item.replace('*', '');\r\n }\r\n\r\n return (\r\n
\r\n {productName}\r\n
\r\n );\r\n })\r\n }\r\n
\r\n
\r\n )}\r\n {/* @CUSTOM: End kit contents display customization */}\r\n
\r\n {_generateErrorMessage()}\r\n \r\n );\r\n};\r\n\r\n// @ts-expect-error\r\nexport const CartLineItemComponent: React.FunctionComponent = msdyn365Commerce.createComponentOverride('CartLineItem', {\r\n component: CartLine,\r\n ...CartLineItemFunctions\r\n});\r\n\r\n\r\nexport default CartLineItemComponent;","//==============================================================================\r\n// Analytics Event Dispatcher (Simple Pub-Sub system)\r\n//\r\n// This module receives events and forwards them to the appropriate handlers\r\n// Subscriptions are managed using a subscriber ID to aid in unsubscribing\r\n//\r\n// NOTE: Singletons aren't compatible with SSR. This module acts as a singleton,\r\n// maintaining its data as a global. Modules MUST call subscribe on the client\r\n// ONLY (via componentDidMount).\r\n//\r\n// @TODO: Currently, only client-side events will be processed. Events generated\r\n// during server-side renders will be lost. If we move data to a data action\r\n// it can be persisted from server to client. That will allow us to queue up\r\n// events generated on the server or before subscriptions occur, and emit\r\n// them immediately upon subscription.\r\n//==============================================================================\r\nimport { EventHandler } from \"./analytics-events\";\r\n\r\n//==============================================================================\r\n// INTERFACES\r\n//==============================================================================\r\n\r\n// List of subscribers to a single event\r\ninterface EventSubscribers {\r\n [subscriber: string]: EventHandler;\r\n}\r\n\r\n//==============================================================================\r\n// GLOBALS\r\n//==============================================================================\r\n\r\n// List of subscriptions, organized by event name and then subscriber name\r\nconst subscriptions: { [eventName: string]: EventSubscribers } = {};\r\n\r\n//==============================================================================\r\n// FUNCTIONS\r\n//==============================================================================\r\n\r\n//==========================================================\r\n// Called by event emitters when an event occurs\r\n//\r\n// NOTE: This should only be called on the client! Events on\r\n// the server will be lost. They should instead be queued\r\n// via a data action cache.\r\n//==========================================================\r\nexport function publish(eventName: string, eventData: unknown): void {\r\n\r\n // Get the list of subscribers for this event\r\n const subscribers = Object.keys(subscriptions[eventName] || {});\r\n\r\n // Notify each subscriber\r\n subscribers.forEach(subscriber => subscriptions[eventName][subscriber](eventData));\r\n}\r\n\r\n//==========================================================\r\n// Called by event handlers when they self-register for events\r\n//==========================================================\r\nexport function subscribe(subscriber: string, eventName: string, handler: EventHandler): void {\r\n\r\n // If it's a new event, create an entry\r\n subscriptions[eventName] = subscriptions[eventName] || {};\r\n\r\n // Ensure this subscriber isn't already subscribed to this event\r\n if (subscriptions[eventName][subscriber]) {\r\n throw new Error(`Duplicate subscription request for ${subscriber}: ${eventName}`);\r\n }\r\n\r\n // Add the subscription\r\n subscriptions[eventName][subscriber] = handler;\r\n}\r\n\r\n//==========================================================\r\n// Unsubscribe from a single event\r\n//==========================================================\r\nexport function unsubscribe(subscriber: string, eventName: string): void {\r\n if (subscriptions[eventName] && subscriptions[eventName][subscriber]) {\r\n delete subscriptions[eventName][subscriber];\r\n }\r\n}\r\n","//==============================================================================\r\n// D365 OData Attribute Parser\r\n//\r\n// In creating this, it became clear that \"attributes\" is a general term.\r\n//\r\n// Product attributes are a first-class entity. They have their own dedicated\r\n// fields and schema.\r\n//\r\n// The more generic term \"attributes\" is used as a generic extension system.\r\n// Almost every entity (including Product Attributes) has an ExtensionProperties\r\n// field for jamming extra information into. In some cases, D365 handles these\r\n// natively, such as sales order line and header attributes, or customer\r\n// attributes. Attributes using ExtensionProperties use the\r\n// CommerceProperty and CommercePropertyValue types.\r\n//\r\n// A major note about ExtensionProperty-based attributes: they have fields\r\n// for many different data types, but there's no indicator as to which\r\n// of the fields is actually used. The consumer of the data is expected to\r\n// know the data type ahead of time. In the case of D365-native attribute users\r\n// such as customers and sales orders, only the string type appears to work.\r\n//\r\n// This module includes parsers for generic ExtensionProperties-based attributes\r\n// and Product Attributes. Though different Product Attribute retail server\r\n// calls use the same AttributeValue entity to transmit the data, they appear\r\n// to return different fields from that entity. Because of this, two different\r\n// parser calls are included here. They currently share the same implementation,\r\n// but by including different call signatures we have the ability to diverge\r\n// the implementations if the need arises.\r\n//\r\n// A note about Product Attributes: These contain both a friendly name,\r\n// displayed to users in back office, and an internal name. The internal name\r\n// can be the same as the friendly name, but by convention we've been pushing\r\n// for a PascalCase scheme. At present, the searchByCriteria call returns only\r\n// the unfriendly name, and the GetAttributeValues call returns only the\r\n// friendly name. We don't have a known method of correlating the two. That may\r\n// be an argument for keeping the friendly and unfriendly names identical.\r\n//==============================================================================\r\nimport {\r\n CommerceProperty, // Generic attributes stored in ExtensionProperties\r\n CommercePropertyValue, // Generic attributes stored in AttributeValue\r\n AttributeValue, AttributeDataType, // Product attributes or Product Search Result attributes\r\n CustomerAttribute, // Customer attributes\r\n IDictionary,\r\n} from '@msdyn365-commerce/retail-proxy';\r\n\r\n//==============================================================================\r\n// INTERFACES AND CONSTANTS\r\n//==============================================================================\r\nexport type CommerceValueTypes = string | number | boolean | Date;\r\n\r\n// This is me giving up on proper typing. If doing this in TypeScript is possible, I don't know how.\r\n// For the key \"meta\", the type should be a hash of strings.\r\n// For all other keys, the type is a CommerceValueType.\r\nexport type AttributesWithMetadata = {\r\n [key: string]: CommerceValueTypes | IDictionary\r\n};\r\n\r\n// Type to support both internal and friendly name for attributes\r\nexport type AttributesLocalized = {\r\n [key: string]: {\r\n friendlyName?: string,\r\n value?: CommerceValueTypes | IDictionary\r\n }\r\n};\r\n\r\n// Return type for getTypeInfo()\r\ntype TypeData = {\r\n source: keyof AttributeValue,\r\n type: string,\r\n\r\n customerSource?: keyof CommercePropertyValue,\r\n};\r\n\r\n//==============================================================================\r\n// FUNCTIONS\r\n//==============================================================================\r\n\r\n//----------------------------------------------------------\r\n// This version handles ExtensionProperties conversion.\r\n//\r\n// While these have a bunch of potential fields, the value\r\n// is always stored within StringValue.\r\n// There isn't a data type field, so if the content wasn't\r\n// in StringValue we wouldn't know where to find it.\r\n//----------------------------------------------------------\r\nexport function convertExtensionProperties(attributeList: CommerceProperty[]): IDictionary {\r\n const output = {};\r\n\r\n attributeList.forEach(entry => {\r\n if (entry.Key) {\r\n output[entry.Key] = entry.Value?.StringValue; // Ecommerce seems to always use strings.\r\n }\r\n });\r\n\r\n return output;\r\n}\r\n\r\n//----------------------------------------------------------\r\n// For these attributes, the Name is always the friendly\r\n// name.\r\n// KeyName and ExtensionProperties aren't defined.\r\n//\r\n// These results seem to be missing CurrencyValue,\r\n// FloatValue, DateTimeOffsetValue\r\n// I don't know if those data types aren't allowed here.\r\n//\r\n// Return value: Hash of key: property values with variable\r\n// types. There is also a \"meta\" key containing a hash of\r\n// all the attribute keys and their corresponding types.\r\n//\r\n// Example:\r\n// {\r\n// flavor: 'bland',\r\n// calories: 5300,\r\n// meta: {\r\n// flavor: 'string',\r\n// calories: 'number'\r\n// }\r\n// }\r\n//----------------------------------------------------------\r\nexport function convertProductAttributes(attributeList: AttributeValue[]): AttributesWithMetadata {\r\n const output = {\r\n meta: {}\r\n };\r\n\r\n attributeList.forEach(attribute => {\r\n // These should always be present, but TypeScript insists they can be undefined.\r\n if (attribute.Name && attribute.DataTypeValue) {\r\n const typeData = getTypeInfo(attribute.DataTypeValue);\r\n output[attribute.Name] = attribute[typeData.source]; // Ecommerce seems to require strings\r\n output.meta[attribute.Name] = typeData.type;\r\n }\r\n });\r\n\r\n return output;\r\n}\r\n\r\n//----------------------------------------------------------\r\n// For these attributes, the Name is the friendly\r\n// name while KeyName is the internal name.\r\n//\r\n// This makes use of combined attributes containing both\r\n// internal and friendly name to support localization.\r\n//\r\n// Return value: Hash of internal name keys containing an object with both the\r\n// friendly name and attribute value There is also a \"meta\" key containing a\r\n// hash of all the attribute keys and their corresponding types.\r\n//\r\n// Example:\r\n// {\r\n// flavor: {\r\n// friendlyName: Flavor,\r\n// value: 'bland'\r\n// },\r\n// calories: {\r\n// friendlyName: Calories,\r\n// value: 5300\r\n// },\r\n// meta: {\r\n// flavor: 'string',\r\n// calories: 'number'\r\n// }\r\n// }\r\n//----------------------------------------------------------\r\nexport function convertProductAttributesLocalized(attributeList: AttributeValue[]): AttributesLocalized {\r\n const output = {\r\n meta: {}\r\n };\r\n\r\n attributeList.forEach(attribute => {\r\n if (attribute.KeyName && attribute.DataTypeValue) {\r\n const typeData = getTypeInfo(attribute.DataTypeValue);\r\n output[attribute.KeyName] = {\r\n friendlyName: attribute.Name,\r\n value: attribute[typeData.source]\r\n };\r\n output.meta[attribute.KeyName] = typeData.type;\r\n }\r\n });\r\n\r\n return output;\r\n}\r\n\r\n//----------------------------------------------------------\r\n// For these attributes, the\r\n// Name/KeyName/ExtensionProperties is always the unfriendly\r\n// name.\r\n//\r\n// These results are only missing the Swatches field.\r\n//\r\n// Though the returned value is a bit different, at present\r\n// the implementation for convertProductAttributes works for\r\n// search results.\r\n// If they diverge in the future, extend this function.\r\n//----------------------------------------------------------\r\nexport function convertSearchAttributes(attributeList: AttributeValue[]): AttributesWithMetadata {\r\n return convertProductAttributes(attributeList);\r\n}\r\n\r\n//----------------------------------------------------------\r\n// For these attributes, the Name is always the friendly\r\n// name. Value is always Text, and DataTypeValue is not\r\n// present here.\r\n//----------------------------------------------------------\r\nexport function convertCartAttributes(attributeList: AttributeValue[]): AttributesWithMetadata {\r\n const output = {};\r\n\r\n attributeList.forEach(attribute => {\r\n if (attribute.Name) {\r\n output[attribute.Name] = attribute.TextValue;\r\n }\r\n });\r\n\r\n return output;\r\n}\r\n\r\n//----------------------------------------------------------\r\n//----------------------------------------------------------\r\nexport function convertCustomerAttributes(attributeList: CustomerAttribute[] | undefined): AttributesWithMetadata {\r\n const output = {\r\n meta: {}\r\n };\r\n\r\n attributeList?.forEach(attribute => {\r\n // These should always be present, but TypeScript insists they can be undefined.\r\n if (attribute.Name && attribute.DataTypeValue) {\r\n const typeData = getTypeInfo(attribute.DataTypeValue);\r\n output[attribute.Name] = attribute.AttributeValue && typeData.customerSource && attribute.AttributeValue[typeData.customerSource];\r\n output.meta[attribute.Name] = typeData.type;\r\n }\r\n });\r\n\r\n return output;\r\n}\r\n\r\n//----------------------------------------------------------\r\n// Finds the source field and type for an attribute\r\n//\r\n// This should probably be extended to better support\r\n// currency, which seems to be two fields glued together.\r\n//----------------------------------------------------------\r\nfunction getTypeInfo(type: AttributeDataType): TypeData {\r\n\r\n // Awkward, but this helps TypeScript enforce strict type checking\r\n type TypeMapType = {\r\n [key in AttributeDataType]: TypeData\r\n };\r\n\r\n const typeMap: TypeMapType = {\r\n [AttributeDataType.None]: {source: 'TextValue', type: 'string'}, // We need to choose something\r\n [AttributeDataType.Currency]: {source: 'CurrencyValue', type: 'number'}, // Should also include CurrencyCode, which is a string?\r\n [AttributeDataType.DateTime]: {source: 'DateTimeOffsetValue', type: 'Date'},\r\n [AttributeDataType.Decimal]: {source: 'FloatValue', type: 'number'},\r\n [AttributeDataType.Integer]: {source: 'IntegerValue', type: 'number', customerSource: 'IntegerValue'},\r\n [AttributeDataType.Text]: {source: 'TextValue', type: 'string', customerSource: 'StringValue'},\r\n [AttributeDataType.TrueFalse]: {source: 'BooleanValue', type: 'boolean', customerSource: 'BooleanValue'},\r\n [AttributeDataType.Video]: {source: 'TextValue', type: 'string'},\r\n [AttributeDataType.Image]: {source: 'TextValue', type: 'string'}\r\n };\r\n\r\n return typeMap[type];\r\n}\r\n","//==============================================================================\r\n// Global Constants\r\n//\r\n// Consolidated list of constants reused across different modules and extensions\r\n//==============================================================================\r\n\r\n//----------------------------------------------------------\r\n// Attribute names list\r\n//----------------------------------------------------------\r\nexport const attrNames = {\r\n productType: 'Item Type',\r\n lineAttributes: 'LineAttributes',\r\n blacklistedShippingAreas: 'Embargoed shipping locations',\r\n kitConfigurator: 'KitConfigurator',\r\n kitContents: 'eCommBurstoutKitContents',\r\n kitFormats: 'eCommBurstoutKitFormats',\r\n kitElectives: 'eCommBurstoutKitElectives',\r\n kitSubstitutions: 'eCommBurstoutKitSubstitutions',\r\n kitLineSubstitutions: 'eCommBurstoutKitLineDetails',\r\n kitLineParentAssociation: 'eCommBurstoutKitOrderLineParentAssociation',\r\n kitLineChildAssociation: 'eCommBurstoutKitOrderLineChildAssociation',\r\n instructors: 'eCommInstructors',\r\n consultantCartAttribute: 'eCommConsultantId',\r\n isInstallmentEligible: 'eCommItemIsPPEligible',\r\n cashForCollege: 'eCommCash4College',\r\n dropShip: 'eCommDropShip',\r\n scoringType: 'TestScoring',\r\n studentId: 'eCommPTEStudentId',\r\n schoolIdPP: 'eCommPPSchoolId',\r\n testCoordinator: 'PTETestCoordinator',\r\n testEnrollment: 'PTESchoolEnrollment',\r\n testType: 'Test Type',\r\n testFormat: 'Test Format',\r\n testDate: 'eCommPTETestDate',\r\n testDateId: 'eCommPTETestDateId',\r\n testAdmin: 'eCommPTEAdminCustAccount',\r\n testProctorEmail: 'PTEProctorEmail',\r\n testProctorName: 'PTEProctorName',\r\n testProctorPhone: 'PTEProctorPhone',\r\n testProctorTimeZone: 'PTEProctorTimeZone',\r\n userAgreement: 'eCommUserAgreement',\r\n umbrellaGroup: 'UmbrellaGroupID',\r\n gradeLvl: 'Grade level',\r\n isNotTest: 'Other',\r\n onlineTest: 'Online test',\r\n purchaseItemType: 'TestBklt',\r\n notBuyable: 'Not Buyable',\r\n billingCountry: 'eCommBillingCountryCode',\r\n billingZipCode: 'eCommBillingZipPostalCode'\r\n};\r\n\r\n//----------------------------------------------------------\r\n// Global label resources\r\n//----------------------------------------------------------\r\nexport const labelResources = {\r\n sku: 'SKU'\r\n};\r\n"],"names":["CartLineItemFunctions","renderProductDimensions","Product","DimensionStrings","Dimensions","map","productDimension","DimensionTypeValue","React","key","RecordId","className","colorString","DimensionValue","Value","configString","_productDimension$Dim","sizeString","_productDimension$Dim2","IsGiftCard","amountString","styleString","_productDimension$Dim3","renderDiscountLines","props","data","cartLine","DiscountLines","length","discountLine","index","OfferId","OfferName","resources","discountStringText","DiscountCost","PriceComponent","isSalesLine","price","CustomerContextualPrice","PeriodicDiscount","DiscountAmountWithoutTax","BasePrice","DiscountAmount","context","id","typeName","undefined","EffectivePercentage","renderInventoryLabel","renderUnitOfMeasure","app","config","unitOfMeasureDisplayType","product","DefaultUnitOfMeasure","renderShippingLabel","_props$context$reques","pickupDeliveryModeCode","request","channel","PickupDeliveryModeCode","channelDeliveryOptionConfig","cartline","hasShippingMethod","_channelDeliveryOptio","DeliveryMode","PickupDeliveryModeCodes","some","deliveryMode","shippingChargeLines","ChargeLines","filter","chargeLine","IsShipping","freightFee","reduce","chargeTotal","CalculatedAmount","priceComponent","freePriceText","shippingChargesText","renderOtherCharges","_cartline$ChargeLines","otherCharges","chargeline","otherCharge","Description","renderSalesAgreementPrompt","SalesAgreementLineRecordId","salesAgreementPricePrompt","CatalogLabelComponent","catalogId","CatalogId","validateCatalogId","isChannelTypeB2B","actionContext","requestContext","ArrayExtensions","hasElements","catalogs","catalog","find","item","Name","CartLineItemComponent","msdyn365Commerce","createComponentOverride","_objectSpread","component","_props$primaryImageUr2","productUrl","isBackorder","backorderLoaded","cloneCtx","_cloneDeep","enableStockCheck","backorderInput","ProductAvailabilitiesForCartLineItems","apiSettings","getAvailabilitiesForCartLineItems","then","result","availability","avail","ProductAvailableQuantity","ProductId","productAvailableQuantity","AvailableQuantity","Quantity","ItemTypeValue","ReleasedProductType","Service","isTestOrScore","isTestOrScoreLoaded","criteria","ItemIds","ItemId","Context","ChannelId","channelId","getCatalogId","IncludeAttributes","searchByCriteriaAsync","callerContext","results","productWithAttr","formattedAtr","convertProductAttributes","AttributeValues","isTesting","attrNames","testType","isNotTest","isScoring","productType","scoringType","lineAttributes","convertCartAttributes","kitContents","kitElectives","kitLineParentAssociation","showKitContents","toggleShowKitContents","formattedKitContents","split","showKitContentsText","showContentsText","destructDimensionStrings","fallbackImageUrl","getFallbackImageUrl","imageSettings","cropFocalRegion","ObjectExtensions","isNullOrUndefined","inputQuantityAriaLabel","productDimensions","renderDisountLines","payLoad","getPayloadObject","telemetryContent","toString","prodAttribute","getTelemetryAttributes","productName","imgeClassName","IsInvoiceLine","_generateErrorMessage","errorMessage","_updateQuantity","event","_props$context$reques2","newValue","Number","parseInt","target","value","quantityChange","Math","abs","analyticsData","itemID","name","discount","variant","quantity","Price","currency","Currency","unitOfMeasure","UnitOfMeasureSymbol","publish","quantityOnChange","lineIndex","_generateSelectMenu","currentQuantity","onChange","nodes","i","push","_generateMenu","_generateQuantityAndPrice","isOutOfStock","_props$data$product","isQuantityEditable","classNames","quantityDisplayString","maxQuantity","priceData","NetAmount","NetAmountWithoutTax","NetPrice","electiveSum","elective","splitData","accumulator","currentValue","originalPriceText","currentPriceText","salesAgreementLineId","displayMode","_props$primaryImageUr","reducedDimensions","str","_productDimension$Dim4","Image","src","primaryImageUrl","fallBackSrc","altText","gridSettings","loadFailureBehavior","MsDyn365","isBrowser","disableCartLineProductLinks","Object","assign","href","backorderTextCartLine","cartState","priceEditorResources","CartLinePriceEditor","showShippingChargesForLineItems","role","onClick","isCustomized","includes","replace","subscriptions","eventName","eventData","keys","forEach","subscriber","subscribe","handler","Error","attributeList","output","meta","attribute","DataTypeValue","typeData","getTypeInfo","source","type","TextValue","AttributeDataType","None","DateTime","Decimal","Integer","customerSource","Text","TrueFalse","Video","blacklistedShippingAreas","kitConfigurator","kitFormats","kitSubstitutions","kitLineSubstitutions","kitLineChildAssociation","instructors","consultantCartAttribute","isInstallmentEligible","cashForCollege","dropShip","studentId","schoolIdPP","testCoordinator","testEnrollment","testFormat","testDate","testDateId","testAdmin","testProctorEmail","testProctorName","testProctorPhone","testProctorTimeZone","userAgreement","umbrellaGroup","gradeLvl","onlineTest","purchaseItemType","notBuyable","billingCountry","billingZipCode","labelResources","sku"],"sourceRoot":""}