{"version":3,"file":"static/js/625a3083f21563f8c209.bundle.js","mappings":"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","sources":["webpack://mattressfirm/./src/Utilities/allRegex.ts?9889","webpack://mattressfirm/./src/Utilities/analytics/utagCaller.ts?3814","webpack://mattressfirm/./src/Utilities/constants.ts?8bdf","webpack://mattressfirm/./src/Utilities/get-bv-attributes.ts?f55a","webpack://mattressfirm/./src/Utilities/get-core-delivery-batch.ts?5a2b","webpack://mattressfirm/./src/Utilities/get-delivery-by-message.tsx?05db","webpack://mattressfirm/./src/Utilities/get-html-parser-value.ts?1fb6","webpack://mattressfirm/./src/Utilities/get-page-path.ts?590a","webpack://mattressfirm/./src/Utilities/product-search-result-utils.tsx?58f2","webpack://mattressfirm/./src/actions/fetch-core-delivery-list.action.ts?41e3","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/data-actions/utilities/utils.ts?7452","webpack://mattressfirm/./src/modules/mfrm-search-result-container/actions/get-mapped-search-configuration.ts?52d6","webpack://mattressfirm/./src/modules/mfrm-search-result-container/components/choice-summary.tsx?ebc2","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/components/modal.tsx?80e1","webpack://mattressfirm/./src/modules/mfrm-search-result-container/components/error-message.tsx?3838","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/refine-submenu.tsx?3f0c","webpack://mattressfirm/./src/modules/mfrm-search-result-container/components/utilities.ts?e524","webpack://mattressfirm/./src/modules/mfrm-search-result-container/mfrm-search-result-container.data.ts?377f","webpack://mattressfirm/./src/Utilities/labeled-dropdown/ui-labeled-dropdown/UiLabeledDropdown.tsx?1565","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/modules/mfrm-search-result-container/mfrm-search-result-container.view.tsx?61e3","webpack://mattressfirm/./src/themes/mattressfirm/custom-components/CustomSkeleton/index.tsx?ef9d","webpack://mattressfirm/./src/themes/mattressfirm/views/components/delivery-message/deliverymessage.component.tsx?e440","webpack://mattressfirm/./src/themes/mattressfirm/views/components/product.component.tsx?8ce2","webpack://mattressfirm/./src/Utilities/convert-to-titlecase.ts?8d6f","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 { ICoreContext } from '@msdyn365-commerce/core';\r\nexport const emailRegex = (emailValue: string) => {\r\n // eslint-disable-next-line security/detect-unsafe-regex\r\n const validationEmail = /^[-a-z0-9!#$%&'*+/=?^_`{|}~]+(?:\\.[-a-z0-9!#$%&'*+/=?^_`{|}~]+)*@(?:[a-z0-9]+(?:-+[a-z0-9]+)*\\.)+(?:xn--[a-z0-9]+|[a-z]{2,16})$/i;\r\n\r\n return validationEmail.test(emailValue);\r\n};\r\n\r\n/**\r\n * Method to remove special characters for product name from product URL\r\n * @param str string\r\n * @param ctx ICoreContext\r\n * @returns string\r\n */\r\n\r\nexport const removeSpecialChars = (str: string, ctx: ICoreContext): string => {\r\n if (ctx && ctx.request.app?.config.removeSpecialCharsPDP) {\r\n return str?.replace(/[^a-zA-Z0-9- ]/g, '');\r\n }\r\n return str;\r\n};\r\n\r\n\r\n/**\r\n * Method to remove special characters for product URL's path\r\n * @param str string\r\n * @param ctx ICoreContext\r\n * @returns string\r\n */\r\n\r\nexport const removeSpecialCharsFromURLPath = (str: string, ctx: ICoreContext): string => {\r\n if (ctx && ctx.request.app?.config.removeSpecialCharsPDP) {\r\n const urlPath = decodeURIComponent(str.split('.p')[0])?.replace(/[^a-zA-Z0-9-/ ]/g, '');\r\n return `${urlPath}.p`;\r\n }\r\n return str;\r\n};\r\n","import { IAnalyticsConfiguration } from './clickTrack';\r\n\r\n// Interface for 3rd-party function. AKA utag.\r\ninterface ITealium {\r\n link(data: {}): void | false;\r\n view(data: {}): void | false;\r\n data(data: {}): void | false;\r\n}\r\n\r\nexport interface IPromotionConfig {\r\n event?: string | null;\r\n event_name?: string | null;\r\n search_term?: string | null;\r\n search_type?: string | null;\r\n event_category?: string | null;\r\n event_action?: string | null;\r\n event_label?: string | null;\r\n event_type?: string | null;\r\n event_noninteraction?: string;\r\n enhanced_action?: string | null;\r\n customer_email?: string | undefined;\r\n customer_phone_number?: string | undefined;\r\n first_name?: string | undefined;\r\n last_name?: string | undefined;\r\n address1?: string | undefined;\r\n address2?: string | undefined;\r\n city?: string | undefined;\r\n state?: string | undefined;\r\n zip_code?: string | undefined;\r\n order_subtotal?: string | undefined;\r\n order_currency?: string | undefined;\r\n country?: string | undefined;\r\n // productConfig?: IProductDataConfig;\r\n checkout_step?: string;\r\n checkout_option?:(string | undefined)[];\r\n checkout_type?:(string | undefined)[];\r\n product_id?: (string | undefined)[];\r\n product_name?: (string | undefined)[];\r\n product_category?: (string | undefined)[];\r\n product_brand?: (string | undefined)[];\r\n product_variant?: (string | undefined | number)[];\r\n product_price?: (string | undefined)[];\r\n product_quantity?: (string | undefined)[];\r\n product_url?: (string | undefined)[];\r\n product_size?: (string | undefined)[];\r\n product_image_url?: (string | undefined)[];\r\n core_item_flag?: string | null;\r\n funnel_type?: string | null;\r\n ga_title?: string | null;\r\n ga_location?: string | null;\r\n order_quantity?: string | null;\r\n}\r\n\r\ninterface IProductDataConfig {\r\n product_variant?: (string | undefined)[];\r\n product_price?: (string | undefined)[];\r\n}\r\n\r\nexport interface IAnalyticsConfigurationData {\r\n productConfig?: IProductDataConfig;\r\n}\r\n\r\n\r\n// Legacy function\r\nexport const callUtag = async (objToCall: IPromotionConfig) => {\r\n void await callUtagLink(objToCall);\r\n};\r\n\r\n/**\r\n * Tealium dispatch click tracking.\r\n * @param objToCall\r\n */\r\nexport const callUtagLink = async (objToCall: IPromotionConfig | IAnalyticsConfiguration) => {\r\n try {\r\n Object.keys(objToCall).forEach(\r\n key => {\r\n if (objToCall[key] === null) {\r\n delete objToCall[key];\r\n }\r\n }\r\n );\r\n // If utag doesn't exist in the global scope, set as false.\r\n const utag: ITealium = global.hasOwnProperty('utag') ? global[\"utag\"] : false;\r\n if(utag) { utag.link(objToCall); }\r\n\r\n } catch (e) {\r\n console.log('Utag Error', e);\r\n }\r\n};\r\n\r\n/**\r\n * Tealium dispatch view tracking.\r\n * @param objToCall\r\n */\r\nexport const callUtagView = async (objToCall: {}) => {\r\n try {\r\n // If utag doesn't exist in the global scope, set as false.\r\n const utag: ITealium = global.hasOwnProperty('utag') ? global[\"utag\"] : false;\r\n if(utag) { utag.view(objToCall); }\r\n } catch (e) {\r\n console.log('utag View Error', e);\r\n }\r\n};\r\n\r\n/**\r\n * Not currently implemented.\r\n * @param objToCall\r\n * @param dataType\r\n */\r\nexport const callUtagData = ({ productConfig = {} }: IAnalyticsConfigurationData , dataType: string) => {\r\n try {\r\n // If utag doesn't exist in the global scope, set as false.\r\n const utag: ITealium = global.hasOwnProperty('utag') ? global[\"utag\"] : false;\r\n switch (dataType) {\r\n case 'data':\r\n // @ts-ignore\r\n if('utag' in window) { utag.data = {...utag.data, ...productConfig}; }\r\n break;\r\n case '_data':\r\n // @ts-ignore\r\n utag_data = {...utag_data , ...productConfig};\r\n break;\r\n default:\r\n null;\r\n }\r\n } catch (e) {\r\n console.log('Utag Error', e);\r\n }\r\n};","export const variantQueryStringName = 'variantid';","import { AttributeValue } from '@msdyn365-commerce/retail-proxy';\r\n\r\nexport const getBVAttributeValues = (attributeValues: AttributeValue[] | undefined, key: string): number => {\r\n const value = +(attributeValues?.find(attr => attr.Name?.trim() === key)?.TextValue || 0);\r\n return Math.round(value * 10) / 10;\r\n};\r\n\r\nexport const getBVAttributeValuesUnbxd = (attributeValues: any | undefined, key: string): number => {\r\n const value = +(attributeValues[key] ?? 0);\r\n return Math.round(value * 10) / 10;\r\n};\r\n","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 { IAny, ICoreContext, IGeneric } from '@msdyn365-commerce/core';\r\nimport { IMFICLDeliveryScheduleParameters } from '../actions/CoreProductDataServiceEntities.g';\r\nimport getDeliveryMessageAction, { GetDeliveryMessageInput } from '../actions/get-delivery-message.action';\r\n\r\nconst _getDeliveryByMessage = async (request: IMFICLDeliveryScheduleParameters, context: ICoreContext>, isCached?: boolean) => {\r\n if (request) {\r\n const getDeliveryMessageActionInput = new GetDeliveryMessageInput(request, isCached);\r\n try {\r\n let result;\r\n // eslint-disable-next-line prefer-const\r\n result = await getDeliveryMessageAction(getDeliveryMessageActionInput, context.actionContext);\r\n if (result) {\r\n return result;\r\n }\r\n } catch (error) {\r\n console.log('Error', error);\r\n }\r\n }\r\n return null;\r\n};\r\n\r\nexport default _getDeliveryByMessage;\r\n","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 { IAny, ICoreContext, IGeneric } from '@msdyn365-commerce/core';\r\nimport dayjs from 'dayjs';\r\nimport Cookies from 'universal-cookie';\r\nimport { IMFIATPInventoryEntity, IMFICartLine, IMFICLDeliveryScheduleParameters } from '../actions/CoreProductDataServiceEntities.g';\r\nimport { IMFIAvailablePromotionDescription, IMFIItem } from '../actions/EyebrowMessageDataServiceEntities.g';\r\nimport getEyebrowAction, { GetEyebrowMessageInput } from '../actions/get-eyebrow-message.action';\r\nimport _getDeliveryByMessage from './get-delivery-by-message';\r\nimport { IMFIATPInventoryEntityPLP } from '../actions/BatchCoreProductDataServiceEntities.g';\r\n\r\nexport const _getEyebrowMessage = async (products: IMFIItem[], context: ICoreContext>) => {\r\n const priceGroupForAPICall = context.app && context.app.config.priceGroup;\r\n if (products && products.length > 0 && (priceGroupForAPICall !== '' || priceGroupForAPICall !== undefined)) {\r\n const items: IMFIItem[] | undefined = [];\r\n products.map(item => {\r\n const singleItem: IMFIItem = {\r\n ItemId: item.ItemId,\r\n DistinctProductVariant: item.DistinctProductVariant\r\n };\r\n items.push(singleItem);\r\n });\r\n\r\n const requestBody: IMFIAvailablePromotionDescription = {\r\n PriceGroup: priceGroupForAPICall,\r\n Items: items\r\n };\r\n const getEyebrowMessageInput = new GetEyebrowMessageInput(requestBody, undefined, true);\r\n try {\r\n const result = await getEyebrowAction(getEyebrowMessageInput, context.actionContext);\r\n if (result) {\r\n return result;\r\n }\r\n } catch (error) {\r\n console.log('Error', error);\r\n }\r\n }\r\n return null;\r\n};\r\n\r\nexport const _makeDeliveryMessage = (days: string) => {\r\n if (days === '' || days === undefined || days === null) {\r\n return '';\r\n }\r\n\r\n let deliveryByMessage = '';\r\n let date = new Date();\r\n const daysSpan = days.split('-');\r\n let deliveryDate = Date.now();\r\n if (daysSpan && daysSpan[1] !== undefined && daysSpan.length) {\r\n let deliveryByMessageRange = '';\r\n daysSpan.map((item: string) => {\r\n date = new Date();\r\n deliveryDate = Date.now();\r\n if (parseInt(item, 10) > 0) {\r\n let numberOfDays = parseInt(item, 10);\r\n let newDate = deliveryDate;\r\n while (numberOfDays > 0) {\r\n newDate = date.setDate(date.getDate() + 1);\r\n if (dayjs(newDate).format('d') !== '0' && dayjs(newDate).format('d') !== '6') {\r\n numberOfDays--;\r\n }\r\n }\r\n deliveryByMessage = dayjs(newDate).format('MMM D');\r\n if (deliveryByMessageRange !== '') {\r\n deliveryByMessageRange = `${deliveryByMessageRange} to ${deliveryByMessage}`;\r\n } else {\r\n deliveryByMessageRange = deliveryByMessage;\r\n newDate = date.setDate(date.getDate() - parseInt(item[0], 10));\r\n }\r\n }\r\n });\r\n return `Delivery by ${deliveryByMessageRange}`;\r\n } else {\r\n deliveryByMessage = dayjs(deliveryDate).format('MMM D');\r\n let numberOfDays = parseInt(days, 10);\r\n let newDate = deliveryDate;\r\n let flag = true;\r\n while (numberOfDays > 0) {\r\n newDate = date.setDate(date.getDate() + 1);\r\n if (dayjs(newDate).format('d') !== '0' && dayjs(newDate).format('d') !== '6') {\r\n numberOfDays--;\r\n } else {\r\n flag = false;\r\n }\r\n }\r\n deliveryByMessage =\r\n flag && days === '1'\r\n ? `Tomorrow ${dayjs(Date.now()).format('MMM D')}`\r\n : dayjs(newDate).format('ddd MMM, D');\r\n return `Delivery by ${deliveryByMessage}`;\r\n }\r\n};\r\n\r\n// tslint:disable-next-line: no-any\r\nexport const _coreProductATPCall = async (\r\n itemLines: IMFICartLine[],\r\n setCoreProductATPData: React.Dispatch,\r\n context: ICoreContext>\r\n) => {\r\n const cookies = new Cookies();\r\n const zipcode = cookies.get('zip_code');\r\n if (itemLines && itemLines.length === 0) {\r\n setCoreProductATPData([]);\r\n }\r\n const currentDate = Date.now();\r\n const requestBody: IMFICLDeliveryScheduleParameters = {\r\n InventoryType: 'Delivery',\r\n Weeks: context.app.config.weeksPDPforATPCall,\r\n StoreId: '',\r\n Page: 'plp',\r\n RequestedDate: dayjs(currentDate).format('MM/DD/YYYY'),\r\n ZipCode: zipcode,\r\n ItemLines: itemLines\r\n };\r\n const getDeliveryByMessage = _getDeliveryByMessage(requestBody, context);\r\n getDeliveryByMessage\r\n .then(result => {\r\n if (result !== undefined && result?.ATPInventoryData && result?.ATPInventoryData.length > 0) {\r\n setCoreProductATPData(result?.ATPInventoryData);\r\n } else {\r\n setCoreProductATPData([]);\r\n }\r\n })\r\n .catch(e => {\r\n console.log('Error', e);\r\n });\r\n};\r\n\r\nconst _setTime = (time: string | undefined) => {\r\n if (time !== undefined && time !== '') {\r\n const temp = time.split(' ');\r\n if (temp && temp.length > 0) {\r\n let newDatewithTime = dayjs(Date.now()).format('M/D/YYYY');\r\n newDatewithTime = `${newDatewithTime} ${temp[0]}:00 ${temp[1].toUpperCase()}`;\r\n return newDatewithTime;\r\n }\r\n }\r\n return '';\r\n};\r\n\r\nexport interface IATPInventoryData {\r\n deliveryByMessage: string;\r\n locationId: string;\r\n}\r\n\r\nexport const _getSoonestDeliveryDate = (coreProductATPData: IMFIATPInventoryEntity[]): IATPInventoryData => {\r\n let deliveryDetails = {\r\n deliveryByMessage: '',\r\n locationId: ''\r\n };\r\n if (!coreProductATPData || !coreProductATPData.length) {\r\n return deliveryDetails;\r\n }\r\n for (let index = 0; index < coreProductATPData.length; index++) {\r\n const item = coreProductATPData[index];\r\n if (item.Available === 'YES' && item.ATPQuantity !== undefined && parseInt(item.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(item.SlotDate).format('D M YY');\r\n const currHour = dayjs(Date.now()).format('H');\r\n if (today === deliveryDate) {\r\n const deliveryMessage =\r\n _setTime(item.StartTime) !== ''\r\n ? parseInt(dayjs(_setTime(item.StartTime)).format('H'), 10) < 14 && parseInt(currHour, 10) < 14\r\n ? `Delivery by Today ${dayjs(Date.now()).format('MMM D')}`\r\n : `Delivery by Tomorrow ${dayjs(date.setDate(date.getDate() + 1)).format('MMM D')}`\r\n : '';\r\n deliveryDetails = {\r\n deliveryByMessage: deliveryMessage,\r\n locationId: item.Location1!\r\n };\r\n break;\r\n } else {\r\n const deliveryMessage = `Delivery by ${dayjs(item.SlotDate).format('MMM D')}`;\r\n deliveryDetails = {\r\n deliveryByMessage: deliveryMessage,\r\n locationId: item.Location1!\r\n };\r\n break;\r\n }\r\n }\r\n }\r\n return deliveryDetails;\r\n};\r\n\r\nexport const _getDeliveryDate = (coreProductATPData: IMFIATPInventoryEntityPLP) => {\r\n let deliveryDetails = {\r\n deliveryByMessage: '',\r\n locationId: ''\r\n };\r\n const item = coreProductATPData;\r\n if (item.Available === 'YES' && item.ATPQuantity !== undefined && parseInt(item.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(item.SlotDate).format('D M YY');\r\n const currHour = dayjs(Date.now()).format('H');\r\n const startTimeHour = item.StartTime?.substring(0,2) || \"14\";\r\n if (today === deliveryDate) {\r\n const deliveryMessage =\r\n parseInt(startTimeHour, 10) < 14 && parseInt(currHour, 10) < 14\r\n ? `Delivery by Today ${dayjs(Date.now()).format('MMM D')}`\r\n : `Delivery by Tomorrow ${dayjs(date.setDate(date.getDate() + 1)).format('MMM D')}`;\r\n deliveryDetails = {\r\n deliveryByMessage: deliveryMessage,\r\n locationId: item.Location1!\r\n };\r\n } else {\r\n const deliveryMessage = `Delivery by ${dayjs(item.SlotDate).format('MMM D')}`;\r\n deliveryDetails = {\r\n deliveryByMessage: deliveryMessage,\r\n locationId: item.Location1!\r\n };\r\n }\r\n }\r\n return deliveryDetails;\r\n};\r\n\r\n","/*!\r\n * Copyright (c) Microsoft Corporation.\r\n * All rights reserved. See LICENSE in the project root for license information.\r\n */\r\n\r\nimport * as Msdyn365 from '@msdyn365-commerce/core';\r\nimport { getZipCode } from '../Utilities/get-zipcode';\r\nimport dayjs from 'dayjs';\r\nimport { mFIATPInventoryPLPAsync } from './BatchCoreProductDataActionExtension.g';\r\nimport { IMFIATPInventoryPLPResponse, IMFICartLine, IMFIDeliveryScheduleParameters } from './BatchCoreProductDataServiceEntities.g';\r\n\r\n/**\r\n * FetchCoreDeliveryList Input Action\r\n */\r\nexport class FetchCoreDeliveryListInput implements Msdyn365.IActionInput {\r\n // Construct the input needed to run the action\r\n public cartLines: IMFICartLine[];\r\n public zipCode?: string;\r\n constructor(cartLines: IMFICartLine[], zipCode?: string) {\r\n this.cartLines = cartLines;\r\n this.zipCode = zipCode;\r\n }\r\n\r\n // 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 = () => {\r\n return this.cartLines?.sort((a, b) => a?.VariantRecordId && b?.VariantRecordId && a?.VariantRecordId > b?.VariantRecordId ? 1 : -1).map(item => `FetchCoreDeliveryList-${item.VariantRecordId}-${this.zipCode}-${item.VariantRecordId?.length}`).toString();\r\n };\r\n public getCacheObjectType = () => 'FetchCoreDeliveryList';\r\n public dataCacheType = (): Msdyn365.CacheType => 'request';\r\n}\r\n\r\n// Create a data model here or import one to capture the response of the action\r\nexport interface IFetchCoreDeliveryListData {\r\n text: string;\r\n}\r\n\r\n/**\r\n * Use this function to create the input required to make the action call\r\n */\r\n// const createInput = (args: Msdyn365.ICreateActionContext): Msdyn365.IActionInput => {\r\n// return new FetchCoreDeliveryListInput();\r\n// };\r\n\r\n/**\r\n * Use this function to call your action and process the results as needed\r\n */\r\nasync function fetchCoreDeliveryAction(input: FetchCoreDeliveryListInput, ctx: Msdyn365.IActionContext): Promise {\r\n // const apiSettings = Msdyn365.msdyn365Commerce.apiSettings;\r\n const atpInput: IMFIDeliveryScheduleParameters = {\r\n Weeks: 6,\r\n InventoryType: 'Delivery',\r\n StoreId: '',\r\n RequestedDate: dayjs(Date.now()).format('MM/DD/YYYY'),\r\n ZipCode: input.zipCode ?? getZipCode(ctx),\r\n ItemLines: input.cartLines,\r\n CustomerRequestTime: dayjs(Date.now()).format('MM/DD/YYYY HH:mm:ss'),\r\n Id: 0,\r\n NoOfPriorityDC: 0\r\n };\r\n const response = await mFIATPInventoryPLPAsync({ callerContext: ctx }, atpInput);\r\n // 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 response;\r\n}\r\n\r\nexport default Msdyn365.createObservableDataAction({\r\n action: >fetchCoreDeliveryAction,\r\n // Give your data action a unique id\r\n id: 'FetchCoreDeliveryList'\r\n // input: createInput\r\n // Uncomment the below line if this is a meant to be a batched data action\r\n // isBatched: true\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 // Construct the input needed to run the action\r\n // 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// 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 * 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 * 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 // 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 // Give your data action a unique id\r\n id: 'SrpBreadcrumbPage',\r\n input: createInput\r\n // 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","/*--------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * See License.txt in the project root for license information.\r\n *--------------------------------------------------------------*/\r\n\r\nimport { IAny, ICommerceApiSettings, ICoreContext, ICreateActionContext, IGeneric, IRequestContext } from '@msdyn365-commerce/core';\r\nimport {\r\n AsyncResult, CartLine, CommerceListLine, ProductDimension,\r\n ProductDimensionType, ProductSearchResult, SimpleProduct\r\n} from '@msdyn365-commerce/retail-proxy';\r\n\r\nimport { ProductDetailsCriteria, InventoryLevels, ArrayExtensions } from '@msdyn365-commerce-modules/retail-actions';\r\nimport { variantQueryStringName } from '../../Utilities/constants';\r\n// import { parseSearchData } from '@msdyn365-commerce-modules/retail-actions/src/utilities/input-data-parser';\r\n\r\nexport const wrapInResolvedAsyncResult = (input: T | null | undefined): AsyncResult => {\r\n return >{\r\n status: 'SUCCESS',\r\n result: input,\r\n metadata: {}\r\n };\r\n};\r\n\r\nexport const wrapInRejectedAsyncResult = (input: T | null | undefined): AsyncResult => {\r\n return >{\r\n status: 'FAILED',\r\n result: input,\r\n metadata: {}\r\n };\r\n};\r\n\r\n\r\n/**\r\n * Utility function to extract the active productId in the following priority:\r\n * First query param (productId), then UrlToken (itemId), then module config.\r\n * @param inputData - The Action Input data.\r\n * @returns Productid or undefined.\r\n */\r\nexport const getSelectedProductIdFromActionInput = (inputData: ICreateActionContext>): string | undefined => {\r\n const context = inputData.requestContext;\r\n const variantId = context.app.config.queryBasedVariantSelection ? getQueryParamsFromQueryByName(context.url.requestUrl, variantQueryStringName) : undefined;\r\n\r\n if (variantId) {\r\n return variantId;\r\n } else if (context.query?.productId) {\r\n return context.query.productId;\r\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition -- Exsiting code.\r\n } else if (context.urlTokens && inputData.requestContext.urlTokens.itemId && inputData.requestContext.urlTokens.pageType === 'Product') {\r\n return context.urlTokens.itemId;\r\n } else if (inputData && inputData.config && inputData.config.productId) {\r\n return inputData.config.productId;\r\n }\r\n return undefined;\r\n};\r\n\r\nexport const getQueryParamsFromQueryByName = (inputUrl: URL, queryParamName: string) => {\r\n const urlWithIgnoredCase = new URL(inputUrl.toString().toLocaleLowerCase());\r\n const urlParameters = urlWithIgnoredCase.searchParams;\r\n const value = urlParameters.get(queryParamName.trim().toLocaleLowerCase());\r\n if (!value || Number.isNaN(Number(value))) {\r\n return undefined;\r\n }\r\n return value;\r\n};\r\n/**\r\n * Generates a Image URL based on data return from retail server.\r\n * @param imageUrl The image url returned by Retail Server.\r\n * @param ctx The request context.\r\n * @param apiSettings\r\n */\r\nexport const generateImageUrl = (imageUrl: string | undefined, apiSettings: ICommerceApiSettings): string | undefined => {\r\n if (imageUrl) {\r\n // Images hosted in CMS include schema\r\n if (imageUrl.startsWith('http')) {\r\n return imageUrl;\r\n }\r\n\r\n // Images hosted in Retail Server must be encoded and joined with the base image url\r\n return apiSettings.baseImageUrl + encodeURIComponent(imageUrl);\r\n }\r\n\r\n // D365Commerce.telemetry.warning(`Unable to generate a proper Image URL for Product: ${product.RecordId}`);\r\n return undefined;\r\n\r\n};\r\n\r\n/**\r\n * Represents app configuration for dimensions.\r\n */\r\nexport interface IDimensionsConfig {\r\n dimensionsAsSwatchType?: DimensionTypes[];\r\n dimensionsInProductCard?: DimensionTypes[];\r\n inventoryLevel?: InventoryLevels;\r\n dimensionToPreSelectInProductCard?: DimensionTypes;\r\n}\r\n\r\n/**\r\n * Represents app configuration for dimensions.\r\n */\r\nexport interface IDimensionsApp {\r\n config: IDimensionsConfig;\r\n}\r\n\r\n/**\r\n * Represents product dimension types.\r\n */\r\nexport enum DimensionTypes {\r\n none = 'none',\r\n color = 'color',\r\n configuration = 'configuration',\r\n size = 'size',\r\n style = 'style'\r\n}\r\n\r\n/**\r\n * Defines display configuration types.\r\n */\r\nexport enum DimensionSwatchDisplayTypes {\r\n default = 'default',\r\n productCard = 'productCard'\r\n}\r\n\r\n/**\r\n * Checks if rendering the particular dimensions is allowed.\r\n * @param dimensionType - Dimension to be displayed.\r\n * @param context - Core application context.\r\n * @param displayType - The swatch location, the component from which it comes from.\r\n * @returns Updates the state with new product page url.\r\n */\r\nexport const checkIfShouldDisplayAsSwatch = (\r\n dimensionType: DimensionTypes,\r\n context: ICoreContext,\r\n displayType: DimensionSwatchDisplayTypes = DimensionSwatchDisplayTypes.default): boolean => {\r\n\r\n // Additional checks for the product card since it has a separate config setting.\r\n if (displayType === DimensionSwatchDisplayTypes.productCard) {\r\n const dimensionsToDisplayOnProductCard = context.app.config.dimensionsInProductCard;\r\n if (!ArrayExtensions.hasElements(dimensionsToDisplayOnProductCard) ||\r\n dimensionsToDisplayOnProductCard.includes(DimensionTypes.none) ||\r\n !dimensionsToDisplayOnProductCard.includes(dimensionType)) {\r\n return false;\r\n }\r\n }\r\n\r\n const dimensionsToDisplayAsSwatch = context.app.config.dimensionsAsSwatchType;\r\n return ArrayExtensions.hasElements(dimensionsToDisplayAsSwatch) &&\r\n !dimensionsToDisplayAsSwatch.includes(DimensionTypes.none) &&\r\n dimensionsToDisplayAsSwatch.includes(dimensionType);\r\n};\r\n\r\n/**\r\n * Generates an image URL for a swatch.\r\n * @param imageUrl - The image url returned by Retail Server.\r\n * @param apiSettings - The request context.\r\n * @returns Full image url.\r\n */\r\nexport const generateSwatchImageUrl = (imageUrl: string, apiSettings: ICommerceApiSettings): string => {\r\n if (imageUrl.startsWith('http')) {\r\n return imageUrl;\r\n }\r\n\r\n return apiSettings.baseImageUrl + encodeURIComponent(imageUrl);\r\n};\r\n\r\n/**\r\n * Generates a Image URL for a product based on data return from retail server.\r\n * @param product The Product returned by Retail Server.\r\n * @param ctx The request context.\r\n * @param apiSettings\r\n */\r\nexport const generateProductImageUrl = (\r\n product: SimpleProduct | ProductSearchResult,\r\n apiSettings: ICommerceApiSettings\r\n): string | undefined => {\r\n return generateImageUrl(product.PrimaryImageUrl, apiSettings);\r\n};\r\n\r\n/**\r\n * Creates a CartLine object from the passed data.\r\n * @param product The product.\r\n * @param quantity The quantity.\r\n * @param catalogId The catalog.\r\n */\r\nexport const buildCartLine = (product: SimpleProduct, quantity?: number, catalogId?: number): CartLine => {\r\n return {\r\n CatalogId: catalogId || 0,\r\n Description: product.Description,\r\n\r\n // TODO: Investigate this value and what it represents\r\n EntryMethodTypeValue: 3,\r\n ItemId: product.ItemId,\r\n ProductId: product.RecordId,\r\n Quantity: quantity || 1,\r\n TrackingId: '',\r\n UnitOfMeasureSymbol: product.DefaultUnitOfMeasure\r\n };\r\n};\r\n\r\n/**\r\n * Creates a CommerceListLine (also know as WishlistLine) object from the passed data.\r\n * @param productId The RecordId of the Product to be added.\r\n * @param customerId The account number of the customer.\r\n * @param wishlistId The Id of the commerce list.\r\n */\r\nexport const buildWishlistLine = (productId: number, customerId: string, wishlistId: number): CommerceListLine => {\r\n return {\r\n CommerceListId: wishlistId,\r\n ProductId: productId,\r\n CustomerId: customerId\r\n };\r\n};\r\n\r\n/**\r\n * Utility function to prepare the product details criteria before getting full product:\r\n * @param inputData The Action Input data\r\n */\r\nexport const getProductDetailsCriteriaFromActionInput = (inputData: ICreateActionContext>): ProductDetailsCriteria => {\r\n if (inputData && inputData.config) {\r\n return {\r\n getPrice: !inputData.config.hidePrice,\r\n getRating: !inputData.config.hideRating\r\n };\r\n }\r\n return {\r\n getPrice: true,\r\n getRating: true\r\n };\r\n};\r\n\r\n/**\r\n * Transforms search text into the expected 'search terms' format, expected by refiner APIs.\r\n * @param searchText Free-form text used for searching for products or categories of products.\r\n */\r\nexport const ensureSearchTextIsFormedProperly = (searchText: string): string => {\r\n const prefix = searchText.startsWith('\\'') ? '' : '\\'';\r\n const suffix = searchText.endsWith('\\'') ? '' : '\\'';\r\n return `${prefix}${searchText}${suffix}`;\r\n};\r\n\r\nexport const ensureSafeSearchText = (searchText: string): string => {\r\n return searchText?.replace(/[^\\d\\sA-Za-z]+/g, '');\r\n};\r\n\r\nexport const buildCacheKey = (base: string, apiSettings: ICommerceApiSettings, locale?: string): string => {\r\n return `${base}-chanId:${apiSettings.channelId}-catId:${apiSettings.catalogId}${locale ? `-${locale}` : ''}`;\r\n};\r\n\r\nexport const buildCacheKeyWithUrlTokens = (base: string, requestContext: IRequestContext): string => {\r\n const urlTokens = requestContext.urlTokens;\r\n const defaultCacheKey = buildCacheKey(base, requestContext.apiSettings, requestContext.locale);\r\n return urlTokens ? `${defaultCacheKey}-${urlTokens.itemId}-${urlTokens.recordId}-${urlTokens.pageType}` : defaultCacheKey;\r\n};\r\n\r\n/**\r\n * Generates a key from set of arguments as inputs.\r\n *\r\n * @param args Argument list of pivots to generate key from.\r\n * @param handler Handler function for null/undefined values.\r\n */\r\n\r\ntype TKeyTypes = string | number | boolean | null | undefined;\r\ninterface IGenerateKeyOptions {\r\n separator?: string;\r\n handler?(input: null | undefined): string;\r\n}\r\nexport const generateKey = (args: TKeyTypes[], options?: IGenerateKeyOptions): string => {\r\n const { handler, separator }: IGenerateKeyOptions = { ...{ separator: '-', handler: undefined }, ...(options || {}) };\r\n return args\r\n .map(arg => {\r\n if (arg === null || arg === undefined) {\r\n if (handler) {\r\n return handler(arg);\r\n }\r\n }\r\n return arg;\r\n })\r\n .join(separator);\r\n};\r\n\r\n/**\r\n * Gets the fall back image url for a variant image.\r\n * @param itemId Item id of a product.\r\n * @param apiSettings Api setting from request context.\r\n */\r\nexport const getFallbackImageUrl = (itemId: string | undefined, apiSettings: ICommerceApiSettings): string | undefined => {\r\n if (!itemId) {\r\n return '';\r\n }\r\n\r\n const parsedItemId = itemId.trim().split(' ')[0];\r\n\r\n const productUrl = `Products/${parsedItemId}_000_001.png`;\r\n return generateImageUrl(productUrl, apiSettings);\r\n};\r\n\r\n/**\r\n * Converts retail proxy product dimension type to display dimension type.\r\n * @param productDimensionType - Product dimension type from retail proxy.\r\n * @returns Local dimension type.\r\n */\r\nexport const convertProductDimensionTypeToDimensionTypes = (productDimensionType: ProductDimensionType): DimensionTypes => {\r\n switch (productDimensionType) {\r\n case ProductDimensionType.Color:\r\n return DimensionTypes.color;\r\n case ProductDimensionType.Configuration:\r\n return DimensionTypes.configuration;\r\n case ProductDimensionType.Size:\r\n return DimensionTypes.size;\r\n case ProductDimensionType.Style:\r\n return DimensionTypes.style;\r\n default:\r\n return DimensionTypes.none;\r\n }\r\n};\r\n\r\n/**\r\n * Converts display dimension type to retail proxy product dimension type.\r\n * @param dimensionType - Local dimension type.\r\n * @returns Product dimension type from retail proxy.\r\n */\r\nexport const convertDimensionTypeToProductDimensionType = (dimensionType: DimensionTypes): ProductDimensionType => {\r\n switch (dimensionType) {\r\n case DimensionTypes.color:\r\n return ProductDimensionType.Color;\r\n case DimensionTypes.configuration:\r\n return ProductDimensionType.Configuration;\r\n case DimensionTypes.size:\r\n return ProductDimensionType.Size;\r\n case DimensionTypes.style:\r\n return ProductDimensionType.Style;\r\n default:\r\n return ProductDimensionType.None;\r\n }\r\n};\r\n\r\n/**\r\n * Sets dimensions to url.\r\n * @param inputUrl - Url to update.\r\n * @param productDimensions - Dimensions to set.\r\n */\r\nexport const setDimensionValuesToQuery = (inputUrl: URL, productDimensions: ProductDimension[]): void => {\r\n for (const dimension of productDimensions) {\r\n inputUrl.searchParams.set(\r\n convertProductDimensionTypeToDimensionTypes(dimension.DimensionTypeValue), dimension.DimensionValue?.Value ?? '');\r\n }\r\n\r\n window.history?.replaceState(window.history.state, '', inputUrl.toString()?.replace(inputUrl.host, window.location.host));\r\n};\r\n\r\n/**\r\n * Retrieves dimension value stored in url.\r\n * @param urlParameters - Url parameters.\r\n * @param productDimensionType - The dimension type to retrieve.\r\n * @returns Product dimension item.\r\n */\r\nconst parseDimensionFromUrl = (urlParameters: URLSearchParams, productDimensionType: ProductDimensionType): ProductDimension | undefined => {\r\n const localDimensionType = convertProductDimensionTypeToDimensionTypes(productDimensionType);\r\n const value = urlParameters.get(localDimensionType);\r\n if (!value) {\r\n return undefined;\r\n }\r\n return {\r\n DimensionTypeValue: productDimensionType,\r\n DimensionValue: {\r\n RecordId: 0,\r\n Value: value\r\n }\r\n };\r\n};\r\n\r\n/**\r\n * Retrieves all dimensions from URL.\r\n * @param urlParameters - Url parameters.\r\n * @returns Product dimensions stored in url.\r\n */\r\nconst parseDimensionsFromUrl = (urlParameters: URLSearchParams): ProductDimension[] => {\r\n const dimensionsToParse: ProductDimensionType[] = [\r\n ProductDimensionType.Color,\r\n ProductDimensionType.Configuration,\r\n ProductDimensionType.Size,\r\n ProductDimensionType.Style\r\n ];\r\n const parsedDimensions = dimensionsToParse.map(dimension => parseDimensionFromUrl(urlParameters, dimension));\r\n return ArrayExtensions.validValues(parsedDimensions);\r\n};\r\n\r\n/**\r\n * Utility function to extract the dimension values from input url querystring.\r\n * @param inputUrl - The request url.\r\n * @returns The selected dimension values.\r\n */\r\nexport const getDimensionValuesFromQuery = (inputUrl: URL): ProductDimension[] => {\r\n const urlWithIgnoredCase = new URL(inputUrl.toString().toLocaleLowerCase());\r\n const urlParameters = urlWithIgnoredCase.searchParams;\r\n const dimensions: ProductDimension[] = parseDimensionsFromUrl(urlParameters);\r\n return dimensions;\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});","/* 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}","/* 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\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 { IMfrmSearchResultContainerResources } from '../../../modules/mfrm-search-result-container/mfrm-search-result-container.props.autogenerated';\r\nimport { ProductComponent } from '../../../themes/mattressfirm/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 '../../../themes/mattressfirm/views/components/delivery-message/deliverymessage.component';\r\nimport { ErrorBoundary } from '../../../common/components/error-boundary';\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>;\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 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 showBvRatings?: 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>,\r\n products: ProductSearchResult[] | undefined,\r\n isCategoryPage: boolean,\r\n categoryNameFromSlug: string | undefined\r\n): Promise => {\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>): 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>): 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 listNameValue = listName ? `${listName}` : 'PLP';\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' in window) {\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: `${pagePath}` === '/search' ? 'SRP' : listNameValue,\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, listName: string | undefined): void => {\r\n const pagePath = getPagePath();\r\n const listNameValue = listName ? `${listName}` : 'Standard PLP';\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' in window) {\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: `${pagePath}` === '/search' ? 'SRP' : listNameValue,\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 = ({\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 showBvRatings\r\n}) => {\r\n const [resultEyebrow, setResultEyebrow] = React.useState(null);\r\n const [resultCoreDelivery, setResultCoreDelivery] = React.useState(undefined);\r\n const [productIDList, setproductIDList] = React.useState([]);\r\n const [categoryID, setCategoryID] = React.useState([]);\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>,\r\n resources: IMfrmSearchResultContainerResources,\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([]);\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
    \r\n {products.map((product: ProductSearchResultExtended, index: number) => (\r\n // tslint:disable-next-line: react-this-binding-issue jsx-no-lambda\r\n callTeliumOnClick(categoryID, product, listName)}\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
  • \r\n \r\n \r\n \r\n
  • \r\n \r\n ))}\r\n
\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
\r\n {mattressMatcherBanner![mattressMatcherBannerIndex!]}\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.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","/*---------------------------------------------------------------------------------------------\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","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","/* 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","/* 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","/*---------------------------------------------------------------------------------------------\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\nimport { ErrorBoundary } from '../../../common/components/error-boundary';\r\n\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 \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 );\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
  • \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 });\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 { 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 { 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}","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","/*---------------------------------------------------------------------------------------------\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 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\nimport { ErrorBoundary } from '../../common/components/error-boundary';\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 itemsPerPageInitialState: number;\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 itemsPerPageInitialState: number;\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 itemsPerPageInitialState: props.config.itemsPerPage || 10\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 const extensionProperties = this.props.data.products.result?.products[0].ExtensionProperties;\r\n const redirectUrl = extensionProperties && extensionProperties?.find(obj => obj?.Key === 'RedirectURL')?.Value?.StringValue;\r\n\r\n if (MsDyn365.isBrowser && redirectUrl) {\r\n let url = window.location.href;\r\n if (url !== redirectUrl) {\r\n document.location.href = redirectUrl ? redirectUrl : '';\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.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 window.onpopstate = () => {\r\n window.location.reload();\r\n };\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 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 if (!ArrayExtensions.hasElements(products)) {\r\n errorText = this._pageType === 'Category' ? resources.resultCategoryNotFoundText : resources.resultSearchNotFoundText;\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 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 itemsPerPageInitialState: this.state.itemsPerPageInitialState\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 const pageName: string | undefined = context.request.telemetryPageName;\r\n let collectionTitle: string | undefined = '';\r\n if (context && context.request && context.request.query && context.request.query.q && pageName === 'Search') {\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 <ErrorBoundary telemetry={context.telemetry} key={index}>\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 </ErrorBoundary>\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 <ErrorBoundary telemetry={telemetry}>\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 </ErrorBoundary>\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 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","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 { ErrorBoundary } from '../../common/components/error-boundary';\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 } 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 './components';\r\nimport { IMfrmSearchResultContainerResources } from './mfrm-search-result-container.props.autogenerated';\r\nimport { ProductSearchResult } from '@msdyn365-commerce/retail-proxy';\r\nimport CustomSkeleton from '../../themes/mattressfirm/custom-components/CustomSkeleton';\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 <ErrorBoundary telemetry={props.telemetry}>\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 </ErrorBoundary>\r\n );\r\n }\r\n return (\r\n <ErrorBoundary telemetry={props.telemetry}>\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 </ErrorBoundary>\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 itemsPerPageInitialState\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, itemsPerPageInitialState, props, mattressMatcherBannerIndex) : <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 <ErrorBoundary telemetry={props.telemetry}>\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 showBvRatings={props.config.showBVRatings}\r\n />\r\n </ErrorBoundary>\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, totalSkeletonItems: number, props: ISearchResultContainerViewProps, mattressMatcherBannerIndex?: number): JSX.Element | null => {\r\n if (isRefinerLoading) {\r\n let banner = null;\r\n const shouldShowMattressMatcherBanner = props.slots.mattressMatcherBanner !== undefined;\r\n if (props.config.showBannerPosition !== undefined && props.config.showBannerPosition >= 0) {\r\n banner = (<div className='ms-content-block mfrm-category-banner mfrm-mm-banner-global'>\r\n <CustomSkeleton className='skeleton-dimensions__banner' type='image' />\r\n </div>);\r\n }\r\n const skeletonItemsBeforeBanner = new Array(props.config.showBannerPosition).fill(null);\r\n const skeletonItemsAfterBanner = new Array(totalSkeletonItems - (props.config.showBannerPosition ? props.config.showBannerPosition : 0)).fill(null);\r\n return (\r\n <div className='ms-search-result-container__Products'>\r\n <ul className='list-unstyled'>\r\n {skeletonItemsBeforeBanner.map((_, idx) =>\r\n (<div className='skeleton-dimensions' key={idx}>\r\n <div className='skeleton-dimensions__product'>\r\n <CustomSkeleton type=\"image\" className='skeleton-dimensions__image' />\r\n <div className=\"msc-product__details\">\r\n <CustomSkeleton type=\"text\" className='skeleton-dimensions__eyebrow' />\r\n <CustomSkeleton type=\"text\" className='skeleton-dimensions__ratings' />\r\n <CustomSkeleton type=\"text\" className='skeleton-dimensions__title' />\r\n <CustomSkeleton type=\"text\" className='skeleton-dimensions__delivery' />\r\n </div>\r\n <CustomSkeleton type=\"text\" className='skeleton-dimensions__financing' />\r\n </div>\r\n </div>))}\r\n </ul>\r\n {shouldShowMattressMatcherBanner ? banner : null}\r\n <ul className='list-unstyled'>\r\n {skeletonItemsAfterBanner.map((_, idx) =>\r\n (<div className='skeleton-dimensions' key={idx}>\r\n <div className='skeleton-dimensions__product'>\r\n <CustomSkeleton type=\"image\" className='skeleton-dimensions__image' />\r\n <div className=\"msc-product__details\">\r\n <CustomSkeleton type=\"text\" className='skeleton-dimensions__eyebrow' />\r\n <CustomSkeleton type=\"text\" className='skeleton-dimensions__ratings' />\r\n <CustomSkeleton type=\"text\" className='skeleton-dimensions__title' />\r\n <CustomSkeleton type=\"text\" className='skeleton-dimensions__delivery' />\r\n </div>\r\n <CustomSkeleton type=\"text\" className='skeleton-dimensions__financing' />\r\n </div>\r\n </div>))}\r\n </ul>\r\n </div>\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","import React, { FunctionComponent } from 'react';\r\n\r\n\r\ninterface Props {\r\n /** Sets the skeleton-pulse style */\r\n type?: 'text' | 'image' | 'button' | 'button-secondary';\r\n /** Sets the width of the skeleton. Default unit is px. */\r\n width?: number | string;\r\n /** Sets the height of the skeleton. Default unit is px. */\r\n height?: number | string;\r\n /** Makes the skeleton look like a circle */\r\n circle?: boolean;\r\n /** Override classNames on wrapper */\r\n className?: string;\r\n /** Override styles on wrapper */\r\n style?: object;\r\n [rest: string]: unknown; // ...rest property\r\n}\r\n\r\nconst getValidCSSInput = (input: string | number) => {\r\n switch (typeof input) {\r\n case 'undefined':\r\n case 'boolean':\r\n return null;\r\n case 'number':\r\n return `${input}px`;\r\n default:\r\n const parsedInput = parseFloat(input);\r\n const unit = input.match(/%|em/);\r\n return isNaN(parsedInput) ? '' : unit ? `${parsedInput}${unit}` : `${parsedInput}px`;\r\n }\r\n};\r\n\r\nconst CustomSkeleton: FunctionComponent<Props> = ({\r\n width,\r\n height,\r\n circle,\r\n type = 'text',\r\n className = '',\r\n style = {},\r\n ...rest\r\n}) => {\r\n const isTextType = type === 'text';\r\n const classNames = `pulse ${!className ? type : ``} ${isTextType ? 'transform' : ''} ${type === 'button-secondary' && !className ? 'button' : ''} ${circle ? 'circle' : ''} ${className}`;\r\n\r\n return (\r\n <span\r\n {...rest}\r\n className={classNames}\r\n style={{\r\n ...style,\r\n //@ts-ignore\r\n width: `${getValidCSSInput(width) ?? ''}`,\r\n //@ts-ignore\r\n height: `${getValidCSSInput(height) ?? ''}`,\r\n borderRadius: '4px'\r\n }}\r\n />\r\n );\r\n};\r\n\r\nexport default CustomSkeleton;\r\n","import { ICoreContext, IGeneric, IAny } from '@msdyn365-commerce/core';\r\nimport { AttributeValue, CommerceProperty } from '@msdyn365-commerce/retail-proxy';\r\nimport React from 'react';\r\nimport { IBrandListData } from '../../../../../modules/mfrm-buybox/mfrm-buybox.view';\r\nimport { _getSoonestDeliveryDate, _makeDeliveryMessage } from '../../../../../Utilities/product-search-result-utils';\r\nimport { ProductSearchResultExtended } from '../../../custom-components/product-search-result-items';\r\nimport CustomSkeleton from '../../../custom-components/CustomSkeleton';\r\ninterface IDeliveryMessage {\r\n product?: ProductSearchResultExtended;\r\n context: ICoreContext<IGeneric<IAny>>;\r\n isMasterProduct?: boolean;\r\n attributeValues?: AttributeValue[];\r\n extensionProperties?: CommerceProperty[];\r\n lowestPriceVariantRecordId?: string;\r\n}\r\n\r\n//TODO: common method; move to general utility file. AND change return type to an Enumeration\r\nexport const _getProductType = (shippingInformation: string | undefined): string => {\r\n if (shippingInformation && shippingInformation.toLowerCase() === 'delivery') {\r\n return 'Core';\r\n }\r\n if (shippingInformation && shippingInformation.toLowerCase() === 'parcel') {\r\n return 'Small Parcel';\r\n }\r\n if (shippingInformation && shippingInformation.toLowerCase() === 'drop ship') {\r\n return 'Drop Ship';\r\n }\r\n return '';\r\n};\r\n\r\nexport const computeItemLines = (\r\n product: IDeliveryMessage['product'],\r\n defaultVariantId: number | undefined,\r\n lowestPriceVariantRecordId: string | undefined\r\n) => {\r\n if (product?.IsMasterProduct) {\r\n if (defaultVariantId && defaultVariantId !== 0) {\r\n return defaultVariantId.toString();\r\n }\r\n if (lowestPriceVariantRecordId && lowestPriceVariantRecordId !== '') {\r\n return lowestPriceVariantRecordId;\r\n }\r\n }\r\n return product?.RecordId.toString();\r\n};\r\n\r\nconst DeliveryMessage: React.FC<IDeliveryMessage> = ({\r\n product,\r\n context,\r\n attributeValues,\r\n extensionProperties,\r\n lowestPriceVariantRecordId\r\n}) => {\r\n let productDeliveryMessage = '';\r\n const { app } = context;\r\n const shippingInformationSmall = attributeValues && attributeValues.find(\r\n (attr: AttributeValue) => attr.Name?.trim() === app.config.smallParcelAttributeKey\r\n )?.TextValue?.toLowerCase();\r\n\r\n const defaultVariantShippingInformation = extensionProperties && extensionProperties.find(\r\n (property: CommerceProperty) => property?.Key === \"Unbxd_DefaultVariantShippingInformation\"\r\n )?.Value?.StringValue;\r\n\r\n if ((_getProductType(defaultVariantShippingInformation || shippingInformationSmall)) === 'Core') {\r\n productDeliveryMessage = product?.deliveryByMessage ?? '';\r\n } else if ((\r\n (_getProductType(defaultVariantShippingInformation || shippingInformationSmall)) === 'Small Parcel' ||\r\n (_getProductType(defaultVariantShippingInformation || shippingInformationSmall)) === 'Drop Ship'\r\n )) {\r\n let deliveryDays =\r\n attributeValues && attributeValues.find(attr => attr.Name?.trim() === app.config.leadTime)?.TextValue;\r\n if (\r\n (deliveryDays === '' || deliveryDays === undefined || deliveryDays === null) &&\r\n app.config.brandList &&\r\n app.config.brandList.length > 0\r\n ) {\r\n const brand =\r\n attributeValues &&\r\n attributeValues.find(\r\n attr =>\r\n app.config.brandBackofficeAttributePlp &&\r\n attr.Name?.trim() === app.config.brandBackofficeAttributePlp\r\n )?.TextValue?.toLowerCase();\r\n\r\n if (brand !== undefined && brand !== null && brand !== '') {\r\n app.config.brandList.map((singleBrand: IBrandListData) => {\r\n if (singleBrand.brandName.toLowerCase() === brand) {\r\n deliveryDays =\r\n singleBrand.brandLeadtime !== undefined &&\r\n singleBrand.brandLeadtime !== '' &&\r\n singleBrand.brandLeadtime !== null\r\n ? singleBrand.brandLeadtime\r\n : '';\r\n }\r\n });\r\n }\r\n deliveryDays = app.config.brandList[0].brandLeadtime;\r\n }\r\n if (deliveryDays && productDeliveryMessage === '') {\r\n productDeliveryMessage = _makeDeliveryMessage(deliveryDays);\r\n }\r\n }\r\n\r\n return productDeliveryMessage ? (\r\n <div className='msc-product__delivery-message'>\r\n {productDeliveryMessage}\r\n </div>\r\n ) : <CustomSkeleton type=\"text\" className='skeleton-dimensions__delivery'/>;\r\n};\r\n\r\nexport default DeliveryMessage;","import { getProductPageUrlSync } from '@msdyn365-commerce-modules/retail-actions';\r\nimport {\r\n Button,\r\n format,\r\n getPayloadObject,\r\n getTelemetryAttributes,\r\n ITelemetryContent,\r\n onTelemetryClick\r\n} from '@msdyn365-commerce-modules/utilities';\r\nimport { PriceComponent, RatingComponent, IPriceComponentResources } from '@msdyn365-commerce/components';\r\nimport { CommerceProperty } from '@msdyn365-commerce/retail-proxy';\r\nimport MsDyn365, {\r\n IComponent,\r\n IComponentProps,\r\n ICoreContext,\r\n IGridSettings,\r\n IImageData,\r\n IImageSettings,\r\n IImageProps,\r\n Image,\r\n IRequestContext,\r\n msdyn365Commerce,\r\n RichTextComponent\r\n} from '@msdyn365-commerce/core';\r\nimport { AttributeValue, ProductPrice, ProductSearchResult } from '@msdyn365-commerce/retail-proxy';\r\nimport React from 'react';\r\n// VSI Customization - starts\r\nimport { convertToTitlecase } from '../../../../Utilities/convert-to-titlecase';\r\nimport { getBVAttributeValues } from '../../../../Utilities/get-bv-attributes';\r\nimport { buildProductBadge, parseBadgeData } from '../../../../Utilities/get-product-badge';\r\nimport { parseBrandName } 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 { FinancingPerMonthComponent } from '../../custom-components/financing-per-month-component';\r\nimport DeliveryMessage from './delivery-message';\r\nimport { BVRatingSummary } from '../../../../Utilities/components/BVRatingSummary';\r\nimport { removeSpecialChars } from '../../../../Utilities/allRegex';\r\nimport CustomSkeleton from '../../custom-components/CustomSkeleton';\r\nimport { ErrorBoundary } from '../../../../common/components/error-boundary';\r\n// VSI Customization - ends\r\nexport interface IProductComponentProps extends IComponentProps<{ product?: ProductSearchResult }> {\r\n className?: string;\r\n imageSettings?: IImageSettings;\r\n savingsText?: string;\r\n freePriceText?: string;\r\n originalPriceText?: string;\r\n currentPriceText?: string;\r\n ratingAriaLabel?: string;\r\n allowBack?: boolean;\r\n telemetryContent?: ITelemetryContent;\r\n quickViewButton?: React.ReactNode;\r\n eyebrowMessage?: string | undefined;\r\n badgeAttribute?: string;\r\n deliveryMessage?: string;\r\n isRefinersEnabled?: boolean;\r\n // VSI Customization - Copied following 3 props from OOTB product.component to be used in product recommendations for Cart\r\n ratingCountAriaLabel?: string;\r\n isPriceMinMaxEnabled?: boolean;\r\n priceResources?: IPriceComponentResources;\r\n // Customized props for product recommendation on Cart page\r\n displayShopNow?: boolean;\r\n showBvRatings?: boolean;\r\n shopNowBtnText?: string;\r\n}\r\n\r\nexport interface IEyebrowMessageDimensions {\r\n height: number;\r\n visibleHeight: number;\r\n}\r\n\r\nexport interface IProductComponent extends IComponent<IProductComponentProps> { }\r\n\r\nconst PriceComponentActions = {};\r\n\r\n// tslint:disable-next-line: max-func-body-length cyclomatic-complexity\r\nconst ProductCard: React.FC<IProductComponentProps> = ({\r\n data,\r\n context,\r\n imageSettings,\r\n savingsText,\r\n freePriceText,\r\n originalPriceText,\r\n currentPriceText,\r\n ratingAriaLabel,\r\n allowBack,\r\n typeName,\r\n id,\r\n telemetryContent,\r\n quickViewButton,\r\n eyebrowMessage,\r\n badgeAttribute,\r\n deliveryMessage,\r\n isRefinersEnabled,\r\n displayShopNow,\r\n shopNowBtnText,\r\n showBvRatings\r\n}) => {\r\n // VSI Customization - starts\r\n const {\r\n app: {\r\n config: { brandBackofficeAttributePlp, enableAttributeBasedRating }\r\n }\r\n } = context;\r\n const getEyebrowElementRef = React.useRef<HTMLDivElement>(null);\r\n const eyebrowElement = getEyebrowElementRef.current?.querySelector('.mfrm-eyebrow__button-plp') as Element;\r\n const [isTruncated, setTruncated] = React.useState<IEyebrowMessageDimensions>({\r\n height: eyebrowElement?.scrollHeight,\r\n visibleHeight: eyebrowElement?.clientHeight\r\n });\r\n\r\n const badgeAttributeToUse = context.app.config.productBadgeAttribute;\r\n // VSI Customization - ends\r\n const product = data.product;\r\n if (!product) {\r\n return null;\r\n }\r\n // VSI Customization - starts\r\n /** When enabled rating values will be picked from BazaarVoice attributes created on product.\r\n * If disabled rating will be shown from OOTB properties on a product.\r\n * This will be used for PLP and product-collection/product recommendations\r\n */\r\n const { AttributeValues, ExtensionProperties } = product;\r\n let isBVratings = false;\r\n if (AttributeValues && AttributeValues?.find(attr => attr.Name?.trim() === \"BVAverageOverallRating\")) {\r\n isBVratings = true;\r\n }\r\n const averageRating = enableAttributeBasedRating && AttributeValues && isBVratings ? getBVAttributeValues(AttributeValues, 'BVAverageOverallRating') : _parseValue(product?.AverageRating);\r\n const totalRatings = enableAttributeBasedRating && AttributeValues && isBVratings ? getBVAttributeValues(AttributeValues, 'BVTotalReviewCount') : _parseValue(product?.TotalRatings);\r\n React.useEffect(() => {\r\n function handleResize(): void {\r\n setTruncated({\r\n height: eyebrowElement?.scrollHeight,\r\n visibleHeight: eyebrowElement?.clientHeight\r\n });\r\n }\r\n handleResize();\r\n if (MsDyn365.isBrowser) {\r\n window.addEventListener('resize', handleResize);\r\n return () => window.removeEventListener('resize', handleResize);\r\n } else {\r\n return () => null;\r\n }\r\n }, [eyebrowElement?.scrollHeight, eyebrowElement?.clientHeight]);\r\n // VSI Customization - ends\r\n const lowestPriceVariantRecordId = AttributeValues?.find(\r\n attr => attr.Name?.trim() === context.app.config.EcomLowestPriceVariantRecIdKey\r\n )?.TextValue;\r\n const unbxdDefaultVariant = product && product.ExtensionProperties?.find((property: CommerceProperty) => property?.Key === \"Unbxd_DefaultVariantID\")?.Value?.LongValue;\r\n const queryBasedSelection = context.app.config.queryBasedVariantSelection;\r\n const fallBackImage = context.app.config.placeholderImageName;\r\n const defaultOrLowestVariantRecordId = unbxdDefaultVariant! > 0 ? unbxdDefaultVariant : product.RecordId;\r\n let productUrl = getProductPageUrlSync(removeSpecialChars(product?.Name!, context) || '', queryBasedSelection ? product.MasterProductId || product.RecordId : product.RecordId, context && context.actionContext, undefined);\r\n\r\n if (allowBack) {\r\n productUrl = updateProductUrl(productUrl, context);\r\n }\r\n if (queryBasedSelection) {\r\n const variantIdQueryParams = productUrl.includes('?') ? `&variantid=${defaultOrLowestVariantRecordId}` : `?variantid=${defaultOrLowestVariantRecordId}`;\r\n productUrl += variantIdQueryParams;\r\n }\r\n // Construct telemetry attribute to render\r\n const payLoad = getPayloadObject('click', telemetryContent!, '', defaultOrLowestVariantRecordId!.toString());\r\n const attribute = getTelemetryAttributes(telemetryContent!, payLoad);\r\n // VSI Customization -starts\r\n // #17772: Check the master product, if false then add size Refinement property otherwise show Starting at\r\n let sizeValue =\r\n product && !product?.IsMasterProduct && product?.ExtensionProperties && product?.ExtensionProperties?.length > 0\r\n ? product?.ExtensionProperties.find(i => i.Key === \"Size\")?.Value?.StringValue\r\n : '';\r\n sizeValue = sizeValue && convertToTitlecase(sizeValue);\r\n\r\n // Flag used on cart page to display ratings & shop now button\r\n const isCustomizedDesign = displayShopNow;\r\n\r\n if (typeName === 'product-collection') {\r\n // VSI Customization -starts\r\n const brandName = parseBrandName(AttributeValues, brandBackofficeAttributePlp);\r\n const productTitleWithBrandname = brandName ? `${brandName} ${product.Name}` : product.Name;\r\n // VSI Customization -end\r\n // tslint:disable:max-line-length\r\n return (\r\n <ErrorBoundary telemetry={context.telemetry}>\r\n <div className='msc-product'>\r\n <a\r\n href={productUrl}\r\n onClick={onTelemetryClick(telemetryContent!, payLoad, product.Name!)}\r\n aria-label={renderLabel(\r\n product.Name,\r\n context.cultureFormatter.formatCurrency(product.Price),\r\n product.AverageRating,\r\n ratingAriaLabel\r\n )}\r\n {...attribute}\r\n >\r\n {<div className='mfrm-product-badge'>{renderProductBadge(badgeAttributeToUse, AttributeValues, context.request)}</div>}\r\n <div className='msc-product__image'>\r\n {renderProductPlacementImage(\r\n imageSettings, context.request.gridSettings, product.PrimaryImageUrl,\r\n product.PrimaryImageUrl, product.Name, context.actionContext.requestContext, fallBackImage)}\r\n </div>\r\n </a>\r\n <div className='msc-product__details'>\r\n {/* VSI Customization - START */}\r\n {/* (ADO:23447) Added only class name conditionally as discounted price based on product.component if BasePrice > Price then it will be discounted else not */}\r\n <a\r\n className={\r\n product.BasePrice\r\n ? product.BasePrice > product.Price\r\n ? 'msc-product discounted'\r\n : 'msc-product'\r\n : 'msc-product'\r\n }\r\n href={productUrl}\r\n onClick={onTelemetryClick(telemetryContent!, payLoad, product.Name!)}\r\n aria-label={renderLabel(\r\n product.Name,\r\n context.cultureFormatter.formatCurrency(product.Price),\r\n product.AverageRating,\r\n ratingAriaLabel\r\n )}\r\n {...attribute}\r\n >\r\n {/* Todo: 'Starting at' string will be replaced with relevant resources */} {/* For cart page, price will be shown after name */}\r\n {!isCustomizedDesign &&\r\n <>\r\n {sizeValue ? sizeValue : product.Price !== 0 ? 'Starting at ' : ''}\r\n {renderPrice(\r\n context,\r\n typeName,\r\n id,\r\n product.BasePrice,\r\n product.Price,\r\n savingsText,\r\n freePriceText,\r\n originalPriceText,\r\n currentPriceText\r\n )}\r\n </>\r\n }\r\n {!isCustomizedDesign &&\r\n <span className='msc-product__title' title={productTitleWithBrandname}>\r\n {productTitleWithBrandname && productTitleWithBrandname.length > 40\r\n ? `${productTitleWithBrandname.slice(0, 40)}...`\r\n : productTitleWithBrandname}\r\n </span>\r\n }\r\n {isCustomizedDesign &&\r\n <span className='msc-product__title' title={productTitleWithBrandname}>\r\n {productTitleWithBrandname}\r\n </span>\r\n }\r\n {isCustomizedDesign &&\r\n <div>\r\n {renderPrice(\r\n context,\r\n typeName,\r\n id,\r\n product.BasePrice,\r\n product.Price,\r\n savingsText,\r\n freePriceText,\r\n originalPriceText,\r\n currentPriceText\r\n )}\r\n </div>\r\n }\r\n {/* todo : will be added when required in next sprints */}\r\n {!context.app.config.hideRating &&\r\n renderRating(context, typeName, id, averageRating, totalRatings, ratingAriaLabel)}\r\n {isCustomizedDesign &&\r\n <Button color='primary' type='button' href={productUrl} >\r\n {shopNowBtnText}\r\n </Button>\r\n }\r\n {/* VSI Customization - END */}\r\n </a>\r\n </div>\r\n {/* OOB Quick View */}\r\n {/* {quickViewButton && renderQuickView(quickViewButton, product.RecordId)} */}\r\n </div>\r\n </ErrorBoundary>\r\n );\r\n } else {\r\n const priceComponent = renderPrice(\r\n context,\r\n typeName,\r\n id,\r\n product.BasePrice,\r\n product.Price,\r\n savingsText,\r\n freePriceText,\r\n originalPriceText,\r\n currentPriceText\r\n );\r\n const isSearchResultContainer = typeName === 'search-result-container' || typeName === 'mfrm-search-result-container';\r\n const brandName = parseBrandName(AttributeValues, brandBackofficeAttributePlp);\r\n return (\r\n // tslint:disable-next-line: react-this-binding-issue jsx-no-lambda\r\n <ErrorBoundary telemetry={context.telemetry}>\r\n <div className='msc-product' role='button' onClick={() => setProductUrl(productUrl)}>\r\n <a\r\n href={productUrl}\r\n onClick={onTelemetryClick(telemetryContent!, payLoad, product.Name!)}\r\n aria-label={renderLabel(\r\n product.Name,\r\n context.cultureFormatter.formatCurrency(product.Price),\r\n product.AverageRating,\r\n ratingAriaLabel\r\n )}\r\n {...attribute}\r\n >\r\n {isSearchResultContainer && (\r\n <div className='mfrm-product-badge'>\r\n {renderProductBadge(badgeAttributeToUse, AttributeValues, context.request)}\r\n </div>\r\n )}\r\n <div className='msc-product__image'>\r\n {renderProductPlacementImage(\r\n imageSettings, context.request.gridSettings, product.PrimaryImageUrl,\r\n product.PrimaryImageUrl, product.Name, context.actionContext.requestContext, fallBackImage)}\r\n </div>\r\n </a>\r\n\r\n <div className='msc-product__details'>\r\n {/* VSI Customization - START */}\r\n <div className='msc-product__rating-holder'>\r\n {/* VSI Customization - END */}\r\n {isSearchResultContainer && eyebrowMessage && (\r\n <div className='msc-product__rating-eyebrow-wrapper'>\r\n <div className='mfrm-eyebrow__button' ref={getEyebrowElementRef}>\r\n <RichTextComponent text={eyebrowMessage} className='mfrm-eyebrow__button-plp' />\r\n {isTruncated.height > isTruncated.visibleHeight ? (\r\n <RichTextComponent text={eyebrowMessage} className='mfrm-eyebrow__tooltip-title' />\r\n ) : (\r\n false\r\n )}\r\n </div>\r\n </div>\r\n )}\r\n {isSearchResultContainer && !eyebrowMessage && eyebrowMessage?.length !== 0 && !showBvRatings && (\r\n <CustomSkeleton type=\"text\" className='skeleton-dimensions__eyebrow' />\r\n )}\r\n {isSearchResultContainer && eyebrowMessage?.length === 0 && !showBvRatings && (\r\n <div className='msc-product__rating-eyebrow-wrapper'>\r\n <div> </div>\r\n </div>\r\n )}\r\n {!context.app.config.hideRating && (data.product && showBvRatings) ? <BVRatingSummary itemId={data.product.ItemId} variantId={data.product.RecordId} /> :\r\n (renderRating(context, typeName, id, averageRating, totalRatings, ratingAriaLabel) ? renderRating(context, typeName, id, averageRating, totalRatings, ratingAriaLabel) :\r\n <div className='msc-rating msc-no-ratings'>\r\n <div> </div>\r\n </div>\r\n )}\r\n {/* VSI Customization - START */}\r\n </div>\r\n {/* VSI Customization - END */}\r\n <a\r\n href={productUrl}\r\n onClick={onTelemetryClick(telemetryContent!, payLoad, product.Name!)}\r\n aria-label={renderLabel(\r\n product.Name,\r\n context.cultureFormatter.formatCurrency(product.Price),\r\n product.AverageRating,\r\n ratingAriaLabel\r\n )}\r\n {...attribute}\r\n >\r\n <span className='msc-product__title' title={product.Name}>\r\n {brandName ? `${brandName} ${product.Name}` : product.Name}\r\n </span>\r\n\r\n {/* original price */}\r\n {!isSearchResultContainer && priceComponent}\r\n {renderDescription(product.Description)}\r\n </a>\r\n {/* {deliveryMessage && <>{deliveryMessage}</>} */}\r\n <DeliveryMessage\r\n product={data.product}\r\n context={context}\r\n attributeValues={AttributeValues}\r\n extensionProperties={ExtensionProperties}\r\n lowestPriceVariantRecordId={lowestPriceVariantRecordId}\r\n />\r\n </div>\r\n {/* new price */}\r\n {isSearchResultContainer\r\n ? product.Price\r\n ? priceComponent && (\r\n <FinancingPerMonthComponent\r\n pageType='PLP'\r\n sizeValue={sizeValue}\r\n sellingPrice={product.Price}\r\n context={context}\r\n priceComponent={priceComponent}\r\n activeVariantId={undefined}\r\n productId={undefined}\r\n activeColorVariantId={undefined}\r\n />\r\n )\r\n : priceComponent\r\n : null}\r\n {/* OOB Quick View */}\r\n {/* {quickViewButton && renderQuickView(quickViewButton, product.RecordId)} */}\r\n </div>\r\n </ErrorBoundary>\r\n );\r\n }\r\n // VSI Customization - Ends here\r\n};\r\n// VSI Customization - Starts here\r\nfunction _parseValue(productRating?: string | number): number {\r\n const value = +(productRating || 0);\r\n return Math.round(value * 10) / 10;\r\n}\r\n// VSI Customization - Ends here\r\nfunction renderLabel(name?: string, price?: string, rating?: number, ratingAriaLabel?: string): string {\r\n name = name || '';\r\n price = price || '';\r\n return `${name} ${price} ${getRatingAriaLabel(rating, ratingAriaLabel)}`;\r\n}\r\n\r\nfunction setProductUrl(productUrl: string): void {\r\n if (MsDyn365.isBrowser) {\r\n window.location.href = productUrl;\r\n }\r\n}\r\n\r\nfunction renderDescription(description?: string): JSX.Element | null {\r\n return <p className='msc-product__text'>{description}</p>;\r\n}\r\n\r\n// Render Quick View\r\n// function renderQuickView(quickview: React.ReactNode, item?: number): JSX.Element | undefined {\r\n// if (quickview === null) {\r\n// return undefined;\r\n// }\r\n// return React.cloneElement(quickview as React.ReactElement, { selectedProductId: item });\r\n// }\r\n\r\nfunction getRatingAriaLabel(rating?: number, ratingAriaLabel?: string): string {\r\n if (rating && ratingAriaLabel) {\r\n const roundedRating = rating.toFixed(2);\r\n return format(ratingAriaLabel || '', roundedRating, '5');\r\n }\r\n return '';\r\n}\r\n\r\nfunction updateProductUrl(productUrl: string, context: ICoreContext): string {\r\n const srcUrl = new URL(productUrl, context.request.apiSettings.baseUrl);\r\n const queryString = 'back=true';\r\n if (srcUrl.search) {\r\n srcUrl.search += `&${queryString}`;\r\n } else {\r\n srcUrl.search += queryString;\r\n }\r\n\r\n const updatedUrl = new URL(srcUrl.href);\r\n return updatedUrl.pathname + srcUrl.search;\r\n}\r\n\r\nfunction renderRating(\r\n context: ICoreContext,\r\n typeName: string,\r\n id: string,\r\n avgRating?: number,\r\n totalRatings?: number,\r\n ariaLabel?: string\r\n): JSX.Element | null {\r\n if (avgRating && avgRating !== 0) {\r\n const numRatings = (totalRatings && totalRatings.toString()) || '0';\r\n const ratingAriaLabel = getRatingAriaLabel(avgRating, ariaLabel);\r\n\r\n return (\r\n <RatingComponent\r\n context={context}\r\n id={id}\r\n typeName={typeName}\r\n avgRating={avgRating}\r\n ratingCount={numRatings}\r\n readOnly\r\n ariaLabel={ratingAriaLabel}\r\n data={{}}\r\n />\r\n );\r\n } else {\r\n return null;\r\n }\r\n}\r\n\r\nfunction renderPrice(\r\n context: ICoreContext,\r\n typeName: string,\r\n id: string,\r\n basePrice?: number,\r\n adjustedPrice?: number,\r\n savingsText?: string,\r\n freePriceText?: string,\r\n originalPriceText?: string,\r\n currentPriceText?: string\r\n): JSX.Element | null {\r\n const price: ProductPrice = {\r\n BasePrice: basePrice,\r\n AdjustedPrice: adjustedPrice,\r\n CustomerContextualPrice: adjustedPrice\r\n };\r\n return basePrice ? (\r\n <PriceComponent\r\n context={context}\r\n id={id}\r\n typeName={typeName}\r\n data={{ price }}\r\n savingsText={savingsText}\r\n freePriceText={freePriceText}\r\n originalPriceText={originalPriceText}\r\n />\r\n ) : null;\r\n}\r\n\r\n/**\r\n * Gets the react component for product rating.\r\n * @param productCardimageSettings - Module image settings for product card.\r\n * @param gridSettings - Grid settings defined in theme.\r\n * @param imageUrl - Image url.\r\n * @param fallbackImageUrl - Fallback url for imge.\r\n * @param altText - Image Alt text.\r\n * @param requestContext - Request context using the component.\r\n * @param fallBackImage - Placeholder Image from App settings\r\n * @returns React component for product image.\r\n */\r\nfunction renderProductPlacementImage(\r\n productCardimageSettings?: IImageSettings, gridSettings?: IGridSettings,\r\n imageUrl?: string, fallbackImageUrl?: string, altText?: string, requestContext?: IRequestContext, fallBackImage?: string): JSX.Element | null {\r\n\r\n if (!imageUrl || !gridSettings || !productCardimageSettings) {\r\n return null;\r\n }\r\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access -- Site level config can be of any type.\r\n const emptyPlaceHolderImage = fallBackImage || '';\r\n let fallbackImageSource = fallbackImageUrl;\r\n if (emptyPlaceHolderImage && fallbackImageUrl) {\r\n fallbackImageSource = `${fallbackImageUrl},${emptyPlaceHolderImage}`;\r\n }\r\n const image: IImageData = {\r\n src: imageUrl,\r\n altText: altText ? altText : '',\r\n fallBackSrc: fallbackImageSource\r\n };\r\n const imageProps: IImageProps = { gridSettings };\r\n\r\n imageProps.gridSettings = gridSettings;\r\n imageProps.imageSettings = productCardimageSettings;\r\n imageProps.imageSettings.cropFocalRegion = true;\r\n return (\r\n <Image\r\n {...image} {...imageProps} loadFailureBehavior='empty'\r\n requestContext={requestContext}\r\n bypassHideOnFailure\r\n />\r\n );\r\n}\r\n// VSI Customization - starts\r\n\r\nfunction renderProductBadge(\r\n attributeName: string | undefined,\r\n attributes: AttributeValue[] | undefined,\r\n requestContext: IRequestContext\r\n): JSX.Element | undefined {\r\n const badgeData =\r\n attributeName &&\r\n attributes?.find(\r\n currAttribute => currAttribute.Name && currAttribute.Name.toLowerCase().trim() === attributeName.toLowerCase().trim()\r\n )?.TextValue;\r\n if (!badgeData) {\r\n return;\r\n }\r\n\r\n // split badge data into its separate badges\r\n const badges = badgeData.split(',');\r\n\r\n // parse badge data to get its schedule and image src\r\n const parsedBadges = badges.map(badge => parseBadgeData(badge, requestContext));\r\n // build product badge image components\r\n const finalizedBadges = parsedBadges.map(parsedBadge => parsedBadge && buildProductBadge(parsedBadge, requestContext));\r\n\r\n return finalizedBadges && <>{finalizedBadges}</>;\r\n}\r\n\r\n// VSI Customization - ends\r\n\r\n// @ts-ignore\r\nexport const ProductComponent: React.FunctionComponent<IProductComponentProps> = msdyn365Commerce.createComponentOverride<\r\n IProductComponent\r\n>('Product', { component: ProductCard, ...PriceComponentActions });\r\n\r\nexport default ProductComponent;","export const convertToTitlecase = (stringValue?: string, stopConvert?: boolean) => {\r\n // this stopConvert flag will use to stop conversion in specific scenario\r\n return stopConvert\r\n ? stringValue\r\n : stringValue?.replace(/\\w\\S*/g, txt => {\r\n return txt.charAt(0).toUpperCase() + txt.substr(1).toLowerCase();\r\n });\r\n};\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":["emailRegex","emailValue","test","removeSpecialChars","str","ctx","request","app","config","removeSpecialCharsPDP","replace","removeSpecialCharsFromURLPath","decodeURIComponent","split","callUtag","async","callUtagLink","objToCall","Object","keys","forEach","key","utag","global","hasOwnProperty","link","e","console","log","callUtagView","view","variantQueryStringName","getBVAttributeValues","attributeValues","value","find","attr","Name","trim","TextValue","Math","round","getBVAttributeValuesUnbxd","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","defaultDeliveryMessage","context","isCached","getDeliveryMessageActionInput","GetDeliveryMessageInput","result","getDeliveryMessageAction","actionContext","error","parsedValue","parsedArr","ReactHtmlParser","length","toString","getPagePath","MsDyn365","window","location","href","host","includes","_getEyebrowMessage","products","priceGroupForAPICall","priceGroup","items","item","singleItem","ItemId","DistinctProductVariant","push","requestBody","PriceGroup","Items","getEyebrowMessageInput","GetEyebrowMessageInput","getEyebrowAction","_makeDeliveryMessage","days","deliveryByMessage","daysSpan","deliveryByMessageRange","numberOfDays","newDate","flag","_setTime","time","temp","newDatewithTime","toUpperCase","_getSoonestDeliveryDate","coreProductATPData","deliveryDetails","locationId","index","currHour","StartTime","Location1","_getDeliveryDate","startTimeHour","substring","constructor","getCacheKey","this","sort","a","b","VariantRecordId","getCacheObjectType","dataCacheType","Msdyn365","action","input","atpInput","Weeks","InventoryType","StoreId","RequestedDate","ZipCode","getZipCode","ItemLines","CustomerRequestTime","Id","NoOfPriorityDC","mFIATPInventoryPLPAsync","callerContext","id","GetCategoryPathsInput","catalogId","productIds","constructedCacheKey","ChannelId","apiSettings","channelId","CatalogId","ids","join","createGetCategoryPathsInput","inputData","Error","getProductsCategoryPathsAction","catPaths","hasArray","productsIter","ProductId","getCategoryPathsAsync","queryResultSettings","Paging","Top","Sorting","err","getCategoryPathsActionDataAction","createObservableDataAction","SrpBreadcrumbPageInput","breadcrumbCheck","args","GetSeoDataInput","seoDataUrl","super","shouldCacheOutput","cacheObjectType","cacheKey","getSeoDataUrl","jsonUrl","res","filteredUrlPath","filteredURL","seoData","NavMenuStateInput","navMenuStateAction","isMenuHasParent","isMobileMenuCollapsed","selectedNavMenu","menuItemData","getSelectedProductIdFromActionInput","variantId","queryBasedVariantSelection","getQueryParamsFromQueryByName","url","requestUrl","query","productId","urlTokens","itemId","pageType","inputUrl","queryParamName","URL","toLocaleLowerCase","searchParams","get","Number","isNaN","generateImageUrl","imageUrl","startsWith","baseImageUrl","encodeURIComponent","DimensionTypes","DimensionSwatchDisplayTypes","getFallbackImageUrl","parsedItemId","convertProductDimensionTypeToDimensionTypes","productDimensionType","ProductDimensionType","color","configuration","size","style","none","parseDimensionsFromUrl","urlParameters","parsedDimensions","dimension","localDimensionType","DimensionTypeValue","DimensionValue","RecordId","Value","parseDimensionFromUrl","ArrayExtensions","getDimensionValuesFromQuery","sortOptions","sortByOptionRelevanceDesc","sortByOptionRatingAsc","sortByOptionRatingDesc","sortByOptionNameAsc","sortByOptionNameDesc","sortByOptionPriceAsc","sortByOptionPriceDesc","MappedSearchInput","buildCacheKey","getMappedSearchConfiguration","getSearchConfigurationAsync","then","searchConfiguration","ProductSortColumns","sortColumn","ColumnName","IsDescending","telemetry","warning","filter","Boolean","createInput","ChoiceSummary","React","props","closeButtonGlyph","_onClick","preventDefault","stopPropagation","target","currentTarget","clearAll","getAttribute","indexOf","selectedRefiner","_getSelectedRefinerChoice","onChoiceClicked","itemClicked","choiceClicked","nextItemToFocus","nextSibling","parentKeyName","_onClickKeyName","keyName","payLoad","getPayloadObject","telemetryContent","selectedChoices","_getKeyForRefinerValue","parentKey","_getParentKeyForRefinerValue","render","clearAllText","label","classNames","choiceAriaLabel","clearAllModal","closeAriaLabel","selectedRefinersMap","contentAction","etext","clearAllAttributes","getTelemetryAttributes","className","classnames","attribute","customUrlBuilder","onClick","role","aria-label","clearAllBtn","productRefinerValue","choiceFormat","choiceRangeValueFormat","refinerHierarchy","overallFormat","rangeFormat","refinerValueName","refinerName","parent","hierarchy","Values","isMatchingRefinementCriterion","KeyName","isRangeType","DataTypeValue","_formatPrice","LeftValueBoundString","UnitText","RightValueBoundString","LeftValueBoundLocalizedString","amount","currency","trace","priceAmount","locale","Intl","NumberFormat","currencyDisplay","minimumFractionDigits","selected","innerText","__decorate","computed","observer","Link","text","ariaLabel","getViewport","device","Type","innerWidth","gridSettings","xs","w","sm","md","lg","ProductSearchResultItems","imageSettings","resources","moduleType","moduleId","allowBackNavigation","productBadgeAttribute","mattressMatcherBanner","bannerPosition","mattressMatcherBannerIndex","targetAudienceGroup","listName","currentPromoProducts","isCategoryPage","categoryNameFromSlug","onlyNewProducts","isRefinersEnabled","showBvRatings","resultEyebrow","setResultEyebrow","resultCoreDelivery","setResultCoreDelivery","productIDList","setproductIDList","categoryID","setCategoryID","productsForCallingAPI","catName","productPricesIter","prodId","productsCategories","categoryIds","productCategoriesIter","CategoryPath","catPathSegments","Segments","catId","CategoryId","CategoryName","collectionProductAttributes","AttributeValues","configVendorNamePlp","brandBackofficeAttributePlp","configVendorNamePdp","brandBackofficeAttributePdp","brandName","getBrandNameCheck","eProps","ExtensionProperties","ePropsIter","Key","StringValue","categoryId","categoryName","brand","variantID","getProductsCategories","uniqBy","callATPDelivery","productIdsArray","IsMasterProduct","attributeValue","defaultVariantId","property","LongValue","eyebrowMessageObj","catch","product","eyebrowMessage","resultEyebrowTemp","slice","EyeBrows","eyebrow","Description","toLowerCase","updateProductsMessages","deliveryByMessages","recId","message","updateCoreDeiveryMessage","shippingInformationSmall","smallParcelAttributeKey","defaultVariantShippingInformation","_getProductType","Quantity","getListOfCoreDeliveryMessage","response","skipProductsVal","skipProducts","viewPortCode","getSkipProductValue","listNameValue","pagePath","categoryListArray","item1","some","item2","categoryListArr","brandNameArr","productVariantArr","productNameArr","productIdArr","productPositionArr","productPriceArr","productListArray","productID","Price","event","event_category","event_action","enhanced_action","event_label","event_noninteraction","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","productName","productRecordID","product_list_name","product_position","product_id","product_name","product_category","product_brand","product_variant","callTeliumOnClick","as","rootMargin","onChange","ErrorBoundary","ProductComponent","freePriceText","BasePrice","priceFree","originalPriceText","currentPriceText","ratingAriaLabel","allowBack","typeName","badgeAttribute","shouldShowMattressMatcherBanner","FeatureSearchResultItem","productRecordId","productUrl","getProductPageUrlSync","fallbackImage","onTelemetryClick","altText","img","src","imageProps","fallBackSrc","Image","loadFailureBehavior","renderProductPlacementImage","PrimaryImageUrl","featureSimilarLooksTitle","title","Title","Separator","separator","ModalToggle","innerRef","ref","SearchResultModal","modal","modalNode","modalHeader","modalHeaderNode","modalFooter","modalFooterNode","modalBody","ModalBody","Modal","autoFocus","applicationNode","returnFocusRef","returnRef","isOpen","toggle","onModalToggle","zIndex","ModalHeader","modalTitle","ModalFooter","Button","modalCloseButtonText","totalItems","generateButtonText","ErrorMessage","RangeRefineItem","_formattedPriceReverseLookup","Map","_onRangeUpdate","bind","_onRangeUpdateEnd","_handleRangeTooltipText","_changeMin","_changeMax","_finishChangeMin","_finishChangeMax","minInput","maxInput","selectedRefinementCriterion","initialMin","initialMax","state","isChecked","validationErrorMin","validationErrorMax","selectedMin","selectedMax","touchedMin","touchedMax","parentProductRefinerHierarchy","refineItemCommonProps","isPriceRefinerDisabled","isDisableSlider","rangeType","_renderInputFields","_renderSlider","_initializeMaxValue","formattedSelectedMax","max","_getFormattedSelectedValue","isDisabled","formAttrs","rangeNameFormat","minInputClassName","maxInputClassName","formattedSelectedMin","minLabel","onFocus","onBlur","disabled","maxLabel","placeholder","placeholderTextMax","min","sliderId","RefinerRecordId","ariaAttributes","minPrice","maxPrice","selectedMinPrice","selectedMaxPrice","Slider","inForm","step","orientation","labels","labelId","labelString","labelPositioning","showLabels","showTooltip","sliderThumbs","minValueSliderThumbAriaLabel","currencyCode","ariaValueText","maxValueSliderThumbAriaLabel","onChangeEnd","debounce","handleTooltipText","_changeValue","inputType","selectedKey","touchedKey","setState","_getInputWithoutFormatting","selectedMinValue","selectedMinValueRounded","floor","minTouched","onToggle","maxNum","validationErrorNaN","_focus","_validateRange","isSelecting","rangeStart","rangeEnd","selectedMaxValue","selectedMaxValueRounded","maxTouched","minNum","setTimeout","current","focus","touched","validationError","validationErrorRange","formatPrice","has","set","inputAsNum","sliderChangeNotification","eventType","firstThumbValue","secondThumbValue","_focusOnSliderThumb","element","document","getElementById","tooltip","RefineItem","anchorType","singleProductCountAriaLabel","refineItemAriaLabel","refineItemsAriaLabel","children","attrs","JSON","stringify","isSingleSelect","RefinerTypeValue","RefinerType","itemTypeClassName","productText","productCount","Count","refineMenuItemAriaLabel","SourceValue","ProductRefinerSource","_getRefinerUrl","tabIndex","refinerRating","ratingRefiner","selectedRefinerValues","selectedRating","ratingComponentClass","isMobileView","RatingComponent","avgRating","ratingCount","hideCount","readOnly","moduleTypeName","_getIsCategoryPage","urlBuilder","urlRefinerParts","urlParts","sortedConfigValues","filteredRefiners","urlSpecialCharsConfig","canonicalUrlspecialCharIncludeList","parentProductRefinerName","getVirtualRefinerNames","isMattressesCategory","refinerParts","currentRefinerName","regExSpecialChars","splice","sortedValues","refinerSet","refiner","refinerPart","sortedValue","finalRefiners","sortedConfigValue","sortedRefinerName","concatValue","queryStr","search","origin","categoryPart","RefineSubmenu","_pluralizeKeyName","_showMore","refineItemsExpanded","itemsToShow","_setRefineItemsLimitToDisplay","productRefinerHierarchy","refinerNumberOfItemsToDisplay","_onToggleItem","_onToggleSubmenu","isExpanded","isExpandedOnInitialLoad","expanded","componentDidMount","hideRating","_renderChildItems","onKeyPress","refinerShowLessText","refinerShowMoreText","_renderRange","_renderSingleMultiSelect","isMobile","refinerValuesList","listItems","child","findMatchingRefinementCriterion","selectedValue","_getRangeType","DisplayTemplateValue","DisplayTemplate","submenuClassNamePrefix","itemToggleNotification","onUpdateRefiners","prevState","ProductRefinerValueDataTypeValue","ProductRefinerTypeValue","dataTypeValue","AttributeDataType","refinementCriteria","refinementCriterion","RefinerSourceValue","getUpdatedRefinementCriteria","currentRefinementCriteria","updatedRefinementCriteria","toggledItemFound","selectedCriterion","next","matchingIndex","findIndex","criterion","UiLabeledDropdown","selectSorting","values","_onSelectOption","indexValue","handleDropDown","isShow","setWrapperRef","instance","wrapperRef","handleClickOutside","contains","selectedOption","dropdownOptions","option","selectedIndex","addEventListener","componentWillUnmount","removeEventListener","labelText","labelClassname","dropdownId","labelClassNames","_getSelectedIndex","htmlFor","controlledByParent","onSelectOption","toggleColor","SearchResultContainer","sortByDropdownOptions","_pageType","_isCustomizedRefiner","urlModifications","_viewport","currentNavMenu","getCategoryName","q","category","SearchResultContainer_1","getFriendlyName","NameTranslations","_getViewport","_filterMenuItem","menuItemList","currentNavigation","_updateMattressMatcherBannerWithUrlOnly","mattressMatcherBannerID","subMenu","navMenuItem","destinationURL","clpLink","destinationUrl","linkURL","toCheckURL","_parseLink","pathname","_updateMattressMatcherBannerSlot","slots","moduleIds","splittedIDs","k","matcherBannerSlotInd","lastBannerID","_updateMattressMatcherBanner","bannerIDs","_getCategoryBanner","navMenuState","categoryBanner","navMenuSelectedMenu","categoryBannerIndex","showCategoryBanner","_getActivePrice","listPageState","activeProducts","productRecIds","prod","lowestVariantId","MasterProductId","projectDomain","affliations","customerInput","GetCustomerInput","customer","getCustomer","CustomerAffiliations","affliation","aff","AffiliationId","RetailAffiliationId","CustomerId","AccountNumber","getActivePricesAsync","activePricesResponse","productPrices","prodVariantId","activePrice","price","CustomerContextualPrice","TradeAgreementPrice","AdjustedPrice","exception","debug","_getActivePriceByProducts","_getSearchResultModal","modalIsOpen","totalProductCount","_modalToggleRef","_getChoiceSummary","_toggleModal","_getCollectionTitle","seoDataEntry","seoTitle","pageName","telemetryPageName","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","includeAttributes","getProducts","actionResponse","currentProducts","returnedProducts","infiniteProducts","addedProducts","concat","_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","BooleanValue","configVirtualRefinerNames","getSortedVirtualRefinerConfig","params","removeKeywords","path","categoryIdToken","recordId","removedCategorySlug","_slug","finalRefinerParts","flatten","RefineMenuContainer","RefinerSectionContainer","_refineItemCommonProps","_onUpdateRefiners","_buildRefinerUrl","_getRefinerLimitToDisplay","refinerLabel","mfrmRefinerLabel","selectedRefiners","choiceSummaryLabel","_onChoiceClicked","_buildRefinerUrlForChoiceSummary","_customBuildRefinerUrlForChoiceSummary","notification","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","_updateViewport","pending","scrollHeightPrevValue","totalSkipProductsValue","allVirtualRefiners","showProductsLoader","itemsPerPageInitialState","virtualRefiners","minusVirtualRefiner","validationErrorNotNumber","validationErrorNotRange","getTelemetryObject","friendlyName","featureProduct","listPageStateFeature","nameTranslations","nameTranslation","Language","Text","extensionProperties","redirectUrl","querySorting","sorting","parse","reaction","getCollectionProducts","productResults","enableAffiliationBasedPricing","user","isAuthenticated","update","sizeRefinerObjArr","virtualRefinersArr","refinerStrName","virtualRefinerObjArr","virtualRefiner","currentSortedOption","componentDidUpdate","prevProps","onpopstate","reload","menusData","productCollection","searchProduct","errorText","resultCategoryNotFoundText","resultSearchNotFoundText","featureComponent","selectedFiltersCount","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","_categorySeoCopy","categorySEOTitle","categorySEODescription","seoState","description","getHtmlParserValue","_getSEOMetaTags","isActiveRefiner","categoryPageKeywords","_getSEOMetaTagValue","content","name","keyValue","_renderProductSearchResultItems","breadCrumbType","breadcrumbType","newProducts","showLoader","productImpressionListName","_renderImageLoader","InfiniteScroll","dataLength","hasMore","scrollThreshold","loader","showBannerPosition","showBVRatings","createSearchResultModal","modalProps","refinerLoader","createModalBody","renderSort","renderRefiner","isRefinerLoading","totalSkeletonItems","banner","CustomSkeleton","type","skeletonItemsBeforeBanner","Array","fill","skeletonItemsAfterBanner","_","idx","Node","submenu","renderCategoryHierarchy","renderTitle","titleProps","extProperties","fallBackQueryResult","originalBackQueryResult","renderErrorMessage","categoryPage","collectionText","nsrText","mfrmSearchText","noResultsText","mfrmNoResultsText","dangerouslySetInnerHTML","getRichTextHtml","searchTips","mfrmProducts","tagsArr","Module","HtmlHeadInclude","MFRMErrorMessage","nsrpNeedAssistance","nsrpContainer","getValidCSSInput","parsedInput","parseFloat","unit","match","width","height","circle","rest","borderRadius","shippingInformation","computeItemLines","lowestPriceVariantRecordId","productDeliveryMessage","deliveryDays","leadTime","brandList","singleBrand","brandLeadtime","_parseValue","productRating","renderLabel","rating","getRatingAriaLabel","roundedRating","toFixed","renderRating","totalRatings","numRatings","renderPrice","basePrice","adjustedPrice","savingsText","PriceComponent","productCardimageSettings","fallbackImageUrl","fallBackImage","emptyPlaceHolderImage","fallbackImageSource","image","cropFocalRegion","bypassHideOnFailure","renderProductBadge","attributeName","attributes","badgeData","currAttribute","finalizedBadges","badge","parseBadgeData","parsedBadge","buildProductBadge","msdyn365Commerce","component","quickViewButton","displayShopNow","shopNowBtnText","enableAttributeBasedRating","getEyebrowElementRef","eyebrowElement","querySelector","isTruncated","setTruncated","scrollHeight","visibleHeight","clientHeight","badgeAttributeToUse","isBVratings","averageRating","AverageRating","TotalRatings","handleResize","EcomLowestPriceVariantRecIdKey","unbxdDefaultVariant","queryBasedSelection","placeholderImageName","defaultOrLowestVariantRecordId","srcUrl","baseUrl","queryString","updateProductUrl","variantIdQueryParams","sizeValue","stringValue","stopConvert","txt","charAt","substr","isCustomizedDesign","parseBrandName","productTitleWithBrandname","cultureFormatter","formatCurrency","priceComponent","isSearchResultContainer","setProductUrl","BVRatingSummary","DeliveryMessage","FinancingPerMonthComponent","sellingPrice","activeVariantId","activeColorVariantId","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":""}