{"version":3,"file":"index-b7f68edb.js","sources":["../../../../src/scripts/coveo/modules/product-listing/card.tsx","../../../../src/scripts/coveo/modules/product-listing/templates.tsx","../../../../src/scripts/coveo/modules/product-listing/index.tsx"],"sourcesContent":["import React from 'react';\n\ntype ProductCardProps = {\n  image: string;\n  imageAlt: string;\n  title: string;\n  description: string;\n  dataSheetLabel: string;\n  safetyDataSheetLabel: string;\n  allDocsLabel: string;\n  downloadLabel: string;\n  productDetailPageUrl: string;\n  dataSheetCount: number;\n  safetyDataSheetCount: number;\n  singleDataSheetUrl: string;\n  singleSafetyDataSheetUrl: string;\n  warrantyLabel: string;\n  warrantyCount?: number;\n  singleWarrantyUrl?: string;\n};\n\nfunction ProductCard({\n  image,\n  imageAlt,\n  title,\n  description,\n  dataSheetLabel,\n  safetyDataSheetLabel,\n  allDocsLabel,\n  downloadLabel,\n  productDetailPageUrl,\n  dataSheetCount,\n  safetyDataSheetCount,\n  singleDataSheetUrl,\n  singleSafetyDataSheetUrl,\n  warrantyLabel,\n  warrantyCount,\n  singleWarrantyUrl\n}: ProductCardProps) {\n  const renderDocumentLink = (\n    downloadUrl: string,\n    label: string,\n    isDownload: boolean\n  ) => {\n    return (\n      <a\n        href={downloadUrl}\n        {...(isDownload && { download: '' })}\n        className={`link--inline ${\n          isDownload ? 'product-card__download' : 'link--arrow'\n        }`}\n        target=\"_blank\"\n      >\n        <span>\n          <span className=\"sr-only\">\n            {isDownload ? downloadLabel : allDocsLabel}{' '}\n          </span>\n          {label}\n        </span>\n      </a>\n    );\n  };\n\n  return (\n    <article className=\"product-card\">\n      <a\n        href={productDetailPageUrl}\n        className=\"product-card__picture-wrapper product-card__picture-wrapper--desktop\"\n        aria-label={imageAlt}\n      >\n        <picture className=\"product-card__picture\">\n          <img src={image} alt={imageAlt} width={140} height={140} />\n        </picture>\n      </a>\n      <div className=\"product-card__content\">\n        <h2 className=\"product-card__heading\">\n          <a className=\"link--inline\" href={productDetailPageUrl}>\n            <span>{title}</span>\n          </a>\n        </h2>\n        <div\n          className=\"product-card__description rtf--inline\"\n          dangerouslySetInnerHTML={{ __html: description }}\n        />\n      </div>\n      <a\n        href={productDetailPageUrl}\n        className=\"product-card__picture-wrapper product-card__picture-wrapper--mobile\"\n        aria-label={imageAlt}\n      >\n        <picture className=\"product-card__picture \">\n          <img src={image} alt={imageAlt} width={120} height={120} />\n        </picture>\n      </a>\n      <div className=\"product-card__links\">\n        {dataSheetCount && dataSheetCount > 0 ? (\n          <>\n            {renderDocumentLink(\n              singleDataSheetUrl,\n              dataSheetLabel,\n              dataSheetCount === 1\n            )}\n          </>\n        ) : null}\n        {safetyDataSheetCount && safetyDataSheetCount > 0 ? (\n          <>\n            {renderDocumentLink(\n              singleSafetyDataSheetUrl,\n              safetyDataSheetLabel,\n              safetyDataSheetCount === 1\n            )}\n          </>\n        ) : null}\n        {warrantyCount && warrantyCount > 0 ? (\n          <>\n            {renderDocumentLink(\n              singleWarrantyUrl as string,\n              warrantyLabel,\n              warrantyCount === 1\n            )}\n          </>\n        ) : null}\n      </div>\n    </article>\n  );\n}\n\nexport default ProductCard;\n","import React from 'react';\nimport {\n  buildResultTemplatesManager,\n  ResultTemplate,\n  Result,\n  SearchEngine\n} from '@coveo/headless';\nimport { headlessEngine } from '../../engine';\nimport {\n  fieldsToInclude,\n  labelsObj,\n  fieldsObject\n} from '../../controllers/controller';\nimport ProductCard from './card';\n\ntype DocumentsListingResultProps = Result & {\n  title: string;\n  description: string;\n  image: string;\n  imageAlt: string;\n};\n\nexport const resultTemplatesManager = buildResultTemplatesManager(\n  headlessEngine as SearchEngine\n);\n\nconst DocumentsListingResultTemplate: ResultTemplate = {\n  conditions: [],\n  fields: ['UniqueId', 'Uri', ...fieldsToInclude],\n  content: (result: DocumentsListingResultProps) => (\n    <li key={result.uniqueId}>\n      <ProductCard\n        image={result.raw[fieldsObject.image] as string}\n        imageAlt={result.raw[fieldsObject.imageAlt] as string}\n        title={result.raw[fieldsObject.title] as string}\n        productDetailPageUrl={\n          result.raw[fieldsObject.productDetailPageUrl] as string\n        }\n        description={result.raw[fieldsObject.description] as string}\n        dataSheetCount={result.raw[fieldsObject.dataSheetCount] as number}\n        safetyDataSheetCount={\n          result.raw[fieldsObject.safetyDataSheetCount] as number\n        }\n        singleDataSheetUrl={\n          result.raw[fieldsObject.singleDataSheetUrl] as string\n        }\n        singleSafetyDataSheetUrl={\n          result.raw[fieldsObject.singleSafetyDataSheetUrl] as string\n        }\n        dataSheetLabel={labelsObj.dataSheetLabel}\n        safetyDataSheetLabel={labelsObj.safetyDataSheetLabel}\n        allDocsLabel={labelsObj.allDocsLabel}\n        downloadLabel={labelsObj.downloadLabel}\n        warrantyCount={result.raw[fieldsObject.warrantyCount] as number}\n        warrantyLabel={labelsObj.warrantyLabel}\n        singleWarrantyUrl={result.raw[fieldsObject.singleWarrantyUrl] as string}\n      />\n    </li>\n  )\n};\n\nresultTemplatesManager.registerTemplates(DocumentsListingResultTemplate);\n","import React, { useRef, useEffect, useState } from 'react';\nimport ResultList from '../../components/result-list';\nimport { resultTemplatesManager } from './templates';\nimport { resultList, defaultQuery, facets } from '../../controllers/controller';\nimport Pagination from '../../components/pagination';\nimport {\n  CategoryFacet,\n  SearchEngine,\n  buildCategoryFacet,\n  buildFacet,\n  loadAdvancedSearchQueryActions,\n  loadSearchActions,\n  loadSearchAnalyticsActions,\n  ResultList as ResultListType,\n  Facet as FacetType\n} from '@coveo/headless';\nimport { headlessEngine } from '../../engine';\nimport QuerySummary from '../../components/query-summary';\nimport { bindUrlManager } from '../../components/url-manager';\nimport MobileFilters from '../../components/mobile-filters';\nimport Facet from '../../components/facet';\nimport FacetBreadcrumbs from '../../components/facet-breadcrumbs';\nimport { Sort } from '../../components/sort';\nimport FacetTree from '../../components/category-facet';\nimport { dispatchPersonaViewEvent } from '../../../helpers/personalize';\n\ntype ProductListingProps = {\n  labels: string;\n};\n\nconst facetsObj = facets.map(facet => {\n  return {\n    title: facet.title,\n    certificationsLabel: facet.certificationsLabel,\n    isCategory: facet.isCategory,\n    controller: facet.isCategory\n      ? buildCategoryFacet(headlessEngine as SearchEngine, {\n          options: {\n            field: facet.field as string,\n            filterFacetCount: true,\n            delimitingCharacter: '_',\n            numberOfValues: 999\n          }\n        })\n      : buildFacet(headlessEngine as SearchEngine, {\n          options: {\n            field: facet.field,\n            filterFacetCount: true\n          }\n        }),\n    customOrder: facet.customOrder\n  };\n});\n\nfunction ProductListing({ labels }: ProductListingProps) {\n  const labelsObj = JSON.parse(labels);\n  const containerRef = useRef<HTMLDivElement | null>(null);\n  const [promoCards, setPromoCards] = useState('');\n\n  useEffect(() => {\n    if (headlessEngine) {\n      dispatchPersonaViewEvent();\n      bindUrlManager(headlessEngine);\n\n      if (defaultQuery) {\n        const advancedQuerySearchActionCreator =\n          loadAdvancedSearchQueryActions(headlessEngine);\n\n        headlessEngine?.dispatch(\n          advancedQuerySearchActionCreator.registerAdvancedSearchQueries({\n            aq: defaultQuery\n          })\n        );\n\n        const { logInterfaceLoad } = loadSearchAnalyticsActions(headlessEngine);\n        const { executeSearch } = loadSearchActions(headlessEngine);\n        headlessEngine.dispatch(executeSearch(logInterfaceLoad()));\n      }\n\n      headlessEngine.executeFirstSearch();\n    }\n\n    let observer: MutationObserver;\n\n    const targetNode = document.querySelector('.coveo-listing__promo-cards');\n\n    if (targetNode) {\n      const targetInnerHtml = targetNode.innerHTML;\n\n      setPromoCards(targetInnerHtml);\n\n      const config = { attributes: true, childList: true, subtree: true };\n\n      const callback = (mutationList: MutationRecord[]) => {\n        for (const mutation of mutationList) {\n          if (mutation.type === 'childList') {\n            setPromoCards(targetNode.innerHTML);\n          }\n        }\n      };\n\n      observer = new MutationObserver(callback);\n      observer.observe(targetNode, config);\n    }\n\n    return () => {\n      if (observer) observer.disconnect();\n    };\n  }, []);\n\n  const renderFilters = (isMobile?: boolean) => {\n    return (\n      <div\n        className={`product-listing__facets ${\n          isMobile\n            ? 'product-listing__facets--mobile'\n            : 'product-listing__facets--desktop'\n        }`}\n      >\n        {facetsObj.map((facet, index) => (\n          <React.Fragment key={index}>\n            {facet.isCategory ? (\n              <FacetTree\n                title={facet.title}\n                controller={facet.controller as CategoryFacet}\n                defaultExpanded={isMobile ? false : true}\n                backToAll={labelsObj.backToAll}\n                addListeners={isMobile}\n              />\n            ) : (\n              <Facet\n                controller={facet.controller as FacetType}\n                title={facet.title}\n                customOrder={facet.customOrder}\n                defaultExpanded={isMobile ? false : true}\n              />\n            )}\n          </React.Fragment>\n        ))}\n      </div>\n    );\n  };\n\n  return (\n    <div ref={containerRef} className=\"product-listing__wrapper row\">\n      <div className=\"product-listing__filters\">\n        <MobileFilters\n          label={labelsObj.mobileFilterBy}\n          containerRef={containerRef}\n          refinementLayer={true}\n        >\n          {renderFilters(true)}\n        </MobileFilters>\n        {renderFilters()}\n        <div\n          className=\"product-listing__promo-cards product-listing__promo-cards--desktop\"\n          dangerouslySetInnerHTML={{ __html: promoCards }}\n        />\n      </div>\n      <div className=\"product-listing__main\">\n        <div className=\"product-listing__main-filters\">\n          <div className=\"product-listing__summary\">\n            <QuerySummary />\n            <FacetBreadcrumbs\n              clearLabel={labelsObj.clearAll}\n              extraClasses=\"product-listing__breadcrumbs\"\n            />\n          </div>\n          <Sort sortByLabel={labelsObj.sortBy} />\n        </div>\n        <ResultList\n          controller={resultList as ResultListType}\n          className=\"product-listing__results\"\n          resultTemplatesManager={resultTemplatesManager}\n          preventFirstCall={true}\n        />\n        <Pagination />\n        <div\n          className=\"product-listing__promo-cards product-listing__promo-cards--mobile\"\n          dangerouslySetInnerHTML={{ __html: promoCards }}\n        />\n      </div>\n    </div>\n  );\n}\n\nexport default ProductListing;\n"],"names":["ProductCard","image","imageAlt","title","description","dataSheetLabel","safetyDataSheetLabel","allDocsLabel","downloadLabel","productDetailPageUrl","dataSheetCount","safetyDataSheetCount","singleDataSheetUrl","singleSafetyDataSheetUrl","warrantyLabel","warrantyCount","singleWarrantyUrl","renderDocumentLink","downloadUrl","label","isDownload","React","resultTemplatesManager","buildResultTemplatesManager","headlessEngine","DocumentsListingResultTemplate","fieldsToInclude","result","fieldsObject","labelsObj","facetsObj","facets","facet","buildCategoryFacet","buildFacet","ProductListing","labels","containerRef","useRef","promoCards","setPromoCards","useState","useEffect","dispatchPersonaViewEvent","bindUrlManager","defaultQuery","advancedQuerySearchActionCreator","loadAdvancedSearchQueryActions","_a","logInterfaceLoad","loadSearchAnalyticsActions","executeSearch","loadSearchActions","observer","targetNode","targetInnerHtml","config","callback","mutationList","mutation","renderFilters","isMobile","index","FacetTree","Facet","MobileFilters","QuerySummary","FacetBreadcrumbs","Sort","ResultList","resultList","Pagination"],"mappings":"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"}