{"version":3,"file":"./modules/FilterSort.xxxxxxxx.js","mappings":"yNAMe,MAAMA,EAOjB,WAAAC,CAAmBC,EAA8BC,EAA+B,CAAC,GAA9D,KAAAD,QAAAA,EAA8B,KAAAC,QAAAA,EAC7CC,KAAKD,SAAU,QAAWC,KAAKF,QAASG,OAAOC,OAAOF,KAAKG,oBAAqBH,KAAKD,UACrFC,KAAKI,UAAyBJ,KAAKF,QAAQO,cAAcL,KAAKD,QAAQO,mBACtEN,KAAKO,SAA8BP,KAAKF,QAAQO,cAAcL,KAAKD,QAAQS,kBAC3ER,KAAKS,gBAA+BT,KAAKO,SAASG,kBAElDV,KAAKW,QAAU,CACXC,QAASC,OAAOC,KAAKd,KAAKI,UAAUW,aAAaf,KAAKD,QAAQiB,aAAaC,cAC3EC,SAAUC,SAASnB,KAAKI,UAAUW,aAAaf,KAAKD,QAAQiB,aAAaI,eACzEC,cAAeF,SAASnB,KAAKI,UAAUW,aAAaf,KAAKD,QAAQiB,aAAaM,qBAGlFtB,KAAKuB,oBACAC,MACT,CAEQ,IAAAA,GAEJ,OADAxB,KAAKyB,eACEzB,IACX,CAEQ,iBAAAuB,GASJ,OARAV,OAAOa,iBAAiB,YAAY,KAChC1B,KAAK2B,mBACAC,aACAC,QAAQ,IAGjB7B,KAAK2B,mBAEE3B,IACX,CAEQ,gBAAA2B,GAEJ,OADA3B,KAAKD,QAAQ+B,OAAQ,UACd9B,IACX,CAEQ,UAAA+B,GACJ,MAAMC,EAAU,GACgBC,MAAMC,KAAKC,SAASC,iBAAiBpC,KAAKD,QAAQsC,6BAE1DC,SAASC,IAC7B,MAAMC,EAAS,GACIP,MAAMC,KAAKK,EAAWH,iBAAiBpC,KAAKD,QAAQ0C,kCAE5DH,SAASI,IAChB,MAAMC,EAAMD,EAAUE,QAAQD,IACzBA,GAELH,EAAOK,KAAK,CACRC,KAAMJ,EACNC,IAAKA,EACLI,QAASL,EAAUM,UAAUC,SAASjD,KAAKD,QAAQmD,oCACnDC,cAAc,EACdC,MAAOjC,SAASuB,EAAUE,QAAQQ,OAClCC,aAAcX,EAAUE,QAAQU,SAClC,IAGN,MAAMC,EAAS,CACXT,KAAMP,EACNI,IAAKJ,EAAWK,QAAQD,IACxBH,OAAQA,EACRgB,OAAO,EACPL,cAAc,EACdM,MAAO,IAGXzB,EAAQa,KAAKU,EAAO,IAiCxB,OA9BoBtB,MAAMC,KAAKlC,KAAKF,QAAQsC,iBAAiBpC,KAAKD,QAAQ2D,qBAE9DpB,SAASC,IACjB,MAAMoB,EAAYpB,EAAWK,QAAQD,IACjCa,EAAqC,SAA7BjB,EAAWK,QAAQY,MAC3BI,EAAa3B,MAAMC,KAAKK,EAAWH,iBAAiBpC,KAAKD,QAAQ8D,mBACjErB,EAAS,GAEboB,EAAWtB,SAASI,IAChBF,EAAOK,KAAK,CACRC,KAAMJ,EACNC,IAAKD,EAAUoB,KACff,QAASL,EAAUK,QACnBI,cAAc,EACdC,MAAOjC,SAASuB,EAAUE,QAAQQ,QACpC,IAGN,MAAMG,EAAS,CACXT,KAAMP,EACNI,IAAKgB,EACLnB,OAAQA,EACRgB,MAAOA,EACPL,cAAc,EACdM,MAAO,IAGXzB,EAAQa,KAAKU,EAAO,IAGjBvB,CACX,CAEQ,eAAA+B,CAAgBC,EAAoBC,GACxC,MAAMC,EAAIF,EAAahE,KAAKW,QAAQO,SAAW+C,EAG/C,OAF2F,IAAzEjE,KAAKW,QAAQC,QAAQuD,WAAWC,KAAKC,MAAMH,EAAI,IAAO,GAAMA,EAAI,EAGtF,CAEQ,yBAAAI,CAA0BC,EAAGhB,GACjC,IAAIf,EAASe,EAAOf,OAChBgC,EAAcjB,EAAOC,MACrBiB,GAAkB,EAEtB,IAAK,IAAIC,EAAI,EAAGA,EAAIlC,EAAOmC,OAAQD,IAAK,CACpC,MAAME,EAAQpC,EAAOkC,GAErB,GAAIE,EAAM7B,QAEN,GADA0B,GAAkB,EACdzE,KAAK+D,gBAAgBQ,EAAGK,EAAMxB,QAC9B,IAAKoB,EACD,OAAO,OAEX,GAAIA,EACA,OAAO,C,CAKvB,QAAIA,IAECC,CAIT,CAEQ,gBAAAI,CAAiBN,GACrB,IAAK,IAAIO,EAAI,EAAGA,EAAI9E,KAAKgC,QAAQ2C,OAAQG,IAAK,CAC1C,MAAMvB,EAASvD,KAAKgC,QAAQ8C,GACxBC,EAAaxB,EAAOE,MAAMc,GAE9B,IAAmB,IAAfQ,EAAJ,CAGA,IAAmB,IAAfA,EACA,OAAO,EAEX,IAAIC,EAAahF,KAAKsE,0BAA0BC,EAAGhB,GAGnD,GAFAA,EAAOE,MAAMc,GAAKS,GAEbA,EACD,OAAO,CATC,C,CAYhB,OAAO,CACX,CAEQ,YAAAC,GACJ,IAAIC,EAAQ,EAEZ,IAAK,IAAIX,EAAI,EAAGA,EAAIvE,KAAKW,QAAQU,cAAekD,IACxCvE,KAAK6E,iBAAiBN,IACtBW,IAGR,OAAOA,CACX,CAEQ,oBAAAC,CAAqBL,EAAGJ,EAAGU,GAC/B,MAAM7B,EAASvD,KAAKgC,QAAQ8C,GACtBO,EAAW9B,EAAOE,MACxBF,EAAOE,MAAQ,GACf,MAAMmB,EAAQrB,EAAOf,OAAOkC,GACtBY,EAAaV,EAAM7B,QACzB6B,EAAM7B,QAAUqC,EAChB,MAAMF,EAAQlF,KAAKiF,eAInB,OAHAL,EAAM7B,QAAUuC,EAChB/B,EAAOE,MAAQ4B,EAERH,CACX,CAEQ,wCAAAK,CAAyCT,EAAGJ,GAChD,MAAMc,EAAaxF,KAAKgC,QACxBhC,KAAKgC,QAAU,GACf,IAAK,IAAIkC,EAAI,EAAGA,EAAIsB,EAAWb,OAAQT,IAAK,CACxC,IAAIX,EAASiC,EAAWtB,GACpBX,EAAOJ,cACPnD,KAAKgC,QAAQa,KAAKU,E,CAG1B,MAAM2B,EAAQlF,KAAKyF,6BAA6BX,EAAGJ,GAEnD,OADA1E,KAAKgC,QAAUwD,EACRN,CACX,CAEQ,4BAAAO,CAA6BX,EAAGJ,GACpC,MAAMgB,EAAY1F,KAAKgC,QAAQ8C,GAE/B9E,KAAKgC,QAAQ8C,GAAK,CACdrB,MAAO,GACPjB,OAAQ,CACJ,CACIY,MAAOsC,EAAUlD,OAAOkC,GAAGtB,MAC3BL,SAAS,KAKrB,MAAMmC,EAAQlF,KAAKiF,eAGnB,OAFAjF,KAAKgC,QAAQ8C,GAAKY,EAEXR,CACX,CAEQ,0BAAAS,CAA2Bf,GAC/B,IAAIgB,EAAahB,EAAMvB,aACnBwC,EAAkBjB,EAAMvB,aAAayC,MAAM,MAE/C,QAASF,IAAcC,EAAgBE,SAAS/F,KAAKD,QAAQiG,2BAAqE,IAAzChG,KAAKD,QAAQiG,wBAC1G,CAEQ,wBAAAC,GACJ,MAAMC,EAAcjE,MAAMC,KAAKC,SAASC,iBAAiB,GAAGpC,KAAKD,QAAQ0C,mCAAmCzC,KAAKD,QAAQmD,uCAEzH,GAA0B,GAAtBgD,EAAYvB,OAAa,CACzB,MAAMwB,EAAaD,EAAYA,EAAYvB,OAAS,GACpD3E,KAAKD,QAAQiG,wBAA0BG,EAAWpF,aAAa,a,MAE/Df,KAAKD,QAAQiG,yBAA0B,CAE/C,CAEQ,aAAAI,CAAcxB,EAAOyB,GACzBzB,EAAM9B,KAAKwD,QAAUD,CACzB,CAEQ,QAAAE,CAAS3B,EAAoBM,EAAesB,GAChD,IAAIC,EACAC,EAEA9B,EAAMzB,aACNsD,EAAY7B,EAAM9B,KAAKzC,cAAc,iCAGrCoG,GAAY,QAAW7B,EAAM9B,KAAM9C,KAAKD,QAAQ4G,oBAAsB/B,EAAM9B,KAAK8D,YAAYA,YAE7FF,GAAS,QAAW9B,EAAM9B,KAAM,gBAChC8B,EAAM9B,KAAK+D,SAAWL,EACtBE,EAAOJ,OAASE,GAEfC,IAELA,EAAUK,UAAY5B,EAE1B,CAEQ,eAAAT,CAAgBlB,GACpB,MAAMf,EAASe,EAAOf,OAEtB,IAAK,IAAIkC,EAAI,EAAGA,EAAIlC,EAAOmC,OAAQD,IAC/B,GAAIlC,EAAOkC,GAAG3B,QACV,OAAO,EAGf,OAAO,CACX,CAEQ,cAAAgE,CAAe7B,GAInB,OAHAlF,KAAKS,gBAAgBqG,UAAY,IAAI5B,KACrClF,KAAKO,SAASsG,SAAqB,IAAV3B,EAElBlF,IACX,CAEQ,YAAAgH,CAAaC,GACjB,MAAMC,GAAY,IAAAC,cAAanH,KAAKoH,mBAAmBC,YAGvD,OAFcJ,EAASrE,QAAQ0E,QAAU,IAAMJ,CAGnD,CAEQ,uBAAAK,CAAwBN,EAAUO,GAGtC,OAFgBP,EAASrE,QAAQ0E,QAAU,IAAME,CAGrD,CAEQ,eAAAC,CAAgBR,GAGpB,OAFkB,IAAAE,cAAanH,KAAKoH,mBAAmBC,WAG3D,CAEQ,SAAAK,GACJ,MAAM1F,EAAUhC,KAAK+B,aACjB4F,EAAS,CAAC,EACVC,EAA8BzF,SAAS0F,eAAe,QACtDC,EAAaF,GAAYA,EAAShD,MAiBtC,OAfA5C,EAAQM,SAAQiB,IACZ,MAAMwE,EAAO,GAEbxE,EAAOf,OAAOF,SAAQsC,IACdA,EAAM7B,SACNgF,EAAKlF,KAAK+B,EAAMjC,I,IAIpBoF,EAAKpD,OAAS,IACdgD,EAAOpE,EAAOZ,KAAOoF,E,IAI7BJ,EAAa,KAAI,CAACG,GACXH,CACX,CAEA,MAAA9F,GACI7B,KAAKiG,2BACLjG,KAAKgC,QAAUhC,KAAK+B,aACpB,MAAMiG,EAAehI,KAAKiF,eAgD1B,OA/CAjF,KAAK+G,eAAeiB,GAEpBhI,KAAKgC,QAAQM,SAAQ,CAACiB,EAAQ0E,KACtB1E,EAAOJ,cACPI,EAAOf,OAAOF,SAAQ,CAACsC,EAAOsD,KAC1B,IAAKtD,EAAM7B,QAAS,CAChB/C,KAAKuF,yCAAyC0C,EAAMC,GACpD,MAAMhD,EAAQlF,KAAKuF,yCAAyC0C,EAAMC,GAC5DC,EAA2BnI,KAAK2F,2BAA2Bf,GACjE5E,KAAKoG,cAAcxB,EAAkB,IAAVM,GAAeiD,E,KAKtD5E,EAAOf,OAAOF,SAAQ,CAACsC,EAAOsD,KAC1B,IAAIE,EACJ,GAAKxD,EAAM7B,QAiBPqF,EAAW,OAjBK,CAChB,MAAMlD,EAAQlF,KAAKmF,qBAAqB8C,EAAMC,GAAM,GACpD,GAAI3E,EAAOC,QAAUxD,KAAKyE,gBAAgBlB,GACtC6E,EAAWlD,EAAMmD,gBAEjB,GAAsD,IAAlDrI,KAAKyF,6BAA6BwC,EAAMC,GACxCE,EAAW,QACR,CACH,IAAIE,EAAapD,EAAQ8C,EAErBI,EADe,IAAfE,EACW,IAEA,IAAMA,C,EAQjC,IAAI9B,EAA0B,MAAb4B,EACjBpI,KAAKuG,SAAS3B,EAAOwD,EAAU5B,EAAW,IAG9C,IAAI+B,EAAoBtG,MAAMC,KAAKqB,EAAOf,QAAQgG,OAAM,EAAG1F,MAAQ+D,eAAiBA,KACpF,QAAYtD,EAAOT,KAAM,0BAA2ByF,EAAkB,IAG1EvI,KAAKyI,YAAYT,GACjB7F,SAASuG,cAAc,IAAIC,YAAY,uBAEhC3I,IACX,CAEA,QAAA4I,GACI5I,KAAKiG,2BACLjG,KAAKgC,QAAUhC,KAAK+B,aACpB,MAAMiG,EAAehI,KAAKiF,eAgD1B,OA/CAjF,KAAK+G,eAAeiB,GAEpBhI,KAAKgC,QAAQM,SAAQ,CAACiB,EAAQ0E,KACtB1E,EAAOJ,cACPI,EAAOf,OAAOF,SAAQ,CAACsC,EAAOsD,KACrBtD,EAAM7B,SACP/C,KAAKuF,yCAAyC0C,EAAMC,E,IAQhE3E,EAAOf,OAAOF,SAAQ,CAACsC,EAAOsD,KAC1B,IAAIE,EACJ,GAAKxD,EAAM7B,QAiBPqF,EAAW,OAjBK,CAChB,MAAMlD,EAAQlF,KAAKmF,qBAAqB8C,EAAMC,GAAM,GACpD,GAAI3E,EAAOC,QAAUxD,KAAKyE,gBAAgBlB,GACtC6E,EAAWlD,EAAMmD,gBAEjB,GAAsD,IAAlDrI,KAAKyF,6BAA6BwC,EAAMC,GACxCE,EAAW,QACR,CACH,IAAIE,EAAapD,EAAQ8C,EAErBI,EADe,IAAfE,EACW,IAEA,IAAMA,C,EAQjC,IAAI9B,EAA0B,MAAb4B,EACjBpI,KAAKuG,SAAS3B,EAAOwD,EAAU5B,EAAW,IAG9C,IAAI+B,EAAoBtG,MAAMC,KAAKqB,EAAOf,QAAQgG,OAAM,EAAG1F,MAAQ+D,eAAiBA,KACpF,QAAYtD,EAAOT,KAAM,0BAA2ByF,EAAkB,IAG1EvI,KAAKyI,YAAYT,GACjB7F,SAASuG,cAAc,IAAIC,YAAY,uBAEhC3I,IACX,CAEA,0BAAA6I,GACI,IAAIC,EACAC,EACAC,EAAqB7G,SAASC,iBAAiB,yCAQnD,OAPI4G,EAAmBrE,OAAS,GAC5BoE,EAAYC,EAAmBA,EAAmBrE,OAAS,GAAG5D,aAAa,WAC3E+H,EAAgB3G,SAAS9B,cAAc,oCAAoC0I,QAE3ED,EAAgB3G,SAAS9B,cAAc,gCAGpCyI,CACX,CAEA,MAAAG,CAAOzB,OAAU0B,GAEb,MAAMC,EAAyBhH,SAAS9B,cAAcL,KAAKD,QAAQqJ,kBAC/DC,EAAM,IAAIC,eAId,IAAIhC,EACAiC,EAiCJ,OApCA,QAAuBJ,QAKPD,IAAZ1B,GACAF,EAAUtH,KAAKgH,aAAamC,GAC5BI,EAASvJ,KAAKwJ,UAAUL,GAExBtI,OAAO2G,QAAQiC,UAAUF,EAAQ,GAAIA,IAErCjC,EAAUtH,KAAKuH,wBAAwB4B,EAAW3B,GAGtD6B,EAAIK,OAAS,KACT,GAAIL,EAAIM,QAAU,KAAON,EAAIM,OAAS,IAAK,CACvC,MAAMC,GAAkB,QAAwBP,EAAIQ,cAChD5C,EAAW2C,EAAgBvJ,cAAcL,KAAKD,QAAQqJ,mBAAqBQ,GAE3E,IAAAE,0BAAyBX,GAE7BA,EAAUY,UAAY9C,EAAS8C,UAE/BC,OAAOC,iBACPD,OAAOE,a,MAEPC,EAAQC,MAAM,wBAElB,QAA4BjB,EAAU,EAG1CE,EAAIgB,KAAK,MAAO/C,GAChB+B,EAAIiB,OAEJ,eAAe,OAAYtK,KAAKqH,aAEzBrH,IACX,CAEA,SAAAwJ,CAAUL,GACN,MAEMoB,EAFY,IAAIC,gBAAgB3J,OAAO4J,SAASC,QAE1BC,IADN,KAGtB,MAAO,IAAIJ,EAAY,KAAoBA,KAAe,KAAKvK,KAAKyH,gBAAgB0B,IACxF,CAEA,YAAA1H,GACI,IAAK,IAAImJ,KAAkB5K,KAAKD,QAAQ+B,MAAO,CAC3C,MAAM+I,EAAS5I,MAAMC,KAAKlC,KAAKI,UAAUgC,iBAAiB,cAAcwI,+BACpEE,EAAmB9K,KAAKD,QAAQ+B,MAAM8I,GAE1CC,EAAOtH,QAAQwH,GAA0BD,EAAiB/E,SAASgF,EAAIjH,QAClExB,SAASyI,GAA0BA,EAAIhI,SAAU,G,CAK1D,OAFA,eAAe,OAAY/C,KAAKqH,aAEzBrH,IACX,CAEA,UAAA4B,GAGI,OAFAK,MAAMC,KAAmClC,KAAKI,UAAUgC,iBAAiBpC,KAAKD,QAAQ8D,iBAAmB,aAAavB,SAAQsC,GAASA,EAAM7B,SAAU,IACvJ/C,KAAKyB,eACEzB,IACX,CAEA,QAAAqH,GACI,OAAOrH,KAAKD,QAAQ+B,KACxB,CAEA,gBAAAsF,GAEI,OADApH,KAAKgL,UAAUhL,KAAK0H,aACb1H,IACX,CAEQ,SAAAgL,CAAUlJ,GAEd,OADA9B,KAAKD,QAAQ+B,MAAQA,EACd9B,IACX,CAEQ,WAAAyI,CAAYvD,GAChB,IAAI4D,EAAgB9I,KAAK6I,6BACzB,IAAKC,EAAe,OAEpB,MAAMmC,EAAenC,EAAczI,cAAc,iEAC5C4K,IAELA,EAAanE,UAAY5B,EAC7B,CAEQ,iBAAA/E,GACJ,MAAO,CACHa,aAAc,CACVC,YAAa,YACbG,aAAc,iBACdE,kBAAmB,qBAEvBe,2BAA4B,+BAC5BI,gCAAiC,8BACjCS,mCAAoC,YACpC5C,kBAAmB,iBACnB4K,kBAAmB,oBACnBxH,mBAAoB,uBACpBG,iBAAkB,0BAClBrD,iBAAkB,8BAClBmG,kBAAmB,sBACnByC,iBAAkB,kBAClBtH,MAAO,CAAC,EAEhB,E,+FCvjBJ,MAAMqJ,EAAiB,6BAER,MAAMC,EAKjB,YAAOC,CAAMzD,EAAmBuD,GAC5BlJ,MAAMC,KAAKC,SAASC,iBAAiBwF,IAAWrE,QAAQT,IAAuBA,EAAKF,QAAQ0I,oBAAmBhJ,SAASxC,IACpH,IAAIsL,EAAWtL,GACfA,EAAQ8C,QAAQ0I,kBAAoB,MAAM,GAElD,CAEA,WAAAzL,CAAmBC,GAAA,KAAAA,QAAAA,EACf,MAAMyL,EAAY,CACd3C,SAAU,IAAM5I,KAAKwL,aAAa5C,WAClC/G,OAAQ,IAAM7B,KAAKwL,aAAa3J,SAChCoH,OAAQ,IAAMjJ,KAAKwL,aAAavC,SAChC+B,UAAW,IAAMhL,KAAKwL,aAAapE,mBACnCxF,WAAY,IAAM5B,KAAKwL,aAAa5J,cAGxC5B,KAAKuD,OAAS,IAAI,UAAOvD,KAAKF,QAAS,CAAEyL,cACzCvL,KAAKyL,KAAO,IAAI,UAAKzL,KAAKF,QAAS,CAAEyL,cAErCvL,KAAKwB,MACT,CAEQ,IAAAA,GAKJ,OAJAxB,KAAK0L,iBAAiB1L,KAAKuD,OAAOoI,sBAC7BC,aACAC,+BAEE7L,IACX,CAEQ,gBAAA0L,CAAiB5L,GAGrB,OAFAE,KAAKwL,aAAexL,KAAKwL,cAAgB,IAAI,UAAa1L,GAEnDE,IACX,CAEQ,UAAA4L,GAEJ,OADA5L,KAAKuD,OAAO/B,OACLxB,IACX,CAEQ,4BAAA6L,GAEJ,OADA,IAAI,UACG7L,IACX,EAgBAoL,EAAWC,MAAMF,E,kBCxEd,SAAShE,EAAaQ,GACzB,OAAO1H,OAAO6L,QAAQnE,GAAQoE,KAAI,EAAEpJ,EAAKiC,KAAW,GAAGoH,mBAAmBrJ,MAAQiC,EAAMmH,KAAIrH,GAAKsH,mBAAmBtH,KAAIuH,KAAK,SAAQA,KAAK,IAC9I,CAEO,SAASnC,EAAyBX,GACrC,MAAM+C,EAAW,IAAIC,kBAAiB,KAClCD,EAASE,aACTjK,SAASuG,cAAc,IAAI2D,MAAM,wBAAwB,IAG7DH,EAASI,QAAQnD,EAAW,CAAEoD,WAAW,GAC7C,C,+HCTe,MAAMC,EACjB,WAAA3M,GACIG,KAAKwB,MACT,CAEA,IAAAA,GACI,IAAIiL,EAAgCtK,SAAS9B,cAAc,yBAErDoM,GACFA,EAAiB/K,iBAAiB,SAAUgL,IACxC,IAAIC,EAA2CD,EAAEE,OAC7CD,EAAe3J,UAAUC,SAAS,+BAClCjD,KAAK6M,qBAAqBF,EAAe/J,QAAQkB,K,GAIjE,CAEA,oBAAA+I,CAAqBC,GACbjM,OAAOmJ,OAAO+C,cACd,QAAS,CACLC,MAAO,WACPC,cAAe,oBACfC,YAAa,aACbJ,WAAYA,EACZK,qBAAqB,IAIzBtM,OAAOmJ,OAAOoD,eACd,QAAS,CACLJ,MAAO,YACPK,WAAY,oBACZC,wBAAyBR,EACzBS,QAAQ,GAGpB,E,+DCrCW,MAAMC,EAEjB,WAAA3N,CAAmBC,GAAA,KAAAA,QAAAA,EACfE,KAAKwB,MACT,CAEA,IAAAA,GACIxB,KAAKyN,gBAAgBzN,KAAKF,QAAQgH,UACtC,CAEA,eAAA2G,CAAgBX,GACRjM,OAAOmJ,OAAO+C,cACd,QAAS,CACLC,MAAO,WACPC,cAAe,OACfC,YAAa,OACbJ,WAAYA,EACZK,qBAAqB,GAajC,E,4ICvBJ,MAAMhC,EAAiB,uBAER,MAAMuC,EAUjB,YAAOrC,CAAMzD,EAAmBuD,GAC5BlJ,MAAMC,KAAKC,SAASC,iBAAiBwF,IAAWrE,QAAQT,IAAuBA,EAAKF,QAAQ0I,oBAAmBhJ,SAASxC,IACpH,IAAI4N,EAAK5N,GACTA,EAAQ8C,QAAQ0I,kBAAoB,MAAM,GAElD,CAEA,WAAAzL,CAAmBC,EAAgCC,EAAiC,CAAC,GAAlE,KAAAD,QAAAA,EAAgC,KAAAC,QAAAA,EAXzC,KAAA+H,WAAqB,KAY3B9H,KAAKD,SAAU,QAAWC,KAAKF,QAASG,OAAOC,OAAOF,KAAKG,oBAAqBH,KAAKD,UACrFC,KAAK2N,YAA2B3N,KAAKF,QAAQO,cAAcL,KAAKD,QAAQ6N,qBACxE5N,KAAK6N,aAA4B7N,KAAKF,QAAQO,cAAcL,KAAKD,QAAQ+N,kBACzE9N,KAAK+N,WAAgC/N,KAAKF,QAAQO,cAAcL,KAAKD,QAAQiO,oBAC7EhO,KAAKiO,MAAQjO,KAAKkO,eAClBlO,KAAKmO,SAAwBnO,KAAKiO,MAAMG,eAAe/N,cAAcL,KAAKD,QAAQsO,kBAElFrO,KAAKwB,MACT,CAEU,IAAAA,GAIN,OAHAxB,KAAKsO,+BACAC,6BAEEvO,IACX,CAIQ,YAAAkO,GACJ,MAAMD,EAAQ,IAAI,UAAUjO,KAAKF,QAC7B,CACI0O,UAAWC,UAActM,SAASuG,cAAc,IAAIC,YAAY,qCAAqC,EACrG+F,YAAaD,SAAYzO,KAAK2O,wBAAwBC,8BAK9D,OAFAX,EAAMY,eAAc,QAAwB7O,KAAK6N,aAAa9D,YAEvDkE,CACX,CAGU,aAAAa,CAAcC,GAEpB,OADA/O,KAAKiO,MAAM5D,OACJrK,IACX,CAEU,cAAAgP,GAEN,OADAhP,KAAKiO,MAAMgB,QACJjP,IACX,CAIU,4BAAAsO,GAEN,OADAtO,KAAK2N,YAAYjM,iBAAiB,SAAS,IAAM1B,KAAK8O,kBAC/C9O,IACX,CAEU,0BAAAuO,GACN,MAAMW,EAAYlP,KAAKiO,MAAMG,eACzBe,GAAiB,OAAUD,EAAW,SAASE,MAAK,QAAI,EAAGxC,YAAaA,KACxEyC,EAAcF,EAAeC,MAAK,OAAOpP,KAAKsP,iBAC9CC,EAAeJ,EAAeC,MAAK,OAAOpP,KAAKwP,iBAKnD,OAHAH,EAAYI,WAAUC,GAAU1P,KAAK2P,aAA0BD,KAC/DH,EAAaE,WAAU,IAAMzP,KAAK4P,cAE3B5P,IACX,CAEU,SAAA4P,GAON,OANA5P,KAAK6P,cAAc7P,KAAK8H,YACnBgI,qBACAC,qBACAf,iBACAgB,YAEEhQ,IACX,CAEU,SAAAgQ,GAEN,OADA,IAAI,UAAShQ,KAAKiQ,oBACXjQ,IACX,CAEU,YAAA2P,CAAa7P,GACnB,MAAMoQ,EAAgB,GAAGlQ,KAAKD,QAAQoQ,mCAEtCnQ,KAAK2O,yBACL,QAAS7O,EAASoQ,GAElBlQ,KAAK8H,WAAahI,EAAQ8C,QAAQwN,WACtC,CAGU,YAAAd,GACN,OAAO,QAAQ,KAAU,KAAStP,KAAKD,QAAQoQ,uBACnD,CAEU,YAAAX,GACN,OAAO,QAAQ,KAAU,KAASxP,KAAKD,QAAQsQ,gBACnD,CAEU,eAAAC,GACN,OAAO,SAAQ,CAACC,EAAmB3D,MAA0BA,EAAO4D,QAAQD,IAAY,IAAIvQ,KAAKD,QAAQ0Q,4BAC7G,CAGU,kBAAAV,GAGN,OAFA/P,KAAKD,QAAQwL,UAAUtC,SAEhBjJ,IACX,CAGU,aAAA6P,CAAca,GAEpB,OADA1Q,KAAK+N,WAAWnJ,MAAQ8L,GAAU1Q,KAAK+N,WAAWnJ,MAC3C5E,IACX,CAEU,kBAAA8P,GAEN,OADA9P,KAAKiQ,mBAAkCjQ,KAAKmO,SAAS9N,cAAc,IAAIL,KAAKD,QAAQoQ,oCAC7EnQ,IACX,CAEU,qBAAA2O,GAEN,OADA,QAAoB1M,MAAMC,KAAKlC,KAAKmO,SAASwC,UAAW,GAAG3Q,KAAKD,QAAQoQ,oCACjEnQ,IACX,CAEU,yBAAA4O,GAEN,OADA5O,KAAKiQ,qBAAsB,QAASjQ,KAAKiQ,mBAAoB,GAAGjQ,KAAKD,QAAQoQ,oCACtEnQ,IACX,CAEU,iBAAAG,GACN,MAAO,CACHyN,oBAAqB,2BACrBE,iBAAkB,iBAClBuC,gBAAiB,4BACjBF,uBAAwB,uBACxB9B,iBAAkB,gBAClBL,mBAAoB,QACpByC,0BAA2B,kBAC3BlF,UAAW,CACP1J,OAAQ,OACRoH,OAAQ,OACR+B,UAAW,OACXpJ,WAAY,QAGxB,EAgBA8L,EAAKrC,MAAMF,E,kDCtLR,MAAMyF,EAAerN,IAA2C,CAAGsN,KAAM,IAActN,U","sources":["webpack:///./modules/FilterAction.ts","webpack:///./modules/FilterSort.ts","webpack:///./modules/FilterUtils.ts","webpack:///./modules/NivTFilterNavigation.ts","webpack:///./modules/NivTSort.ts","webpack:///./modules/Sort.ts","webpack:///./store/modules/Filter/actions.ts"],"sourcesContent":["import { getOptions, loadParamsFromURL } from '../helpers/helperFunctions';\r\nimport { getSibling, createElementFromString, toggleClass, getClosest, addSpinnerToTeaserGrid, removeSpinnerFromTeaserGrid } from '../helpers/DOMHelpers';\r\nimport store from '../store';\r\nimport { filterState } from '../store/actions';\r\nimport { encodeParams, onFilterTeaserGridChange } from './FilterUtils';\r\n\r\nexport default class FilterAction {\r\n private filterTag: HTMLElement;\r\n private tagsMap: TagMap;\r\n private filters: FilterItem[];\r\n private applyBtn: HTMLButtonElement;\r\n private applyBtnCounter: HTMLElement;\r\n\r\n constructor(public element: HTMLElement, private options: FilterActionOptions = {}) {\r\n this.options = getOptions(this.element, Object.assign(this.getDefaultOptions(), this.options));\r\n this.filterTag = this.element.querySelector(this.options.filterTagSelector)\r\n this.applyBtn = this.element.querySelector(this.options.applyBtnSelector);\r\n this.applyBtnCounter = this.applyBtn.firstElementChild;\r\n\r\n this.tagsMap = {\r\n tagsStr: window.atob(this.filterTag.getAttribute(this.options.tagsMapAttrs.tagsStrAttr)),\r\n tagCount: parseInt(this.filterTag.getAttribute(this.options.tagsMapAttrs.tagCountAttr)),\r\n productsCount: parseInt(this.filterTag.getAttribute(this.options.tagsMapAttrs.productsCountAttr))\r\n };\r\n\r\n this.initURLNavigation()\r\n .init();\r\n }\r\n\r\n private init(): FilterAction {\r\n this.recoverState()\r\n return this;\r\n }\r\n\r\n private initURLNavigation() {\r\n window.addEventListener(\"popstate\", () => {\r\n this.getUrlParameters()\r\n .resetState()\r\n .update();\r\n });\r\n\r\n this.getUrlParameters();\r\n\r\n return this;\r\n }\r\n\r\n private getUrlParameters() {\r\n this.options.state = loadParamsFromURL();\r\n return this;\r\n }\r\n\r\n private getFilters(): FilterItem[] {\r\n const filters = [];\r\n const hierarchicalFilterNodes = Array.from(document.querySelectorAll(this.options.hierarchicalFilterSelector));\r\n\r\n hierarchicalFilterNodes.forEach((filterNode: HTMLElement) => {\r\n const values = [];\r\n const valueNodes = Array.from(filterNode.querySelectorAll(this.options.hierarchicalFilterValueSelector));\r\n\r\n valueNodes.forEach((valueNode: HTMLInputElement) => {\r\n const key = valueNode.dataset.key;\r\n if (!key)\r\n return;\r\n values.push({\r\n node: valueNode,\r\n key: key,\r\n checked: valueNode.classList.contains(this.options.hierarchicalFilterValueActiveClass),\r\n hierarchical: true,\r\n index: parseInt(valueNode.dataset.index),\r\n parentsIndex: valueNode.dataset.parents,\r\n });\r\n });\r\n\r\n const filter = {\r\n node: filterNode,\r\n key: filterNode.dataset.key,\r\n values: values,\r\n isAnd: false,\r\n hierarchical: true,\r\n cache: []\r\n };\r\n\r\n filters.push(filter);\r\n });\r\n\r\n const filterNodes = Array.from(this.element.querySelectorAll(this.options.filterItemSelector));\r\n\r\n filterNodes.forEach((filterNode: HTMLElement) => {\r\n const filterKey = filterNode.dataset.key,\r\n isAnd = filterNode.dataset.isAnd === 'True',\r\n valueNodes = Array.from(filterNode.querySelectorAll(this.options.checkboxSelector)),\r\n values = [];\r\n\r\n valueNodes.forEach((valueNode: HTMLInputElement) => {\r\n values.push({\r\n node: valueNode,\r\n key: valueNode.name,\r\n checked: valueNode.checked,\r\n hierarchical: false,\r\n index: parseInt(valueNode.dataset.index)\r\n });\r\n });\r\n\r\n const filter = {\r\n node: filterNode,\r\n key: filterKey,\r\n values: values,\r\n isAnd: isAnd,\r\n hierarchical: false,\r\n cache: [],\r\n };\r\n\r\n filters.push(filter);\r\n });\r\n\r\n return filters;\r\n }\r\n\r\n private isProductTagged(productIdx: number, tagIdx: number): boolean {\r\n const i = productIdx * this.tagsMap.tagCount + tagIdx;\r\n const isTagged = (this.tagsMap.tagsStr.charCodeAt(Math.floor(i / 8)) & (1 << (i % 8))) !== 0;\r\n \r\n return isTagged;\r\n }\r\n\r\n private isProductIncludedInFilter(p, filter): boolean {\r\n let values = filter.values,\r\n isAndFilter = filter.isAnd,\r\n anyValueChecked = false;\r\n\r\n for (let v = 0; v < values.length; v++) {\r\n const value = values[v];\r\n\r\n if (value.checked) {\r\n anyValueChecked = true;\r\n if (this.isProductTagged(p, value.index)) {\r\n if (!isAndFilter)\r\n return true;\r\n } else {\r\n if (isAndFilter)\r\n return false;\r\n }\r\n }\r\n }\r\n\r\n if (isAndFilter)\r\n return true;\r\n if (!anyValueChecked)\r\n return true;\r\n\r\n return false;\r\n }\r\n\r\n private isProductVisible(p): boolean {\r\n for (let f = 0; f < this.filters.length; f++) {\r\n const filter = this.filters[f],\r\n cacheEntry = filter.cache[p];\r\n\r\n if (cacheEntry === true)\r\n continue;\r\n\r\n if (cacheEntry === false)\r\n return false;\r\n\r\n var isIncluded = this.isProductIncludedInFilter(p, filter);\r\n filter.cache[p] = isIncluded;\r\n\r\n if (!isIncluded) {\r\n return false;\r\n }\r\n }\r\n return true;\r\n }\r\n\r\n private countResults(): number {\r\n let count = 0;\r\n\r\n for (var p = 0; p < this.tagsMap.productsCount; p++) {\r\n if (this.isProductVisible(p))\r\n count++;\r\n }\r\n\r\n return count;\r\n }\r\n\r\n private countSimulateChecked(f, v, checkedValue): number {\r\n const filter = this.filters[f];\r\n const oldCache = filter.cache;\r\n filter.cache = [];\r\n const value = filter.values[v];\r\n const oldChecked = value.checked;\r\n value.checked = checkedValue;\r\n const count = this.countResults();\r\n value.checked = oldChecked;\r\n filter.cache = oldCache;\r\n\r\n return count;\r\n }\r\n\r\n private countHierarchicalSimulateOnlyThisChecked(f, v): number {\r\n const oldFilters = this.filters;\r\n this.filters = [];\r\n for (var i = 0; i < oldFilters.length; i++) {\r\n var filter = oldFilters[i];\r\n if (filter.hierarchical) {\r\n this.filters.push(filter);\r\n }\r\n }\r\n const count = this.countSimulateOnlyThisChecked(f, v);\r\n this.filters = oldFilters;\r\n return count;\r\n }\r\n\r\n private countSimulateOnlyThisChecked(f, v): number {\r\n const oldFilter = this.filters[f];\r\n\r\n this.filters[f] = {\r\n cache: [],\r\n values: [\r\n {\r\n index: oldFilter.values[v].index,\r\n checked: true\r\n }\r\n ]\r\n };\r\n\r\n const count = this.countResults();\r\n this.filters[f] = oldFilter;\r\n\r\n return count;\r\n }\r\n\r\n private checkHierarchicalParendIdx(value) {\r\n let parentsIdx = value.parentsIndex;\r\n let parentsIdxArray = value.parentsIndex.split(\", \");\r\n\r\n return (!parentsIdx || parentsIdxArray.includes(this.options.hierarchicalParentIndex) || this.options.hierarchicalParentIndex === false) ? true : false;\r\n }\r\n\r\n private setHierarchicalParendIdx() {\r\n const mainNavList = Array.from(document.querySelectorAll(`${this.options.hierarchicalFilterValueSelector}.${this.options.hierarchicalFilterValueActiveClass}`));\r\n\r\n if (mainNavList.length != 0) {\r\n const parentItem = mainNavList[mainNavList.length - 1];\r\n this.options.hierarchicalParentIndex = parentItem.getAttribute('data-index');\r\n } else {\r\n this.options.hierarchicalParentIndex = false;\r\n }\r\n }\r\n\r\n private setVisibility(value, isVisible) {\r\n value.node.hidden = !isVisible;\r\n }\r\n\r\n private setCount(value: FilterValue, count: string, isDisabled: boolean): FilterAction {\r\n let countNode;\r\n let parent;\r\n\r\n if (value.hierarchical) {\r\n countNode = value.node.querySelector('.nx-filter-navigation__count');\r\n\r\n } else {\r\n countNode = getSibling(value.node, this.options.countNodeSelector) || value.node.nextSibling.nextSibling;\r\n\r\n parent = getClosest(value.node, \".nx-cat-item\");\r\n value.node.disabled = isDisabled;\r\n parent.hidden = isDisabled;\r\n }\r\n if (!countNode) return;\r\n\r\n countNode.innerText = count;\r\n return;\r\n }\r\n\r\n private anyValueChecked(filter): boolean {\r\n const values = filter.values;\r\n\r\n for (let v = 0; v < values.length; v++) {\r\n if (values[v].checked)\r\n return true;\r\n }\r\n\r\n return false;\r\n }\r\n\r\n private setGlobalCount(count): FilterAction {\r\n this.applyBtnCounter.innerText = `(${count})`;\r\n this.applyBtn.disabled = count === 0;\r\n\r\n return this;\r\n }\r\n\r\n private getReloadUrl(gridNode): string {\r\n const paramsStr = encodeParams(this.saveCurrentState().getState()),\r\n ajaxUrl = gridNode.dataset.ajaxUrl + '&' + paramsStr;\r\n\r\n return ajaxUrl;\r\n }\r\n\r\n private getReloadUrlFromHistory(gridNode, history): string {\r\n const ajaxUrl = gridNode.dataset.ajaxUrl + '&' + history;\r\n\r\n return ajaxUrl;\r\n }\r\n\r\n private getFilterParams(gridNode): string {\r\n const paramsStr = encodeParams(this.saveCurrentState().getState());\r\n\r\n return paramsStr;\r\n }\r\n\r\n private getParams(): FilterParams {\r\n const filters = this.getFilters(),\r\n params = {},\r\n selector = document.getElementById('sort'),\r\n sortMethod = selector && selector.value;\r\n\r\n filters.forEach(filter => {\r\n const keys = [];\r\n\r\n filter.values.forEach(value => {\r\n if (value.checked) {\r\n keys.push(value.key);\r\n }\r\n });\r\n\r\n if (keys.length > 0) {\r\n params[filter.key] = keys;\r\n }\r\n });\r\n\r\n params['sort'] = [sortMethod];\r\n return params;\r\n }\r\n\r\n update(): FilterAction {\r\n this.setHierarchicalParendIdx();\r\n this.filters = this.getFilters();\r\n const currentCount = this.countResults();\r\n this.setGlobalCount(currentCount);\r\n\r\n this.filters.forEach((filter, fIdx) => {\r\n if (filter.hierarchical) {\r\n filter.values.forEach((value, vIdx) => {\r\n if (!value.checked) {\r\n this.countHierarchicalSimulateOnlyThisChecked(fIdx, vIdx);\r\n const count = this.countHierarchicalSimulateOnlyThisChecked(fIdx, vIdx);\r\n const hasHierarchicalParendIdx = this.checkHierarchicalParendIdx(value);\r\n this.setVisibility(value, (count !== 0 && hasHierarchicalParendIdx));\r\n }\r\n });\r\n }\r\n\r\n filter.values.forEach((value, vIdx) => {\r\n let countStr;\r\n if (!value.checked) {\r\n const count = this.countSimulateChecked(fIdx, vIdx, true);\r\n if (filter.isAnd || !this.anyValueChecked(filter)) {\r\n countStr = count.toString();\r\n } else {\r\n if (this.countSimulateOnlyThisChecked(fIdx, vIdx) === 0) {\r\n countStr = \"0\";\r\n } else {\r\n let difference = count - currentCount;\r\n if (difference === 0) {\r\n countStr = '-';\r\n } else {\r\n countStr = '+' + difference;\r\n }\r\n }\r\n }\r\n } else {\r\n countStr = \"\";\r\n }\r\n\r\n let isDisabled = countStr === \"0\";\r\n this.setCount(value, countStr, isDisabled);\r\n });\r\n\r\n let allValuesDisabled = Array.from(filter.values).every(({ node: { disabled } }) => disabled);\r\n toggleClass(filter.node, 'nx-filter-tag--disabled', allValuesDisabled);\r\n });\r\n\r\n this.setAllCount(currentCount);\r\n document.dispatchEvent(new CustomEvent('ScrollSlider:reset'));\r\n\r\n return this;\r\n }\r\n\r\n updateV2(): FilterAction {\r\n this.setHierarchicalParendIdx();\r\n this.filters = this.getFilters();\r\n const currentCount = this.countResults();\r\n this.setGlobalCount(currentCount);\r\n\r\n this.filters.forEach((filter, fIdx) => {\r\n if (filter.hierarchical) {\r\n filter.values.forEach((value, vIdx) => {\r\n if (!value.checked) {\r\n this.countHierarchicalSimulateOnlyThisChecked(fIdx, vIdx);\r\n // const count = this.countHierarchicalSimulateOnlyThisChecked(fIdx, vIdx);\r\n // const hasHierarchicalParendIdx = this.checkHierarchicalParendIdx(value);\r\n // this.setVisibility(value, (count !== 0 && hasHierarchicalParendIdx));\r\n }\r\n });\r\n }\r\n\r\n filter.values.forEach((value, vIdx) => {\r\n let countStr;\r\n if (!value.checked) {\r\n const count = this.countSimulateChecked(fIdx, vIdx, true);\r\n if (filter.isAnd || !this.anyValueChecked(filter)) {\r\n countStr = count.toString();\r\n } else {\r\n if (this.countSimulateOnlyThisChecked(fIdx, vIdx) === 0) {\r\n countStr = \"0\";\r\n } else {\r\n let difference = count - currentCount;\r\n if (difference === 0) {\r\n countStr = '-';\r\n } else {\r\n countStr = '+' + difference;\r\n }\r\n }\r\n }\r\n } else {\r\n countStr = \"\";\r\n }\r\n\r\n let isDisabled = countStr === \"0\";\r\n this.setCount(value, countStr, isDisabled);\r\n });\r\n\r\n let allValuesDisabled = Array.from(filter.values).every(({ node: { disabled } }) => disabled);\r\n toggleClass(filter.node, 'nx-filter-tag--disabled', allValuesDisabled);\r\n });\r\n\r\n this.setAllCount(currentCount);\r\n document.dispatchEvent(new CustomEvent('ScrollSlider:reset'));\r\n\r\n return this;\r\n }\r\n\r\n getActiveHierarchicalLevel() {\r\n let currentFilter;\r\n let currentId;\r\n let getActiveFilterNav = document.querySelectorAll('.nx-filter-navigation__item.nx-active');\r\n if (getActiveFilterNav.length > 0) {\r\n currentId = getActiveFilterNav[getActiveFilterNav.length - 1].getAttribute(\"data-id\");\r\n currentFilter = document.querySelector(`.nx-filter-navigation__level[id=\"${currentId}\"]`);\r\n } else {\r\n currentFilter = document.querySelector('.nx-filter-navigation__level');\r\n }\r\n\r\n return currentFilter;\r\n }\r\n\r\n reload(history = undefined): FilterAction {\r\n // Change or remove static selector\r\n const container = document.querySelector(this.options.gridNodeSelector),\r\n xhr = new XMLHttpRequest();\r\n\r\n addSpinnerToTeaserGrid(container);\r\n\r\n let ajaxUrl;\r\n let newUrl;\r\n\r\n if (history === undefined) {\r\n ajaxUrl = this.getReloadUrl(container);\r\n newUrl = this.updateUrl(container);\r\n \r\n window.history.pushState(newUrl, '', newUrl);\r\n } else {\r\n ajaxUrl = this.getReloadUrlFromHistory(container, history);\r\n }\r\n\r\n xhr.onload = () => {\r\n if (xhr.status >= 200 && xhr.status < 300) {\r\n const responseElement = createElementFromString(xhr.responseText),\r\n gridNode = responseElement.querySelector(this.options.gridNodeSelector) || responseElement;\r\n\r\n onFilterTeaserGridChange(container);\r\n\r\n container.innerHTML = gridNode.innerHTML;\r\n\r\n NiveaX.loadShopPrices();\r\n NiveaX.initModules();\r\n } else {\r\n console.error('The request failed!');\r\n }\r\n removeSpinnerFromTeaserGrid(container);\r\n };\r\n\r\n xhr.open('GET', ajaxUrl);\r\n xhr.send();\r\n\r\n store.dispatch(filterState(this.getState()));\r\n\r\n return this;\r\n }\r\n\r\n updateUrl(container) {\r\n const urlParams = new URLSearchParams(window.location.search);\r\n const searchParName = 'q';\r\n const searchPar = urlParams.get(searchParName);\r\n\r\n return `?${searchPar ? `${searchParName}=${searchPar}&` : ''}${this.getFilterParams(container)}`;\r\n }\r\n\r\n recoverState(): FilterAction {\r\n for (let filterCategory in this.options.state) {\r\n const inputs = Array.from(this.filterTag.querySelectorAll(`[data-key=\"${filterCategory}\"] input[type=\"checkbox\"]`)),\r\n aciveFilterNames = this.options.state[filterCategory];\r\n\r\n inputs.filter((inp: HTMLInputElement) => aciveFilterNames.includes(inp.name))\r\n .forEach((inp: HTMLInputElement) => inp.checked = true);\r\n }\r\n\r\n store.dispatch(filterState(this.getState()));\r\n\r\n return this;\r\n }\r\n\r\n resetState(): FilterAction {\r\n Array.from(>this.filterTag.querySelectorAll(this.options.checkboxSelector + ':checked')).forEach(value => value.checked = false);\r\n this.recoverState()\r\n return this;\r\n }\r\n\r\n getState(): FilterParams {\r\n return this.options.state;\r\n }\r\n\r\n saveCurrentState(): FilterAction {\r\n this.saveState(this.getParams());\r\n return this;\r\n }\r\n\r\n private saveState(state: FilterParams): FilterAction {\r\n this.options.state = state;\r\n return this;\r\n }\r\n\r\n private setAllCount(count: number) {\r\n let currentFilter = this.getActiveHierarchicalLevel();\r\n if (!currentFilter) return;\r\n\r\n const countElement = currentFilter.querySelector('.nx-filter-navigation__item--all .nx-filter-navigation__count');\r\n if (!countElement) return;\r\n \r\n countElement.innerText = count;\r\n }\r\n\r\n private getDefaultOptions(): FilterActionOptions {\r\n return {\r\n tagsMapAttrs: {\r\n tagsStrAttr: 'data-atob',\r\n tagCountAttr: 'data-tab-count',\r\n productsCountAttr: 'data-teaser-count'\r\n },\r\n hierarchicalFilterSelector: \".nx-filter-navigation__level\",\r\n hierarchicalFilterValueSelector: \".nx-filter-navigation__item\",\r\n hierarchicalFilterValueActiveClass: \"nx-active\",\r\n filterTagSelector: '.nx-tag-filter',\r\n filterBtnSelector: '.nx-filter-button',\r\n filterItemSelector: '.nx-tag-filter__item',\r\n checkboxSelector: '.nx-cat-item__tag-value',\r\n applyBtnSelector: '.nx-sort-filters__apply-btn',\r\n countNodeSelector: '.nx-cat-item__count',\r\n gridNodeSelector: '.nx-teaser-grid',\r\n state: {}\r\n };\r\n }\r\n}\r\n","import FilterAction from './FilterAction';\r\nimport Filter from './Filter';\r\nimport Sort from './Sort';\r\nimport NivTFilterNavigation from './NivTFilterNavigation';\r\n\r\nconst moduleSelector = '[data-module=\"FilterSort\"]';\r\n\r\nexport default class FilterSort {\r\n private filterAction: FilterAction;\r\n private filter: Filter;\r\n protected sort: Sort;\r\n\r\n static setup(selector: string = moduleSelector): void {\r\n Array.from(document.querySelectorAll(selector)).filter((node: HTMLElement) => !node.dataset.moduleInitialized).forEach((element: HTMLElement) => {\r\n new FilterSort(element);\r\n element.dataset.moduleInitialized = 'true';\r\n });\r\n }\r\n\r\n constructor(public element: HTMLElement) {\r\n const callbacks = {\r\n updateV2: () => this.filterAction.updateV2(),\r\n update: () => this.filterAction.update(),\r\n reload: () => this.filterAction.reload(),\r\n saveState: () => this.filterAction.saveCurrentState(),\r\n resetState: () => this.filterAction.resetState()\r\n };\r\n\r\n this.filter = new Filter(this.element, { callbacks });\r\n this.sort = new Sort(this.element, { callbacks });\r\n\r\n this.init();\r\n }\r\n\r\n private init(): FilterSort {\r\n this.initFilterAction(this.filter.getFilterLayerNode())\r\n .initFilter()\r\n .initFilterNavigationTracking();\r\n\r\n return this;\r\n }\r\n\r\n private initFilterAction(element: HTMLElement): FilterSort {\r\n this.filterAction = this.filterAction || new FilterAction(element);\r\n\r\n return this;\r\n }\r\n\r\n private initFilter(): FilterSort {\r\n this.filter.init();\r\n return this;\r\n }\r\n\r\n private initFilterNavigationTracking() {\r\n new NivTFilterNavigation();\r\n return this;\r\n }\r\n}\r\n\r\n// Hot Module Replacement\r\nif (module.hot) {\r\n let nodesCache: HMRNodes[] = Array.from(document.querySelectorAll(moduleSelector)).map((element: Node) => ({ nodeToReplace: element, nodeOrigin: element.cloneNode(true) }));\r\n\r\n FilterSort.setup(moduleSelector);\r\n\r\n module.hot.accept(() => {\r\n FilterSort.setup(moduleSelector);\r\n });\r\n module.hot.dispose(() => {\r\n nodesCache.forEach(({ nodeToReplace, nodeOrigin }) => { nodeToReplace = nodeToReplace.parentElement.replaceChild(nodeOrigin.cloneNode(true), nodeToReplace) });\r\n });\r\n} else {\r\n FilterSort.setup(moduleSelector);\r\n}","export function encodeParams(params: FilterParams): string {\r\n return Object.entries(params).map(([key, value]) => `${encodeURIComponent(key)}=${value.map(v => encodeURIComponent(v)).join(',')}`).join('&');\r\n}\r\n\r\nexport function onFilterTeaserGridChange(container: HTMLElement): void {\r\n const observer = new MutationObserver(() => {\r\n observer.disconnect();\r\n document.dispatchEvent(new Event('NiveaXLoadMoreLoaded'));\r\n });\r\n\r\n observer.observe(container, { childList: true });\r\n}","/// \r\nimport { addLayer } from '../ClassWithTracking/helpers';\r\nexport default class NivTFilterNavigation {\r\n constructor() {\r\n this.init();\r\n }\r\n\r\n init() {\r\n let filterNavigation: HTMLElement = document.querySelector('.nx-filter-navigation');\r\n\r\n if (!!filterNavigation) {\r\n filterNavigation.addEventListener('click', (e) => {\r\n let clickedElement: HTMLElement = e.target;\r\n if (clickedElement.classList.contains('nx-filter-navigation__item')) {\r\n this.trackNavigationClick(clickedElement.dataset.name);\r\n }\r\n });\r\n }\r\n }\r\n\r\n trackNavigationClick(eventLabel: string) {\r\n if (window.NiveaX.IsUAEnabled) {\r\n addLayer({\r\n event: 'ga_event',\r\n eventCategory: 'Filter Navigation',\r\n eventAction: 'Item Click',\r\n eventLabel: eventLabel,\r\n eventNonInteraction: false\r\n });\r\n }\r\n\r\n if (window.NiveaX.IsGA4Enabled) {\r\n addLayer({\r\n event: 'ga4_event',\r\n event_name: 'filter_navigation',\r\n filter_navigation_title: eventLabel,\r\n _clear: true,\r\n });\r\n }\r\n }\r\n}","/// \r\nimport { addLayer } from '../ClassWithTracking/helpers';\r\nexport default class NivTSort {\r\n\r\n constructor(public element: HTMLElement) {\r\n this.init();\r\n }\r\n\r\n init() {\r\n this.trackSortOption(this.element.innerText);\r\n }\r\n\r\n trackSortOption(eventLabel: string) {\r\n if (window.NiveaX.IsUAEnabled) {\r\n addLayer({\r\n event: 'ga_event',\r\n eventCategory: 'Sort',\r\n eventAction: 'Sort',\r\n eventLabel: eventLabel,\r\n eventNonInteraction: false\r\n });\r\n }\r\n \r\n // if (window.NiveaX.IsGA4Enabled) { // this has moved into tracking framework now\r\n // addLayer({\r\n // event: 'ga4_event',\r\n // event_name: 'sort',\r\n // sort_title: eventLabel,\r\n // _clear: true\r\n // });\r\n // }\r\n\r\n }\r\n}","import { fromEvent } from 'rxjs';\r\nimport { map, filter } from 'rxjs/operators';\r\nimport { partial } from '../helpers/functional';\r\nimport LayerPage from './LayerPage';\r\nimport { getOptions } from '../helpers/helperFunctions';\r\nimport { addClass, hasClass, removeClassFromList, createElementFromString } from '../helpers/DOMHelpers';\r\nimport { Optional } from '../typings/mapped-types';\r\nimport NivTSort from './NivTSort';\r\n\r\nconst moduleSelector = '[data-module=\"Sort\"]';\r\n\r\nexport default class Sort {\r\n protected layer: LayerPage;\r\n protected sortOpenBtn: HTMLElement;\r\n protected sortTmplNode: HTMLElement;\r\n protected sortSelect: HTMLSelectElement;\r\n protected sortList: HTMLElement;\r\n protected sortMethod: string = null;\r\n protected lastSelectedOption: HTMLElement;\r\n\r\n\r\n static setup(selector: string = moduleSelector): void {\r\n Array.from(document.querySelectorAll(selector)).filter((node: HTMLElement) => !node.dataset.moduleInitialized).forEach((element: HTMLElement) => {\r\n new Sort(element);\r\n element.dataset.moduleInitialized = 'true';\r\n });\r\n }\r\n\r\n constructor(public element: HTMLElement, protected options: Optional = {}) {\r\n this.options = getOptions(this.element, Object.assign(this.getDefaultOptions(), this.options));\r\n this.sortOpenBtn = this.element.querySelector(this.options.sortOpenBtnSelector);\r\n this.sortTmplNode = this.element.querySelector(this.options.sortTmplSelector);\r\n this.sortSelect = this.element.querySelector(this.options.sortSelectSelector);\r\n this.layer = this.getSortLayer();\r\n this.sortList = this.layer.getLayerNode().querySelector(this.options.sortListSelector);\r\n\r\n this.init();\r\n }\r\n\r\n protected init(): Sort {\r\n this.addHandlerOnSortOpenBtnClick()\r\n .addHandlerOnSortLayerClick();\r\n\r\n return this;\r\n }\r\n\r\n\r\n // Start: SortLayer\r\n private getSortLayer(): LayerPage {\r\n const layer = new LayerPage(this.element,\r\n {\r\n afterOpen: async () => { document.dispatchEvent(new CustomEvent('NiveaBasicTracking:reInitHandlers'))},\r\n beforeClose: async () => this.removeOptionSelection().recoverLastSelectedOption(),\r\n })\r\n\r\n layer.insertContent(createElementFromString(this.sortTmplNode.innerHTML));\r\n\r\n return layer;\r\n }\r\n\r\n\r\n protected openSortLayer(hide?: boolean): Sort {\r\n this.layer.open();\r\n return this;\r\n }\r\n\r\n protected closeSortLayer(): Sort {\r\n this.layer.close();\r\n return this;\r\n }\r\n // End: SortLayer\r\n\r\n // Start: Event handlers\r\n protected addHandlerOnSortOpenBtnClick(): Sort {\r\n this.sortOpenBtn.addEventListener('click', () => this.openSortLayer());\r\n return this;\r\n }\r\n\r\n protected addHandlerOnSortLayerClick(): Sort {\r\n const layerNode = this.layer.getLayerNode(),\r\n layerNodeClick = fromEvent(layerNode, 'click').pipe(map(({ target }) => target)),\r\n optionClick = layerNodeClick.pipe(filter(this.isListOption())),\r\n sortBtnClick = layerNodeClick.pipe(filter(this.isSortButton()));\r\n\r\n optionClick.subscribe(option => this.toggleOption(option));\r\n sortBtnClick.subscribe(() => this.applySort());\r\n\r\n return this;\r\n }\r\n\r\n protected applySort(): Sort {\r\n this.setSortMethod(this.sortMethod)\r\n .saveSelectedOption()\r\n .reloadFilterAction()\r\n .closeSortLayer()\r\n .trackSort();\r\n\r\n return this;\r\n }\r\n\r\n protected trackSort() {\r\n new NivTSort(this.lastSelectedOption);\r\n return this;\r\n }\r\n\r\n protected toggleOption(element: HTMLElement): void {\r\n const selectedClass = `${this.options.sortListOptionSelector}--selected`;\r\n\r\n this.removeOptionSelection();\r\n addClass(element, selectedClass);\r\n\r\n this.sortMethod = element.dataset.optionValue;\r\n }\r\n\r\n // Check functions\r\n protected isListOption(): (element: EventTarget) => boolean {\r\n return partial(hasClass, partial, this.options.sortListOptionSelector);\r\n }\r\n\r\n protected isSortButton(): (element: EventTarget) => boolean {\r\n return partial(hasClass, partial, this.options.sortBtnSelector);\r\n }\r\n\r\n protected isLayerCloseBtn(): (element: EventTarget) => boolean {\r\n return partial((className: string, target: HTMLElement) => !!target.closest(className), `.${this.options.sortLayerCloseBtnSelector}`);\r\n }\r\n\r\n // Start: FilterAction callbacks\r\n protected reloadFilterAction(): Sort {\r\n this.options.callbacks.reload();\r\n\r\n return this;\r\n }\r\n // End: FilterAction callbacks\r\n\r\n protected setSortMethod(method: string): Sort {\r\n this.sortSelect.value = method || this.sortSelect.value;\r\n return this;\r\n }\r\n\r\n protected saveSelectedOption(): Sort {\r\n this.lastSelectedOption = this.sortList.querySelector(`.${this.options.sortListOptionSelector}--selected`);\r\n return this;\r\n }\r\n\r\n protected removeOptionSelection(): Sort {\r\n removeClassFromList(Array.from(this.sortList.children), `${this.options.sortListOptionSelector}--selected`);\r\n return this;\r\n }\r\n\r\n protected recoverLastSelectedOption(): Sort {\r\n this.lastSelectedOption && addClass(this.lastSelectedOption, `${this.options.sortListOptionSelector}--selected`);\r\n return this;\r\n }\r\n\r\n protected getDefaultOptions(): Optional {\r\n return {\r\n sortOpenBtnSelector: '.nx-sort-button__wrapper',\r\n sortTmplSelector: '.nx-sort__tmpl',\r\n sortBtnSelector: 'nx-sort-filters__sort-btn',\r\n sortListOptionSelector: 'nx-sort-list__option',\r\n sortListSelector: '.nx-sort-list',\r\n sortSelectSelector: '#sort',\r\n sortLayerCloseBtnSelector: 'nx-layer__close',\r\n callbacks: {\r\n update: () => { },\r\n reload: () => { },\r\n saveState: () => { },\r\n resetState: () => { }\r\n }\r\n };\r\n }\r\n}\r\n\r\n// Hot Module Replacement\r\nif (module.hot) {\r\n let nodesCache: HMRNodes[] = Array.from(document.querySelectorAll(moduleSelector)).map((element: Node) => ({ nodeToReplace: element, nodeOrigin: element.cloneNode(true) }));\r\n\r\n Sort.setup(moduleSelector);\r\n\r\n module.hot.accept(() => {\r\n Sort.setup(moduleSelector);\r\n });\r\n module.hot.dispose(() => {\r\n nodesCache.forEach(({ nodeToReplace, nodeOrigin }) => { nodeToReplace = nodeToReplace.parentElement.replaceChild(nodeOrigin.cloneNode(true), nodeToReplace) });\r\n });\r\n} else {\r\n Sort.setup(moduleSelector);\r\n}","import { \r\n FILTER_STATE,\r\n FilterStateTypes\r\n} from './types';\r\n\r\nexport const filterState = (filter: FilterParams): FilterStateTypes => ({ type: FILTER_STATE, filter });\r\n"],"names":["FilterAction","constructor","element","options","this","Object","assign","getDefaultOptions","filterTag","querySelector","filterTagSelector","applyBtn","applyBtnSelector","applyBtnCounter","firstElementChild","tagsMap","tagsStr","window","atob","getAttribute","tagsMapAttrs","tagsStrAttr","tagCount","parseInt","tagCountAttr","productsCount","productsCountAttr","initURLNavigation","init","recoverState","addEventListener","getUrlParameters","resetState","update","state","getFilters","filters","Array","from","document","querySelectorAll","hierarchicalFilterSelector","forEach","filterNode","values","hierarchicalFilterValueSelector","valueNode","key","dataset","push","node","checked","classList","contains","hierarchicalFilterValueActiveClass","hierarchical","index","parentsIndex","parents","filter","isAnd","cache","filterItemSelector","filterKey","valueNodes","checkboxSelector","name","isProductTagged","productIdx","tagIdx","i","charCodeAt","Math","floor","isProductIncludedInFilter","p","isAndFilter","anyValueChecked","v","length","value","isProductVisible","f","cacheEntry","isIncluded","countResults","count","countSimulateChecked","checkedValue","oldCache","oldChecked","countHierarchicalSimulateOnlyThisChecked","oldFilters","countSimulateOnlyThisChecked","oldFilter","checkHierarchicalParendIdx","parentsIdx","parentsIdxArray","split","includes","hierarchicalParentIndex","setHierarchicalParendIdx","mainNavList","parentItem","setVisibility","isVisible","hidden","setCount","isDisabled","countNode","parent","countNodeSelector","nextSibling","disabled","innerText","setGlobalCount","getReloadUrl","gridNode","paramsStr","encodeParams","saveCurrentState","getState","ajaxUrl","getReloadUrlFromHistory","history","getFilterParams","getParams","params","selector","getElementById","sortMethod","keys","currentCount","fIdx","vIdx","hasHierarchicalParendIdx","countStr","toString","difference","allValuesDisabled","every","setAllCount","dispatchEvent","CustomEvent","updateV2","getActiveHierarchicalLevel","currentFilter","currentId","getActiveFilterNav","reload","undefined","container","gridNodeSelector","xhr","XMLHttpRequest","newUrl","updateUrl","pushState","onload","status","responseElement","responseText","onFilterTeaserGridChange","innerHTML","NiveaX","loadShopPrices","initModules","console","error","open","send","searchPar","URLSearchParams","location","search","get","filterCategory","inputs","aciveFilterNames","inp","saveState","countElement","filterBtnSelector","moduleSelector","FilterSort","setup","moduleInitialized","callbacks","filterAction","sort","initFilterAction","getFilterLayerNode","initFilter","initFilterNavigationTracking","entries","map","encodeURIComponent","join","observer","MutationObserver","disconnect","Event","observe","childList","NivTFilterNavigation","filterNavigation","e","clickedElement","target","trackNavigationClick","eventLabel","IsUAEnabled","event","eventCategory","eventAction","eventNonInteraction","IsGA4Enabled","event_name","filter_navigation_title","_clear","NivTSort","trackSortOption","Sort","sortOpenBtn","sortOpenBtnSelector","sortTmplNode","sortTmplSelector","sortSelect","sortSelectSelector","layer","getSortLayer","sortList","getLayerNode","sortListSelector","addHandlerOnSortOpenBtnClick","addHandlerOnSortLayerClick","afterOpen","async","beforeClose","removeOptionSelection","recoverLastSelectedOption","insertContent","openSortLayer","hide","closeSortLayer","close","layerNode","layerNodeClick","pipe","optionClick","isListOption","sortBtnClick","isSortButton","subscribe","option","toggleOption","applySort","setSortMethod","saveSelectedOption","reloadFilterAction","trackSort","lastSelectedOption","selectedClass","sortListOptionSelector","optionValue","sortBtnSelector","isLayerCloseBtn","className","closest","sortLayerCloseBtnSelector","method","children","filterState","type"],"sourceRoot":""}