{"version":3,"names":["initializeFocusHandling","originalFocus","HTMLElement","prototype","focus","options","host","this","shouldModify","setTimeout","call","preventScroll","preventFocus","document","addEventListener","event","preventDefault","stopImmediatePropagation","stopPropagation","PlpParameterManager","connectedCallback","waitForAtomic","commerceBindings","initializeBindings","commerceController","buildProductListing","_a","engine","commerceSearch","summary","parameterManager","initialState","parameters","deserialize","subscribe","state","firstRequestExecuted","isLoading","scrollToTop","history","pushState","title","serialize","synchronize","executeFirstRequest","error","console","topElement","querySelector","scrollIntoView","behavior","block","params","URLSearchParams","window","location","search","categoryFacets","facets","numericFacets","store","getState","perPage","_c","_b","commercePagination","principal","sortCriteria","buildRelevanceSortCriterion","forEach","value","key","direction","split","sortCriterion","buildFieldsSortCriterion","name","page","parseInt","facetName","facetValues","concat","map","decodeURIComponent","v","createNumericFacetRequest","_e","_d","searchParameters","currentCategory","path","toLowerCase","startsWith","_g","_f","f","cf","nf","query","Object","keys","commerceFacetSet","appliedSort","commerceSort","by","fields","request","values","facetType","type","selectedValues","filter","k","indexOf","getSelectedValuesForHierarchicalFacet","encodeURIComponent","endInclusive","start","end","length","join","replace","origin","pathname","children","render","h","Host"],"sources":["src/components/plp-parameter-manager/focus-utils.ts","src/components/plp-parameter-manager/plp-parameter-manager.tsx"],"sourcesContent":["export function initializeFocusHandling() {\r\n const originalFocus = HTMLElement.prototype.focus;\r\n \r\n HTMLElement.prototype.focus = function (options) {\r\n const host = (this as any)[\"s-hn\"];\r\n const shouldModify =\r\n host === \"ATOMIC-COMMERCE-FACET\" ||\r\n host === \"ATOMIC-COMMERCE-CATEGORY-FACET\" ||\r\n host === \"ATOMIC-PRODUCT-LINK\" ||\r\n host === \"ATOMIC-PRODUCT-IMAGE\";\r\n \r\n setTimeout(() => {\r\n if (shouldModify) {\r\n originalFocus.call(this, { ...(options || {}), preventScroll: true, preventFocus: true });\r\n } else {\r\n originalFocus.call(this, options);\r\n }\r\n }, 0);\r\n };\r\n \r\n document.addEventListener('atomic/scrollToTop', (event) => {\r\n event.preventDefault(); \r\n event.stopImmediatePropagation();\r\n event.stopPropagation(); \r\n }, true); \r\n}","import { CommerceBindings, initializeBindings } from \"@coveo/atomic\";\r\nimport { Component, h, Host, Element } from \"@stencil/core\";\r\nimport { waitForAtomic } from \"../../utils/atomic\";\r\nimport {\r\n buildFieldsSortCriterion,\r\n buildProductListing,\r\n buildRelevanceSortCriterion,\r\n ParameterManager,\r\n SortDirection\r\n} from '@coveo/headless/commerce'\r\nimport { initializeFocusHandling } from \"./focus-utils\";\r\n\r\n@Component({\r\n tag: 'plp-parameter-manager',\r\n shadow: true,\r\n})\r\nexport class PlpParameterManager {\r\n\r\n\r\n private commerceBindings?: CommerceBindings;\r\n\r\n @Element() private host!: Element;\r\n\r\n private topElement!: HTMLElement;\r\n\r\n public async connectedCallback() {\r\n try {\r\n await waitForAtomic();\r\n this.initializeFocusHandling();\r\n\r\n this.commerceBindings = await initializeBindings(this.host);\r\n let commerceController = buildProductListing(this.commerceBindings?.engine);\r\n let commerceSearch = commerceController.summary();\r\n \r\n let parameterManager : ParameterManager = commerceController.parameterManager({\r\n initialState: {\r\n parameters: this.deserialize()\r\n }\r\n });\r\n \r\n parameterManager.subscribe(() => { \r\n \r\n if (commerceSearch.state && commerceSearch.state.firstRequestExecuted && !commerceSearch.state.isLoading) {\r\n this.scrollToTop();\r\n history.pushState(null, document.title, this.serialize());\r\n }\r\n });\r\n\r\n // synchronize the state upon clicking the back button\r\n addEventListener(\"popstate\", () => {\r\n parameterManager.synchronize(this.deserialize());\r\n });\r\n\r\n commerceController.executeFirstRequest();\r\n\r\n } catch (error) {\r\n console.error(error);\r\n }\r\n }\r\n\r\n initializeFocusHandling(){\r\n this.topElement = document.querySelector('.container-fluid')!;\r\n initializeFocusHandling();\r\n }\r\n\r\n private scrollToTop() {\r\n //scroll to the top of the .container-fluid element\r\n this.topElement.scrollIntoView({ behavior: \"instant\", block: \"start\" });\r\n }\r\n\r\n private deserialize() {\r\n const params:URLSearchParams = new URLSearchParams(window.location.search);\r\n let parameters:any = {};\r\n let categoryFacets:any = {};\r\n let facets:any = {};\r\n let numericFacets:any = {};\r\n\r\n let state = (this.commerceBindings?.engine as any).store.getState();\r\n parameters.perPage = state?.commercePagination?.principal?.perPage || 32;\r\n\r\n //sortCriteria is relevance by default\r\n parameters.sortCriteria = buildRelevanceSortCriterion();\r\n\r\n params.forEach((value, key) => {\r\n if (key == \"sortCriteria\") {\r\n let direction = value.split(' ')[1] as SortDirection;\r\n let sortCriterion = buildFieldsSortCriterion([{name: value.split(' ')[0], direction}]);\r\n parameters.sortCriteria = sortCriterion;\r\n } \r\n else if (key == \"page\"){\r\n const page = parseInt(value) - 1\r\n parameters.page = page ;\r\n }\r\n else if (key == \"inStockForDelivery\" && value == \"Y\") {\r\n let facetName = \"ec_linde_status_delivery\";\r\n let facetValues = [\"in_stock\"];\r\n if(facetName in facets) {\r\n facets[facetName] = facets[facetName].concat(facetValues);\r\n }\r\n else {\r\n facets[facetName] = facetValues;\r\n }\r\n }\r\n else if (key == \"backorderForDelivery\" && value == \"Y\") {\r\n let facetName = \"ec_linde_status_delivery\";\r\n let facetValues = [\"available_for_delivery\"];\r\n if(facetName in facets) {\r\n facets[facetName] = facets[facetName].concat(facetValues);\r\n }\r\n else {\r\n facets[facetName] = facetValues;\r\n }\r\n }\r\n else if (key == \"inStockForPickup\" && value == \"Y\") {\r\n let facetName = \"ec_linde_status_pickup\";\r\n let facetValues = [\"in_stock\"];\r\n facets[facetName] = facetValues;\r\n }\r\n else if (key == \"brand\") {\r\n let facetName = \"ec_\"+key;\r\n let facetValues = value.split(',').map(decodeURIComponent);\r\n facets[facetName] = facetValues;\r\n }\r\n else if (key == \"price\") {\r\n let facetName = \"ec_\"+key;\r\n let facetValues = value.split(',').map(v => this.createNumericFacetRequest(v));\r\n numericFacets[facetName] = facetValues;\r\n }\r\n else {\r\n let facetName = \"ec_linde_\"+key;\r\n let facetValues = value.split(',').map(decodeURIComponent);\r\n facets[facetName] = facetValues;\r\n }\r\n });\r\n\r\n /*Preset Category Facet\r\n - looks at w.searchParameters.currentCategory.path\r\n - preset Category Facet filter with its value\r\n - exception: we do it only for Shop All catalog.\r\n (was not working for Clearance as we do not index Clearance catalog paths in ec_category dictionary field, caused a no-results)\r\n */\r\n if(window.searchParameters?.currentCategory?.path) {\r\n if(window.searchParameters.currentCategory.path.toLowerCase().startsWith('shop all')){\r\n let facetName = \"ec_category\";\r\n let facetValues = window.searchParameters?.currentCategory?.path.split('/').map(decodeURIComponent);\r\n categoryFacets[facetName] = facetValues;\r\n if (facets['ec_linde_category']) {\r\n delete facets['ec_linde_category']; //since the facet was appearing in both f and cf\r\n }\r\n }\r\n }\r\n \r\n parameters.f = facets;\r\n parameters.cf = categoryFacets;\r\n parameters.nf = numericFacets;\r\n return parameters;\r\n }\r\n\r\n private serialize() {\r\n let state: any;\r\n let query = '?';\r\n state = (this.commerceBindings?.engine as any).store.getState();\r\n let facets = Object.keys(state.commerceFacetSet);\r\n\r\n //Add Sort Criteria parameter (don't show if sort criteria is relevance)\r\n let appliedSort = state.commerceSort.appliedSort;\r\n if (appliedSort.by != \"relevance\" && appliedSort.by == \"fields\") {\r\n query = query + 'sortCriteria=' + appliedSort.fields[0].name + ' ' + appliedSort.fields[0].direction + '&';\r\n } \r\n \r\n // Add page parameter\r\n query = query + 'page=' + (state.commercePagination.principal.page + 1);\r\n\r\n for (var f in facets) {\r\n let facetName = facets[f];\r\n let facetValues = state.commerceFacetSet[facetName].request.values;\r\n let facetType = state.commerceFacetSet[facetName].request.type;\r\n let selectedValues = [];\r\n if (facetName == \"ec_linde_status_delivery\") {\r\n selectedValues = facetValues?.filter((k: any) => k.state == \"selected\").map((v: any) => v.value);\r\n if (selectedValues.indexOf(\"in_stock\") > -1) {\r\n query = query + '&inStockForDelivery=Y';\r\n }\r\n if (selectedValues.indexOf(\"available_for_delivery\") > -1) {\r\n query = query + '&backorderForDelivery=Y';\r\n }\r\n }\r\n else if (facetName == \"ec_linde_status_pickup\") {\r\n selectedValues = facetValues?.filter((k: any) => k.state == \"selected\").map((v: any) => v.value);\r\n if (selectedValues.indexOf(\"in_stock\") > -1) {\r\n query = query + '&inStockForPickup=Y';\r\n }\r\n }\r\n else if (facetType == \"regular\") {\r\n selectedValues = facetValues?.filter((k: any) => k.state == \"selected\").map((v: any) => v.value);\r\n }\r\n else if (facetType == \"hierarchical\") {\r\n selectedValues = this.getSelectedValuesForHierarchicalFacet(facetValues).split(';').\r\n filter(v => v != '').map(encodeURIComponent);\r\n }\r\n else if (facetType == \"numericalRange\") {\r\n selectedValues = facetValues?.filter((k: any) => k.state == \"selected\").\r\n map((v: any) => v.endInclusive ? v.start + '...' + v.end : v.start + '..' + v.end);\r\n }\r\n if (selectedValues.length > 0 && [\"ec_linde_status_delivery\", \"ec_linde_status_pickup\"].indexOf(facetName) < 0) {\r\n selectedValues = selectedValues.join(\",\");\r\n facetName = facetName.replace(\"ec_linde_\", \"\").replace(\"ec_\", \"\");\r\n query = query + '&' + facetName + '=' + selectedValues;\r\n }\r\n\r\n }\r\n return window.location.origin + window.location.pathname + query;\r\n }\r\n\r\n private createNumericFacetRequest(v:any) {\r\n if(v.indexOf('...') > -1) {\r\n let values = v.split('...');\r\n return {\r\n start: values[0],\r\n end: values[1],\r\n endInclusive: true,\r\n state: \"selected\"\r\n }\r\n }\r\n else {\r\n let values = v.split('..');\r\n return {\r\n start: values[0],\r\n end: values[1],\r\n endInclusive: false,\r\n state: \"selected\"\r\n }\r\n }\r\n\r\n }\r\n \r\n private getSelectedValuesForHierarchicalFacet(facetValues: any): string {\r\n if (facetValues.length == 0) {\r\n return '';\r\n }\r\n else if (facetValues[0].state == \"selected\") {\r\n return facetValues[0].value as string;\r\n }\r\n else {\r\n return (facetValues[0].value as string) + ';' + this.getSelectedValuesForHierarchicalFacet(facetValues[0].children);\r\n }\r\n }\r\n\r\n render() {\r\n return (\r\n \r\n \r\n );\r\n }\r\n\r\n}\r\n\r\n\r\n"],"mappings":"oXAAgBA,IACZ,MAAMC,EAAgBC,YAAYC,UAAUC,MAE5CF,YAAYC,UAAUC,MAAQ,SAAUC,GACtC,MAAMC,EAAQC,KAAa,QAC3B,MAAMC,EACJF,IAAS,yBACTA,IAAS,kCACTA,IAAS,uBACTA,IAAS,uBAEXG,YAAW,KACT,GAAID,EAAc,CAChBP,EAAcS,KAAKH,KAAM,IAAMF,GAAW,GAAKM,cAAe,KAAMC,aAAc,M,KAC7E,CACLX,EAAcS,KAAKH,KAAMF,E,IAE1B,E,EAGLQ,SAASC,iBAAiB,sBAAuBC,IAC/CA,EAAMC,iBACND,EAAME,2BACNF,EAAMG,iBAAiB,GACtB,KACP,C,MCTaC,EAAmB,M,yBASvB,uBAAMC,G,MACX,UACQC,IACNd,KAAKP,0BAELO,KAAKe,uBAAyBC,EAAmBhB,KAAKD,MACtD,IAAIkB,EAAqBC,GAAoBC,EAAAnB,KAAKe,oBAAgB,MAAAI,SAAA,SAAAA,EAAEC,QACpE,IAAIC,EAAiBJ,EAAmBK,UAExC,IAAIC,EAA2CN,EAAmBM,iBAAiB,CACjFC,aAAc,CACZC,WAAYzB,KAAK0B,iBAIrBH,EAAiBI,WAAU,KAE3B,GAAIN,EAAeO,OAASP,EAAeO,MAAMC,uBAAyBR,EAAeO,MAAME,UAAW,CACxG9B,KAAK+B,cACLC,QAAQC,UAAU,KAAM3B,SAAS4B,MAAOlC,KAAKmC,Y,KAK/C5B,iBAAiB,YAAY,KAC3BgB,EAAiBa,YAAYpC,KAAK0B,cAAc,IAGlDT,EAAmBoB,qB,CAEnB,MAAOC,GACPC,QAAQD,MAAMA,E,EAIlB,uBAAA7C,GACEO,KAAKwC,WAAalC,SAASmC,cAAc,oBACzChD,G,CAGM,WAAAsC,GAEN/B,KAAKwC,WAAWE,eAAe,CAAEC,SAAU,UAAWC,MAAO,S,CAGvD,WAAAlB,G,kBACN,MAAMmB,EAAyB,IAAIC,gBAAgBC,OAAOC,SAASC,QACnE,IAAIxB,EAAiB,GACrB,IAAIyB,EAAqB,GACzB,IAAIC,EAAa,GACjB,IAAIC,EAAoB,GAExB,IAAIxB,IAAST,EAAAnB,KAAKe,oBAAgB,MAAAI,SAAA,SAAAA,EAAEC,QAAeiC,MAAMC,WACzD7B,EAAW8B,UAAUC,GAAAC,EAAA7B,IAAK,MAALA,SAAK,SAALA,EAAO8B,sBAAkB,MAAAD,SAAA,SAAAA,EAAEE,aAAS,MAAAH,SAAA,SAAAA,EAAED,UAAW,GAGtE9B,EAAWmC,aAAeC,IAE1BhB,EAAOiB,SAAQ,CAACC,EAAOC,KACrB,GAAIA,GAAO,eAAgB,CACzB,IAAIC,EAAYF,EAAMG,MAAM,KAAK,GACjC,IAAIC,EAAgBC,EAAyB,CAAC,CAACC,KAAMN,EAAMG,MAAM,KAAK,GAAID,eAC1ExC,EAAWmC,aAAeO,C,MAEvB,GAAIH,GAAO,OAAO,CACrB,MAAMM,EAAOC,SAASR,GAAS,EAC/BtC,EAAW6C,KAAOA,C,MAEf,GAAIN,GAAO,sBAAwBD,GAAS,IAAK,CACpD,IAAIS,EAAY,2BAChB,IAAIC,EAAc,CAAC,YACnB,GAAGD,KAAarB,EAAQ,CACtBA,EAAOqB,GAAarB,EAAOqB,GAAWE,OAAOD,E,KAE1C,CACHtB,EAAOqB,GAAaC,C,OAGnB,GAAIT,GAAO,wBAA0BD,GAAS,IAAK,CACtD,IAAIS,EAAY,2BAChB,IAAIC,EAAc,CAAC,0BACnB,GAAGD,KAAarB,EAAQ,CACtBA,EAAOqB,GAAarB,EAAOqB,GAAWE,OAAOD,E,KAE1C,CACHtB,EAAOqB,GAAaC,C,OAGnB,GAAIT,GAAO,oBAAsBD,GAAS,IAAK,CAClD,IAAIS,EAAY,yBAChB,IAAIC,EAAc,CAAC,YACnBtB,EAAOqB,GAAaC,C,MAEjB,GAAIT,GAAO,QAAS,CACvB,IAAIQ,EAAY,MAAMR,EACtB,IAAIS,EAAcV,EAAMG,MAAM,KAAKS,IAAIC,oBACvCzB,EAAOqB,GAAaC,C,MAEjB,GAAIT,GAAO,QAAS,CACvB,IAAIQ,EAAY,MAAMR,EACtB,IAAIS,EAAcV,EAAMG,MAAM,KAAKS,KAAIE,GAAK7E,KAAK8E,0BAA0BD,KAC3EzB,EAAcoB,GAAaC,C,KAExB,CACH,IAAID,EAAY,YAAYR,EAC5B,IAAIS,EAAcV,EAAMG,MAAM,KAAKS,IAAIC,oBACvCzB,EAAOqB,GAAaC,C,KAUxB,IAAGM,GAAAC,EAAAjC,OAAOkC,oBAAgB,MAAAD,SAAA,SAAAA,EAAEE,mBAAe,MAAAH,SAAA,SAAAA,EAAEI,KAAM,CAC/C,GAAGpC,OAAOkC,iBAAiBC,gBAAgBC,KAAKC,cAAcC,WAAW,YAAY,CACnF,IAAIb,EAAY,cAChB,IAAIC,GAAca,GAAAC,EAAAxC,OAAOkC,oBAAgB,MAAAM,SAAA,SAAAA,EAAEL,mBAAe,MAAAI,SAAA,SAAAA,EAAEH,KAAKjB,MAAM,KAAKS,IAAIC,oBAChF1B,EAAesB,GAAaC,EAC5B,GAAItB,EAAO,qBAAsB,QACxBA,EAAO,oB,GAKtB1B,EAAW+D,EAAIrC,EACf1B,EAAWgE,GAAKvC,EAChBzB,EAAWiE,GAAKtC,EAChB,OAAO3B,C,CAGD,SAAAU,G,MACN,IAAIP,EACJ,IAAI+D,EAAQ,IACZ/D,IAAST,EAAAnB,KAAKe,oBAAgB,MAAAI,SAAA,SAAAA,EAAEC,QAAeiC,MAAMC,WACrD,IAAIH,EAASyC,OAAOC,KAAKjE,EAAMkE,kBAG/B,IAAIC,EAAcnE,EAAMoE,aAAaD,YACrC,GAAIA,EAAYE,IAAM,aAAeF,EAAYE,IAAM,SAAU,CAC/DN,EAAQA,EAAQ,gBAAkBI,EAAYG,OAAO,GAAG7B,KAAO,IAAM0B,EAAYG,OAAO,GAAGjC,UAAY,G,CAIzG0B,EAAQA,EAAQ,SAAW/D,EAAM8B,mBAAmBC,UAAUW,KAAO,GAErE,IAAK,IAAIkB,KAAKrC,EAAQ,CACpB,IAAIqB,EAAYrB,EAAOqC,GACvB,IAAIf,EAAc7C,EAAMkE,iBAAiBtB,GAAW2B,QAAQC,OAC5D,IAAIC,EAAYzE,EAAMkE,iBAAiBtB,GAAW2B,QAAQG,KAC1D,IAAIC,EAAiB,GACrB,GAAI/B,GAAa,2BAA4B,CAC3C+B,EAAiB9B,IAAW,MAAXA,SAAW,SAAXA,EAAa+B,QAAQC,GAAWA,EAAE7E,OAAS,aAAY+C,KAAKE,GAAWA,EAAEd,QAC1F,GAAIwC,EAAeG,QAAQ,aAAe,EAAG,CAC3Cf,EAAQA,EAAQ,uB,CAElB,GAAIY,EAAeG,QAAQ,2BAA6B,EAAG,CACzDf,EAAQA,EAAQ,yB,OAGf,GAAInB,GAAa,yBAA0B,CAC9C+B,EAAiB9B,IAAW,MAAXA,SAAW,SAAXA,EAAa+B,QAAQC,GAAWA,EAAE7E,OAAS,aAAY+C,KAAKE,GAAWA,EAAEd,QAC1F,GAAIwC,EAAeG,QAAQ,aAAe,EAAG,CAC3Cf,EAAQA,EAAQ,qB,OAGf,GAAIU,GAAa,UAAW,CAC/BE,EAAiB9B,IAAW,MAAXA,SAAW,SAAXA,EAAa+B,QAAQC,GAAWA,EAAE7E,OAAS,aAAY+C,KAAKE,GAAWA,EAAEd,O,MAEvF,GAAIsC,GAAa,eAAgB,CACpCE,EAAiBvG,KAAK2G,sCAAsClC,GAAaP,MAAM,KAC7EsC,QAAO3B,GAAKA,GAAK,KAAIF,IAAIiC,mB,MAExB,GAAIP,GAAa,iBAAkB,CACtCE,EAAiB9B,IAAW,MAAXA,SAAW,SAAXA,EAAa+B,QAAQC,GAAWA,EAAE7E,OAAS,aAC1D+C,KAAKE,GAAWA,EAAEgC,aAAehC,EAAEiC,MAAQ,MAAQjC,EAAEkC,IAAMlC,EAAEiC,MAAQ,KAAOjC,EAAEkC,K,CAElF,GAAIR,EAAeS,OAAS,GAAK,CAAC,2BAA4B,0BAA0BN,QAAQlC,GAAa,EAAG,CAC9G+B,EAAiBA,EAAeU,KAAK,KACrCzC,EAAYA,EAAU0C,QAAQ,YAAa,IAAIA,QAAQ,MAAO,IAC9DvB,EAAQA,EAAQ,IAAMnB,EAAY,IAAM+B,C,EAI5C,OAAOxD,OAAOC,SAASmE,OAASpE,OAAOC,SAASoE,SAAWzB,C,CAGrD,yBAAAb,CAA0BD,GAChC,GAAGA,EAAE6B,QAAQ,QAAU,EAAG,CACxB,IAAIN,EAASvB,EAAEX,MAAM,OACrB,MAAO,CACL4C,MAAOV,EAAO,GACdW,IAAKX,EAAO,GACZS,aAAc,KACdjF,MAAO,W,KAGN,CACH,IAAIwE,EAASvB,EAAEX,MAAM,MACrB,MAAO,CACL4C,MAAOV,EAAO,GACdW,IAAKX,EAAO,GACZS,aAAc,MACdjF,MAAO,W,EAML,qCAAA+E,CAAsClC,GAC5C,GAAIA,EAAYuC,QAAU,EAAG,CAC3B,MAAO,E,MAEJ,GAAIvC,EAAY,GAAG7C,OAAS,WAAY,CAC3C,OAAO6C,EAAY,GAAGV,K,KAEnB,CACH,OAAQU,EAAY,GAAGV,MAAmB,IAAM/D,KAAK2G,sCAAsClC,EAAY,GAAG4C,S,EAI9G,MAAAC,GACE,OACEC,EAACC,EAAI,CAAAxD,IAAA,4C","ignoreList":[]}