{"version":3,"file":"static/js/9e5dc885e0f43892941e.bundle.js","mappings":"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","sources":["webpack://mattressfirm/./src/Utilities/get-core-delivery-batch.ts?5a2b","webpack://mattressfirm/./src/Utilities/get-html-parser-value.ts?1fb6","webpack://mattressfirm/./src/Utilities/get-page-path.ts?590a","webpack://mattressfirm/./src/actions/get-mfrm-products-category-paths.action.ts?dc81","webpack://mattressfirm/./src/actions/srp-breadcrumb-page.action.ts?4397","webpack://mattressfirm/./src/data-actions/get-seo-data.action.ts?b8ff","webpack://mattressfirm/./src/data-actions/navigation-menu-state-data-action.ts?8ae5","webpack://mattressfirm/./src/modules/mfrm-search-result-container/actions/get-mapped-search-configuration.ts?52d6","webpack://mattressfirm/./src/Utilities/labeled-dropdown/ui-labeled-dropdown/UiLabeledDropdown.tsx?1565","webpack://mattressfirm/./src/modules/mfrm-search-result-container/components/link.tsx?726c","webpack://mattressfirm/./src/modules/mfrm-search-result-container/components/product-search-result-items.tsx?e550","webpack://mattressfirm/./src/modules/mfrm-search-result-container/components/feature-search-result-item.tsx?8a9d","webpack://mattressfirm/./src/modules/mfrm-search-result-container/components/title.tsx?e620","webpack://mattressfirm/./src/modules/mfrm-search-result-container/components/separator.tsx?f678","webpack://mattressfirm/./src/modules/mfrm-search-result-container/mfrm-search-result-container.data.ts?377f","webpack://mattressfirm/./src/modules/mfrm-search-result-container/components/utilities.ts?e524","webpack://mattressfirm/./src/modules/mfrm-search-result-container/components/range-refine-item.tsx?cf24","webpack://mattressfirm/./src/modules/mfrm-search-result-container/components/refine-item.tsx?931b","webpack://mattressfirm/./src/modules/mfrm-search-result-container/components/choice-summary.tsx?ebc2","webpack://mattressfirm/./src/modules/mfrm-search-result-container/components/modal.tsx?80e1","webpack://mattressfirm/./src/modules/mfrm-search-result-container/components/refine-submenu.tsx?3f0c","webpack://mattressfirm/./src/modules/mfrm-search-result-container/components/error-message.tsx?3838","webpack://mattressfirm/./src/modules/mfrm-search-result-container/mfrm-search-result-container.tsx?7819","webpack://mattressfirm/./src/themes/mattressfirm/custom-components/error-message.tsx?be72","webpack://mattressfirm/./src/themes/mattressfirm/custom-components/product-search-result-items.tsx?a762","webpack://mattressfirm/./src/modules/mfrm-search-result-container/mfrm-search-result-container.view.tsx?61e3","webpack://mattressfirm/./lib/mfrm-search-result-container/module-registration.js?a63b","webpack://mattressfirm/external var \"React\"?0d3b","webpack://mattressfirm/external var \"ReactDOM\"?853b"],"sourcesContent":["import * as Msdyn365 from '@msdyn365-commerce/core';\r\nimport dayjs from 'dayjs';\r\nimport { IMFIATPInventoryEntityPLP, IMFIATPInventoryPLPResponse, IMFICartLine } from '../actions/BatchCoreProductDataServiceEntities.g';\r\nimport fetchCoreDeliveryListAction, { FetchCoreDeliveryListInput } from \"../actions/fetch-core-delivery-list.action\";\r\n\r\nexport interface IMFIATPInventoryEntityPLPEx extends IMFIATPInventoryEntityPLP {\r\n deliveryMessage: string | undefined;\r\n}\r\n\r\nasync function getListOfCoreDeliveryMessage(ctx: Msdyn365.IActionContext, cartLines: IMFICartLine[], zipCode?: string): Promise {\r\n const data: IMFIATPInventoryPLPResponse = await fetchCoreDeliveryListAction(new FetchCoreDeliveryListInput(cartLines, zipCode), ctx);\r\n const updatedResponse: IMFIATPInventoryEntityPLPEx[] | undefined = data?.ATPInventoryPLPData?.map((deliveryItem: IMFIATPInventoryEntityPLP, i: number) => {\r\n let deliveryMessage = '';\r\n if (deliveryItem.Available === 'YES' && deliveryItem.ATPQuantity !== undefined && parseInt(deliveryItem.ATPQuantity, 10) > 0) {\r\n const date = new Date();\r\n const today = dayjs(Date.now()).format('D M YY');\r\n const deliveryDate = dayjs(deliveryItem.SlotDate).format('D M YY');\r\n if (today === deliveryDate) {\r\n deliveryMessage = `Delivery by Today ${dayjs(deliveryItem.SlotDate).format('MMM D')}`;\r\n } else if (deliveryDate === dayjs(date.setDate(date.getDate() + 1)).format('D M YY')) {\r\n deliveryMessage = `Delivery by Tomorrow ${dayjs(deliveryItem.SlotDate).format('MMM D')}`;\r\n } else {\r\n deliveryMessage = `Delivery by ${dayjs(deliveryItem.SlotDate).format('MMM D')}`;\r\n }\r\n } else {\r\n deliveryMessage = ctx.requestContext.app.config.defaultDeliveryMessage ? ctx.requestContext.app.config.defaultDeliveryMessage : '';\r\n }\r\n return { ...deliveryItem, deliveryMessage };\r\n });\r\n return updatedResponse;\r\n}\r\n\r\nexport default getListOfCoreDeliveryMessage;","import ReactHtmlParser from 'react-html-parser';\r\n\r\nconst getHtmlParserValue = (value?: string) => {\r\n let parsedValue = '';\r\n const parsedArr = value && ReactHtmlParser(value);\r\n if (parsedArr && parsedArr?.length > 0) {\r\n parsedValue = parsedArr[0] ? parsedArr[0].toString() : '';\r\n }\r\n return parsedValue;\r\n};\r\n\r\nexport default getHtmlParserValue;","import MsDyn365 from '@msdyn365-commerce/core';\r\n\r\nexport const getPagePath = (): string => {\r\n return MsDyn365.isBrowser\r\n ? window.location.href.split(location.host)[1].includes('?')\r\n ? window.location.href.split(location.host)[1].split('?')[0]\r\n : window.location.href.split(location.host)[1]\r\n : '';\r\n};","import {\r\n CacheType,\r\n createObservableDataAction,\r\n IAction,\r\n IActionContext,\r\n IActionInput,\r\n IAny,\r\n ICommerceApiSettings,\r\n ICreateActionContext,\r\n IGeneric,\r\n IRequestContext\r\n} from '@msdyn365-commerce/core';\r\n// import { ICategoryPath, ICategoryUrl } from '@msdyn365-commerce/core-internal/dist/types/interfaces/ICategoryPathInterfaces';\r\nimport { getCategoryPathsAsync } from '@msdyn365-commerce/retail-proxy/dist/DataActions/ProductsDataActions.g';\r\nimport { CategoryPathLookup, CategoryPathResult } from '@msdyn365-commerce/retail-proxy/dist/Entities/CommerceTypes.g';\r\nimport { hasArray } from '../Utilities/emtpyChecker';\r\n\r\n/**\r\n * Category path input\r\n */\r\nexport class GetCategoryPathsInput implements IActionInput {\r\n public readonly ChannelId: number;\r\n public CatalogId?: number;\r\n public productIds?: number[];\r\n // public readonly categoryPathLooksups: CategoryPathLookup[];\r\n public readonly apiSettings: ICommerceApiSettings;\r\n // @ts-ignore\r\n private constructedCacheKey: string | undefined;\r\n\r\n constructor(context: IRequestContext, catalogId?: number, productIds?: number[]) {\r\n this.ChannelId = context.apiSettings.channelId;\r\n this.CatalogId = catalogId; // context.apiSettings.catalogId || 0;\r\n this.productIds = productIds;\r\n // this.categoryPathLooksups = categoryPathLooksups;\r\n this.apiSettings = context.apiSettings;\r\n this.constructedCacheKey = '';\r\n // categoryPathLooksups.forEach(categoryPath=> {\r\n // this.constructedCacheKey+=`${categoryPath.ProductId && categoryPath.ProductId.toString()}|`;\r\n // });\r\n this.constructedCacheKey = this.productIds?.map(ids => ids).join('-').toString();\r\n this.constructedCacheKey += `${this.ChannelId?.toString()}|`;\r\n this.constructedCacheKey += `${this.CatalogId?.toString()}|`;\r\n }\r\n\r\n public getCacheKey = () => `MFRMProductCategoryPath-${this.constructedCacheKey}`;\r\n public getCacheObjectType = () => 'MFRMProductCategoryPath';\r\n public dataCacheType = (): CacheType => 'application';\r\n}\r\n\r\n/**\r\n * Creates the input required to make the getCategoryPath retail api call\r\n */\r\nexport const createGetCategoryPathsInput = (\r\n inputData: GetCategoryPathsInput,\r\n context: ICreateActionContext>\r\n): IActionInput => {\r\n const productId = inputData.productIds;\r\n if (productId) {\r\n return new GetCategoryPathsInput(context.requestContext, inputData.CatalogId, inputData.productIds);\r\n } else {\r\n throw new Error('Unable to create SelectedVariantInput, no productId found on module config or query');\r\n }\r\n};\r\n\r\n/**\r\n * Calls the Retail API and returns the category path for a product\r\n */\r\nexport async function getProductsCategoryPathsAction(input: GetCategoryPathsInput, ctx: IActionContext): Promise {\r\n const catPaths: CategoryPathLookup[] = [];\r\n if (!hasArray(input.productIds)) {\r\n return [];\r\n }\r\n for (let productsIter = 0; productsIter < input.productIds!.length; productsIter++) {\r\n catPaths.push({ ProductId: input.productIds![productsIter] });\r\n }\r\n try {\r\n return await getCategoryPathsAsync({ callerContext: ctx, queryResultSettings: { Paging: { Top: input.productIds!.length }, Sorting: {} } }, input.ChannelId, input.CatalogId!, catPaths);\r\n } catch (err) {\r\n console.log(err);\r\n return [];\r\n }\r\n}\r\n\r\nexport const getCategoryPathsActionDataAction = createObservableDataAction({\r\n id: 'GetMFRMProductsCategoryPaths',\r\n action: >getProductsCategoryPathsAction,\r\n input: createGetCategoryPathsInput\r\n});\r\n\r\nexport default getCategoryPathsActionDataAction;\r\n","import * as Msdyn365 from '@msdyn365-commerce/core';\r\n\r\nexport interface ISRPBreadcrumbState {\r\n breadcrumbCheck: boolean;\r\n}\r\n\r\n/**\r\n * SrpBreadcrumbPage Input Action\r\n */\r\nexport class SrpBreadcrumbPageInput implements Msdyn365.IActionInput {\r\n // TODO: Construct the input needed to run the action\r\n // TODO: Determine if the results of this get action should cache the results and if so provide\r\n // a cache object type and an appropriate cache key\r\n public getCacheKey = () => `BreadcrumbSrp`;\r\n public getCacheObjectType = () => 'BreadcrumbSrp';\r\n public dataCacheType = (): Msdyn365.CacheType => 'application';\r\n}\r\n\r\n// TODO: Create a data model here or import one to capture the response of the action\r\nexport interface ISrpBreadcrumbPageData {\r\n text: string;\r\n}\r\n\r\n/**\r\n * TODO: Use this function to create the input required to make the action call\r\n */\r\nconst createInput = (args: Msdyn365.ICreateActionContext): Msdyn365.IActionInput => {\r\n return new SrpBreadcrumbPageInput();\r\n};\r\n\r\n/**\r\n * TODO: Use this function to call your action and process the results as needed\r\n */\r\nasync function action(input: SrpBreadcrumbPageInput, ctx: Msdyn365.IActionContext): Promise {\r\n // const apiSettings = Msdyn365.msdyn365Commerce.apiSettings;\r\n\r\n // TODO: Uncomment the below line to get the value from a service\r\n // const response = await Msdyn365.sendRequest('/get/example/id/1', 'get');\r\n return { breadcrumbCheck: false };\r\n}\r\n\r\nexport default Msdyn365.createObservableDataAction({\r\n action: >action,\r\n // TODO: Give your data action a unique id\r\n id: 'SrpBreadcrumbPage',\r\n input: createInput\r\n // TODO: Uncomment the below line if this is a meant to be a batched data action\r\n // isBatched: true\r\n});\r\n","/*---------------------------------------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License. See License.txt in the project root for license information.\r\n *--------------------------------------------------------------------------------------------*/\r\n\r\nimport * as Msdyn365 from '@msdyn365-commerce/core';\r\nimport { filteredURL } from '../Utilities/plp-url-utils';\r\n\r\nexport class GetSeoDataInput extends Msdyn365.CommerceEntityInput implements Msdyn365.IActionInput {\r\n\r\n private seoDataUrl: string = '';\r\n constructor(seoDataUrl: string) {\r\n super({ shouldCacheOutput: true, cacheObjectType: 'SeoDataCache', cacheKey: 'SeoDataCache' });\r\n this.seoDataUrl = seoDataUrl;\r\n }\r\n\r\n public getSeoDataUrl = () => this.seoDataUrl;\r\n public getCacheKey = () => `SeoDataCache`;\r\n public getCacheObjectType = () => 'SeoDataCache';\r\n public dataCacheType = (): Msdyn365.CacheType => 'request';\r\n\r\n}\r\n\r\nconst createInput = (inputData: Msdyn365.ICreateActionContext>): Msdyn365.IActionInput => {\r\n if (inputData.config && inputData.config.seoDataUrl) {\r\n return new GetSeoDataInput(inputData.config.seoDataUrl);\r\n }\r\n return new GetSeoDataInput('');\r\n};\r\n\r\n// tslint:disable: no-any\r\nasync function action(input: GetSeoDataInput, ctx: Msdyn365.IActionContext): Promise {\r\n\r\n const jsonUrlFromGlobals = ctx.requestContext.app.config.seoDataUrl;\r\n // TODO: Just remove the fallback\r\n const jsonUrl = jsonUrlFromGlobals || 'https://files-us-prod.cms.commerce.dynamics.com/cms/api/fknscsckgq/binary/MA5cA7';\r\n const res = await Msdyn365.sendRequest(jsonUrl, 'get');\r\n const filteredUrlPath = filteredURL(ctx.requestContext);\r\n const seoData = filteredUrlPath && res.data && res.data[filteredUrlPath];\r\n return seoData && seoData[0];\r\n}\r\n\r\nexport default Msdyn365.createObservableDataAction({\r\n action: >action,\r\n input: createInput\r\n});\r\n","import {\r\n CacheType,\r\n createObservableDataAction,\r\n IAction,\r\n IActionContext,\r\n IActionInput,\r\n IAny,\r\n ICreateActionContext,\r\n IGeneric\r\n} from '@msdyn365-commerce/core';\r\nimport { INavigationMenuState } from './navigation-menu-state';\r\n\r\n/**\r\n * NavigationMenuState - action input\r\n */\r\nexport class NavMenuStateInput implements IActionInput {\r\n public getCacheKey = () => `NavMenuState`;\r\n public getCacheObjectType = () => 'NavMenuState';\r\n public dataCacheType = (): CacheType => 'application';\r\n}\r\n\r\n/**\r\n * NavMenuStateInput - action\r\n */\r\nexport async function navMenuStateAction(input: NavMenuStateInput, ctx: IActionContext): Promise {\r\n return { isMenuHasParent: false, isMobileMenuCollapsed: true, selectedNavMenu: '', menuItemData: [] };\r\n}\r\n\r\n/**\r\n * NavMenuStateInput - create new input for create action\r\n */\r\nconst createInput = (inputData: ICreateActionContext>): IActionInput => {\r\n return new NavMenuStateInput();\r\n};\r\n\r\n/**\r\n * NavMenuStateInput - create action\r\n */\r\nexport default createObservableDataAction({\r\n action: >navMenuStateAction,\r\n input: createInput\r\n});\r\n","/* tslint:disable: no-duplicate-imports */\r\nimport { buildCacheKey } from '@msdyn365-commerce-modules/retail-actions';\r\nimport { CacheType, createObservableDataAction, IAction, IActionContext, IActionInput, IAny, ICommerceApiSettings, ICreateActionContext, IGeneric } from '@msdyn365-commerce/core';\r\nimport { SortColumn } from '@msdyn365-commerce/retail-proxy';\r\nimport { getSearchConfigurationAsync } from '@msdyn365-commerce/retail-proxy/dist/DataActions/StoreOperationsDataActions.g';\r\nimport { MappedSearchConfiguration } from './MappedSearchConfiguration';\r\n\r\n// TODO: import from commerce entities when available\r\n// tslint:disable-next-line:interface-name\r\ninterface SearchConfiguration {\r\n ProductSortColumns?: SortColumn[];\r\n}\r\n\r\nexport const sortOptions = {\r\n sortByOptionRelevanceDesc: 'Ranking-Desc',\r\n sortByOptionRatingAsc: 'AverageRating-Asc',\r\n sortByOptionRatingDesc: 'AverageRating-Desc',\r\n sortByOptionNameAsc: 'Name-Asc',\r\n sortByOptionNameDesc: 'Name-Desc',\r\n sortByOptionPriceAsc: 'Price-Asc',\r\n sortByOptionPriceDesc: 'Price-Desc'\r\n};\r\n\r\n/**\r\n * ActionInput class for the get-mapped-search-configuration Data Action\r\n */\r\nexport class MappedSearchInput implements IActionInput {\r\n private apiSettings: ICommerceApiSettings;\r\n\r\n constructor(apiSettings: ICommerceApiSettings) {\r\n this.apiSettings = apiSettings;\r\n }\r\n\r\n public getCacheKey = () => buildCacheKey('MappedSearchInput', this.apiSettings);\r\n public getCacheObjectType = () => 'MappedSearchInput';\r\n public dataCacheType = (): CacheType => 'application';\r\n}\r\n\r\n/**\r\n * Get a mapped search configuration that is easy to use for sorting\r\n */\r\nexport async function getMappedSearchConfiguration(input: MappedSearchInput, ctx: IActionContext): Promise {\r\n return getSearchConfigurationAsync({ callerContext: ctx }).then((searchConfiguration: SearchConfiguration) => {\r\n return ((searchConfiguration.ProductSortColumns || []).map((sortColumn: SortColumn) => {\r\n let key = '';\r\n if (sortColumn.ColumnName) {\r\n switch(sortColumn.ColumnName.toUpperCase()) {\r\n case 'NAME':\r\n key = sortColumn.IsDescending ? sortOptions.sortByOptionNameDesc : sortOptions.sortByOptionNameAsc;\r\n break;\r\n case 'PRICE':\r\n key = sortColumn.IsDescending ? sortOptions.sortByOptionPriceDesc : sortOptions.sortByOptionPriceAsc;\r\n break;\r\n case 'AVERAGERATING':\r\n key = sortColumn.IsDescending ? sortOptions.sortByOptionRatingDesc : sortOptions.sortByOptionRatingAsc;\r\n break;\r\n case 'RANKING':\r\n key = sortOptions.sortByOptionRelevanceDesc;\r\n break;\r\n default:\r\n }\r\n } else {\r\n ctx.telemetry.warning('[get-mapped-search-configuration] unknown search option');\r\n }\r\n if (key) {\r\n return {\r\n key,\r\n sortColumn\r\n };\r\n } else {\r\n return undefined;\r\n }\r\n }).filter(Boolean));\r\n });\r\n}\r\n\r\nexport const createInput = (inputData: ICreateActionContext>): IActionInput => {\r\n return new MappedSearchInput(inputData.requestContext.apiSettings);\r\n};\r\n\r\nexport default createObservableDataAction({\r\n id: '@msdyn365-commerce-modules/search-result-container/get-mapped-search-configuration',\r\n action: >getMappedSearchConfiguration,\r\n input: createInput\r\n});","import MsDyn365 from '@msdyn365-commerce/core';\r\nimport classnames from 'classnames';\r\nimport * as React from 'react';\r\nimport { ILabeledDropdownProps } from './UiLabeledDropdown.props';\r\n\r\nexport interface ILabeledDropdownState {\r\n selectedIndex: number;\r\n isShow: boolean;\r\n indexValue: number;\r\n}\r\n\r\n/**\r\n * Labeled Dropdown component\r\n */\r\nexport default class UiLabeledDropdown extends React.Component {\r\n public static defaultProps: Partial = {\r\n toggleColor: 'link'\r\n };\r\n // VSI Customization - START - 24783\r\n private wrapperRef!: HTMLDivElement | null;\r\n // VSI Customization - END - 24783\r\n\r\n constructor(props: ILabeledDropdownProps) {\r\n super(props);\r\n this._onSelectOption = this._onSelectOption.bind(this);\r\n const selectedKey = this.props.selectedOption.key;\r\n const keys = this.props.dropdownOptions.map(option => option.key);\r\n this.state = { selectedIndex: keys.indexOf(selectedKey), isShow: false, indexValue: 0 };\r\n this.selectSorting = this.selectSorting.bind(this);\r\n this.handleDropDown = this.handleDropDown.bind(this);\r\n // VSI Customization - START - 24783\r\n this.setWrapperRef = this.setWrapperRef.bind(this);\r\n this.handleClickOutside = this.handleClickOutside.bind(this);\r\n // VSI Customization - END - 24783\r\n }\r\n public selectSorting = (values: number): void => {\r\n this._onSelectOption(values);\r\n\r\n this.setState({\r\n indexValue: values\r\n });\r\n };\r\n public handleDropDown = (): void => {\r\n this.setState({ isShow: !this.state.isShow });\r\n };\r\n\r\n // VSI Customization - START - 24783\r\n public componentDidMount(): void {\r\n MsDyn365.isBrowser && document.addEventListener('mousedown', this.handleClickOutside);\r\n }\r\n\r\n public componentWillUnmount(): void {\r\n MsDyn365.isBrowser && document.removeEventListener('mousedown', this.handleClickOutside);\r\n }\r\n\r\n public setWrapperRef = (instance: HTMLDivElement | null): void => {\r\n this.wrapperRef = instance;\r\n };\r\n\r\n public handleClickOutside = (event: Event): void => {\r\n if (this.wrapperRef && !this.wrapperRef.contains(event.target as Node | null)) {\r\n if (this.state.isShow) {\r\n this.setState({ isShow: false });\r\n }\r\n }\r\n };\r\n // VSI Customization - END - 24783\r\n public render(): JSX.Element {\r\n const { labelText, labelClassname, dropdownId, dropdownOptions /*dropdownClassname*/ } = this.props;\r\n\r\n const labelClassNames = classnames('msc-l-dropdown__label', labelClassname);\r\n // OOB Available-Currently not using it.\r\n // const dropdownClassNames = classNames('msc-l-dropdown', dropdownClassname);\r\n const selectedIndex = this._getSelectedIndex();\r\n\r\n return (\r\n \r\n \r\n\r\n {this.state.isShow && (\r\n
    \r\n {dropdownOptions.map((option, index) => {\r\n const values = index;\r\n return (\r\n this.selectSorting(values)}\r\n className={classnames(\r\n 'ms-serch-result-sorting__each-list-item',\r\n selectedIndex === index ? 'ms-serch-result-sorting__bold' : ''\r\n )}\r\n >\r\n {option.value}\r\n \r\n );\r\n })}\r\n
    \r\n
\r\n )}\r\n\r\n {/* */}\r\n \r\n );\r\n }\r\n\r\n private _getSelectedIndex(): number {\r\n if (this.props.controlledByParent) {\r\n let selectedIndex = -1;\r\n const selectedKey = this.props.selectedOption.key;\r\n for (let i = 0; i < this.props.dropdownOptions.length; i++) {\r\n if (this.props.dropdownOptions[i].key === selectedKey) {\r\n selectedIndex = i;\r\n break;\r\n }\r\n }\r\n\r\n return selectedIndex;\r\n }\r\n\r\n return this.state.selectedIndex;\r\n }\r\n\r\n private _onSelectOption(values: number): void {\r\n const { dropdownOptions, onSelectOption } = this.props;\r\n const index = values;\r\n const selectedOption = dropdownOptions[index];\r\n this.setState({ selectedIndex: index });\r\n onSelectOption({ selectedOption });\r\n }\r\n}\r\n","/* tslint:disable: no-duplicate-imports */\r\nimport * as React from 'react';\r\ninterface ILink {\r\n className?: string;\r\n text?: string;\r\n href?: string;\r\n ariaLabel?: string;\r\n}\r\n\r\nexport const Link: React.FC = ({ text, className, href, ariaLabel }) => (\r\n \r\n {' '}\r\n {text}{' '}\r\n \r\n);\r\n","/*---------------------------------------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License. See License.txt in the project root for license information.\r\n *--------------------------------------------------------------------------------------------*/\r\n/* tslint:disable: no-duplicate-imports */\r\nimport { ITelemetryContent } from '@msdyn365-commerce-modules/utilities';\r\nimport { ProductComponent } from '@msdyn365-commerce/components';\r\nimport { ICoreContext, IImageSettings } from '@msdyn365-commerce/core';\r\nimport { ProductSearchResult } from '@msdyn365-commerce/retail-proxy';\r\nimport * as React from 'react';\r\nimport { IMfrmSearchResultContainerResources } from '../mfrm-search-result-container.props.autogenerated';\r\n\r\ninterface IProductSearchResultItems {\r\n products: ProductSearchResult[];\r\n context: ICoreContext;\r\n resources: IMfrmSearchResultContainerResources;\r\n imageSettings?: IImageSettings;\r\n moduleType: string;\r\n moduleId: string;\r\n allowBackNavigation?: boolean;\r\n telemetryContent: ITelemetryContent;\r\n}\r\n\r\nexport const ProductSearchResultItems: React.FC = ({\r\n products,\r\n context,\r\n imageSettings,\r\n resources,\r\n moduleType,\r\n moduleId,\r\n allowBackNavigation,\r\n telemetryContent\r\n}) => {\r\n return (\r\n
    \r\n {products.map((product: ProductSearchResult, index: number) => (\r\n
  • \r\n \r\n
  • \r\n ))}\r\n
\r\n );\r\n};\r\n","/*---------------------------------------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License. See License.txt in the project root for license information.\r\n *--------------------------------------------------------------------------------------------*/\r\n/* tslint:disable: no-duplicate-imports */\r\nimport { getFallbackImageUrl, getProductPageUrlSync } from '@msdyn365-commerce-modules/retail-actions';\r\nimport { getPayloadObject, getTelemetryAttributes, ITelemetryContent, onTelemetryClick } from '@msdyn365-commerce-modules/utilities';\r\nimport { ICoreContext, IGridSettings, IImageData, IImageSettings, Image } from '@msdyn365-commerce/core';\r\nimport { SimpleProduct } from '@msdyn365-commerce/retail-proxy';\r\nimport * as React from 'react';\r\nimport { IMfrmSearchResultContainerResources } from '../mfrm-search-result-container.props.autogenerated';\r\n\r\ninterface IFeatureSearchResultItem {\r\n product: SimpleProduct | null;\r\n context: ICoreContext;\r\n resources: IMfrmSearchResultContainerResources;\r\n imageSettings?: IImageSettings;\r\n moduleType: string;\r\n moduleId: string;\r\n telemetryContent?: ITelemetryContent;\r\n}\r\n\r\nexport const FeatureSearchResultItem: React.FC = ({\r\n product,\r\n context,\r\n imageSettings,\r\n resources,\r\n telemetryContent\r\n}) => {\r\n if (product === null) {\r\n return null;\r\n }\r\n\r\n const productName = product.Name;\r\n const productRecordId = product && product.RecordId ? product.RecordId : 0;\r\n const productUrl = getProductPageUrlSync(product.Name || '', productRecordId, context && context.actionContext, undefined);\r\n const fallbackImage = getFallbackImageUrl(product.ItemId, context.actionContext.requestContext.apiSettings);\r\n\r\n // Construct telemetry attribute to render\r\n const payLoad = getPayloadObject('click', telemetryContent!, productName!, productRecordId.toString());\r\n\r\n const attribute = getTelemetryAttributes(telemetryContent!, payLoad);\r\n return (\r\n
\r\n \r\n
\r\n {renderProductPlacementImage(\r\n imageSettings,\r\n context.request.gridSettings,\r\n product.PrimaryImageUrl,\r\n product.Name,\r\n fallbackImage\r\n )}\r\n
\r\n \r\n
\r\n

{resources.featureSimilarLooksTitle}

\r\n {renderProductTitle(product?.Name)}\r\n
\r\n
\r\n );\r\n};\r\n\r\nfunction renderProductPlacementImage(\r\n imageSettings?: IImageSettings,\r\n gridSettings?: IGridSettings,\r\n imageUrl?: string,\r\n altText?: string,\r\n fallbackImage?: string\r\n): JSX.Element | null {\r\n if (!imageUrl || !gridSettings || !imageSettings) {\r\n return null;\r\n }\r\n const img: IImageData = {\r\n src: imageUrl,\r\n altText: altText ? altText : ''\r\n };\r\n const imageProps = {\r\n gridSettings: gridSettings,\r\n imageSettings: imageSettings,\r\n fallBackSrc: fallbackImage\r\n };\r\n return ;\r\n}\r\n\r\nfunction renderProductTitle(title?: string): JSX.Element | null {\r\n return

{title}

;\r\n}\r\n","/* tslint:disable: no-duplicate-imports */\r\nimport * as React from 'react';\r\ninterface ITitle {\r\n className: string;\r\n text: string;\r\n}\r\n\r\nexport const Title: React.FC = ({ text, className }) => {text} ;\r\n","/* tslint:disable: no-duplicate-imports */\r\nimport * as React from 'react';\r\ninterface ISeparator {\r\n separator: string;\r\n}\r\n\r\nexport const Separator: React.FC = ({ separator }) => {separator} ;\r\n","/* tslint:disable: no-duplicate-imports */\r\nimport { CategoryHierarchy, IProductRefinerHierarchy } from '@msdyn365-commerce/commerce-entities';\r\nimport { AsyncResult, SimpleProduct } from '@msdyn365-commerce/retail-proxy';\r\nimport { ISRPBreadcrumbState } from '../../actions/srp-breadcrumb-page.action';\r\nimport { INavigationMenuState } from '../../data-actions/navigation-menu-state';\r\nimport { IFullProductsSearchResultsWithCount, MappedSearchConfiguration } from './actions';\r\nimport { ListPageState } from './list-page-state';\r\n\r\n/*---------------------------------------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License. See License.txt in the project root for license information.\r\n *--------------------------------------------------------------------------------------------*/\r\n\r\nexport interface IMfrmSearchResultContainerData {\r\n products: AsyncResult;\r\n category: AsyncResult;\r\n listPageState: AsyncResult;\r\n categoryHierarchy: AsyncResult;\r\n searchConfiguration: AsyncResult;\r\n refiners: AsyncResult;\r\n featureProduct: AsyncResult;\r\n navMenuState: AsyncResult;\r\n updateBreadcrumbOnSrp: AsyncResult;\r\n seoData: any;\r\n}\r\n\r\n/**\r\n * DisplayTemplate enum type.\r\n */\r\nexport const enum DisplayTemplate {\r\n /**\r\n * The List member.\r\n */\r\n List = 0,\r\n /**\r\n * The Slider member.\r\n */\r\n Slider = 1,\r\n /**\r\n * The SliderWithBars member.\r\n */\r\n SliderWithBars = 2,\r\n /**\r\n * The Range member.\r\n */\r\n Range = 3,\r\n /**\r\n * The TextBox member.\r\n */\r\n TextBox = 4\r\n}\r\n\r\n/**\r\n * AttributeDataType enum type.\r\n */\r\nexport const enum AttributeDataType {\r\n /**\r\n * The None member.\r\n */\r\n None = 0,\r\n /**\r\n * The Currency member.\r\n */\r\n Currency = 1,\r\n /**\r\n * The DateTime member.\r\n */\r\n DateTime = 2,\r\n /**\r\n * The Decimal member.\r\n */\r\n Decimal = 3,\r\n /**\r\n * The Integer member.\r\n */\r\n Integer = 4,\r\n /**\r\n * The Text member.\r\n */\r\n Text = 5,\r\n /**\r\n * The TrueFalse member.\r\n */\r\n TrueFalse = 6,\r\n /**\r\n * The Video member.\r\n */\r\n Video = 40,\r\n /**\r\n * The Image member.\r\n */\r\n Image = 41\r\n}","/* tslint:disable: no-duplicate-imports */\r\nimport { ITelemetry } from '@msdyn365-commerce/core';\r\nimport { ProductRefinerValue, RefinerType } from '@msdyn365-commerce/retail-proxy';\r\nimport { AttributeDataType } from '../mfrm-search-result-container.data';\r\nimport { IRefineItemToggleNotification } from './refine-item-toggle-notification';\r\n/**\r\n * Types of product refiner values\r\n * @deprecated This will be removed soon. Please, use `AttributeDataType` from `@msdyn365-commerce/retail-proxy` instead.\r\n * @example\r\n * ```\r\n * import { AttributeDataType } from `@msdyn365-commerce/retail-proxy`;\r\n * ```\r\n */\r\nexport const enum ProductRefinerValueDataTypeValue {\r\n /**\r\n * Range slider is used for selections like price\r\n * @deprecated This will be removed soon. Please, use `AttributeDataType` from `@msdyn365-commerce/retail-proxy` instead.\r\n * @example\r\n * ```\r\n * import { AttributeDataType } from `@msdyn365-commerce/retail-proxy`;\r\n * ```\r\n */\r\n Range = 1,\r\n\r\n /**\r\n * Range input is a different way to specify ranges and can be expressed with input boxes\r\n * as well as a set of discrete single-select type values\r\n * @deprecated This will be removed soon. Please, use `AttributeDataType` from `@msdyn365-commerce/retail-proxy` instead.\r\n * @example\r\n * ```\r\n * import { AttributeDataType } from `@msdyn365-commerce/retail-proxy`;\r\n * ```\r\n */\r\n RangeInput = 4,\r\n\r\n /**\r\n * This is a discrete list item, either multi-select or single-select\r\n * @deprecated This will be removed soon. Please, use `AttributeDataType` from `@msdyn365-commerce/retail-proxy` instead.\r\n * @example\r\n * ```\r\n * import { AttributeDataType } from `@msdyn365-commerce/retail-proxy`;\r\n * ```\r\n */\r\n List = 5,\r\n\r\n /**\r\n * Boolean types allows only single-select\r\n * @deprecated This will be removed soon. Please, use `AttributeDataType` from `@msdyn365-commerce/retail-proxy` instead.\r\n * @example\r\n * ```\r\n * import { AttributeDataType } from `@msdyn365-commerce/retail-proxy`;\r\n * ```\r\n */\r\n Boolean = 6\r\n}\r\n\r\n/**\r\n * Types of product refiners\r\n * @deprecated This will be removed soon. Please, use `RefinerType` from `@msdyn365-commerce/retail-proxy` instead.\r\n * @example\r\n * ```\r\n * import { RefinerType } from `@msdyn365-commerce/retail-proxy`;\r\n * ```\r\n */\r\nexport const enum ProductRefinerTypeValue {\r\n /**\r\n * Refiner values are single-select\r\n * @deprecated This will be removed soon. Please, use `RefinerType` from `@msdyn365-commerce/retail-proxy` instead.\r\n * @example\r\n * ```\r\n * import { RefinerType } from `@msdyn365-commerce/retail-proxy`;\r\n * ```\r\n */\r\n Single = 0,\r\n\r\n /**\r\n * Refiner values are multi-select\r\n * @deprecated This will be removed soon. Please, use `RefinerType` from `@msdyn365-commerce/retail-proxy` instead.\r\n * @example\r\n * ```\r\n * import { RefinerType } from `@msdyn365-commerce/retail-proxy`;\r\n * ```\r\n */\r\n Multi = 1\r\n}\r\n\r\n/**\r\n * ProductRefinerSource enum type.\r\n * @deprecated This will be removed soon. Please, use `ProductRefinerSource` from `@msdyn365-commerce/retail-proxy` instead.\r\n * @example\r\n * ```\r\n * import { ProductRefinerSource } from `@msdyn365-commerce/retail-proxy`;\r\n * ```\r\n */\r\nexport const enum ProductRefinerSource {\r\n /**\r\n * The None member.\r\n * @deprecated This will be removed soon. Please, use `ProductRefinerSource` from `@msdyn365-commerce/retail-proxy` instead.\r\n * @example\r\n * ```\r\n * import { ProductRefinerSource } from `@msdyn365-commerce/retail-proxy`;\r\n * ```\r\n */\r\n None = 0,\r\n /**\r\n * The Attribute member.\r\n * @deprecated This will be removed soon. Please, use `ProductRefinerSource` from `@msdyn365-commerce/retail-proxy` instead.\r\n * @example\r\n * ```\r\n * import { ProductRefinerSource } from `@msdyn365-commerce/retail-proxy`;\r\n * ```\r\n */\r\n Attribute = 1,\r\n /**\r\n * The Category member.\r\n * @deprecated This will be removed soon. Please, use `ProductRefinerSource` from `@msdyn365-commerce/retail-proxy` instead.\r\n * @example\r\n * ```\r\n * import { ProductRefinerSource } from `@msdyn365-commerce/retail-proxy`;\r\n * ```\r\n */\r\n Category = 2,\r\n /**\r\n * The Price member.\r\n * @deprecated This will be removed soon. Please, use `ProductRefinerSource` from `@msdyn365-commerce/retail-proxy` instead.\r\n * @example\r\n * ```\r\n * import { ProductRefinerSource } from `@msdyn365-commerce/retail-proxy`;\r\n * ```\r\n */\r\n Price = 3,\r\n /**\r\n * The Rating member.\r\n * @deprecated This will be removed soon. Please, use `ProductRefinerSource` from `@msdyn365-commerce/retail-proxy` instead.\r\n * @example\r\n * ```\r\n * import { ProductRefinerSource } from `@msdyn365-commerce/retail-proxy`;\r\n * ```\r\n */\r\n Rating = 4\r\n}\r\n\r\n/**\r\n * Checks if the data type value corresponds to a slider.\r\n */\r\nexport function isRangeType(dataTypeValue: number | undefined): boolean {\r\n return dataTypeValue === AttributeDataType?.Currency ||\r\n dataTypeValue === AttributeDataType?.Decimal ||\r\n dataTypeValue === AttributeDataType?.Integer;\r\n}\r\n\r\n/**\r\n * Find the refinement criterion associated with this product refiner value\r\n * @param productRefinerValue product refiner value to match\r\n * @param refinementCriteria selected refinement criteria\r\n */\r\nexport function findMatchingRefinementCriterion(\r\n productRefinerValue: ProductRefinerValue,\r\n refinementCriteria: ProductRefinerValue[]\r\n): ProductRefinerValue | undefined {\r\n // if the value is a range, then match only on data type value; otherwise match on item string\r\n return refinementCriteria.find(\r\n (refinementCriterion: ProductRefinerValue) => isMatchingRefinementCriterion(productRefinerValue, refinementCriterion)\r\n );\r\n}\r\n\r\n/**\r\n * Find the refinement criterion associated with this product refiner value\r\n * @param productRefinerValue product refiner value to match\r\n * @param refinementCriteria selected refinement criteria\r\n */\r\nexport function isMatchingRefinementCriterion(\r\n productRefinerValue: ProductRefinerValue,\r\n refinementCriterion: ProductRefinerValue\r\n): boolean {\r\n // if the value is a range, then match only on data type value; otherwise match on item string\r\n return refinementCriterion.RefinerRecordId === productRefinerValue.RefinerRecordId &&\r\n refinementCriterion.RefinerSourceValue === productRefinerValue.RefinerSourceValue &&\r\n refinementCriterion.DataTypeValue === productRefinerValue.DataTypeValue &&\r\n (isRangeType(refinementCriterion.DataTypeValue) || refinementCriterion.LeftValueBoundString === productRefinerValue.LeftValueBoundString);\r\n}\r\n\r\nexport function getUpdatedRefinementCriteria(\r\n itemToggleNotification: IRefineItemToggleNotification,\r\n currentRefinementCriteria: ProductRefinerValue[]): ProductRefinerValue[] {\r\n const updatedRefinementCriteria: ProductRefinerValue[] = [];\r\n let toggledItemFound = false;\r\n currentRefinementCriteria.forEach((selectedCriterion: ProductRefinerValue) => {\r\n if (isMatchingRefinementCriterion(itemToggleNotification.productRefinerValue, selectedCriterion)) {\r\n toggledItemFound = true;\r\n if (itemToggleNotification.isSelecting) {\r\n const next = {\r\n ...selectedCriterion,\r\n LeftValueBoundString: itemToggleNotification.rangeStart !== undefined && `${itemToggleNotification.rangeStart}` || selectedCriterion.LeftValueBoundString,\r\n RightValueBoundString: itemToggleNotification.rangeEnd !== undefined && `${itemToggleNotification.rangeEnd}` || selectedCriterion.RightValueBoundString\r\n };\r\n updatedRefinementCriteria.push(next);\r\n\r\n } // else the item is being de-selected, so omit it from the refinement criteria\r\n } else {\r\n // keep existing criterion because it is not in the item toggle notification\r\n updatedRefinementCriteria.push(selectedCriterion);\r\n }\r\n });\r\n\r\n if (!toggledItemFound) {\r\n const next = {\r\n ...itemToggleNotification.productRefinerValue,\r\n LeftValueBoundString: itemToggleNotification.rangeStart !== undefined && `${itemToggleNotification.rangeStart}` || itemToggleNotification.productRefinerValue.LeftValueBoundString,\r\n RightValueBoundString: itemToggleNotification.rangeEnd !== undefined && `${itemToggleNotification.rangeEnd}` || itemToggleNotification.productRefinerValue.RightValueBoundString\r\n };\r\n updatedRefinementCriteria.push(next);\r\n\r\n // If single select, then deselect any others in the parent refiner group\r\n if ((itemToggleNotification.productRefinerValue.DataTypeValue === AttributeDataType?.Text || itemToggleNotification.productRefinerValue.DataTypeValue === AttributeDataType?.TrueFalse) &&\r\n itemToggleNotification.parentProductRefinerHierarchy.RefinerTypeValue === RefinerType?.SingleSelect) {\r\n itemToggleNotification.parentProductRefinerHierarchy.Values.forEach((child: ProductRefinerValue) => {\r\n if (child.RefinerRecordId === next.RefinerRecordId && child.LeftValueBoundString === next.LeftValueBoundString) {\r\n // do nothing\r\n } else {\r\n const matchingIndex = updatedRefinementCriteria.findIndex((criterion: ProductRefinerValue) => isMatchingRefinementCriterion(child, criterion));\r\n if (matchingIndex > -1) {\r\n updatedRefinementCriteria.splice(matchingIndex, 1);\r\n }\r\n }\r\n });\r\n }\r\n }\r\n\r\n return updatedRefinementCriteria;\r\n}\r\n\r\nexport function formatPrice(\r\n amount: string | undefined,\r\n currency: string | undefined,\r\n locale: string | undefined,\r\n telemetry: ITelemetry): string {\r\n if (!amount || !currency) {\r\n telemetry.trace(`[refine-menu.utilities.formatPrice] could not format price for ${amount} ${currency}`);\r\n return amount || '';\r\n }\r\n const priceAmount = (amount && Number(amount)) || 0;\r\n let result: string;\r\n\r\n try {\r\n result = new Intl.NumberFormat(locale, {\r\n style: 'currency',\r\n currencyDisplay: 'symbol',\r\n currency: currency,\r\n minimumFractionDigits: 0\r\n }).format(priceAmount);\r\n } catch (e) {\r\n result = `${priceAmount} ${currency}`;\r\n telemetry.warning(`[refine-menu.utilities.formatPrice] Failed to format price for ${result}: ${e}`);\r\n }\r\n\r\n return result;\r\n}","/* tslint:disable: no-duplicate-imports */\r\nimport { Slider } from '@msdyn365-commerce-modules/utilities';\r\nimport debounce from 'lodash/debounce';\r\nimport { computed } from 'mobx';\r\nimport { observer } from 'mobx-react';\r\nimport * as React from 'react';\r\nimport { formatPrice } from './utilities';\r\n\r\ntype InputType = 'Min' | 'Max';\r\n\r\nimport MsDyn365 from '@msdyn365-commerce/core';\r\nimport { IRefineItemProps, IRefineItemState } from './refine-item';\r\n\r\nexport type RangeRefineItemType = 'slider' | 'input';\r\n\r\n/**\r\n * Range refine item properties\r\n */\r\nexport interface IRangeRefineItemProps extends IRefineItemProps {\r\n rangeType: RangeRefineItemType;\r\n minValueSliderThumbAriaLabel?: string;\r\n maxValueSliderThumbAriaLabel?: string;\r\n isPriceRefinerDisabled: boolean;\r\n isCategoryPage: boolean;\r\n}\r\n\r\n/**\r\n * Range refine item state\r\n */\r\nexport interface IRangeRefineItemState extends IRefineItemState {\r\n validationErrorMin: string | undefined;\r\n validationErrorMax: string | undefined;\r\n selectedMin: string | undefined;\r\n selectedMax: string | undefined;\r\n touchedMin: boolean;\r\n touchedMax: boolean;\r\n}\r\n\r\n/**\r\n * RangeRefineItem component (controlled by RefineSubmenu)\r\n */\r\n@observer\r\nexport default class RangeRefineItem extends React.Component {\r\n private _formattedPriceReverseLookup: Map = new Map();\r\n\r\n private minInput: React.RefObject;\r\n private maxInput: React.RefObject;\r\n\r\n @computed get currencyCode(): string {\r\n return this.props.productRefinerValue.UnitText || '';\r\n }\r\n\r\n constructor(props: IRangeRefineItemProps) {\r\n super(props);\r\n this._onRangeUpdate = this._onRangeUpdate.bind(this);\r\n this._onRangeUpdateEnd = this._onRangeUpdateEnd.bind(this);\r\n this._handleRangeTooltipText = this._handleRangeTooltipText.bind(this);\r\n this._changeMin = this._changeMin.bind(this);\r\n this._changeMax = this._changeMax.bind(this);\r\n this._finishChangeMin = this._finishChangeMin.bind(this);\r\n this._finishChangeMax = this._finishChangeMax.bind(this);\r\n\r\n this.minInput = React.createRef();\r\n this.maxInput = React.createRef();\r\n\r\n const { selectedRefinementCriterion } = this.props;\r\n const initialMin = (selectedRefinementCriterion && selectedRefinementCriterion.LeftValueBoundString) || '0';\r\n const initialMax = (selectedRefinementCriterion && selectedRefinementCriterion.RightValueBoundString) || undefined;\r\n this.state = {\r\n isChecked: false,\r\n validationErrorMin: undefined,\r\n validationErrorMax: undefined,\r\n selectedMin: initialMin,\r\n selectedMax: initialMax,\r\n touchedMin: false,\r\n touchedMax: false\r\n };\r\n }\r\n\r\n public render(): JSX.Element | undefined {\r\n const {\r\n productRefinerValue,\r\n parentProductRefinerHierarchy,\r\n refineItemCommonProps,\r\n isCategoryPage,\r\n isPriceRefinerDisabled\r\n } = this.props;\r\n if (!productRefinerValue || !parentProductRefinerHierarchy) {\r\n refineItemCommonProps.telemetry.warning(\r\n 'Cannot render refine value range without productRefinerValue and parentProductRefinerHierarchy'\r\n );\r\n return undefined;\r\n }\r\n const isDisableSlider: boolean = isCategoryPage && isPriceRefinerDisabled;\r\n if (this.props.rangeType === 'input') {\r\n return this._renderInputFields(isDisableSlider);\r\n }\r\n\r\n return this._renderSlider(isDisableSlider);\r\n }\r\n\r\n private _initializeMaxValue(formattedSelectedMax: string | undefined): string | undefined {\r\n const { productRefinerValue } = this.props;\r\n const { touchedMax, validationErrorMax } = this.state;\r\n\r\n const max = this._getFormattedSelectedValue(productRefinerValue.RightValueBoundString, touchedMax, validationErrorMax);\r\n if (formattedSelectedMax) {\r\n return formattedSelectedMax;\r\n }\r\n\r\n if (!formattedSelectedMax && !touchedMax) {\r\n return max;\r\n }\r\n\r\n return '';\r\n }\r\n\r\n private _renderInputFields(isDisableSlider: boolean): JSX.Element | undefined {\r\n const { isDisabled, parentProductRefinerHierarchy, refineItemCommonProps, productRefinerValue } = this.props;\r\n const { selectedMin, selectedMax, touchedMin, touchedMax, validationErrorMin, validationErrorMax } = this.state;\r\n\r\n const rangeAriaLabel = (refineItemCommonProps.rangeNameFormat || '{0}').replace('{0}', parentProductRefinerHierarchy.KeyName || '');\r\n const formAttrs = {\r\n 'aria-label': rangeAriaLabel,\r\n 'aria-disabled': isDisabled\r\n };\r\n\r\n // To enable price formatting of selected fields, this is the approach:\r\n // initial value: min=0 formatted as price, max=undefined\r\n // onFocus/onChange: convert to number (unformat) and mark as touched to indicate value is being edited\r\n // onBlur: validate and format entered value as price\r\n const minInputClassName = `ms-refine-submenu__input-range refine-submenu__input-range-min ${\r\n validationErrorMin ? 'refine-submenu__input-range--error' : ''\r\n }`;\r\n const maxInputClassName = `ms-refine-submenu__input-range refine-submenu__input-range-max ${\r\n validationErrorMax ? 'refine-submenu__input-range--error' : ''\r\n }`;\r\n const minLabelClassName = 'ms-refine-submenu__input-range-label refine-submenu__input-range-label-min';\r\n const maxLabelClassName = 'ms-refine-submenu__input-range-label refine-submenu__input-range-label-max';\r\n const formattedSelectedMin = this._getFormattedSelectedValue(selectedMin, touchedMin, validationErrorMin);\r\n const formattedSelectedMax = this._getFormattedSelectedValue(selectedMax, touchedMax, validationErrorMax);\r\n return (\r\n <>\r\n
\r\n
\r\n \r\n \r\n
\r\n
\r\n \r\n \r\n
\r\n
\r\n {validationErrorMin && (\r\n \r\n {validationErrorMin}\r\n \r\n )}\r\n {validationErrorMax && validationErrorMin !== validationErrorMax && (\r\n \r\n {validationErrorMax}\r\n \r\n )}\r\n \r\n );\r\n }\r\n\r\n private _renderSlider(isDisableSlider: boolean): JSX.Element | undefined {\r\n const { isDisabled, productRefinerValue, parentProductRefinerHierarchy, selectedRefinementCriterion } = this.props;\r\n const min = productRefinerValue.LeftValueBoundString;\r\n const max = productRefinerValue.RightValueBoundString;\r\n const selectedMin =\r\n (selectedRefinementCriterion && selectedRefinementCriterion.LeftValueBoundString) ||\r\n productRefinerValue.LeftValueBoundString ||\r\n '0';\r\n const selectedMax =\r\n (selectedRefinementCriterion && selectedRefinementCriterion.RightValueBoundString) ||\r\n productRefinerValue.RightValueBoundString ||\r\n max;\r\n const sliderId = `slider_${parentProductRefinerHierarchy.RecordId}_${productRefinerValue.RefinerRecordId}`;\r\n const ariaAttributes = {\r\n 'aria-disabled': isDisabled\r\n };\r\n const minPrice = this._formatPrice(min);\r\n const maxPrice = this._formatPrice(max);\r\n const selectedMinPrice = this._formatPrice(selectedMin);\r\n const selectedMaxPrice = this._formatPrice(selectedMax);\r\n return (\r\n \r\n );\r\n }\r\n\r\n private _changeMin(event: React.FocusEvent): void {\r\n this._changeValue(event, 'Min');\r\n }\r\n\r\n private _changeMax(event: React.FocusEvent): void {\r\n this._changeValue(event, 'Max');\r\n }\r\n\r\n private _changeValue(event: React.FocusEvent, inputType: InputType): void {\r\n const selectedKey = `selected${inputType}`;\r\n const touchedKey = `touched${inputType}`;\r\n this.setState({\r\n [selectedKey]: this._getInputWithoutFormatting(event.currentTarget.value),\r\n [touchedKey]: true\r\n });\r\n }\r\n\r\n private _finishChangeMin(event: React.FocusEvent): boolean {\r\n const selectedMinValue = this._getInputWithoutFormatting(event.currentTarget.value);\r\n const selectedMinValueRounded = Math.floor(parseInt(selectedMinValue, 10));\r\n // handles if there's non-number characters being rounded and displaying as NaN\r\n const selectedMin = isNaN(selectedMinValueRounded) ? selectedMinValue : selectedMinValueRounded;\r\n\r\n this.setState({\r\n selectedMin: selectedMin.toString(),\r\n minTouched: false\r\n });\r\n const minInput = Number(selectedMin);\r\n const {\r\n onToggle,\r\n parentProductRefinerHierarchy,\r\n productRefinerValue,\r\n refineItemCommonProps,\r\n selectedRefinementCriterion\r\n } = this.props;\r\n const max = (selectedRefinementCriterion && selectedRefinementCriterion.RightValueBoundString) || undefined;\r\n\r\n const maxNum = max ? Number(max) : undefined;\r\n\r\n if (isNaN(minInput)) {\r\n this.setState({ validationErrorMin: refineItemCommonProps.validationErrorNaN });\r\n this._focus('Min');\r\n return false;\r\n }\r\n\r\n if (this._validateRange(minInput, maxNum)) {\r\n onToggle({\r\n parentProductRefinerHierarchy: parentProductRefinerHierarchy,\r\n productRefinerValue: productRefinerValue,\r\n isSelecting: true,\r\n rangeStart: minInput,\r\n rangeEnd: maxNum\r\n });\r\n return true;\r\n } else {\r\n this._focus('Min');\r\n }\r\n\r\n return false;\r\n }\r\n\r\n private _finishChangeMax(event: React.FocusEvent): boolean {\r\n const selectedMaxValue = this._getInputWithoutFormatting(event.currentTarget.value);\r\n const selectedMaxValueRounded = Math.floor(parseInt(selectedMaxValue, 10));\r\n // handles if there's non-number characters being rounded and displaying as NaN\r\n const selectedMax = isNaN(selectedMaxValueRounded) ? selectedMaxValue : selectedMaxValueRounded;\r\n\r\n this.setState({\r\n selectedMax: selectedMax.toString(),\r\n maxTouched: false\r\n });\r\n const maxInput = Number(selectedMax);\r\n const {\r\n onToggle,\r\n parentProductRefinerHierarchy,\r\n productRefinerValue,\r\n refineItemCommonProps,\r\n selectedRefinementCriterion\r\n } = this.props;\r\n const min = (selectedRefinementCriterion && selectedRefinementCriterion.LeftValueBoundString) || '0';\r\n\r\n const minNum = Number(min);\r\n\r\n if (isNaN(maxInput)) {\r\n this.setState({ validationErrorMax: refineItemCommonProps.validationErrorNaN });\r\n this._focus('Max');\r\n return false;\r\n }\r\n\r\n if (this._validateRange(minNum, maxInput)) {\r\n if (productRefinerValue) {\r\n onToggle({\r\n parentProductRefinerHierarchy: parentProductRefinerHierarchy,\r\n productRefinerValue: productRefinerValue,\r\n isSelecting: true,\r\n rangeStart: minNum,\r\n rangeEnd: maxInput\r\n });\r\n } else {\r\n this._focus('Max');\r\n }\r\n return true;\r\n }\r\n\r\n return false;\r\n }\r\n\r\n private _focus(inputType: InputType): void {\r\n const ref = inputType === 'Max' ? this.maxInput : this.minInput;\r\n\r\n MsDyn365.isBrowser &&\r\n setTimeout(() => {\r\n if (ref && ref.current) {\r\n ref.current.focus();\r\n }\r\n }, 50);\r\n }\r\n\r\n private _getFormattedSelectedValue(\r\n selected: string | undefined,\r\n touched: boolean,\r\n validationError: string | undefined\r\n ): string | undefined {\r\n if (touched || validationError || selected === undefined) {\r\n return selected;\r\n }\r\n return this._formatPrice(selected);\r\n }\r\n\r\n private _validateRange(min: number, max: number | undefined): boolean {\r\n const { refineItemCommonProps } = this.props;\r\n if (max === undefined) {\r\n return true;\r\n }\r\n\r\n if (min > max) {\r\n this.setState({\r\n validationErrorMin: refineItemCommonProps.validationErrorRange,\r\n validationErrorMax: refineItemCommonProps.validationErrorRange\r\n });\r\n return false;\r\n }\r\n\r\n return true;\r\n }\r\n\r\n private _formatPrice(amount: string | undefined): string {\r\n const locale = this.props.refineItemCommonProps.locale;\r\n const result = formatPrice(amount, this.currencyCode, locale, this.props.refineItemCommonProps.telemetry);\r\n\r\n if (amount !== undefined && !this._formattedPriceReverseLookup.has(result)) {\r\n this._formattedPriceReverseLookup.set(result, amount);\r\n }\r\n\r\n return result;\r\n }\r\n\r\n private _getInputWithoutFormatting(input: string): string {\r\n // First try to cast raw input to a number\r\n const inputAsNum = Number(input);\r\n if (!isNaN(inputAsNum)) {\r\n return input;\r\n }\r\n\r\n // Otherwise try a reverse lookup and fall back to the raw input if all else fails\r\n const reverseLookupResult = this._formattedPriceReverseLookup.get(input);\r\n return reverseLookupResult || input;\r\n }\r\n\r\n // NOTE: Fix types once Shared Components build pipeline bug fixed\r\n // tslint:disable-next-line:no-any\r\n private _onRangeUpdate(sliderChangeNotification: any): void {\r\n // Need to filter out mousemove events as these cause errors after the menu updates and slider re-renders\r\n if (sliderChangeNotification.eventType !== 'mousemove') {\r\n const { onToggle, parentProductRefinerHierarchy, productRefinerValue } = this.props;\r\n if (productRefinerValue && sliderChangeNotification) {\r\n onToggle({\r\n parentProductRefinerHierarchy: parentProductRefinerHierarchy,\r\n productRefinerValue: productRefinerValue,\r\n isSelecting: true,\r\n rangeStart: sliderChangeNotification.firstThumbValue,\r\n rangeEnd: sliderChangeNotification.secondThumbValue\r\n });\r\n\r\n this._focusOnSliderThumb(sliderChangeNotification);\r\n }\r\n }\r\n }\r\n\r\n // tslint:disable-next-line\r\n private _onRangeUpdateEnd(sliderChangeNotification: any): void {\r\n const { onToggle, parentProductRefinerHierarchy, productRefinerValue } = this.props;\r\n if (productRefinerValue && sliderChangeNotification) {\r\n onToggle({\r\n parentProductRefinerHierarchy: parentProductRefinerHierarchy,\r\n productRefinerValue: productRefinerValue,\r\n isSelecting: true,\r\n rangeStart: sliderChangeNotification.firstThumbValue,\r\n rangeEnd: sliderChangeNotification.secondThumbValue\r\n });\r\n\r\n this._focusOnSliderThumb(sliderChangeNotification);\r\n }\r\n }\r\n\r\n // tslint:disable-next-line\r\n private _focusOnSliderThumb(sliderChangeNotification: any): void {\r\n if (MsDyn365.isBrowser && sliderChangeNotification.id) {\r\n const element = document.getElementById(`${sliderChangeNotification.id}range`);\r\n if (!!element) {\r\n setTimeout(() => {\r\n element.focus();\r\n }, 0);\r\n }\r\n }\r\n }\r\n\r\n private _handleRangeTooltipText(tooltip: number): string {\r\n return this._formatPrice(`${tooltip}`);\r\n }\r\n}\r\n","/* tslint:disable: no-duplicate-imports */\r\nimport { format,getPayloadObject, getTelemetryAttributes, IPayLoad, ITelemetryContent } from '@msdyn365-commerce-modules/utilities';\r\nimport { IProductRefinerHierarchy } from '@msdyn365-commerce/commerce-entities';\r\nimport { RatingComponent } from '@msdyn365-commerce/components';\r\nimport MsDyn365, { IAny, ICoreContext, IGeneric } from '@msdyn365-commerce/core';\r\nimport { ProductRefinerSource, ProductRefinerValue, RefinerType } from '@msdyn365-commerce/retail-proxy';\r\nimport * as React from 'react';\r\nimport { getVirtualRefinerNames, IVirtualRefinersConfig, regExSpecialChars } from '../../../Utilities/plp-url-utils';\r\nimport { IRefineItemURLParts } from '../mfrm-search-result-container';\r\nimport { IRefineItemToggleNotification } from './refine-item-toggle-notification';\r\nimport { IRefineItemCommonProps } from './refine-item.props.common';\r\n\r\n/**\r\n * RefineItem properties\r\n */\r\nexport interface IRefineItemProps {\r\n parentProductRefinerHierarchy: IProductRefinerHierarchy;\r\n productRefinerValue: ProductRefinerValue;\r\n selectedRefinementCriterion: ProductRefinerValue | undefined;\r\n selectedRefinerValues?: ProductRefinerValue[];\r\n refineItemCommonProps: IRefineItemCommonProps;\r\n isDisabled: boolean;\r\n context: ICoreContext>;\r\n moduleId: string;\r\n moduleTypeName: string;\r\n index?: number;\r\n /** The telemetry content */\r\n telemetryContent?: ITelemetryContent;\r\n isMattressesCategory: boolean | undefined;\r\n urlRefinerParts: string[];\r\n urlParts: IRefineItemURLParts;\r\n sortedConfigValues?: IVirtualRefinersConfig[] | undefined;\r\n filteredRefiners?: IProductRefinerHierarchy[] | undefined;\r\n onToggle(notfication: Readonly): void;\r\n urlBuilder(refiner: IRefineItemToggleNotification): string;\r\n singleProductCountAriaLabel?: string;\r\n refineItemAriaLabel?: string;\r\n refineItemsAriaLabel?: string;\r\n isMobileView?: boolean;\r\n}\r\n\r\n/**\r\n * Refine item state\r\n */\r\nexport interface IRefineItemState extends React.ComponentState {\r\n isChecked: boolean;\r\n renderingError?: object;\r\n}\r\n\r\n/**\r\n * Single-select and multi-select refine item component (controlled by RefineSubmenu)\r\n */\r\nexport default class RefineItem extends React.Component {\r\n private anchorType: React.RefObject;\r\n private payLoad: IPayLoad;\r\n\r\n constructor(props: IRefineItemProps) {\r\n super(props);\r\n this._onClick = this._onClick.bind(this);\r\n this.state = {\r\n isChecked: !!this.props.selectedRefinementCriterion\r\n };\r\n this.anchorType = React.createRef();\r\n this.payLoad = getPayloadObject('click', this.props.telemetryContent!, '');\r\n }\r\n\r\n // tslint:disable-next-line:max-func-body-length\r\n public render(): JSX.Element | undefined {\r\n const {\r\n isDisabled,\r\n refineItemCommonProps,\r\n parentProductRefinerHierarchy,\r\n productRefinerValue,\r\n selectedRefinementCriterion,\r\n singleProductCountAriaLabel,\r\n refineItemAriaLabel,\r\n refineItemsAriaLabel,\r\n index,\r\n children,\r\n onToggle,\r\n context,\r\n telemetryContent,\r\n ...attrs\r\n } = this.props;\r\n if (!productRefinerValue) {\r\n refineItemCommonProps.telemetry.warning('[refine-item] Cannot render refineItem without productRefinerValue');\r\n return undefined;\r\n }\r\n if (!productRefinerValue.LeftValueBoundString) {\r\n refineItemCommonProps.telemetry.warning(\r\n `[refine-item] RefineItem without LeftValueBoundString: ${JSON.stringify(productRefinerValue)}`\r\n );\r\n }\r\n const isSingleSelect = parentProductRefinerHierarchy.RefinerTypeValue === RefinerType?.SingleSelect;\r\n let itemTypeClassName = isSingleSelect ? 'single-select' : 'multi-select';\r\n itemTypeClassName = `ms-refine-submenu-item ${itemTypeClassName}`;\r\n const inputType = isSingleSelect ? 'radio' : 'checkbox';\r\n const isChecked = !!selectedRefinementCriterion;\r\n itemTypeClassName = isChecked ? `${itemTypeClassName}-checked` : itemTypeClassName;\r\n // eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing -- Replace with actual value for empty string.\r\n const productText = productRefinerValue.LeftValueBoundLocalizedString || productRefinerValue.LeftValueBoundString || '';\r\n // eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing -- Replace with actual value for empty string.\r\n const productCount = productRefinerValue.Count || 0;\r\n let refineMenuItemAriaLabel;\r\n if (productCount === 1) {\r\n refineMenuItemAriaLabel = refineItemAriaLabel ? format(refineItemAriaLabel, parentProductRefinerHierarchy.KeyName, productText) : '';\r\n } else {\r\n refineMenuItemAriaLabel =\r\n refineItemsAriaLabel ? format(refineItemsAriaLabel, parentProductRefinerHierarchy.KeyName, productText, productCount) : '';\r\n }\r\n if (parentProductRefinerHierarchy.SourceValue === ProductRefinerSource?.Rating) {\r\n if (productRefinerValue.LeftValueBoundString) {\r\n this.payLoad.contentAction.etext = productRefinerValue.LeftValueBoundLocalizedString;\r\n const attribute = getTelemetryAttributes(telemetryContent!, this.payLoad);\r\n const refinerRating = parseInt(productRefinerValue.LeftValueBoundString, 10);\r\n const ratingRefiner = this.props.selectedRefinerValues?.find(\r\n value => value.DataTypeValue === productRefinerValue.DataTypeValue\r\n );\r\n const selectedRating = parseInt(ratingRefiner?.LeftValueBoundString || '0', 10);\r\n let ratingComponentClass: string = 'ms-rating-component';\r\n if (refinerRating > selectedRating) {\r\n ratingComponentClass = `${ratingComponentClass}__up`;\r\n } else if (refinerRating < selectedRating) {\r\n ratingComponentClass = `${ratingComponentClass}__down`;\r\n } else {\r\n ratingComponentClass = `${ratingComponentClass}__current`;\r\n }\r\n return (\r\n \r\n \r\n \r\n \r\n {productRefinerValue.Count !== undefined && `(${productRefinerValue.Count})`}\r\n \r\n \r\n \r\n );\r\n } else {\r\n return undefined;\r\n }\r\n } else {\r\n this.payLoad.contentAction.etext =\r\n productRefinerValue.LeftValueBoundLocalizedString ?? productRefinerValue.LeftValueBoundString;\r\n const attribute = getTelemetryAttributes(telemetryContent!, this.payLoad);\r\n return (\r\n
  • \r\n \r\n \r\n {productRefinerValue.LeftValueBoundLocalizedString || productRefinerValue.LeftValueBoundString}\r\n {productRefinerValue.Count !== undefined && ` (${productRefinerValue.Count})`}\r\n \r\n \r\n
  • \r\n );\r\n }\r\n }\r\n\r\n private _getIsCategoryPage(): boolean {\r\n const { context } = this.props;\r\n const requestContext = context && context.request;\r\n const pageType =\r\n requestContext.urlTokens.pageType === 'Category' || (requestContext.query && requestContext.query.categoryId)\r\n ? 'Category'\r\n : 'Search';\r\n return pageType?.toLowerCase() === 'search' ? false : true;\r\n }\r\n\r\n private _getRefinerUrl(): string {\r\n const { urlBuilder, parentProductRefinerHierarchy, productRefinerValue, selectedRefinementCriterion, urlRefinerParts, urlParts, sortedConfigValues, filteredRefiners } = this.props;\r\n const urlSpecialCharsConfig = this.props.context.app.config.canonicalUrlspecialCharIncludeList;\r\n const isCategoryPage: boolean = this._getIsCategoryPage();\r\n if (productRefinerValue && parentProductRefinerHierarchy.KeyName) {\r\n const parentProductRefinerName = parentProductRefinerHierarchy.KeyName.toLowerCase().trim();\r\n const virturalRefinerConfigName = getVirtualRefinerNames(this.props.context.request, this.props.isMattressesCategory);\r\n if (virturalRefinerConfigName.indexOf(parentProductRefinerName) !== -1 && isCategoryPage) {\r\n const refinerParts = [...urlRefinerParts];\r\n const currentRefinerName = productRefinerValue.LeftValueBoundString && productRefinerValue.LeftValueBoundString.toLowerCase().trim().split(' ').join('-').replace(/\\&/g, 'and').replace(regExSpecialChars(urlSpecialCharsConfig), '-');\r\n if (currentRefinerName) {\r\n if (refinerParts.indexOf(currentRefinerName) !== -1) {\r\n const index = refinerParts.indexOf(currentRefinerName);\r\n refinerParts.splice(index, 1);\r\n } else if (currentRefinerName !== '' && refinerParts.indexOf(currentRefinerName) === -1) {\r\n refinerParts.push(currentRefinerName);\r\n }\r\n }\r\n\r\n // setup object with refiner values\r\n const sortedValues: { [key: string]: string[] } = {};\r\n filteredRefiners && filteredRefiners?.forEach((refinerSet) => {\r\n let refinerName = refinerSet.KeyName;\r\n if (refinerName) {\r\n refinerName = refinerName.toLowerCase();\r\n sortedValues[refinerName] = []; // size, brand, price\r\n }\r\n refinerSet.Values.forEach((refiner) => {\r\n refinerParts.forEach((refinerPart) => {\r\n if (refinerName && refiner.LeftValueBoundString &&\r\n (refiner.LeftValueBoundString.toLowerCase().replace(/\\&/g, 'and').replace(regExSpecialChars(urlSpecialCharsConfig), '-') === refinerPart.toLocaleLowerCase().split('-').join(' ')\r\n || refiner.LeftValueBoundString.toLowerCase().replace(/\\&/g, 'and').replace(regExSpecialChars(urlSpecialCharsConfig), '-') === refinerPart.toLocaleLowerCase())) {\r\n sortedValues[refinerName].push(refiner.LeftValueBoundString.toLowerCase().split(' ').join('-'));\r\n } else if (refinerName && refiner.LeftValueBoundString &&\r\n refiner.LeftValueBoundString.toLowerCase() === refinerPart.toLocaleLowerCase().split('-').join(' ')) {\r\n sortedValues[refinerName].push(refinerPart);\r\n }\r\n });\r\n });\r\n });\r\n // aplpha sort\r\n // @ts-ignore\r\n for (const sortedValue of Object.keys(sortedValues)) {\r\n sortedValues[sortedValue].length > 0 && sortedValues[sortedValue].sort((a: string, b: string) => {\r\n if (a < b) { return -1; }\r\n if (a > b) { return 1; }\r\n return 0;\r\n });\r\n }\r\n // @ts-ignore\r\n const finalRefiners: string[] = [];\r\n sortedConfigValues && sortedConfigValues.forEach((sortedConfigValue) => {\r\n const sortedRefinerName = sortedConfigValue.refinerName.toLowerCase();\r\n if (sortedValues[sortedRefinerName] !== undefined && sortedValues[sortedRefinerName].length > 0) {\r\n let concatValue: string | string[] = sortedValues[sortedRefinerName];\r\n if (sortedValues[sortedRefinerName].length > 1) {\r\n concatValue = sortedValues[sortedRefinerName].join('|');\r\n } else if (sortedValues[sortedRefinerName].length === 1) {\r\n concatValue = sortedValues[sortedRefinerName][0];\r\n }\r\n // @ts-ignore\r\n finalRefiners.push(concatValue.split(' ').join('-').replace(/\\&/g, 'and').replace(regExSpecialChars(urlSpecialCharsConfig), '-'));\r\n }\r\n });\r\n const queryStr = this.props.context.request?.url?.requestUrl?.search;\r\n return `${urlParts.origin}/${urlParts.categoryPart}${finalRefiners && finalRefiners.length > 0 ? `/${finalRefiners.join('\\/')}` : ''}/${urlParts.categoryId ? urlParts.categoryId : ''}${queryStr || ''}`;\r\n } else if (productRefinerValue) {\r\n return urlBuilder({\r\n parentProductRefinerHierarchy: parentProductRefinerHierarchy,\r\n productRefinerValue: productRefinerValue,\r\n isSelecting: !selectedRefinementCriterion\r\n });\r\n }\r\n }\r\n\r\n return '';\r\n }\r\n\r\n private _onClick = (e: React.MouseEvent): void => {\r\n e.preventDefault();\r\n\r\n const { parentProductRefinerHierarchy, productRefinerValue, selectedRefinementCriterion } = this.props;\r\n if (productRefinerValue) {\r\n this.props.onToggle({\r\n parentProductRefinerHierarchy: parentProductRefinerHierarchy,\r\n productRefinerValue: productRefinerValue,\r\n isSelecting: !selectedRefinementCriterion\r\n });\r\n\r\n MsDyn365.isBrowser &&\r\n setTimeout(() => {\r\n this.anchorType.current && this.anchorType.current.focus();\r\n }, 0);\r\n }\r\n };\r\n}\r\n","/* tslint:disable: no-duplicate-imports */\r\nimport { getPayloadObject, getTelemetryAttributes, IPayLoad } from '@msdyn365-commerce-modules/utilities';\r\nimport { IProductRefinerHierarchy } from '@msdyn365-commerce/commerce-entities';\r\nimport { ProductRefinerValue } from '@msdyn365-commerce/retail-proxy';\r\nimport classnames from 'classnames';\r\nimport get from 'lodash/get';\r\nimport { computed } from 'mobx';\r\nimport { observer } from 'mobx-react';\r\nimport * as React from 'react';\r\nimport { IChoiceSummaryProps } from './choice-summary.props';\r\nimport { isMatchingRefinementCriterion, isRangeType } from './utilities';\r\ninterface IRefinerMap {\r\n key: string;\r\n parentKey: string;\r\n value: ProductRefinerValue;\r\n}\r\n/**\r\n * ChoiceSummary component\r\n */\r\n@observer\r\nexport default class ChoiceSummary extends React.Component {\r\n private closeButtonGlyph: string = 'msi-close-btn';\r\n private payLoad: IPayLoad;\r\n @computed get selectedRefinersMap(): IRefinerMap[] {\r\n const { selectedChoices } = this.props;\r\n return selectedChoices.map((selectedRefiner: ProductRefinerValue) => {\r\n return {\r\n key: this._getKeyForRefinerValue(selectedRefiner),\r\n value: selectedRefiner,\r\n parentKey: this._getParentKeyForRefinerValue(selectedRefiner)\r\n } as IRefinerMap;\r\n });\r\n }\r\n constructor(props: Readonly) {\r\n super(props);\r\n this.payLoad = getPayloadObject('click', this.props.telemetryContent!, '');\r\n }\r\n public render(): JSX.Element {\r\n const { clearAllText, label, classNames, choiceAriaLabel, clearAllModal, closeAriaLabel } = this.props;\r\n const items = this.selectedRefinersMap;\r\n this.payLoad.contentAction.etext = clearAllText;\r\n const clearAllAttributes = getTelemetryAttributes(this.props.telemetryContent!, this.payLoad);\r\n return (\r\n
    0 ? 'msc-choice-summary__selection' : ''}`}>\r\n {!clearAllModal && items.length > 0 && label && {label}}\r\n {!clearAllModal && (\r\n
      \r\n {items.map((item: IRefinerMap, index: number) => {\r\n this.payLoad.contentAction.etext = item.key;\r\n const attribute = getTelemetryAttributes(this.props.telemetryContent!, this.payLoad);\r\n return (\r\n
    • \r\n this._onClickKeyName(e, item.parentKey)}\r\n role=\"buton\"\r\n {...attribute}\r\n >\r\n {item.key}\r\n \r\n \r\n
    • \r\n );\r\n })}\r\n
    \r\n )}\r\n {this.props.clearAllBtn ?\r\n // @ts-ignore\r\n items.length > 0 && clearAllText && \r\n :\r\n items.length > 0 && clearAllText && {clearAllText}}\r\n
    \r\n );\r\n }\r\n private _getKeyForRefinerValue(productRefinerValue: ProductRefinerValue): string {\r\n const { choiceFormat, choiceRangeValueFormat, refinerHierarchy, telemetry } = this.props;\r\n const overallFormat = choiceFormat || '{1}';\r\n const rangeFormat = choiceRangeValueFormat;\r\n let refinerName = '';\r\n if (refinerHierarchy && refinerHierarchy.find) {\r\n const parent = refinerHierarchy.find(\r\n (hierarchy: IProductRefinerHierarchy) =>\r\n !!hierarchy.Values.find((value: ProductRefinerValue) => isMatchingRefinementCriterion(value, productRefinerValue))\r\n );\r\n if (!parent) {\r\n telemetry.warning('[choice-summary] could not find parent of selected refiner value');\r\n } else {\r\n refinerName = parent.KeyName || '';\r\n }\r\n }\r\n let refinerValueName: string;\r\n if (isRangeType(productRefinerValue.DataTypeValue)) {\r\n refinerValueName = rangeFormat\r\n .replace('{0}', this._formatPrice(productRefinerValue.LeftValueBoundString, productRefinerValue.UnitText))\r\n .replace('{1}', this._formatPrice(productRefinerValue.RightValueBoundString, productRefinerValue.UnitText));\r\n } else {\r\n refinerValueName = productRefinerValue.LeftValueBoundLocalizedString || productRefinerValue.LeftValueBoundString || '';\r\n }\r\n return overallFormat.replace('{0}', refinerName).replace('{1}', refinerValueName);\r\n }\r\n private _getParentKeyForRefinerValue(productRefinerValue: ProductRefinerValue): string {\r\n const { refinerHierarchy, telemetry } = this.props;\r\n let refinerName = '';\r\n if (refinerHierarchy && refinerHierarchy.find) {\r\n const parent = refinerHierarchy.find(\r\n (hierarchy: IProductRefinerHierarchy) =>\r\n !!hierarchy.Values.find((value: ProductRefinerValue) => isMatchingRefinementCriterion(value, productRefinerValue))\r\n );\r\n if (!parent) {\r\n telemetry.warning('[choice-summary] could not find parent of selected refiner value');\r\n } else {\r\n refinerName = parent.KeyName || '';\r\n }\r\n }\r\n return refinerName;\r\n }\r\n private _formatPrice(amount: string | undefined, currency: string | undefined): string {\r\n if (!amount || !currency) {\r\n this.props.telemetry.trace('[choice-summary] could not format price');\r\n return amount || '';\r\n }\r\n const priceAmount = (amount && Number(amount)) || 0;\r\n const locale = get(this.props, 'context.request.locale', 'en-US');\r\n let result: string;\r\n try {\r\n result = new Intl.NumberFormat(locale, {\r\n style: 'currency',\r\n currencyDisplay: 'symbol',\r\n currency: currency,\r\n minimumFractionDigits: 0\r\n }).format(priceAmount);\r\n } catch (e) {\r\n result = `${priceAmount} ${currency}`;\r\n this.props.telemetry.warning(`Failed to format price for ${result}: ${e}`);\r\n }\r\n return result;\r\n }\r\n private _onClick = (e: React.MouseEvent): void => {\r\n e.preventDefault();\r\n e.stopPropagation();\r\n const target = e.currentTarget as HTMLElement;\r\n const clearAll = target.getAttribute('class')!.indexOf('choice-summary__clear-all') > -1;\r\n const selectedRefiner = clearAll ? undefined : this._getSelectedRefinerChoice(target);\r\n if (this.props.onChoiceClicked) {\r\n this.props.onChoiceClicked({\r\n clearAll: clearAll,\r\n itemClicked: target,\r\n choiceClicked: selectedRefiner,\r\n nextItemToFocus: target.nextSibling as HTMLElement,\r\n parentKeyName: ''\r\n });\r\n }\r\n };\r\n private _onClickKeyName = (e: React.MouseEvent, keyName: string = ''): void => {\r\n e.preventDefault();\r\n e.stopPropagation();\r\n const target = e.currentTarget as HTMLElement;\r\n const clearAll = target.getAttribute('class')!.indexOf('choice-summary__clear-all') > -1;\r\n const selectedRefiner = clearAll ? undefined : this._getSelectedRefinerChoice(target);\r\n if (this.props.onChoiceClicked) {\r\n this.props.onChoiceClicked({\r\n clearAll: clearAll,\r\n itemClicked: target,\r\n choiceClicked: selectedRefiner,\r\n nextItemToFocus: target.nextSibling as HTMLElement,\r\n parentKeyName: keyName\r\n });\r\n }\r\n };\r\n private _getSelectedRefinerChoice(itemClicked: HTMLElement): ProductRefinerValue | undefined {\r\n const result = this.selectedRefinersMap.find(\r\n selected => (itemClicked.innerText && itemClicked.innerText.trim().toUpperCase()) === selected.key.toUpperCase()\r\n );\r\n return (result && result.value) || undefined;\r\n }\r\n}","import { Button, Modal, ModalBody, ModalFooter, ModalHeader } from '@msdyn365-commerce-modules/utilities';\r\n/* tslint:disable: no-duplicate-imports */\r\nimport React from 'react';\r\n\r\nexport interface ISearchResultModalViewProps {\r\n modal: React.ReactElement;\r\n modalHeader: React.ReactNode;\r\n modalFooter: React.ReactElement;\r\n modalBody: React.ReactElement;\r\n}\r\n\r\ninterface IModalToggleProps {\r\n innerRef: React.RefObject | undefined;\r\n id: string;\r\n text: string;\r\n ariaLabel: string;\r\n onClick(): void;\r\n}\r\n\r\nexport interface ISearchResultModalResources {\r\n modalTitle: string;\r\n modalCloseButtonText: string;\r\n}\r\n\r\nexport interface ISearchResultModalProps {\r\n resources: ISearchResultModalResources;\r\n totalItems: number | undefined;\r\n isOpen: boolean;\r\n returnRef: React.RefObject | undefined;\r\n clearAllBtn: React.ReactNode;\r\n onModalToggle(): void;\r\n}\r\n\r\nexport const ModalToggle: React.FC = (props: IModalToggleProps) => {\r\n const { text, onClick, ariaLabel, innerRef, id } = props;\r\n return (\r\n \r\n );\r\n};\r\n\r\nexport const SearchResultModal = (props: ISearchResultModalProps): ISearchResultModalViewProps => {\r\n return {\r\n modal: modalNode(props),\r\n modalHeader: modalHeaderNode(props),\r\n modalFooter: modalFooterNode(props),\r\n modalBody: \r\n };\r\n};\r\n\r\nconst modalNode = (props: ISearchResultModalProps) => {\r\n return (\r\n \r\n );\r\n};\r\n\r\nconst modalHeaderNode = (props: ISearchResultModalProps) => {\r\n return (\r\n <>\r\n \r\n
    \r\n
    {props.resources.modalTitle}
    \r\n
    {props.clearAllBtn}
    \r\n
    \r\n \r\n );\r\n};\r\n\r\nconst generateButtonText = (props: ISearchResultModalProps) => {\r\n const result = (props.totalItems && props.totalItems > 1) || props.totalItems === 0 ? 'Results' : 'Result';\r\n return `See ${props.totalItems} ${result}`;\r\n};\r\n\r\nconst modalFooterNode = (props: ISearchResultModalProps) => {\r\n return (\r\n \r\n \r\n \r\n \r\n );\r\n};\r\n","/*---------------------------------------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License. See License.txt in the project root for license information.\r\n *--------------------------------------------------------------------------------------------*/\r\n/* tslint:disable: no-duplicate-imports */\r\nimport * as React from 'react';\r\n\r\nimport { Button, ITelemetryContent } from '@msdyn365-commerce-modules/utilities';\r\nimport { IProductRefinerHierarchy } from '@msdyn365-commerce/commerce-entities';\r\nimport { IAny, ICoreContext, IGeneric } from '@msdyn365-commerce/core';\r\nimport { ProductRefinerSource, ProductRefinerValue, RefinerType } from '@msdyn365-commerce/retail-proxy';\r\nimport { IVirtualRefinersConfig } from '../../../Utilities/plp-url-utils';\r\nimport { IRefineItemURLParts } from '../mfrm-search-result-container';\r\nimport { DisplayTemplate } from '../mfrm-search-result-container.data';\r\nimport RangeRefineItem, { RangeRefineItemType } from './range-refine-item';\r\nimport RefineItem from './refine-item';\r\nimport { IRefineItemToggleNotification } from './refine-item-toggle-notification';\r\nimport { IRefineItemCommonProps } from './refine-item.props.common';\r\nimport { findMatchingRefinementCriterion, isRangeType } from './utilities';\r\n\r\n/**\r\n * Properties associated with the RefineSubmenu component\r\n */\r\nexport interface IRefineSubmenuProps {\r\n tempRangeTypeTODO: RangeRefineItemType;\r\n minValueSliderThumbAriaLabel?: string;\r\n maxValueSliderThumbAriaLabel?: string;\r\n refinerShowMoreText?: string;\r\n refinerShowLessText?: string;\r\n productRefinerHierarchy: IProductRefinerHierarchy;\r\n selectedRefinerValues: ProductRefinerValue[];\r\n refineItemCommonProps: IRefineItemCommonProps;\r\n isDisabled: boolean;\r\n isExpandedOnInitialLoad: boolean;\r\n context: ICoreContext>;\r\n moduleId: string;\r\n moduleTypeName: string;\r\n /** The telemetry content */\r\n telemetryContent?: ITelemetryContent;\r\n isMattressesCategory: boolean | undefined;\r\n urlRefinerParts: string[];\r\n urlParts: IRefineItemURLParts;\r\n isPriceRefinerDisabled: boolean;\r\n isCategoryPage: boolean;\r\n sortedConfigValues?: IVirtualRefinersConfig[] | undefined;\r\n filteredRefiners?: IProductRefinerHierarchy[] | undefined;\r\n onUpdateRefiners(notfication: Readonly): void;\r\n urlBuilder(refiner: IRefineItemToggleNotification): string;\r\n refinerNumberOfItemsToDisplay(keyName?: string): number | undefined;\r\n singleProductCountAriaLabel?: string;\r\n refineItemAriaLabel?: string;\r\n refineItemsAriaLabel?: string;\r\n isMobile?: boolean;\r\n}\r\n\r\n/**\r\n * Refine submenu state\r\n */\r\nexport interface IRefineSubmenuState extends React.ComponentState {\r\n expanded: boolean;\r\n refineItemsExpanded: boolean;\r\n itemsToShow: number;\r\n}\r\n\r\n/**\r\n *\r\n * The RefineSubmenu component renders the submenu category and child items.\r\n * This computed observes the stateful category hierarchy object.\r\n * @extends {React.PureComponent}\r\n */\r\nclass RefineSubmenu extends React.Component {\r\n constructor(props: IRefineSubmenuProps) {\r\n super(props);\r\n\r\n this._onToggleItem = this._onToggleItem.bind(this);\r\n this._onToggleSubmenu = this._onToggleSubmenu.bind(this);\r\n\r\n const isExpanded = this.props.isExpandedOnInitialLoad;\r\n\r\n this.state = {\r\n expanded: isExpanded,\r\n refineItemsExpanded: false,\r\n itemsToShow: 6\r\n };\r\n }\r\n\r\n public componentDidMount(): void {\r\n this.setState({ itemsToShow: this._setRefineItemsLimitToDisplay() });\r\n }\r\n\r\n public render(): JSX.Element | null {\r\n const { productRefinerHierarchy, refineItemCommonProps, isPriceRefinerDisabled } = this.props;\r\n if (!productRefinerHierarchy) {\r\n refineItemCommonProps.telemetry.error('Cannot render submenu without refiner hierarchy data');\r\n }\r\n if (productRefinerHierarchy.SourceValue === ProductRefinerSource?.Rating && this.props.context.app.config.hideRating) {\r\n return null;\r\n }\r\n if (productRefinerHierarchy.KeyName === 'Price' && isPriceRefinerDisabled) {\r\n return null;\r\n }\r\n return (\r\n
    \r\n \r\n {productRefinerHierarchy.KeyName}\r\n \r\n {this.state.expanded && (\r\n <>\r\n {this._renderChildItems(productRefinerHierarchy)}\r\n {productRefinerHierarchy.Values.length > this._setRefineItemsLimitToDisplay() ? (\r\n \r\n \r\n {this.state.refineItemsExpanded\r\n ? `${this.props.refinerShowLessText} ${this._pluralizeKeyName(productRefinerHierarchy.KeyName)}`\r\n : `${this.props.refinerShowMoreText} ${this._pluralizeKeyName(productRefinerHierarchy.KeyName)}`}\r\n \r\n
    \r\n ) : (\r\n ''\r\n )}\r\n \r\n )}\r\n \r\n );\r\n }\r\n\r\n private _pluralizeKeyName = (key: string | undefined) => {\r\n switch (key?.trim().slice(-1)) {\r\n case 's':\r\n return key;\r\n case 'y':\r\n return `${key.slice(0, -1)}ies`;\r\n default:\r\n return `${key}s`;\r\n }\r\n };\r\n\r\n private _showMore = () => {\r\n if (!this.state.refineItemsExpanded) {\r\n this.setState({\r\n itemsToShow: this.props.productRefinerHierarchy.Values.length\r\n });\r\n } else {\r\n this.setState({ itemsToShow: this._setRefineItemsLimitToDisplay() });\r\n }\r\n\r\n this.setState({\r\n refineItemsExpanded: !this.state.refineItemsExpanded\r\n });\r\n };\r\n\r\n private _setRefineItemsLimitToDisplay = (): number => {\r\n const { KeyName } = this.props.productRefinerHierarchy;\r\n return this.props.refinerNumberOfItemsToDisplay(KeyName) || 6;\r\n };\r\n\r\n private _renderChildItems(productRefinerHierarchy: IProductRefinerHierarchy): JSX.Element | null {\r\n if (isRangeType(productRefinerHierarchy.DataTypeValue)) {\r\n return this._renderRange(productRefinerHierarchy);\r\n }\r\n return this._renderSingleMultiSelect(productRefinerHierarchy);\r\n }\r\n\r\n private _renderSingleMultiSelect(productRefinerHierarchy: IProductRefinerHierarchy): JSX.Element | null {\r\n const { isDisabled, refineItemCommonProps, selectedRefinerValues, context,\r\n singleProductCountAriaLabel, refineItemAriaLabel, refineItemsAriaLabel, isMobile } = this.props;\r\n const isSingleSelect =\r\n productRefinerHierarchy.RefinerTypeValue === RefinerType?.SingleSelect &&\r\n productRefinerHierarchy.SourceValue === ProductRefinerSource.Rating;\r\n const role = isSingleSelect ? { role: 'listbox' } : undefined;\r\n const refinerValuesList = productRefinerHierarchy.Values || [];\r\n const listItems = refinerValuesList.map((child: ProductRefinerValue, index: number) => {\r\n if (!child) {\r\n refineItemCommonProps.telemetry.warning(\r\n `[refine-submenu] Could not render refine item for refiner ${productRefinerHierarchy.RecordId} (${productRefinerHierarchy.KeyName})`\r\n );\r\n return null;\r\n }\r\n\r\n const selectedRefinementCriterion = findMatchingRefinementCriterion(child, selectedRefinerValues);\r\n if (index < this.state.itemsToShow) {\r\n return (\r\n \r\n refinerValuesList.find(value => value.RefinerRecordId === selectedValue.RefinerRecordId)\r\n )}\r\n refineItemCommonProps={refineItemCommonProps}\r\n onToggle={this._onToggleItem}\r\n urlBuilder={this.props.urlBuilder}\r\n isDisabled={isDisabled}\r\n key={index}\r\n index={index}\r\n context={context}\r\n moduleId={this.props.moduleId}\r\n moduleTypeName={this.props.moduleTypeName}\r\n telemetryContent={this.props.telemetryContent}\r\n isMattressesCategory={this.props.isMattressesCategory}\r\n urlRefinerParts={this.props.urlRefinerParts}\r\n urlParts={this.props.urlParts}\r\n sortedConfigValues={this.props.sortedConfigValues}\r\n filteredRefiners={this.props.filteredRefiners}\r\n refineItemAriaLabel={refineItemAriaLabel}\r\n refineItemsAriaLabel={refineItemsAriaLabel}\r\n singleProductCountAriaLabel={singleProductCountAriaLabel}\r\n isMobileView={isMobile}\r\n />\r\n );\r\n } else {\r\n return;\r\n }\r\n });\r\n\r\n return (\r\n \r\n {listItems}\r\n \r\n );\r\n }\r\n\r\n private _getRangeType(productRefinerHierarchy: IProductRefinerHierarchy): 'input' | 'slider' {\r\n if (\r\n productRefinerHierarchy.DisplayTemplateValue === DisplayTemplate.Range ||\r\n productRefinerHierarchy.DisplayTemplateValue === DisplayTemplate.Slider ||\r\n productRefinerHierarchy.DisplayTemplateValue === DisplayTemplate.SliderWithBars\r\n ) {\r\n return 'slider';\r\n }\r\n\r\n return 'input';\r\n }\r\n\r\n private _renderRange(productRefinerHierarchy: IProductRefinerHierarchy): JSX.Element | null {\r\n const {\r\n isDisabled,\r\n refineItemCommonProps,\r\n selectedRefinerValues,\r\n context,\r\n minValueSliderThumbAriaLabel,\r\n maxValueSliderThumbAriaLabel\r\n } = this.props;\r\n const submenuClassNamePrefix = 'ms-refine-submenu__item list-group-item refine-submenu__item';\r\n const refinerValuesList = productRefinerHierarchy.Values || [];\r\n const listItems = refinerValuesList.map((child: ProductRefinerValue, index: number) => {\r\n if (!child) {\r\n refineItemCommonProps.telemetry.warning(\r\n `Could not render refine item for refiner ${productRefinerHierarchy.RecordId} (${productRefinerHierarchy.KeyName})`\r\n );\r\n return null;\r\n }\r\n\r\n const selectedRefinementCriterion = findMatchingRefinementCriterion(child, selectedRefinerValues);\r\n const rangeType = this._getRangeType(productRefinerHierarchy);\r\n const key = selectedRefinementCriterion\r\n ? `${selectedRefinementCriterion.LeftValueBoundString}-${selectedRefinementCriterion.RightValueBoundString}`\r\n : `not-selected-${index}`;\r\n return (\r\n <>\r\n
  • \r\n \r\n
  • \r\n\r\n {rangeType === 'slider' ? (\r\n
  • \r\n \r\n
  • \r\n ) : (\r\n ''\r\n )}\r\n \r\n );\r\n });\r\n return
      {listItems}
    ;\r\n }\r\n\r\n private _onToggleItem(itemToggleNotification: IRefineItemToggleNotification): void {\r\n this.props.onUpdateRefiners(itemToggleNotification);\r\n }\r\n\r\n private _onToggleSubmenu(): void {\r\n this.setState(prevState => ({\r\n expanded: !prevState.expanded\r\n }));\r\n }\r\n}\r\n\r\nexport default RefineSubmenu;\r\n","/* tslint:disable: no-duplicate-imports */\r\nimport * as React from 'react';\r\ninterface IErrorMessage {\r\n text?: string;\r\n}\r\n\r\nexport const ErrorMessage: React.FC = ({ text }) => {\r\n return (\r\n \r\n
    {text}
    \r\n
    \r\n );\r\n};\r\n","/*---------------------------------------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License. See License.txt in the project root for license information.\r\n *--------------------------------------------------------------------------------------------*/\r\n/* tslint:disable: no-duplicate-imports && max-line-length */\r\nimport { ArrayExtensions, getCustomer, GetCustomerInput } from '@msdyn365-commerce-modules/retail-actions';\r\nimport {\r\n getTelemetryObject,\r\n ILabeledDropdownOnChangeNotification,\r\n ILabeledDropdownOption,\r\n IModuleProps,\r\n INodeProps,\r\n ITelemetryContent,\r\n UncontrolledPagination,\r\n isMobile,\r\n VariantType\r\n} from '@msdyn365-commerce-modules/utilities';\r\nimport { CategoryHierarchy as CategoryHierarchyData, IProductRefinerHierarchy } from '@msdyn365-commerce/commerce-entities';\r\nimport MsDyn365 from '@msdyn365-commerce/core';\r\nimport {\r\n format,\r\n ProductPrice,\r\n ProductRefinerValue,\r\n ProjectionDomain,\r\n SortColumn,\r\n TextValueTranslation\r\n} from '@msdyn365-commerce/retail-proxy';\r\nimport { getActivePricesAsync } from '@msdyn365-commerce/retail-proxy/dist/DataActions/ProductsDataActions.g';\r\nimport {\r\n AffiliationLoyaltyTier,\r\n CustomerAffiliation,\r\n ProductSearchResult\r\n} from '@msdyn365-commerce/retail-proxy/dist/Entities/CommerceTypes.g';\r\nimport classnames from 'classnames';\r\nimport flatten from 'lodash/flatten';\r\nimport get from 'lodash/get';\r\nimport { computed, observable, reaction, transaction } from 'mobx';\r\nimport { observer } from 'mobx-react';\r\nimport * as React from 'react';\r\nimport UiLabeledDropdown from '../../Utilities/labeled-dropdown/ui-labeled-dropdown/UiLabeledDropdown';\r\nimport { IMenuItemData } from '../mfrm-navigation-menu/mfrm-navigation-menu.data';\r\nimport {\r\n buildListPageUrl,\r\n getCollectionProducts,\r\n getCurrentUrl,\r\n GetFullProductsByCollectionInput,\r\n parseQueryParam,\r\n sortOptions\r\n} from './actions';\r\n\r\nimport {\r\n ErrorMessage,\r\n FeatureSearchResultItem,\r\n getUpdatedRefinementCriteria,\r\n IChoiceSummaryClickNotification,\r\n IRefineItemCommonProps,\r\n IRefineItemToggleNotification,\r\n ISearchResultModalViewProps,\r\n isMatchingRefinementCriterion,\r\n isRangeType,\r\n Link,\r\n ModalToggle,\r\n ProductSearchResultItems,\r\n SearchResultModal,\r\n Separator,\r\n Title\r\n} from './components';\r\nimport ChoiceSummary from './components/choice-summary';\r\nimport RefineSubmenu from './components/refine-submenu';\r\nimport { IMfrmSearchResultContainerData } from './mfrm-search-result-container.data';\r\nimport { IMfrmSearchResultContainerProps } from './mfrm-search-result-container.props.autogenerated';\r\nimport { SrpBreadcrumbPageInput } from '../../actions/srp-breadcrumb-page.action';\r\nimport { getSortedVirtualRefinerConfig, getVirtualRefinerNames, regExSpecialChars, removeKeywords } from '../../Utilities/plp-url-utils';\r\nimport getProducts from './actions/get-full-products-by-collection';\r\nexport interface ISearchResultContainerViewProps extends IMfrmSearchResultContainerProps {\r\n products?: React.ReactNode;\r\n className?: string;\r\n SearchResultContainer: IModuleProps;\r\n TitleViewProps: ITitleViewProps;\r\n categoryHierarchy: ICategoryHierarchyViewProps;\r\n pagination?: React.ReactNode;\r\n ProductsContainer: INodeProps;\r\n ProductSectionContainer: INodeProps;\r\n refineMenu: IRefineMenuViewProps;\r\n sortByOptions: ISortByViewProps;\r\n choiceSummary?: React.ReactNode;\r\n clearAllBtn?: React.ReactNode;\r\n modalToggle: React.ReactNode;\r\n searchResultModal: ISearchResultModalViewProps;\r\n isMobile: boolean;\r\n CategoryNavContainer: INodeProps;\r\n RefineAndProductSectionContainer: INodeProps;\r\n errorMessage: React.ReactNode;\r\n FeatureSearchContainer: INodeProps;\r\n similarLookProduct?: React.ReactNode;\r\n productPrices?: ProductPrice[];\r\n showCategoryBanner?: boolean;\r\n categoryBannerInd?: number;\r\n matcherBannerSlotInd?: number;\r\n addedProducts: [];\r\n onlyNewProducts: [];\r\n isMattressesCategory: boolean | undefined;\r\n refinerRedirect: boolean;\r\n isCategoryPage: boolean;\r\n categoryNameFromSlug: string | undefined;\r\n seoDataEntry: object | undefined;\r\n activeRefiners: [];\r\n showProductsLoader: boolean;\r\n getScrolledProducts(): Promise;\r\n}\r\n\r\nexport interface ITitleViewProps {\r\n TitleContainer: INodeProps;\r\n title: ISearchResultTitle;\r\n totalItems?: number;\r\n}\r\n\r\nexport interface IRefineItemURLParts {\r\n origin: string;\r\n categoryPart: string;\r\n categoryId: string | undefined;\r\n}\r\n\r\nexport interface IRefineMenuViewProps {\r\n RefineMenuContainer: INodeProps;\r\n RefinerSectionContainer: INodeProps;\r\n refiners?: React.ReactNode[];\r\n applyBtn?: React.ReactNode[];\r\n refinerLabel: string;\r\n}\r\n\r\nexport interface ICategoryHierarchyViewProps {\r\n categoryHierarchyList?: React.ReactNode[];\r\n categoryHierarchySeparator?: React.ReactNode;\r\n CategoryHierarchyContainer: INodeProps;\r\n}\r\n\r\nexport interface ISortByViewProps {\r\n sortByDropDown?: React.ReactNode;\r\n}\r\n\r\nexport type GridSize = 'xs' | 'sm' | 'md' | 'lg' | 'xl';\r\n\r\n/**\r\n * Title component for search result container\r\n */\r\nexport interface ISearchResultTitle {\r\n searchPageTitle?: React.ReactNode;\r\n titlePrefix?: React.ReactNode;\r\n titleText?: React.ReactNode;\r\n titleCount?: React.ReactNode;\r\n}\r\n\r\nexport interface ISearchResultContainerState {\r\n sortingState: ISortByCollectionState;\r\n modalIsOpen: boolean;\r\n showCategoryBanner: boolean;\r\n categoryBannerIndex: number;\r\n matcherBannerSlotInd: number;\r\n lastBannerID: string;\r\n // TODO: Set proper type\r\n // tslint:disable-next-line:no-any\r\n addedProducts: any;\r\n onlyNewProducts: any;\r\n infiniteScrollPage: number;\r\n scrollHeightPrevValue: number;\r\n totalSkipProductsValue: number;\r\n allSizeRefinerValues: (string | ProductRefinerValue | undefined)[];\r\n allVirtualRefiners: (string | undefined)[];\r\n isPriceRefinerDisabled: boolean;\r\n isRefinerRedirectEnabled: boolean;\r\n showProductsLoader: boolean;\r\n sortedOptions: SortColumn[];\r\n}\r\ninterface ISortByCollectionState {\r\n selectedSortByOption: ILabeledDropdownOption;\r\n pending: boolean;\r\n}\r\n/**\r\n *\r\n * SearchResultContainer component\r\n * @extends {React.PureComponent>}\r\n */\r\n@observer\r\nexport default class SearchResultContainer extends React.PureComponent<\r\n IMfrmSearchResultContainerProps,\r\n ISearchResultContainerState\r\n> {\r\n @computed get isMobile(): boolean {\r\n return this._viewport === 'xs' || this._viewport === 'sm';\r\n }\r\n\r\n private sortByDropdownOptions: ILabeledDropdownOption[] = [\r\n { key: sortOptions.sortByOptionRelevanceDesc, value: this.props.resources.sortByOptionRelevanceDesc },\r\n { key: sortOptions.sortByOptionPriceAsc, value: this.props.resources.sortByOptionPriceAsc },\r\n { key: sortOptions.sortByOptionPriceDesc, value: this.props.resources.sortByOptionPriceDesc },\r\n { key: sortOptions.sortByOptionRatingDesc, value: this.props.resources.sortByOptionRatingDesc }\r\n ];\r\n private _refineItemCommonProps: IRefineItemCommonProps;\r\n private _pageType: string | undefined = this.props.context.request.urlTokens.pageType;\r\n private _isCustomizedRefiner: boolean =\r\n this.props.context.request.app.config.urlModifications && this.props.context.request.app.config.urlModifications?.length > 0;\r\n @observable\r\n private _viewport: GridSize = 'lg';\r\n private _modalToggleRef: React.RefObject;\r\n private _sortAndFilterContainerRef: React.RefObject;\r\n private telemetryContent: ITelemetryContent;\r\n private productPrices: ProductPrice[];\r\n\r\n private currentNavMenu: IMenuItemData[] = [];\r\n private isMattressesCategory: boolean | undefined;\r\n\r\n public static getFriendlyName(locale: string, nameTranslations?: TextValueTranslation[]): string | undefined {\r\n let nameTranslation: TextValueTranslation | undefined;\r\n if (locale && nameTranslations && ArrayExtensions.hasElements(nameTranslations)) {\r\n nameTranslation = nameTranslations.find(item => item.Language!.toLowerCase() === locale.toLowerCase());\r\n }\r\n\r\n return nameTranslation && nameTranslation.Text;\r\n }\r\n // tslint:disable-next-line:max-func-body-length\r\n constructor(props: IMfrmSearchResultContainerProps, state: ISearchResultContainerState) {\r\n super(props);\r\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition -- Check required.\r\n this._viewport = props.context.request?.device?.Type === 'Mobile' ? 'xs' : 'lg';\r\n this._modalToggleRef = React.createRef();\r\n this._sortAndFilterContainerRef = React.createRef();\r\n this._toggleModal = this._toggleModal.bind(this);\r\n this._updateViewport = this._updateViewport.bind(this);\r\n this._getCategoryBanner = this._getCategoryBanner.bind(this);\r\n this._updateMattressMatcherBanner = this._updateMattressMatcherBanner.bind(this);\r\n this.productPrices = [];\r\n this.state = {\r\n sortingState: {\r\n pending: false,\r\n selectedSortByOption: this.sortByDropdownOptions[0]\r\n },\r\n modalIsOpen: false,\r\n showCategoryBanner: false,\r\n categoryBannerIndex: -1,\r\n matcherBannerSlotInd: -1,\r\n lastBannerID: '',\r\n addedProducts: [],\r\n onlyNewProducts: [],\r\n infiniteScrollPage: 1,\r\n scrollHeightPrevValue: 0,\r\n totalSkipProductsValue: 0,\r\n allSizeRefinerValues: [],\r\n isPriceRefinerDisabled: false,\r\n allVirtualRefiners: [],\r\n isRefinerRedirectEnabled: false,\r\n sortedOptions: [],\r\n showProductsLoader: true\r\n };\r\n\r\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\r\n this.props.data.products.then(products => {\r\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\r\n this.props.data.listPageState.then(listPageState => {\r\n listPageState.activeProducts = [...products.products];\r\n listPageState.totalProductCount = products.count;\r\n listPageState.activeFilters = [...products.virtualRefiners];\r\n listPageState.activeVirtualFilters = [...products.minusVirtualRefiner];\r\n });\r\n });\r\n\r\n this.isMattressesCategory = this.props?.data.category.result?.ExtensionProperties?.find(\r\n attr => attr.Key === 'SizeRefinementEnable'\r\n )?.Value?.BooleanValue;\r\n const { placeholderTextMax, minLabel, maxLabel, rangeNameFormat } = this.props.resources;\r\n const locale = this.props.context.request.locale;\r\n const telemetry = this.props.telemetry;\r\n const validationErrorNaN = this.props.resources.validationErrorNotNumber;\r\n const validationErrorRange = this.props.resources.validationErrorNotRange;\r\n this._refineItemCommonProps = {\r\n telemetry,\r\n locale,\r\n placeholderTextMax,\r\n minLabel,\r\n maxLabel,\r\n rangeNameFormat,\r\n validationErrorNaN,\r\n validationErrorRange\r\n };\r\n this.telemetryContent = getTelemetryObject(\r\n this.props.context.request.telemetryPageName!,\r\n this.props.friendlyName,\r\n this.props.telemetry\r\n );\r\n if (this.props.context.request.query?.productId) {\r\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\r\n this.props.data.featureProduct.then(products => {\r\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\r\n this.props.data.listPageState.then(listPageStateFeature => {\r\n listPageStateFeature.featureProduct = products;\r\n });\r\n });\r\n }\r\n this._updateViewport();\r\n }\r\n // VSI Customization - START - 23797\r\n public getPagePath = (): string => {\r\n return MsDyn365.isBrowser\r\n ? window.location.href.split(location.host)[1].includes('?')\r\n ? window.location.href.split(location.host)[1].split('?')[0]\r\n : window.location.href.split(location.host)[1]\r\n : '';\r\n };\r\n public getCategoryName = (): string | undefined => {\r\n const { data, context } = this.props;\r\n let categoryName: string | undefined = '';\r\n if (context && context.request && context.request.query && context.request.query.q) {\r\n categoryName = `'${context.request.query.q}'`;\r\n } else {\r\n categoryName =\r\n (data.category.result &&\r\n SearchResultContainer.getFriendlyName(context.request.locale, data.category.result.NameTranslations)) ||\r\n (data.category.result && data.category.result.Name);\r\n }\r\n return categoryName;\r\n };\r\n public getSkipProductValue = (): number => {\r\n let skipProducts: number = 0;\r\n const viewPortCode = this._getViewport();\r\n if (viewPortCode === 'xs' || viewPortCode === 'sm' || viewPortCode === 'md') {\r\n skipProducts = 1;\r\n } else if (viewPortCode === 'lg') {\r\n if (MsDyn365.isBrowser && window.innerWidth) {\r\n if (window.innerWidth >= 1070 && window.innerWidth < 1112) {\r\n skipProducts = 2;\r\n } else {\r\n skipProducts = 3;\r\n }\r\n }\r\n } else if (viewPortCode === 'xl') {\r\n skipProducts = 3;\r\n }\r\n return skipProducts;\r\n };\r\n\r\n // VSI Customization - END - 23797\r\n public componentDidMount(): void {\r\n // Initalization of list page\r\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\r\n this.props.data.products.then(products => {\r\n this.setState({\r\n showProductsLoader: false\r\n });\r\n\r\n // Initalization of list page\r\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\r\n this.props.data.listPageState.then(listPageState => {\r\n if (this._pageType === 'Category') {\r\n listPageState.pageType = 'Category';\r\n } else {\r\n listPageState.pageType = 'Search';\r\n }\r\n\r\n let querySorting: SortColumn[] = [];\r\n\r\n if (this.props.context.request.query && this.props.context.request.query.sorting) {\r\n querySorting = JSON.parse(decodeURIComponent(this.props.context.request.query.sorting)) as SortColumn[];\r\n }\r\n\r\n listPageState.currentPageNumber =\r\n (this.props.context.request.query && +this.props.context.request.query.skip / (this.props.config.itemsPerPage || 10)) ||\r\n 0;\r\n listPageState.sortingCritera = { Columns: querySorting };\r\n listPageState.pageSize = this.props.config.itemsPerPage || 10;\r\n listPageState.activeProducts = [...products.products];\r\n listPageState.totalProductCount = products.count;\r\n // Todo: will remove as functionality completes 06/06/2021\r\n // VSI Customization 7924 Start\r\n listPageState.activeFilters = [...products.virtualRefiners];\r\n listPageState.activeVirtualFilters = [...products.minusVirtualRefiner];\r\n // VSI Customization 7924 End\r\n // Initialize reaction based on listPageState properties\r\n reaction(\r\n () => {\r\n return [\r\n listPageState.activeFilters && listPageState.activeFilters.length,\r\n listPageState.currentPageNumber,\r\n listPageState.sortingCritera &&\r\n listPageState.sortingCritera.Columns &&\r\n listPageState?.sortingCritera.Columns.length\r\n ];\r\n },\r\n () => {\r\n const input = new GetFullProductsByCollectionInput(\r\n listPageState.pageType,\r\n this.props.context.request.apiSettings,\r\n {\r\n Paging: {\r\n Top: this.props.config.itemsPerPage,\r\n Skip: Math.max(listPageState.pageSize * (listPageState.currentPageNumber || 0), 0)\r\n },\r\n count: true,\r\n Sorting: listPageState.sortingCritera || {}\r\n },\r\n listPageState.activeFilters || [],\r\n\r\n +(this.props.context.request.urlTokens.itemId || 0),\r\n this.props.context.request.query && this.props.context.request.query.q\r\n ? this.props.context.request.query.q\r\n : this.props.context.request.query?.productId,\r\n this.props &&\r\n this.props.config &&\r\n this.props.config.includeAttributes !== undefined &&\r\n this.props.config.includeAttributes === true\r\n ? true\r\n : false,\r\n this.props.context.request.locale,\r\n this.props.context.request.url.requestUrl.pathname\r\n );\r\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\r\n getCollectionProducts(input, this.props.context.actionContext).then(productResults => {\r\n listPageState.activeProducts = productResults.products;\r\n listPageState.totalProductCount = productResults.count;\r\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\r\n this._getActivePrice();\r\n if (\r\n this.props.config.enableAffiliationBasedPricing &&\r\n this.props.context.actionContext.requestContext?.user?.isAuthenticated\r\n ) {\r\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\r\n this._getActivePrice();\r\n }\r\n });\r\n }\r\n );\r\n });\r\n });\r\n if (this.props.config.enableAffiliationBasedPricing && this.props.context.actionContext.requestContext?.user?.isAuthenticated) {\r\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\r\n this._getActivePrice();\r\n }\r\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\r\n this.props.data.listPageState.then(listPageState => {\r\n if (listPageState.pageType === 'Search' && this.props.data.products.result?.count === 0) {\r\n this.props.context.actionContext.update(new SrpBreadcrumbPageInput(), { breadcrumbCheck: true });\r\n }\r\n });\r\n // VSI Customization - START - 22023\r\n const validRefiners =\r\n this.props.data.refiners.result &&\r\n this.props.data.refiners.result.filter(refiner => {\r\n return refiner.Values.length > 0;\r\n });\r\n const sizeRefinerArr: (string | undefined | ProductRefinerValue)[] = [];\r\n const sizeRefinerObjArr = validRefiners && validRefiners.filter(refiner => refiner?.KeyName?.toLowerCase() === 'size');\r\n sizeRefinerObjArr && sizeRefinerObjArr?.length > 0\r\n ? sizeRefinerObjArr[0]?.Values?.map(obj => sizeRefinerArr.push(obj?.LeftValueBoundString?.toLowerCase()))\r\n : [];\r\n\r\n const configVirtualRefinerNames = getVirtualRefinerNames(this.props.context.request, this.isMattressesCategory);\r\n const virtualRefinersArr: (string | undefined)[] = [];\r\n configVirtualRefinerNames &&\r\n configVirtualRefinerNames.map((refinerStrName: string) => {\r\n const virtualRefinerObjArr =\r\n validRefiners && validRefiners.filter(refiner => refiner?.KeyName?.toLowerCase() === refinerStrName);\r\n virtualRefinerObjArr?.map(virtualRefiner =>\r\n virtualRefiner.Values?.map(obj => virtualRefinersArr.push(obj?.LeftValueBoundString?.toLowerCase()))\r\n );\r\n });\r\n const currentSortedOption = this._getCurrentlySelectedOption();\r\n const options: SortColumn[] = [this._getSortColumnFromSelectedOption(currentSortedOption || { key: sortOptions.sortByOptionRelevanceDesc, value: this.props.resources.sortByOptionRelevanceDesc })];\r\n this.setState({\r\n sortedOptions: options,\r\n allSizeRefinerValues: sizeRefinerArr,\r\n allVirtualRefiners: virtualRefinersArr\r\n });\r\n // VSI Customization - END - 22023\r\n }\r\n public componentDidUpdate(\r\n prevProps: IMfrmSearchResultContainerProps,\r\n prevState: ISearchResultContainerState\r\n ): void {\r\n const menusData =\r\n this.props.data.navMenuState.result?.menuItemData !== undefined ? this.props.data.navMenuState.result?.menuItemData : undefined;\r\n if (this.currentNavMenu === undefined || this.currentNavMenu.length <= 0) {\r\n if (menusData !== undefined) {\r\n this._filterMenuItem(menusData, this.currentNavMenu);\r\n const menuItemData = this.currentNavMenu[0];\r\n if (menuItemData !== undefined) {\r\n if (\r\n menuItemData.mattressMatcherBannerID !== this.state.lastBannerID &&\r\n menuItemData.mattressMatcherBannerID !== undefined &&\r\n menuItemData.mattressMatcherBannerID.length > 0\r\n ) {\r\n this._updateMattressMatcherBannerSlot(menuItemData);\r\n }\r\n if (menuItemData.mattressMatcherBannerID === undefined || menuItemData.mattressMatcherBannerID.length <= 0) {\r\n if (this.state.matcherBannerSlotInd > -1) {\r\n this.setState({ matcherBannerSlotInd: -1, lastBannerID: '' });\r\n }\r\n }\r\n }\r\n }\r\n }\r\n if (this.state.sortedOptions[0]?.ColumnName !== prevState.sortedOptions[0]?.ColumnName || this.state.sortedOptions[0]?.IsDescending !== prevState.sortedOptions[0]?.IsDescending) {\r\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\r\n this.props.data.listPageState.then(listPageState => {\r\n // Initialize reaction based on listPageState properties\r\n const input = new GetFullProductsByCollectionInput(\r\n listPageState.pageType,\r\n this.props.context.request.apiSettings,\r\n {\r\n Paging: {\r\n Top: this.props.config.itemsPerPage,\r\n Skip: Math.max(listPageState.pageSize * (listPageState.currentPageNumber || 0), 0)\r\n },\r\n count: true,\r\n Sorting: listPageState.sortingCritera || {}\r\n },\r\n listPageState.activeFilters || [],\r\n\r\n +(this.props.context.request.urlTokens.itemId || 0),\r\n this.props.context.request.query && this.props.context.request.query.q\r\n ? this.props.context.request.query.q\r\n : this.props.context.request.query?.productId,\r\n this.props &&\r\n this.props.config &&\r\n this.props.config.includeAttributes !== undefined &&\r\n this.props.config.includeAttributes === true\r\n ? true\r\n : false,\r\n this.props.context.request.locale,\r\n this.props.context.request.url.requestUrl.pathname\r\n );\r\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\r\n getCollectionProducts(input, this.props.context.actionContext).then(productResults => {\r\n listPageState.activeProducts = productResults.products;\r\n listPageState.totalProductCount = productResults.count;\r\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\r\n this._getActivePrice();\r\n if (\r\n this.props.config.enableAffiliationBasedPricing &&\r\n this.props.context.actionContext.requestContext?.user?.isAuthenticated\r\n ) {\r\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\r\n this._getActivePrice();\r\n }\r\n });\r\n });\r\n }\r\n }\r\n\r\n // tslint:disable-next-line: cyclomatic-complexity\r\n public render(): JSX.Element {\r\n const {\r\n config: {\r\n imageSettings,\r\n allowBackNavigation: shouldAllowBackNavigation,\r\n className\r\n },\r\n data: {\r\n products: productCollection,\r\n listPageState\r\n },\r\n resources\r\n } = this.props;\r\n const seoDataEntry = this.props.data.seoData?.result;\r\n const activeProducts = listPageState.result?.activeProducts;\r\n const products = !MsDyn365.isBrowser && !ArrayExtensions.hasElements(activeProducts) ? productCollection.result?.products ?? [] : activeProducts ?? [];\r\n const searchProduct = (this.props.data.listPageState.result && this.props.data.listPageState.result.featureProduct) || null;\r\n let errorText = '';\r\n const breadCrumbType: string = this.props.context.app.config.breadcrumbType;\r\n const shouldAllowBack = shouldAllowBackNavigation && (breadCrumbType === 'back' || breadCrumbType === 'categoryAndBack');\r\n if (!ArrayExtensions.hasElements(products)) {\r\n errorText = this._pageType === 'Category' ? resources.resultCategoryNotFoundText : resources.resultSearchNotFoundText;\r\n }\r\n const productsComponent = (\r\n \r\n );\r\n\r\n const featureComponent = (\r\n \r\n );\r\n const selectedFiltersCount = this.props.data.listPageState.result && this.props.data.listPageState.result.activeFilters?.length;\r\n const categoryNameFromSlug = (this.props?.data?.category?.result?.Name && this.props?.data?.category?.result?.Name) || '';\r\n const isCategoryPage: boolean = this._getIsCategoryPage();\r\n const activeRefiners = (this.props.data.listPageState.result && this.props.data.listPageState.result.activeFilters) || [];\r\n const searchResultContainerViewProps = {\r\n ...this.props,\r\n products: productsComponent,\r\n TitleViewProps: this._getCollectionTitle(),\r\n categoryHierarchy: !this.props.config.disableHierarchy && this._getCategoryHierarchy(),\r\n refineMenu: this._getRefineMenu(),\r\n className: classnames('ms-search-result-container', className),\r\n SearchResultContainer: {\r\n moduleProps: this.props,\r\n className: classnames('ms-search-result-container', className)\r\n },\r\n sortByOptions: this.props.data.listPageState.result ? this._getSortingDropDown() : null,\r\n pagination: this._getPagination(),\r\n ProductsContainer: { className: 'ms-search-result-container__Products' },\r\n ProductSectionContainer: { className: 'ms-search-result-container__product-section' },\r\n CategoryNavContainer: { className: 'ms-search-result-container__category-nav-section' },\r\n RefineAndProductSectionContainer: { className: 'ms-search-result-container__refine-product-section' },\r\n choiceSummary: this._getChoiceSummary(),\r\n clearAllBtn: this._getChoiceSummary(true, true),\r\n modalToggle: this.props.data.listPageState.result ? (\r\n 0 ? `(${selectedFiltersCount})` : ''}`}\r\n ariaLabel={resources.modalTitle}\r\n innerRef={this._modalToggleRef}\r\n onClick={this._toggleModal}\r\n id='search-result-modal'\r\n />\r\n ) : null,\r\n searchResultModal: this._getSearchResultModal(),\r\n isMobile: this.isMobile,\r\n errorMessage: errorText && ,\r\n showCategoryBanner: this.state.showCategoryBanner,\r\n categoryBannerInd: this.state.categoryBannerIndex,\r\n matcherBannerSlotInd: this.state.matcherBannerSlotInd,\r\n FeatureSearchContainer: { className: 'ms-feature-search-result' },\r\n similarLookProduct: searchProduct ? featureComponent : null,\r\n productPrices: this.productPrices,\r\n getScrolledProducts: this._getProductInfo,\r\n addedProducts: this.state.addedProducts,\r\n onlyNewProducts: this.state.onlyNewProducts,\r\n refinerRedirect: this.state.isRefinerRedirectEnabled,\r\n isCategoryPage: isCategoryPage,\r\n categoryNameFromSlug: categoryNameFromSlug,\r\n seoDataEntry: seoDataEntry,\r\n activeRefiners: activeRefiners,\r\n showProductsLoader: this.state.showProductsLoader\r\n };\r\n return this.props.renderView(searchResultContainerViewProps) as React.ReactElement;\r\n }\r\n\r\n private _filterMenuItem = (menuItemList: IMenuItemData[], currentNavigation: IMenuItemData[]) => {\r\n if (menuItemList.length > 0) {\r\n menuItemList.map((item: IMenuItemData) => {\r\n const foundCurrentNavMenu = this._updateMattressMatcherBannerWithUrlOnly(item);\r\n\r\n if (foundCurrentNavMenu && item.mattressMatcherBannerID !== '') {\r\n this.currentNavMenu.push(item);\r\n return item;\r\n } else if (item.subMenu) {\r\n this._filterMenuItem(item.subMenu, currentNavigation);\r\n }\r\n return;\r\n });\r\n }\r\n };\r\n\r\n private _updateMattressMatcherBannerWithUrlOnly = (navMenuItem: IMenuItemData) => {\r\n if (navMenuItem === undefined) {\r\n return false;\r\n }\r\n const destinationURL = navMenuItem.clpLink?.destinationUrl !== undefined ? navMenuItem.clpLink?.destinationUrl : '';\r\n const linkURL = navMenuItem.linkURL !== undefined ? navMenuItem.linkURL : '';\r\n\r\n if ((destinationURL === undefined || destinationURL === '') && (linkURL === undefined || linkURL === '')) {\r\n return false;\r\n }\r\n let toCheckURL = '';\r\n if (linkURL !== '' && destinationURL !== '') {\r\n toCheckURL = destinationURL !== undefined ? destinationURL : '';\r\n } else if (linkURL !== '' && destinationURL === '') {\r\n toCheckURL = linkURL !== undefined ? linkURL : '';\r\n } else if (linkURL === '' && destinationURL !== '') {\r\n toCheckURL = destinationURL !== undefined ? destinationURL : '';\r\n } else {\r\n return false;\r\n }\r\n return this._parseLink(toCheckURL);\r\n };\r\n\r\n private _parseLink = (toCheckURL: string): boolean => {\r\n if (toCheckURL === '/') {\r\n return false;\r\n }\r\n\r\n if (toCheckURL !== '' && toCheckURL.includes(this.props.context.actionContext.requestContext.url.requestUrl.pathname)) {\r\n return true;\r\n }\r\n\r\n return false;\r\n };\r\n private _updateMattressMatcherBannerSlot = (navMenuItem: IMenuItemData) => {\r\n if (navMenuItem !== undefined) {\r\n if (this.props.slots.mattressMatcherBanner && this.props.slots.mattressMatcherBanner.length > 0) {\r\n for (let i = 0; i < this.props.slots.mattressMatcherBanner.length; i++) {\r\n const moduleIds = get(this.props.slots.mattressMatcherBanner[i], 'props.config.moduleId') || '';\r\n if (moduleIds.length > 0) {\r\n const splittedIDs = moduleIds.split(',');\r\n for (let k = 0; k < splittedIDs.length; k++) {\r\n if (splittedIDs[k] === navMenuItem.mattressMatcherBannerID) {\r\n this.setState({ matcherBannerSlotInd: i, lastBannerID: splittedIDs[k] });\r\n return true;\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n this.setState({ matcherBannerSlotInd: -1, lastBannerID: '' });\r\n return false;\r\n };\r\n\r\n private _updateMattressMatcherBanner = (navMenuItem: IMenuItemData) => {\r\n if (navMenuItem !== undefined) {\r\n if (this.props.slots.mattressMatcherBanner && this.props.slots.mattressMatcherBanner.length > 0) {\r\n for (let i = 0; i < this.props.slots.mattressMatcherBanner.length; i++) {\r\n const bannerIDs = get(this.props.slots.mattressMatcherBanner[i], 'props.config.bannerID') || '';\r\n const moduleIds = get(this.props.slots.mattressMatcherBanner[i], 'props.config.moduleId') || '';\r\n if (bannerIDs.length > 0) {\r\n const splittedIDs = bannerIDs.split(',');\r\n for (let k = 0; k < splittedIDs.length; k++) {\r\n if (splittedIDs[k] === navMenuItem.mattressMatcherBannerID) {\r\n this.setState({ matcherBannerSlotInd: i, lastBannerID: splittedIDs[k] });\r\n return true;\r\n }\r\n }\r\n }\r\n if (moduleIds.length > 0) {\r\n const splittedIDs = moduleIds.split(',');\r\n for (let k = 0; k < splittedIDs.length; k++) {\r\n if (splittedIDs[k] === navMenuItem.mattressMatcherBannerID) {\r\n this.setState({ matcherBannerSlotInd: i, lastBannerID: splittedIDs[k] });\r\n return true;\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n return false;\r\n };\r\n\r\n private _getCategoryBanner = () => {\r\n let flag = false;\r\n if (this.props.data.navMenuState.result && this.props.slots.categoryBanner[0]) {\r\n const navMenuSelectedMenu = this.props.data.navMenuState.result.selectedNavMenu;\r\n this.props.slots.categoryBanner &&\r\n this.props.slots.categoryBanner.map((item, index) => {\r\n const moduleId = get(item, 'props.config.moduleId') || '';\r\n if (moduleId === navMenuSelectedMenu) {\r\n if (this.state.categoryBannerIndex === 0 && index === 0 && !this.state.showCategoryBanner) {\r\n this.setState({\r\n showCategoryBanner: true\r\n });\r\n flag = true;\r\n }\r\n if (this.state.categoryBannerIndex !== index) {\r\n this.setState({\r\n showCategoryBanner: true,\r\n categoryBannerIndex: index\r\n });\r\n flag = true;\r\n }\r\n return;\r\n }\r\n });\r\n }\r\n if (!flag && this.state.showCategoryBanner && this.state.categoryBannerIndex !== 0) {\r\n this.setState({\r\n showCategoryBanner: false\r\n });\r\n }\r\n };\r\n\r\n private _getActivePrice = async (): Promise => {\r\n let products = (this.props.data.listPageState.result && this.props.data.listPageState.result.activeProducts) || [];\r\n const productRecIds: number[] = [];\r\n\r\n products.length ? products.map(prod => {\r\n if (prod.IsMasterProduct) {\r\n const lowestVariantId = prod?.AttributeValues?.find(attributeValue => attributeValue.Name === \"EcomLowestPriceVariantRecId\")?.TextValue;\r\n productRecIds.push(isNaN(Number(lowestVariantId)) ? Number(prod?.MasterProductId) : Number(lowestVariantId));\r\n } else {\r\n productRecIds.push(Number(prod?.RecordId));\r\n }\r\n }) : [];\r\n const projectDomain: ProjectionDomain = {\r\n ChannelId: this.props.context.request.apiSettings.channelId,\r\n CatalogId: this.props.context.request.apiSettings.catalogId\r\n };\r\n const affliations: AffiliationLoyaltyTier[] = [];\r\n const customerInput = new GetCustomerInput(this.props.context.actionContext.requestContext.apiSettings);\r\n const customer = await getCustomer(customerInput, this.props.context.actionContext);\r\n\r\n if (customer && customer.CustomerAffiliations) {\r\n customer.CustomerAffiliations.forEach((affliation: CustomerAffiliation) => {\r\n const aff: AffiliationLoyaltyTier = { AffiliationId: affliation.RetailAffiliationId, CustomerId: customer.AccountNumber };\r\n affliations.push(aff);\r\n });\r\n }\r\n\r\n await getActivePricesAsync(\r\n { callerContext: this.props.context.actionContext, queryResultSettings: {} },\r\n projectDomain,\r\n productRecIds,\r\n new Date(),\r\n null,\r\n affliations,\r\n true\r\n )\r\n .then((activePricesResponse: ProductPrice[]) => {\r\n this.productPrices = activePricesResponse;\r\n products = products.map(prod => {\r\n let prodVariantId: number;\r\n if (prod.IsMasterProduct) {\r\n prodVariantId = Number(prod?.AttributeValues?.find(attributeValue => attributeValue.Name === \"EcomLowestPriceVariantRecId\")?.TextValue);\r\n } else {\r\n prodVariantId = Number(prod?.RecordId);\r\n }\r\n const activePrice = activePricesResponse.find(price => price.ProductId === prodVariantId);\r\n if (activePrice) {\r\n prod.Price = activePrice.CustomerContextualPrice ?? prod.Price;\r\n prod.BasePrice = Math.max(\r\n activePrice.BasePrice || 0,\r\n activePrice.TradeAgreementPrice || 0,\r\n activePrice.AdjustedPrice || 0\r\n );\r\n }\r\n return prod;\r\n });\r\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\r\n this.props.data.listPageState.then(listPageState => {\r\n listPageState.activeProducts = products;\r\n });\r\n })\r\n .catch((error: Error) => {\r\n this.props.context.actionContext.trace(error.message);\r\n this.props.context.actionContext.telemetry.exception(error);\r\n this.props.context.actionContext.telemetry.debug(\r\n `[get Affiliation based price on search result container ]Error executing action`\r\n );\r\n throw new Error('[get Affiliation based price on search result container]Error executing action');\r\n });\r\n };\r\n private _getActivePriceByProducts = async (products: ProductSearchResult[]): Promise => {\r\n const productRecIds: number[] = [];\r\n products.length ? products.map(prod => {\r\n if (prod.IsMasterProduct) {\r\n const lowestVariantId = prod?.AttributeValues?.find(attributeValue => attributeValue.Name === \"EcomLowestPriceVariantRecId\")?.TextValue;\r\n productRecIds.push(isNaN(Number(lowestVariantId)) ? Number(prod?.MasterProductId) : Number(lowestVariantId));\r\n } else {\r\n productRecIds.push(Number(prod?.RecordId));\r\n }\r\n }) : [];\r\n const projectDomain: ProjectionDomain = {\r\n ChannelId: this.props.context.request.apiSettings.channelId,\r\n CatalogId: this.props.context.request.apiSettings.catalogId\r\n };\r\n const affliations: AffiliationLoyaltyTier[] = [];\r\n const customerInput = new GetCustomerInput(this.props.context.actionContext.requestContext.apiSettings);\r\n const customer = await getCustomer(customerInput, this.props.context.actionContext);\r\n\r\n if (customer && customer.CustomerAffiliations) {\r\n customer.CustomerAffiliations.forEach((affliation: CustomerAffiliation) => {\r\n const aff: AffiliationLoyaltyTier = { AffiliationId: affliation.RetailAffiliationId, CustomerId: customer.AccountNumber };\r\n affliations.push(aff);\r\n });\r\n }\r\n\r\n return getActivePricesAsync(\r\n { callerContext: this.props.context.actionContext, queryResultSettings: {} },\r\n projectDomain,\r\n productRecIds,\r\n new Date(),\r\n null,\r\n affliations,\r\n true\r\n )\r\n .then((activePricesResponse: ProductPrice[]) => {\r\n this.productPrices = activePricesResponse;\r\n return products.map(prod => {\r\n const variantId = prod.IsMasterProduct ? Number(prod.AttributeValues?.find(attributeValue => attributeValue.Name === \"EcomLowestPriceVariantRecId\")?.TextValue) : prod.RecordId;\r\n const activePrice = activePricesResponse.find(price => price.ProductId === variantId);\r\n if (activePrice) {\r\n prod.Price = activePrice.CustomerContextualPrice ?? prod.Price;\r\n prod.BasePrice = Math.max(\r\n activePrice.BasePrice || 0,\r\n activePrice.TradeAgreementPrice || 0,\r\n activePrice.AdjustedPrice || 0\r\n );\r\n }\r\n return prod;\r\n });\r\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\r\n //return products;\r\n })\r\n .catch((error: Error) => {\r\n this.props.context.actionContext.trace(error.message);\r\n this.props.context.actionContext.telemetry.exception(error);\r\n this.props.context.actionContext.telemetry.debug(\r\n `[get Affiliation based price on search result container ]Error executing action`\r\n );\r\n throw new Error('[get Affiliation based price on search result container]Error executing action');\r\n });\r\n };\r\n private _getSearchResultModal = (): ISearchResultModalViewProps => {\r\n const { resources } = this.props;\r\n return SearchResultModal({\r\n resources: {\r\n modalCloseButtonText: resources.modalCloseButtonText,\r\n modalTitle: resources.modalTitle\r\n },\r\n isOpen: this.state.modalIsOpen,\r\n totalItems: this.props.data && this.props.data.listPageState && this.props.data.listPageState.result?.totalProductCount,\r\n returnRef: this._modalToggleRef,\r\n clearAllBtn: this._getChoiceSummary(true),\r\n onModalToggle: this._toggleModal\r\n });\r\n };\r\n\r\n private _getCollectionTitle = (): ITitleViewProps => {\r\n const { data, context, resources } = this.props;\r\n const seoDataEntry = this.props.data.seoData?.result;\r\n const seoState = seoDataEntry && seoDataEntry['SEO State'];\r\n const seoTitle = seoState === 'Active' && seoDataEntry && seoDataEntry['H1 Tag'];\r\n let collectionTitle: string | undefined = '';\r\n if (context && context.request && context.request.query && context.request.query.q) {\r\n collectionTitle = `${context.request.query.q}`;\r\n } else {\r\n collectionTitle =\r\n seoTitle || (data.category.result &&\r\n SearchResultContainer.getFriendlyName(context.request.locale, data.category.result.NameTranslations)) ||\r\n (data.category.result && data.category.result.Name);\r\n }\r\n let productCountText = '';\r\n let productCountNumber: number | undefined;\r\n if (data.listPageState && data.listPageState.result && data.listPageState.result.totalProductCount !== undefined) {\r\n productCountNumber = data.listPageState.result.totalProductCount;\r\n } else if (data.products && data.products.result) {\r\n productCountNumber = data.products.result.count;\r\n }\r\n\r\n if (productCountNumber && productCountNumber !== 0) {\r\n productCountText =\r\n productCountNumber !== 1\r\n ? format(`${this.props.resources.numberOfProducts} results`, productCountNumber)\r\n : this.props.resources.oneProduct;\r\n } else {\r\n productCountText = format(`${this.props.resources.numberOfProducts} results`, 0);\r\n }\r\n const searchPageTitle =

    {resources.searchPageTitle}

    ;\r\n const titlePrefix = ;\r\n const titleText = collectionTitle && <h1 className='ms-search-result__collection-title-text'>{collectionTitle}</h1>;\r\n const titleCount = <Title className='ms-search-result__collection-title-count' text={productCountText} />;\r\n\r\n return {\r\n TitleContainer: { className: 'ms-search-result-container__title' },\r\n title: {\r\n searchPageTitle: searchPageTitle,\r\n titlePrefix: titlePrefix,\r\n titleText: titleText,\r\n titleCount: titleCount\r\n }\r\n };\r\n };\r\n\r\n private _getCategoryHierarchy = (): ICategoryHierarchyViewProps => {\r\n const { data } = this.props;\r\n const categoryHierarchy = data.categoryHierarchy.result;\r\n const categoryLinks =\r\n categoryHierarchy &&\r\n categoryHierarchy.map((value: CategoryHierarchyData, index: number) => {\r\n return (\r\n <Link\r\n key={index}\r\n text={value.Name}\r\n ariaLabel={`${this.props.resources.categoryLinkAriaLabel} ${value.Name}`}\r\n href={value.Url}\r\n />\r\n );\r\n });\r\n const categoryLinkSeparator = <Separator separator='/' />;\r\n\r\n return {\r\n CategoryHierarchyContainer: { tag: 'nav', className: 'ms-search-result-container__category-hierarchy' },\r\n categoryHierarchyList: categoryLinks,\r\n categoryHierarchySeparator: categoryLinkSeparator\r\n };\r\n };\r\n\r\n private _getSortingDropDown = (): ISortByViewProps => {\r\n const { resources } = this.props;\r\n const activeDropdown = this._getCurrentlySelectedOption() || this.state.sortingState.selectedSortByOption;\r\n const dropdown = (\r\n <UiLabeledDropdown\r\n labelClassname='reviews-list-sort-by'\r\n labelText={resources.sortByDropdownLabel}\r\n dropdownId='categorySortByDropdown'\r\n dropdownClassname='reviews-list-dropdown'\r\n toggleColor='link'\r\n dropdownOptions={this.sortByDropdownOptions}\r\n selectedOption={activeDropdown}\r\n onSelectOption={this._updateSortByDropdown}\r\n ref={this._sortAndFilterContainerRef}\r\n />\r\n );\r\n return {\r\n sortByDropDown: dropdown\r\n };\r\n };\r\n\r\n private _getProductInfo = async () => {\r\n const { data } = this.props;\r\n const listPageState = data && data.listPageState && data.listPageState.result;\r\n\r\n // @ts-ignore\r\n const input = new GetFullProductsByCollectionInput(\r\n listPageState!.pageType,\r\n this.props.context.request.apiSettings,\r\n {\r\n Paging: {\r\n Top: this.props.config.itemsPerPage,\r\n Skip: Math.max(listPageState!.pageSize * (this.state.infiniteScrollPage || 0), 0)\r\n },\r\n count: true,\r\n Sorting: listPageState?.sortingCritera || {}\r\n },\r\n listPageState?.activeFilters || [],\r\n +(this.props.context.request.urlTokens.itemId || 0),\r\n this.props.context.request.query && this.props.context.request.query.q\r\n ? this.props.context.request.query.q\r\n : this.props.context.request.query?.productId,\r\n this.props &&\r\n this.props.config &&\r\n this.props.config.includeAttributes !== undefined &&\r\n this.props.config.includeAttributes === true\r\n ? true\r\n : false,\r\n this.props.context.request.locale\r\n );\r\n\r\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\r\n getProducts(input, this.props.context.actionContext).then(actionResponse => {\r\n if (actionResponse.products.length) {\r\n const currentProducts = (data.listPageState.result && data.listPageState.result.activeProducts) || [];\r\n const returnedProducts = actionResponse.products.filter(product => typeof product === 'object');\r\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\r\n this._getActivePriceByProducts(returnedProducts);\r\n const infiniteProducts = this.state.addedProducts.length\r\n ? this.state.addedProducts.concat(returnedProducts)\r\n : currentProducts.concat(returnedProducts);\r\n this.setState({ addedProducts: infiniteProducts, onlyNewProducts: returnedProducts });\r\n this.setState({ infiniteScrollPage: this.state.infiniteScrollPage + 1 });\r\n }\r\n });\r\n };\r\n\r\n private _getPagination = (): React.ReactNode => {\r\n const { config, context, data, resources } = this.props;\r\n const listPageState = data && data.listPageState && data.listPageState.result;\r\n const fullUrl = getCurrentUrl(context.request);\r\n const itemsPerPage = config.itemsPerPage || 10;\r\n const skipCount =\r\n listPageState && listPageState.currentPageNumber !== null\r\n ? listPageState.currentPageNumber * (this.props.config.itemsPerPage || 10)\r\n : (this.props.context.request.query && +this.props.context.request.query.skip) || 0;\r\n const totalItems = (listPageState && listPageState.totalProductCount) || 0;\r\n const previousText = resources.flipperPrevious;\r\n const nextText = resources.flipperNext;\r\n\r\n if (totalItems <= itemsPerPage) {\r\n return null;\r\n }\r\n return (\r\n <UncontrolledPagination\r\n className='ms-search-result-container__pagination'\r\n role='navigation'\r\n aria-label={resources.paginationAriaLabel}\r\n url={fullUrl.href}\r\n qsp={'skip'}\r\n items={totalItems}\r\n itemsPerPage={itemsPerPage}\r\n startingItem={skipCount}\r\n previousText={\r\n <div className='msc-pagination__prev'>\r\n <span className='ms-search-result__pagination-left' aria-hidden='true' />\r\n <span className='prev-text'>{previousText}</span>\r\n </div>\r\n }\r\n nextText={\r\n <div className='msc-pagination__next'>\r\n <span className='next-text'>{nextText}</span>\r\n <span className='ms-search-result__pagination-right' aria-hidden='true' />\r\n </div>\r\n }\r\n previousAriaLabel={previousText}\r\n nextAriaLabel={nextText}\r\n telemetryContent={this.telemetryContent}\r\n />\r\n );\r\n };\r\n\r\n // tslint:disable: max-func-body-length cyclomatic-complexity\r\n private _getRefineMenu = (): IRefineMenuViewProps => {\r\n const { data, context, config, resources } = this.props;\r\n const tempRangeTypeTODO = context.request.query && context.request.query.inputRange ? 'input' : 'slider';\r\n const validRefiners =\r\n data.refiners.result &&\r\n data.refiners.result.filter(refiner => {\r\n return refiner.Values.length > 0;\r\n });\r\n let sizeRefinerArr: (string | undefined)[] = [];\r\n validRefiners &&\r\n validRefiners.map(refiner => {\r\n if (refiner && refiner?.KeyName?.toLowerCase() === 'size') {\r\n sizeRefinerArr = refiner?.Values?.map(obj => obj?.LeftValueBoundString?.toLowerCase());\r\n }\r\n });\r\n let isPriceRefinerHide = false;\r\n const isAnySizeSelectedArr = this.props?.data?.listPageState?.result?.activeFilters?.filter(obj =>\r\n sizeRefinerArr.includes(obj?.LeftValueBoundString?.toLowerCase())\r\n );\r\n if (isAnySizeSelectedArr && isAnySizeSelectedArr?.length > 0) {\r\n isPriceRefinerHide = true;\r\n }\r\n const activeRefiners = (data.listPageState.result && data.listPageState.result.activeFilters) || [];\r\n const defaultOpenRefinersArray: string[] = [];\r\n const selectedRefinersParentName: string[] = [];\r\n\r\n activeRefiners &&\r\n activeRefiners.length > 0 &&\r\n activeRefiners.map((selectedRefiner: ProductRefinerValue) => {\r\n const obj = {\r\n key: this._getKeyForRefinerValue(selectedRefiner),\r\n parentName: this._getParentKeyForRefinerValue(selectedRefiner)\r\n };\r\n selectedRefinersParentName.push(obj.parentName.trim().toLowerCase());\r\n });\r\n config.defaultOpenRefinements?.map(refiner => {\r\n // @ts-ignore\r\n defaultOpenRefinersArray.push(refiner.refiner.trim().toLowerCase());\r\n });\r\n const determineExpanded = (product: IProductRefinerHierarchy) => {\r\n const refinerNamesForInitialOpen = selectedRefinersParentName.concat(...defaultOpenRefinersArray);\r\n return product.KeyName && refinerNamesForInitialOpen?.includes(product.KeyName.trim().toLowerCase()) ? true : false;\r\n };\r\n\r\n // VSI Customization - START - 22023\r\n // get attribute value to show or hide Price refinement\r\n const isSizeRefinementBooleanValue = this.isMattressesCategory ? true : false;\r\n // VSI Customization - START - 23629\r\n const refinementExcludeListString = this.props.config.refinementExcludeList;\r\n const refinementExcludeListArr = refinementExcludeListString?.split(',');\r\n const refinementExcludeListNorm = refinementExcludeListArr?.map(refinerName => refinerName.trim().toLowerCase());\r\n // VSI Customization - END - 23629\r\n\r\n // VSI Customization - Start 7924\r\n const requestContext = context && context.request;\r\n // get category slug\r\n let slug = (this.props.data.category.result && this.props.data.category.result.Slug) || '';\r\n let slugArray: string[];\r\n let pathArray: string[];\r\n let refinerParts: string[] = [];\r\n let urlPartsObject: IRefineItemURLParts;\r\n const isSizeRefinement = this.props?.data.category.result?.ExtensionProperties?.find(attr => attr.Key === 'SizeRefinementEnable')\r\n ?.Value?.BooleanValue;\r\n const configVirtualRefinerNames = getVirtualRefinerNames(this.props.context.request, isSizeRefinement);\r\n const filteredRefiners =\r\n this.props.data.refiners.result &&\r\n this.props.data.refiners.result.filter(refiner => {\r\n return refiner.KeyName && configVirtualRefinerNames.indexOf(refiner.KeyName.toLowerCase()) !== -1;\r\n });\r\n const sortedConfigValues = getSortedVirtualRefinerConfig(this.props.context.request, this.isMattressesCategory);\r\n if (sortedConfigValues && slug) {\r\n const params = MsDyn365.isBrowser && window.location;\r\n const origin = params && params.origin === 'https://localhost:4000' ? params.origin : requestContext.url.requestUrl.origin;\r\n slugArray = slug.split('/').splice(1);\r\n // remove keywords form slugArray\r\n slugArray = removeKeywords(slugArray, this.props.context.request);\r\n // FIX reset slug to without keywords\r\n slug = slugArray.join('/');\r\n\r\n // path of URL\r\n let path = this.props.context.request.url.requestUrl.pathname.toLowerCase();\r\n\r\n // remove category id {categoryid}.c\r\n const categoryIdToken = requestContext.urlTokens.recordId;\r\n const categoryId = categoryIdToken ? `${categoryIdToken}.c` : undefined;\r\n\r\n if (categoryId) {\r\n path = path.replace(`/${categoryId}`, '');\r\n }\r\n // remove category slug\r\n // FIX remove keywords from path\r\n pathArray = removeKeywords(path.split('/').splice(1), this.props.context.request);\r\n path = pathArray.join('/');\r\n const removedCategorySlug = path.split(slug).splice(1)[0];\r\n\r\n if (removedCategorySlug !== '') {\r\n refinerParts = decodeURIComponent(removedCategorySlug).split('/');\r\n }\r\n\r\n if (refinerParts && refinerParts.length > 0 && slugArray && slugArray.length > 0) {\r\n // remove duplicates if any from the first url part\r\n slugArray.forEach(_slug => {\r\n refinerParts.forEach(refinerPart => {\r\n const index = slugArray.indexOf(refinerPart);\r\n if (index !== -1) {\r\n slugArray.splice(index, 1);\r\n }\r\n });\r\n });\r\n }\r\n\r\n // break final refiners so array contains single values instead of pipe sign values\r\n const finalRefinerParts: string[] = [];\r\n refinerParts.forEach(refinerPart => {\r\n refinerPart.split('|').map(item => finalRefinerParts.push(item));\r\n });\r\n\r\n refinerParts = finalRefinerParts && flatten(finalRefinerParts);\r\n refinerParts = refinerParts.filter(refiner => {\r\n return refiner.length > 0;\r\n });\r\n\r\n urlPartsObject = {\r\n origin,\r\n categoryPart: slugArray.join('/'),\r\n categoryId\r\n };\r\n }\r\n // VSI Customization - End 7924\r\n const subMenus =\r\n validRefiners &&\r\n validRefiners.map((productRefinerHierarchy: IProductRefinerHierarchy, index: number) => {\r\n // VSI Customization - START - 23629\r\n const excludedElement = refinementExcludeListNorm?.find(\r\n refinerName => productRefinerHierarchy?.KeyName?.trim().toLowerCase() === refinerName\r\n );\r\n if (excludedElement) {\r\n return undefined;\r\n }\r\n // VSI Customization - END - 23629\r\n\r\n return (\r\n <RefineSubmenu\r\n productRefinerHierarchy={productRefinerHierarchy}\r\n selectedRefinerValues={activeRefiners}\r\n refineItemCommonProps={this._refineItemCommonProps}\r\n minValueSliderThumbAriaLabel={this.props.resources.minValueSliderThumbAriaLabel}\r\n maxValueSliderThumbAriaLabel={this.props.resources.maxValueSliderThumbAriaLabel}\r\n refinerShowMoreText={this.props.resources.refinerShowMoreText}\r\n refinerShowLessText={this.props.resources.refinerShowLessText}\r\n key={index}\r\n onUpdateRefiners={this._onUpdateRefiners}\r\n urlBuilder={this._buildRefinerUrl}\r\n isDisabled={false}\r\n isExpandedOnInitialLoad={determineExpanded(productRefinerHierarchy)}\r\n tempRangeTypeTODO={tempRangeTypeTODO}\r\n context={context}\r\n moduleId={this.props.id}\r\n moduleTypeName={this.props.typeName}\r\n telemetryContent={this.telemetryContent}\r\n refinerNumberOfItemsToDisplay={this._getRefinerLimitToDisplay}\r\n isMattressesCategory={this.isMattressesCategory}\r\n urlRefinerParts={refinerParts}\r\n urlParts={urlPartsObject}\r\n sortedConfigValues={sortedConfigValues}\r\n filteredRefiners={filteredRefiners}\r\n isPriceRefinerDisabled={isPriceRefinerHide && isSizeRefinementBooleanValue}\r\n isCategoryPage={this._getIsCategoryPage()}\r\n refineItemAriaLabel={this.props.resources.refineItemAriaLabel}\r\n refineItemsAriaLabel={this.props.resources.refineItemsAriaLabel}\r\n singleProductCountAriaLabel={this.props.resources.singleProductCountAriaLabel}\r\n isMobile={this.isMobile}\r\n />\r\n );\r\n });\r\n\r\n return {\r\n RefineMenuContainer: { className: 'ms-search-result-container__refine-menu' },\r\n RefinerSectionContainer: { className: 'ms-search-result-container__refiner-section' },\r\n refiners: subMenus,\r\n refinerLabel: resources.mfrmRefinerLabel\r\n };\r\n };\r\n private _getRefinerLimitToDisplay = (keyName: string): number | undefined => {\r\n // this function will filter name of refiner to get its manual added value to limit No of items\r\n return this.props.config.defaultOpenRefinements?.filter(refiner =>\r\n keyName === 'Size' ? refiner.refinerNumberOfItemsToDisplay : undefined\r\n )[0]?.refinerNumberOfItemsToDisplay;\r\n };\r\n private _getChoiceSummary = (clearAllModal: boolean = false, clearAllBtn: boolean = false): React.ReactNode => {\r\n const { resources, data, telemetry } = this.props;\r\n const selectedRefiners = (data.listPageState.result && data.listPageState.result.activeFilters) || [];\r\n return (\r\n <ChoiceSummary\r\n classNames='ms-choice-summary-by-category'\r\n clearAllText={resources.clearAllText}\r\n label={resources.choiceSummaryLabel}\r\n selectedChoices={selectedRefiners}\r\n clearAllModal={clearAllModal}\r\n // @ts-ignore: NOTE Type-unsafe line below, null refinersByCategoryHierarchy case not handled\r\n refinerHierarchy={data.refiners.result}\r\n choiceFormat={resources.choiceFormat}\r\n choiceRangeValueFormat={resources.choiceRangeValueFormat}\r\n telemetry={telemetry}\r\n onChoiceClicked={this._onChoiceClicked}\r\n urlBuilder={this._buildRefinerUrlForChoiceSummary}\r\n customUrlBuilder={this._customBuildRefinerUrlForChoiceSummary}\r\n choiceAriaLabel={resources.choiceAriaLabel}\r\n telemetryContent={this.telemetryContent}\r\n clearAllBtn={clearAllBtn}\r\n closeAriaLabel={resources.closeAriaLabel}\r\n />\r\n );\r\n };\r\n private _updateSortByDropdown = (notification: ILabeledDropdownOnChangeNotification): void => {\r\n const {\r\n context: {\r\n request: requestContext,\r\n actionContext\r\n }\r\n } = this.props;\r\n // @ts-ignore\r\n if (MsDyn365.isBrowser && utag) {\r\n // @ts-ignore\r\n // tslint:disable-next-line: object-literal-key-quotes\r\n utag.link({\r\n event: 'PLP-sort-action',\r\n event_category: 'PLP Sort Action',\r\n event_action: 'PLP Sort Applied',\r\n event_label: `${notification.selectedOption.value}`,\r\n event_noninteraction: 'false'\r\n });\r\n }\r\n this.setState({ addedProducts: [], onlyNewProducts: [], infiniteScrollPage: 1 });\r\n if (!requestContext || !actionContext || !this.props.data.listPageState.result) {\r\n const error = `[sort-by-category] cannot sort without context: ${!requestContext ? 'requestContext ' : ''} ${!actionContext ? 'actionContext ' : ''\r\n } could not be found`;\r\n this.props.telemetry.warning(error);\r\n return;\r\n }\r\n MsDyn365.isBrowser &&\r\n window.history.pushState(\r\n {},\r\n '',\r\n buildListPageUrl(\r\n getCurrentUrl(this.props.context.request),\r\n undefined,\r\n [this._getSortColumnFromSelectedOption(notification.selectedOption)],\r\n undefined\r\n )\r\n );\r\n const options: SortColumn[] = [this._getSortColumnFromSelectedOption(notification.selectedOption)];\r\n this.setState({\r\n sortedOptions: options\r\n });\r\n transaction(() => {\r\n this.props.data.listPageState.result!.currentPageNumber = 0;\r\n this.props.data.listPageState.result!.sortingCritera = {\r\n Columns: [this._getSortColumnFromSelectedOption(notification.selectedOption)]\r\n };\r\n });\r\n };\r\n\r\n private _getSortColumnFromSelectedOption = (option: ILabeledDropdownOption): SortColumn => {\r\n const { data } = this.props;\r\n if (!data.searchConfiguration.result) {\r\n return {};\r\n }\r\n const mappedConfiguration = data.searchConfiguration.result.find(searchConfiguration => {\r\n return searchConfiguration.key === option.key;\r\n });\r\n if (mappedConfiguration) {\r\n return mappedConfiguration.sortColumn;\r\n }\r\n return {};\r\n };\r\n private _getCurrentlySelectedOption = (): ILabeledDropdownOption | undefined => {\r\n const { data } = this.props;\r\n const sortCriteria = data.listPageState.result && data.listPageState.result.sortingCritera;\r\n\r\n const activeSortColumn =\r\n (sortCriteria && sortCriteria.Columns && sortCriteria.Columns[0]) ||\r\n (parseQueryParam<SortColumn[]>('sorting', this.props.context.request) || [])[0];\r\n if (activeSortColumn && data.searchConfiguration.result) {\r\n const activeMappedConfig = data.searchConfiguration.result.find(mappedSearchConfig => {\r\n return (\r\n mappedSearchConfig.sortColumn.ColumnName === activeSortColumn.ColumnName &&\r\n mappedSearchConfig.sortColumn.IsDescending === activeSortColumn.IsDescending\r\n );\r\n });\r\n if (activeMappedConfig) {\r\n return this.sortByDropdownOptions.find(dropdownOption => dropdownOption.key === activeMappedConfig.key);\r\n }\r\n }\r\n return;\r\n };\r\n\r\n // tslint:disable: cyclomatic-complexity\r\n // tslint:disable: max-func-body-length\r\n private _onUpdateRefiners = (itemToggleNotification: IRefineItemToggleNotification): void => {\r\n const {\r\n context: {\r\n request: requestContext,\r\n actionContext\r\n }\r\n } = this.props;\r\n const isCategoryPage: boolean = this._getIsCategoryPage();\r\n if (this._isCustomizedRefiner && isCategoryPage) {\r\n this.setState({ isRefinerRedirectEnabled: true });\r\n }\r\n // @ts-ignore\r\n if (!this.isMobile && utag) {\r\n const { LeftValueBoundLocalizedString, LeftValueBoundString } = itemToggleNotification?.productRefinerValue;\r\n // @ts-ignore\r\n // tslint:disable-next-line: object-literal-key-quotes\r\n utag.link({\r\n event: 'PLP-filter-action',\r\n event_category: 'PLP Filter Action',\r\n event_action: itemToggleNotification?.parentProductRefinerHierarchy.KeyName,\r\n event_label: LeftValueBoundLocalizedString ? LeftValueBoundLocalizedString : LeftValueBoundString,\r\n event_noninteraction: 'false'\r\n });\r\n }\r\n if (!requestContext || !actionContext || !this.props.data.listPageState.result) {\r\n const error = `Refine menu cannot refine search criteria: ${!requestContext ? 'requestContext ' : ''} ${!actionContext ? 'actionContext ' : ''\r\n } could not be found`;\r\n this.props.telemetry.warning(error);\r\n return;\r\n }\r\n this.setState({ addedProducts: [], onlyNewProducts: [], infiniteScrollPage: 1 });\r\n let currentRefinement = (this.props.data.listPageState.result && this.props.data.listPageState.result.activeFilters) || [];\r\n if (this._isCustomizedRefiner && isCategoryPage) {\r\n currentRefinement = (this.props.data.listPageState.result && this.props.data.listPageState.result.activeVirtualFilters) || [];\r\n }\r\n let updatedRefinementCriteria = getUpdatedRefinementCriteria(itemToggleNotification, currentRefinement);\r\n // VSI Customization - START - 22023\r\n if (isCategoryPage) {\r\n const isAnySizeSelectedArr = updatedRefinementCriteria.filter(obj =>\r\n this.state.allSizeRefinerValues.includes(obj?.LeftValueBoundString?.toLowerCase())\r\n );\r\n if (isAnySizeSelectedArr && isAnySizeSelectedArr?.length > 0) {\r\n this.setState({ isPriceRefinerDisabled: true });\r\n updatedRefinementCriteria = this._removePriceAndVirtualRefiner(updatedRefinementCriteria);\r\n } else {\r\n this.setState({ isPriceRefinerDisabled: false });\r\n }\r\n }\r\n // VSI Customization - END - 22023\r\n // PLP-URL\r\n const isSizeRefinement = this.props?.data.category.result?.ExtensionProperties?.find(attr => attr.Key === 'SizeRefinementEnable')\r\n ?.Value?.BooleanValue;\r\n const availableRefiners = getVirtualRefinerNames(this.props.context.request, isSizeRefinement);\r\n if (!isCategoryPage) {\r\n window.history.pushState({}, '', buildListPageUrl(getCurrentUrl(this.props.context.request), updatedRefinementCriteria));\r\n } else if (itemToggleNotification.parentProductRefinerHierarchy.KeyName && availableRefiners.includes(itemToggleNotification.parentProductRefinerHierarchy.KeyName.toLowerCase()) === false) {\r\n this._isCustomizedRefiner ?\r\n window.location.href = buildListPageUrl(getCurrentUrl(this.props.context.request), updatedRefinementCriteria) :\r\n window.history.pushState({}, '', buildListPageUrl(getCurrentUrl(this.props.context.request), updatedRefinementCriteria));\r\n } else {\r\n // url builder\r\n const configVirtualRefinerNames = getVirtualRefinerNames(this.props.context.request, isSizeRefinement);\r\n const filteredRefiners = this.props.data.refiners.result && this.props.data.refiners.result.filter((refiner) => {\r\n return refiner.KeyName && configVirtualRefinerNames.indexOf(refiner.KeyName.toLowerCase()) !== -1;\r\n });\r\n // get category slug\r\n let slug = (this.props.data.category.result && this.props.data.category.result.Slug) || '';\r\n let slugArray: string[];\r\n let pathArray: string[];\r\n const sortedConfigValues = getSortedVirtualRefinerConfig(this.props.context.request, isSizeRefinement);\r\n if (sortedConfigValues && slug) {\r\n const params = MsDyn365.isBrowser && window.location;\r\n const origin = params && params.origin === 'https://localhost:4000' ? params.origin : requestContext.url.requestUrl.origin;\r\n slugArray = slug.split('/').splice(1);\r\n // remove keywords form slugArray\r\n slugArray = removeKeywords(slugArray, this.props.context.request);\r\n // FIX reset slug to without keywords\r\n slug = slugArray.join('/');\r\n\r\n // path of URL\r\n let path = this.props.context.request.url.requestUrl.pathname.toLowerCase();\r\n\r\n // remove category id {categoryid}.c\r\n const categoryIdToken = requestContext.urlTokens.recordId;\r\n const categoryId = categoryIdToken ? `${categoryIdToken}.c` : undefined;\r\n\r\n if (categoryId) {\r\n path = path.replace(`/${categoryId}`, '');\r\n }\r\n // remove category slug\r\n pathArray = removeKeywords(path.split('\\/').splice(1), this.props.context.request);\r\n path = pathArray.join('\\/');\r\n const removedCategorySlug = path.split(slug).splice(1)[0];\r\n let refinerParts: string[] = [];\r\n if (removedCategorySlug !== '') {\r\n refinerParts = decodeURIComponent(removedCategorySlug).split('/');\r\n }\r\n\r\n if (refinerParts && refinerParts.length > 0 && slugArray && slugArray.length > 0) {\r\n // remove duplicates if any from the first url part\r\n slugArray.forEach(_slug => {\r\n refinerParts.forEach(refinerPart => {\r\n const index = slugArray.indexOf(refinerPart);\r\n if (index !== -1) {\r\n slugArray.splice(index, 1);\r\n }\r\n });\r\n });\r\n }\r\n // insert current refiner\r\n itemToggleNotification.isSelecting &&\r\n refinerParts.push(itemToggleNotification.productRefinerValue.LeftValueBoundString!.toLowerCase());\r\n // break final refiners so array contains single values instead of pipe sign values\r\n const finalRefinerParts: string[] = [];\r\n refinerParts.forEach(refinerPart => {\r\n refinerPart.split('|').map(item => finalRefinerParts.push(item.includes('-') ? item : item.split('-').join(' ')));\r\n });\r\n\r\n refinerParts = finalRefinerParts && flatten(finalRefinerParts);\r\n if (itemToggleNotification.isSelecting === false) {\r\n const index = refinerParts.indexOf(itemToggleNotification.productRefinerValue.LeftValueBoundString!.toLowerCase().replace(/\\&/g, 'and').replace(regExSpecialChars(requestContext.app.config.canonicalUrlspecialCharIncludeList), '-'));\r\n if (index !== -1) {\r\n refinerParts.splice(index, 1);\r\n }\r\n }\r\n\r\n // setup object with refiner values\r\n const sortedValues: { [key: string]: string[] } = {};\r\n filteredRefiners?.forEach(refinerSet => {\r\n let refinerName = refinerSet.KeyName;\r\n if (refinerName) {\r\n refinerName = refinerName.toLowerCase();\r\n sortedValues[refinerName] = []; // size, brand, price\r\n }\r\n refinerSet.Values.forEach((refiner) => {\r\n refinerParts.forEach((refinerPart) => {\r\n if (refinerName && refiner.LeftValueBoundString &&\r\n (refiner.LeftValueBoundString.toLowerCase().replace(/\\&/g, 'and').replace(regExSpecialChars(requestContext.app.config.canonicalUrlspecialCharIncludeList), '-') === refinerPart.toLocaleLowerCase().split('-').join(' ')\r\n || refiner.LeftValueBoundString.toLowerCase().replace(/\\&/g, 'and').replace(regExSpecialChars(requestContext.app.config.canonicalUrlspecialCharIncludeList), '-') === refinerPart.toLocaleLowerCase())) {\r\n sortedValues[refinerName].push(refiner.LeftValueBoundString.toLowerCase().split(' ').join('-'));\r\n } else if (refinerName && refiner.LeftValueBoundString &&\r\n refiner.LeftValueBoundString.toLowerCase() === refinerPart.toLocaleLowerCase().split('-').join(' ')) {\r\n sortedValues[refinerName].push(refinerPart);\r\n }\r\n });\r\n });\r\n });\r\n // alpha sort\r\n // @ts-ignore\r\n for (const sortedValue of Object.keys(sortedValues)) {\r\n sortedValues[sortedValue].length > 0 &&\r\n sortedValues[sortedValue].sort((a: string, b: string) => {\r\n if (a < b) {\r\n return -1;\r\n }\r\n if (a > b) {\r\n return 1;\r\n }\r\n return 0;\r\n });\r\n }\r\n // @ts-ignore\r\n const finalRefiners: string[] = [];\r\n sortedConfigValues.forEach(sortedConfigValue => {\r\n const sortedRefinerName = sortedConfigValue.refinerName.toLowerCase();\r\n if (sortedValues[sortedRefinerName] !== undefined && sortedValues[sortedRefinerName].length > 0) {\r\n let concatValue: string | string[] = sortedValues[sortedRefinerName];\r\n if (sortedValues[sortedRefinerName].length > 1) {\r\n concatValue = sortedValues[sortedRefinerName].join('|');\r\n } else if (sortedValues[sortedRefinerName].length === 1) {\r\n concatValue = sortedValues[sortedRefinerName][0];\r\n }\r\n // @ts-ignore\r\n finalRefiners.push(concatValue.split(' ').join('-').replace(/\\&/g, 'and').replace(regExSpecialChars(requestContext.app.config.canonicalUrlspecialCharIncludeList), '-'));\r\n }\r\n });\r\n\r\n // @ts-ignore\r\n const finalURL = `${origin}/${slugArray.join('/')}${finalRefiners && finalRefiners.length > 0 ? `/${finalRefiners.join('/')}` : ''\r\n }${categoryId ? `/${categoryId}` : ''}${params ? params.search : ''}`; // todo: will remove after complete functionality\r\n\r\n window.location.href = finalURL.trim();\r\n }\r\n }\r\n\r\n transaction(() => {\r\n this.props.data.listPageState.result!.currentPageNumber = 0;\r\n this.props.data.listPageState.result!.activeFilters = updatedRefinementCriteria;\r\n });\r\n };\r\n\r\n private _buildRefinerUrl = (itemToggleNotification: IRefineItemToggleNotification): string => {\r\n if (this.props.data.listPageState.result) {\r\n const newRefinementCriteria = getUpdatedRefinementCriteria(\r\n itemToggleNotification,\r\n (this._isCustomizedRefiner && this.props.data.listPageState.result\r\n ? this.props.data.listPageState.result?.activeVirtualFilters\r\n : this.props.data.listPageState.result?.activeFilters) || []\r\n );\r\n\r\n return buildListPageUrl(getCurrentUrl(this.props.context.request), newRefinementCriteria);\r\n } else {\r\n this.props.telemetry.warning(`[buildRefinerQueryString]List Page State Not available, unable to build refiner URL`);\r\n return '';\r\n }\r\n };\r\n\r\n private _onChoiceClicked = (notification: IChoiceSummaryClickNotification): void => {\r\n this.setState({ addedProducts: [], onlyNewProducts: [], infiniteScrollPage: 1 });\r\n const { data, telemetry, context } = this.props;\r\n const requestContext = context && context.request;\r\n const isCustomizeRefiner = requestContext.app.config.urlModifications && requestContext.app.config.urlModifications.length > 0;\r\n const isCategoryPage: boolean = this._getIsCategoryPage();\r\n if (isCustomizeRefiner && isCategoryPage) {\r\n this.setState({ isRefinerRedirectEnabled: true });\r\n }\r\n\r\n if (!data.listPageState.result) {\r\n telemetry.warning('[choice-summary-by-category._onChoiceClicked]ListPageState unavailable, unable to update refiners.');\r\n return;\r\n }\r\n let currentRefinementCriteria = this.props.data.listPageState.result && this.props.data.listPageState.result.activeFilters || [];\r\n if (this._isCustomizedRefiner && isCategoryPage) {\r\n currentRefinementCriteria =\r\n (this.props.data.listPageState.result && this.props.data.listPageState.result.activeVirtualFilters) || [];\r\n }\r\n\r\n if (!notification.clearAll) {\r\n const selectedChoice = notification.choiceClicked;\r\n if (!selectedChoice) {\r\n telemetry.warning('[choice-summary-by-category._onChoiceClicked] Choice could not be determined');\r\n return;\r\n }\r\n currentRefinementCriteria = currentRefinementCriteria.filter(\r\n (selectedCriterion: ProductRefinerValue) => !isMatchingRefinementCriterion(selectedChoice, selectedCriterion)\r\n );\r\n // VSI Customization - START - 22023\r\n\r\n if (isCategoryPage) {\r\n const isAnySizeSelectedArr = currentRefinementCriteria?.filter((obj: ProductRefinerValue) =>\r\n this.state.allSizeRefinerValues.includes(obj?.LeftValueBoundString?.toLowerCase())\r\n );\r\n if (isAnySizeSelectedArr && isAnySizeSelectedArr?.length > 0) {\r\n this.setState({ isPriceRefinerDisabled: true });\r\n currentRefinementCriteria = this._removePriceAndVirtualRefiner(currentRefinementCriteria);\r\n } else {\r\n this.setState({ isPriceRefinerDisabled: false });\r\n }\r\n }\r\n\r\n // VSI Customization - END - 22023\r\n } else {\r\n currentRefinementCriteria = [];\r\n // @ts-ignore\r\n if (MsDyn365.isBrowser && utag) {\r\n // @ts-ignore\r\n // tslint:disable-next-line: object-literal-key-quotes\r\n utag.link({\r\n event: 'PLP-filter-action',\r\n event_category: 'PLP Filter Action',\r\n event_action: 'Clear All Filters Click',\r\n event_label: 'Clear All Filters',\r\n event_noninteraction: 'false'\r\n });\r\n }\r\n // set focus to sort and filter\r\n const dropdownElementId = this._sortAndFilterContainerRef.current && this._sortAndFilterContainerRef.current.props.dropdownId;\r\n const dropdownElement = MsDyn365.isBrowser && dropdownElementId && document.getElementById(dropdownElementId);\r\n MsDyn365.isBrowser &&\r\n setTimeout(() => {\r\n dropdownElement && dropdownElement.focus();\r\n }, 50);\r\n }\r\n // VSI Customization - START - 22023\r\n if (notification.clearAll) {\r\n this.setState({ isPriceRefinerDisabled: false });\r\n }\r\n // VSI Customization - END - 22023\r\n const virtualRefinersRecordId: number[] = [];\r\n const isSizeRefinement: boolean | undefined = this.props?.data.category.result?.ExtensionProperties?.find(attr => attr.Key === 'SizeRefinementEnable')?.Value\r\n ?.BooleanValue;\r\n const availableRefiners = getVirtualRefinerNames(this.props.context.request, isSizeRefinement);\r\n this.props.data.refiners.result &&\r\n this.props.data.refiners.result.filter(refiner => {\r\n if (availableRefiners.includes(refiner.KeyName?.toLowerCase() as string)) {\r\n virtualRefinersRecordId.push(refiner.RecordId!);\r\n }\r\n });\r\n\r\n const categoryIdToken = requestContext.urlTokens.recordId;\r\n const categoryId = categoryIdToken ? `${categoryIdToken}.c` : undefined;\r\n const fullUrl = getCurrentUrl(this.props.context.request);\r\n if (!this._isCustomizedRefiner && notification?.choiceClicked?.DataTypeValue === 1) {\r\n const listPageUrl = buildListPageUrl(fullUrl, currentRefinementCriteria);\r\n if (!notification.clearAll && virtualRefinersRecordId && virtualRefinersRecordId.length >= 1) {\r\n // window.location.href = listPageUrl.trim();\r\n } else {\r\n MsDyn365.isBrowser && window.history.pushState({}, '', listPageUrl);\r\n }\r\n } else if (\r\n notification.clearAll ||\r\n (notification.choiceClicked &&\r\n notification.choiceClicked?.RefinerRecordId &&\r\n virtualRefinersRecordId.includes(notification.choiceClicked.RefinerRecordId) === false)\r\n ) {\r\n const listPageUrl = buildListPageUrl(fullUrl, currentRefinementCriteria);\r\n if (\r\n isCustomizeRefiner &&\r\n isCategoryPage &&\r\n !notification.clearAll &&\r\n virtualRefinersRecordId &&\r\n virtualRefinersRecordId.length >= 1\r\n ) {\r\n window.location.href = listPageUrl.trim();\r\n } else {\r\n MsDyn365.isBrowser && window.history.pushState({}, '', listPageUrl);\r\n }\r\n // below code is to clear virtual refiners if defined in config\r\n if (\r\n isCustomizeRefiner &&\r\n isCategoryPage &&\r\n notification.clearAll &&\r\n virtualRefinersRecordId &&\r\n virtualRefinersRecordId.length >= 1\r\n ) {\r\n // get category slug\r\n let slug = (this.props.data.category.result && this.props.data.category.result.Slug) || '';\r\n let slugArray: string[];\r\n const params = MsDyn365.isBrowser && window.location;\r\n const origin = params && params.origin === 'https://localhost:4000' ? params.origin : requestContext.url.requestUrl.origin;\r\n slugArray = slug.split('/').splice(1);\r\n // remove keywords form slugArray\r\n slugArray = removeKeywords(slugArray, this.props.context.request);\r\n slug = slugArray.join('/');\r\n data.listPageState.result.currentPageNumber = 0;\r\n data.listPageState.result.activeFilters = currentRefinementCriteria;\r\n const finalURL = `${origin}/${slugArray.join('/')}${categoryId ? `/${categoryId}` : ''}`;\r\n window.location.href = finalURL.trim();\r\n }\r\n } else if (isCustomizeRefiner && isCategoryPage && availableRefiners.includes(notification.parentKeyName.toLowerCase()) === true) {\r\n // url builder\r\n const configVirtualRefinerNames = getVirtualRefinerNames(this.props.context.request, isSizeRefinement);\r\n const filteredRefiners =\r\n this.props.data.refiners.result &&\r\n this.props.data.refiners.result.filter(refiner => {\r\n return refiner.KeyName && configVirtualRefinerNames.indexOf(refiner.KeyName.toLowerCase()) !== -1;\r\n });\r\n\r\n // get category slug\r\n let slug = (this.props.data.category.result && this.props.data.category.result.Slug) || '';\r\n let slugArray: string[];\r\n let pathArray: string[];\r\n const sortedConfigValues = getSortedVirtualRefinerConfig(this.props.context.request, isSizeRefinement);\r\n if (sortedConfigValues && slug) {\r\n const params = MsDyn365.isBrowser && window.location;\r\n const origin = params && params.origin === 'https://localhost:4000' ? params.origin : requestContext.url.requestUrl.origin;\r\n slugArray = slug.split('/').splice(1);\r\n // remove keywords form slugArray\r\n slugArray = removeKeywords(slugArray, this.props.context.request);\r\n slug = slugArray.join('/');\r\n\r\n // path of URL\r\n let path = this.props.context.request.url.requestUrl.pathname.toLowerCase();\r\n\r\n // remove category id {categoryid}.c\r\n if (categoryId) {\r\n path = path.replace(`/${categoryId}`, '');\r\n }\r\n // remove category slug\r\n pathArray = removeKeywords(path.split('\\/').splice(1), this.props.context.request);\r\n path = pathArray.join('\\/');\r\n const removedCategorySlug = path.split(slug).splice(1)[0];\r\n let refinerParts: string[] = [];\r\n if (removedCategorySlug !== '') {\r\n refinerParts = decodeURIComponent(removedCategorySlug).split('/');\r\n }\r\n\r\n if (refinerParts && refinerParts.length > 0 && slugArray && slugArray.length > 0) {\r\n // remove duplicates if any from the first url part\r\n slugArray.forEach(_slug => {\r\n refinerParts.forEach(refinerPart => {\r\n // tslint:disable-next-line: no-shadowed-variable\r\n const index = slugArray.indexOf(refinerPart);\r\n if (index !== -1) {\r\n slugArray.splice(index, 1);\r\n }\r\n });\r\n });\r\n }\r\n // insert current refiner\r\n // break final refiners so array contains single values instead of pipe sign values\r\n const finalRefinerParts: string[] = [];\r\n refinerParts.forEach(refinerPart => {\r\n refinerPart.split('|').map(item => finalRefinerParts.push(item.includes('-') ? item : item.split('-').join(' ')));\r\n // finalRefinerParts.push(refinerPart.split('|'));\r\n });\r\n\r\n refinerParts = finalRefinerParts && flatten(finalRefinerParts);\r\n const index = refinerParts.indexOf(notification.choiceClicked!.LeftValueBoundString!.toLowerCase().replace(/\\&/g, 'and').replace(regExSpecialChars(requestContext.app.config.canonicalUrlspecialCharIncludeList), '-'));\r\n if (index !== -1) {\r\n refinerParts.splice(index, 1);\r\n }\r\n // setup object with refiner values\r\n const sortedValues: { [key: string]: string[] } = {};\r\n filteredRefiners?.forEach(refinerSet => {\r\n let refinerName = refinerSet.KeyName;\r\n if (refinerName) {\r\n refinerName = refinerName.toLowerCase();\r\n sortedValues[refinerName] = []; // size, brand, price\r\n }\r\n refinerSet.Values.forEach((refiner) => {\r\n refinerParts.forEach((refinerPart) => {\r\n if (refinerName && refiner.LeftValueBoundString &&\r\n (refiner.LeftValueBoundString.toLowerCase().replace(/\\&/g, 'and').replace(regExSpecialChars(requestContext.app.config.canonicalUrlspecialCharIncludeList), '-') === refinerPart.toLowerCase().split('-').join(' ')\r\n || refiner.LeftValueBoundString.toLowerCase().replace(/\\&/g, 'and').replace(regExSpecialChars(requestContext.app.config.canonicalUrlspecialCharIncludeList), '-') === refinerPart.toLowerCase())) {\r\n sortedValues[refinerName].push(refiner.LeftValueBoundString.toLowerCase().split(' ').join('-'));\r\n } else if (refinerName && refiner.LeftValueBoundString &&\r\n refiner.LeftValueBoundString.toLowerCase() === refinerPart.toLowerCase().split('-').join(' ')) {\r\n sortedValues[refinerName].push(refinerPart);\r\n }\r\n });\r\n });\r\n });\r\n // alpha sort\r\n // @ts-ignore\r\n for (const sortedValue of Object.keys(sortedValues)) {\r\n sortedValues[sortedValue].length > 0 &&\r\n sortedValues[sortedValue].sort((a: string, b: string) => {\r\n if (a < b) {\r\n return -1;\r\n }\r\n if (a > b) {\r\n return 1;\r\n }\r\n return 0;\r\n });\r\n }\r\n\r\n // @ts-ignore\r\n const finalRefiners: string[] = [];\r\n sortedConfigValues.forEach(sortedConfigValue => {\r\n const sortedRefinerName = sortedConfigValue.refinerName.toLowerCase();\r\n if (sortedValues[sortedRefinerName] !== undefined && sortedValues[sortedRefinerName].length > 0) {\r\n let concatValue: string | string[] = sortedValues[sortedRefinerName];\r\n if (sortedValues[sortedRefinerName].length > 1) {\r\n concatValue = sortedValues[sortedRefinerName].join('|');\r\n } else if (sortedValues[sortedRefinerName].length === 1) {\r\n concatValue = sortedValues[sortedRefinerName][0];\r\n }\r\n // @ts-ignore\r\n finalRefiners.push(concatValue.split(' ').join('-').replace(/\\&/g, 'and').replace(regExSpecialChars(requestContext.app.config.canonicalUrlspecialCharIncludeList), '-'));\r\n }\r\n });\r\n data.listPageState.result.currentPageNumber = 0;\r\n data.listPageState.result.activeFilters = currentRefinementCriteria;\r\n const finalURL = `${origin}/${slugArray.join('/')}${finalRefiners && finalRefiners.length > 0 ? `/${finalRefiners.join('/')}` : ''\r\n }${categoryId ? `/${categoryId}` : ''}${params ? params.search : ''}`;\r\n window.location.href = finalURL.trim();\r\n }\r\n }\r\n\r\n if (notification.parentKeyName.toLowerCase() !== 'price' && MsDyn365.isBrowser) {\r\n window.history.pushState({}, '', buildListPageUrl(fullUrl, currentRefinementCriteria));\r\n }\r\n data.listPageState.result.currentPageNumber = 0;\r\n data.listPageState.result.activeFilters = currentRefinementCriteria;\r\n if (MsDyn365.isBrowser && notification.parentKeyName.toLowerCase() === 'price' && isCategoryPage) {\r\n this._isCustomizedRefiner\r\n ? (window.location.href = buildListPageUrl(fullUrl, currentRefinementCriteria))\r\n : window.history.pushState({}, '', buildListPageUrl(fullUrl, currentRefinementCriteria));\r\n }\r\n };\r\n\r\n private _buildRefinerUrlForChoiceSummary = (selectedRefiner: ProductRefinerValue, isClearAll: boolean): string => {\r\n const { data, telemetry } = this.props;\r\n const fullUrl = getCurrentUrl(this.props.context.request);\r\n\r\n if (!data.listPageState.result) {\r\n telemetry.warning('[choice-summary-by-category._buildRefinerUrl]ListPageState unavailable, unable to create refiner URL.');\r\n return fullUrl.href;\r\n }\r\n\r\n let currentRefinementCriteria = (data.listPageState.result && data.listPageState.result.activeFilters) || [];\r\n\r\n if (!isClearAll) {\r\n if (!selectedRefiner) {\r\n telemetry.warning('[choice-summary-by-category._buildRefinerUrl] URL for Choice could not be determined');\r\n return fullUrl.href;\r\n }\r\n currentRefinementCriteria = currentRefinementCriteria.filter(\r\n (selectedCriterion: ProductRefinerValue) => !isMatchingRefinementCriterion(selectedRefiner, selectedCriterion)\r\n );\r\n } else {\r\n currentRefinementCriteria = [];\r\n }\r\n\r\n return buildListPageUrl(fullUrl, currentRefinementCriteria);\r\n };\r\n\r\n private _customBuildRefinerUrlForChoiceSummary = (selectedRefiner: ProductRefinerValue, isClearAll: boolean): string => {\r\n const { telemetry, context } = this.props;\r\n const requestContext = context && context.request;\r\n const isCustomizeRefiner = requestContext.app.config.urlModifications && requestContext.app.config.urlModifications.length > 0;\r\n const isCategoryPage: boolean = this._getIsCategoryPage();\r\n\r\n const fullUrl = getCurrentUrl(this.props.context.request);\r\n let currentRefinementCriteria = this.props.data.listPageState.result && this.props.data.listPageState.result.activeFilters || [];\r\n if (this._isCustomizedRefiner && isCategoryPage) {\r\n currentRefinementCriteria = this.props.data.listPageState.result && this.props.data.listPageState.result.activeVirtualFilters || [];\r\n }\r\n if (!currentRefinementCriteria) {\r\n telemetry.warning('[choice-summary-by-category._onChoiceClicked]ListPageState unavailable, unable to update refiners.');\r\n return fullUrl.href;\r\n }\r\n\r\n if (!isClearAll) {\r\n const selectedChoice = selectedRefiner;\r\n if (!selectedChoice) {\r\n telemetry.warning('[choice-summary-by-category._onChoiceClicked] Choice could not be determined');\r\n return fullUrl.href;\r\n }\r\n currentRefinementCriteria = currentRefinementCriteria.filter(\r\n (selectedCriterion: ProductRefinerValue) => !isMatchingRefinementCriterion(selectedChoice, selectedCriterion)\r\n );\r\n\r\n } else {\r\n currentRefinementCriteria = [];\r\n }\r\n\r\n const virtualRefinersRecordId: number[] = [];\r\n const isSizeRefinement: boolean | undefined = this.props?.data.category.result?.ExtensionProperties?.find((attr) => attr.Key === 'SizeRefinementEnable')\r\n ?.Value?.BooleanValue;\r\n const availableRefiners = getVirtualRefinerNames(this.props.context.request, isSizeRefinement);\r\n this.props.data.refiners.result && this.props.data.refiners.result.filter((refiner) => {\r\n if (availableRefiners.includes(refiner.KeyName?.toLowerCase() as string)) {\r\n virtualRefinersRecordId.push(refiner.RecordId!);\r\n }\r\n\r\n });\r\n\r\n const categoryIdToken = requestContext.urlTokens.recordId;\r\n const categoryId = categoryIdToken ? `${categoryIdToken}.c` : undefined;\r\n if (!this._isCustomizedRefiner) {\r\n const listPageUrl = buildListPageUrl(fullUrl, currentRefinementCriteria);\r\n if (!isClearAll && virtualRefinersRecordId && virtualRefinersRecordId.length >= 1) {\r\n // window.location.href = listPageUrl.trim();\r\n } else {\r\n return listPageUrl;\r\n }\r\n }\r\n // below code is to clear virtual refiners if defined in config\r\n if (isCustomizeRefiner && isCategoryPage && isClearAll && virtualRefinersRecordId && virtualRefinersRecordId.length >= 1) {\r\n // get category slug\r\n let slug = this.props.data.category.result && this.props.data.category.result.Slug || '';\r\n let slugArray: string[];\r\n const params = MsDyn365.isBrowser && window.location;\r\n const origin = (params && params.origin === 'https://localhost:4000') ? params.origin : requestContext.url.requestUrl.origin;\r\n slugArray = slug.split('\\/').splice(1);\r\n // remove keywords form slugArray\r\n slugArray = removeKeywords(slugArray, this.props.context.request);\r\n slug = slugArray.join('/');\r\n const finalURL = `${origin}/${slugArray.join('\\/')}${categoryId ? `/${categoryId}` : ''}`;\r\n return finalURL.trim();\r\n } else if (isCustomizeRefiner && isCategoryPage && availableRefiners.includes(this._getParentKeyForRefinerValue(selectedRefiner).toLowerCase()) === true) {\r\n // url builder\r\n const configVirtualRefinerNames = getVirtualRefinerNames(this.props.context.request, isSizeRefinement);\r\n const filteredRefiners = this.props.data.refiners.result && this.props.data.refiners.result.filter((refiner) => {\r\n return refiner.KeyName && configVirtualRefinerNames.indexOf(refiner.KeyName.toLowerCase()) !== -1;\r\n });\r\n\r\n // get category slug\r\n let slug = this.props.data.category.result && this.props.data.category.result.Slug || '';\r\n let slugArray: string[];\r\n let pathArray: string[];\r\n const sortedConfigValues = getSortedVirtualRefinerConfig(this.props.context.request, isSizeRefinement);\r\n if (sortedConfigValues && slug) {\r\n const params = MsDyn365.isBrowser && window.location;\r\n const origin = (params && params.origin === 'https://localhost:4000') ? params.origin : requestContext.url.requestUrl.origin;\r\n slugArray = slug.split('\\/').splice(1);\r\n // remove keywords form slugArray\r\n slugArray = removeKeywords(slugArray, this.props.context.request);\r\n slug = slugArray.join('/');\r\n\r\n // path of URL\r\n let path = this.props.context.request.url.requestUrl.pathname.toLowerCase();\r\n\r\n // remove category id {categoryid}.c\r\n if (categoryId) {\r\n path = path.replace(`/${categoryId}`, '');\r\n }\r\n // remove category slug\r\n pathArray = removeKeywords(path.split('\\/').splice(1), this.props.context.request);\r\n path = pathArray.join('\\/');\r\n const removedCategorySlug = path.split(slug).splice(1)[0];\r\n let refinerParts: string[] = [];\r\n if (removedCategorySlug !== '') {\r\n refinerParts = decodeURIComponent(removedCategorySlug).split('\\/');\r\n }\r\n\r\n if (refinerParts && refinerParts.length > 0 && slugArray && slugArray.length > 0) {\r\n // remove duplicates if any from the first url part\r\n slugArray.forEach((_slug) => {\r\n refinerParts.forEach((refinerPart) => {\r\n // tslint:disable-next-line: no-shadowed-variable\r\n const index = slugArray.indexOf(refinerPart);\r\n if (index !== -1) {\r\n slugArray.splice(index, 1);\r\n }\r\n });\r\n });\r\n }\r\n // insert current refiner\r\n // break final refiners so array contains single values instead of pipe sign values\r\n const finalRefinerParts: string[] = [];\r\n refinerParts.forEach(refinerPart => {\r\n refinerPart.split('|').map(item => finalRefinerParts.push(item.includes('-') ? item : item.split('-').join(' ')));\r\n // finalRefinerParts.push(refinerPart.split('|'));\r\n });\r\n\r\n refinerParts = finalRefinerParts && flatten(finalRefinerParts);\r\n const index = refinerParts.indexOf(selectedRefiner.LeftValueBoundString!.toLowerCase().replace(/\\&/g, 'and').replace(regExSpecialChars(requestContext.app.config.canonicalUrlspecialCharIncludeList), '-'));\r\n if (index !== -1) {\r\n refinerParts.splice(index, 1);\r\n }\r\n // setup object with refiner values\r\n const sortedValues: { [key: string]: string[] } = {};\r\n filteredRefiners?.forEach((refinerSet) => {\r\n let refinerName = refinerSet.KeyName;\r\n if (refinerName) {\r\n refinerName = refinerName.toLowerCase();\r\n sortedValues[refinerName] = []; // size, brand, price\r\n }\r\n refinerSet.Values.forEach((refiner) => {\r\n refinerParts.forEach((refinerPart) => {\r\n if (refinerName && refiner.LeftValueBoundString &&\r\n (refiner.LeftValueBoundString.toLowerCase().replace(/\\&/g, 'and').replace(regExSpecialChars(requestContext.app.config.canonicalUrlspecialCharIncludeList), '-') === refinerPart.toLowerCase().split('-').join(' ')\r\n || refiner.LeftValueBoundString.toLowerCase().replace(/\\&/g, 'and').replace(regExSpecialChars(requestContext.app.config.canonicalUrlspecialCharIncludeList), '-') === refinerPart.toLowerCase())) {\r\n sortedValues[refinerName].push(refiner.LeftValueBoundString.toLowerCase().split(' ').join('-'));\r\n } else if (refinerName && refiner.LeftValueBoundString &&\r\n refiner.LeftValueBoundString.toLowerCase() === refinerPart.toLowerCase().split('-').join(' ')) {\r\n sortedValues[refinerName].push(refinerPart);\r\n }\r\n });\r\n });\r\n });\r\n // alpha sort\r\n // @ts-ignore\r\n for (const sortedValue of Object.keys(sortedValues)) {\r\n sortedValues[sortedValue].length > 0 && sortedValues[sortedValue].sort((a: string, b: string) => {\r\n if (a < b) { return -1; }\r\n if (a > b) { return 1; }\r\n return 0;\r\n });\r\n }\r\n\r\n // @ts-ignore\r\n const finalRefiners: string[] = [];\r\n sortedConfigValues.forEach((sortedConfigValue) => {\r\n const sortedRefinerName = sortedConfigValue.refinerName.toLowerCase();\r\n if (sortedValues[sortedRefinerName] !== undefined && sortedValues[sortedRefinerName].length > 0) {\r\n let concatValue: string | string[] = sortedValues[sortedRefinerName];\r\n if (sortedValues[sortedRefinerName].length > 1) {\r\n concatValue = sortedValues[sortedRefinerName].join('|');\r\n } else if (sortedValues[sortedRefinerName].length === 1) {\r\n concatValue = sortedValues[sortedRefinerName][0];\r\n }\r\n // @ts-ignore\r\n finalRefiners.push(concatValue.split(' ').join('-').replace(/\\&/g, 'and').replace(regExSpecialChars(requestContext.app.config.canonicalUrlspecialCharIncludeList), '-'));\r\n }\r\n });\r\n const finalURL = `${origin}/${slugArray.join('\\/')}${finalRefiners && finalRefiners.length > 0 ? `/${finalRefiners.join('\\/')}` : ''}${categoryId ? `/${categoryId}` : ''}${params ? params.search : fullUrl && fullUrl.search ? fullUrl.search : ''}`;\r\n return finalURL.trim();\r\n }\r\n\r\n }\r\n return buildListPageUrl(fullUrl, currentRefinementCriteria);\r\n };\r\n\r\n private _getViewport(): GridSize {\r\n if (MsDyn365.isBrowser) {\r\n return isMobile({ variant: VariantType.Browser, context: this.props.context.request });\r\n }\r\n return isMobile({ variant: VariantType.Viewport, context: this.props.context.request });\r\n }\r\n\r\n private _formatPrice(amount: string | undefined, currency: string | undefined): string {\r\n if (!amount || !currency) {\r\n this.props.telemetry.trace('[choice-summary] could not format price');\r\n return amount || '';\r\n }\r\n const priceAmount = (amount && Number(amount)) || 0;\r\n const locale = get(this.props, 'context.request.locale', 'en-US');\r\n let result: string;\r\n\r\n try {\r\n result = new Intl.NumberFormat(locale, {\r\n style: 'currency',\r\n currencyDisplay: 'symbol',\r\n currency: currency,\r\n minimumFractionDigits: 0\r\n }).format(priceAmount);\r\n } catch (e) {\r\n result = `${priceAmount} ${currency} `;\r\n this.props.telemetry.warning(`Failed to format price for ${result}: ${e} `);\r\n }\r\n return result;\r\n }\r\n private _getKeyForRefinerValue(productRefinerValue: ProductRefinerValue): string {\r\n const { choiceFormat, choiceRangeValueFormat } = this.props.resources;\r\n const refinerHierarchy = this.props.data.refiners.result;\r\n const { telemetry } = this.props;\r\n const overallFormat = choiceFormat || '{1}';\r\n const rangeFormat = choiceRangeValueFormat;\r\n let refinerName = '';\r\n if (refinerHierarchy && refinerHierarchy.find) {\r\n const parent = refinerHierarchy.find(\r\n (hierarchy: IProductRefinerHierarchy) =>\r\n !!hierarchy.Values.find((value: ProductRefinerValue) => isMatchingRefinementCriterion(value, productRefinerValue))\r\n );\r\n if (!parent) {\r\n telemetry.warning('[choice-summary] could not find parent of selected refiner value');\r\n } else {\r\n refinerName = parent.KeyName || '';\r\n }\r\n }\r\n\r\n let refinerValueName: string;\r\n if (isRangeType(productRefinerValue.DataTypeValue)) {\r\n refinerValueName = rangeFormat\r\n .replace('{0}', this._formatPrice(productRefinerValue.LeftValueBoundString, productRefinerValue.UnitText))\r\n .replace('{1}', this._formatPrice(productRefinerValue.RightValueBoundString, productRefinerValue.UnitText));\r\n } else {\r\n refinerValueName = productRefinerValue.LeftValueBoundLocalizedString || productRefinerValue.LeftValueBoundString || '';\r\n }\r\n\r\n return overallFormat.replace('{0}', refinerName).replace('{1}', refinerValueName);\r\n }\r\n private _getParentKeyForRefinerValue(productRefinerValue: ProductRefinerValue): string {\r\n const { telemetry } = this.props;\r\n const refinerHierarchy = this.props.data.refiners.result;\r\n let refinerName = '';\r\n if (refinerHierarchy && refinerHierarchy.find) {\r\n const parent = refinerHierarchy.find(\r\n (hierarchy: IProductRefinerHierarchy) =>\r\n !!hierarchy.Values.find((value: ProductRefinerValue) => isMatchingRefinementCriterion(value, productRefinerValue))\r\n );\r\n if (!parent) {\r\n telemetry.warning('[choice-summary] could not find parent of selected refiner value');\r\n } else {\r\n refinerName = parent.KeyName || '';\r\n }\r\n }\r\n\r\n return refinerName;\r\n }\r\n\r\n private _toggleModal(): void {\r\n const filterCategoriesArr: string[] = [];\r\n const filterItemsArr: string[] = [];\r\n const selectedChoices = this.props.data.listPageState.result && this.props.data.listPageState.result.activeFilters;\r\n selectedChoices &&\r\n selectedChoices.length > 0 &&\r\n selectedChoices.map((selectedRefiner: ProductRefinerValue) => {\r\n const obj = {\r\n key: this._getKeyForRefinerValue(selectedRefiner),\r\n parentName: this._getParentKeyForRefinerValue(selectedRefiner)\r\n };\r\n filterCategoriesArr.push(obj.parentName);\r\n filterItemsArr.push(obj.key);\r\n });\r\n const uniqueFilterCategories = [...new Set(filterCategoriesArr)];\r\n const filterCategories = uniqueFilterCategories.join('|');\r\n const filterItems = filterItemsArr.join('|');\r\n // @ts-ignore\r\n if (MsDyn365.isBrowser && utag && this.state.modalIsOpen) {\r\n // @ts-ignore\r\n // tslint:disable-next-line: object-literal-key-quotes\r\n utag.link({\r\n event: 'PLP-filter-action',\r\n event_category: 'PLP Filter Action',\r\n event_action: `${filterCategories} `,\r\n event_label: `${filterItems} `,\r\n event_noninteraction: 'false'\r\n });\r\n }\r\n this.setState({\r\n modalIsOpen: !this.state.modalIsOpen\r\n });\r\n }\r\n\r\n private _updateViewport(): void {\r\n this._viewport = this._getViewport();\r\n if (this.state.modalIsOpen && !this.isMobile) {\r\n this._toggleModal();\r\n }\r\n }\r\n\r\n private _getIsCategoryPage(): boolean {\r\n const { context } = this.props;\r\n const requestContext = context && context.request;\r\n const pageType =\r\n requestContext.urlTokens.pageType === 'Category' || (requestContext.query && requestContext.query.categoryId)\r\n ? 'Category'\r\n : 'Search';\r\n return pageType?.toLowerCase() === 'search' ? false : true;\r\n }\r\n\r\n private _removePriceAndVirtualRefiner(currentRefinementCriteria: ProductRefinerValue[]): ProductRefinerValue[] {\r\n const activeRefiners = currentRefinementCriteria;\r\n const priceRefiner = activeRefiners?.find(refiner => refiner.DataTypeValue === 1);\r\n if (priceRefiner) {\r\n currentRefinementCriteria = activeRefiners?.filter(\r\n selectedCriterion => !isMatchingRefinementCriterion(priceRefiner, selectedCriterion)\r\n );\r\n }\r\n let withoutVirtualRefiners = [...currentRefinementCriteria];\r\n if (this._isCustomizedRefiner) {\r\n const allVirtualRefinersValue = currentRefinementCriteria.filter(obj =>\r\n this.state.allVirtualRefiners.includes(obj?.LeftValueBoundString?.toLowerCase())\r\n );\r\n let updatedRefinersArr = [...currentRefinementCriteria];\r\n allVirtualRefinersValue.map(refinerValue => {\r\n const selectedObj = currentRefinementCriteria?.find(\r\n refiner => refiner.LeftValueBoundString?.toLowerCase() === refinerValue.LeftValueBoundString?.toLowerCase()\r\n );\r\n if (selectedObj) {\r\n withoutVirtualRefiners = updatedRefinersArr?.filter(\r\n selectedCriterion => !isMatchingRefinementCriterion(selectedObj, selectedCriterion)\r\n );\r\n }\r\n updatedRefinersArr = [...withoutVirtualRefiners];\r\n });\r\n if (MsDyn365.isBrowser) {\r\n window.history.pushState({}, '', buildListPageUrl(getCurrentUrl(this.props.context.request), withoutVirtualRefiners));\r\n }\r\n }\r\n return withoutVirtualRefiners;\r\n }\r\n\r\n}\r\n","import { RichText, RichTextComponent } from '@msdyn365-commerce/core';\r\nimport * as React from 'react';\r\ninterface IErrorMessage {\r\n errorMsg?: RichText | string;\r\n}\r\n\r\nexport const ErrorMessage: React.FC<IErrorMessage> = ({ errorMsg }) => {\r\n return <RichTextComponent text={errorMsg} className='ms-search-result-container__no-results-message' />;\r\n};\r\n","/*---------------------------------------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License. See License.txt in the project root for license information.\r\n *--------------------------------------------------------------------------------------------*/\r\nimport { ITelemetryContent } from '@msdyn365-commerce-modules/utilities';\r\nimport { IAny, ICoreContext, IGeneric, IImageSettings } from '@msdyn365-commerce/core';\r\n// tslint:disable-next-line: no-duplicate-imports\r\nimport MsDyn365 from '@msdyn365-commerce/core';\r\nimport { AttributeValue, CommerceProperty, ProductSearchResult } from '@msdyn365-commerce/retail-proxy';\r\nimport get from 'lodash/get';\r\nimport uniqBy from 'lodash/uniqBy';\r\nimport * as React from 'react';\r\nimport { InView } from 'react-intersection-observer';\r\nimport { IMFICartLine as IMFICartLineBatch } from '../../../actions/BatchCoreProductDataServiceEntities.g';\r\nimport { IMFIItem, IMFIPromotion } from '../../../actions/EyebrowMessageDataServiceEntities.g';\r\nimport { GetCategoryPathsInput, getProductsCategoryPathsAction } from '../../../actions/get-mfrm-products-category-paths.action';\r\nimport { getBrandNameCheck } from '../../../Utilities/get-product-brand';\r\nimport {\r\n _coreProductATPCall,\r\n _getEyebrowMessage,\r\n _getSoonestDeliveryDate,\r\n _makeDeliveryMessage\r\n} from '../../../Utilities/product-search-result-utils';\r\nimport { ISearchResultContainerResources } from '../definition-extensions/search-result-container.ext.props.autogenerated';\r\nimport { ProductComponent } from '../views/components/product.component';\r\nimport { getPagePath } from '../../../Utilities/get-page-path';\r\nimport getListOfCoreDeliveryMessage, { IMFIATPInventoryEntityPLPEx } from '../../../Utilities/get-core-delivery-batch';\r\nimport { _getProductType } from '../views/components/delivery-message/deliverymessage.component';\r\nexport interface ProductSearchResultExtended extends ProductSearchResult {\r\n eyebrowMessage?: string;\r\n deliveryByMessage?: string;\r\n}\r\n\r\nexport type GridSize = 'xs' | 'sm' | 'md' | 'lg' | 'xl';\r\ninterface IProductSearchResultItems {\r\n products: ProductSearchResult[];\r\n onlyNewProducts: ProductSearchResult[];\r\n currentPromoProducts: ProductSearchResult[];\r\n context: ICoreContext<IGeneric<IAny>>;\r\n resources: ISearchResultContainerResources;\r\n imageSettings?: IImageSettings;\r\n moduleType: string;\r\n moduleId: string;\r\n allowBackNavigation?: boolean;\r\n telemetryContent: ITelemetryContent;\r\n productBadgeAttribute?: string;\r\n mattressMatcherBanner?: React.ReactNode;\r\n bannerPosition?: number;\r\n mattressMatcherBannerIndex?: number;\r\n targetAudienceGroup?: string;\r\n listName?: string;\r\n isCategoryPage: boolean;\r\n categoryNameFromSlug: string | undefined;\r\n isRefinersEnabled?: boolean;\r\n}\r\ninterface IFetchedCategoryIds {\r\n productId?: number;\r\n categoryId?: number;\r\n categoryName?: string;\r\n brand: string;\r\n variantID: string | number | undefined;\r\n}\r\n\r\nconst getProductsCategories = async (\r\n context: ICoreContext<IGeneric<IAny>>,\r\n products: ProductSearchResult[] | undefined,\r\n isCategoryPage: boolean,\r\n categoryNameFromSlug: string | undefined\r\n): Promise<IFetchedCategoryIds[]> => {\r\n if (products && products.length > 0) {\r\n // VSI Customization Start - 42859\r\n let catName: string | undefined = '';\r\n if (isCategoryPage) {\r\n catName = categoryNameFromSlug;\r\n }\r\n // VSI Customization End - 42859\r\n const productIds: number[] = [];\r\n const catalogId = context.actionContext.requestContext.apiSettings.catalogId;\r\n for (let productPricesIter = 0; productPricesIter < products.length; productPricesIter++) {\r\n const prodId = products[productPricesIter].RecordId;\r\n productIds.push(prodId);\r\n }\r\n const productsCategories = await getProductsCategoryPathsAction(\r\n new GetCategoryPathsInput(context.request, catalogId, productIds),\r\n context.actionContext\r\n );\r\n const categoryIds: IFetchedCategoryIds[] = [];\r\n for (let productCategoriesIter = 0; productCategoriesIter < productsCategories.length; productCategoriesIter++) {\r\n if (\r\n productsCategories[productCategoriesIter] &&\r\n productsCategories[productCategoriesIter].CategoryPath &&\r\n productsCategories[productCategoriesIter].CategoryPath!.length > 0\r\n ) {\r\n const catPath = productsCategories[productCategoriesIter].CategoryPath;\r\n const catPathSegments = catPath![0].Segments;\r\n if (catPathSegments && catPathSegments.length > 0) {\r\n const catId = catPathSegments.length > 0 ? catPathSegments[catPathSegments.length - 1].CategoryId : -1;\r\n if (!isCategoryPage) {\r\n catName = catPathSegments.length > 0 ? catPathSegments[catPathSegments.length - 1].CategoryName : '';\r\n }\r\n const collectionProductAttributes: AttributeValue[] = products[productCategoriesIter].AttributeValues!;\r\n let variantId: string | number | undefined;\r\n const configVendorNamePlp = context.app.config.brandBackofficeAttributePlp;\r\n const configVendorNamePdp = context.app.config.brandBackofficeAttributePdp;\r\n let brandName = getBrandNameCheck(collectionProductAttributes, configVendorNamePlp);\r\n if (!brandName) {\r\n brandName = getBrandNameCheck(collectionProductAttributes, configVendorNamePdp);\r\n }\r\n if (!brandName) {\r\n brandName = 'Default brand name';\r\n }\r\n const eProps: CommerceProperty[] = products[productCategoriesIter].ExtensionProperties!;\r\n if (eProps && eProps.length > 0) {\r\n for (let ePropsIter = 0; ePropsIter < eProps.length; ePropsIter++) {\r\n if (eProps[ePropsIter].Key === 'Unbxd_DefaultVariantRetailVariantId') {\r\n variantId = eProps[ePropsIter].Value?.StringValue;\r\n break;\r\n }\r\n }\r\n }\r\n\r\n categoryIds.push({\r\n productId: productsCategories[productCategoriesIter].ProductId,\r\n categoryId: catId,\r\n categoryName: catName,\r\n brand: brandName,\r\n variantID: variantId\r\n });\r\n }\r\n }\r\n }\r\n return categoryIds;\r\n }\r\n return [];\r\n};\r\n\r\nconst getSkipProductValue = (context: ICoreContext<IGeneric<IAny>>): number => {\r\n let skipProducts: number = 0;\r\n const viewPortCode = getViewport(context);\r\n if (viewPortCode === 'xs' || viewPortCode === 'sm' || viewPortCode === 'md') {\r\n skipProducts = 1;\r\n } else if (viewPortCode === 'lg') {\r\n if (MsDyn365.isBrowser && window.innerWidth) {\r\n if (window.innerWidth >= 1070 && window.innerWidth < 1112) {\r\n skipProducts = 2;\r\n } else {\r\n skipProducts = 3;\r\n }\r\n }\r\n } else if (viewPortCode === 'xl') {\r\n skipProducts = 3;\r\n }\r\n return skipProducts;\r\n};\r\n\r\nconst getViewport = (context: ICoreContext<IGeneric<IAny>>): GridSize => {\r\n // always render in mobile viewport on a mobile device\r\n if (context.request && context.request.device && context.request.device.Type === 'Mobile') {\r\n return 'xs';\r\n }\r\n if (MsDyn365.isBrowser && window.innerWidth) {\r\n const gridSettings = context.request.gridSettings;\r\n if (gridSettings) {\r\n if (gridSettings.xs && window.innerWidth <= gridSettings.xs.w) {\r\n return 'xs';\r\n } else if (gridSettings.sm && window.innerWidth <= gridSettings.sm.w) {\r\n return 'sm';\r\n } else if (gridSettings.md && window.innerWidth <= gridSettings.md.w) {\r\n return 'md';\r\n } else if (gridSettings.lg && window.innerWidth <= gridSettings.lg.w) {\r\n return 'lg';\r\n } else {\r\n return 'xl';\r\n }\r\n }\r\n }\r\n\r\n return 'lg';\r\n};\r\n\r\nconst callTelium = (\r\n listName: string | undefined,\r\n products: ProductSearchResult[] | undefined,\r\n categoryID: IFetchedCategoryIds[],\r\n productIDList: number[]\r\n): void => {\r\n const lastNameValue = listName ? `${listName}` : undefined;\r\n const pagePath = getPagePath();\r\n const categoryListArray = categoryID.filter(item1 => productIDList.some(item2 => item1.productId === item2));\r\n const categoryListArr: string[] = [];\r\n const brandNameArr: string[] = [];\r\n const productVariantArr: (string | number)[] = [];\r\n categoryListArray.map((item: IFetchedCategoryIds) => {\r\n categoryListArr.push(item.categoryName!);\r\n brandNameArr.push(item.brand);\r\n productVariantArr.push(item.variantID!);\r\n });\r\n const productNameArr: string[] = [];\r\n const productIdArr: string[] = [];\r\n const productPositionArr: number[] = [];\r\n const productPriceArr: number[] = [];\r\n const productListArray =\r\n products &&\r\n products.filter((item1, index) => {\r\n return productIDList.some(item2 => {\r\n const productID = item1.RecordId;\r\n if (productID === item2) {\r\n productPositionArr.push(index + 1);\r\n }\r\n return productID === item2; // return the ones with equal id\r\n });\r\n });\r\n productListArray &&\r\n productListArray.map((item: ProductSearchResult, index: number) => {\r\n productNameArr.push(item.Name!);\r\n productIdArr.push(item.ItemId!);\r\n productPriceArr.push(item.Price);\r\n });\r\n\r\n // @ts-ignore\r\n if (MsDyn365.isBrowser && utag) {\r\n // @ts-ignore\r\n // tslint:disable-next-line: object-literal-key-quotes\r\n utag.link({\r\n event: 'product-impression',\r\n event_category: 'ecommerce',\r\n event_action: 'product impression',\r\n enhanced_action: 'product_impression',\r\n event_label: `${pagePath}`,\r\n event_noninteraction: 'true',\r\n product_impression_list_name: [lastNameValue],\r\n product_impression_position: productPositionArr,\r\n product_impression_id: productIdArr,\r\n product_impression_name: productNameArr,\r\n product_impression_category: categoryListArr,\r\n product_impression_brand: brandNameArr,\r\n product_impression_variant: productVariantArr,\r\n product_impression_price: productPriceArr\r\n });\r\n }\r\n};\r\n\r\nconst callTeliumOnClick = (categoryID: IFetchedCategoryIds[], product: ProductSearchResult): void => {\r\n const productName = product.Name;\r\n const productPositionArr: number[] = [];\r\n const productRecordID = product.RecordId;\r\n const categoryListArr: string[] = [];\r\n const brandNameArr: (string | undefined)[] = [];\r\n const productVariantArr: (string | number)[] = [];\r\n const productId = product.ItemId;\r\n categoryID?.forEach((item, index) => {\r\n if (productRecordID === item.productId) {\r\n productPositionArr.push(index + 1);\r\n categoryListArr.push(item.categoryName!);\r\n brandNameArr.push(item.brand);\r\n productVariantArr.push(item.variantID!);\r\n }\r\n });\r\n // @ts-ignore\r\n if (utag) {\r\n // @ts-ignore\r\n // tslint:disable-next-line: object-literal-key-quotes\r\n utag.link({\r\n event: 'product-click',\r\n enhanced_action: 'product_click',\r\n event_category: 'ecommerce',\r\n event_action: 'product click',\r\n event_label: `${productId}: ${productName}`,\r\n event_noninteraction: 'false',\r\n product_list_name: [`standard PLP`],\r\n product_position: productPositionArr,\r\n product_id: [`${productId}`],\r\n product_name: [`${productName}`],\r\n product_category: categoryListArr,\r\n product_brand: brandNameArr,\r\n product_variant: productVariantArr\r\n });\r\n }\r\n};\r\n\r\nconst updateProductsMessages = (\r\n products: ProductSearchResultExtended[],\r\n resultEyebrow: IMFIPromotion[] | null,\r\n targetAudienceGroup: string | undefined\r\n) => {\r\n products.map((product: ProductSearchResultExtended) => {\r\n if (resultEyebrow && resultEyebrow !== undefined) {\r\n let eyebrowMessage: string | undefined = '';\r\n if (resultEyebrow !== undefined) {\r\n const resultEyebrowTemp = resultEyebrow !== undefined ? resultEyebrow.slice() : [];\r\n resultEyebrowTemp.length &&\r\n resultEyebrowTemp.map((item: IMFIPromotion) => {\r\n if (product.ItemId === item.ItemId) {\r\n if (item.EyeBrows && item.EyeBrows.length && item.EyeBrows.length > 0) {\r\n if (targetAudienceGroup) {\r\n for (const eyebrow of item.EyeBrows) {\r\n const targetAudienceGroupValue = eyebrow.Description?.split('|')[2]?.toLowerCase();\r\n if (targetAudienceGroupValue === targetAudienceGroup.toLowerCase()) {\r\n eyebrowMessage = eyebrow.Description?.split('|')[0];\r\n break;\r\n }\r\n }\r\n // If no value configured then show the first EyebrowMessage without audienceGroup\r\n } else {\r\n for (const eyebrow of item.EyeBrows) {\r\n if (eyebrow.Description?.split('|').length === 2) {\r\n eyebrowMessage = eyebrow.Description?.split('|')[0];\r\n break;\r\n }\r\n }\r\n }\r\n }\r\n }\r\n });\r\n product.eyebrowMessage = eyebrowMessage;\r\n }\r\n }\r\n });\r\n};\r\n\r\nconst updateCoreDeiveryMessage = (products: ProductSearchResultExtended[],\r\n deliveryByMessages: IMFIATPInventoryEntityPLPEx[] | undefined) => {\r\n deliveryByMessages && deliveryByMessages?.length && products?.length && products.map(item => {\r\n const DistinctProductVariant = item.IsMasterProduct ?\r\n item.AttributeValues?.find(attributeValue => attributeValue.Name === \"EcomLowestPriceVariantRecId\")?.TextValue :\r\n item.RecordId.toString();\r\n const defaultVariantId = item.ExtensionProperties && item.ExtensionProperties.find(\r\n (property: CommerceProperty) => property?.Key === \"Unbxd_DefaultVariantID\"\r\n )?.Value?.LongValue;\r\n const recId = item.IsMasterProduct ? defaultVariantId?.toString() ?? DistinctProductVariant : item.RecordId?.toString();\r\n item.deliveryByMessage = deliveryByMessages?.find(message => message.VariantRecordId === recId)?.deliveryMessage ?? '';\r\n });\r\n};\r\n\r\n// tslint:disable-next-line:max-func-body-length\r\nexport const ProductSearchResultItems: React.FC<IProductSearchResultItems> = ({\r\n products,\r\n context,\r\n imageSettings,\r\n resources,\r\n moduleType,\r\n moduleId,\r\n allowBackNavigation,\r\n telemetryContent,\r\n productBadgeAttribute,\r\n mattressMatcherBanner,\r\n bannerPosition,\r\n mattressMatcherBannerIndex,\r\n targetAudienceGroup,\r\n listName,\r\n currentPromoProducts,\r\n isCategoryPage,\r\n categoryNameFromSlug,\r\n onlyNewProducts,\r\n isRefinersEnabled\r\n}) => {\r\n const [resultEyebrow, setResultEyebrow] = React.useState<IMFIPromotion[] | null>(null);\r\n const [resultCoreDelivery, setResultCoreDelivery] = React.useState<IMFIATPInventoryEntityPLPEx[] | undefined>(undefined);\r\n const [productIDList, setproductIDList] = React.useState<number[]>([]);\r\n const [categoryID, setCategoryID] = React.useState<IFetchedCategoryIds[]>([]);\r\n const productsForCallingAPI = onlyNewProducts?.length > 0 ? onlyNewProducts : currentPromoProducts;\r\n React.useEffect(() => {\r\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\r\n getProductsCategories(context, productsForCallingAPI, isCategoryPage, categoryNameFromSlug).then(result => {\r\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\r\n setCategoryID(uniqBy([...categoryID, ...result], 'productId'));\r\n });\r\n\r\n if (currentPromoProducts?.length) {\r\n callATPDelivery();\r\n }\r\n }, [productsForCallingAPI]);\r\n if (currentPromoProducts?.length) {\r\n const productIdsArray: IMFIItem[] | undefined = [];\r\n // const coreItems: IMFICartLine[] = [];\r\n productsForCallingAPI.map((item: ProductSearchResultExtended) => {\r\n // currentPromoProducts.map((item: IMessages) => {\r\n const DistinctProductVariant = item.IsMasterProduct ?\r\n item.AttributeValues?.find(attributeValue => attributeValue.Name === \"EcomLowestPriceVariantRecId\")?.TextValue :\r\n item.RecordId.toString();\r\n const defaultVariantId = item.ExtensionProperties && item.ExtensionProperties.find(\r\n (property: CommerceProperty) => property?.Key === \"Unbxd_DefaultVariantID\"\r\n )?.Value?.LongValue;\r\n const eyebrowMessageObj: IMFIItem = {\r\n ItemId: item.ItemId,\r\n DistinctProductVariant: defaultVariantId?.toString() ?? DistinctProductVariant\r\n };\r\n productIdsArray.push(eyebrowMessageObj);\r\n\r\n });\r\n const eyebrowMessagePromise = _getEyebrowMessage(productIdsArray, context);\r\n eyebrowMessagePromise\r\n .then(result => {\r\n if (result !== undefined) {\r\n setResultEyebrow(result);\r\n }\r\n })\r\n .catch(e => {\r\n console.log('Error', e);\r\n });\r\n updateProductsMessages(productsForCallingAPI, resultEyebrow, targetAudienceGroup);\r\n resultCoreDelivery && updateCoreDeiveryMessage(productsForCallingAPI, resultCoreDelivery);\r\n }\r\n\r\n const callATPDelivery = () => {\r\n const cartLines: IMFICartLineBatch[] = [];\r\n // const coreItems: IMFICartLine[] = [];\r\n productsForCallingAPI.map((item: ProductSearchResultExtended) => {\r\n // currentPromoProducts.map((item: IMessages) => {\r\n const DistinctProductVariant = item.IsMasterProduct ?\r\n item.AttributeValues?.find(attributeValue => attributeValue.Name === \"EcomLowestPriceVariantRecId\")?.TextValue :\r\n item.RecordId.toString();\r\n const defaultVariantId = item.ExtensionProperties && item.ExtensionProperties.find(\r\n (property: CommerceProperty) => property?.Key === \"Unbxd_DefaultVariantID\"\r\n )?.Value?.LongValue;\r\n const shippingInformationSmall = item.AttributeValues && item.AttributeValues.find(\r\n (attr: AttributeValue) => attr.Name?.trim() === context.app.config.smallParcelAttributeKey\r\n )?.TextValue?.toLowerCase();\r\n const defaultVariantShippingInformation = item.ExtensionProperties && item.ExtensionProperties.find(\r\n (property: CommerceProperty) => property?.Key === \"Unbxd_DefaultVariantShippingInformation\"\r\n )?.Value?.StringValue;\r\n if ((_getProductType(defaultVariantShippingInformation ?? shippingInformationSmall)) === 'Core') {\r\n const recId = item.IsMasterProduct ? defaultVariantId?.toString() ?? DistinctProductVariant : item.RecordId?.toString();\r\n cartLines.push({ ItemId: item.ItemId, Quantity: 1, VariantRecordId: recId });\r\n }\r\n });\r\n if (cartLines?.length) {\r\n void getListOfCoreDeliveryMessage(context.actionContext, cartLines).then(response => {\r\n if (response !== undefined) {\r\n setResultCoreDelivery(response);\r\n }\r\n }).catch(e => {\r\n console.log('Error [getListOfCoreDeliveryMessage]', e);\r\n });\r\n }\r\n };\r\n\r\n const handleProductId = (productID: number): void => {\r\n setproductIDList(prevArray => [...prevArray, productID]);\r\n };\r\n const skipProductsVal = getSkipProductValue(context);\r\n if (productIDList.length > skipProductsVal - 1) {\r\n if (categoryID.length > 0) {\r\n callTelium(listName, products, categoryID, productIDList);\r\n setproductIDList([]);\r\n }\r\n }\r\n // tslint:disable: no-shadowed-variable\r\n const renderProducts = (\r\n context: ICoreContext<IGeneric<IAny>>,\r\n resources: ISearchResultContainerResources,\r\n moduleType: string,\r\n moduleId: string,\r\n telemetryContent: ITelemetryContent,\r\n products: ProductSearchResult[],\r\n imageSettings?: IImageSettings,\r\n allowBackNavigation?: boolean,\r\n productBadgeAttribute?: string\r\n ) => {\r\n const [productArray, setProductArray] = React.useState<number[]>([]);\r\n const checkInvew = (inView: boolean, product: ProductSearchResultExtended) => {\r\n const productID = product.RecordId;\r\n const checkId = productArray.includes(productID);\r\n if (!checkId) {\r\n if (inView) {\r\n setProductArray(prevArray => [...prevArray, productID]);\r\n handleProductId(productID);\r\n }\r\n }\r\n };\r\n return (\r\n <ul className='list-unstyled'>\r\n {products.map((product: ProductSearchResultExtended, index: number) => (\r\n // tslint:disable-next-line: react-this-binding-issue jsx-no-lambda\r\n <InView\r\n onClick={() => callTeliumOnClick(categoryID, product)}\r\n as='div'\r\n rootMargin='0px 0px -200px 0px'\r\n onChange={inView => checkInvew(inView, product)}\r\n key={index}\r\n >\r\n <li className='ms-product-search-result__item' key={index}>\r\n <ProductComponent\r\n context={context}\r\n telemetryContent={telemetryContent}\r\n imageSettings={imageSettings}\r\n freePriceText={product.BasePrice ? resources.priceFree : ''}\r\n originalPriceText={resources.originalPriceText}\r\n currentPriceText={resources.currentPriceText}\r\n ratingAriaLabel={resources.ratingAriaLabel}\r\n allowBack={allowBackNavigation}\r\n id={moduleId}\r\n typeName={moduleType}\r\n data={{ product: product }}\r\n eyebrowMessage={product.eyebrowMessage}\r\n badgeAttribute={productBadgeAttribute}\r\n deliveryMessage={product.deliveryByMessage}\r\n isRefinersEnabled={isRefinersEnabled}\r\n />\r\n </li>\r\n </InView>\r\n ))}\r\n </ul>\r\n );\r\n };\r\n const shouldShowMattressMatcherBanner =\r\n mattressMatcherBanner !== undefined && mattressMatcherBannerIndex !== undefined && mattressMatcherBannerIndex >= 0;\r\n return (\r\n <>\r\n {bannerPosition !== undefined && bannerPosition >= 0 ? (\r\n <>\r\n {renderProducts(\r\n context,\r\n resources,\r\n moduleType,\r\n moduleId,\r\n telemetryContent,\r\n products.slice(0, bannerPosition),\r\n imageSettings,\r\n allowBackNavigation,\r\n productBadgeAttribute\r\n )}\r\n {shouldShowMattressMatcherBanner ? (\r\n <div data-m-image-position={get(mattressMatcherBanner![mattressMatcherBannerIndex!], 'props.config.imagePosition')}>\r\n {mattressMatcherBanner![mattressMatcherBannerIndex!]}\r\n </div>\r\n ) : (\r\n <></>\r\n )}\r\n {renderProducts(\r\n context,\r\n resources,\r\n moduleType,\r\n moduleId,\r\n telemetryContent,\r\n products.slice(bannerPosition, products.length),\r\n imageSettings,\r\n allowBackNavigation,\r\n productBadgeAttribute\r\n )}\r\n </>\r\n ) : (\r\n <>\r\n {renderProducts(\r\n context,\r\n resources,\r\n moduleType,\r\n moduleId,\r\n telemetryContent,\r\n products,\r\n imageSettings,\r\n allowBackNavigation,\r\n productBadgeAttribute\r\n )}\r\n </>\r\n )}\r\n </>\r\n );\r\n};\r\n","import * as React from 'react';\r\nimport getHtmlParserValue from '../../Utilities/get-html-parser-value';\r\nimport InfiniteScroll from 'react-infinite-scroll-component';\r\nimport { ISearchResultModalViewProps } from './components';\r\nimport {\r\n ICategoryHierarchyViewProps,\r\n IRefineMenuViewProps,\r\n ISearchResultContainerViewProps,\r\n ISortByViewProps,\r\n ITitleViewProps\r\n} from './mfrm-search-result-container';\r\n\r\nimport { getTelemetryObject, ITelemetryContent, Module, Node } from '@msdyn365-commerce-modules/utilities';\r\n// VSI Customization - Start\r\nimport MsDyn365, { getRichTextHtml, HtmlHeadInclude, RichText, Text, Image } from '@msdyn365-commerce/core';\r\nimport classnames from 'classnames';\r\nimport get from 'lodash/get';\r\nimport { ErrorMessage as MFRMErrorMessage } from '../../themes/mattressfirm/custom-components/error-message';\r\nimport { ProductSearchResultItems } from '../../themes/mattressfirm/custom-components/product-search-result-items';\r\nimport { IMfrmSearchResultContainerResources } from './mfrm-search-result-container.props.autogenerated';\r\nimport { ProductSearchResult } from '@msdyn365-commerce/retail-proxy';\r\n// tslint:disable-next-line: cyclomatic-complexity max-func-body-length max-line-length\r\nconst MfrmSearchResultContainerView: React.FC<ISearchResultContainerViewProps> = (props) => {\r\n const {\r\n SearchResultContainer,\r\n pagination,\r\n ProductsContainer,\r\n ProductSectionContainer,\r\n choiceSummary,\r\n clearAllBtn,\r\n isMobile,\r\n modalToggle,\r\n searchResultModal,\r\n TitleViewProps,\r\n refineMenu,\r\n categoryHierarchy,\r\n sortByOptions,\r\n CategoryNavContainer,\r\n RefineAndProductSectionContainer,\r\n FeatureSearchContainer,\r\n similarLookProduct,\r\n slots,\r\n resources,\r\n context,\r\n config: { searchTips },\r\n refinerRedirect,\r\n seoDataEntry\r\n } = props;\r\n const pageType: string | undefined = context.request.urlTokens.pageType;\r\n const pageName: string | undefined = context.request.telemetryPageName;\r\n let mfrmProducts = (props?.data?.listPageState?.result && props?.data?.listPageState?.result?.activeProducts) || [];\r\n if (mfrmProducts?.length === 1 && mfrmProducts[0]?.ItemId === '' && mfrmProducts[0]?.RecordId === 0) {\r\n mfrmProducts = [];\r\n }\r\n let errorText: RichText | String = '';\r\n const categoryPage = pageType === 'Category';\r\n if (!mfrmProducts || mfrmProducts.length === 0) {\r\n errorText = categoryPage ? resources.resultCategoryNotFoundText : searchTips || resources.resultSearchNotFoundText;\r\n }\r\n\r\n const categorySEOTitle = props.data.category.result?.ExtensionProperties?.find((attr) => attr.Key === 'CategorySEOTitle')?.Value\r\n ?.StringValue;\r\n const categorySEODescription = props.data.category.result?.ExtensionProperties?.find((attr) => attr.Key === 'CategorySEODescription')\r\n ?.Value?.StringValue;\r\n\r\n const tagsArr = _getSEOMetaTags(props);\r\n // VSI Customization - Ends\r\n if (isMobile) {\r\n return (\r\n /* VSI Customization - Start - title & Search tips rendering and modified classNames */\r\n <Module\r\n {...SearchResultContainer}\r\n className={classnames('ms-search-result-container', errorText ? 'ms-search-result-container__no-search-result' : '')}\r\n >\r\n <HtmlHeadInclude>\r\n {tagsArr.map(\r\n (tag, index) =>\r\n tag?.content && <meta name={tag?.name} content={tag?.content} key={index} /*property={tag?.property}*/ />\r\n )}\r\n </HtmlHeadInclude>\r\n {!errorText || categoryPage ? (\r\n <Node className='ms-search-result-container__search-results'>\r\n <Node className='ms-search-result-container__results'>\r\n {renderTitle(mfrmProducts, TitleViewProps, errorText, resources, pageName)}\r\n </Node>\r\n </Node>\r\n ) : (\r\n false\r\n )}\r\n {!errorText && renderCategoryHierarchy(categoryHierarchy)}\r\n {!errorText || categoryPage ? modalToggle : false}\r\n {!errorText || categoryPage ? choiceSummary : false}\r\n {!errorText || categoryPage ? createSearchResultModal(searchResultModal, refineMenu, sortByOptions, refinerRedirect) : false}\r\n {!errorText && <Node {...FeatureSearchContainer}>{similarLookProduct}</Node>}\r\n <Node className={errorText && !categoryPage ? 'ms-search-result-container__no-search-result-section' : ''}>\r\n <Node\r\n className={\r\n categoryPage && errorText\r\n ? 'ms-search-result-container__category-error'\r\n : !categoryPage && errorText\r\n ? 'ms-search-result-container__nsrp-error'\r\n : ''\r\n }\r\n >\r\n {errorText && (\r\n <div className='ms-search-result-container__error'>\r\n {renderErrorMessage(TitleViewProps, errorText, resources, categoryPage)}\r\n <MFRMErrorMessage errorMsg={errorText} />\r\n </div>\r\n )}\r\n {errorText && categoryPage && <div className='ms-search-result-container__clear-all'>{clearAllBtn}</div>}\r\n {errorText && !categoryPage && (\r\n <Node className='ms-search-result-container__help-block'>\r\n {slots && slots.nsrpNeedAssistance && slots.nsrpNeedAssistance[0]}\r\n </Node>\r\n )}\r\n </Node>\r\n </Node>\r\n <Node\r\n {...ProductsContainer}\r\n className={\r\n errorText ? 'ms-search-result-container__no-search-result-container' : 'ms-search-result-container__Products'\r\n }\r\n >\r\n {/* VSI Customization - Start - NSRP Container Slot content rendering */}\r\n {errorText &&\r\n slots &&\r\n slots.nsrpContainer &&\r\n slots.nsrpContainer.map((children: React.ReactNode) => {\r\n return children;\r\n })}\r\n {/* VSI Customization - End */}\r\n {!errorText && _renderProductSearchResultItems(props)}\r\n </Node>\r\n <div className='hidden'>{pagination}</div>\r\n {/* VSI Customization - start */}\r\n {_categorySeoCopy(categorySEOTitle, categorySEODescription, seoDataEntry)}\r\n {/* VSI Customization - End */}\r\n </Module>\r\n );\r\n }\r\n return (\r\n /* VSI Customization - Start - title & Search tips rendering and modified classNames */\r\n <Module\r\n {...SearchResultContainer}\r\n className={errorText ? 'ms-search-result-container__no-search-result' : 'ms-search-result-container'}\r\n >\r\n <HtmlHeadInclude>\r\n {tagsArr.map(\r\n (tag, index) =>\r\n tag?.content && <meta name={tag?.name} content={tag?.content} key={index} />\r\n )}\r\n </HtmlHeadInclude>\r\n {!errorText || categoryPage ? (\r\n <Node className='ms-search-result-container__search-results'>\r\n <Node className='ms-search-result-container__results'>\r\n {TitleViewProps && renderTitle(mfrmProducts, TitleViewProps, errorText, resources, pageName)}\r\n </Node>\r\n {sortByOptions && renderSort(sortByOptions)}\r\n </Node>\r\n ) : (\r\n false\r\n )}\r\n {!errorText || categoryPage ? (\r\n <Node className='ms-search-result-container__choice-summary-container'>{choiceSummary}</Node>\r\n ) : (\r\n false\r\n )}\r\n {!errorText ? <Node {...CategoryNavContainer}>{categoryHierarchy && renderCategoryHierarchy(categoryHierarchy)}</Node> : false}\r\n <Node\r\n {...RefineAndProductSectionContainer}\r\n className={\r\n !errorText || categoryPage\r\n ? 'ms-search-result-container__refine-product-section'\r\n : errorText && !categoryPage\r\n ? 'ms-search-result-container__no-search-result-section'\r\n : ''\r\n }\r\n >\r\n {refinerLoader(refinerRedirect)}\r\n {!errorText || categoryPage ? refineMenu && renderRefiner(refineMenu) : false}\r\n <Node {...ProductSectionContainer} className={'ms-search-result-container__product-section'}>\r\n <Node\r\n className={\r\n categoryPage && errorText\r\n ? 'ms-search-result-container__category-error'\r\n : !categoryPage && errorText\r\n ? 'ms-search-result-container__nsrp-error'\r\n : ''\r\n }\r\n >\r\n <Node\r\n className={\r\n categoryPage && errorText\r\n ? 'ms-search-result-container__category-error-container'\r\n : !categoryPage && errorText\r\n ? 'ms-search-result-container__nsrp-error-container'\r\n : ''\r\n }\r\n >\r\n {errorText && (\r\n <div className='ms-search-result-container__error'>\r\n {renderErrorMessage(TitleViewProps, errorText, resources, categoryPage)}\r\n <MFRMErrorMessage errorMsg={errorText} />\r\n </div>\r\n )}\r\n {errorText && categoryPage && <div className='ms-search-result-container__clear-all'>{clearAllBtn}</div>}\r\n {errorText && !categoryPage && (\r\n <Node className='ms-search-result-container__help-block'>\r\n {slots && slots.nsrpNeedAssistance && slots.nsrpNeedAssistance[0]}\r\n </Node>\r\n )}\r\n </Node>\r\n </Node>\r\n {!errorText && <Node {...FeatureSearchContainer}>{similarLookProduct}</Node>}\r\n <Node\r\n {...ProductsContainer}\r\n className={\r\n errorText ? 'ms-search-result-container__no-search-result-container' : 'ms-search-result-container__Products'\r\n }\r\n >\r\n {/* VSI Customization for Classes - End */}\r\n {/* Commenting out following code as it causes duplicate mattress matcher container */}\r\n {/* VSI Customization - Start - NSRP Container Slot content rendering */}\r\n {errorText &&\r\n slots &&\r\n slots.nsrpContainer &&\r\n slots.nsrpContainer.map((children: React.ReactNode) => {\r\n return children;\r\n })}\r\n {/* VSI Customization - End */}\r\n {/* {products} */}\r\n {!errorText && _renderProductSearchResultItems(props)}\r\n </Node>\r\n <div className='hidden'>{pagination}</div>\r\n </Node>\r\n </Node>\r\n {/* VSI Customization - start */}\r\n {_categorySeoCopy(categorySEOTitle, categorySEODescription, seoDataEntry)}\r\n {/* VSI Customization - end */}\r\n </Module>\r\n );\r\n};\r\n// this will add title and description and description to above footer\r\nconst _categorySeoCopy = (categorySEOTitle?: string, categorySEODescription?: string, seoDataEntry?: object | undefined): JSX.Element | null => {\r\n const seoState = seoDataEntry && seoDataEntry['SEO State'];\r\n const title = seoState === 'Active' ? seoDataEntry && seoDataEntry['H1 Tag'] : categorySEOTitle;\r\n const description = seoState === 'Active' ? seoDataEntry && seoDataEntry['Seo Overview Copy'] : categorySEODescription;\r\n\r\n return title && description ? (\r\n <div className='ms-search-result__seo'>\r\n <Text tag='h2' text={getHtmlParserValue(title)} />\r\n <div className='ms-search-result__seo-text'>\r\n <Text tag='p' text={getHtmlParserValue(description)} />\r\n </div>\r\n </div>\r\n ) : null;\r\n};\r\n\r\n{\r\n /* VSI Customization - START - 6432 */\r\n}\r\nconst _getSEOMetaTags = (props: ISearchResultContainerViewProps) => {\r\n const { activeRefiners, seoDataEntry } = props;\r\n const isActiveRefiner = activeRefiners?.length! > 0 || false;\r\n const seoState = seoDataEntry && seoDataEntry['SEO State'];\r\n const seoMetaTags = isActiveRefiner && seoState === 'Active' ? seoDataEntry && seoDataEntry['Meta Keywords'] : undefined;\r\n const categoryPageKeywords = seoMetaTags || _getSEOMetaTagValue(props, 'CategoryPageKeywords');\r\n const categoryPageKeywordsParser = getHtmlParserValue(categoryPageKeywords);\r\n return [\r\n { content: categoryPageKeywordsParser, name: 'keywords' }\r\n ];\r\n};\r\n\r\nconst _getSEOMetaTagValue = (props: ISearchResultContainerViewProps, keyValue: string) => {\r\n return props?.data.category.result?.ExtensionProperties?.find((attr) => attr.Key === keyValue)?.Value?.StringValue;\r\n};\r\n\r\n\r\n{\r\n /* VSI Customization - END - 6432 */\r\n}\r\n\r\nconst _renderProductSearchResultItems = (props: ISearchResultContainerViewProps): JSX.Element | null => {\r\n try {\r\n const {\r\n addedProducts,\r\n onlyNewProducts,\r\n resources,\r\n config: { imageSettings, allowBackNavigation },\r\n isCategoryPage,\r\n categoryNameFromSlug,\r\n showProductsLoader\r\n } = props;\r\n const breadCrumbType = props.context.app.config.breadcrumbType;\r\n const allowBack = allowBackNavigation && (breadCrumbType === 'back' || breadCrumbType === 'categoryAndBack');\r\n\r\n let newProducts = MsDyn365.isBrowser && get(props.data.listPageState.result, 'activeProducts') || [];\r\n let showLoader = true;\r\n\r\n if (addedProducts.length) {\r\n newProducts = addedProducts;\r\n }\r\n\r\n if (props.data.listPageState.result?.totalProductCount === addedProducts.length || newProducts.length === 0 || newProducts.length < 24) {\r\n showLoader = false;\r\n }\r\n\r\n const mattressMatcherBannerIndex = (props.matcherBannerSlotInd !== undefined) ? props.matcherBannerSlotInd : 0;\r\n const telemetryContent: ITelemetryContent = getTelemetryObject(\r\n props.context.request.telemetryPageName!,\r\n props.friendlyName,\r\n props.telemetry\r\n );\r\n const listName = props.config?.productImpressionListName;\r\n const isRefinersEnabled = props.data.listPageState.result?.activeFilters && props.data.listPageState.result?.activeFilters.length > 0 || false;\r\n return (\r\n <>\r\n {showProductsLoader ? _renderImageLoader(showProductsLoader, props) : <InfiniteScroll\r\n dataLength={newProducts.length}\r\n next={props.getScrolledProducts}\r\n hasMore={showLoader}\r\n scrollThreshold={0.5}\r\n loader={\r\n <div className='ms-infinite-scroll__search-in-progress'>\r\n <div className={classnames('msc-waiting', 'msc-waiting-circular')} />\r\n </div>\r\n }\r\n >\r\n <ProductSearchResultItems\r\n products={newProducts}\r\n context={props.context}\r\n imageSettings={imageSettings}\r\n resources={resources}\r\n moduleType={props.typeName}\r\n moduleId={props.id}\r\n allowBackNavigation={allowBack}\r\n telemetryContent={telemetryContent}\r\n // @ts-ignore\r\n productBadgeAttribute={props.app.config.productBadgeAttribute}\r\n mattressMatcherBanner={props.slots.mattressMatcherBanner}\r\n mattressMatcherBannerIndex={mattressMatcherBannerIndex}\r\n bannerPosition={props.config.showBannerPosition}\r\n targetAudienceGroup={props.config.targetAudienceGroup}\r\n listName={listName}\r\n currentPromoProducts={newProducts}\r\n isCategoryPage={isCategoryPage}\r\n categoryNameFromSlug={categoryNameFromSlug}\r\n onlyNewProducts={onlyNewProducts}\r\n isRefinersEnabled={isRefinersEnabled}\r\n />\r\n </InfiniteScroll>\r\n }\r\n </>\r\n );\r\n } catch (error) {\r\n return null;\r\n }\r\n};\r\n\r\nconst createSearchResultModal = (\r\n modalProps: ISearchResultModalViewProps,\r\n refineMenu: IRefineMenuViewProps,\r\n sortByDropDown: ISortByViewProps,\r\n refinerRedirect: boolean\r\n): JSX.Element => {\r\n return React.cloneElement(\r\n modalProps.modal,\r\n {},\r\n modalProps.modalHeader,\r\n refinerLoader(refinerRedirect),\r\n createModalBody(modalProps, refineMenu, sortByDropDown),\r\n modalProps.modalFooter\r\n );\r\n};\r\n\r\nconst createModalBody = (\r\n props: ISearchResultModalViewProps,\r\n refineMenu: IRefineMenuViewProps,\r\n sortByDropDown: ISortByViewProps\r\n): JSX.Element | null => {\r\n if (sortByDropDown) {\r\n return React.cloneElement(props.modalBody, {}, renderSort(sortByDropDown), renderRefiner(refineMenu));\r\n }\r\n return null;\r\n};\r\n\r\nconst _renderImageLoader = (isRefinerLoading: boolean, props: ISearchResultContainerViewProps): JSX.Element | null => {\r\n const loaderUrl = props.config?.screenLoaderUrl;\r\n const gridSettings = props.context.request.gridSettings;\r\n const { isMobile, seoDataEntry } = props;\r\n if (isRefinerLoading) {\r\n return (\r\n <Node className='ms-search-result-container__screen-loader'>\r\n {isMobile && seoDataEntry !== undefined && (seoDataEntry['Banner State'] === 'Active' || seoDataEntry['Seo Overview Copy'] !== '')\r\n ? <Node className='msc-waiting msc-waiting-circular' />\r\n : loaderUrl ? <Image src={loaderUrl} altText='loader' gridSettings={gridSettings!} />\r\n : <Node className='msc-waiting msc-waiting-circular' />}\r\n </Node>\r\n );\r\n }\r\n return null;\r\n};\r\nconst refinerLoader = (isRefinerLoading: boolean): JSX.Element | null => {\r\n if (isRefinerLoading) {\r\n return (\r\n <Node className='ms-search-result-container__screen-loader'>\r\n <Node className='msc-waiting msc-waiting-circular' />\r\n </Node>\r\n );\r\n }\r\n return null;\r\n};\r\n\r\nconst renderRefiner = (props: IRefineMenuViewProps): JSX.Element | null => {\r\n const { refiners, RefineMenuContainer, RefinerSectionContainer } = props;\r\n if (refiners) {\r\n return (\r\n <Node {...RefinerSectionContainer}>\r\n <Node {...RefineMenuContainer}>\r\n <Node className='ms-refine-submenu__title'>{props.refinerLabel}</Node>\r\n {refiners.map((submenu, index) => (\r\n <React.Fragment key={index}>{submenu}</React.Fragment>\r\n ))}\r\n </Node>\r\n </Node>\r\n );\r\n }\r\n return null;\r\n};\r\n\r\nconst renderSort = (props: ISortByViewProps): JSX.Element | null => {\r\n const { sortByDropDown } = props;\r\n if (sortByDropDown) {\r\n return <div>{sortByDropDown}</div>;\r\n }\r\n return null;\r\n};\r\n\r\nconst renderCategoryHierarchy = (props: ICategoryHierarchyViewProps): JSX.Element | null => {\r\n const { CategoryHierarchyContainer, categoryHierarchyList, categoryHierarchySeparator } = props;\r\n if (categoryHierarchyList) {\r\n return (\r\n <Node {...CategoryHierarchyContainer}>\r\n {categoryHierarchyList.map((category, index) => (\r\n <React.Fragment key={index}>\r\n {category}\r\n {categoryHierarchyList && categoryHierarchyList[index + 1] && categoryHierarchySeparator}\r\n </React.Fragment>\r\n ))}\r\n </Node>\r\n );\r\n }\r\n\r\n return null;\r\n};\r\n// VSI Customization - Start\r\nconst renderTitle = (\r\n activeProducts: ProductSearchResult[],\r\n titleProps: ITitleViewProps,\r\n errorMsg: RichText | string,\r\n resources: IMfrmSearchResultContainerResources,\r\n pageName: string | undefined\r\n): JSX.Element | null => {\r\n const { title, TitleContainer } = titleProps;\r\n const extProperties = activeProducts.length > 0 && activeProducts[0]?.ExtensionProperties || [];\r\n const fallBackQueryResult = extProperties?.find(obj => obj.Key === 'FallbackQuery')?.Value?.StringValue;\r\n const originalBackQueryResult = extProperties?.find(obj => obj.Key === 'OrignalQuery')?.Value?.StringValue;\r\n if (title) {\r\n // tslint:disable: react-no-dangerous-html\r\n return (\r\n <Node {...TitleContainer}>\r\n {\r\n <>\r\n {fallBackQueryResult === '' && pageName === 'Search' && <>\r\n {title.searchPageTitle} <span className='ms-search-result__result-text'>{title.titleCount}</span> <div> {title.titlePrefix} “{title.titleText}” </div>\r\n </>}\r\n {fallBackQueryResult !== '' && pageName === 'Search' && <>\r\n <div className='ms-search-result__incorrect'> You searched for <span className='ms-search-result__incorrect-result'>‘{originalBackQueryResult}’ </span>\r\n <span className='ms-search-result__result-text'>{title.titleCount}</span> </div>\r\n <div className='ms-search-result__correct'> Showing results for <span className='ms-search-result__correct-result'>‘{fallBackQueryResult}’</span> </div>\r\n </>}\r\n {pageName !== 'Search' && <> {title.titleText} <span className='ms-search-result__result-text'>{title.titleCount}</span> </>}\r\n </>\r\n }\r\n </Node>\r\n );\r\n }\r\n return null;\r\n};\r\n\r\nconst renderErrorMessage = (\r\n props: ITitleViewProps,\r\n errorMsg: RichText | string,\r\n resources: IMfrmSearchResultContainerResources,\r\n categoryPage: boolean\r\n): JSX.Element | null => {\r\n const { title } = props;\r\n const collectionText: string = (get(title.titleText, 'props.children') || '').replace(/['']+/g, '');\r\n const nsrText = resources.mfrmSearchText.replace('{query}', collectionText).replace(/‘[^']*’/g, '<span>$&</span>');\r\n const noResultsText = resources.mfrmNoResultsText.replace('{query}', collectionText).replace(/‘[^']*’/g, '<span>$&</span>');\r\n const errorText = categoryPage ? noResultsText : nsrText;\r\n\r\n return (\r\n <Node className='ms-search-result-container__error-container'>\r\n {errorMsg ? (\r\n <p className='ms-search-result-container__error-message' dangerouslySetInnerHTML={getRichTextHtml(errorText)} />\r\n ) : (\r\n ''\r\n )}\r\n </Node>\r\n );\r\n};\r\n// VSI Customization - End\r\n\r\nexport default MfrmSearchResultContainerView;\r\n","const binding = { modules: {}, dataActions: {} };\n\n const registerActionId = (actionPath) => {\n if (binding.dataActions[actionPath] &&\n binding.dataActions[actionPath].default &&\n binding.dataActions[actionPath].default.prototype &&\n binding.dataActions[actionPath].default.prototype.id) {\n binding.dataActions[binding.dataActions[actionPath].default.prototype.id] = binding.dataActions[actionPath];\n } else {\n Object.keys(binding.dataActions[actionPath] || {}).forEach(exportName => {\n if (binding.dataActions[actionPath][exportName] &&\n binding.dataActions[actionPath][exportName].prototype &&\n binding.dataActions[actionPath][exportName].prototype.Action) {\n binding.dataActions[binding.dataActions[actionPath][exportName].prototype.id] = binding.dataActions[actionPath][exportName];\n }\n })\n }\n };\n\n const registerSanitizedActionPath = (sanitizedActionPath, dataAction) => {\n if (process.env.NODE_ENV === 'development') {\n if (!dataAction.default) {\n throw new Error('Data action path does not have a default export');\n }\n if (!(dataAction.default.prototype.id && binding.dataActions[dataAction.default.prototype.id]) || !binding.dataActions[sanitizedActionPath]) {\n binding.dataActions[sanitizedActionPath] = dataAction;\n }\n } else {\n binding.dataActions[sanitizedActionPath] = dataAction;\n if (!binding.dataActions[sanitizedActionPath].default) {\n throw new Error('Data action path ' + sanitizedActionPath + ' does not have a default export');\n }\n binding.dataActions[sanitizedActionPath].default.prototype.RegistrationId = sanitizedActionPath;\n if (binding.dataActions[sanitizedActionPath].default.prototype.id) {\n binding.dataActions[binding.dataActions[sanitizedActionPath].default.prototype.id] = sanitizedActionPath;\n }\n }\n };\n \n\n (binding.modules['mfrm-search-result-container'] = {\n c: () => require('partner/modules/mfrm-search-result-container/mfrm-search-result-container.tsx'),\n $type: 'containerModule',\n da: [{name:'category', path:'@msdyn365-commerce-modules/retail-actions/dist/lib/get-current-category', runOn: 0},{name:'categoryHierarchy', path:'@msdyn365-commerce-modules/retail-actions/dist/lib/get-current-category-hierarchy', runOn: 0},{name:'featureProduct', path:'@msdyn365-commerce-modules/retail-actions/dist/lib/get-selected-variant', runOn: 0},{name:'listPageState', path:'modules/mfrm-search-result-container/list-page-state', runOn: 0},{name:'navMenuState', path:'data-actions/navigation-menu-state-data-action', runOn: 0},{name:'products', path:'modules/mfrm-search-result-container/actions/get-full-products-by-collection', runOn: 0},{name:'refiners', path:'modules/mfrm-search-result-container/actions/get-refiners-for-collection', runOn: 0},{name:'searchConfiguration', path:'modules/mfrm-search-result-container/actions/get-mapped-search-configuration', runOn: 0},{name:'seoData', path:'data-actions/get-seo-data.action', runOn: 0},{name:'updateBreadcrumbOnSrp', path:'actions/srp-breadcrumb-page.action', runOn: 0}],\n \n iNM: false,\n ns: '__local__',\n n: 'mfrm-search-result-container',\n p: '__local__',\n \n pdp: '',\n \n \n md: 'src/modules/mfrm-search-result-container'\n });\n \n\n {\n const sanitizedActionPath = '@msdyn365-commerce-modules/retail-actions/dist/lib/get-current-category';\n let dataAction = require('@msdyn365-commerce-modules/retail-actions/dist/lib/get-current-category');\n registerSanitizedActionPath(sanitizedActionPath, dataAction);\n }\n \n\n {\n const sanitizedActionPath = '@msdyn365-commerce-modules/retail-actions/dist/lib/get-current-category-hierarchy';\n let dataAction = require('@msdyn365-commerce-modules/retail-actions/dist/lib/get-current-category-hierarchy');\n registerSanitizedActionPath(sanitizedActionPath, dataAction);\n }\n \n\n {\n const sanitizedActionPath = '@msdyn365-commerce-modules/retail-actions/dist/lib/get-selected-variant';\n let dataAction = require('@msdyn365-commerce-modules/retail-actions/dist/lib/get-selected-variant');\n registerSanitizedActionPath(sanitizedActionPath, dataAction);\n }\n \n\n {\n const sanitizedActionPath = 'actions/srp-breadcrumb-page.action';\n let dataAction = require('partner/actions/srp-breadcrumb-page.action');\n registerSanitizedActionPath(sanitizedActionPath, dataAction);\n }\n \n\n {\n const sanitizedActionPath = 'data-actions/get-seo-data.action';\n let dataAction = require('partner/data-actions/get-seo-data.action');\n registerSanitizedActionPath(sanitizedActionPath, dataAction);\n }\n \n\n {\n const sanitizedActionPath = 'data-actions/navigation-menu-state-data-action';\n let dataAction = require('partner/data-actions/navigation-menu-state-data-action');\n registerSanitizedActionPath(sanitizedActionPath, dataAction);\n }\n \n\n {\n const sanitizedActionPath = 'modules/mfrm-search-result-container/actions/get-full-products-by-collection';\n let dataAction = require('partner/modules/mfrm-search-result-container/actions/get-full-products-by-collection');\n registerSanitizedActionPath(sanitizedActionPath, dataAction);\n }\n \n\n {\n const sanitizedActionPath = 'modules/mfrm-search-result-container/actions/get-mapped-search-configuration';\n let dataAction = require('partner/modules/mfrm-search-result-container/actions/get-mapped-search-configuration');\n registerSanitizedActionPath(sanitizedActionPath, dataAction);\n }\n \n\n {\n const sanitizedActionPath = 'modules/mfrm-search-result-container/actions/get-refiners-for-collection';\n let dataAction = require('partner/modules/mfrm-search-result-container/actions/get-refiners-for-collection');\n registerSanitizedActionPath(sanitizedActionPath, dataAction);\n }\n \n\n {\n const sanitizedActionPath = 'modules/mfrm-search-result-container/list-page-state';\n let dataAction = require('partner/modules/mfrm-search-result-container/list-page-state');\n registerSanitizedActionPath(sanitizedActionPath, dataAction);\n }\n \n\n \n window.__bindings__ = window.__bindings__ || {};\n window.__bindings__.modules = {\n ...window.__bindings__.modules || {},\n ...binding.modules\n };\n \n window.__bindings__.dataActions = {\n ...window.__bindings__.dataActions || {},\n ...binding.dataActions\n };\n export const viewDictionary = {};\n viewDictionary['__local__|__local__|modules|mfrm-search-result-container|mfrm-search-result-container'] = {\n c: () => require('partner/modules/mfrm-search-result-container/mfrm-search-result-container.view.tsx'),\n cn: '__local__-__local__-mfrm-search-result-container'\n };\nwindow.__bindings__ = window.__bindings__ || {};\nwindow.__bindings__.viewDictionary = {\n ...window.__bindings__.viewDictionary || {},\n ...viewDictionary\n };","module.exports = React;","module.exports = ReactDOM;"],"names":["async","ctx","cartLines","zipCode","data","fetchCoreDeliveryListAction","FetchCoreDeliveryListInput","ATPInventoryPLPData","map","deliveryItem","i","deliveryMessage","Available","undefined","ATPQuantity","parseInt","date","Date","today","dayjs","now","format","deliveryDate","SlotDate","setDate","getDate","requestContext","app","config","defaultDeliveryMessage","value","parsedValue","parsedArr","ReactHtmlParser","length","toString","getPagePath","MsDyn365","window","location","href","split","host","includes","GetCategoryPathsInput","constructor","context","catalogId","productIds","getCacheKey","this","constructedCacheKey","getCacheObjectType","dataCacheType","ChannelId","apiSettings","channelId","CatalogId","ids","join","createGetCategoryPathsInput","inputData","Error","getProductsCategoryPathsAction","input","catPaths","hasArray","productsIter","push","ProductId","getCategoryPathsAsync","callerContext","queryResultSettings","Paging","Top","Sorting","err","console","log","getCategoryPathsActionDataAction","createObservableDataAction","id","action","SrpBreadcrumbPageInput","Msdyn365","breadcrumbCheck","args","GetSeoDataInput","seoDataUrl","super","shouldCacheOutput","cacheObjectType","cacheKey","getSeoDataUrl","jsonUrl","res","filteredUrlPath","filteredURL","seoData","NavMenuStateInput","navMenuStateAction","isMenuHasParent","isMobileMenuCollapsed","selectedNavMenu","menuItemData","sortOptions","sortByOptionRelevanceDesc","sortByOptionRatingAsc","sortByOptionRatingDesc","sortByOptionNameAsc","sortByOptionNameDesc","sortByOptionPriceAsc","sortByOptionPriceDesc","MappedSearchInput","buildCacheKey","getMappedSearchConfiguration","getSearchConfigurationAsync","then","searchConfiguration","ProductSortColumns","sortColumn","key","ColumnName","toUpperCase","IsDescending","telemetry","warning","filter","Boolean","createInput","UiLabeledDropdown","React","props","selectSorting","values","_onSelectOption","setState","indexValue","handleDropDown","isShow","state","setWrapperRef","instance","wrapperRef","handleClickOutside","event","contains","target","bind","selectedKey","selectedOption","keys","dropdownOptions","option","selectedIndex","indexOf","componentDidMount","document","addEventListener","componentWillUnmount","removeEventListener","render","labelText","labelClassname","dropdownId","labelClassNames","classnames","_getSelectedIndex","role","className","onClick","ref","htmlFor","tabIndex","index","controlledByParent","onSelectOption","toggleColor","Link","text","ariaLabel","ProductSearchResultItems","products","imageSettings","resources","moduleType","moduleId","allowBackNavigation","telemetryContent","product","ProductComponent","RecordId","freePriceText","priceFree","originalPriceText","currentPriceText","ratingAriaLabel","allowBack","typeName","FeatureSearchResultItem","productName","Name","productRecordId","productUrl","getProductPageUrlSync","actionContext","fallbackImage","getFallbackImageUrl","ItemId","payLoad","getPayloadObject","attribute","getTelemetryAttributes","onTelemetryClick","gridSettings","imageUrl","altText","img","src","imageProps","fallBackSrc","Image","Object","loadFailureBehavior","renderProductPlacementImage","request","PrimaryImageUrl","featureSimilarLooksTitle","title","Title","Separator","separator","DisplayTemplate","AttributeDataType","ProductRefinerValueDataTypeValue","ProductRefinerTypeValue","ProductRefinerSource","isRangeType","dataTypeValue","findMatchingRefinementCriterion","productRefinerValue","refinementCriteria","find","refinementCriterion","isMatchingRefinementCriterion","RefinerRecordId","RefinerSourceValue","DataTypeValue","LeftValueBoundString","getUpdatedRefinementCriteria","itemToggleNotification","currentRefinementCriteria","updatedRefinementCriteria","toggledItemFound","forEach","selectedCriterion","isSelecting","next","rangeStart","RightValueBoundString","rangeEnd","parentProductRefinerHierarchy","RefinerTypeValue","RefinerType","Values","child","matchingIndex","findIndex","criterion","splice","RangeRefineItem","_formattedPriceReverseLookup","Map","_onRangeUpdate","_onRangeUpdateEnd","_handleRangeTooltipText","_changeMin","_changeMax","_finishChangeMin","_finishChangeMax","minInput","maxInput","selectedRefinementCriterion","initialMin","initialMax","isChecked","validationErrorMin","validationErrorMax","selectedMin","selectedMax","touchedMin","touchedMax","UnitText","refineItemCommonProps","isCategoryPage","isPriceRefinerDisabled","isDisableSlider","rangeType","_renderInputFields","_renderSlider","_initializeMaxValue","formattedSelectedMax","max","_getFormattedSelectedValue","isDisabled","formAttrs","rangeNameFormat","replace","KeyName","minInputClassName","maxInputClassName","formattedSelectedMin","minLabel","onChange","onFocus","onBlur","disabled","maxLabel","placeholder","placeholderTextMax","min","sliderId","ariaAttributes","minPrice","_formatPrice","maxPrice","selectedMinPrice","selectedMaxPrice","Slider","inForm","Number","step","orientation","labels","labelId","labelString","labelPositioning","showLabels","showTooltip","sliderThumbs","minValueSliderThumbAriaLabel","currencyCode","ariaValueText","maxValueSliderThumbAriaLabel","onChangeEnd","debounce","handleTooltipText","_changeValue","inputType","touchedKey","_getInputWithoutFormatting","currentTarget","selectedMinValue","selectedMinValueRounded","Math","floor","isNaN","minTouched","onToggle","maxNum","validationErrorNaN","_focus","_validateRange","selectedMaxValue","selectedMaxValueRounded","maxTouched","minNum","setTimeout","current","focus","selected","touched","validationError","validationErrorRange","amount","locale","result","currency","trace","priceAmount","Intl","NumberFormat","style","currencyDisplay","minimumFractionDigits","e","formatPrice","has","set","inputAsNum","get","sliderChangeNotification","eventType","firstThumbValue","secondThumbValue","_focusOnSliderThumb","element","getElementById","tooltip","__decorate","computed","observer","RefineItem","_onClick","preventDefault","anchorType","singleProductCountAriaLabel","refineItemAriaLabel","refineItemsAriaLabel","children","attrs","JSON","stringify","isSingleSelect","itemTypeClassName","productText","LeftValueBoundLocalizedString","productCount","Count","refineMenuItemAriaLabel","SourceValue","contentAction","etext","_getRefinerUrl","refinerRating","ratingRefiner","selectedRefinerValues","selectedRating","ratingComponentClass","isMobileView","RatingComponent","avgRating","ratingCount","hideCount","readOnly","moduleTypeName","_getIsCategoryPage","pageType","urlTokens","query","categoryId","toLowerCase","urlBuilder","urlRefinerParts","urlParts","sortedConfigValues","filteredRefiners","urlSpecialCharsConfig","canonicalUrlspecialCharIncludeList","parentProductRefinerName","trim","getVirtualRefinerNames","isMattressesCategory","refinerParts","currentRefinerName","regExSpecialChars","sortedValues","refinerSet","refinerName","refiner","refinerPart","toLocaleLowerCase","sortedValue","sort","a","b","finalRefiners","sortedConfigValue","sortedRefinerName","concatValue","queryStr","url","requestUrl","search","origin","categoryPart","ChoiceSummary","closeButtonGlyph","stopPropagation","clearAll","getAttribute","selectedRefiner","_getSelectedRefinerChoice","onChoiceClicked","itemClicked","choiceClicked","nextItemToFocus","nextSibling","parentKeyName","_onClickKeyName","keyName","selectedChoices","_getKeyForRefinerValue","parentKey","_getParentKeyForRefinerValue","clearAllText","label","classNames","choiceAriaLabel","clearAllModal","closeAriaLabel","items","selectedRefinersMap","clearAllAttributes","item","customUrlBuilder","aria-label","clearAllBtn","choiceFormat","choiceRangeValueFormat","refinerHierarchy","overallFormat","rangeFormat","refinerValueName","parent","hierarchy","innerText","ModalToggle","innerRef","modalNode","Modal","autoFocus","applicationNode","returnFocusRef","returnRef","isOpen","toggle","onModalToggle","zIndex","modalHeaderNode","ModalHeader","modalTitle","modalFooterNode","ModalFooter","Button","modalCloseButtonText","totalItems","generateButtonText","RefineSubmenu","_pluralizeKeyName","slice","_showMore","refineItemsExpanded","itemsToShow","_setRefineItemsLimitToDisplay","productRefinerHierarchy","refinerNumberOfItemsToDisplay","_onToggleItem","_onToggleSubmenu","isExpanded","isExpandedOnInitialLoad","expanded","error","hideRating","_renderChildItems","onKeyPress","refinerShowLessText","refinerShowMoreText","_renderRange","_renderSingleMultiSelect","isMobile","refinerValuesList","listItems","selectedValue","_getRangeType","DisplayTemplateValue","Range","SliderWithBars","submenuClassNamePrefix","onUpdateRefiners","prevState","ErrorMessage","SearchResultContainer","sortByDropdownOptions","_pageType","_isCustomizedRefiner","urlModifications","_viewport","currentNavMenu","getCategoryName","categoryName","q","category","SearchResultContainer_1","getFriendlyName","NameTranslations","getSkipProductValue","skipProducts","viewPortCode","_getViewport","innerWidth","_filterMenuItem","menuItemList","currentNavigation","_updateMattressMatcherBannerWithUrlOnly","mattressMatcherBannerID","subMenu","navMenuItem","destinationURL","clpLink","destinationUrl","linkURL","toCheckURL","_parseLink","pathname","_updateMattressMatcherBannerSlot","slots","mattressMatcherBanner","moduleIds","splittedIDs","k","matcherBannerSlotInd","lastBannerID","_updateMattressMatcherBanner","bannerIDs","_getCategoryBanner","flag","navMenuState","categoryBanner","navMenuSelectedMenu","categoryBannerIndex","showCategoryBanner","_getActivePrice","listPageState","activeProducts","productRecIds","prod","IsMasterProduct","lowestVariantId","AttributeValues","attributeValue","TextValue","MasterProductId","projectDomain","affliations","customerInput","GetCustomerInput","customer","getCustomer","CustomerAffiliations","affliation","aff","AffiliationId","RetailAffiliationId","CustomerId","AccountNumber","getActivePricesAsync","activePricesResponse","productPrices","prodVariantId","activePrice","price","Price","CustomerContextualPrice","BasePrice","TradeAgreementPrice","AdjustedPrice","catch","message","exception","debug","_getActivePriceByProducts","variantId","_getSearchResultModal","modal","modalHeader","modalFooter","modalBody","ModalBody","SearchResultModal","modalIsOpen","totalProductCount","_modalToggleRef","_getChoiceSummary","_toggleModal","_getCollectionTitle","seoDataEntry","seoTitle","collectionTitle","productCountNumber","productCountText","count","numberOfProducts","oneProduct","TitleContainer","searchPageTitle","titlePrefix","searchTextPrefix","titleText","titleCount","_getCategoryHierarchy","categoryHierarchy","CategoryHierarchyContainer","tag","categoryHierarchyList","categoryLinkAriaLabel","Url","categoryHierarchySeparator","_getSortingDropDown","activeDropdown","_getCurrentlySelectedOption","sortingState","selectedSortByOption","sortByDropDown","sortByDropdownLabel","dropdownClassname","_updateSortByDropdown","_sortAndFilterContainerRef","_getProductInfo","GetFullProductsByCollectionInput","itemsPerPage","Skip","pageSize","infiniteScrollPage","sortingCritera","activeFilters","itemId","productId","includeAttributes","getProducts","actionResponse","currentProducts","returnedProducts","infiniteProducts","addedProducts","concat","onlyNewProducts","_getPagination","fullUrl","getCurrentUrl","skipCount","currentPageNumber","skip","previousText","flipperPrevious","nextText","flipperNext","UncontrolledPagination","paginationAriaLabel","qsp","startingItem","previousAriaLabel","nextAriaLabel","_getRefineMenu","tempRangeTypeTODO","inputRange","validRefiners","refiners","sizeRefinerArr","obj","isPriceRefinerHide","isAnySizeSelectedArr","activeRefiners","defaultOpenRefinersArray","selectedRefinersParentName","parentName","defaultOpenRefinements","determineExpanded","refinerNamesForInitialOpen","isSizeRefinementBooleanValue","refinementExcludeListString","refinementExcludeList","refinementExcludeListArr","refinementExcludeListNorm","slugArray","pathArray","urlPartsObject","slug","Slug","isSizeRefinement","ExtensionProperties","attr","Key","Value","BooleanValue","configVirtualRefinerNames","getSortedVirtualRefinerConfig","params","removeKeywords","path","categoryIdToken","recordId","removedCategorySlug","decodeURIComponent","_slug","finalRefinerParts","flatten","RefineMenuContainer","RefinerSectionContainer","_refineItemCommonProps","_onUpdateRefiners","_buildRefinerUrl","_getRefinerLimitToDisplay","refinerLabel","mfrmRefinerLabel","selectedRefiners","choiceSummaryLabel","_onChoiceClicked","_buildRefinerUrlForChoiceSummary","_customBuildRefinerUrlForChoiceSummary","notification","utag","link","event_category","event_action","event_label","event_noninteraction","history","pushState","buildListPageUrl","_getSortColumnFromSelectedOption","options","sortedOptions","transaction","Columns","mappedConfiguration","sortCriteria","activeSortColumn","parseQueryParam","activeMappedConfig","mappedSearchConfig","dropdownOption","isRefinerRedirectEnabled","currentRefinement","activeVirtualFilters","allSizeRefinerValues","_removePriceAndVirtualRefiner","availableRefiners","finalURL","newRefinementCriteria","isCustomizeRefiner","dropdownElementId","dropdownElement","selectedChoice","virtualRefinersRecordId","listPageUrl","isClearAll","device","Type","_updateViewport","pending","scrollHeightPrevValue","totalSkipProductsValue","allVirtualRefiners","showProductsLoader","virtualRefiners","minusVirtualRefiner","validationErrorNotNumber","validationErrorNotRange","getTelemetryObject","telemetryPageName","friendlyName","featureProduct","listPageStateFeature","nameTranslations","nameTranslation","ArrayExtensions","Language","Text","querySorting","sorting","parse","reaction","getCollectionProducts","productResults","enableAffiliationBasedPricing","user","isAuthenticated","update","sizeRefinerObjArr","virtualRefinersArr","refinerStrName","virtualRefinerObjArr","virtualRefiner","currentSortedOption","componentDidUpdate","prevProps","menusData","shouldAllowBackNavigation","productCollection","searchProduct","errorText","breadCrumbType","breadcrumbType","shouldAllowBack","resultCategoryNotFoundText","resultSearchNotFoundText","productsComponent","featureComponent","selectedFiltersCount","categoryNameFromSlug","searchResultContainerViewProps","TitleViewProps","disableHierarchy","refineMenu","moduleProps","sortByOptions","pagination","ProductsContainer","ProductSectionContainer","CategoryNavContainer","RefineAndProductSectionContainer","choiceSummary","modalToggle","searchResultModal","errorMessage","categoryBannerInd","FeatureSearchContainer","similarLookProduct","getScrolledProducts","refinerRedirect","renderView","variant","VariantType","filterCategoriesArr","filterItemsArr","filterCategories","Set","filterItems","priceRefiner","withoutVirtualRefiners","allVirtualRefinersValue","updatedRefinersArr","refinerValue","selectedObj","observable","errorMsg","RichTextComponent","getViewport","xs","w","sm","md","lg","productBadgeAttribute","bannerPosition","mattressMatcherBannerIndex","targetAudienceGroup","listName","currentPromoProducts","isRefinersEnabled","resultEyebrow","setResultEyebrow","resultCoreDelivery","setResultCoreDelivery","productIDList","setproductIDList","categoryID","setCategoryID","productsForCallingAPI","catName","productPricesIter","prodId","productsCategories","categoryIds","productCategoriesIter","CategoryPath","catPathSegments","Segments","catId","CategoryId","CategoryName","collectionProductAttributes","configVendorNamePlp","brandBackofficeAttributePlp","configVendorNamePdp","brandBackofficeAttributePdp","brandName","getBrandNameCheck","eProps","ePropsIter","StringValue","brand","variantID","getProductsCategories","uniqBy","callATPDelivery","productIdsArray","DistinctProductVariant","defaultVariantId","property","LongValue","eyebrowMessageObj","_getEyebrowMessage","eyebrowMessage","resultEyebrowTemp","EyeBrows","eyebrow","Description","updateProductsMessages","deliveryByMessages","recId","deliveryByMessage","VariantRecordId","updateCoreDeiveryMessage","shippingInformationSmall","smallParcelAttributeKey","defaultVariantShippingInformation","_getProductType","Quantity","getListOfCoreDeliveryMessage","response","skipProductsVal","lastNameValue","pagePath","categoryListArray","item1","some","item2","categoryListArr","brandNameArr","productVariantArr","productNameArr","productIdArr","productPositionArr","productPriceArr","productListArray","productID","enhanced_action","product_impression_list_name","product_impression_position","product_impression_id","product_impression_name","product_impression_category","product_impression_brand","product_impression_variant","product_impression_price","callTelium","renderProducts","productArray","setProductArray","checkInvew","inView","prevArray","handleProductId","InView","productRecordID","product_list_name","product_position","product_id","product_name","product_category","product_brand","product_variant","callTeliumOnClick","as","rootMargin","badgeAttribute","shouldShowMattressMatcherBanner","_categorySeoCopy","categorySEOTitle","categorySEODescription","seoState","description","getHtmlParserValue","_getSEOMetaTags","isActiveRefiner","categoryPageKeywords","_getSEOMetaTagValue","content","name","keyValue","_renderProductSearchResultItems","newProducts","showLoader","productImpressionListName","_renderImageLoader","InfiniteScroll","dataLength","hasMore","scrollThreshold","loader","showBannerPosition","createSearchResultModal","modalProps","refinerLoader","createModalBody","renderSort","renderRefiner","isRefinerLoading","loaderUrl","screenLoaderUrl","Node","submenu","renderCategoryHierarchy","renderTitle","titleProps","pageName","extProperties","fallBackQueryResult","originalBackQueryResult","renderErrorMessage","categoryPage","collectionText","nsrText","mfrmSearchText","noResultsText","mfrmNoResultsText","dangerouslySetInnerHTML","getRichTextHtml","searchTips","mfrmProducts","tagsArr","Module","HtmlHeadInclude","MFRMErrorMessage","nsrpNeedAssistance","nsrpContainer","binding","modules","dataActions","registerSanitizedActionPath","sanitizedActionPath","dataAction","default","prototype","RegistrationId","c","require","$type","da","runOn","iNM","ns","n","p","pdp","__bindings__","viewDictionary","cn","module","exports","ReactDOM"],"sourceRoot":""}