{"version":3,"file":"static/js/a053ece0325cfda6a3eb.bundle.js","mappings":"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","sources":["webpack://mattressfirm/./src/Utilities/get-view-port.tsx?4210","webpack://mattressfirm/./src/Utilities/isExternalLink.ts?57de","webpack://mattressfirm/./src/Utilities/plp-url-utils.ts?728b","webpack://mattressfirm/./src/data-actions/navigation-menu-state-data-action.ts?8ae5","webpack://mattressfirm/./src/modules/mfrm-navigation-menu/mfrm-navigation-menu.props.autogenerated.ts?c08b","webpack://mattressfirm/./src/modules/mfrm-navigation-menu/mfrm-navigation-menu.tsx?7f4b","webpack://mattressfirm/./src/modules/mfrm-navigation-menu/mfrm-navigation-menu.view.tsx?f63b","webpack://mattressfirm/./lib/mfrm-navigation-menu/module-registration.js?f13f","webpack://mattressfirm/external var \"React\"?0d3b","webpack://mattressfirm/external var \"ReactDOM\"?853b"],"sourcesContent":["import MsDyn365, { ICoreContext } from '@msdyn365-commerce/core';\r\nexport type GridSize = 'xs' | 'sm' | 'md' | 'lg' | 'xl';\r\n\r\nconst _getViewPort = (context: ICoreContext): GridSize => {\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 return 'xs';\r\n};\r\n\r\nexport default _getViewPort;\r\n","export const isExternalLink = (url: any) => {\r\n const tmp = document.createElement('a');\r\n tmp.href = url;\r\n return tmp.host !== window.location.host;\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 // eslint-disable-next-line security/detect-non-literal-regexp\r\n return new RegExp(pattern, 'gi');\r\n } else {\r\n\r\n const pattern = `[^\\\\w\\\\&\\\\|]`;\r\n // eslint-disable-next-line security/detect-non-literal-regexp\r\n return new RegExp(pattern, 'gi');\r\n }\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\r\n * All rights reserved. See License.txt in the project root for license information.\r\n * IMfrmNavigationMenu contentModule Interface Properties\r\n * THIS FILE IS AUTO-GENERATED - MANUAL MODIFICATIONS WILL BE LOST\r\n */\r\n\r\nimport * as Msdyn365 from '@msdyn365-commerce/core';\r\n\r\nexport const enum navigationMenuSource {\r\n retailServerOnly = 'retailServerOnly',\r\n cmsOnly = 'cmsOnly',\r\n all = 'all'\r\n}\r\n\r\nexport interface IMfrmNavigationMenuConfig extends Msdyn365.IModuleConfig {\r\n categoryImageSettings?: Msdyn365.IImageSettings;\r\n displayCategoryImage?: boolean;\r\n enableMultilevelMenu?: boolean;\r\n enabletopMenu?: boolean;\r\n rootMenuNavigation?: string;\r\n menuLevelSupport?: number;\r\n navigationMenuSource?: navigationMenuSource;\r\n cmsNavItems?: ICmsNavItemsData[];\r\n secondaryNavItems?: ISecondaryNavItemsData[];\r\n menuItemsLimitMobile?: number;\r\n menuItemsLimitDesktop?: number;\r\n className?: string;\r\n}\r\n\r\nexport interface IMfrmNavigationMenuResources {\r\n menuAriaLabel: string;\r\n backButtonAriaLabel: string;\r\n allCategoryMenuText: string;\r\n}\r\n\r\nexport interface ICmsNavItemsData {\r\n linkText?: string;\r\n linkUrl?: Msdyn365.ILinkData;\r\n image?: Msdyn365.IImageData;\r\n imageLink?: Msdyn365.ILinkData;\r\n ariaLabel?: string;\r\n clpLinkText?: string;\r\n clpLink?: Msdyn365.ILinkData;\r\n categoryBannerNames?: string;\r\n mattressMatcherBannerID?: string;\r\n menuItemColorMobile?: string;\r\n menuItemColorDesktop?: string;\r\n openInNewTab?: boolean;\r\n subMenus?: ISubMenusData[];\r\n}\r\n\r\nexport interface ISecondaryNavItemsData {\r\n linkText?: string;\r\n linkUrl: Msdyn365.ILinkData;\r\n ariaLabel?: string;\r\n openInNewTab?: boolean;\r\n}\r\n\r\nexport interface ISubMenusData {\r\n linkText?: string;\r\n linkUrl: Msdyn365.ILinkData;\r\n ariaLabel?: string;\r\n image?: Msdyn365.IImageData;\r\n imageLink?: Msdyn365.ILinkData;\r\n clpLinkText?: string;\r\n clpLink?: Msdyn365.ILinkData;\r\n categoryBannerNames?: string;\r\n mattressMatcherBannerID?: string;\r\n menuItemColorMobile?: string;\r\n menuItemColorDesktop?: string;\r\n subMenus?: ISubMenusData[];\r\n}\r\n\r\nexport interface ISubMenusData {\r\n linkText?: string;\r\n linkUrl: Msdyn365.ILinkData;\r\n ariaLabel?: string;\r\n image?: Msdyn365.IImageData;\r\n imageLink?: Msdyn365.ILinkData;\r\n clpLinkText?: string;\r\n clpLink?: Msdyn365.ILinkData;\r\n categoryBannerNames?: string;\r\n mattressMatcherBannerID?: string;\r\n menuItemColorMobile?: string;\r\n menuItemColorDesktop?: string;\r\n subMenus?: ISubMenusData[];\r\n}\r\n\r\nexport interface ISubMenusData {\r\n linkText?: string;\r\n linkUrl: Msdyn365.ILinkData;\r\n ariaLabel?: string;\r\n image?: Msdyn365.IImageData;\r\n imageLink?: Msdyn365.ILinkData;\r\n categoryBannerNames?: string;\r\n mattressMatcherBannerID?: string;\r\n menuItemColorMobile?: string;\r\n menuItemColorDesktop?: string;\r\n}\r\n\r\nexport interface IMfrmNavigationMenuProps extends Msdyn365.IModule {\r\n resources: IMfrmNavigationMenuResources;\r\n config: IMfrmNavigationMenuConfig;\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 { getCategoryUrl } from '@msdyn365-commerce-modules/retail-actions';\r\nimport { addThrottledEvent, IModuleProps, INodeProps } from '@msdyn365-commerce-modules/utilities';\r\nimport { CategoryHierarchy } from '@msdyn365-commerce/commerce-entities';\r\nimport MsDyn365, { IActionContext, ICoreContext, IGridSettings, IImageSettings, isEmptyOrNullObject } from '@msdyn365-commerce/core';\r\nimport { TextValueTranslation } from '@msdyn365-commerce/retail-proxy';\r\nimport classnames from 'classnames';\r\nimport { observable } from 'mobx';\r\nimport * as React from 'react';\r\nimport Cookies from 'universal-cookie';\r\nimport _getViewPort from '../../Utilities/get-view-port';\r\nimport { navLinkKeywordRemoval } from '../../Utilities/plp-url-utils';\r\nimport { IMenuItemData, IMfrmNavigationMenuData } from './mfrm-navigation-menu.data';\r\nimport {\r\n ICmsNavItemsData,\r\n IMfrmNavigationMenuProps,\r\n ISubMenusData,\r\n navigationMenuSource\r\n} from './mfrm-navigation-menu.props.autogenerated';\r\n\r\nexport interface INavigationMenuViewProps extends IMfrmNavigationMenuProps {\r\n className: string;\r\n menuItemData: IMenuItemData[];\r\n Navigation: IModuleProps;\r\n MenuList: INodeProps;\r\n ListItem: INodeProps;\r\n Link: INodeProps;\r\n Button: INodeProps;\r\n Span: INodeProps;\r\n ImageContainer: INodeProps;\r\n MobileDescriptionContainer: INodeProps;\r\n MobileBackButton: INodeProps;\r\n MobileDescriptionLabel: INodeProps;\r\n imageSettings: IImageSettings;\r\n gridSettings: IGridSettings;\r\n isMobileView: boolean;\r\n DivContainer?: INodeProps;\r\n ImageDivContainer?: INodeProps;\r\n showCategoryImage?: boolean;\r\n}\r\n\r\nexport type GridSize = 'xs' | 'sm' | 'md' | 'lg' | 'xl';\r\n\r\nexport interface INavigationMenuState {\r\n isMobile: boolean;\r\n}\r\n\r\n/**\r\n *\r\n * NavigationMenu component\r\n * @extends {React.PureComponent>}\r\n */\r\nclass NavigationMenu extends React.PureComponent, INavigationMenuState> {\r\n private CMSItemIdInit: number = 1000;\r\n private RSItemIdInit: number = 5000;\r\n private resizeThrottledEventHandler?: (event: Event) => void;\r\n private menuItemList: IMenuItemData[];\r\n private isRetail: boolean = true;\r\n private isCMS: boolean = true;\r\n @observable\r\n public static getFriendlyName(locale: string, nameTranslations?: TextValueTranslation[]): string | undefined {\r\n let nameTranslation: TextValueTranslation | undefined;\r\n if (locale && nameTranslations && nameTranslations.length > 0) {\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\r\n constructor(props: IMfrmNavigationMenuProps) {\r\n super(props);\r\n this._setNavigationSource(this.props.config && this.props.config.navigationMenuSource);\r\n this.state = { isMobile: false };\r\n this.menuItemList = [];\r\n\r\n // set cookie to track sessions for new site\r\n const cookies = new Cookies();\r\n const expiryDateTracking = new Date();\r\n // expiry date set to now + 1 day\r\n expiryDateTracking.setDate(expiryDateTracking.getDate() + 1);\r\n cookies.set('d365_site', true, {\r\n expires: expiryDateTracking,\r\n path: '/'\r\n });\r\n\r\n // set d365 user cookie\r\n const expiryDateUser = new Date();\r\n // expiry date set to now + 14 days\r\n expiryDateUser.setDate(expiryDateUser.getDate() + 14);\r\n cookies.set('d365_user', true, {\r\n expires: expiryDateUser,\r\n path: '/'\r\n });\r\n\r\n const expiryDateInMonths = new Date();\r\n // expiry date set to now + 13 Months\r\n expiryDateInMonths.setMonth(expiryDateInMonths.getMonth() + 13);\r\n const requestContext = this.props.context.request;\r\n const cjeventValue = requestContext?.query?.cjevent;\r\n if (cjeventValue) {\r\n requestContext.cookies.set('cje', cjeventValue, {\r\n expires: expiryDateInMonths,\r\n secure: true,\r\n httpOnly: false,\r\n sameSite: 'none',\r\n path: '/'\r\n });\r\n }\r\n }\r\n\r\n public componentDidMount(): void {\r\n if (MsDyn365.isBrowser) {\r\n this.resizeThrottledEventHandler = addThrottledEvent(window, 'resize', () => this.updateViewPort(this.props.context));\r\n }\r\n this.updateViewPort(this.props.context);\r\n }\r\n\r\n public componentWillUnmount(): void {\r\n MsDyn365.isBrowser && window.removeEventListener('resize', this.resizeThrottledEventHandler!, false);\r\n }\r\n\r\n public render(): JSX.Element | null {\r\n this.CMSItemIdInit = 1000;\r\n this.menuItemList = this._mapData();\r\n if (isEmptyOrNullObject(this.props.data)) {\r\n this.props.telemetry.warning('Navigatiomenu returned null');\r\n return null;\r\n }\r\n\r\n const defaultImageSettings: IImageSettings = {\r\n viewports: {\r\n xs: { q: `w=224&h=300&m=6`, w: 0, h: 0 },\r\n xl: { q: `w=224&h=300&m=6`, w: 0, h: 0 }\r\n },\r\n lazyload: true\r\n };\r\n\r\n const viewProps = {\r\n ...this.props,\r\n ...this.state,\r\n imageSettings: defaultImageSettings,\r\n gridSettings: this.props.context.request.gridSettings,\r\n Navigation: {\r\n moduleProps: this.props,\r\n className: classnames('ms-nav', this.props.config.className, this.state.isMobile ? 'mobile-vp' : 'desktop-vp'),\r\n tag: 'nav',\r\n role: 'navigation',\r\n 'aria-label': this.props.resources.menuAriaLabel\r\n },\r\n MenuList: {\r\n className: 'ms-nav__list',\r\n tag: 'ul',\r\n role: 'menu'\r\n },\r\n ListItem: {\r\n className: 'ms-nav__list__item',\r\n role: 'presentation',\r\n tag: 'li'\r\n },\r\n showCategoryImage: this.props.config.displayCategoryImage || false,\r\n Link: {\r\n tag: 'a',\r\n className: 'ms-nav__list__item__link',\r\n role: 'menuitem'\r\n },\r\n DivContainer: {\r\n tag: 'div',\r\n className: 'ms-nav__feature',\r\n role: 'menu'\r\n },\r\n ImageDivContainer: {\r\n tag: 'div',\r\n className: 'category-image',\r\n role: 'menu'\r\n },\r\n Button: {\r\n className: 'ms-nav__list__item__button',\r\n tag: 'button',\r\n role: 'menuitem',\r\n onClick: this.props\r\n },\r\n ImageContainer: {\r\n className: 'ms-nav__list__item__image'\r\n },\r\n Span: {\r\n className: 'ms-nav__list__item__span',\r\n tag: 'span'\r\n },\r\n MobileDescriptionContainer: {\r\n className: 'ms-nav__list__mobile__container'\r\n },\r\n MobileBackButton: {\r\n className: 'ms-nav__list__mobile__container__button',\r\n tag: 'button',\r\n 'aria-label': this.props.resources.backButtonAriaLabel,\r\n onClick: this.props\r\n },\r\n MobileDescriptionLabel: {\r\n className: 'ms-nav__list__mobile__container__span',\r\n tag: 'span'\r\n },\r\n isMobileView: this.state.isMobile,\r\n menuItemData: this.menuItemList,\r\n className: classnames('ms-nav', this.props.config.className)\r\n };\r\n return this.props.renderView(viewProps) as React.ReactElement;\r\n }\r\n\r\n private _mapData(): IMenuItemData[] {\r\n const { data, config } = this.props;\r\n const mergedData: IMenuItemData[] = [];\r\n if (this.isRetail && data && data.categories && data.categories.result && data.categories.result.length > 0) {\r\n data.categories.result.map((item: CategoryHierarchy, index) =>\r\n mergedData.push(this._constructMenuItemData(item, undefined, true, index, true))\r\n );\r\n }\r\n\r\n if (this.isCMS && config.cmsNavItems && config.cmsNavItems.length > 0) {\r\n config.cmsNavItems.map((item: ICmsNavItemsData, idx: number) =>\r\n mergedData.push(this._constructMenuItemData(undefined, item, false, idx + 1))\r\n );\r\n }\r\n return this._constructTopMenuItemData(mergedData);\r\n }\r\n\r\n // tslint:disable-next-line: cyclomatic-complexity\r\n private _constructTopMenuItemData(mergedData: IMenuItemData[]): IMenuItemData[] {\r\n const enableTopLevelMenu = this.props.config.enabletopMenu || false;\r\n if (!enableTopLevelMenu) {\r\n return mergedData;\r\n }\r\n const mergedRootMenuData: IMenuItemData[] = [];\r\n const topMenu = {\r\n id: 1,\r\n linkText: this.props.config.rootMenuNavigation || '...',\r\n linkURL: '#',\r\n imageSource: undefined,\r\n subMenu: mergedData\r\n } as IMenuItemData;\r\n mergedRootMenuData.push(topMenu);\r\n\r\n return mergedRootMenuData;\r\n }\r\n\r\n // tslint:disable-next-line: cyclomatic-complexity\r\n private _constructMenuItemData(\r\n retailItem?: CategoryHierarchy,\r\n cmsItem?: ICmsNavItemsData,\r\n isRetail?: boolean,\r\n idx?: number,\r\n addedAllMenu?: boolean\r\n ): IMenuItemData {\r\n const locale =\r\n this.props.context && this.props.context.request && this.props.context.request.locale\r\n ? this.props.context.request.locale\r\n : 'en-us';\r\n const imageSouce = retailItem && retailItem.Images && retailItem.Images[0].Uri ? retailItem.Images[0].Uri : 'empty';\r\n if (isRetail) {\r\n return {\r\n id: this.RSItemIdInit++,\r\n linkText: NavigationMenu.getFriendlyName(locale, retailItem && retailItem.NameTranslations) || '',\r\n linkURL: navLinkKeywordRemoval((retailItem && retailItem.Url) || '', this.props.context.request),\r\n imageSource: imageSouce,\r\n subMenu: this._getNestedChildren(retailItem, imageSouce, addedAllMenu)\r\n } as IMenuItemData;\r\n } else {\r\n return {\r\n // VSI Customization - start - added additional params for menu item data\r\n id: this.CMSItemIdInit++,\r\n linkText: cmsItem?.linkText || '',\r\n linkURL: navLinkKeywordRemoval((cmsItem?.linkUrl && cmsItem.linkUrl.destinationUrl) || '', this.props.context.request),\r\n linkType: cmsItem?.linkUrl?.type,\r\n imageDestinationURL: (cmsItem?.imageLink && cmsItem.imageLink.destinationUrl) || '',\r\n imageSource: (cmsItem?.image && cmsItem.image.src) || '',\r\n menuItemColorMobile: cmsItem?.menuItemColorMobile || '',\r\n menuItemColorDesktop: cmsItem?.menuItemColorDesktop || '',\r\n categoryBannerNames: cmsItem?.categoryBannerNames || '',\r\n mattressMatcherBannerID: cmsItem?.mattressMatcherBannerID || '',\r\n clpLink: cmsItem?.clpLink || undefined,\r\n clpLinkText: cmsItem?.clpLinkText || '',\r\n openInNewTab: cmsItem?.openInNewTab,\r\n subMenu: this._getCMSNestedChildren(cmsItem)\r\n // VSI Customization - end\r\n } as IMenuItemData;\r\n }\r\n }\r\n\r\n private _getNestedChildren(category?: CategoryHierarchy, imageSourceUrl?: string, addedAllMenu: boolean = false): IMenuItemData[] {\r\n const nestedChildren: IMenuItemData[] = [];\r\n if (!category || !category.Children || !category.Children.length) {\r\n return [];\r\n }\r\n\r\n if (!this.props.config.enabletopMenu && addedAllMenu) {\r\n nestedChildren.push({\r\n linkText: this.props.resources.allCategoryMenuText,\r\n imageSource: imageSourceUrl,\r\n linkURL: getCategoryUrl(category, (this.props.context as unknown) as IActionContext, {})\r\n });\r\n }\r\n category.Children.map((item: CategoryHierarchy, index) => {\r\n nestedChildren.push(this._constructMenuItemData(item, undefined, true, index, false));\r\n });\r\n return nestedChildren;\r\n }\r\n\r\n private _getCMSNestedChildren(category?: ICmsNavItemsData): IMenuItemData[] {\r\n const nestedChildren: IMenuItemData[] = [];\r\n\r\n if (!category || !category.subMenus || !category.subMenus.length) {\r\n return [];\r\n }\r\n\r\n category.subMenus.map((item: ISubMenusData, idx: number) => {\r\n nestedChildren.push(this._constructMenuItemData(undefined, item, false, idx));\r\n });\r\n return nestedChildren;\r\n }\r\n\r\n private _setNavigationSource = (sourceType?: navigationMenuSource): void => {\r\n switch (sourceType) {\r\n case navigationMenuSource.retailServerOnly:\r\n this.isRetail = true;\r\n this.isCMS = false;\r\n break;\r\n case navigationMenuSource.cmsOnly:\r\n this.isRetail = false;\r\n this.isCMS = true;\r\n break;\r\n case navigationMenuSource.all:\r\n this.isRetail = true;\r\n this.isCMS = true;\r\n break;\r\n default:\r\n }\r\n };\r\n\r\n private updateViewPort = (context: ICoreContext): void => {\r\n const viewport = _getViewPort(context);\r\n if (viewport === 'xs' || viewport === 'sm' || viewport === 'md') {\r\n this.setState({\r\n isMobile: true\r\n });\r\n } else {\r\n this.setState({\r\n isMobile: false\r\n });\r\n }\r\n };\r\n}\r\n\r\nexport default NavigationMenu;\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 {generateImageUrl} from '@msdyn365-commerce-modules/retail-actions';\r\nimport {\r\n Button as CoreButton,\r\n getPayloadObject,\r\n getTelemetryAttributes,\r\n getTelemetryObject,\r\n IPayLoad,\r\n ITelemetryContent,\r\n Module,\r\n Node,\r\n onTelemetryClick\r\n} from '@msdyn365-commerce-modules/utilities';\r\nimport MsDyn365, {IImageData, IImageSettings, Image} from '@msdyn365-commerce/core';\r\nimport classnames from 'classnames';\r\nimport * as React from 'react';\r\nimport {NavMenuStateInput} from '../../data-actions/navigation-menu-state-data-action';\r\nimport { isExternalLink } from '../../Utilities/isExternalLink';\r\nimport {navLinkKeywordRemoval} from '../../Utilities/plp-url-utils';\r\nimport {INavigationMenuViewProps} from './mfrm-navigation-menu';\r\nimport {IMenuItemData} from './mfrm-navigation-menu.data';\r\n\r\ninterface INavigationState {\r\n parentMenu?: number;\r\n activeMenu?: number[];\r\n activeMenuLabels?: string[];\r\n categoryImage?: string | null;\r\n mobileViewLabelText?: string;\r\n showModal?: boolean;\r\n dataShared: boolean;\r\n}\r\n\r\n/**\r\n *\r\n * MfrmNavigationMenuView component\r\n * @extends {React.PureComponent}\r\n */\r\nexport class MfrmNavigationMenuView extends React.PureComponent {\r\n // VSI-Customization - start - 10/12/2020\r\n private activeIndex: number = 0;\r\n private currentSubMenu: JSX.Element[] = [];\r\n private possibleParentMenus: IMenuItemData[] = [];\r\n private parentMenu: IMenuItemData | undefined;\r\n private mobileRoot: IMenuItemData | undefined;\r\n // VSI-Customization - end\r\n private currentLevel: number = 0;\r\n private menuNode: React.RefObject;\r\n private telemetryContent: ITelemetryContent;\r\n private payLoad: IPayLoad;\r\n constructor(props: INavigationMenuViewProps) {\r\n super(props);\r\n this.menuNode = React.createRef();\r\n this.state = { activeMenu: undefined, activeMenuLabels: undefined, mobileViewLabelText: '', parentMenu: undefined, showModal: false, dataShared: false };\r\n this._closeSubmenu = this._closeSubmenu.bind(this);\r\n this.telemetryContent = getTelemetryObject(this.props.context.request.telemetryPageName!,\r\n this.props.friendlyName,\r\n this.props.telemetry);\r\n this.payLoad = getPayloadObject('click', this.telemetryContent, '', '');\r\n }\r\n\r\n public componentDidUpdate(): void {\r\n const { menuItemData } = this.props;\r\n if (this.props.data.navMenuState.result && !this.state.dataShared) {\r\n const navMenuState = this.props.data.navMenuState?.result;\r\n this.props.context.actionContext.update(new NavMenuStateInput(), { ...navMenuState, menuItemData: menuItemData });\r\n this.setState({ dataShared: true });\r\n }\r\n if (MsDyn365.isBrowser && this.isWmap()) {\r\n const collection = document.getElementsByTagName('a');\r\n if (collection.length) {\r\n for (let i = 0; i < collection.length; i++) {\r\n const href = collection[i].getAttribute('href')?.replace(`/${this.props.app.config.wmapPageUrlSuffix}`, '');\r\n collection[i].setAttribute('href', href!);\r\n }\r\n }\r\n }\r\n }\r\n\r\n public render(): JSX.Element | null {\r\n const { isMobileView, MenuList, MobileDescriptionContainer, MobileDescriptionLabel, Navigation } = this.props;\r\n this.currentLevel = 1;\r\n this.activeIndex = 0;\r\n this.currentSubMenu = [];\r\n this.possibleParentMenus = [];\r\n this.parentMenu = undefined;\r\n\r\n const mobileCollapsedState = this.props.data.navMenuState.result?.isMobileMenuCollapsed;\r\n if (mobileCollapsedState && isMobileView) {\r\n this.setState({ activeMenu: undefined, activeMenuLabels: undefined });\r\n }\r\n\r\n const query = this.props.context.request.query;\r\n\r\n const linkList = {this._displayMenuItemData()};\r\n\r\n return (\r\n <>\r\n {query && query.hasOwnProperty('emitCategories') && query.emitCategories === 'true' && (\r\n \r\n \r\n {JSON.stringify(this.props.menuItemData)}\r\n \r\n )}\r\n \r\n {/* menu list creates an ul with role menu */}\r\n \r\n {/* active menu is undefined by default */}\r\n {isMobileView && this.state.activeMenu !== undefined &&\r\n \r\n {this.state.mobileViewLabelText}\r\n }\r\n {this._renderDisplay()}\r\n \r\n {/* modal for desktop */}\r\n {!isMobileView &&\r\n
\r\n }\r\n \r\n {/* Render seo link-list in the page source. */}\r\n {linkList}\r\n \r\n );\r\n }\r\n\r\n private isWmap = (): boolean => {\r\n const pathName = this.props.context.request && this.props.context.request.url.requestUrl.pathname?.toLowerCase().split('/');\r\n const makeaPaymentLink = this.props.context?.app.config.wmapPageUrlSuffix?.toLowerCase();\r\n return pathName && makeaPaymentLink && pathName?.includes(makeaPaymentLink);\r\n };\r\n private _renderDisplay(): JSX.Element[] {\r\n const { ListItem, menuItemData, isMobileView } = this.props;\r\n const menuItemList: JSX.Element[] = [];\r\n\r\n // VSI-Customization - start - Mouse Leave Event\r\n menuItemData.forEach((item: IMenuItemData, index: number) => {\r\n menuItemList.push(\r\n \r\n {this._createMenuItemList(item)}\r\n \r\n // VSI-Customization - end\r\n );\r\n });\r\n return menuItemList;\r\n }\r\n\r\n private _displayMenuItemData(): JSX.Element[] {\r\n const { menuItemData } = this.props;\r\n const allMenuItemArray = [];\r\n\r\n for (let index = 0; index < menuItemData.length; index++) {\r\n const currentMenu = menuItemData[index];\r\n\r\n if (currentMenu.subMenu) {\r\n for (let subMenuIndex = 0; subMenuIndex < currentMenu.subMenu.length; subMenuIndex++) {\r\n const subMenu = currentMenu.subMenu[subMenuIndex];\r\n\r\n if (subMenu.subMenu) {\r\n for (let nestedSubMenuIndex = 0; nestedSubMenuIndex < subMenu.subMenu.length; nestedSubMenuIndex++) {\r\n const nestedSubMenu = subMenu.subMenu[nestedSubMenuIndex];\r\n\r\n if (nestedSubMenu.subMenu) {\r\n for (let doublyNestedSubMenuIndex = 0; doublyNestedSubMenuIndex < nestedSubMenu.subMenu.length; doublyNestedSubMenuIndex++) {\r\n const doublyNestedSubMenu = nestedSubMenu.subMenu[doublyNestedSubMenuIndex];\r\n allMenuItemArray.push(doublyNestedSubMenu);\r\n }\r\n }\r\n allMenuItemArray.push(nestedSubMenu);\r\n }\r\n }\r\n allMenuItemArray.push(subMenu);\r\n }\r\n }\r\n allMenuItemArray.push(currentMenu);\r\n }\r\n\r\n // Filter out empty href links\r\n const MenuItems = allMenuItemArray.filter(({ linkURL }) => !!linkURL);\r\n\r\n // Build anchor node from array of menu items\r\n return MenuItems.map(({id, linkText, linkURL}) => {linkText});\r\n }\r\n\r\n private _createMenuItemList(menuItemData: IMenuItemData): JSX.Element | null {\r\n if (menuItemData && menuItemData.subMenu && menuItemData.subMenu.length > 0) {\r\n if (this.props.isMobileView && !this.state.activeMenu) {\r\n return this._renderButtonMenuItem(menuItemData, 0);\r\n } else if (this.props.isMobileView) {\r\n return this._renderSubMenu(menuItemData.subMenu, menuItemData.id, false);\r\n } else {\r\n return (\r\n \r\n {this._renderButtonMenuItem(menuItemData)}\r\n {this._renderSubMenu(menuItemData.subMenu, menuItemData.id, false)}\r\n \r\n );\r\n }\r\n } else if (menuItemData && menuItemData.linkText && menuItemData.linkURL && menuItemData.linkURL.length > 0) {\r\n return this.props.isMobileView ? this.state.activeMenu?.length ? null : this._renderLinkMenuItem(menuItemData, menuItemData.id, false) : this._renderLinkMenuItem(menuItemData, menuItemData.id, false);\r\n } else if (menuItemData && menuItemData.linkText && !menuItemData.linkURL) {\r\n return this.props.isMobileView ? this.state.activeMenu?.length ? null : this._renderSpanMenuItem(menuItemData) : this._renderSpanMenuItem(menuItemData);\r\n }\r\n this.props.context.telemetry.warning('Navigation menu content is empty, module wont render.');\r\n return null;\r\n }\r\n\r\n // tslint:disable-next-line: cyclomatic-complexity\r\n private _renderSubMenu(subMenus?: IMenuItemData[], activeMenu?: number, IsSubMenu?: boolean): JSX.Element | null {\r\n const { ListItem } = this.props;\r\n // VSI-Customization - start\r\n const enableMultiSupportMenu = this.props.config.enableMultilevelMenu || false;\r\n // default of 4 is set as requested by MFRM\r\n const multiLevelSupportedMenu = this.props.config.menuLevelSupport || 4;\r\n\r\n if (activeMenu && (!this.state.activeMenu || (this.state.activeMenu[this.activeIndex]) !== activeMenu)) {\r\n this.props.context.telemetry.warning('Navigation Active menu content is empty, module wont render.');\r\n this.activeIndex > 0 && this.activeIndex--;\r\n this.currentLevel > 1 && this.currentLevel--;\r\n return null;\r\n }\r\n\r\n if (!subMenus || subMenus.length === 0) {\r\n this.props.context.telemetry.warning('Navigation Submenu content is empty, module wont render.');\r\n this.activeIndex > 0 && this.activeIndex--;\r\n this.currentLevel > 1 && this.currentLevel--;\r\n return null;\r\n }\r\n\r\n let levelClassName: string = '';\r\n const menuItems = [];\r\n\r\n const isLastSubMenu = this.state.activeMenu && this.activeIndex === this.state.activeMenu.length - 1;\r\n const isLastParent = this.state.activeMenu && this.activeIndex === this.state.activeMenu.length - 2;\r\n\r\n for (let idx = 0; idx < subMenus.length; idx++) {\r\n const option: IMenuItemData = subMenus[idx];\r\n const hasOptions = (option.subMenu && option.subMenu.length > 0);\r\n const haveSubmenu = hasOptions && enableMultiSupportMenu && (this.currentLevel <= Math.round(multiLevelSupportedMenu) - 1);\r\n\r\n let menuItem: JSX.Element | null;\r\n if (haveSubmenu) {\r\n menuItem = this._renderButtonMenuItem(option, activeMenu, idx);\r\n } else {\r\n menuItem = (option.linkURL\r\n ? this._renderLinkMenuItem(option, idx, false)\r\n : this._renderSpanMenuItem(option)\r\n );\r\n }\r\n\r\n // reached active submenu so build a list of its children to display\r\n if (isLastSubMenu) {\r\n this.currentSubMenu.push(\r\n \r\n {menuItem}\r\n \r\n );\r\n\r\n // get the parent of this submenu\r\n this.parentMenu = this.possibleParentMenus.find(menu => menu.id === activeMenu);\r\n\r\n continue;\r\n // reached parent of active submenu so set this.activeSubMenuParent here\r\n } else if (isLastParent) {\r\n this.possibleParentMenus.push(option);\r\n }\r\n\r\n // no active submenu found so keep looking\r\n if (haveSubmenu) {\r\n this.currentLevel++;\r\n this.activeIndex++;\r\n levelClassName = enableMultiSupportMenu ? `level-${this.currentLevel.toString()}` : '';\r\n this._renderSubMenu(option.subMenu, option.id, true);\r\n }\r\n\r\n menuItems.push(\r\n \r\n {menuItem}\r\n \r\n );\r\n }\r\n\r\n this.activeIndex--;\r\n return this.currentSubMenu.length ? (this._renderMenu(levelClassName, this.currentSubMenu, activeMenu, IsSubMenu)) : (this._renderMenu(levelClassName, menuItems, activeMenu, IsSubMenu));\r\n // VSI-Customization - end\r\n\r\n }\r\n\r\n private _renderButtonMenuItem(option: IMenuItemData, activeMenu?: number, index?: number): JSX.Element | null {\r\n const { Button, isMobileView } = this.props;\r\n const isRoot = !this.state.parentMenu && !activeMenu;\r\n const attributes = getTelemetryAttributes(this.telemetryContent, this.payLoad);\r\n const attribute = isRoot && !this.props.isMobileView ?\r\n { onMouseOver: this._handleDropdownToggle(option, activeMenu), onClick: this._handleOnClick(option, activeMenu), onFocus: this._handleDropdownToggle(option, activeMenu) }\r\n :\r\n { onClick: this._handleDropdownToggle(option, activeMenu) };\r\n const menuItemColor = isMobileView ? option?.menuItemColorMobile : option?.menuItemColorDesktop;\r\n return (\r\n \r\n {option.linkText}\r\n \r\n );\r\n }\r\n\r\n private _renderLinkMenuItem(option: IMenuItemData, index?: number, hoverEffect: boolean = true): JSX.Element | null {\r\n const { Link, isMobileView } = this.props;\r\n const linkText = option.linkText ? option.linkText : '';\r\n const imagesource = option.imageSource ? option.imageSource : '';\r\n this.payLoad.contentAction.etext = linkText;\r\n const attributes = getTelemetryAttributes(this.telemetryContent, this.payLoad);\r\n const menuItemColor = isMobileView ? option?.menuItemColorMobile : option?.menuItemColorDesktop;\r\n return (\r\n // VSI Customization - start - Added inline style for menu item color\r\n null}\r\n // tslint:disable-next-line: jsx-no-lambda react-this-binding-issue\r\n onClick={(event: React.MouseEvent) => { this._handleOnClickMenuItem(event, option); }}\r\n >\r\n {option.linkText}\r\n \r\n // VSI Customization - end\r\n );\r\n }\r\n\r\n private _handleOnClickMenuItem(event: React.MouseEvent, option: IMenuItemData): void {\r\n const telemetryContent = getTelemetryObject('Navigation Header', this.props.friendlyName, this.props.telemetry);\r\n const payLoad = getPayloadObject('click', telemetryContent, 'Nav', '');\r\n // @ts-ignore\r\n payLoad.contentAction.linkText = option.linkText;\r\n onTelemetryClick(telemetryContent, payLoad, 'Nav')();\r\n // @ts-ignore\r\n if (utag) {\r\n event.preventDefault();\r\n const isExternal = isExternalLink(option.linkURL);\r\n const eventName = isExternal ? 'outbound-general-link-click' : 'internal-navigation';\r\n const eventCategory = isExternal ? 'outbound links' : 'internal links';\r\n const internalDestinationUrl = option.linkURL === '/' ? '/' : option.linkURL!;\r\n const internalLocalUrl = MsDyn365.isBrowser && (window.location.href === '/' ? '/' : window.location.href.split(location.host)[1].split('?')[0]);\r\n const eventAction = isExternal ? `to: ${option.linkURL}` : `to: ${internalDestinationUrl}`;\r\n const eventLabel = isExternal ? `from: ${MsDyn365.isBrowser && window.location.href}` : `from header: ${this.state.activeMenuLabels?.join(' > ')}: ${internalLocalUrl}`;\r\n\r\n // @ts-ignore\r\n utag.link({ event: eventName, event_category: eventCategory, event_action: eventAction, event_label: eventLabel, event_noninteraction: 'false' });\r\n if (MsDyn365.isBrowser) {\r\n const isOpenInNewTab = option.openInNewTab;\r\n !isOpenInNewTab ? window.location.href = option.linkURL! : window.open(option.linkURL);\r\n }\r\n }\r\n }\r\n\r\n private _renderSpanMenuItem(option: IMenuItemData, index?: number): JSX.Element | null {\r\n const { Span, isMobileView } = this.props;\r\n const menuItemColor = isMobileView ? option?.menuItemColorMobile : option?.menuItemColorDesktop;\r\n return (\r\n // VSI Customization - start - Added inline style for menu item color\r\n {option.linkText}\r\n // VSI Customization - end\r\n );\r\n }\r\n\r\n // tslint:disable-next-line: max-func-body-length cyclomatic-complexity\r\n private _renderMenu(level: string, menuOptions: JSX.Element[], currentItem?: number, submenu?: boolean): JSX.Element | null {\r\n const { MenuList, MobileDescriptionContainer, MobileBackButton, ImageDivContainer, showCategoryImage, isMobileView } = this.props;\r\n const categoryImageDisplay = !isMobileView && showCategoryImage && this.state.categoryImage !== null && this.state.categoryImage !== undefined && !submenu;\r\n this.currentLevel = 1;\r\n const showSubMenuHeader = this.props.isMobileView || (!this.props.isMobileView && this.state.parentMenu !== undefined);\r\n const showRootData = this.props.isMobileView && this.state.activeMenu && this.state.activeMenu.length === 1;\r\n const attributes = getTelemetryAttributes(this.telemetryContent, this.payLoad);\r\n\r\n return (\r\n \r\n {showRootData ?\r\n \r\n {this.props.resources.backButtonAriaLabel}\r\n \r\n {this.mobileRoot?.linkText &&\r\n {\r\n const telemetryContent = getTelemetryObject(\r\n 'Navigation Header',\r\n this.props.friendlyName,\r\n this.props.telemetry\r\n );\r\n const payLoad = getPayloadObject('click', telemetryContent, 'Nav', '');\r\n // @ts-ignore\r\n payLoad.contentAction.linkText = this.mobileRoot?.linkText;\r\n onTelemetryClick(telemetryContent, payLoad, 'Nav')();\r\n // @ts-ignore\r\n if (utag) {\r\n // tslint:disable-next-line: jsx-no-lambda react-this-binding-issue\r\n event.preventDefault();\r\n const isExternal = isExternalLink(this.mobileRoot!.linkURL);\r\n const eventName = isExternal ? 'outbound-general-link-click' : 'internal-navigation';\r\n const eventCategory = isExternal ? 'outbound links' : 'internal links';\r\n const internalDestinationUrl = this.mobileRoot!.linkURL! === '/' ? '/' : this.mobileRoot!.linkURL!;\r\n const internalLocalUrl = MsDyn365.isBrowser && (window.location.href === '/' ? '/' : window.location.href.split(location.host)[1].split('?')[0]);\r\n const eventAction = isExternal ? `to: ${this.mobileRoot!.linkURL!}` : `to: ${internalDestinationUrl}`;\r\n const eventLabel = isExternal ? `from: ${MsDyn365.isBrowser && window.location.href}` : `from header: ${this.state.activeMenuLabels?.join(' > ')}: ${internalLocalUrl}`;\r\n const isOpenInNewTab = this.mobileRoot?.openInNewTab;\r\n // @ts-ignore\r\n utag.link({ event: eventName, event_category: eventCategory, event_action: eventAction, event_label: eventLabel, event_noninteraction: 'false' });\r\n if (MsDyn365.isBrowser) {\r\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-type-assertion\r\n !isOpenInNewTab ? this.mobileRoot?.linkURL ? window.location.href = this.mobileRoot?.linkURL : null : window.open(this.mobileRoot?.linkURL!);\r\n }\r\n }\r\n }\r\n }\r\n >\r\n {this.mobileRoot.linkText}\r\n }\r\n {this.mobileRoot?.clpLinkText && this.mobileRoot.clpLink?.destinationUrl &&\r\n {\r\n const telemetryContent = getTelemetryObject(\r\n 'Navigation Header',\r\n this.props.friendlyName,\r\n this.props.telemetry\r\n );\r\n const payLoad = getPayloadObject('click', telemetryContent, 'Nav', '');\r\n // @ts-ignore\r\n payLoad.contentAction.linkText = this.mobileRoot?.clpLinkText;\r\n onTelemetryClick(telemetryContent, payLoad, 'Nav')();\r\n // @ts-ignore\r\n if (utag) {\r\n // tslint:disable-next-line: jsx-no-lambda react-this-binding-issue\r\n event.preventDefault();\r\n const clpMobileRootLink = navLinkKeywordRemoval(this.mobileRoot!.clpLink?.destinationUrl || '', this.props.context.request);\r\n const isExternal = isExternalLink(this.mobileRoot!.clpLink?.destinationUrl);\r\n const eventName = isExternal ? 'outbound-general-link-click' : 'internal-navigation';\r\n const eventCategory = isExternal ? 'outbound links' : 'internal links';\r\n const internalDestinationUrl = clpMobileRootLink === '/' ? '/' : clpMobileRootLink;\r\n const internalLocalUrl = MsDyn365.isBrowser && (window.location.href === '/' ? '/' : window.location.href.split(location.host)[1].split('?')[0]);\r\n const eventAction = isExternal ? `to: ${clpMobileRootLink}` : `to: ${internalDestinationUrl}`;\r\n const eventLabel = isExternal ? `from: ${MsDyn365.isBrowser && window.location.href}` : `from header: ${this.state.activeMenuLabels?.join(' > ')}: ${internalLocalUrl}`;\r\n const isOpenInNewTab = this.mobileRoot?.openInNewTab;\r\n // @ts-ignore\r\n utag.link({ event: eventName, event_category: eventCategory, event_action: eventAction, event_label: eventLabel, event_noninteraction: 'false' });\r\n if (MsDyn365.isBrowser) {\r\n !isOpenInNewTab ? window.location.href = clpMobileRootLink : window.open(clpMobileRootLink);\r\n }\r\n }\r\n }\r\n }\r\n >\r\n {this.mobileRoot.clpLinkText}\r\n }\r\n \r\n :\r\n showSubMenuHeader &&\r\n \r\n {this.props.resources.backButtonAriaLabel}\r\n \r\n {this.parentMenu?.linkText &&\r\n {\r\n const telemetryContent = getTelemetryObject(\r\n 'Navigation Header',\r\n this.props.friendlyName,\r\n this.props.telemetry\r\n );\r\n const payLoad = getPayloadObject('click', telemetryContent, 'Nav', '');\r\n // @ts-ignore\r\n payLoad.contentAction.linkText = this.parentMenu?.linkText;\r\n onTelemetryClick(telemetryContent, payLoad, 'Nav')();\r\n // @ts-ignore\r\n if (utag) {\r\n event.preventDefault();\r\n const isExternal = isExternalLink(this.parentMenu?.linkURL);\r\n const eventName = isExternal ? 'outbound-general-link-click' : 'internal-navigation';\r\n const eventCategory = isExternal ? 'outbound links' : 'internal links';\r\n const internalDestinationUrl = this.parentMenu!.linkURL! === '/' ? '/' : this.parentMenu!.linkURL!;\r\n const internalLocalUrl = MsDyn365.isBrowser && (window.location.href === '/' ? '/' : window.location.href.split(location.host)[1].split('?')[0]);\r\n const eventAction = isExternal ? `to: ${this.parentMenu!.linkURL!}` : `to: ${internalDestinationUrl}`;\r\n const eventLabel = isExternal ? `from: ${MsDyn365.isBrowser && window.location.href}` : `from header: ${this.state.activeMenuLabels?.join(' > ')}: ${internalLocalUrl}`;\r\n const isOpenInNewTab = this.mobileRoot?.openInNewTab;\r\n // @ts-ignore\r\n utag.link({ event: eventName, event_category: eventCategory, event_action: eventAction, event_label: eventLabel, event_noninteraction: 'false' });\r\n if (MsDyn365.isBrowser) {\r\n !isOpenInNewTab ? window.location.href = this.parentMenu!.linkURL! : window.open(this.parentMenu!.linkURL);\r\n }\r\n }\r\n }\r\n }\r\n >\r\n {this.parentMenu.linkText}\r\n }\r\n {this.parentMenu?.clpLinkText && this.parentMenu.clpLink?.destinationUrl &&\r\n {\r\n const telemetryContent = getTelemetryObject(\r\n 'Navigation Header',\r\n this.props.friendlyName,\r\n this.props.telemetry\r\n );\r\n const payLoad = getPayloadObject('click', telemetryContent, 'Nav', '');\r\n // @ts-ignore\r\n payLoad.contentAction.linkText = this.parentMenu?.clpLinkText;\r\n onTelemetryClick(telemetryContent, payLoad, 'Nav')();\r\n // @ts-ignore\r\n if (utag) {\r\n event.preventDefault();\r\n const clpParentMenuLink = navLinkKeywordRemoval(this.parentMenu!.clpLink?.destinationUrl || '', this.props.context.request);\r\n const isExternal = isExternalLink(this.parentMenu?.clpLink?.destinationUrl);\r\n const eventName = isExternal ? 'outbound-general-link-click' : 'internal-navigation';\r\n const eventCategory = isExternal ? 'outbound links' : 'internal links';\r\n const internalDestinationUrl = clpParentMenuLink === '/' ? '/' : clpParentMenuLink;\r\n const internalLocalUrl = MsDyn365.isBrowser && (window.location.href === '/' ? '/' : window.location.href.split(location.host)[1].split('?')[0]);\r\n const eventAction = isExternal ? `to: ${clpParentMenuLink}` : `to: ${internalDestinationUrl}`;\r\n const eventLabel = isExternal ? `from: ${MsDyn365.isBrowser && window.location.href}` : `from header: ${this.state.activeMenuLabels?.join(' > ')}: ${internalLocalUrl}`;\r\n const isOpenInNewTab = this.mobileRoot?.openInNewTab;\r\n // @ts-ignore\r\n utag.link({ event: eventName, event_category: eventCategory, event_action: eventAction, event_label: eventLabel, event_noninteraction: 'false' });\r\n if (MsDyn365.isBrowser) {\r\n !isOpenInNewTab ? window.location.href = clpParentMenuLink : window.open(clpParentMenuLink);\r\n }\r\n }\r\n }\r\n }\r\n >\r\n {this.parentMenu.clpLinkText}\r\n }\r\n \r\n }\r\n {menuOptions}\r\n {\r\n categoryImageDisplay && this.state.categoryImage && (\r\n \r\n {this.state.categoryImage && this._getCategoryImage(this.state.categoryImage)}\r\n \r\n )\r\n }\r\n \r\n );\r\n }\r\n\r\n private _updateCategoryImage = (categoryImageSrc: string) => () => {\r\n this.setState({\r\n categoryImage: categoryImageSrc !== '' ? categoryImageSrc : 'empty'\r\n });\r\n };\r\n\r\n private _handleOnClick = (data: IMenuItemData, parentId?: number) => () => {\r\n const telemetryContent = getTelemetryObject('Navigation Header', this.props.friendlyName, this.props.telemetry);\r\n const payLoad = getPayloadObject('click', telemetryContent, 'Nav', '');\r\n // @ts-ignore\r\n onTelemetryClick(telemetryContent, payLoad, 'Nav')();\r\n if (MsDyn365.isBrowser) {\r\n if (!parentId && data.linkURL) {\r\n window.location.href = data.linkURL;\r\n }\r\n }\r\n };\r\n\r\n private _handleDropdownToggle = (data: IMenuItemData, parentId?: number) => () => {\r\n // VSI Customization - start\r\n let updatedActiveMenu;\r\n let updatedActiveMenuLabels;\r\n if (this.state.activeMenu) {\r\n if (this.state.activeMenu[this.state.activeMenu.length - 1] !== data.id) {\r\n updatedActiveMenu = data.id && this.state.activeMenu.concat(data.id);\r\n updatedActiveMenuLabels = data.linkText && this.state.activeMenuLabels!.concat(data.linkText);\r\n } else {\r\n updatedActiveMenu = this.state.activeMenu;\r\n updatedActiveMenuLabels = this.state.activeMenuLabels;\r\n }\r\n } else {\r\n updatedActiveMenu = data.id && [data.id];\r\n updatedActiveMenuLabels = data.linkText && [data.linkText];\r\n }\r\n if (typeof (updatedActiveMenu) === 'number') { updatedActiveMenu = [updatedActiveMenu]; }\r\n if (typeof (updatedActiveMenuLabels) === 'string') { updatedActiveMenuLabels = [updatedActiveMenuLabels]; }\r\n\r\n // set root of mobile menu to display above submenu\r\n if (this.props.isMobileView && (!this.state.activeMenu || !this.state.activeMenu.length)) {\r\n this.mobileRoot = data;\r\n // toggle mobile links\r\n this._toggleMobileLinks(true);\r\n }\r\n\r\n // show modal\r\n const showModal = !!(updatedActiveMenu && updatedActiveMenu.length);\r\n\r\n updatedActiveMenu && this.setState({\r\n activeMenu: updatedActiveMenu,\r\n activeMenuLabels: updatedActiveMenuLabels,\r\n parentMenu: parentId,\r\n showModal: showModal\r\n });\r\n\r\n if (this.props.showCategoryImage) {\r\n this._updateCategoryImage(data.imageSource!)();\r\n }\r\n\r\n // VSI Customization - end\r\n this._resetFocus();\r\n };\r\n\r\n private _handleGoBack = () => () => {\r\n // VSI Customization - start\r\n const updatedActiveMenu = this.state.activeMenu;\r\n const updatedActiveMenuLabels = this.state.activeMenuLabels;\r\n const finalUpdate = updatedActiveMenu && updatedActiveMenu.length > 1 ? updatedActiveMenu.slice(0, updatedActiveMenu.length - 1) : undefined;\r\n const finalUpdateMenuLabels = updatedActiveMenuLabels && updatedActiveMenuLabels.length > 1 ? updatedActiveMenuLabels.slice(0, updatedActiveMenuLabels.length - 1) : undefined;\r\n\r\n // toggle mobile links\r\n !finalUpdate && this._toggleMobileLinks(false);\r\n\r\n // parent set to undefined when on the root menu so back button doesn't show up\r\n const newParentMenu = this.state.activeMenu && this.state.activeMenu.length === 2;\r\n newParentMenu ? this.setState({ activeMenu: finalUpdate, activeMenuLabels: finalUpdateMenuLabels, parentMenu: undefined }) : this.setState({ activeMenu: finalUpdate, activeMenuLabels: finalUpdateMenuLabels });\r\n\r\n // VSI Customization - end\r\n this._resetFocus();\r\n };\r\n\r\n private _resetFocus = () => {\r\n if (this.props.isMobileView) {\r\n MsDyn365.isBrowser && setTimeout(() => {\r\n this.menuNode && this.menuNode.current && this.menuNode.current.focus();\r\n }, 0);\r\n }\r\n };\r\n\r\n private _toggleMobileLinks = (result: boolean): void => {\r\n const navMenuState = this.props.data.navMenuState?.result;\r\n if (navMenuState) {\r\n // This will directly update our application state, which should trigger all modules observing the state to update\r\n this.props.context.actionContext.update(new NavMenuStateInput(), { ...navMenuState, isMenuHasParent: result });\r\n }\r\n };\r\n\r\n private _closeSubmenu(): void {\r\n // VSI Customization - start\r\n this.setState({ activeMenu: undefined, activeMenuLabels: undefined, mobileViewLabelText: '', parentMenu: undefined, showModal: false, categoryImage: null });\r\n // VSI Customization - end\r\n }\r\n\r\n private _getCategoryImage = (categoryImage: string): React.ReactNode | null => {\r\n const categoryImageUrl = generateImageUrl(`${categoryImage}`, this.props.context.actionContext.requestContext.apiSettings);\r\n const defaultImageSettings: IImageSettings = {\r\n viewports: {\r\n xs: { q: 'w=300&h=250&m=8', w: 0, h: 0 },\r\n sm: { q: 'w=300&h=250&m=8', w: 0, h: 0 },\r\n md: { q: 'w=300&h=250&m=8', w: 0, h: 0 },\r\n lg: { q: 'w=300&h=250&m=8', w: 0, h: 0 }\r\n },\r\n lazyload: true\r\n };\r\n if (categoryImageUrl !== undefined) {\r\n const ImageData: IImageData = { src: categoryImageUrl };\r\n return (\r\n \r\n );\r\n }\r\n return null;\r\n };\r\n}\r\n\r\nexport default MfrmNavigationMenuView;","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-navigation-menu'] = {\n c: () => require('partner/modules/mfrm-navigation-menu/mfrm-navigation-menu.tsx'),\n $type: 'contentModule',\n da: [{name:'categories', path:'@msdyn365-commerce-modules/retail-actions/dist/lib/get-categories-hierarchy', runOn: 0},{name:'navMenuState', path:'data-actions/navigation-menu-state-data-action', runOn: 0}],\n \n iNM: false,\n ns: '__local__',\n n: 'mfrm-navigation-menu',\n p: '__local__',\n \n pdp: '',\n \n \n md: 'src/modules/mfrm-navigation-menu'\n });\n \n\n {\n const sanitizedActionPath = '@msdyn365-commerce-modules/retail-actions/dist/lib/get-categories-hierarchy';\n let dataAction = require('@msdyn365-commerce-modules/retail-actions/dist/lib/get-categories-hierarchy');\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 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-navigation-menu|mfrm-navigation-menu'] = {\n c: () => require('partner/modules/mfrm-navigation-menu/mfrm-navigation-menu.view.tsx'),\n cn: '__local__-__local__-mfrm-navigation-menu'\n };\nwindow.__bindings__ = window.__bindings__ || {};\nwindow.__bindings__.viewDictionary = {\n ...window.__bindings__.viewDictionary || {},\n ...viewDictionary\n };","module.exports = React;","module.exports = ReactDOM;"],"names":["context","MsDyn365","window","innerWidth","gridSettings","request","xs","w","sm","md","lg","isExternalLink","url","tmp","document","createElement","href","host","location","canonicalURL","requestContext","requestUrl","origin","path","pathname","toLowerCase","urlParts","split","splice","match","removePipeSignValue","removeKeywords","filteredPath","join","filteredURL","undefined","length","filter","urlPart","indexOf","removeKeywordFromUrl","app","config","removeKeywordFromUrlArray","trim","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","recordId","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","NavMenuStateInput","constructor","getCacheKey","getCacheObjectType","dataCacheType","navMenuStateAction","input","ctx","isMenuHasParent","isMobileMenuCollapsed","selectedNavMenu","menuItemData","createObservableDataAction","action","inputData","navigationMenuSource","NavigationMenu","React","props","super","CMSItemIdInit","RSItemIdInit","isRetail","isCMS","_setNavigationSource","sourceType","retailServerOnly","this","cmsOnly","all","updateViewPort","viewport","_getViewPort","setState","isMobile","state","menuItemList","cookies","Cookies","expiryDateTracking","Date","setDate","getDate","set","expires","expiryDateUser","expiryDateInMonths","setMonth","getMonth","cjeventValue","query","cjevent","secure","httpOnly","sameSite","locale","nameTranslations","nameTranslation","find","item","Language","Text","componentDidMount","resizeThrottledEventHandler","addThrottledEvent","componentWillUnmount","removeEventListener","render","_mapData","isEmptyOrNullObject","data","telemetry","warning","viewProps","imageSettings","viewports","q","h","xl","lazyload","Navigation","moduleProps","className","classnames","tag","role","resources","menuAriaLabel","MenuList","ListItem","showCategoryImage","displayCategoryImage","Link","DivContainer","ImageDivContainer","Button","onClick","ImageContainer","Span","MobileDescriptionContainer","MobileBackButton","backButtonAriaLabel","MobileDescriptionLabel","isMobileView","renderView","mergedData","categories","result","index","_constructMenuItemData","cmsNavItems","idx","_constructTopMenuItemData","enabletopMenu","mergedRootMenuData","topMenu","id","linkText","rootMenuNavigation","linkURL","imageSource","subMenu","retailItem","cmsItem","addedAllMenu","imageSouce","Images","Uri","getFriendlyName","NameTranslations","Url","_getNestedChildren","linkUrl","destinationUrl","linkType","type","imageDestinationURL","imageLink","image","src","menuItemColorMobile","menuItemColorDesktop","categoryBannerNames","mattressMatcherBannerID","clpLink","clpLinkText","openInNewTab","_getCMSNestedChildren","category","imageSourceUrl","nestedChildren","Children","allCategoryMenuText","getCategoryUrl","subMenus","__decorate","observable","MfrmNavigationMenuView","activeIndex","currentSubMenu","possibleParentMenus","currentLevel","isWmap","pathName","makeaPaymentLink","wmapPageUrlSuffix","includes","_updateCategoryImage","categoryImageSrc","categoryImage","_handleOnClick","parentId","telemetryContent","getTelemetryObject","friendlyName","payLoad","getPayloadObject","onTelemetryClick","_handleDropdownToggle","updatedActiveMenu","updatedActiveMenuLabels","activeMenu","concat","activeMenuLabels","mobileRoot","_toggleMobileLinks","showModal","parentMenu","_resetFocus","_handleGoBack","finalUpdate","slice","finalUpdateMenuLabels","setTimeout","menuNode","current","focus","navMenuState","actionContext","update","_getCategoryImage","categoryImageUrl","generateImageUrl","apiSettings","defaultImageSettings","ImageData","Image","Object","categoryImageSettings","loadFailureBehavior","mobileViewLabelText","dataShared","_closeSubmenu","bind","telemetryPageName","componentDidUpdate","collection","getElementsByTagName","i","getAttribute","setAttribute","linkList","Node","_displayMenuItemData","hasOwnProperty","emitCategories","JSON","stringify","style","display","Module","ref","tabIndex","_renderDisplay","key","onMouseLeave","_createMenuItemList","allMenuItemArray","currentMenu","subMenuIndex","nestedSubMenuIndex","nestedSubMenu","doublyNestedSubMenuIndex","doublyNestedSubMenu","_renderButtonMenuItem","_renderSubMenu","_renderLinkMenuItem","_renderSpanMenuItem","IsSubMenu","enableMultiSupportMenu","enableMultilevelMenu","multiLevelSupportedMenu","menuLevelSupport","levelClassName","menuItems","isLastSubMenu","isLastParent","option","haveSubmenu","Math","round","menuItem","menu","toString","_renderMenu","isRoot","attributes","getTelemetryAttributes","attribute","onMouseOver","onFocus","menuItemColor","color","hoverEffect","imagesource","contentAction","etext","event","_handleOnClickMenuItem","utag","preventDefault","isExternal","eventName","eventCategory","internalDestinationUrl","internalLocalUrl","eventAction","eventLabel","event_category","event_action","event_label","event_noninteraction","open","level","menuOptions","currentItem","submenu","categoryImageDisplay","showSubMenuHeader","showRootData","CoreButton","isOpenInNewTab","clpMobileRootLink","clpParentMenuLink","binding","modules","dataActions","registerSanitizedActionPath","sanitizedActionPath","dataAction","default","Error","prototype","RegistrationId","c","require","$type","da","name","runOn","iNM","ns","n","p","pdp","__bindings__","viewDictionary","cn","module","exports","ReactDOM"],"sourceRoot":""}