{"version":3,"file":"static/js/60cb619d6e788cc76c94.bundle.js","mappings":"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","sources":["webpack://mattressfirm/./src/Utilities/emtpyChecker.ts?e2f5","webpack://mattressfirm/./src/Utilities/get-product-brand.tsx?2b65","webpack://mattressfirm/./src/Utilities/plp-url-utils.ts?728b","webpack://mattressfirm/./src/actions/srp-breadcrumb-page.action.ts?4397","webpack://mattressfirm/./src/data-actions/get-attributes-for-selected-variant.ts?4859","webpack://mattressfirm/./src/modules/mfrm-breadcrumb/components/link.tsx?b62c","webpack://mattressfirm/./src/modules/mfrm-breadcrumb/components/separator.tsx?9fd2","webpack://mattressfirm/./src/modules/mfrm-breadcrumb/mfrm-breadcrumb.tsx?3d25","webpack://mattressfirm/./src/modules/mfrm-breadcrumb/mfrm-breadcrumb.view.tsx?73ef","webpack://mattressfirm/./src/modules/mfrm-search-result-container/actions/base-collection-action.ts?d7f5","webpack://mattressfirm/./src/modules/mfrm-search-result-container/actions/get-product-refiner-hierarchy.ts?fe25","webpack://mattressfirm/./src/modules/mfrm-search-result-container/actions/get-refiners-for-collection.ts?0b98","webpack://mattressfirm/./src/modules/mfrm-search-result-container/actions/url-utils.ts?05d8","webpack://mattressfirm/./src/modules/mfrm-search-result-container/list-page-state.ts?a8cb","webpack://mattressfirm/./lib/mfrm-breadcrumb/module-registration.js?3b9a","webpack://mattressfirm/external var \"React\"?0d3b","webpack://mattressfirm/external var \"ReactDOM\"?853b"],"sourcesContent":["// tslint:disable\r\nexport const hasArray = (values: any): any[] | undefined => {\r\n return (typeof values !== 'string') && values && values.length ? values : undefined;\r\n};","import { IGridSettings, IImageSettings, Image } from '@msdyn365-commerce/core';\r\nimport { AttributeValue } from '@msdyn365-commerce/retail-proxy';\r\nimport React from 'react';\r\nimport { IBrandListData } from '../modules/mfrm-buybox/mfrm-buybox.view';\r\nimport { IProductBonusWithBrandName } from '../modules/mfrm-cart/mfrm-cart';\r\nimport {hasArray} from './emtpyChecker';\r\nimport MsDyn365 from '@msdyn365-commerce/core';\r\n\r\nconst fallBackBrandAttribute = 'VENDOR BRAND';\r\n\r\n// tslint:disable-next-line: cyclomatic-complexity\r\nexport const parseBrandData = (\r\n attributes: AttributeValue[] | undefined,\r\n backendAttribute: string,\r\n gridSettings: IGridSettings,\r\n renderBrandNameOnly: Boolean = false,\r\n brandList: IBrandListData[],\r\n imageSettings?: IImageSettings\r\n): JSX.Element | undefined => {\r\n const attribute = backendAttribute || fallBackBrandAttribute;\r\n const productBrandName =\r\n attributes &&\r\n attributes.find(currAttribute => currAttribute.Name && currAttribute.Name.toLowerCase().trim() === attribute.toLowerCase().trim())\r\n ?.TextValue;\r\n\r\n if (renderBrandNameOnly) {\r\n return {productBrandName};\r\n }\r\n\r\n const selectedBrand =\r\n (brandList &&\r\n productBrandName &&\r\n brandList.find(\r\n (brand: IBrandListData) => brand && brand.brandName.toLowerCase().trim() === productBrandName.toLowerCase().trim()\r\n )) ||\r\n undefined;\r\n\r\n if (!selectedBrand) {\r\n return undefined;\r\n }\r\n\r\n const copySelectedBrand: IBrandListData = selectedBrand;\r\n // set alt text to brand name if no alt text is configured\r\n if (copySelectedBrand && _useDefaultAltText(copySelectedBrand) && copySelectedBrand.brandLogo) {\r\n copySelectedBrand.brandLogo.altText = productBrandName;\r\n }\r\n\r\n // set height to configured value or the default\r\n const height = copySelectedBrand && copySelectedBrand.logoHeight !== undefined ? copySelectedBrand.logoHeight : 22;\r\n const brandImageSettings: IImageSettings = {\r\n viewports: {\r\n xs: { q: `w=0&h=25&m=6`, w: 0, h: 25 },\r\n lg: { q: `w=0&h=25&m=6`, w: 0, h: 25 },\r\n xl: { q: `w=0&h=25&m=6`, w: 0, h: 25 }\r\n },\r\n lazyload: false\r\n };\r\n\r\n const brandLogo = copySelectedBrand && copySelectedBrand.brandLogo && (\r\n \r\n );\r\n // place logo inside a link if configured to\r\n const brandLink =\r\n copySelectedBrand &&\r\n copySelectedBrand.brandLink &&\r\n copySelectedBrand.brandLink.linkUrl &&\r\n copySelectedBrand.brandLink.linkUrl.destinationUrl &&\r\n copySelectedBrand.brandLink;\r\n const linkElement = brandLink && (\r\n \r\n {brandLogo}\r\n \r\n );\r\n\r\n return linkElement || brandLogo;\r\n};\r\n// get only brandName\r\nexport const parseBrandName = (attributes: AttributeValue[] | undefined, backendAttribute: string, recordId?: number): string | undefined => {\r\n const attribute = backendAttribute || fallBackBrandAttribute;\r\n let productBrandName = hasArray(attributes)?.find((currAttribute: AttributeValue) => currAttribute?.Name?.toLowerCase().trim() === attribute?.toLowerCase().trim())?.TextValue;\r\n if (!productBrandName && MsDyn365.isBrowser) {\r\n const getLocalStorage = localStorage.getItem('bonusItmesWithBrand');\r\n let bonusItemArray: IProductBonusWithBrandName[] = [];\r\n if (getLocalStorage) {\r\n bonusItemArray = JSON.parse(getLocalStorage);\r\n }\r\n const checkBrandName = bonusItemArray.find(item => item.productId === recordId)?.brandName;\r\n if(checkBrandName) {\r\n productBrandName = checkBrandName;\r\n } else {\r\n return undefined;\r\n }\r\n }\r\n return productBrandName;\r\n};\r\n\r\nexport const parseBrandNameUnbxd = (attributes: any | undefined, backendAttribute: string, recordId?: number): string | undefined => {\r\n const attribute = backendAttribute || fallBackBrandAttribute;\r\n // let productBrandName = hasArray(attributes)?.find((currAttribute: AttributeValue) => currAttribute?.Name?.toLowerCase().trim() === attribute?.toLowerCase().trim())?.TextValue;\r\n // eslint-disable-next-line security/detect-object-injection\r\n let productBrandName = attributes && attributes[attribute];\r\n if (!productBrandName && MsDyn365.isBrowser) {\r\n const getLocalStorage = localStorage.getItem('bonusItmesWithBrand');\r\n let bonusItemArray: IProductBonusWithBrandName[] = [];\r\n if (getLocalStorage) {\r\n bonusItemArray = JSON.parse(getLocalStorage);\r\n }\r\n const checkBrandName = bonusItemArray.find(item => item.productId === recordId)?.brandName;\r\n if(checkBrandName) {\r\n productBrandName = checkBrandName;\r\n } else {\r\n return undefined;\r\n }\r\n }\r\n return productBrandName;\r\n};\r\n\r\n// get only brandName\r\nexport const getBrandNameCheck = (attributes: AttributeValue[] | undefined, backendAttribute: string): string | undefined => {\r\n const productBrandName =\r\n attributes &&\r\n attributes.find(\r\n currAttribute => currAttribute.Name && currAttribute.Name.toLowerCase().trim() === backendAttribute.toLowerCase().trim()\r\n )?.TextValue;\r\n if (!productBrandName) {\r\n return undefined;\r\n }\r\n return productBrandName;\r\n};\r\n\r\n// get the appropriate image alt text\r\nconst _useDefaultAltText = (selectedBrand: IBrandListData): boolean => {\r\n const configuredAltText = selectedBrand.brandLogo?.altText;\r\n return !(configuredAltText && configuredAltText.trim() && configuredAltText !== 'No Data Available');\r\n};\r\n","import { IProductRefinerHierarchy } from '@msdyn365-commerce/commerce-entities';\r\nimport { IRequestContext } from '@msdyn365-commerce/core';\r\nimport { ProductRefinerValue } from '@msdyn365-commerce/retail-proxy';\r\nexport interface IVirtualRefinersConfig {\r\n order: number;\r\n refinerName: string;\r\n enableForMattresses: boolean;\r\n enableForOtherCategories: boolean;\r\n allowDuplicate: boolean;\r\n}\r\n\r\n/**\r\n * This will create the canonicalURL as per 7924 requirement\r\n * @param requestContext\r\n * @returns string of canonical URL\r\n */\r\nexport const canonicalURL = (requestContext: IRequestContext): string => {\r\n const requestUrl = requestContext.url.requestUrl;\r\n const origin = requestUrl.origin;\r\n const path = requestUrl.pathname.toLowerCase();\r\n\r\n // separate out url parts split on forward / and remove first empty index\r\n let urlParts = path?.split('/').splice(1);\r\n\r\n // remove double values containing pipe sign\r\n if (path.match(/%7c/)) {\r\n urlParts = removePipeSignValue(urlParts);\r\n }\r\n\r\n // remove unwanted keywords from url\r\n urlParts = removeKeywords(urlParts, requestContext);\r\n\r\n const filteredPath = urlParts?.join('/');\r\n\r\n return `${origin}/${filteredPath}`;\r\n};\r\n\r\nexport const filteredURL = (requestContext: IRequestContext): string => {\r\n const requestUrl = requestContext.url.requestUrl;\r\n const path = requestUrl.pathname.toLowerCase();\r\n\r\n // separate out url parts split on forward / and remove first empty index\r\n let urlParts = path?.split('/').splice(1);\r\n\r\n // remove unwanted keywords from url\r\n urlParts = removeKeywords(urlParts, requestContext);\r\n\r\n const filteredPath = urlParts?.join('/');\r\n\r\n return `/${filteredPath}`;\r\n};\r\n\r\n/**\r\n * This will create the canonicalURL as per 7924 requirement\r\n * @param requestContext\r\n * @returns string of canonical URL\r\n */\r\nexport const canonicalURLWithoutBaseUrl = (requestContext: IRequestContext): string => {\r\n const requestUrl = requestContext.url.requestUrl;\r\n const path = requestUrl.pathname.toLowerCase();\r\n\r\n // separate out url parts split on forward / and remove first empty index\r\n let urlParts = path?.split('\\/').splice(1);\r\n\r\n // remove double values containing pipe sign\r\n if (path.match(/%7c/)) {\r\n urlParts = removePipeSignValue(urlParts);\r\n }\r\n\r\n // remove unwanted keywords from url\r\n urlParts = removeKeywords(urlParts, requestContext);\r\n\r\n return urlParts?.join('\\/');\r\n};\r\n\r\n/**\r\n * This will remove the Pipe sign value set from urlParts\r\n * @param urlParts\r\n * @returns\r\n */\r\nexport const removePipeSignValue = (urlParts: string[]) => {\r\n // urlParts.forEach((part, index) => {\r\n // const indexOfValue = urlParts.indexOf('%7c');\r\n // if (indexOfValue !== -1) {\r\n // urlParts.splice(indexOfValue, 1);\r\n // }\r\n // });\r\n\r\n if (urlParts !== undefined && urlParts.length > 0) {\r\n urlParts = urlParts.filter(urlPart => urlPart.indexOf('%7c') === -1);\r\n }\r\n\r\n return urlParts;\r\n};\r\n\r\n/**\r\n * This will remove the keywords from urlParts array which were received from\r\n * the app.settings.json/CMS Extensions\r\n * @param urlParts\r\n * @param requestContext\r\n * @returns urlParts array filtered\r\n */\r\nexport const removeKeywords = (urlParts: string[], requestContext: IRequestContext): string[] => {\r\n const removeKeywordFromUrl = requestContext.app.config.removeKeywordFromUrl;\r\n\r\n if (urlParts.length > 0 && removeKeywordFromUrl && removeKeywordFromUrl.length > 0) {\r\n const removeKeywordFromUrlArray: string[] = removeKeywordFromUrl?.trim().split(',');\r\n removeKeywordFromUrlArray?.length > 0 &&\r\n urlParts.forEach(_part => {\r\n removeKeywordFromUrlArray.forEach(removeKeyword => {\r\n const trimmedKeyword = removeKeyword.trim().toLowerCase();\r\n const indexOfValue = urlParts.indexOf(trimmedKeyword);\r\n if (trimmedKeyword.length > 0 && indexOfValue !== -1) {\r\n urlParts.splice(indexOfValue, 1);\r\n }\r\n });\r\n });\r\n }\r\n\r\n return urlParts;\r\n};\r\n\r\n/**\r\n * This will sort the Virtual refiner config based on order and return\r\n * only active virtual refiner configs based on isMattress category will\r\n * be returned\r\n * @param requestContext\r\n * @param isMattressesCategory boolean | undefined\r\n * @returns IVirtualRefinersConfig[] | undefined\r\n */\r\nexport const getSortedVirtualRefinerConfig = (\r\n requestContext: IRequestContext,\r\n isMattressesCategory: boolean | undefined\r\n): IVirtualRefinersConfig[] | undefined => {\r\n let appConfigSorted = getVirtualRefinerConfig(requestContext);\r\n\r\n // sort the config by provided config\r\n if (appConfigSorted) {\r\n if (isMattressesCategory === true) {\r\n appConfigSorted = appConfigSorted.filter(appConfig => {\r\n return appConfig.enableForMattresses;\r\n });\r\n } else if (isMattressesCategory === false) {\r\n appConfigSorted = appConfigSorted.filter(appConfig => {\r\n return appConfig.enableForOtherCategories;\r\n });\r\n }\r\n appConfigSorted.sort((a: IVirtualRefinersConfig, b: IVirtualRefinersConfig) => {\r\n return a.order - b.order;\r\n });\r\n }\r\n\r\n return appConfigSorted;\r\n};\r\n\r\n/**\r\n * Virtual refiner names from the app.settings.json will be returned which can be used\r\n * to filter out refiners data based upon active virtual refiners\r\n * @param requestContext\r\n * @param isMattressesCategory boolean | undefined\r\n * @returns string[]\r\n */\r\nexport const getVirtualRefinerNames = (requestContext: IRequestContext, isMattressesCategory: boolean | undefined): string[] => {\r\n const sortedVirtualRefinerConfig = getSortedVirtualRefinerConfig(requestContext, isMattressesCategory);\r\n\r\n const appConfigRefinerNames: string[] = [];\r\n\r\n sortedVirtualRefinerConfig &&\r\n sortedVirtualRefinerConfig.forEach(sortedConfig => {\r\n appConfigRefinerNames.push(sortedConfig.refinerName.trim().toLowerCase());\r\n });\r\n\r\n return appConfigRefinerNames;\r\n};\r\n\r\n/**\r\n * This will return the value of virtual refiner configuration\r\n * @param requestContext\r\n * @returns IVirtualRefinersConfig[] | undefined\r\n */\r\nexport const getVirtualRefinerConfig = (requestContext: IRequestContext): IVirtualRefinersConfig[] => {\r\n return requestContext.app.config.urlModifications;\r\n};\r\n\r\nexport async function getVirtualRefinerValues(\r\n requestContext: IRequestContext,\r\n virtualRefiners: IProductRefinerHierarchy[]\r\n): Promise {\r\n const virtualRefinerValues: ProductRefinerValue[] = [];\r\n if (virtualRefiners.length === 0) {\r\n return virtualRefinerValues;\r\n }\r\n const requestUrl = requestContext.url.requestUrl;\r\n // const origin = requestUrl.origin;\r\n const path = requestUrl.pathname;\r\n\r\n // separate out url parts split on forward / and remove first empty index\r\n let urlParts = path?.split('/').splice(1);\r\n\r\n // remove unwanted keywords from url\r\n urlParts = removeKeywords(urlParts, requestContext);\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 urlParts.splice(-1);\r\n }\r\n\r\n // run loop for each url part and get values from refiners for further usage\r\n const finalizedUrlParts: string[] = [];\r\n urlParts.forEach(plainUrlPart => {\r\n const urlPart = decodeURIComponent(plainUrlPart);\r\n if (urlPart.indexOf('|') !== -1) {\r\n const splitOnPipeSign = urlPart?.split('|');\r\n const filteredParts = splitOnPipeSign.filter(part => part.length > 0);\r\n filteredParts.forEach(filteredPart => {\r\n finalizedUrlParts.push(filteredPart.toLowerCase().trim());\r\n });\r\n }\r\n finalizedUrlParts.push(urlPart);\r\n });\r\n finalizedUrlParts.forEach((urlPart) => {\r\n virtualRefiners.forEach((mainRefiner) => {\r\n mainRefiner.Values.forEach((refinerValue) => {\r\n const refinerValueKeyName = refinerValue.LeftValueBoundString?.toLowerCase().trim().split(' ')?.join('-').replace(/\\&/g, 'and').replace(regExSpecialChars(requestContext.app.config.canonicalUrlspecialCharIncludeList), '-');\r\n if (refinerValueKeyName && refinerValueKeyName === urlPart) {\r\n virtualRefinerValues.push(refinerValue);\r\n }\r\n });\r\n });\r\n });\r\n\r\n return virtualRefinerValues;\r\n}\r\n\r\n/**\r\n * For navigation menu links, it will remove keywords configured in global configurations from the navigation link\r\n * and clp link and return url path string\r\n * @param link\r\n * @param requestContext\r\n * @returns string\r\n */\r\nexport const navLinkKeywordRemoval = (link: string, requestContext: IRequestContext): string => {\r\n // Using the rest operator in case there is a weirdly formatted URL with multiple question marks.\r\n const [linkBase, ...linkParams] = link?.split('?');\r\n\r\n // Only apply to category links and product links, which end in .c or .p. Check that a keyword is configured.\r\n if (!linkBase.endsWith('.c') && !linkBase.endsWith('.p') || !requestContext.app.config) {\r\n return link;\r\n }\r\n\r\n // Separate out url parts split on forward /\r\n let urlParts = linkBase?.split('\\/');\r\n\r\n // Remove unwanted keywords from url\r\n urlParts = removeKeywords(urlParts, requestContext);\r\n\r\n // Glue the URL params back together\r\n const linkParam = linkParams.map(param => `?${param}`)?.join('');\r\n\r\n // Rebuild URL by joining with forward slash and appending any URL parameters\r\n const filteredLink = `${urlParts?.join('/')}${linkParam}`;\r\n return `${filteredLink}`;\r\n};\r\nexport const regExSpecialChars = (includeConfigList: string): RegExp => {\r\n let includeConfig = '';\r\n if (includeConfigList !== undefined && includeConfigList !== '') {\r\n includeConfig = includeConfigList?.trim().split(',')?.join('\\\\\\\\');\r\n includeConfig = includeConfig && includeConfig !== '' ? `\\\\\\\\${includeConfig}` : '';\r\n const pattern = `[^\\\\w\\\\&\\\\|${includeConfig}]`;\r\n return new RegExp(pattern, 'gi');\r\n } else {\r\n\r\n const pattern = `[^\\\\w\\\\&\\\\|]`;\r\n return new RegExp(pattern, 'gi');\r\n }\r\n};\r\n","import * as Msdyn365 from '@msdyn365-commerce/core';\r\n\r\nexport interface ISRPBreadcrumbState {\r\n breadcrumbCheck: boolean;\r\n}\r\n\r\n/**\r\n * SrpBreadcrumbPage Input Action\r\n */\r\nexport class SrpBreadcrumbPageInput implements Msdyn365.IActionInput {\r\n // TODO: Construct the input needed to run the action\r\n // TODO: Determine if the results of this get action should cache the results and if so provide\r\n // a cache object type and an appropriate cache key\r\n public getCacheKey = () => `BreadcrumbSrp`;\r\n public getCacheObjectType = () => 'BreadcrumbSrp';\r\n public dataCacheType = (): Msdyn365.CacheType => 'application';\r\n}\r\n\r\n// TODO: Create a data model here or import one to capture the response of the action\r\nexport interface ISrpBreadcrumbPageData {\r\n text: string;\r\n}\r\n\r\n/**\r\n * TODO: Use this function to create the input required to make the action call\r\n */\r\nconst createInput = (args: Msdyn365.ICreateActionContext): Msdyn365.IActionInput => {\r\n return new SrpBreadcrumbPageInput();\r\n};\r\n\r\n/**\r\n * TODO: Use this function to call your action and process the results as needed\r\n */\r\nasync function action(input: SrpBreadcrumbPageInput, ctx: Msdyn365.IActionContext): Promise {\r\n // const apiSettings = Msdyn365.msdyn365Commerce.apiSettings;\r\n\r\n // TODO: Uncomment the below line to get the value from a service\r\n // const response = await Msdyn365.sendRequest('/get/example/id/1', 'get');\r\n return { breadcrumbCheck: false };\r\n}\r\n\r\nexport default Msdyn365.createObservableDataAction({\r\n action: >action,\r\n // TODO: Give your data action a unique id\r\n id: 'SrpBreadcrumbPage',\r\n input: createInput\r\n // TODO: Uncomment the below line if this is a meant to be a batched data action\r\n // isBatched: true\r\n});\r\n","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 { AttributeValue, SimpleProduct } from '@msdyn365-commerce/retail-proxy';\r\n\r\nimport { getSelectedProductIdFromActionInput, getSelectedVariant, SelectedVariantInput } from '@msdyn365-commerce-modules/retail-actions';\r\nimport { getAttributeValuesAsync } from '@msdyn365-commerce/retail-proxy/dist/DataActions/ProductsDataActions.g';\r\n\r\n/**\r\n * Chains getting the SelectedVariant with GetActivePrice\r\n */\r\nexport class AttributesForSelectedVariantInput implements IActionInput {\r\n public productId: number;\r\n public channelId: number;\r\n public catalogId: number;\r\n public selectedProduct: SimpleProduct | undefined;\r\n\r\n constructor(productId: number, channelId: number, selectedProduct?: SimpleProduct, catalogId?: number) {\r\n this.productId = productId;\r\n this.channelId = channelId;\r\n this.selectedProduct = selectedProduct;\r\n this.catalogId = catalogId || 0;\r\n }\r\n\r\n public getCacheKey = () => `AttributesForSelectedVariant`;\r\n public getCacheObjectType = () => 'ProductAttributeValue';\r\n public dataCacheType = (): CacheType => 'none';\r\n}\r\n\r\nexport const createAttributesForSelectedVariantInput = (\r\n inputData: ICreateActionContext>\r\n): AttributesForSelectedVariantInput => {\r\n const productId = getSelectedProductIdFromActionInput(inputData);\r\n if (productId) {\r\n return new AttributesForSelectedVariantInput(+productId, +inputData.requestContext.apiSettings.channelId);\r\n } else {\r\n throw new Error('Unable to create PriceForSelectedVariantInput, no productId found on module config or query');\r\n }\r\n};\r\n\r\n/**\r\n * Calls the Retail API a get a list of dimension values for a given product.\r\n */\r\nexport async function getAttributesForSelectedVariantAction(\r\n input: AttributesForSelectedVariantInput,\r\n ctx: IActionContext\r\n): Promise {\r\n // @ts-ignore: Promise vs. ObservablePromise typing conflict\r\n return Promise.resolve()\r\n .then(() => {\r\n const activeProduct: SimpleProduct | undefined = input.selectedProduct;\r\n\r\n if (!activeProduct) {\r\n const selectedVariantInput = new SelectedVariantInput(input.productId, input.channelId);\r\n\r\n return getSelectedVariant(selectedVariantInput, ctx);\r\n }\r\n\r\n return activeProduct;\r\n })\r\n .then((productResult: SimpleProduct | null) => {\r\n const activeProduct: SimpleProduct | undefined = productResult;\r\n\r\n if (activeProduct) {\r\n return getAttributeValuesAsync(\r\n { callerContext: ctx, queryResultSettings: {} },\r\n activeProduct.RecordId,\r\n input.channelId,\r\n input.catalogId\r\n );\r\n }\r\n\r\n return null;\r\n })\r\n .then((attributeValues: AttributeValue[] | null) => {\r\n const resultArray = attributeValues;\r\n if (resultArray) {\r\n return resultArray;\r\n }\r\n\r\n return [];\r\n })\r\n .catch((error: Error) => {\r\n ctx.trace(error.message);\r\n throw new Error(`[getPriceForSelectedVariantAction]Error executing action ${error.message}`);\r\n });\r\n}\r\n\r\nexport default createObservableDataAction({\r\n id: '@msdyn365-commerce-modules/product-info/get-attributes-for-selected-variant',\r\n action: >getAttributesForSelectedVariantAction,\r\n input: createAttributesForSelectedVariantInput\r\n});\r\n","/* eslint-disable no-duplicate-imports */\r\nimport { getPayloadObject, getTelemetryAttributes, ITelemetryContent, onTelemetryClick } from '@msdyn365-commerce-modules/utilities';\r\nimport * as React from 'react';\r\n\r\ninterface ILink {\r\n className?: string;\r\n text?: string;\r\n href?: string;\r\n ariaLabel?: string;\r\n index: string;\r\n noclick?: boolean;\r\n telemetryContent: ITelemetryContent;\r\n}\r\n\r\nexport const Link: React.FC = ({ text, className, href, ariaLabel, index, noclick, telemetryContent }) => {\r\n const payLoad = getPayloadObject('click', telemetryContent, '', '');\r\n\r\n const linkText = text !== undefined ? text : '';\r\n payLoad.contentAction.etext = linkText;\r\n // Construct telemetry attribute to render\r\n const attribute = getTelemetryAttributes(telemetryContent, payLoad);\r\n\r\n return (\r\n \r\n {linkText}\r\n \r\n \r\n );\r\n};\r\n","/* eslint-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","/*---------------------------------------------------------------------------------------------\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\n/* eslint-disable no-duplicate-imports */\r\nimport { getTelemetryObject, IModuleProps, INodeProps, ITelemetryContent, NodeTag } from '@msdyn365-commerce-modules/utilities';\r\nimport MsDyn365 from '@msdyn365-commerce/core';\r\nimport { ICategoryUrl } from '@msdyn365-commerce/core-internal/dist/types/interfaces/ICategoryPathInterfaces';\r\nimport classnames from 'classnames';\r\nimport * as React from 'react';\r\nimport { getVirtualRefinerNames, navLinkKeywordRemoval, regExSpecialChars, removeKeywords } from '../../Utilities/plp-url-utils';\r\nimport { Link } from './components/link';\r\nimport { Separator } from './components/separator';\r\nimport { IMfrmBreadcrumbData } from './mfrm-breadcrumb.data';\r\nimport { ILinksData, IMfrmBreadcrumbProps } from './mfrm-breadcrumb.props.autogenerated';\r\nimport { parseBrandName } from '../../Utilities/get-product-brand';\r\n\r\nexport interface IBreadcrumbViewProps extends IMfrmBreadcrumbProps {\r\n root?: React.ReactNode;\r\n links?: React.ReactNode[];\r\n backButton?: React.ReactNode;\r\n separator?: React.ReactNode;\r\n BreadcrumbContainer: IModuleProps;\r\n BreadcrumbList: INodeProps;\r\n BreadcrumbListItem: INodeProps;\r\n plpBreadcrumbSchema: string;\r\n pdpBreadcrumbSchema: string;\r\n\r\n}\r\ninterface ICategory {\r\n Name: string;\r\n Url: string;\r\n}\r\ninterface IConcatRefiners {\r\n concatRefinerCat: ICategory[];\r\n}\r\ninterface IUrlParts {\r\n realUrlParts: string[];\r\n refinerParts: string[];\r\n}\r\ninterface IBreadcrumbSchemaState {\r\n plpBreadcrumbSchema: string;\r\n}\r\n/**\r\n *\r\n * Breadcrumb component\r\n * @extends {React.PureComponent>}\r\n */\r\nclass Breadcrumb extends React.PureComponent, IConcatRefiners & IBreadcrumbSchemaState> {\r\n private _pageType: string | undefined = this.props.context.request.urlTokens.pageType;\r\n private telemetryContent: ITelemetryContent = getTelemetryObject(\r\n this.props.context.request.telemetryPageName!,\r\n this.props.friendlyName,\r\n this.props.telemetry\r\n );\r\n constructor(props: IMfrmBreadcrumbProps) {\r\n super(props);\r\n this.state = {\r\n concatRefinerCat: [],\r\n plpBreadcrumbSchema: ''\r\n };\r\n }\r\n public componentDidMount(): void {\r\n const categoryHierarchyTemp: ICategory[] = [];\r\n const { part, realUrlParts } = this._getUrlString();\r\n part &&\r\n part.split('/').forEach((st, index) => {\r\n const originalUrlPart = realUrlParts && realUrlParts[index];\r\n const url = this._getUrl(originalUrlPart);\r\n const refinerCat: ICategory = {\r\n Name: this._trimSpacesAndCapitalize(st.split('$$').join('/')),\r\n Url: url\r\n };\r\n categoryHierarchyTemp.push(refinerCat);\r\n });\r\n this.setState({ concatRefinerCat: categoryHierarchyTemp });\r\n }\r\n public componentDidUpdate(): void {\r\n const itemPosition = this._getRootLink() ? 1 : 0;\r\n const schema = this._makePlpBreadcrumbSchema(itemPosition);\r\n if (schema) {\r\n this.setState({\r\n plpBreadcrumbSchema: schema\r\n });\r\n }\r\n }\r\n public render(): JSX.Element | null {\r\n const { className } = this.props.config;\r\n let rootLink = null;\r\n let breadcrumbLinks = null;\r\n let backButtonComponent = null;\r\n rootLink = this._getRootLink();\r\n const itemPosition = rootLink ? 1 : 0;\r\n if (this._pageType === 'Category') {\r\n breadcrumbLinks = this._getCustomBreadcrumbLinks(itemPosition);\r\n if (!breadcrumbLinks) {\r\n breadcrumbLinks = this._getCategoryHierarchy(itemPosition);\r\n }\r\n } else if (this._pageType === 'Product') {\r\n breadcrumbLinks = this._getCustomBreadcrumbLinks(itemPosition);\r\n if (!breadcrumbLinks) {\r\n const breaCrumbType = this.props.context.app.config.breadcrumbType;\r\n if (breaCrumbType === 'category') {\r\n breadcrumbLinks = this._getPDPLinks(itemPosition);\r\n }\r\n if (breaCrumbType === 'categoryAndBack') {\r\n backButtonComponent = this._getPDPBackButton();\r\n breadcrumbLinks = this._getPDPLinks(itemPosition);\r\n }\r\n if (breaCrumbType === 'back') {\r\n backButtonComponent = this._getPDPBackButton();\r\n if (backButtonComponent === null) {\r\n breadcrumbLinks = this._getPDPLinks(itemPosition);\r\n }\r\n }\r\n }\r\n } else {\r\n breadcrumbLinks = this._getCustomBreadcrumbLinks(itemPosition);\r\n }\r\n const linkSeparator = ;\r\n const breadcrumbViewProps = {\r\n ...this.props,\r\n BreadcrumbContainer: {\r\n moduleProps: this.props,\r\n className: classnames('ms-breadcrumb', className),\r\n tag: 'nav',\r\n role: 'navigation'\r\n },\r\n BreadcrumbList: {\r\n tag: 'ol' as NodeTag,\r\n className: 'ms-breadcrumb_list'\r\n },\r\n BreadcrumbListItem: {\r\n tag: 'li',\r\n className: 'ms-breadcrumb_item'\r\n },\r\n root: rootLink,\r\n links: breadcrumbLinks,\r\n backButton: backButtonComponent,\r\n separator: linkSeparator,\r\n plpBreadcrumbSchema: this.state.plpBreadcrumbSchema ? this.state.plpBreadcrumbSchema : null,\r\n pdpBreadcrumbSchema: this._makePdpBreadcrumbSchema(itemPosition)\r\n\r\n };\r\n return this.props.renderView(breadcrumbViewProps) as React.ReactElement;\r\n }\r\n private _getRootLink = (): JSX.Element | null => {\r\n const { root } = this.props.config;\r\n if (!root || !root.linkUrl || !root.linkUrl.destinationUrl) {\r\n this.props.context.telemetry.error('BreadCrumb link url content is empty, link wont render');\r\n return null;\r\n }\r\n return (\r\n \r\n );\r\n };\r\n\r\n private _makePlpBreadcrumbSchema(itemPosition: number): string | null {\r\n const homeUrl = this.props.context.request.url.requestUrl.origin;\r\n const { root } = this.props.config;\r\n const plpLinks = this._getCategoryHierarchy(itemPosition);\r\n let position = 1;\r\n const breadcrumbData = {\r\n \"@context\": \"https://schema.org\",\r\n \"@type\": \"BreadcrumbList\",\r\n \"itemListElement\": [{\r\n \"@type\": \"ListItem\",\r\n \"position\": position++,\r\n \"item\": {\r\n \"id\": homeUrl,\r\n \"name\": root?.linkText\r\n }\r\n }]\r\n };\r\n if (this._pageType === 'Category') {\r\n plpLinks?.map(plpLink => {\r\n const breadcrumbUrl = homeUrl.concat(plpLink.props.href);\r\n const modifiedBreadcrumbUrl = this.modifyBreadcrumbUrl(breadcrumbUrl);\r\n breadcrumbData.itemListElement.push({\r\n \"@type\": \"ListItem\",\r\n \"position\": position++,\r\n \"item\": {\r\n \"id\": modifiedBreadcrumbUrl,\r\n \"name\": plpLink.props.text\r\n }\r\n });\r\n });\r\n }\r\n else {\r\n const searchQueryValue = this.props.context.request.query?.q;\r\n breadcrumbData.itemListElement.push({\r\n \"@type\": \"ListItem\",\r\n \"position\": position++,\r\n \"item\": {\r\n \"id\": `${homeUrl}/${searchQueryValue}`,\r\n \"name\": searchQueryValue && this._trimSpacesAndCapitalize(searchQueryValue)\r\n }\r\n });\r\n }\r\n // Construct the JSON-LD data that contains the product metadata information used by search enginge crawlers\r\n const plpBreadcrumbSchemaData = JSON.stringify(breadcrumbData);\r\n return plpBreadcrumbSchemaData;\r\n }\r\n private _makePdpBreadcrumbSchema(itemPosition: number): string | null {\r\n const homeUrl = this.props.context.request.url.requestUrl.origin;\r\n const { root } = this.props.config;\r\n const pdpLinks = this._getPDPLinks(itemPosition);\r\n const breadcrumbLinks = this._getCustomBreadcrumbLinks(itemPosition);\r\n let position = 1;\r\n const breadcrumbData = {\r\n \"@context\": \"https://schema.org\",\r\n \"@type\": \"BreadcrumbList\",\r\n \"itemListElement\": [{\r\n \"@type\": \"ListItem\",\r\n \"position\": position++,\r\n \"item\": {\r\n \"id\": homeUrl,\r\n \"name\": root?.linkText\r\n }\r\n }]\r\n };\r\n if (this._pageType === 'Product') {\r\n pdpLinks?.map(pdpLink => {\r\n const pdpBreadcrumbUrl = pdpLink.props.href.includes(homeUrl) ? pdpLink.props.href : homeUrl.concat(pdpLink.props.href);\r\n const modifiedBreadcrumbUrl = this.modifyBreadcrumbUrl(pdpBreadcrumbUrl);\r\n breadcrumbData.itemListElement.push({\r\n \"@type\": \"ListItem\",\r\n \"position\": position++,\r\n \"item\": {\r\n \"id\": modifiedBreadcrumbUrl,\r\n \"name\": pdpLink.props.text\r\n }\r\n });\r\n });\r\n }\r\n else {\r\n breadcrumbLinks?.map(breadcrumbLink => {\r\n breadcrumbData.itemListElement.push({\r\n \"@type\": \"ListItem\",\r\n \"position\": position++,\r\n \"item\": {\r\n \"id\": breadcrumbLink.props.href,\r\n \"name\": breadcrumbLink.props.text\r\n }\r\n });\r\n });\r\n }\r\n // Construct the JSON-LD data that contains the product metadata information used by search enginge crawlers\r\n const pdpBreadcrumbSchemaData = JSON.stringify(breadcrumbData);\r\n return pdpBreadcrumbSchemaData;\r\n }\r\n private modifyBreadcrumbUrl = (url: string): string => {\r\n const urlParts = url.split('\\/');\r\n urlParts.pop();\r\n const newUrl = urlParts?.join('\\/');\r\n return newUrl;\r\n };\r\n private _getCustomBreadcrumbLinks = (itemPosition: number): JSX.Element[] | null => {\r\n const { links } = this.props.config;\r\n\r\n if (!links || !(links.length > 0)) {\r\n this.props.context.telemetry.error('BreadCrumb links content is empty, links wont render');\r\n return null;\r\n }\r\n return links.map((value: ILinksData, index: number) => {\r\n itemPosition++;\r\n return (\r\n \r\n );\r\n });\r\n };\r\n private _makeRealUrlParts = (decodedArr: string[] | false | ''): IUrlParts => {\r\n let refinerParts: string[] = [];\r\n let realUrl = '';\r\n const realUrlParts: string[] = [];\r\n decodedArr &&\r\n decodedArr.forEach((part, index) => {\r\n switch (index) {\r\n case 0:\r\n realUrl = part;\r\n break;\r\n case 1:\r\n realUrl = `${part}`;\r\n break;\r\n case 2:\r\n realUrl = `${part}`;\r\n break;\r\n default:\r\n realUrl = '';\r\n }\r\n realUrlParts.push(realUrl);\r\n if (part.includes('|')) {\r\n refinerParts = [...refinerParts, ...part.split('|')];\r\n } else {\r\n refinerParts = [...refinerParts, part];\r\n }\r\n });\r\n return { realUrlParts, refinerParts };\r\n };\r\n private _getUrlString = (): { part: string; realUrlParts: string[] } => {\r\n const { data, context } = this.props;\r\n const requestContext = context && context.request;\r\n const categoryIdToken = requestContext.urlTokens.recordId;\r\n const categoryId = categoryIdToken ? `${categoryIdToken}.c` : undefined;\r\n let slug = (data.category.result && data.category.result.Slug) || '/search';\r\n let slugArray = slug.split('/').splice(1);\r\n // remove keywords form slugArray\r\n slugArray = removeKeywords(slugArray, context.request);\r\n // FIX reset slug to without keywords\r\n slug = slugArray.join('/');\r\n const params = MsDyn365.isBrowser && window.location;\r\n const refinersString = params && params.pathname.replace(`/${slug}/`, '').replace(`/${categoryId}`, '');\r\n const decodedArr = refinersString && decodeURIComponent(refinersString).split('/');\r\n const { realUrlParts, refinerParts } = this._makeRealUrlParts(decodedArr);\r\n const configVirtualRefinerNames = getVirtualRefinerNames(this.props.context.request, true);\r\n const filteredRefiners =\r\n data.refiners.result &&\r\n data.refiners.result.filter(refiner => {\r\n return refiner.KeyName && configVirtualRefinerNames.indexOf(refiner.KeyName.toLowerCase()) !== -1;\r\n });\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 &&\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.split('/').join('$$'));\r\n } else if (refinerName && refiner.LeftValueBoundString &&\r\n refiner.LeftValueBoundString.toLowerCase() === refinerPart.toLowerCase().split('-').join(' ')) {\r\n sortedValues[refinerName].push(refiner.LeftValueBoundString.split('/').join('$$'));\r\n }\r\n });\r\n });\r\n });\r\n\r\n // sort by configuration\r\n\r\n let str = '';\r\n let strNext = '';\r\n let breakAll = true;\r\n const virtualRefiners = [...configVirtualRefinerNames];\r\n configVirtualRefinerNames.forEach(item => {\r\n if (!sortedValues[item] || sortedValues[item]?.length < 1) {\r\n delete sortedValues[item];\r\n virtualRefiners.splice(virtualRefiners.indexOf(item), 1);\r\n }\r\n });\r\n\r\n virtualRefiners.every(item => {\r\n const sortedRefiners = sortedValues;\r\n const refiner = item;\r\n sortedRefiners[refiner]?.length < 1 ? delete sortedRefiners[refiner] : null;\r\n if (sortedRefiners[refiner]?.length < 2 && breakAll) {\r\n if (refiner === virtualRefiners[0] && sortedRefiners[refiner]?.length === 1) {\r\n str = `${sortedRefiners[refiner]}`;\r\n }\r\n if (refiner === virtualRefiners[1] && sortedRefiners[refiner]?.length === 1) {\r\n strNext = `${sortedRefiners[virtualRefiners[0]] ? `/ ${sortedRefiners[refiner]}` : `${sortedRefiners[refiner]}`}`;\r\n if (sortedRefiners[virtualRefiners[2]]?.length !== 1) {\r\n str = !sortedRefiners[virtualRefiners[0]] ? `${sortedRefiners[refiner]}` : `${str} / ${sortedRefiners[refiner]}`;\r\n }\r\n }\r\n if (refiner === virtualRefiners[2] && sortedRefiners[refiner]?.length === 1) {\r\n str =\r\n str || strNext\r\n ? `${str} ${sortedRefiners[virtualRefiners[1]] ? strNext : '/'} ${sortedRefiners[virtualRefiners[2]] ? `/ ${sortedRefiners[refiner]}` : str\r\n }`\r\n : `${sortedRefiners[refiner]}`;\r\n }\r\n return true;\r\n } else {\r\n breakAll = false;\r\n return false;\r\n }\r\n });\r\n return { part: str, realUrlParts };\r\n };\r\n\r\n private _getUrl = (originalUrlPart: string): string => {\r\n const { data, context } = this.props;\r\n const requestContext = context && context.request;\r\n const categoryIdToken = requestContext.urlTokens.recordId;\r\n const categoryId = categoryIdToken ? `${categoryIdToken}.c` : undefined;\r\n let slug = (data.category.result && data.category.result.Slug) || '/search';\r\n let slugArray = slug.split('/').splice(1);\r\n // remove keywords form slugArray\r\n slugArray = removeKeywords(slugArray, context.request);\r\n // FIX reset slug to without keywords\r\n slug = slugArray.join('/');\r\n const params = MsDyn365.isBrowser && window.location;\r\n return `/${slug}/${originalUrlPart}${categoryId ? `/${categoryId}` : ''}${params && params.search ? params.search : ''}`;\r\n };\r\n private _trimSpacesAndCapitalize = (st: string): string => {\r\n return st\r\n .trimStart()\r\n .trimEnd()\r\n .replace(/(^\\w{1})|(\\s{1}\\w{1})/g, match => match.toUpperCase());\r\n };\r\n private _getCategoryHierarchy = (itemPosition: number): JSX.Element[] | null => {\r\n const { data } = this.props;\r\n const categoryHierarchy = data.categoryHierarchy.result && [...data.categoryHierarchy.result];\r\n if (!categoryHierarchy) {\r\n this.props.context.telemetry.error('Category Hierarchy content is empty, module wont render');\r\n return null;\r\n }\r\n const categoryHierarchyTemp: ICategory[] = [];\r\n categoryHierarchy.map(category => {\r\n const cat: ICategory = {\r\n Name: category.Name!,\r\n Url: category.Url!\r\n };\r\n categoryHierarchyTemp.push(cat);\r\n });\r\n this.state.concatRefinerCat.length &&\r\n this.state.concatRefinerCat.map((item: ICategory) => {\r\n categoryHierarchyTemp.push(item);\r\n });\r\n return categoryHierarchyTemp\r\n ? categoryHierarchyTemp.map((value: ICategory, index: number) => {\r\n itemPosition++;\r\n return (\r\n \r\n );\r\n })\r\n : null;\r\n };\r\n\r\n // This is used in _getCategoryHierarchy OOB to support translations. TODO: decide if we want to implement.\r\n\r\n // private readonly _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 // // If friendly name for current locale is null, should use default locale.\r\n // if (nameTranslation === undefined && ArrayExtensions.hasElements(nameTranslations)) {\r\n // nameTranslation = nameTranslations[0];\r\n // }\r\n\r\n // return nameTranslation?.Text;\r\n // };\r\n\r\n private _getPDPLinks = (itemPosition: number): JSX.Element[] | null => {\r\n const url = this.props.context.request.url.requestUrl.href;\r\n const {\r\n config: { hideProductName },\r\n data: {\r\n product: { result: product },\r\n productSpecificationData: { result: productSpecificationData },\r\n categoryPaths: { result: categoryHierarchy }\r\n\r\n },\r\n app: { config: { brandBackofficeAttributePdp } }\r\n } = this.props;\r\n const brandName = parseBrandName(productSpecificationData, brandBackofficeAttributePdp) || '';\r\n if (!categoryHierarchy) {\r\n this.props.context.telemetry.error('Category path content is empty for the product');\r\n return null;\r\n }\r\n const links: JSX.Element[] = [];\r\n\r\n categoryHierarchy.map((value: ICategoryUrl, index: number) => {\r\n itemPosition++;\r\n links.push(\r\n \r\n );\r\n });\r\n if (product && !hideProductName) {\r\n itemPosition++;\r\n links.push(\r\n \r\n );\r\n }\r\n return links;\r\n };\r\n\r\n private _goBack = (): void => {\r\n if (MsDyn365.isBrowser) {\r\n window.history.back();\r\n }\r\n };\r\n\r\n private _getPDPBackButton = (): JSX.Element | null => {\r\n const isBackAllowed =\r\n this.props.context && this.props.context.request && this.props.context.request.query && this.props.context.request.query.back;\r\n if (!isBackAllowed) {\r\n return null;\r\n }\r\n if (MsDyn365.isBrowser && (document.referrer === '' || window.history.length < 2)) {\r\n return null;\r\n }\r\n return (\r\n \r\n {this.props.resources.backToResultsText}\r\n \r\n );\r\n };\r\n}\r\n\r\nexport default Breadcrumb;\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\n/* eslint-disable no-duplicate-imports */\r\nimport { Module, Node } from '@msdyn365-commerce-modules/utilities';\r\nimport MsDyn365 from '@msdyn365-commerce/core';\r\nimport { HtmlHeadInclude } from '@msdyn365-commerce/core-internal';\r\nimport classnames from 'classnames';\r\nimport * as React from 'react';\r\nimport { IBreadcrumbViewProps } from './mfrm-breadcrumb';\r\n\r\n// tslint:disable-next-line: cyclomatic-complexity\r\nconst MfrmBreadCrumbView: React.FC = props => {\r\n const { root, links, backButton, BreadcrumbContainer, BreadcrumbList, BreadcrumbListItem, separator,plpBreadcrumbSchema,pdpBreadcrumbSchema } = props;\r\n // VSI Customization - start\r\n // Todo\r\n // To remove channel navigation hirarchy parent node i.e. All, which might be updated later on\r\n const levelToHide = 1;\r\n let showBreadCrumb: boolean = false;\r\n const pageType = props.data.listPageState?.result?.pageType;\r\n const searchQueryValue = props.context.request.query?.q;\r\n const mfrmLinks = links?.length && props.config.hideParentCatagory ? links?.splice(levelToHide, links.length) : links;\r\n const pageURL = MsDyn365.isBrowser && window.location.pathname;\r\n const activeProducts = props.data.listPageState?.result?.activeProducts;\r\n const extProperties = activeProducts && activeProducts.length > 0 && activeProducts[0]?.ExtensionProperties || [];\r\n const fallBackQueryResult = extProperties?.find(obj => obj?.Key === 'FallbackQuery')?.Value?.StringValue;\r\n const [isSchemaUpdated,setIsSchemaUpdated]=React.useState(false);\r\n const getHREF = (event: React.MouseEvent) => {\r\n event.preventDefault();\r\n const targetElm = event.target as Element;\r\n const parentHREF = targetElm?.closest('a')?.getAttribute('href'); // get clicked items parent href\r\n const redirectURL = parentHREF; // set redirect url after tagging even\r\n // @ts-ignore\r\n if (utag && redirectURL !== undefined) {\r\n event.preventDefault();\r\n // @ts-ignore\r\n // tslint:disable-next-line: object-literal-key-quotes\r\n utag.link({\r\n event: 'internal navigation',\r\n event_category: 'internal links',\r\n event_action: `to: ${redirectURL}`,\r\n event_label: `from: ${pageURL}`,\r\n event_noninteraction: 'false'\r\n });\r\n if (MsDyn365.isBrowser && redirectURL) {\r\n window.location.href = redirectURL;\r\n }\r\n }\r\n };\r\n if (pageType === 'Search' && props.data.updateBreadcrumbOnSrp.result?.breadcrumbCheck) {\r\n showBreadCrumb = true;\r\n } else if (pageType === 'Search' && !props.data.updateBreadcrumbOnSrp.result?.breadcrumbCheck) {\r\n showBreadCrumb = false;\r\n }\r\n // VSI Customization - ends\r\n if (!root && !links && !backButton) {\r\n props.context.telemetry.warning('BreadCrumb content is empty, module wont render');\r\n return null;\r\n }\r\n const _renderPlpBreadcrumbSchema =()=> {\r\n if (plpBreadcrumbSchema) {\r\n const inlineScripts = document.createElement('script');\r\n inlineScripts .setAttribute('type', 'application/ld+json');\r\n inlineScripts.text = plpBreadcrumbSchema;\r\n const head = document.head;\r\n head.insertBefore(inlineScripts, head.firstElementChild);\r\n }\r\n };\r\n\r\n React.useEffect(() => {\r\n if(plpBreadcrumbSchema){\r\n setIsSchemaUpdated(true);\r\n }\r\n } ,[plpBreadcrumbSchema]);\r\n return (\r\n \r\n {isSchemaUpdated && (pageType ==='Category' || pageType ==='Search') && _renderPlpBreadcrumbSchema() }\r\n {props.context.request.urlTokens.pageType === 'Product' &&\r\n \r\n {/* tslint:disable:react-no-dangerous-html - intentionally setting inner html with only data action output (no unsanizted user input)*/}\r\n \r\n }\r\n \r\n {root && pageType !== 'Search' && (\r\n \r\n {root}\r\n {links && separator}\r\n \r\n )}\r\n {root && pageType === 'Search' && !showBreadCrumb && (\r\n \r\n {root}\r\n {separator}\r\n {props.resources.breadcrumbShowingResultQuery} {fallBackQueryResult !== '' ? ‘‘{fallBackQueryResult}’’ : ‘‘{searchQueryValue}’’}\r\n \r\n )}\r\n {backButton && {backButton}}\r\n {/* VSI Customization -start */}\r\n {mfrmLinks &&\r\n mfrmLinks.map((link, index) => (\r\n \r\n \r\n {link}\r\n {mfrmLinks[index + 1] && separator}\r\n \r\n \r\n ))}\r\n {/* VSI Customization - ends */}\r\n \r\n \r\n );\r\n};\r\n\r\nexport default MfrmBreadCrumbView;\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 { buildCacheKey, QueryResultSettingsProxy } from '@msdyn365-commerce-modules/retail-actions';\r\nimport {\r\n CacheType,\r\n IActionInput,\r\n IAny,\r\n getCatalogId,\r\n ICommerceApiSettings,\r\n ICreateActionContext,\r\n IGeneric\r\n} from '@msdyn365-commerce/core';\r\n/* tslint:disable: no-duplicate-imports */\r\nimport { convertToString, IQueryResultSettings, ProductRefinerValue, SortColumn } from '@msdyn365-commerce/retail-proxy';\r\nimport { toJS } from 'mobx';\r\nimport { hydrateRefinersFromUrl } from './url-utils';\r\n\r\nexport type listPageType = 'Category' | 'Search' | 'Unknown';\r\n\r\n/**\r\n * Get include attributes from config.\r\n */\r\nfunction getIncludeAttributes(inputData: ICreateActionContext, IGeneric>): boolean {\r\n if (inputData &&\r\n inputData.config &&\r\n inputData.config.includeAttributes !== undefined &&\r\n inputData.config.includeAttributes === true) {\r\n return true;\r\n }\r\n return false;\r\n}\r\n/**\r\n * Get updateRefinerPanel from config.\r\n * @param inputData - ICreateActionContext.\r\n * @returns Boolean.\r\n */\r\nfunction getUpdateRefinerPanel(inputData: ICreateActionContext, IGeneric>): boolean {\r\n return !!inputData.config?.updateRefinerPanel;\r\n}\r\n/**\r\n * BaseCollection Action Input\r\n */\r\nexport class BaseCollectionInput implements IActionInput {\r\n public pageType: listPageType;\r\n public category: number | undefined;\r\n public searchText: string | undefined;\r\n public refiners: ProductRefinerValue[];\r\n public queryResultSettings: IQueryResultSettings;\r\n public apiSettings: ICommerceApiSettings;\r\n public includeAttributes: boolean | undefined;\r\n public locale?: string;\r\n // VSI Customization 7924 Start\r\n public urlPathName?: string;\r\n // VSI Customization 7924 End\r\n public isSizeRefinerAndCategory?: boolean | undefined;\r\n public isUpdateRefinerPanel?: boolean | undefined;\r\n public catalogId?: number | undefined;\r\n constructor(\r\n pageType: listPageType,\r\n apiSettings: ICommerceApiSettings,\r\n queryResultSettings: IQueryResultSettings,\r\n refiners: ProductRefinerValue[],\r\n category: number | undefined,\r\n searchText: string | undefined,\r\n includeAttributes: boolean | undefined,\r\n locale?: string,\r\n // VSI Customization 7924 Start\r\n urlPathName?: string,\r\n // VSI Customization 7924 End\r\n isSizeRefinerAndCategory?: boolean | undefined,\r\n isUpdateRefinerPanel?: boolean | undefined,\r\n catalogId?: number | undefined\r\n ) {\r\n this.pageType = pageType;\r\n this.apiSettings = apiSettings;\r\n this.category = category;\r\n this.searchText = searchText;\r\n this.queryResultSettings = queryResultSettings;\r\n this.refiners = refiners;\r\n this.includeAttributes = includeAttributes;\r\n this.locale = locale;\r\n // VSI Customization 7924 Start\r\n this.urlPathName = urlPathName;\r\n // VSI Customization 7924 End\r\n this.isSizeRefinerAndCategory = isSizeRefinerAndCategory;\r\n this.isUpdateRefinerPanel = isUpdateRefinerPanel;\r\n this.catalogId = catalogId ?? 0;\r\n if (this.refiners && this.refiners.length > 0) {\r\n this.refiners[0].ExtensionProperties = [\r\n {\r\n Key: 'ISREQUESTOVERRIDE',\r\n Value: {\r\n BooleanValue: (!isSizeRefinerAndCategory || isSizeRefinerAndCategory === undefined ? false : true),\r\n ByteValue: undefined,\r\n DateTimeOffsetValue: undefined,\r\n DecimalValue: undefined,\r\n IntegerValue: undefined,\r\n LongValue: undefined,\r\n StringValue: undefined\r\n }\r\n }\r\n ];\r\n }\r\n }\r\n public getCacheKey = () => {\r\n const queryResultSettings = {\r\n ...this.queryResultSettings.Paging,\r\n ...toJS(this.queryResultSettings.Sorting)\r\n };\r\n\r\n return buildCacheKey(\r\n `${this.pageType}-${this.locale}-${this.category || this.searchText}-${this.refiners.map(refiner => `${refiner.RefinerRecordId}${refiner.LeftValueBoundString || ''}${refiner.RightValueBoundString || ''}-`)}-${convertToString(queryResultSettings)}-${this.urlPathName}`,\r\n this.apiSettings, this.locale\r\n );\r\n };\r\n\r\n public getCacheObjectType = () => 'CollectionActionResult';\r\n public dataCacheType = (): CacheType => 'application';\r\n}\r\n\r\n\r\n// TODO: Create a data model here or import one to capture the response of the action\r\nexport interface IGetFullProductsByCollectionData {\r\n text: string;\r\n}\r\n\r\nexport type CollectionClassConstructor = new (\r\n pageType: listPageType,\r\n apiSettings: ICommerceApiSettings,\r\n queryResultSettings: IQueryResultSettings,\r\n refiners: ProductRefinerValue[],\r\n category: number | undefined,\r\n searchText: string | undefined,\r\n includeAttributes: boolean | undefined,\r\n locale?: string,\r\n // VSI Customization 7924 Start\r\n urlPathName?: string,\r\n // VSI Customization 7924 End\r\n isSizeRefinerAndCategory?: boolean | undefined,\r\n isUpdateRefinerPanel?: boolean | undefined,\r\n catalogId?: number | undefined,\r\n\r\n) => BaseCollectionInput;\r\n\r\n/**\r\n * TODO: Use this function to create the input required to make the action call\r\n */\r\nexport const createBaseCollectionInput = (\r\n args: ICreateActionContext,\r\n inputClassConstuctor: CollectionClassConstructor\r\n): BaseCollectionInput => {\r\n const pageType =\r\n args.requestContext.urlTokens.pageType === 'Category' || (args.requestContext.query && args.requestContext.query.categoryId)\r\n ? 'Category'\r\n : 'Search';\r\n\r\n const queryResultSettings = QueryResultSettingsProxy.fromInputData(args).QueryResultSettings;\r\n const queryRefiners = hydrateRefinersFromUrl(args.requestContext);\r\n const includeAttributes = getIncludeAttributes(args);\r\n // VSI Customization 7924 Start\r\n const pathName = args.requestContext.url.requestUrl.pathname;\r\n // VSI Customization 7924 End\r\n\r\n const isUpdateRefinerPanel = getUpdateRefinerPanel(args);\r\n const catalogId = getCatalogId(args.requestContext);\r\n\r\n if (args.requestContext.query && args.requestContext.query.sorting) {\r\n queryResultSettings.Sorting = { Columns: JSON.parse(decodeURIComponent(args.requestContext.query.sorting)) };\r\n }\r\n\r\n if (pageType === 'Category') {\r\n return new inputClassConstuctor(\r\n pageType,\r\n args.requestContext.apiSettings,\r\n queryResultSettings,\r\n queryRefiners,\r\n +(args.requestContext.urlTokens.itemId || (args.requestContext.query && args.requestContext.query.categoryId) || 0),\r\n undefined,\r\n includeAttributes,\r\n args.requestContext.locale,\r\n pathName, undefined, isUpdateRefinerPanel, catalogId\r\n );\r\n } else if (pageType === 'Search' && args.requestContext.query && args.requestContext.query.q) {\r\n return new inputClassConstuctor(\r\n pageType,\r\n args.requestContext.apiSettings,\r\n queryResultSettings,\r\n queryRefiners,\r\n undefined,\r\n args.requestContext.query.q,\r\n includeAttributes,\r\n args.requestContext.locale, undefined, undefined, isUpdateRefinerPanel, catalogId\r\n );\r\n } else if (pageType === 'Search' && args.requestContext.query && args.requestContext.query.productId) {\r\n return new inputClassConstuctor(\r\n pageType,\r\n args.requestContext.apiSettings,\r\n queryResultSettings,\r\n queryRefiners,\r\n undefined,\r\n args.requestContext.query.productId,\r\n includeAttributes,\r\n args.requestContext.locale, undefined, undefined, isUpdateRefinerPanel, catalogId\r\n );\r\n }\r\n\r\n throw new Error('[getFullProductsForCollection]Unable to create input');\r\n};","/* tslint:disable: no-duplicate-imports */\r\nimport { IProductRefinerHierarchy } from '@msdyn365-commerce/commerce-entities';\r\nimport { IActionContext } from '@msdyn365-commerce/core';\r\nimport { IQueryResultSettings, ProductRefiner, ProductSearchCriteria } from '@msdyn365-commerce/retail-proxy';\r\nimport { getProductSearchRefinersAsync } from '@msdyn365-commerce/retail-proxy/dist/DataActions/ProductsDataActions.g';\r\n\r\n/**\r\n * Uses Bulk refiner API to get refiners and child refiner values\r\n * @param searchCriteria product search criteria\r\n * @param maxItems max items\r\n * @param ctx action context\r\n */\r\nexport async function getProductRefinerHierarchy(searchCriteria: ProductSearchCriteria, queryResultSettings: IQueryResultSettings, ctx: IActionContext): Promise {\r\n return getProductSearchRefinersAsync({ callerContext: ctx, queryResultSettings: queryResultSettings }, searchCriteria).then((productRefiners: ProductRefiner[]) => {\r\n if (!productRefiners) {\r\n ctx.trace('[getRefinersByCriteriaAction] returned no refiners');\r\n return [];\r\n }\r\n\r\n const result = (productRefiners || []).map((productRefiner: ProductRefiner) => productRefiner);\r\n\r\n if (!result.length) {\r\n ctx.trace('[getRefinersByCriteriaAction] returned no IProductRefinerHierarchy objects');\r\n return [];\r\n }\r\n\r\n return result;\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 { IProductRefinerHierarchy } from '@msdyn365-commerce/commerce-entities';\r\nimport { createObservableDataAction, IAction, IActionContext, IActionInput, ICreateActionContext } from '@msdyn365-commerce/core';\r\nimport { BaseCollectionInput, createBaseCollectionInput } from './base-collection-action';\r\nimport { getProductRefinerHierarchy } from './get-product-refiner-hierarchy';\r\n\r\n/**\r\n * Refiners-by-Collection Input action\r\n */\r\nexport class RefinersByCollectionInput extends BaseCollectionInput implements IActionInput {\r\n public getCacheObjectType = () => 'ProductRefiner';\r\n public dataCacheType = () => {\r\n if (\r\n this.pageType !== 'Category' ||\r\n (this.refiners && this.refiners.length > 0) ||\r\n (this.queryResultSettings && this.queryResultSettings.Sorting && this.queryResultSettings.Sorting.Columns && this.queryResultSettings.Sorting.Columns.length > 0)\r\n ) {\r\n return 'request';\r\n } else {\r\n return 'application';\r\n }\r\n };\r\n}\r\n\r\n/**\r\n * Create input method which creates an ActionInput for fetching list page refiners\r\n */\r\nconst createInput = (args: ICreateActionContext): IActionInput => {\r\n return createBaseCollectionInput(args, RefinersByCollectionInput);\r\n};\r\n\r\n/**\r\n * Action method which fetches refiners for the given list page\r\n */\r\nasync function action(input: RefinersByCollectionInput, ctx: IActionContext): Promise {\r\n let searchProductId;\r\n if (input.pageType === 'Category') {\r\n if (input.category) {\r\n return getProductRefinerHierarchy(\r\n {\r\n CategoryIds: [input.category],\r\n Context: {\r\n ChannelId: input.apiSettings.channelId,\r\n CatalogId: input.apiSettings.catalogId\r\n }\r\n },\r\n input.queryResultSettings,\r\n ctx);\r\n } else {\r\n throw new Error('[GetRefinersForCollection]Category Page Detected, but no global categoryId found');\r\n }\r\n } else {\r\n if (input.searchText && (ctx.requestContext.query && ctx.requestContext.query.q)) {\r\n return getProductRefinerHierarchy(\r\n {\r\n SearchCondition: input.searchText,\r\n Context: {\r\n ChannelId: input.apiSettings.channelId,\r\n CatalogId: input.apiSettings.catalogId\r\n }\r\n },\r\n input.queryResultSettings,\r\n ctx);\r\n } else {\r\n if (input.searchText && (ctx.requestContext.query && ctx.requestContext.query.productId)) {\r\n searchProductId = Number(input.searchText);\r\n if (Number.isNaN(searchProductId)) {\r\n throw new Error('Failed to cast search product id into a number.');\r\n } else {\r\n return getProductRefinerHierarchy(\r\n {\r\n Context: {\r\n ChannelId: input.apiSettings.channelId,\r\n CatalogId: input.apiSettings.catalogId\r\n },\r\n RecommendationListId: 'looks',\r\n Ids: [searchProductId || 0]\r\n },\r\n input.queryResultSettings,\r\n ctx);\r\n }\r\n } else {\r\n throw new Error(\r\n '[GetFullProductsForCollection]Search Page Detected, but no q= or productId= query parameter found'\r\n );\r\n }\r\n }\r\n }\r\n}\r\n\r\nexport default createObservableDataAction({\r\n id: '@msdyn365-commerce-modules/search-result-container/get-refiners-for-collection',\r\n action: >action,\r\n input: createInput\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 MsDyn365, { IRequestContext } from '@msdyn365-commerce/core';\r\nimport { ProductRefinerValue, SortColumn } from '@msdyn365-commerce/retail-proxy';\r\n\r\n/**\r\n * Refiner Compression:\r\n * Refiners contains a non-trivial amount of data that is required to successfully make\r\n * a refiner-based API call. To allow for deep-linking of refiners in the URL, refiner data\r\n * must be compressed so that URL max length is not exceeded. Refiners will be compressed into\r\n * the following array style index-based format:\r\n * [DataTypeValue, LeftValueBoundString, RefinerRecordId, RefinerSourceValue, RightValueBoundString, UnitText]\r\n */\r\nconst compressedRefinerKeys = ['DataTypeValue', 'LeftValueBoundString', 'RefinerRecordId', 'RefinerSourceValue', 'RightValueBoundString', 'UnitText'];\r\n\r\n/**\r\n * Hydrates compressed refiner data from URL\r\n * @param fullUrl The full URL of the page\r\n */\r\nexport const hydrateRefinersFromUrl = (requestContext: IRequestContext): ProductRefinerValue[] => {\r\n const compressedRefinerArray = parseQueryParam<(string | number)[][]>('refiners', requestContext);\r\n if (!compressedRefinerArray || !compressedRefinerArray.length) {\r\n return [];\r\n }\r\n\r\n return compressedRefinerArray.map((compressedRefiner) => {\r\n try {\r\n const parsedRefiner: ProductRefinerValue = {};\r\n compressedRefinerKeys.forEach((refinerKey, index) => {\r\n // @ts-ignore: This line is intentionally not typesafe\r\n parsedRefiner[refinerKey] = compressedRefiner[index];\r\n });\r\n return parsedRefiner;\r\n } catch(e) {\r\n return undefined;\r\n }\r\n }).filter(Boolean);\r\n};\r\n\r\n/**\r\n * Compressed a list of refiners for use in URLs\r\n * @param refiners The uncompressed refiners\r\n */\r\nexport const compressRefiners = (refiners: ProductRefinerValue[]) => {\r\n const compressedRefiners: (string | number)[][] = [];\r\n\r\n refiners.forEach((refiner) => {\r\n const compressedRefiner: (string | number)[] = [];\r\n compressedRefinerKeys.forEach((refinerKey) => {\r\n // @ts-ignore: This line is intentionally not typesafe\r\n compressedRefiner.push(refiner[refinerKey]);\r\n });\r\n compressedRefiners.push(compressedRefiner);\r\n });\r\n\r\n return compressedRefiners;\r\n};\r\n\r\n/**\r\n * Method which creates a URL contiaining serialized active refiners\r\n * @param fullUrl The Current URL of the page\r\n * @param refiners The refiners which should be added to the URL\r\n */\r\nexport const buildListPageUrl = (fullUrl: URL, refiners?: ProductRefinerValue[], sortingColumns?: SortColumn[], skipCount?: number) => {\r\n // Refiner Change flow\r\n if (refiners !== undefined) {\r\n if (!refiners.length) {\r\n fullUrl.searchParams.delete('refiners');\r\n } else {\r\n fullUrl.searchParams.set('refiners', JSON.stringify(compressRefiners(refiners)));\r\n }\r\n\r\n // Adding or removing a refiner means we want to always load page 1\r\n fullUrl.searchParams.delete('skip');\r\n return fullUrl.href;\r\n }\r\n\r\n if (sortingColumns !== undefined) {\r\n if(!sortingColumns.length) {\r\n fullUrl.searchParams.delete('sorting');\r\n } else {\r\n fullUrl.searchParams.set('sorting', JSON.stringify(sortingColumns));\r\n }\r\n\r\n // Changing the sort means always load page 1\r\n fullUrl.searchParams.delete('skip');\r\n return fullUrl.href;\r\n }\r\n\r\n if (skipCount) {\r\n fullUrl.searchParams.set('skip', skipCount.toString());\r\n }\r\n\r\n return fullUrl.href;\r\n};\r\n\r\n/**\r\n * Parses a query param from the query object of the request context\r\n * @param key The query parameter key\r\n * @param requestContext The request context\r\n */\r\nexport const parseQueryParam = (key: string, requestContext: IRequestContext): T | null => {\r\n if(requestContext.query && requestContext.query[key]) {\r\n return JSON.parse(decodeURIComponent(requestContext.query[key]));\r\n }\r\n return null;\r\n};\r\n\r\n/**\r\n * Gets the current URL of the page from the request context\r\n * @param requestContext The request context\r\n */\r\nexport const getCurrentUrl = (requestContext: IRequestContext): URL => {\r\n if(MsDyn365.isBrowser) {\r\n return new URL(window.location.href);\r\n } else {\r\n // NOTE: Typing on requestURL is incorrect\r\n if (requestContext.url.requestUrl.href) {\r\n return new URL(requestContext.url.requestUrl.href);\r\n } else {\r\n return new URL((requestContext.url.requestUrl));\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\nimport {\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\n/* tslint:disable: no-duplicate-imports */\r\nimport { ProductPrice, ProductRefinerValue, ProductSearchResult, SimpleProduct, SortingInfo } from '@msdyn365-commerce/retail-proxy';\r\nimport { observable } from 'mobx';\r\n\r\nimport { listPageType } from './actions';\r\n\r\n/**\r\n * ListPageState class\r\n */\r\nexport class ListPageState {\r\n @observable public activeFilters: ProductRefinerValue[] | null = null;\r\n @observable public activeVirtualFilters: ProductRefinerValue[] | null = null;\r\n @observable public activeProducts: ProductSearchResult[] = [];\r\n @observable public sortingCritera: SortingInfo | null = null;\r\n @observable public currentPageNumber: number | null = null;\r\n @observable public totalProductCount: number | undefined;\r\n @observable public pageSize: number = 10;\r\n @observable public pageType: listPageType = 'Unknown';\r\n @observable public featureProduct: SimpleProduct | null = null;\r\n @observable public productPrices: ProductPrice[] | undefined = [];\r\n}\r\n\r\n/**\r\n * ListPageStateInput - action input\r\n */\r\nexport class ListPageStateInput implements IActionInput {\r\n public getCacheKey = () => `ListPageState`;\r\n public getCacheObjectType = () => 'ListPageState';\r\n public dataCacheType = (): CacheType => 'application';\r\n}\r\n\r\nexport async function listPageStateAction(\r\n input: ListPageStateInput,\r\n ctx: IActionContext\r\n): Promise {\r\n return new ListPageState();\r\n}\r\n\r\n/**\r\n * create new input for create action\r\n */\r\nexport const createListPageInput = (\r\n inputData: ICreateActionContext>\r\n): IActionInput => {\r\n return new ListPageStateInput();\r\n};\r\n\r\n/**\r\n * ListPageState - create action\r\n */\r\nexport default createObservableDataAction({\r\n action: >listPageStateAction,\r\n input: createListPageInput\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-breadcrumb'] = {\n c: () => require('partner/modules/mfrm-breadcrumb/mfrm-breadcrumb.tsx'),\n $type: 'contentModule',\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:'categoryPaths', path:'@msdyn365-commerce-modules/retail-actions/dist/lib/get-category-paths', runOn: 0},{name:'listPageState', path:'modules/mfrm-search-result-container/list-page-state', runOn: 0},{name:'product', path:'@msdyn365-commerce-modules/retail-actions/dist/lib/get-selected-variant', runOn: 0},{name:'productSpecificationData', path:'data-actions/get-attributes-for-selected-variant', runOn: 0},{name:'refiners', path:'modules/mfrm-search-result-container/actions/get-refiners-for-collection', runOn: 0},{name:'updateBreadcrumbOnSrp', path:'actions/srp-breadcrumb-page.action', runOn: 0}],\n \n iNM: false,\n ns: '__local__',\n n: 'mfrm-breadcrumb',\n p: '__local__',\n \n pdp: '',\n \n \n md: 'src/modules/mfrm-breadcrumb'\n });\n \n\n {\n const sanitizedActionPath = '@msdyn365-commerce-modules/retail-actions/dist/lib/get-category-paths';\n let dataAction = require('@msdyn365-commerce-modules/retail-actions/dist/lib/get-category-paths');\n registerSanitizedActionPath(sanitizedActionPath, dataAction);\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-attributes-for-selected-variant';\n let dataAction = require('partner/data-actions/get-attributes-for-selected-variant');\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-breadcrumb|mfrm-breadcrumb'] = {\n c: () => require('partner/modules/mfrm-breadcrumb/mfrm-breadcrumb.view.tsx'),\n cn: '__local__-__local__-mfrm-breadcrumb'\n };\nwindow.__bindings__ = window.__bindings__ || {};\nwindow.__bindings__.viewDictionary = {\n ...window.__bindings__.viewDictionary || {},\n ...viewDictionary\n };","module.exports = React;","module.exports = ReactDOM;"],"names":["hasArray","values","length","undefined","fallBackBrandAttribute","parseBrandName","attributes","backendAttribute","recordId","attribute","productBrandName","find","currAttribute","Name","toLowerCase","trim","TextValue","MsDyn365","getLocalStorage","localStorage","getItem","bonusItemArray","JSON","parse","checkBrandName","item","productId","brandName","parseBrandNameUnbxd","getBrandNameCheck","canonicalURL","requestContext","requestUrl","url","origin","path","pathname","urlParts","split","splice","match","removePipeSignValue","removeKeywords","filteredPath","join","filteredURL","filter","urlPart","indexOf","removeKeywordFromUrl","app","config","removeKeywordFromUrlArray","forEach","_part","removeKeyword","trimmedKeyword","indexOfValue","getSortedVirtualRefinerConfig","isMattressesCategory","appConfigSorted","getVirtualRefinerConfig","appConfig","enableForMattresses","enableForOtherCategories","sort","a","b","order","getVirtualRefinerNames","sortedVirtualRefinerConfig","appConfigRefinerNames","sortedConfig","push","refinerName","urlModifications","async","getVirtualRefinerValues","virtualRefiners","virtualRefinerValues","categoryIdToken","urlTokens","finalizedUrlParts","plainUrlPart","decodeURIComponent","part","filteredPart","mainRefiner","Values","refinerValue","refinerValueKeyName","LeftValueBoundString","replace","regExSpecialChars","canonicalUrlspecialCharIncludeList","navLinkKeywordRemoval","link","linkBase","linkParams","endsWith","linkParam","map","param","filteredLink","includeConfigList","includeConfig","pattern","RegExp","SrpBreadcrumbPageInput","constructor","getCacheKey","getCacheObjectType","dataCacheType","Msdyn365","action","input","ctx","breadcrumbCheck","id","args","AttributesForSelectedVariantInput","channelId","selectedProduct","catalogId","this","createAttributesForSelectedVariantInput","inputData","getSelectedProductIdFromActionInput","apiSettings","Error","getAttributesForSelectedVariantAction","Promise","resolve","then","activeProduct","selectedVariantInput","SelectedVariantInput","getSelectedVariant","productResult","getAttributeValuesAsync","callerContext","queryResultSettings","RecordId","attributeValues","catch","error","trace","message","createObservableDataAction","Link","text","className","href","ariaLabel","index","noclick","telemetryContent","payLoad","getPayloadObject","linkText","contentAction","etext","getTelemetryAttributes","React","onClick","onTelemetryClick","itemProp","content","Separator","separator","Breadcrumb","props","super","_pageType","context","request","pageType","getTelemetryObject","telemetryPageName","friendlyName","telemetry","_getRootLink","root","linkUrl","destinationUrl","modifyBreadcrumbUrl","pop","_getCustomBreadcrumbLinks","itemPosition","links","value","key","toString","_makeRealUrlParts","decodedArr","refinerParts","realUrl","realUrlParts","includes","_getUrlString","data","categoryId","slug","category","result","Slug","slugArray","params","window","location","refinersString","configVirtualRefinerNames","filteredRefiners","refiners","refiner","KeyName","sortedValues","refinerSet","refinerPart","str","strNext","breakAll","every","sortedRefiners","_getUrl","originalUrlPart","search","_trimSpacesAndCapitalize","st","trimStart","trimEnd","toUpperCase","_getCategoryHierarchy","categoryHierarchy","categoryHierarchyTemp","cat","Url","state","concatRefinerCat","_getPDPLinks","hideProductName","product","productSpecificationData","categoryPaths","brandBackofficeAttributePdp","_goBack","history","back","_getPDPBackButton","query","document","referrer","role","resources","backToResultsText","plpBreadcrumbSchema","componentDidMount","refinerCat","setState","componentDidUpdate","schema","_makePlpBreadcrumbSchema","render","rootLink","breadcrumbLinks","backButtonComponent","breaCrumbType","breadcrumbType","linkSeparator","breadcrumbViewProps","BreadcrumbContainer","moduleProps","classnames","tag","BreadcrumbList","BreadcrumbListItem","backButton","pdpBreadcrumbSchema","_makePdpBreadcrumbSchema","renderView","homeUrl","plpLinks","position","breadcrumbData","plpLink","breadcrumbUrl","concat","modifiedBreadcrumbUrl","itemListElement","searchQueryValue","q","stringify","pdpLinks","pdpLink","pdpBreadcrumbUrl","breadcrumbLink","showBreadCrumb","listPageState","mfrmLinks","hideParentCatagory","pageURL","activeProducts","extProperties","ExtensionProperties","fallBackQueryResult","obj","Key","Value","StringValue","isSchemaUpdated","setIsSchemaUpdated","getHREF","event","preventDefault","targetElm","target","redirectURL","closest","getAttribute","utag","event_category","event_action","event_label","event_noninteraction","updateBreadcrumbOnSrp","warning","Module","Object","inlineScripts","createElement","setAttribute","head","insertBefore","firstElementChild","_renderPlpBreadcrumbSchema","HtmlHeadInclude","type","dangerouslySetInnerHTML","__html","Node","breadcrumbShowingResultQuery","BaseCollectionInput","searchText","includeAttributes","locale","urlPathName","isSizeRefinerAndCategory","isUpdateRefinerPanel","Paging","toJS","Sorting","buildCacheKey","RefinerRecordId","RightValueBoundString","convertToString","BooleanValue","ByteValue","DateTimeOffsetValue","DecimalValue","IntegerValue","LongValue","createBaseCollectionInput","inputClassConstuctor","QueryResultSettingsProxy","QueryResultSettings","queryRefiners","hydrateRefinersFromUrl","pathName","updateRefinerPanel","getUpdateRefinerPanel","getCatalogId","sorting","Columns","itemId","getProductRefinerHierarchy","searchCriteria","getProductSearchRefinersAsync","productRefiners","productRefiner","RefinersByCollectionInput","searchProductId","CategoryIds","Context","ChannelId","CatalogId","SearchCondition","Number","isNaN","RecommendationListId","Ids","compressedRefinerKeys","compressedRefinerArray","parseQueryParam","compressedRefiner","parsedRefiner","refinerKey","e","Boolean","buildListPageUrl","fullUrl","sortingColumns","skipCount","searchParams","set","compressedRefiners","compressRefiners","delete","getCurrentUrl","URL","ListPageState","activeFilters","activeVirtualFilters","sortingCritera","currentPageNumber","pageSize","featureProduct","productPrices","__decorate","observable","ListPageStateInput","listPageStateAction","createListPageInput","binding","modules","dataActions","registerSanitizedActionPath","sanitizedActionPath","dataAction","default","prototype","RegistrationId","c","require","$type","da","name","runOn","iNM","ns","n","p","pdp","md","__bindings__","viewDictionary","cn","module","exports","ReactDOM"],"sourceRoot":""}