{"version":3,"sources":["webpack:///./src/themes/gardner-theme/views/components/navigation-menu-utilities.tsx?fbd2","webpack:///./src/themes/gardner-theme/views/components/navigation-menu-root-disabled.tsx?57df","webpack:///./src/themes/gardner-theme/views/components/navigation-menu-root-enabled.tsx?1fa6","webpack:///./src/themes/gardner-theme/views/navigation-menu.view.tsx?1dcf","webpack:///src/index.ts?c6ae","webpack:///src/modules/adventureworks/views/components/navigation-menu-utilities.tsx?9734","webpack:///src/modules/adventureworks/views/components/navigation-menu-root-disabled.tsx?8952","webpack:///src/modules/adventureworks/views/components/navigation-menu-root-enabled.tsx?083d","webpack:///src/modules/adventureworks/views/navigation-menu.view.tsx?c096","webpack:///src/modules/navigation-menu/navigation-menu.data.ts?a9f0","webpack:///src/modules/navigation-menu/navigation-menu.tsx?390c","webpack:///./src/themes/gardner-theme-b2c/views/components/navigation-menu-utilities.tsx?5026","webpack:///./src/themes/gardner-theme-b2c/views/components/navigation-menu-root-disabled.tsx?0e9a","webpack:///./src/themes/gardner-theme-b2c/views/components/navigation-menu-root-enabled.tsx?230c","webpack:///./src/themes/gardner-theme-b2c/views/navigation-menu.view.tsx?f8c1","webpack:///src/modules/navigation-menu/navigation-menu.view.tsx?df40"],"names":["NavMenuConstants","getCategoryImage","props","categoryImage","alttext","categoryImageUrl","generateImageUrl","navProps","context","actionContext","requestContext","apiSettings","defaultImageSettings","viewports","xs","q","w","h","sm","md","lg","lazyload","undefined","_props$navProps$confi","imageData","src","React","Msdyn365","Object","assign","className","gridSettings","request","imageSettings","config","categoryImageSettings","loadFailureBehavior","role","altText","NavigationMenuRootDisabled","constructor","super","supportedLevel","four","currentLevel","zero","escapeKey","promotionalImage","_toggleNavBar","this","setState","previousState","activeMenu","isNavOpen","_bindDesktopCategoryClick","desktopCategoryId","state","isDrawerOpen","_updateCategoryImage","categoryImageSource","option","linkText","ArrayExtensions","hasElements","promotionalContent","item","imageSource","image","push","text","additionalProperties","linkUrl","destinationUrl","_handleDropdownToggle","data","parentId","isOnlyMobile","isBackTrack","id","mobileViewLabelText","parentMenu","showCategoryImage","_handleGoBack","_handleClickOutside","event","menuNode","current","contains","target","_shouldAddFocusMenuRef","index","optionLinkText","_closeNavMenu","_escFunction","keyCode","_customUpdateViewport","menuItemRef","menuItemData","subMenu","imagesource","map","telemetryContent","getTelemetryObject","telemetryPageName","friendlyName","telemetry","payLoad","getPayloadObject","attributes","getTelemetryAttributes","isMobile","variant","VariantType","Browser","componentDidMount","customResizeThrottledEventHandler","addThrottledEvent","window","document","addEventListener","body","componentDidUpdate","_this$menuItemRef$cur","children","isMobileView","focus","componentWillUnmount","removeEventListener","render","Node","ref","_renderMobileMenu","Button","onClick","title","resources","hamburgerAriaLabel","_renderCollapseMenu","Collapse","isOpen","_renderDesktopMenu","MenuList","MobileBackButton","MobileDescriptionContainer","MobileDescriptionLabel","Navigation","Module","classnames","tabIndex","_renderDisplay","_renderDrawerLink","linkURL","StringExtensions","isNullOrWhitespace","_renderLinkMenuItem","_renderSpanMenuItem","ListItem","menuItemList","menuItem","_getFromSubMenu","key","_createMenuItemList","entries","parentMenuId","menu","length","one","Number","found","_renderSubMenu","_renderButtonMenuItem","subMenuArray","isSubMenu","_this$props$navProps$","_this$props$navProps$2","subMenus","rootMenu","filter","subMenuItem","MenuTypeIndexId","Retail","isEnableMultiSupportMenu","enableMultilevelMenu","multiLevelSupportedMenu","menuLevelSupport","three","error","levelClassName","menuOptions","hasOptions","getMenuItem","isHavingSubmenu","Math","round","two","_renderSubMenuDrawer","toString","onMouseOver","_renderMenu","_renderLinkMenuItemLevelOne","_menuItem$linkText","Drawer","collapseProps","timeout","openGlyph","closeGlyph","glyphPlacement","toggleButtonText","onToggle","menuSubItem","Link","contentAction","etext","href","shouldOpenNewTab","onTelemetryClick","isHoverEffect","arguments","_renderPromotionalLink","Span","level","isSubmenu","_this$state$categoryI","DivContainer","ImageDivContainer","showPromotionalContent","isCategoryImageDisplay","isPromotionalContentDisplay","divContainerClass","menuLevelSupportClassName","categoryImages","imagesContainerKey","join","_item$src","_item$additionalPrope","__decorate","computed","NavigationMenuRootEnabled","_addShopAllLink","_this$menuItemData$0$","shopAllObject","allCategoryMenuText","menuSource","MenuSource","unshift","rootMenuNavigation","cmsMenuData","retailMenuItemData","retailMenuData","JSON","parse","stringify","menuItemDatum","navigationMenuView","enabletopMenu","menuId","drawerKeyValue","newPair","_objectSpread","_this$menuNode$curren","_this$menuNode$curren2","_this$props$navProps$3","buttonText","keys","colProps","ariaLabel","NavigationMenu","isRetail","isCMS","_setNavigationSource","sourceType","_updateViewport","bind","viewport","device","Type","navigationMenuSource","locale","nameTranslations","nameTranslation","find","Language","toLowerCase","Text","MsDyn365","isBrowser","resizeThrottledEventHandler","_this$props$config$di","_this$props$config$di2","_mapData","isEmptyOrNullObject","viewProps","xl","moduleProps","tag","displayCategoryImage","displayPromotionalImage","ImageContainer","backButtonAriaLabel","renderView","mergedData","categories","result","_constructMenuItemData","cmsNavItems","idx","_constructTopMenuItemData","_this$props$config$en","_this$props$config$ro","mergedRootMenuData","topMenu","retailItem","cmsItem","addedAllMenu","categoryPromotionalContent","cmsItemText","menuAriaLabel","promotionalData","promoItem","_promoItem$categoryNa","_retailItem$Name","categoryName","Name","_NavigationMenu$getFr","_NavigationMenu$getFr2","Images","Uri","RSItemIdInit","getFriendlyName","NameTranslations","Url","_getNestedChildren","CMSItemIdInit","imageDestinationURL","imageLink","_getCMSNestedChildren","Cms","openInNewTab","category","imageSourceUrl","nestedChildren","Children","getCategoryUrl","_getViewport","innerWidth","observable","NavigationMenuView","categoryImageSrc","imageSrc","promotionalItemImageSettings","categoryImageAltText","_handleFocusOutside","relatedTarget","_closeSubmenu","_getCategoryImage","_ref","_categoryImage$imageS","Image","forEach","i","IsSubMenu","enableMultiSupportMenu","haveSubmenu","onFocus","hoverEffect","isParent","currentItem","submenu","categoryImageDisplay","promotionalContentDisplay","DivContainerClass"],"mappings":"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","file":"static/js/21.8cd104e375b70779212d.chunk.js","sourcesContent":["/*--------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * See License.txt in the project root for license information.\r\n *--------------------------------------------------------------*/\r\n\r\nimport * as Msdyn365 from '@msdyn365-commerce/core';\r\nimport { INavigationMenuViewProps } from '@msdyn365-commerce-modules/navigation-menu';\r\nimport { generateImageUrl } from '@msdyn365-commerce-modules/retail-actions';\r\nimport * as React from 'react';\r\n\r\nimport { INavigationMenuProps } from '../../definition-extensions/navigation-menu.ext.props.autogenerated';\r\n\r\n/**\r\n * INavigationMenuViewRootProps.\r\n */\r\nexport interface INavigationMenuViewRootProps {\r\n navProps: INavigationMenuViewProps & INavigationMenuProps<{}>;\r\n}\r\n\r\n/**\r\n * Represent navigation menu state interface.\r\n */\r\nexport interface INavigationState {\r\n parentMenu?: number;\r\n activeMenu?: number;\r\n categoryImage?: Msdyn365.IImageData[] | null;\r\n mobileViewLabelText?: string;\r\n isDrawerOpen: boolean;\r\n desktopCategoryId: number;\r\n isOnlyMobile: boolean;\r\n isNavOpen: boolean;\r\n}\r\n\r\n/**\r\n * NavMenuConstants enum.\r\n */\r\nexport enum NavMenuConstants {\r\n zero = 0,\r\n one = 1,\r\n two = 2,\r\n three = 3,\r\n four = 4,\r\n escapeKey = 27,\r\n rootMenu = 1\r\n}\r\n\r\n/**\r\n * GridSizes.\r\n */\r\nexport type GridSize = 'xs' | 'sm' | 'md' | 'lg' | 'xl';\r\n\r\n/**\r\n * Get category image.\r\n * @param props - Navigation menu props.\r\n * @param categoryImage - Category Image.\r\n * @param alttext - AltText String.\r\n * @returns Returns Node.\r\n */\r\nexport const getCategoryImage = (props: INavigationMenuViewRootProps, categoryImage: string, alttext: string): React.ReactNode | null => {\r\n\r\n const categoryImageUrl = generateImageUrl(`${categoryImage}`, props.navProps.context.actionContext.requestContext.apiSettings);\r\n const defaultImageSettings: Msdyn365.IImageSettings = {\r\n viewports: {\r\n xs: { q: 'w=162&h=162&m=8', w: 0, h: 0 },\r\n sm: { q: 'w=162&h=162&m=8', w: 0, h: 0 },\r\n md: { q: 'w=203&h=203&m=8', w: 0, h: 0 },\r\n lg: { q: 'w=203&h=203&m=8', w: 0, h: 0 }\r\n },\r\n lazyload: true\r\n };\r\n if (categoryImageUrl !== undefined) {\r\n const imageData: Msdyn365.IImageData = { src: categoryImageUrl };\r\n return (\r\n \r\n );\r\n }\r\n return null;\r\n};\r\n","/*--------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * See License.txt in the project root for license information.\r\n *--------------------------------------------------------------*/\r\n\r\nimport * as Msdyn365 from '@msdyn365-commerce/core';\r\nimport { IMenuItemData, MenuTypeIndexId } from '@msdyn365-commerce-modules/navigation-menu';\r\nimport { ArrayExtensions, StringExtensions } from '@msdyn365-commerce-modules/retail-actions';\r\nimport {\r\n addThrottledEvent,\r\n Button,\r\n Collapse, Drawer,\r\n getPayloadObject,\r\n getTelemetryAttributes,\r\n getTelemetryObject,\r\n IPayLoad,\r\n isMobile,\r\n ITelemetryContent,\r\n Module,\r\n Node,\r\n onTelemetryClick,\r\n VariantType\r\n} from '@msdyn365-commerce-modules/utilities';\r\nimport classnames from 'classnames';\r\nimport { computed } from 'mobx';\r\nimport * as React from 'react';\r\n\r\nimport { getCategoryImage, INavigationMenuViewRootProps, INavigationState, NavMenuConstants } from './navigation-menu-utilities';\r\n\r\n/**\r\n *\r\n * NavigationMenuRootDisabled component.\r\n * @extends {React.PureComponent}\r\n */\r\nexport class NavigationMenuRootDisabled extends React.PureComponent {\r\n private static isBackTrack: boolean = false;\r\n\r\n private readonly supportedLevel: number = NavMenuConstants.four;\r\n\r\n private currentLevel: number = NavMenuConstants.zero;\r\n\r\n private readonly menuNode: React.RefObject;\r\n\r\n private readonly menuItemRef: React.RefObject;\r\n\r\n private readonly escapeKey: number = NavMenuConstants.escapeKey;\r\n\r\n private readonly telemetryContent: ITelemetryContent;\r\n\r\n private readonly promotionalImage: Msdyn365.IImageData[] = [];\r\n\r\n private readonly payLoad: IPayLoad;\r\n\r\n private readonly attributes?: Msdyn365.IDictionary;\r\n\r\n private customResizeThrottledEventHandler?: (event: Event) => void;\r\n\r\n public constructor(props: INavigationMenuViewRootProps) {\r\n super(props);\r\n this.menuNode = React.createRef();\r\n this.menuItemRef = React.createRef();\r\n const { menuItemData } = this.props.navProps;\r\n if (ArrayExtensions.hasElements(menuItemData) && ArrayExtensions.hasElements(menuItemData[0].subMenu)) {\r\n const imagesource = menuItemData[0].subMenu[0].imageSource ? menuItemData[0].subMenu[0].imageSource : '';\r\n const linkText = menuItemData[0].subMenu[0].linkText ? menuItemData[0].subMenu[0].linkText : '';\r\n this.promotionalImage = [{ src: imagesource, altText: linkText }];\r\n\r\n // Read category and promotional image in one array\r\n if (ArrayExtensions.hasElements(menuItemData[0].subMenu[0].promotionalContent)) {\r\n menuItemData[0].subMenu[0].promotionalContent.map(item => {\r\n const imageSource = item.image.src;\r\n this.promotionalImage.push({ src: imageSource, altText: item.text, additionalProperties: { linkUrl: item.linkUrl.destinationUrl } });\r\n return null;\r\n });\r\n }\r\n }\r\n this.state = {\r\n activeMenu: 1,\r\n mobileViewLabelText: '',\r\n parentMenu: undefined,\r\n isDrawerOpen: false,\r\n desktopCategoryId: -1,\r\n isOnlyMobile: this.isOnlyMobile,\r\n categoryImage: this.promotionalImage,\r\n isNavOpen: false\r\n };\r\n this.telemetryContent = getTelemetryObject(this.props.navProps.context.request.telemetryPageName!,\r\n this.props.navProps.friendlyName,\r\n this.props.navProps.telemetry);\r\n this.payLoad = getPayloadObject('click', this.telemetryContent, '', '');\r\n this.attributes = getTelemetryAttributes(this.telemetryContent, this.payLoad);\r\n }\r\n\r\n @computed public get isOnlyMobile(): boolean {\r\n return (isMobile({ variant: VariantType.Browser, context: this.props.navProps.context.request }) === 'xs');\r\n }\r\n\r\n public componentDidMount(): void {\r\n this.customResizeThrottledEventHandler = addThrottledEvent(window, 'resize', this._customUpdateViewport as EventListener);\r\n document.addEventListener('keydown', (this._escFunction as unknown) as EventListener, false);\r\n this._customUpdateViewport();\r\n document.body.addEventListener('mousedown', this._handleClickOutside);\r\n }\r\n\r\n public componentDidUpdate(): void {\r\n if (this.menuItemRef.current?.children[0] && this.props.navProps.isMobileView) {\r\n (this.menuItemRef.current.children[0] as HTMLElement).focus();\r\n }\r\n }\r\n\r\n public componentWillUnmount(): void {\r\n window.removeEventListener('resize', this.customResizeThrottledEventHandler!, false);\r\n document.body.removeEventListener('mousedown', this._handleClickOutside, false);\r\n }\r\n\r\n public render(): JSX.Element | null {\r\n this.currentLevel = 1;\r\n const navbarKey = 'header-nav-mobile';\r\n return (\r\n \r\n {\r\n this.state.isOnlyMobile ? this._renderMobileMenu() : (<>\r\n \r\n {this._renderCollapseMenu()}\r\n )\r\n }\r\n \r\n );\r\n }\r\n\r\n /**\r\n * Function to handle nav bar toggle.\r\n */\r\n private readonly _toggleNavBar = (): void => {\r\n this.setState(previousState => ({\r\n activeMenu: 1,\r\n isNavOpen: !previousState.isNavOpen\r\n }));\r\n };\r\n\r\n private _renderCollapseMenu(): JSX.Element | null {\r\n return (\r\n \r\n {this.state.isOnlyMobile ? this._renderMobileMenu() : this._renderDesktopMenu()}\r\n \r\n );\r\n }\r\n\r\n private _renderMobileMenu(): JSX.Element {\r\n const { MenuList, MobileBackButton, MobileDescriptionContainer, MobileDescriptionLabel, Navigation } = this.props.navProps;\r\n\r\n this.currentLevel = 1;\r\n return (\r\n \r\n \r\n {this.state.isOnlyMobile && this.state.activeMenu !== undefined &&\r\n \r\n \r\n \r\n {this.state.mobileViewLabelText}\r\n \r\n }\r\n {this._renderDisplay()}\r\n \r\n \r\n );\r\n }\r\n\r\n private _renderDesktopMenu(): JSX.Element {\r\n const { MenuList, Navigation } = this.props.navProps;\r\n\r\n return (\r\n \r\n \r\n {this._renderDisplay()}\r\n
\r\n
\r\n
\r\n
\r\n );\r\n }\r\n\r\n private _renderDrawerLink(item: IMenuItemData): JSX.Element | null {\r\n if (item.linkURL && !StringExtensions.isNullOrWhitespace(item.linkURL)) {\r\n return (\r\n this._renderLinkMenuItem(item)\r\n );\r\n } else if (!item.linkURL) {\r\n return (\r\n this._renderSpanMenuItem(item)\r\n );\r\n }\r\n return null;\r\n }\r\n\r\n private _renderDisplay(): JSX.Element[] {\r\n const { ListItem } = this.props.navProps;\r\n const menuItemData: IMenuItemData[] = this.props.navProps.menuItemData;\r\n const { activeMenu } = this.state;\r\n const menuItemList: JSX.Element[] = [];\r\n\r\n if (ArrayExtensions.hasElements(menuItemData)) {\r\n menuItemData[0].id = 1;\r\n }\r\n\r\n if (this.state.isOnlyMobile && activeMenu !== undefined && ArrayExtensions.hasElements(menuItemData)) {\r\n const menuItem = this._getFromSubMenu(undefined, menuItemData);\r\n\r\n if (menuItem) {\r\n menuItemList.push(\r\n \r\n {' '}\r\n {this._createMenuItemList(menuItem)}\r\n {' '}\r\n \r\n );\r\n }\r\n } else {\r\n\r\n for (const [index, item] of menuItemData.entries()) {\r\n menuItemList.push(\r\n \r\n {this._createMenuItemList(item)}\r\n
\r\n );\r\n }\r\n\r\n }\r\n\r\n return menuItemList;\r\n }\r\n\r\n private _getFromSubMenu(parentMenuId?: number, menu?: IMenuItemData[]): IMenuItemData | null {\r\n if (!menu) {\r\n return null;\r\n }\r\n\r\n for (let index = 0; index <= menu.length - NavMenuConstants.one; index++) {\r\n const item: IMenuItemData = menu[Number(index)];\r\n\r\n if (item.id === this.state.activeMenu) {\r\n if (!NavigationMenuRootDisabled.isBackTrack) {\r\n this.setState({ parentMenu: parentMenuId });\r\n } else {\r\n this.setState({ parentMenu: parentMenuId, mobileViewLabelText: item.linkText });\r\n }\r\n return item;\r\n }\r\n const found = this._getFromSubMenu(item.id, item.subMenu);\r\n if (found) {\r\n return found;\r\n }\r\n }\r\n return null;\r\n }\r\n\r\n private _createMenuItemList(menuItemData: IMenuItemData): JSX.Element | null {\r\n if (ArrayExtensions.hasElements(menuItemData.subMenu)) {\r\n if (this.state.isOnlyMobile && this.state.activeMenu !== undefined) {\r\n return (this._renderSubMenu(menuItemData.subMenu, menuItemData.id, false));\r\n }\r\n\r\n return (\r\n <>\r\n {this._renderButtonMenuItem(menuItemData)}\r\n {this._renderSubMenu(menuItemData.subMenu, menuItemData.id)}\r\n \r\n );\r\n\r\n } else if (menuItemData.linkURL && !StringExtensions.isNullOrWhitespace(menuItemData.linkURL)) {\r\n return (this._renderLinkMenuItem(menuItemData, menuItemData.id));\r\n } else if (!menuItemData.linkURL && !(this.state.isOnlyMobile && this.state.activeMenu !== undefined)) {\r\n return (this._renderSpanMenuItem(menuItemData));\r\n }\r\n\r\n return null;\r\n }\r\n\r\n private _renderSubMenu(subMenuArray?: IMenuItemData[], activeMenu?: number, isSubMenu?: boolean): JSX.Element | null {\r\n\r\n let subMenus: IMenuItemData[] | undefined = subMenuArray;\r\n if (activeMenu === NavMenuConstants.rootMenu) {\r\n subMenus = subMenuArray!.filter(subMenuItem => (subMenuItem.id && subMenuItem.id >= MenuTypeIndexId.Retail));\r\n }\r\n\r\n const { ListItem } = this.props.navProps;\r\n const isEnableMultiSupportMenu = this.props.navProps.config.enableMultilevelMenu ?? false;\r\n const multiLevelSupportedMenu = this.props.navProps.config.menuLevelSupport ?? NavMenuConstants.three;\r\n\r\n if (activeMenu && this.state.activeMenu !== activeMenu) {\r\n this.props.navProps.context.telemetry.error('Navigation Active menu content is empty, module wont render.');\r\n return null;\r\n }\r\n\r\n if (!subMenus || !ArrayExtensions.hasElements(subMenus)) {\r\n this.props.navProps.context.telemetry.error('Navigation Submenu content is empty, module wont render.');\r\n return null;\r\n }\r\n\r\n let levelClassName: string = '';\r\n const menuOptions = subMenus.map((option: IMenuItemData, index: number) => {\r\n const hasOptions = (option.subMenu && ArrayExtensions.hasElements(option.subMenu));\r\n let menuItem: JSX.Element | null;\r\n if (hasOptions && this.state.isOnlyMobile) {\r\n menuItem = this._renderButtonMenuItem(option, activeMenu, index);\r\n } else if (this.currentLevel === NavMenuConstants.one || !hasOptions) {\r\n menuItem = this.getMenuItem(option, index);\r\n } else {\r\n menuItem = null;\r\n }\r\n let subMenu;\r\n const isHavingSubmenu = hasOptions && isEnableMultiSupportMenu && (this.currentLevel <= Math.round(multiLevelSupportedMenu) - NavMenuConstants.one);\r\n\r\n if (hasOptions && !this.state.isOnlyMobile) {\r\n\r\n if (this.currentLevel >= NavMenuConstants.two) {\r\n levelClassName = 'level-3';\r\n subMenu = this._renderSubMenuDrawer(levelClassName, option);\r\n } else if (this.currentLevel <= this.supportedLevel) {\r\n this.currentLevel++;\r\n levelClassName = `level-${this.currentLevel.toString()}`;\r\n subMenu = this._renderSubMenu(option.subMenu, undefined, true);\r\n }\r\n }\r\n\r\n if (isHavingSubmenu && this.state.isOnlyMobile) {\r\n this.currentLevel++;\r\n levelClassName = isEnableMultiSupportMenu ? `level-${this.currentLevel.toString()}` : '';\r\n subMenu = this._renderSubMenu(option.subMenu, option.id, true);\r\n }\r\n const imagesource = option.imageSource ? option.imageSource : '';\r\n return (\r\n \r\n { menuItem}\r\n { subMenu}\r\n \r\n );\r\n });\r\n return (this._renderMenu(levelClassName, menuOptions, isSubMenu));\r\n }\r\n\r\n private getMenuItem(option: IMenuItemData, index: number): JSX.Element | null {\r\n let menuItem: JSX.Element | null;\r\n if (this.currentLevel === NavMenuConstants.one) {\r\n menuItem = (option.linkURL ? this._renderLinkMenuItemLevelOne(option, index) : this._renderSpanMenuItem(option));\r\n } else {\r\n menuItem = (option.linkURL ? this._renderLinkMenuItem(option, index) : this._renderSpanMenuItem(option));\r\n }\r\n return menuItem;\r\n }\r\n\r\n private _renderSubMenuDrawer(levelClassName: string, menuItem: IMenuItemData): JSX.Element | null {\r\n return (\r\n \r\n
\r\n {menuItem.subMenu!.map((menuSubItem: IMenuItemData) => {\r\n return this._renderDrawerLink(menuSubItem);\r\n })}\r\n
\r\n \r\n );\r\n }\r\n\r\n /**\r\n * Handle desktop category click.\r\n * @param desktopCategoryId - Desktop category id used to identify the index of the category.\r\n * @returns Returns void.\r\n */\r\n private readonly _bindDesktopCategoryClick = (desktopCategoryId: number) => (): void => {\r\n if (this.state.desktopCategoryId !== desktopCategoryId) {\r\n this.setState({ desktopCategoryId, isDrawerOpen: true });\r\n } else {\r\n this.setState({ desktopCategoryId: -1, isDrawerOpen: false });\r\n }\r\n };\r\n\r\n private _renderButtonMenuItem(option: IMenuItemData, activeMenu?: number, index?: number): JSX.Element | null {\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): JSX.Element | null {\r\n const { Link } = this.props.navProps;\r\n const linkText = option.linkText ? option.linkText : '';\r\n this.payLoad.contentAction.etext = linkText;\r\n const attributes = getTelemetryAttributes(this.telemetryContent, this.payLoad);\r\n return (\r\n \r\n { option.linkText}\r\n \r\n );\r\n }\r\n\r\n private _renderLinkMenuItemLevelOne(option: IMenuItemData, index?: number, isHoverEffect: boolean = true): JSX.Element | null {\r\n const { Link } = this.props.navProps;\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 return (\r\n \r\n { option.linkText}\r\n \r\n );\r\n }\r\n\r\n private _renderPromotionalLink(linkText?: string, linkUrl?: string): JSX.Element | null {\r\n const { Link } = this.props.navProps;\r\n this.payLoad.contentAction.etext = linkText;\r\n const attributes = getTelemetryAttributes(this.telemetryContent, this.payLoad);\r\n if (linkText && linkUrl) {\r\n return (\r\n \r\n { linkText}\r\n \r\n );\r\n }\r\n return null;\r\n\r\n }\r\n\r\n private _renderSpanMenuItem(option: IMenuItemData, index?: number): JSX.Element | null {\r\n const { Span } = this.props.navProps;\r\n return (\r\n \r\n { option.linkText}\r\n \r\n );\r\n }\r\n\r\n private _renderMenu(level: string, menuOptions: JSX.Element[], isSubmenu?: boolean): JSX.Element | null {\r\n const { DivContainer, MenuList, ImageDivContainer, showCategoryImage, showPromotionalContent } = this.props.navProps;\r\n const isCategoryImageDisplay =\r\n !this.state.isOnlyMobile && showCategoryImage && this.state.categoryImage !== null && this.state.categoryImage !== undefined && !isSubmenu;\r\n const isPromotionalContentDisplay =\r\n !this.state.isOnlyMobile && showPromotionalContent && ArrayExtensions.hasElements(this.state.categoryImage) && !isSubmenu;\r\n const divContainerClass = this.currentLevel > NavMenuConstants.two || isCategoryImageDisplay ? DivContainer!.className : 'ms-nav__deafult';\r\n this.currentLevel = NavMenuConstants.one;\r\n const menuLevelSupportClassName = isCategoryImageDisplay && this.props.navProps.config.menuLevelSupport &&\r\n this.props.navProps.config.menuLevelSupport > NavMenuConstants.two && 'navmenu-multi-level';\r\n\r\n const categoryImages = this.state.categoryImage?.filter(image => !StringExtensions.isNullOrWhitespace(image.src));\r\n const imagesContainerKey = categoryImages?.map(item => item.src).join('-');\r\n return (\r\n \r\n \r\n {menuOptions}\r\n \r\n
\r\n {\r\n isCategoryImageDisplay && ArrayExtensions.hasElements(categoryImages) && categoryImages.map(item => (\r\n \r\n { getCategoryImage(this.props, item.src ?? '', item.altText!.toString())}\r\n { isPromotionalContentDisplay && this._renderPromotionalLink(item.altText, item.additionalProperties?.linkUrl)}\r\n ))\r\n }\r\n
\r\n
\r\n );\r\n }\r\n\r\n /**\r\n * Handle Category image update.\r\n * @param categoryImageSource - Image source.\r\n * @param option - Menu Item data.\r\n * @returns Returns empty.\r\n */\r\n private readonly _updateCategoryImage = (categoryImageSource: string, option: IMenuItemData) => () => {\r\n const linkText = option.linkText ? option.linkText : '';\r\n const promotionalImage: Msdyn365.IImageData[] = [{ src: categoryImageSource, altText: linkText }];\r\n\r\n // Read category and promotional image in one array\r\n if (ArrayExtensions.hasElements(option.promotionalContent)) {\r\n for (const item of option.promotionalContent) {\r\n const imageSource = item.image.src;\r\n promotionalImage.push({ src: imageSource, altText: item.text, additionalProperties: { linkUrl: item.linkUrl.destinationUrl } });\r\n }\r\n }\r\n this.setState({\r\n categoryImage: ArrayExtensions.hasElements(promotionalImage) ? promotionalImage : [{ src: 'empty' }]\r\n });\r\n };\r\n\r\n /**\r\n * Handle dropdown toggle.\r\n * @param data - Menu Item data.\r\n * @param parentId - Number.\r\n * @returns Returns empty.\r\n */\r\n private readonly _handleDropdownToggle = (data: IMenuItemData, parentId?: number) => () => {\r\n if (!this.state.isOnlyMobile) {\r\n this.setState({\r\n activeMenu: data.id,\r\n parentMenu: parentId\r\n });\r\n if (this.props.navProps.showCategoryImage) {\r\n this._updateCategoryImage(data.imageSource!, data)();\r\n }\r\n } else {\r\n NavigationMenuRootDisabled.isBackTrack = false;\r\n this.setState({\r\n activeMenu: data.id,\r\n mobileViewLabelText: data.linkText!,\r\n parentMenu: parentId\r\n });\r\n }\r\n\r\n };\r\n\r\n /**\r\n * Handle back navigation for menu items for mobile view.\r\n * @returns Returns empty.\r\n */\r\n private readonly _handleGoBack = () => () => {\r\n NavigationMenuRootDisabled.isBackTrack = true;\r\n this.setState((previousState) => ({ activeMenu: previousState.parentMenu }));\r\n };\r\n\r\n /**\r\n * Function to close the nav menu on click on body.\r\n * @param event - MouseEvent.\r\n */\r\n private readonly _handleClickOutside = (event: MouseEvent) => {\r\n if (this.menuNode.current &&\r\n !this.menuNode.current.contains(event.target as Node)) {\r\n if (!this.state.isOnlyMobile) {\r\n this.setState({ activeMenu: 1, mobileViewLabelText: '', isNavOpen: false });\r\n } else {\r\n this.setState({ activeMenu: undefined, mobileViewLabelText: '', isNavOpen: false });\r\n }\r\n }\r\n };\r\n\r\n /**\r\n * Checks to assign a ref for focus.\r\n * @param index -Sub menu list index.\r\n * @param mobileViewLabelText -Mobile view label text.\r\n * @param optionLinkText -Sub menu item link text.\r\n * @returns Boolean.\r\n */\r\n private readonly _shouldAddFocusMenuRef = (index: number, mobileViewLabelText?: string, optionLinkText?: string) => {\r\n const firstIndex: number = 0;\r\n if (!NavigationMenuRootDisabled.isBackTrack && index === firstIndex) {\r\n return true;\r\n }\r\n if (!optionLinkText || !mobileViewLabelText) {\r\n return false;\r\n }\r\n return mobileViewLabelText === optionLinkText;\r\n };\r\n\r\n /**\r\n * Function to handle nav menu close.\r\n */\r\n private readonly _closeNavMenu = (): void => {\r\n if (!this.state.isOnlyMobile) {\r\n this.setState({ activeMenu: 1, mobileViewLabelText: '', isNavOpen: false });\r\n } else {\r\n this.setState({ activeMenu: undefined, mobileViewLabelText: '', isNavOpen: false });\r\n }\r\n };\r\n\r\n /**\r\n * Function to close the nav menu on esc key.\r\n * @param event - Event.\r\n */\r\n private readonly _escFunction = (event: React.KeyboardEvent) => {\r\n if (event.keyCode === this.escapeKey && !this.state.isOnlyMobile && this.state.isNavOpen) {\r\n this.setState({ activeMenu: 1, mobileViewLabelText: '', isNavOpen: false });\r\n }\r\n };\r\n\r\n /**\r\n * Custom update viewport.\r\n */\r\n private readonly _customUpdateViewport = (): void => {\r\n this.setState({ isOnlyMobile: this.isOnlyMobile });\r\n };\r\n}\r\n\r\nexport default NavigationMenuRootDisabled;\r\n","/*--------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * See License.txt in the project root for license information.\r\n *--------------------------------------------------------------*/\r\n\r\nimport * as Msdyn365 from '@msdyn365-commerce/core';\r\nimport { IMenuItemData, MenuSource, MenuTypeIndexId } from '@msdyn365-commerce-modules/navigation-menu';\r\nimport { ArrayExtensions, StringExtensions } from '@msdyn365-commerce-modules/retail-actions';\r\nimport {\r\n addThrottledEvent,\r\n Button,\r\n Collapse, Drawer,\r\n getPayloadObject,\r\n getTelemetryAttributes,\r\n getTelemetryObject,\r\n IPayLoad,\r\n isMobile,\r\n ITelemetryContent,\r\n Module,\r\n Node,\r\n onTelemetryClick,\r\n VariantType\r\n} from '@msdyn365-commerce-modules/utilities';\r\nimport classnames from 'classnames';\r\nimport { computed } from 'mobx';\r\nimport * as React from 'react';\r\n\r\nimport { getCategoryImage, INavigationMenuViewRootProps, INavigationState, NavMenuConstants } from './navigation-menu-utilities';\r\n\r\n/**\r\n *\r\n * NavigationMenuRootEnabled component.\r\n * @extends {React.PureComponent}\r\n */\r\nexport class NavigationMenuRootEnabled extends React.PureComponent {\r\n private static isBackTrack: boolean = false;\r\n\r\n private readonly supportedLevel: number = NavMenuConstants.four;\r\n\r\n private currentLevel: number = NavMenuConstants.zero;\r\n\r\n private readonly menuNode: React.RefObject;\r\n\r\n private readonly menuItemRef: React.RefObject;\r\n\r\n private readonly escapeKey: number = NavMenuConstants.escapeKey;\r\n\r\n private readonly telemetryContent: ITelemetryContent;\r\n\r\n private readonly promotionalImage: Msdyn365.IImageData[] = [];\r\n\r\n private menuItemData: IMenuItemData[] = [];\r\n\r\n private readonly payLoad: IPayLoad;\r\n\r\n private readonly attributes?: Msdyn365.IDictionary;\r\n\r\n private customResizeThrottledEventHandler?: (event: Event) => void;\r\n\r\n public constructor(props: INavigationMenuViewRootProps) {\r\n super(props);\r\n this.menuNode = React.createRef();\r\n this.menuItemRef = React.createRef();\r\n const { menuItemData } = this.props.navProps;\r\n if (ArrayExtensions.hasElements(menuItemData) && ArrayExtensions.hasElements(menuItemData[0].subMenu)) {\r\n const imagesource = menuItemData[0].subMenu[0].imageSource ? menuItemData[0].subMenu[0].imageSource : '';\r\n const linkText = menuItemData[0].subMenu[0].linkText ? menuItemData[0].subMenu[0].linkText : '';\r\n this.promotionalImage = [{ src: imagesource, altText: linkText }];\r\n\r\n // Read category and promotional image in one array\r\n if (ArrayExtensions.hasElements(menuItemData[0].subMenu[0].promotionalContent)) {\r\n menuItemData[0].subMenu[0].promotionalContent.map(item => {\r\n const imageSource = item.image.src;\r\n this.promotionalImage.push({ src: imageSource, altText: item.text, additionalProperties: { linkUrl: item.linkUrl.destinationUrl } });\r\n return null;\r\n });\r\n }\r\n }\r\n this.state = {\r\n activeMenu: NavMenuConstants.rootMenu,\r\n mobileViewLabelText: '',\r\n parentMenu: undefined,\r\n isDrawerOpen: false,\r\n desktopCategoryId: -1,\r\n isOnlyMobile: this.isOnlyMobile,\r\n categoryImage: this.promotionalImage,\r\n isNavOpen: false\r\n };\r\n\r\n this.telemetryContent = getTelemetryObject(this.props.navProps.context.request.telemetryPageName!,\r\n this.props.navProps.friendlyName,\r\n this.props.navProps.telemetry);\r\n this.payLoad = getPayloadObject('click', this.telemetryContent, '', '');\r\n this.attributes = getTelemetryAttributes(this.telemetryContent, this.payLoad);\r\n }\r\n\r\n @computed public get isOnlyMobile(): boolean {\r\n return (isMobile({ variant: VariantType.Browser, context: this.props.navProps.context.request }) === 'xs');\r\n }\r\n\r\n public componentDidMount(): void {\r\n this.customResizeThrottledEventHandler = addThrottledEvent(window, 'resize', this._customUpdateViewport as EventListener);\r\n document.addEventListener('keydown', (this._escFunction as unknown) as EventListener, false);\r\n this._customUpdateViewport();\r\n document.body.addEventListener('mousedown', this._handleClickOutside);\r\n this._addShopAllLink();\r\n }\r\n\r\n public componentDidUpdate(): void {\r\n if (this.menuItemRef.current?.children[0] && this.props.navProps.isMobileView) {\r\n (this.menuItemRef.current.children[0] as HTMLElement).focus();\r\n }\r\n }\r\n\r\n public componentWillUnmount(): void {\r\n window.removeEventListener('resize', this.customResizeThrottledEventHandler!, false);\r\n document.body.removeEventListener('mousedown', this._handleClickOutside, false);\r\n }\r\n\r\n public render(): JSX.Element | null {\r\n this.currentLevel = NavMenuConstants.one;\r\n const navbarKey = 'header-nav-mobile';\r\n return (\r\n \r\n {\r\n this.state.isOnlyMobile ? this._renderMobileMenu() : (<>\r\n {this.props.navProps.config.rootMenuNavigation}\r\n {this._renderCollapseMenu()}\r\n )\r\n }\r\n \r\n );\r\n }\r\n\r\n /**\r\n * Function to handle nav bar toggle.\r\n */\r\n private readonly _toggleNavBar = (): void => {\r\n this.setState(previousState => ({\r\n activeMenu: NavMenuConstants.rootMenu,\r\n isNavOpen: !previousState.isNavOpen\r\n }));\r\n };\r\n\r\n private _renderCollapseMenu(): JSX.Element | null {\r\n return (\r\n \r\n {this.state.isOnlyMobile ? this._renderMobileMenu() : this._renderDesktopMenu()}\r\n \r\n );\r\n }\r\n\r\n private _renderMobileMenu(): JSX.Element {\r\n const { MobileBackButton, MobileDescriptionContainer, MobileDescriptionLabel, Navigation } = this.props.navProps;\r\n\r\n this.currentLevel = NavMenuConstants.one;\r\n return (\r\n \r\n \r\n {this.state.isOnlyMobile && this.state.activeMenu !== undefined &&\r\n \r\n \r\n \r\n {this.state.mobileViewLabelText}\r\n \r\n }\r\n {this._renderDisplay()}\r\n \r\n \r\n );\r\n }\r\n\r\n private _renderDesktopMenu(): JSX.Element {\r\n const { Navigation } = this.props.navProps;\r\n return (\r\n \r\n \r\n {this._renderDisplay()}\r\n
\r\n
\r\n
\r\n
\r\n );\r\n }\r\n\r\n private _renderDrawerLink(item: IMenuItemData): JSX.Element | null {\r\n if (item.linkURL && !StringExtensions.isNullOrWhitespace(item.linkURL)) {\r\n return (\r\n this._renderLinkMenuItem(item)\r\n );\r\n } else if (!item.linkURL) {\r\n return (\r\n this._renderSpanMenuItem(item)\r\n );\r\n }\r\n return null;\r\n }\r\n\r\n private _renderDisplay(): JSX.Element[] {\r\n const { ListItem } = this.props.navProps;\r\n let menuItemData: IMenuItemData[] = [];\r\n if (this.state.isOnlyMobile) {\r\n menuItemData = this.menuItemData;\r\n } else {\r\n menuItemData = this.props.navProps.menuItemData;\r\n }\r\n const { activeMenu } = this.state;\r\n const menuItemList: JSX.Element[] = [];\r\n let cmsMenuData: IMenuItemData[] | undefined = [];\r\n let retailMenuItemData: IMenuItemData[] | undefined = [];\r\n const retailMenuData = JSON.parse(JSON.stringify(menuItemData)) as IMenuItemData[];\r\n\r\n for (const item of retailMenuData) {\r\n retailMenuItemData = item.subMenu!.filter(subMenuItem => (subMenuItem.id && subMenuItem.id >= MenuTypeIndexId.Retail));\r\n item.subMenu = retailMenuItemData;\r\n }\r\n\r\n for (const item of menuItemData) {\r\n cmsMenuData = item.subMenu!.filter(subMenuItem => (subMenuItem.id && subMenuItem.id < MenuTypeIndexId.Retail));\r\n }\r\n\r\n if (this.state.isOnlyMobile && activeMenu !== undefined && ArrayExtensions.hasElements(menuItemData)) {\r\n let menuItem: IMenuItemData | null = {};\r\n for (const menuItemDatum of menuItemData) {\r\n if (menuItemDatum.id === activeMenu) {\r\n menuItem = menuItemDatum;\r\n if (!NavigationMenuRootEnabled.isBackTrack) {\r\n this.setState({\r\n parentMenu: undefined\r\n });\r\n } else {\r\n this.setState({\r\n parentMenu: undefined,\r\n mobileViewLabelText: menuItemDatum.linkText\r\n });\r\n }\r\n break;\r\n }\r\n menuItem = this._getFromSubMenu(menuItemDatum);\r\n if (menuItem && menuItem.id === activeMenu) {\r\n break;\r\n }\r\n }\r\n\r\n if (menuItem) {\r\n menuItemList.push(\r\n \r\n {' '}\r\n {this._createMenuItemList(menuItem)}\r\n {' '}\r\n \r\n );\r\n }\r\n\r\n } else {\r\n for (const [index, item] of retailMenuData.entries()) {\r\n menuItemList.push(\r\n \r\n {this._createMenuItemList(item)}\r\n
\r\n );\r\n }\r\n\r\n for (const [index, item] of cmsMenuData.entries()) {\r\n menuItemList.push(\r\n \r\n {this._createMenuItemList(item)}\r\n \r\n );\r\n }\r\n }\r\n\r\n return menuItemList;\r\n }\r\n\r\n private _getFromSubMenu(item?: IMenuItemData): IMenuItemData | null {\r\n const subMenus = item?.subMenu;\r\n if (subMenus && ArrayExtensions.hasElements(subMenus)) {\r\n for (let index = 0; index <= subMenus.length - NavMenuConstants.one; index++) {\r\n const subMenu: IMenuItemData = subMenus[Number(index)];\r\n let parentMenuId = item?.id;\r\n\r\n if (subMenu.id === this.state.activeMenu) {\r\n if (parentMenuId === NavMenuConstants.rootMenu && subMenu.id! < MenuTypeIndexId.Retail) {\r\n parentMenuId = undefined;\r\n }\r\n\r\n if (!NavigationMenuRootEnabled.isBackTrack) {\r\n this.setState({ parentMenu: parentMenuId });\r\n } else {\r\n this.setState({ parentMenu: parentMenuId, mobileViewLabelText: subMenu.linkText });\r\n }\r\n return subMenu;\r\n }\r\n const found = this._getFromSubMenu(subMenu);\r\n if (found) {\r\n return found;\r\n }\r\n }\r\n }\r\n return null;\r\n }\r\n\r\n private _createMenuItemList(menuItemData: IMenuItemData): JSX.Element | null {\r\n if (ArrayExtensions.hasElements(menuItemData.subMenu)) {\r\n if (this.state.isOnlyMobile && this.state.activeMenu !== undefined) {\r\n return (this._renderSubMenu(menuItemData.subMenu, menuItemData.id, false));\r\n }\r\n return (\r\n <>\r\n {this._renderButtonMenuItem(menuItemData)}\r\n {this._renderSubMenu(menuItemData.subMenu, menuItemData.id)}\r\n \r\n );\r\n\r\n } else if (menuItemData.linkURL && !StringExtensions.isNullOrWhitespace(menuItemData.linkURL)) {\r\n return (this._renderLinkMenuItem(menuItemData, menuItemData.id));\r\n } else if (!menuItemData.linkURL) {\r\n return (this._renderSpanMenuItem(menuItemData));\r\n }\r\n\r\n return null;\r\n }\r\n\r\n private _renderSubMenu(subMenuArray?: IMenuItemData[], activeMenu?: number, isSubMenu?: boolean): JSX.Element | null {\r\n\r\n let subMenus: IMenuItemData[] | undefined = subMenuArray;\r\n if (activeMenu === NavMenuConstants.rootMenu) {\r\n subMenus = subMenuArray!.filter(subMenuItem => (subMenuItem.id && subMenuItem.id >= MenuTypeIndexId.Retail));\r\n }\r\n\r\n const { ListItem } = this.props.navProps;\r\n const isEnableMultiSupportMenu = this.props.navProps.config.enableMultilevelMenu ?? false;\r\n const multiLevelSupportedMenu = this.props.navProps.config.menuLevelSupport ?? NavMenuConstants.three;\r\n\r\n if (activeMenu && this.state.activeMenu !== activeMenu) {\r\n this.props.navProps.context.telemetry.error('Navigation Active menu content is empty, module wont render.');\r\n return null;\r\n }\r\n\r\n if (!subMenus || !ArrayExtensions.hasElements(subMenus)) {\r\n this.props.navProps.context.telemetry.error('Navigation Submenu content is empty, module wont render.');\r\n return null;\r\n }\r\n\r\n let levelClassName: string = '';\r\n const menuOptions = subMenus.map((option: IMenuItemData, index: number) => {\r\n const hasOptions = (option.subMenu && ArrayExtensions.hasElements(option.subMenu));\r\n let menuItem: JSX.Element | null;\r\n if (hasOptions && this.state.isOnlyMobile) {\r\n menuItem = this._renderButtonMenuItem(option, activeMenu, index);\r\n } else if (this.currentLevel === NavMenuConstants.one || !hasOptions) {\r\n menuItem = this.getMenuItem(option, index);\r\n } else {\r\n menuItem = null;\r\n }\r\n let subMenu;\r\n const isHavingSubmenu = hasOptions && isEnableMultiSupportMenu && (this.currentLevel <= Math.round(multiLevelSupportedMenu) - NavMenuConstants.one);\r\n\r\n if (hasOptions && !this.state.isOnlyMobile) {\r\n if (this.currentLevel >= NavMenuConstants.two) {\r\n levelClassName = 'level-3';\r\n subMenu = this._renderSubMenuDrawer(levelClassName, option);\r\n } else if (this.currentLevel <= this.supportedLevel - NavMenuConstants.one) {\r\n this.currentLevel++;\r\n levelClassName = `level-${this.currentLevel.toString()}`;\r\n subMenu = this._renderSubMenu(option.subMenu, undefined, true);\r\n }\r\n }\r\n if (isHavingSubmenu && this.state.isOnlyMobile) {\r\n this.currentLevel++;\r\n levelClassName = isEnableMultiSupportMenu ? `level-${this.currentLevel.toString()}` : '';\r\n subMenu = this._renderSubMenu(option.subMenu, option.id, true);\r\n }\r\n const imagesource = option.imageSource ? option.imageSource : '';\r\n return (\r\n \r\n { menuItem}\r\n { subMenu}\r\n \r\n );\r\n });\r\n return (this._renderMenu(levelClassName, menuOptions, isSubMenu));\r\n }\r\n\r\n private getMenuItem(option: IMenuItemData, index: number): JSX.Element | null {\r\n let menuItem: JSX.Element | null;\r\n if (this.currentLevel === NavMenuConstants.one) {\r\n menuItem = (option.linkURL ? this._renderLinkMenuItemLevelOne(option, index) : this._renderSpanMenuItem(option));\r\n } else {\r\n menuItem = (option.linkURL ? this._renderLinkMenuItem(option, index) : this._renderSpanMenuItem(option));\r\n }\r\n return menuItem;\r\n }\r\n\r\n private _renderSubMenuDrawer(levelClassName: string, menuItem: IMenuItemData): JSX.Element | null {\r\n return (\r\n \r\n
\r\n {menuItem.subMenu!.map((menuSubItem: IMenuItemData) => {\r\n return this._renderDrawerLink(menuSubItem);\r\n })}\r\n
\r\n \r\n );\r\n }\r\n\r\n /**\r\n * Handle desktop category click.\r\n * @param desktopCategoryId - Desktop category id used to identify the index of the category.\r\n * @returns Returns void.\r\n */\r\n private readonly _bindDesktopCategoryClick = (desktopCategoryId: number) => (): void => {\r\n if (this.state.desktopCategoryId !== desktopCategoryId) {\r\n this.setState({ desktopCategoryId, isDrawerOpen: true });\r\n } else {\r\n this.setState({ desktopCategoryId: -1, isDrawerOpen: false });\r\n }\r\n };\r\n\r\n private _renderButtonMenuItem(option: IMenuItemData, activeMenu?: number, index?: number): JSX.Element | null {\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): JSX.Element | null {\r\n const { Link } = this.props.navProps;\r\n const linkText = option.linkText ? option.linkText : '';\r\n this.payLoad.contentAction.etext = linkText;\r\n const attributes = getTelemetryAttributes(this.telemetryContent, this.payLoad);\r\n return (\r\n \r\n { option.linkText}\r\n \r\n );\r\n }\r\n\r\n private _renderLinkMenuItemLevelOne(option: IMenuItemData, index?: number, isHoverEffect: boolean = true): JSX.Element | null {\r\n const { Link } = this.props.navProps;\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 return (\r\n \r\n { option.linkText}\r\n \r\n );\r\n }\r\n\r\n private _renderPromotionalLink(linkText?: string, linkUrl?: string): JSX.Element | null {\r\n const { Link } = this.props.navProps;\r\n this.payLoad.contentAction.etext = linkText;\r\n const attributes = getTelemetryAttributes(this.telemetryContent, this.payLoad);\r\n if (linkText && linkUrl) {\r\n return (\r\n \r\n { linkText}\r\n \r\n );\r\n }\r\n return null;\r\n\r\n }\r\n\r\n private _renderSpanMenuItem(option: IMenuItemData, index?: number): JSX.Element | null {\r\n const { Span } = this.props.navProps;\r\n return (\r\n \r\n { option.linkText}\r\n \r\n );\r\n }\r\n\r\n private _renderMenu(level: string, menuOptions: JSX.Element[], isSubmenu?: boolean): JSX.Element | null {\r\n const { DivContainer, ImageDivContainer, showCategoryImage, showPromotionalContent } = this.props.navProps;\r\n const isCategoryImageDisplay =\r\n !this.state.isOnlyMobile && showCategoryImage && this.state.categoryImage !== null && this.state.categoryImage !== undefined && !isSubmenu;\r\n const isPromotionalContentDisplay =\r\n !this.state.isOnlyMobile && showPromotionalContent && ArrayExtensions.hasElements(this.state.categoryImage) && !isSubmenu;\r\n const divContainerClass = this.currentLevel > NavMenuConstants.two || isCategoryImageDisplay ? DivContainer!.className : 'ms-nav__deafult';\r\n this.currentLevel = NavMenuConstants.one;\r\n const menuLevelSupportClassName =\r\n isCategoryImageDisplay && this.props.navProps.config.menuLevelSupport &&\r\n this.props.navProps.config.menuLevelSupport > NavMenuConstants.two && 'navmenu-multi-level';\r\n\r\n const categoryImages = this.state.categoryImage?.filter(image => !StringExtensions.isNullOrWhitespace(image.src));\r\n const imagesContainerKey = categoryImages?.map(item => item.src).join('-');\r\n return (\r\n \r\n \r\n {menuOptions}\r\n \r\n
\r\n {\r\n isCategoryImageDisplay && ArrayExtensions.hasElements(categoryImages) && categoryImages.map(item => (\r\n \r\n { getCategoryImage(this.props, item.src ?? '', item.altText!.toString())}\r\n { isPromotionalContentDisplay && this._renderPromotionalLink(item.altText, item.additionalProperties?.linkUrl)}\r\n ))\r\n }\r\n
\r\n \r\n );\r\n }\r\n\r\n /**\r\n * Handle Category image update.\r\n * @param categoryImageSource - Image source.\r\n * @param option - Menu Item data.\r\n * @returns Returns empty.\r\n */\r\n private readonly _updateCategoryImage = (categoryImageSource: string, option: IMenuItemData) => () => {\r\n const linkText = option.linkText ? option.linkText : '';\r\n const promotionalImage: Msdyn365.IImageData[] = [{ src: categoryImageSource, altText: linkText }];\r\n\r\n // Read category and promotional image in one array\r\n if (ArrayExtensions.hasElements(option.promotionalContent)) {\r\n for (const item of option.promotionalContent) {\r\n const imageSource = item.image.src;\r\n promotionalImage.push({ src: imageSource, altText: item.text, additionalProperties: { linkUrl: item.linkUrl.destinationUrl } });\r\n }\r\n }\r\n this.setState({\r\n categoryImage: ArrayExtensions.hasElements(promotionalImage) ? promotionalImage : [{ src: 'empty' }]\r\n });\r\n };\r\n\r\n /**\r\n * Handle dropdown toggle.\r\n * @param data - Menu Item data.\r\n * @param parentId - Number.\r\n * @returns Returns empty.\r\n */\r\n private readonly _handleDropdownToggle = (data: IMenuItemData, parentId?: number) => () => {\r\n if (!this.state.isOnlyMobile) {\r\n this.setState({\r\n activeMenu: data.id,\r\n parentMenu: parentId\r\n });\r\n if (this.props.navProps.showCategoryImage) {\r\n this._updateCategoryImage(data.imageSource!, data)();\r\n }\r\n } else {\r\n NavigationMenuRootEnabled.isBackTrack = false;\r\n this.setState({\r\n activeMenu: data.id,\r\n mobileViewLabelText: data.linkText!,\r\n parentMenu: parentId\r\n });\r\n }\r\n\r\n };\r\n\r\n /**\r\n * Handle back navigation for menu items for mobile view.\r\n * @returns Returns empty.\r\n */\r\n private readonly _handleGoBack = () => () => {\r\n NavigationMenuRootEnabled.isBackTrack = true;\r\n this.setState((previousState) => ({ activeMenu: previousState.parentMenu }));\r\n };\r\n\r\n /**\r\n * Function to close the nav menu on click on body.\r\n * @param event - MouseEvent.\r\n */\r\n private readonly _handleClickOutside = (event: MouseEvent) => {\r\n if (this.menuNode.current &&\r\n !this.menuNode.current.contains(event.target as Node)) {\r\n if (!this.state.isOnlyMobile) {\r\n this.setState({ activeMenu: NavMenuConstants.rootMenu, mobileViewLabelText: '', isNavOpen: false });\r\n } else {\r\n this.setState({ activeMenu: undefined, mobileViewLabelText: '', isNavOpen: false });\r\n }\r\n }\r\n };\r\n\r\n /**\r\n * Add shop all link for Mobile submenu.\r\n */\r\n private readonly _addShopAllLink = (): void => {\r\n const { menuItemData } = this.props.navProps;\r\n this.menuItemData = menuItemData;\r\n if (ArrayExtensions.hasElements(menuItemData) && ArrayExtensions.hasElements(menuItemData[0].subMenu)) {\r\n this.menuItemData[0].subMenu?.map(item => {\r\n const shopAllObject = {};\r\n Object.assign(shopAllObject, { imageSource: item.imageSource });\r\n Object.assign(shopAllObject, { linkText: this.props.navProps.resources.allCategoryMenuText });\r\n Object.assign(shopAllObject, { linkURL: item.linkURL });\r\n if (ArrayExtensions.hasElements(item.subMenu) && item.menuSource === MenuSource.Retail) {\r\n item.subMenu.unshift(shopAllObject);\r\n }\r\n return item;\r\n });\r\n }\r\n };\r\n\r\n /**\r\n * Checks to assign a ref for focus.\r\n * @param index -Sub menu list index.\r\n * @param mobileViewLabelText -Mobile view label text.\r\n * @param optionLinkText -Sub menu item link text.\r\n * @returns Boolean.\r\n */\r\n private readonly _shouldAddFocusMenuRef = (index: number, mobileViewLabelText?: string, optionLinkText?: string) => {\r\n const firstIndex: number = 0;\r\n if (!NavigationMenuRootEnabled.isBackTrack && index === firstIndex) {\r\n return true;\r\n }\r\n if (!optionLinkText || !mobileViewLabelText) {\r\n return false;\r\n }\r\n return mobileViewLabelText === optionLinkText;\r\n };\r\n\r\n /**\r\n * Function to handle nav menu close.\r\n */\r\n private readonly _closeNavMenu = (): void => {\r\n if (!this.state.isOnlyMobile) {\r\n this.setState({ activeMenu: NavMenuConstants.rootMenu, mobileViewLabelText: '', isNavOpen: false });\r\n } else {\r\n this.setState({ activeMenu: undefined, mobileViewLabelText: '', isNavOpen: false });\r\n }\r\n };\r\n\r\n /**\r\n * Function to close the nav menu on esc key.\r\n * @param event - Event.\r\n */\r\n private readonly _escFunction = (event: React.KeyboardEvent) => {\r\n if (event.keyCode === this.escapeKey && !this.state.isOnlyMobile && this.state.isNavOpen) {\r\n this.setState({ activeMenu: NavMenuConstants.rootMenu, mobileViewLabelText: '', isNavOpen: false });\r\n }\r\n };\r\n\r\n /**\r\n * Custom update viewport.\r\n */\r\n private readonly _customUpdateViewport = (): void => {\r\n this.setState({ isOnlyMobile: this.isOnlyMobile });\r\n };\r\n\r\n}\r\n\r\nexport default NavigationMenuRootEnabled;\r\n","/*--------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * See License.txt in the project root for license information.\r\n *--------------------------------------------------------------*/\r\n\r\nimport { INavigationMenuViewProps } from '@msdyn365-commerce-modules/navigation-menu';\r\nimport * as React from 'react';\r\n\r\nimport { INavigationMenuProps } from '../definition-extensions/navigation-menu.ext.props.autogenerated';\r\nimport NavigationMenuRootDisabled from './components/navigation-menu-root-disabled';\r\nimport NavigationMenuRootEnabled from './components/navigation-menu-root-enabled';\r\n\r\n/**\r\n * Render the Navigation menu.\r\n * @param props - The navigation menu view props.\r\n * @returns Return HTML having INavigationMenuViewProps props with navigation menu.\r\n */\r\nconst navigationMenuView = (props: INavigationMenuViewProps & INavigationMenuProps<{}>): JSX.Element => {\r\n\r\n if (props.config.enabletopMenu) {\r\n return ;\r\n }\r\n\r\n return ;\r\n\r\n};\r\n\r\nexport default navigationMenuView;\r\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport NavigationMenu from './modules/navigation-menu/navigation-menu';\nimport NavigationMenuView from './modules/navigation-menu/navigation-menu.view';\n\nexport * from './modules/navigation-menu/navigation-menu';\nexport * from './modules/navigation-menu/navigation-menu.data';\nexport * from './modules/navigation-menu/navigation-menu.props.autogenerated';\nexport * from './modules/navigation-menu/navigation-menu.view';\n\nexport { NavigationMenu, NavigationMenuView };\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport * as Msdyn365 from '@msdyn365-commerce/core';\nimport { INavigationMenuViewProps } from '@msdyn365-commerce-modules/navigation-menu';\nimport { generateImageUrl } from '@msdyn365-commerce-modules/retail-actions';\nimport * as React from 'react';\n\nimport { INavigationMenuProps } from '../../definition-extensions/navigation-menu.ext.props.autogenerated';\n\n/**\n * INavigationMenuViewRootProps.\n */\nexport interface INavigationMenuViewRootProps {\n navProps: INavigationMenuViewProps & INavigationMenuProps<{}>;\n}\n\n/**\n * Represent navigation menu state interface.\n */\nexport interface INavigationState {\n parentMenu?: number;\n activeMenu?: number;\n categoryImage?: Msdyn365.IImageData[] | null;\n mobileViewLabelText?: string;\n drawerKeyValue: Msdyn365.IDictionary;\n isOnlyMobile: boolean;\n isNavOpen: boolean;\n}\n\n/**\n * NavMenuConstants enum.\n */\nexport enum NavMenuConstants {\n zero = 0,\n one = 1,\n two = 2,\n three = 3,\n four = 4,\n escapeKey = 27,\n rootMenu = 1\n}\n\n/**\n * GridSizes.\n */\nexport type GridSize = 'xs' | 'sm' | 'md' | 'lg' | 'xl';\n\n/**\n * Get category image.\n * @param props - Navigation menu props.\n * @param categoryImage - Category Image.\n * @param alttext - AltText String.\n * @returns Returns Node.\n */\nexport const getCategoryImage = (props: INavigationMenuViewRootProps, categoryImage: string, alttext: string): React.ReactNode | null => {\n const categoryImageUrl = generateImageUrl(`${categoryImage}`, props.navProps.context.actionContext.requestContext.apiSettings);\n const defaultImageSettings: Msdyn365.IImageSettings = {\n viewports: {\n xs: { q: 'w=162&h=162&m=8', w: 0, h: 0 },\n sm: { q: 'w=162&h=162&m=8', w: 0, h: 0 },\n md: { q: 'w=203&h=203&m=8', w: 0, h: 0 },\n lg: { q: 'w=203&h=203&m=8', w: 0, h: 0 }\n },\n lazyload: true\n };\n if (categoryImageUrl !== undefined) {\n const imageData: Msdyn365.IImageData = { src: categoryImageUrl };\n return (\n \n );\n }\n return null;\n};\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport * as Msdyn365 from '@msdyn365-commerce/core';\nimport { IMenuItemData, MenuTypeIndexId } from '@msdyn365-commerce-modules/navigation-menu';\nimport { ArrayExtensions, StringExtensions } from '@msdyn365-commerce-modules/retail-actions';\nimport {\n addThrottledEvent,\n Button,\n Collapse,\n Drawer,\n getPayloadObject,\n getTelemetryAttributes,\n getTelemetryObject,\n ICollapseProps,\n IPayLoad,\n isMobile,\n ITelemetryContent,\n Module,\n Node,\n onTelemetryClick,\n VariantType\n} from '@msdyn365-commerce-modules/utilities';\nimport classnames from 'classnames';\nimport { computed } from 'mobx';\nimport * as React from 'react';\n\nimport { getCategoryImage, INavigationMenuViewRootProps, INavigationState, NavMenuConstants } from './navigation-menu-utilities';\n\n/**\n *\n * NavigationMenuRootDisabled component.\n * @extends {React.PureComponent}\n */\nexport class NavigationMenuRootDisabled extends React.PureComponent {\n private static isBackTrack: boolean = false;\n\n private readonly supportedLevel: number = NavMenuConstants.four;\n\n private currentLevel: number = NavMenuConstants.zero;\n\n private readonly menuNode: React.RefObject;\n\n private readonly menuItemRef: React.RefObject;\n\n private readonly escapeKey: number = NavMenuConstants.escapeKey;\n\n private readonly telemetryContent: ITelemetryContent;\n\n private readonly promotionalImage: Msdyn365.IImageData[] = [];\n\n private readonly payLoad: IPayLoad;\n\n private readonly attributes?: Msdyn365.IDictionary;\n\n private customResizeThrottledEventHandler?: (event: Event) => void;\n\n public constructor(props: INavigationMenuViewRootProps) {\n super(props);\n this.menuNode = React.createRef();\n this.menuItemRef = React.createRef();\n const { menuItemData } = this.props.navProps;\n if (ArrayExtensions.hasElements(menuItemData) && ArrayExtensions.hasElements(menuItemData[0].subMenu)) {\n const imagesource = menuItemData[0].subMenu[0].imageSource ? menuItemData[0].subMenu[0].imageSource : '';\n const linkText = menuItemData[0].subMenu[0].linkText ? menuItemData[0].subMenu[0].linkText : '';\n this.promotionalImage = [{ src: imagesource, altText: linkText }];\n\n // Read category and promotional image in one array\n if (ArrayExtensions.hasElements(menuItemData[0].subMenu[0].promotionalContent)) {\n menuItemData[0].subMenu[0].promotionalContent.map(item => {\n const imageSource = item.image.src;\n this.promotionalImage.push({\n src: imageSource,\n altText: item.text,\n additionalProperties: { linkUrl: item.linkUrl.destinationUrl }\n });\n return null;\n });\n }\n }\n\n this.state = {\n activeMenu: 1,\n mobileViewLabelText: '',\n parentMenu: undefined,\n drawerKeyValue: {},\n isOnlyMobile: this.isOnlyMobile,\n categoryImage: this.promotionalImage,\n isNavOpen: false\n };\n this.telemetryContent = getTelemetryObject(\n this.props.navProps.context.request.telemetryPageName!,\n this.props.navProps.friendlyName,\n this.props.navProps.telemetry\n );\n this.payLoad = getPayloadObject('click', this.telemetryContent, '', '');\n this.attributes = getTelemetryAttributes(this.telemetryContent, this.payLoad);\n }\n\n @computed public get isOnlyMobile(): boolean {\n return isMobile({ variant: VariantType.Browser, context: this.props.navProps.context.request }) === 'xs';\n }\n\n public componentDidMount(): void {\n this.customResizeThrottledEventHandler = addThrottledEvent(window, 'resize', this._customUpdateViewport as EventListener);\n document.addEventListener('keydown', (this._escFunction as unknown) as EventListener, false);\n this._customUpdateViewport();\n document.body.addEventListener('mousedown', this._handleClickOutside);\n }\n\n public componentDidUpdate(): void {\n if (this.menuItemRef.current?.children[0] && this.props.navProps.isMobileView) {\n (this.menuItemRef.current.children[0] as HTMLElement).focus();\n }\n }\n\n public componentWillUnmount(): void {\n window.removeEventListener('resize', this.customResizeThrottledEventHandler!, false);\n document.body.removeEventListener('mousedown', this._handleClickOutside, false);\n }\n\n public render(): JSX.Element | null {\n this.currentLevel = 1;\n const navbarKey = 'header-nav-mobile';\n return (\n \n {this.state.isOnlyMobile ? (\n this._renderMobileMenu()\n ) : (\n <>\n \n {this._renderCollapseMenu()}\n \n )}\n \n );\n }\n\n /**\n * Function to handle nav bar toggle.\n */\n private readonly _toggleNavBar = (): void => {\n this.setState(previousState => ({\n activeMenu: 1,\n isNavOpen: !previousState.isNavOpen\n }));\n };\n\n private _renderCollapseMenu(): JSX.Element | null {\n return (\n \n {this.state.isOnlyMobile ? this._renderMobileMenu() : this._renderDesktopMenu()}\n \n );\n }\n\n private _renderMobileMenu(): JSX.Element {\n const { MenuList, MobileBackButton, MobileDescriptionContainer, MobileDescriptionLabel, Navigation } = this.props.navProps;\n\n this.currentLevel = 1;\n return (\n \n \n {this.state.isOnlyMobile && this.state.activeMenu !== undefined && (\n \n \n {this.state.mobileViewLabelText}\n \n )}\n {this._renderDisplay()}\n \n \n );\n }\n\n private _renderDesktopMenu(): JSX.Element {\n const { MenuList, Navigation } = this.props.navProps;\n\n return (\n \n \n {this._renderDisplay()}\n
\n
\n
\n
\n );\n }\n\n private _renderDrawerLink(item: IMenuItemData): JSX.Element | null {\n if (item.linkURL && !StringExtensions.isNullOrWhitespace(item.linkURL)) {\n return this._renderLinkMenuItem(item);\n } else if (!item.linkURL) {\n return this._renderSpanMenuItem(item);\n }\n return null;\n }\n\n private _renderDisplay(): JSX.Element[] {\n const { ListItem } = this.props.navProps;\n const menuItemData: IMenuItemData[] = this.props.navProps.menuItemData;\n const { activeMenu } = this.state;\n const menuItemList: JSX.Element[] = [];\n\n if (ArrayExtensions.hasElements(menuItemData)) {\n menuItemData[0].id = 1;\n }\n\n if (this.state.isOnlyMobile && activeMenu !== undefined && ArrayExtensions.hasElements(menuItemData)) {\n const menuItem = this._getFromSubMenu(undefined, menuItemData);\n\n if (menuItem) {\n menuItemList.push(\n \n {` `}\n {this._createMenuItemList(menuItem)} {` `}\n \n );\n }\n } else {\n for (const [index, item] of menuItemData.entries()) {\n menuItemList.push(\n \n {this._createMenuItemList(item)}\n
\n );\n }\n }\n\n return menuItemList;\n }\n\n private _getFromSubMenu(parentMenuId?: number, menu?: IMenuItemData[]): IMenuItemData | null {\n if (!menu) {\n return null;\n }\n\n for (let index = 0; index <= menu.length - NavMenuConstants.one; index++) {\n const item: IMenuItemData = menu[Number(index)];\n\n if (item.id === this.state.activeMenu) {\n if (!NavigationMenuRootDisabled.isBackTrack) {\n this.setState({ parentMenu: parentMenuId });\n } else {\n this.setState({ parentMenu: parentMenuId, mobileViewLabelText: item.linkText });\n }\n return item;\n }\n const found = this._getFromSubMenu(item.id, item.subMenu);\n if (found) {\n return found;\n }\n }\n return null;\n }\n\n private _createMenuItemList(menuItemData: IMenuItemData): JSX.Element | null {\n if (ArrayExtensions.hasElements(menuItemData.subMenu)) {\n if (this.state.isOnlyMobile && this.state.activeMenu !== undefined) {\n return this._renderSubMenu(menuItemData.subMenu, menuItemData.id, false);\n }\n\n return (\n <>\n {this._renderButtonMenuItem(menuItemData)}\n {this._renderSubMenu(menuItemData.subMenu, menuItemData.id)}\n \n );\n } else if (menuItemData.linkURL && !StringExtensions.isNullOrWhitespace(menuItemData.linkURL)) {\n return this._renderLinkMenuItem(menuItemData, menuItemData.id);\n } else if (!menuItemData.linkURL && !(this.state.isOnlyMobile && this.state.activeMenu !== undefined)) {\n return this._renderSpanMenuItem(menuItemData);\n }\n\n return null;\n }\n\n private _renderSubMenu(subMenuArray?: IMenuItemData[], activeMenu?: number, isSubMenu?: boolean): JSX.Element | null {\n let subMenus: IMenuItemData[] | undefined = subMenuArray;\n if (activeMenu === NavMenuConstants.rootMenu) {\n subMenus = subMenuArray!.filter(subMenuItem => subMenuItem.id && subMenuItem.id >= MenuTypeIndexId.Retail);\n }\n\n const { ListItem } = this.props.navProps;\n const isEnableMultiSupportMenu = this.props.navProps.config.enableMultilevelMenu ?? false;\n const multiLevelSupportedMenu = this.props.navProps.config.menuLevelSupport ?? NavMenuConstants.three;\n\n if (activeMenu && this.state.activeMenu !== activeMenu) {\n this.props.navProps.context.telemetry.error('Navigation Active menu content is empty, module wont render.');\n return null;\n }\n\n if (!subMenus || !ArrayExtensions.hasElements(subMenus)) {\n this.props.navProps.context.telemetry.error('Navigation Submenu content is empty, module wont render.');\n return null;\n }\n\n let levelClassName: string = '';\n const menuOptions = subMenus.map((option: IMenuItemData, index: number) => {\n const hasOptions = option.subMenu && ArrayExtensions.hasElements(option.subMenu);\n let menuItem: JSX.Element | null;\n if (hasOptions && this.state.isOnlyMobile) {\n menuItem = this._renderButtonMenuItem(option, activeMenu, index);\n } else if (this.currentLevel === NavMenuConstants.one || !hasOptions) {\n menuItem = this.getMenuItem(option, index);\n } else {\n menuItem = null;\n }\n let subMenu;\n const isHavingSubmenu =\n hasOptions && isEnableMultiSupportMenu && this.currentLevel <= Math.round(multiLevelSupportedMenu) - NavMenuConstants.one;\n\n if (hasOptions && !this.state.isOnlyMobile) {\n if (this.currentLevel >= NavMenuConstants.two) {\n subMenu = this._renderSubMenuDrawer(option);\n } else if (this.currentLevel <= this.supportedLevel) {\n this.currentLevel++;\n levelClassName = `level-${this.currentLevel.toString()}`;\n subMenu = this._renderSubMenu(option.subMenu, undefined, true);\n }\n }\n\n if (isHavingSubmenu && this.state.isOnlyMobile) {\n this.currentLevel++;\n levelClassName = isEnableMultiSupportMenu ? `level-${this.currentLevel.toString()}` : '';\n subMenu = this._renderSubMenu(option.subMenu, option.id, true);\n }\n const imagesource = option.imageSource ? option.imageSource : '';\n return (\n \n {menuItem}\n {subMenu}\n \n );\n });\n return this._renderMenu(levelClassName, menuOptions, isSubMenu);\n }\n\n private getMenuItem(option: IMenuItemData, index: number): JSX.Element | null {\n let menuItem: JSX.Element | null;\n if (this.currentLevel === NavMenuConstants.one) {\n menuItem = option.linkURL ? this._renderLinkMenuItemLevelOne(option, index) : this._renderSpanMenuItem(option);\n } else {\n menuItem = option.linkURL ? this._renderLinkMenuItem(option, index) : this._renderSpanMenuItem(option);\n }\n return menuItem;\n }\n\n private _renderSubMenuDrawer(menuItem: IMenuItemData): JSX.Element | null {\n const levelClassName = `level-${this.currentLevel.toString()}`;\n const toggleButtonText = menuItem.linkText;\n const keyValue = this.state.drawerKeyValue;\n const buttonText = toggleButtonText !== undefined ? toggleButtonText : '';\n const keys = keyValue;\n const multiLevelSupportedMenu = this.props.navProps.config.menuLevelSupport ?? NavMenuConstants.three;\n\n let isDrawerOpen = false;\n if (keys[menuItem.id!]) {\n isDrawerOpen = true;\n }\n const colProps: ICollapseProps = { timeout: 0, isOpen: isDrawerOpen };\n\n return (\n \n
\n {menuItem.subMenu!.map((menuSubItem: IMenuItemData) => {\n if (ArrayExtensions.hasElements(menuSubItem.subMenu)) {\n this.currentLevel++;\n if (this.currentLevel < multiLevelSupportedMenu) {\n return this._renderSubMenuDrawer(menuSubItem);\n }\n }\n return this._renderDrawerLink(menuSubItem);\n })}\n
\n \n );\n }\n\n /**\n * Method to handle escape key event.\n * @param menuId -Number.\n * @param isDrawerOpen -Boolean.\n * @returns Void.\n */\n private readonly _bindDesktopCategoryClick = (menuId: number | undefined, isDrawerOpen: boolean) => (): void => {\n const { drawerKeyValue } = this.state;\n const newPair = { [menuId!]: !isDrawerOpen };\n this.setState({ drawerKeyValue: { ...drawerKeyValue, ...newPair } });\n };\n\n private _renderButtonMenuItem(option: IMenuItemData, activeMenu?: number, index?: number): JSX.Element | null {\n return (\n \n {option.linkText}\n \n );\n }\n\n private _renderLinkMenuItem(option: IMenuItemData, index?: number): JSX.Element | null {\n const { Link } = this.props.navProps;\n const linkText = option.linkText ? option.linkText : '';\n this.payLoad.contentAction.etext = linkText;\n const attributes = getTelemetryAttributes(this.telemetryContent, this.payLoad);\n return (\n \n {option.linkText}\n \n );\n }\n\n private _renderLinkMenuItemLevelOne(option: IMenuItemData, index?: number, isHoverEffect: boolean = true): JSX.Element | null {\n const { Link } = this.props.navProps;\n const linkText = option.linkText ? option.linkText : '';\n const imagesource = option.imageSource ? option.imageSource : '';\n this.payLoad.contentAction.etext = linkText;\n const attributes = getTelemetryAttributes(this.telemetryContent, this.payLoad);\n return (\n \n {option.linkText}\n \n );\n }\n\n private _renderPromotionalLink(linkText?: string, linkUrl?: string): JSX.Element | null {\n const { Link } = this.props.navProps;\n this.payLoad.contentAction.etext = linkText;\n const attributes = getTelemetryAttributes(this.telemetryContent, this.payLoad);\n if (linkText && linkUrl) {\n return (\n \n {linkText}\n \n );\n }\n return null;\n }\n\n private _renderSpanMenuItem(option: IMenuItemData, index?: number): JSX.Element | null {\n const { Span } = this.props.navProps;\n return (\n \n {option.linkText}\n \n );\n }\n\n private _renderMenu(level: string, menuOptions: JSX.Element[], isSubmenu?: boolean): JSX.Element | null {\n const { DivContainer, MenuList, ImageDivContainer, showCategoryImage, showPromotionalContent } = this.props.navProps;\n const isCategoryImageDisplay =\n !this.state.isOnlyMobile &&\n showCategoryImage &&\n this.state.categoryImage !== null &&\n this.state.categoryImage !== undefined &&\n !isSubmenu;\n const isPromotionalContentDisplay =\n !this.state.isOnlyMobile && showPromotionalContent && ArrayExtensions.hasElements(this.state.categoryImage) && !isSubmenu;\n const divContainerClass =\n this.currentLevel > NavMenuConstants.two || isCategoryImageDisplay ? DivContainer!.className : 'ms-nav__deafult';\n this.currentLevel = NavMenuConstants.one;\n const menuLevelSupportClassName =\n isCategoryImageDisplay &&\n this.props.navProps.config.menuLevelSupport &&\n this.props.navProps.config.menuLevelSupport > NavMenuConstants.two &&\n 'navmenu-multi-level';\n\n const categoryImages = this.state.categoryImage?.filter(image => !StringExtensions.isNullOrWhitespace(image.src));\n const imagesContainerKey = categoryImages?.map(item => item.src).join('-');\n return (\n \n \n {menuOptions}\n \n
\n {isCategoryImageDisplay &&\n ArrayExtensions.hasElements(categoryImages) &&\n categoryImages.map(item => (\n \n {getCategoryImage(this.props, item.src ?? '', item.altText!.toString())}\n {isPromotionalContentDisplay &&\n this._renderPromotionalLink(item.altText, item.additionalProperties?.linkUrl)}\n \n ))}\n
\n \n );\n }\n\n /**\n * Handle Category image update.\n * @param categoryImageSource - Image source.\n * @param option - Menu Item data.\n * @returns Returns empty.\n */\n private readonly _updateCategoryImage = (categoryImageSource: string, option: IMenuItemData) => () => {\n const linkText = option.linkText ? option.linkText : '';\n const promotionalImage: Msdyn365.IImageData[] = [{ src: categoryImageSource, altText: linkText }];\n\n // Read category and promotional image in one array\n if (ArrayExtensions.hasElements(option.promotionalContent)) {\n for (const item of option.promotionalContent) {\n const imageSource = item.image.src;\n promotionalImage.push({\n src: imageSource,\n altText: item.text,\n additionalProperties: { linkUrl: item.linkUrl.destinationUrl }\n });\n }\n }\n this.setState({\n categoryImage: ArrayExtensions.hasElements(promotionalImage) ? promotionalImage : [{ src: 'empty' }]\n });\n };\n\n /**\n * Handle dropdown toggle.\n * @param data - Menu Item data.\n * @param parentId - Number.\n * @returns Returns empty.\n */\n private readonly _handleDropdownToggle = (data: IMenuItemData, parentId?: number) => () => {\n if (!this.state.isOnlyMobile) {\n this.setState({\n activeMenu: data.id,\n parentMenu: parentId\n });\n if (this.props.navProps.showCategoryImage) {\n this._updateCategoryImage(data.imageSource!, data)();\n }\n } else {\n NavigationMenuRootDisabled.isBackTrack = false;\n this.setState({\n activeMenu: data.id,\n mobileViewLabelText: data.linkText!,\n parentMenu: parentId\n });\n }\n };\n\n /**\n * Handle back navigation for menu items for mobile view.\n * @returns Returns empty.\n */\n private readonly _handleGoBack = () => () => {\n NavigationMenuRootDisabled.isBackTrack = true;\n this.setState(previousState => ({ activeMenu: previousState.parentMenu }));\n };\n\n /**\n * Function to close the nav menu on click on body.\n * @param event - MouseEvent.\n */\n private readonly _handleClickOutside = (event: MouseEvent) => {\n if (this.menuNode.current && !this.menuNode.current.contains(event.target as Node)) {\n if (!this.state.isOnlyMobile) {\n this.setState({ activeMenu: 1, mobileViewLabelText: '', isNavOpen: false });\n } else {\n this.setState({ activeMenu: undefined, mobileViewLabelText: '', isNavOpen: false });\n }\n }\n };\n\n /**\n * Checks to assign a ref for focus.\n * @param index -Sub menu list index.\n * @param mobileViewLabelText -Mobile view label text.\n * @param optionLinkText -Sub menu item link text.\n * @returns Boolean.\n */\n private readonly _shouldAddFocusMenuRef = (index: number, mobileViewLabelText?: string, optionLinkText?: string) => {\n const firstIndex: number = 0;\n if (!NavigationMenuRootDisabled.isBackTrack && index === firstIndex) {\n return true;\n }\n if (!optionLinkText || !mobileViewLabelText) {\n return false;\n }\n return mobileViewLabelText === optionLinkText;\n };\n\n /**\n * Function to handle nav menu close.\n */\n private readonly _closeNavMenu = (): void => {\n if (!this.state.isOnlyMobile) {\n this.setState({ activeMenu: 1, mobileViewLabelText: '', isNavOpen: false });\n } else {\n this.setState({ activeMenu: undefined, mobileViewLabelText: '', isNavOpen: false });\n }\n (this.menuNode.current?.children[0] as HTMLElement).focus();\n };\n\n /**\n * Function to close the nav menu on esc key.\n * @param event - Event.\n */\n private readonly _escFunction = (event: React.KeyboardEvent) => {\n if (event.keyCode === this.escapeKey && !this.state.isOnlyMobile && this.state.isNavOpen) {\n this.setState({ activeMenu: 1, mobileViewLabelText: '', isNavOpen: false });\n (this.menuNode.current?.children[0] as HTMLElement).focus();\n }\n };\n\n /**\n * Custom update viewport.\n */\n private readonly _customUpdateViewport = (): void => {\n this.setState({ isOnlyMobile: this.isOnlyMobile });\n };\n}\n\nexport default NavigationMenuRootDisabled;\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport * as Msdyn365 from '@msdyn365-commerce/core';\nimport { IMenuItemData, MenuSource, MenuTypeIndexId } from '@msdyn365-commerce-modules/navigation-menu';\nimport { ArrayExtensions, StringExtensions } from '@msdyn365-commerce-modules/retail-actions';\nimport {\n addThrottledEvent,\n Button,\n Collapse,\n Drawer,\n getPayloadObject,\n getTelemetryAttributes,\n getTelemetryObject,\n ICollapseProps,\n IPayLoad,\n isMobile,\n ITelemetryContent,\n Module,\n Node,\n onTelemetryClick,\n VariantType\n} from '@msdyn365-commerce-modules/utilities';\nimport classnames from 'classnames';\nimport { computed } from 'mobx';\nimport * as React from 'react';\n\nimport { getCategoryImage, INavigationMenuViewRootProps, INavigationState, NavMenuConstants } from './navigation-menu-utilities';\n\n/**\n *\n * NavigationMenuRootEnabled component.\n * @extends {React.PureComponent}\n */\nexport class NavigationMenuRootEnabled extends React.PureComponent {\n private static isBackTrack: boolean = false;\n\n private readonly supportedLevel: number = NavMenuConstants.four;\n\n private currentLevel: number = NavMenuConstants.zero;\n\n private readonly menuNode: React.RefObject;\n\n private readonly menuItemRef: React.RefObject;\n\n private readonly escapeKey: number = NavMenuConstants.escapeKey;\n\n private readonly telemetryContent: ITelemetryContent;\n\n private readonly promotionalImage: Msdyn365.IImageData[] = [];\n\n private menuItemData: IMenuItemData[] = [];\n\n private readonly payLoad: IPayLoad;\n\n private readonly attributes?: Msdyn365.IDictionary;\n\n private customResizeThrottledEventHandler?: (event: Event) => void;\n\n public constructor(props: INavigationMenuViewRootProps) {\n super(props);\n this.menuNode = React.createRef();\n this.menuItemRef = React.createRef();\n const { menuItemData } = this.props.navProps;\n if (ArrayExtensions.hasElements(menuItemData) && ArrayExtensions.hasElements(menuItemData[0].subMenu)) {\n const imagesource = menuItemData[0].subMenu[0].imageSource ? menuItemData[0].subMenu[0].imageSource : '';\n const linkText = menuItemData[0].subMenu[0].linkText ? menuItemData[0].subMenu[0].linkText : '';\n this.promotionalImage = [{ src: imagesource, altText: linkText }];\n\n // Read category and promotional image in one array\n if (ArrayExtensions.hasElements(menuItemData[0].subMenu[0].promotionalContent)) {\n menuItemData[0].subMenu[0].promotionalContent.map(item => {\n const imageSource = item.image.src;\n this.promotionalImage.push({\n src: imageSource,\n altText: item.text,\n additionalProperties: { linkUrl: item.linkUrl.destinationUrl }\n });\n return null;\n });\n }\n }\n this.state = {\n activeMenu: NavMenuConstants.rootMenu,\n mobileViewLabelText: '',\n parentMenu: undefined,\n drawerKeyValue: {},\n isOnlyMobile: this.isOnlyMobile,\n categoryImage: this.promotionalImage,\n isNavOpen: false\n };\n\n this.telemetryContent = getTelemetryObject(\n this.props.navProps.context.request.telemetryPageName!,\n this.props.navProps.friendlyName,\n this.props.navProps.telemetry\n );\n this.payLoad = getPayloadObject('click', this.telemetryContent, '', '');\n this.attributes = getTelemetryAttributes(this.telemetryContent, this.payLoad);\n }\n\n @computed public get isOnlyMobile(): boolean {\n return isMobile({ variant: VariantType.Browser, context: this.props.navProps.context.request }) === 'xs';\n }\n\n public componentDidMount(): void {\n this.customResizeThrottledEventHandler = addThrottledEvent(window, 'resize', this._customUpdateViewport as EventListener);\n document.addEventListener('keydown', (this._escFunction as unknown) as EventListener, false);\n this._customUpdateViewport();\n document.body.addEventListener('mousedown', this._handleClickOutside);\n this._addShopAllLink();\n }\n\n public componentDidUpdate(): void {\n if (this.menuItemRef.current?.children[0] && this.props.navProps.isMobileView) {\n (this.menuItemRef.current.children[0] as HTMLElement).focus();\n }\n }\n\n public componentWillUnmount(): void {\n window.removeEventListener('resize', this.customResizeThrottledEventHandler!, false);\n document.body.removeEventListener('mousedown', this._handleClickOutside, false);\n }\n\n public render(): JSX.Element | null {\n this.currentLevel = NavMenuConstants.one;\n const navbarKey = 'header-nav-mobile';\n return (\n \n {this.state.isOnlyMobile ? (\n this._renderMobileMenu()\n ) : (\n <>\n \n {this._renderCollapseMenu()}\n \n )}\n \n );\n }\n\n /**\n * Function to handle nav bar toggle.\n */\n private readonly _toggleNavBar = (): void => {\n this.setState(previousState => ({\n activeMenu: NavMenuConstants.rootMenu,\n isNavOpen: !previousState.isNavOpen\n }));\n };\n\n private _renderCollapseMenu(): JSX.Element | null {\n return (\n \n {this.state.isOnlyMobile ? this._renderMobileMenu() : this._renderDesktopMenu()}\n \n );\n }\n\n private _renderMobileMenu(): JSX.Element {\n const { MobileBackButton, MobileDescriptionContainer, MobileDescriptionLabel, Navigation } = this.props.navProps;\n\n this.currentLevel = NavMenuConstants.one;\n return (\n \n \n {this.state.isOnlyMobile && this.state.activeMenu !== undefined && (\n \n \n {this.state.mobileViewLabelText}\n \n )}\n {this._renderDisplay()}\n \n \n );\n }\n\n private _renderDesktopMenu(): JSX.Element {\n const { Navigation } = this.props.navProps;\n return (\n \n \n {this._renderDisplay()}\n
\n
\n
\n
\n );\n }\n\n private _renderDrawerLink(item: IMenuItemData): JSX.Element | null {\n if (item.linkURL && !StringExtensions.isNullOrWhitespace(item.linkURL)) {\n return this._renderLinkMenuItem(item);\n } else if (!item.linkURL) {\n return this._renderSpanMenuItem(item);\n }\n return null;\n }\n\n private _renderDisplay(): JSX.Element[] {\n const { ListItem } = this.props.navProps;\n let menuItemData: IMenuItemData[] = [];\n if (this.state.isOnlyMobile) {\n menuItemData = this.menuItemData;\n } else {\n menuItemData = this.props.navProps.menuItemData;\n }\n const { activeMenu } = this.state;\n const menuItemList: JSX.Element[] = [];\n let cmsMenuData: IMenuItemData[] | undefined = [];\n let retailMenuItemData: IMenuItemData[] | undefined = [];\n const retailMenuData = JSON.parse(JSON.stringify(menuItemData)) as IMenuItemData[];\n\n for (const item of retailMenuData) {\n retailMenuItemData = item.subMenu!.filter(subMenuItem => subMenuItem.id && subMenuItem.id >= MenuTypeIndexId.Retail);\n item.subMenu = retailMenuItemData;\n }\n\n for (const item of menuItemData) {\n cmsMenuData = item.subMenu!.filter(subMenuItem => subMenuItem.id && subMenuItem.id < MenuTypeIndexId.Retail);\n }\n\n if (this.state.isOnlyMobile && activeMenu !== undefined && ArrayExtensions.hasElements(menuItemData)) {\n let menuItem: IMenuItemData | null = {};\n for (const menuItemDatum of menuItemData) {\n if (menuItemDatum.id === activeMenu) {\n menuItem = menuItemDatum;\n if (!NavigationMenuRootEnabled.isBackTrack) {\n this.setState({\n parentMenu: undefined\n });\n } else {\n this.setState({\n parentMenu: undefined,\n mobileViewLabelText: menuItemDatum.linkText\n });\n }\n break;\n }\n menuItem = this._getFromSubMenu(menuItemDatum);\n if (menuItem && menuItem.id === activeMenu) {\n break;\n }\n }\n\n if (menuItem) {\n menuItemList.push(\n \n {` `}\n {this._createMenuItemList(menuItem)} {` `}\n \n );\n }\n } else {\n for (const [index, item] of retailMenuData.entries()) {\n menuItemList.push(\n \n {this._createMenuItemList(item)}\n
\n );\n }\n\n for (const [index, item] of cmsMenuData.entries()) {\n menuItemList.push(\n \n {this._createMenuItemList(item)}\n \n );\n }\n }\n\n return menuItemList;\n }\n\n private _getFromSubMenu(item?: IMenuItemData): IMenuItemData | null {\n const subMenus = item?.subMenu;\n if (subMenus && ArrayExtensions.hasElements(subMenus)) {\n for (let index = 0; index <= subMenus.length - NavMenuConstants.one; index++) {\n const subMenu: IMenuItemData = subMenus[Number(index)];\n let parentMenuId = item?.id;\n\n if (subMenu.id === this.state.activeMenu) {\n if (parentMenuId === NavMenuConstants.rootMenu && subMenu.id! < MenuTypeIndexId.Retail) {\n parentMenuId = undefined;\n }\n\n if (!NavigationMenuRootEnabled.isBackTrack) {\n this.setState({ parentMenu: parentMenuId });\n } else {\n this.setState({ parentMenu: parentMenuId, mobileViewLabelText: subMenu.linkText });\n }\n return subMenu;\n }\n const found = this._getFromSubMenu(subMenu);\n if (found) {\n return found;\n }\n }\n }\n return null;\n }\n\n private _createMenuItemList(menuItemData: IMenuItemData): JSX.Element | null {\n if (ArrayExtensions.hasElements(menuItemData.subMenu)) {\n if (this.state.isOnlyMobile && this.state.activeMenu !== undefined) {\n return this._renderSubMenu(menuItemData.subMenu, menuItemData.id, false);\n }\n return (\n <>\n {this._renderButtonMenuItem(menuItemData)}\n {this._renderSubMenu(menuItemData.subMenu, menuItemData.id)}\n \n );\n } else if (menuItemData.linkURL && !StringExtensions.isNullOrWhitespace(menuItemData.linkURL)) {\n return this._renderLinkMenuItem(menuItemData, menuItemData.id);\n } else if (!menuItemData.linkURL) {\n return this._renderSpanMenuItem(menuItemData);\n }\n\n return null;\n }\n\n private _renderSubMenu(subMenuArray?: IMenuItemData[], activeMenu?: number, isSubMenu?: boolean): JSX.Element | null {\n let subMenus: IMenuItemData[] | undefined = subMenuArray;\n if (activeMenu === NavMenuConstants.rootMenu) {\n subMenus = subMenuArray!.filter(subMenuItem => subMenuItem.id && subMenuItem.id >= MenuTypeIndexId.Retail);\n }\n\n const { ListItem } = this.props.navProps;\n const isEnableMultiSupportMenu = this.props.navProps.config.enableMultilevelMenu ?? false;\n const multiLevelSupportedMenu = this.props.navProps.config.menuLevelSupport ?? NavMenuConstants.three;\n\n if (activeMenu && this.state.activeMenu !== activeMenu) {\n this.props.navProps.context.telemetry.error('Navigation Active menu content is empty, module wont render.');\n return null;\n }\n\n if (!subMenus || !ArrayExtensions.hasElements(subMenus)) {\n this.props.navProps.context.telemetry.error('Navigation Submenu content is empty, module wont render.');\n return null;\n }\n\n let levelClassName: string = '';\n const menuOptions = subMenus.map((option: IMenuItemData, index: number) => {\n const hasOptions = option.subMenu && ArrayExtensions.hasElements(option.subMenu);\n let menuItem: JSX.Element | null;\n if (hasOptions && this.state.isOnlyMobile) {\n menuItem = this._renderButtonMenuItem(option, activeMenu, index);\n } else if (this.currentLevel === NavMenuConstants.one || !hasOptions) {\n menuItem = this.getMenuItem(option, index);\n } else {\n menuItem = null;\n }\n let subMenu;\n const isHavingSubmenu =\n hasOptions && isEnableMultiSupportMenu && this.currentLevel <= Math.round(multiLevelSupportedMenu) - NavMenuConstants.one;\n\n if (hasOptions && !this.state.isOnlyMobile) {\n if (this.currentLevel >= NavMenuConstants.two) {\n subMenu = this._renderSubMenuDrawer(option);\n } else if (this.currentLevel <= this.supportedLevel - NavMenuConstants.one) {\n this.currentLevel++;\n levelClassName = `level-${this.currentLevel.toString()}`;\n subMenu = this._renderSubMenu(option.subMenu, undefined, true);\n }\n }\n if (isHavingSubmenu && this.state.isOnlyMobile) {\n this.currentLevel++;\n levelClassName = isEnableMultiSupportMenu ? `level-${this.currentLevel.toString()}` : '';\n subMenu = this._renderSubMenu(option.subMenu, option.id, true);\n }\n const imagesource = option.imageSource ? option.imageSource : '';\n return (\n \n {menuItem}\n {subMenu}\n \n );\n });\n return this._renderMenu(levelClassName, menuOptions, isSubMenu);\n }\n\n private getMenuItem(option: IMenuItemData, index: number): JSX.Element | null {\n let menuItem: JSX.Element | null;\n if (this.currentLevel === NavMenuConstants.one) {\n menuItem = option.linkURL ? this._renderLinkMenuItemLevelOne(option, index) : this._renderSpanMenuItem(option);\n } else {\n menuItem = option.linkURL ? this._renderLinkMenuItem(option, index) : this._renderSpanMenuItem(option);\n }\n return menuItem;\n }\n\n private _renderSubMenuDrawer(menuItem: IMenuItemData): JSX.Element | null {\n const levelClassName = `level-${this.currentLevel.toString()}`;\n const toggleButtonText = menuItem.linkText;\n const keyValue = this.state.drawerKeyValue;\n const buttonText = toggleButtonText !== undefined ? toggleButtonText : '';\n const keys = keyValue;\n const multiLevelSupportedMenu = this.props.navProps.config.menuLevelSupport ?? NavMenuConstants.three;\n\n let isDrawerOpen = false;\n if (keys[menuItem.id!]) {\n isDrawerOpen = true;\n }\n const colProps: ICollapseProps = { timeout: 0, isOpen: isDrawerOpen };\n return (\n \n
\n {menuItem.subMenu!.map((menuSubItem: IMenuItemData) => {\n if (ArrayExtensions.hasElements(menuSubItem.subMenu)) {\n this.currentLevel++;\n if (this.currentLevel < multiLevelSupportedMenu) {\n return this._renderSubMenuDrawer(menuSubItem);\n }\n }\n return this._renderDrawerLink(menuSubItem);\n })}\n
\n \n );\n }\n\n /**\n * Method to handle escape key event.\n * @param menuId -Number.\n * @param isDrawerOpen -Boolean.\n * @returns Void.\n */\n private readonly _bindDesktopCategoryClick = (menuId: number | undefined, isDrawerOpen: boolean) => (): void => {\n const { drawerKeyValue } = this.state;\n const newPair = { [menuId!]: !isDrawerOpen };\n this.setState({ drawerKeyValue: { ...drawerKeyValue, ...newPair } });\n };\n\n private _renderButtonMenuItem(option: IMenuItemData, activeMenu?: number, index?: number): JSX.Element | null {\n return (\n \n {option.linkText}\n \n );\n }\n\n private _renderLinkMenuItem(option: IMenuItemData, index?: number): JSX.Element | null {\n const { Link } = this.props.navProps;\n const linkText = option.linkText ? option.linkText : '';\n this.payLoad.contentAction.etext = linkText;\n const attributes = getTelemetryAttributes(this.telemetryContent, this.payLoad);\n return (\n \n {option.linkText}\n \n );\n }\n\n private _renderLinkMenuItemLevelOne(option: IMenuItemData, index?: number, isHoverEffect: boolean = true): JSX.Element | null {\n const { Link } = this.props.navProps;\n const linkText = option.linkText ? option.linkText : '';\n const imagesource = option.imageSource ? option.imageSource : '';\n this.payLoad.contentAction.etext = linkText;\n const attributes = getTelemetryAttributes(this.telemetryContent, this.payLoad);\n return (\n \n {option.linkText}\n \n );\n }\n\n private _renderPromotionalLink(linkText?: string, linkUrl?: string): JSX.Element | null {\n const { Link } = this.props.navProps;\n this.payLoad.contentAction.etext = linkText;\n const attributes = getTelemetryAttributes(this.telemetryContent, this.payLoad);\n if (linkText && linkUrl) {\n return (\n \n {linkText}\n \n );\n }\n return null;\n }\n\n private _renderSpanMenuItem(option: IMenuItemData, index?: number): JSX.Element | null {\n const { Span } = this.props.navProps;\n return (\n \n {option.linkText}\n \n );\n }\n\n private _renderMenu(level: string, menuOptions: JSX.Element[], isSubmenu?: boolean): JSX.Element | null {\n const { DivContainer, ImageDivContainer, showCategoryImage, showPromotionalContent } = this.props.navProps;\n const isCategoryImageDisplay =\n !this.state.isOnlyMobile &&\n showCategoryImage &&\n this.state.categoryImage !== null &&\n this.state.categoryImage !== undefined &&\n !isSubmenu;\n const isPromotionalContentDisplay =\n !this.state.isOnlyMobile && showPromotionalContent && ArrayExtensions.hasElements(this.state.categoryImage) && !isSubmenu;\n const divContainerClass =\n this.currentLevel > NavMenuConstants.two || isCategoryImageDisplay ? DivContainer!.className : 'ms-nav__deafult';\n this.currentLevel = NavMenuConstants.one;\n const menuLevelSupportClassName =\n isCategoryImageDisplay &&\n this.props.navProps.config.menuLevelSupport &&\n this.props.navProps.config.menuLevelSupport > NavMenuConstants.two &&\n 'navmenu-multi-level';\n\n const categoryImages = this.state.categoryImage?.filter(image => !StringExtensions.isNullOrWhitespace(image.src));\n const imagesContainerKey = categoryImages?.map(item => item.src).join('-');\n return (\n \n \n {menuOptions}\n \n
\n {isCategoryImageDisplay &&\n ArrayExtensions.hasElements(categoryImages) &&\n categoryImages.map(item => (\n \n {getCategoryImage(this.props, item.src ?? '', item.altText!.toString())}\n {isPromotionalContentDisplay &&\n this._renderPromotionalLink(item.altText, item.additionalProperties?.linkUrl)}\n \n ))}\n
\n \n );\n }\n\n /**\n * Handle Category image update.\n * @param categoryImageSource - Image source.\n * @param option - Menu Item data.\n * @returns Returns empty.\n */\n private readonly _updateCategoryImage = (categoryImageSource: string, option: IMenuItemData) => () => {\n const linkText = option.linkText ? option.linkText : '';\n const promotionalImage: Msdyn365.IImageData[] = [{ src: categoryImageSource, altText: linkText }];\n\n // Read category and promotional image in one array\n if (ArrayExtensions.hasElements(option.promotionalContent)) {\n for (const item of option.promotionalContent) {\n const imageSource = item.image.src;\n promotionalImage.push({\n src: imageSource,\n altText: item.text,\n additionalProperties: { linkUrl: item.linkUrl.destinationUrl }\n });\n }\n }\n this.setState({\n categoryImage: ArrayExtensions.hasElements(promotionalImage) ? promotionalImage : [{ src: 'empty' }]\n });\n };\n\n /**\n * Handle dropdown toggle.\n * @param data - Menu Item data.\n * @param parentId - Number.\n * @returns Returns empty.\n */\n private readonly _handleDropdownToggle = (data: IMenuItemData, parentId?: number) => () => {\n if (!this.state.isOnlyMobile) {\n this.setState({\n activeMenu: data.id,\n parentMenu: parentId\n });\n if (this.props.navProps.showCategoryImage) {\n this._updateCategoryImage(data.imageSource!, data)();\n }\n } else {\n NavigationMenuRootEnabled.isBackTrack = false;\n this.setState({\n activeMenu: data.id,\n mobileViewLabelText: data.linkText!,\n parentMenu: parentId\n });\n }\n };\n\n /**\n * Handle back navigation for menu items for mobile view.\n * @returns Returns empty.\n */\n private readonly _handleGoBack = () => () => {\n NavigationMenuRootEnabled.isBackTrack = true;\n this.setState(previousState => ({ activeMenu: previousState.parentMenu }));\n };\n\n /**\n * Function to close the nav menu on click on body.\n * @param event - MouseEvent.\n */\n private readonly _handleClickOutside = (event: MouseEvent) => {\n if (this.menuNode.current && !this.menuNode.current.contains(event.target as Node)) {\n if (!this.state.isOnlyMobile) {\n this.setState({ activeMenu: NavMenuConstants.rootMenu, mobileViewLabelText: '', isNavOpen: false });\n } else {\n this.setState({ activeMenu: undefined, mobileViewLabelText: '', isNavOpen: false });\n }\n }\n };\n\n /**\n * Add shop all link for Mobile submenu.\n */\n private readonly _addShopAllLink = (): void => {\n const { menuItemData } = this.props.navProps;\n this.menuItemData = menuItemData;\n if (ArrayExtensions.hasElements(menuItemData) && ArrayExtensions.hasElements(menuItemData[0].subMenu)) {\n this.menuItemData[0].subMenu?.map(item => {\n const shopAllObject = {};\n Object.assign(shopAllObject, { imageSource: item.imageSource });\n Object.assign(shopAllObject, { linkText: this.props.navProps.resources.allCategoryMenuText });\n Object.assign(shopAllObject, { linkURL: item.linkURL });\n if (ArrayExtensions.hasElements(item.subMenu) && item.menuSource === MenuSource.Retail) {\n item.subMenu.unshift(shopAllObject);\n }\n return item;\n });\n }\n };\n\n /**\n * Checks to assign a ref for focus.\n * @param index -Sub menu list index.\n * @param mobileViewLabelText -Mobile view label text.\n * @param optionLinkText -Sub menu item link text.\n * @returns Boolean.\n */\n private readonly _shouldAddFocusMenuRef = (index: number, mobileViewLabelText?: string, optionLinkText?: string) => {\n const firstIndex: number = 0;\n if (!NavigationMenuRootEnabled.isBackTrack && index === firstIndex) {\n return true;\n }\n if (!optionLinkText || !mobileViewLabelText) {\n return false;\n }\n return mobileViewLabelText === optionLinkText;\n };\n\n /**\n * Function to handle nav menu close.\n */\n private readonly _closeNavMenu = (): void => {\n if (!this.state.isOnlyMobile) {\n this.setState({ activeMenu: NavMenuConstants.rootMenu, mobileViewLabelText: '', isNavOpen: false });\n } else {\n this.setState({ activeMenu: undefined, mobileViewLabelText: '', isNavOpen: false });\n }\n };\n\n /**\n * Function to close the nav menu on esc key.\n * @param event - Event.\n */\n private readonly _escFunction = (event: React.KeyboardEvent) => {\n if (event.keyCode === this.escapeKey && !this.state.isOnlyMobile && this.state.isNavOpen) {\n this.setState({ activeMenu: NavMenuConstants.rootMenu, mobileViewLabelText: '', isNavOpen: false });\n }\n };\n\n /**\n * Custom update viewport.\n */\n private readonly _customUpdateViewport = (): void => {\n this.setState({ isOnlyMobile: this.isOnlyMobile });\n };\n}\n\nexport default NavigationMenuRootEnabled;\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { INavigationMenuViewProps } from '@msdyn365-commerce-modules/navigation-menu';\nimport * as React from 'react';\n\nimport { INavigationMenuProps } from '../definition-extensions/navigation-menu.ext.props.autogenerated';\nimport NavigationMenuRootDisabled from './components/navigation-menu-root-disabled';\nimport NavigationMenuRootEnabled from './components/navigation-menu-root-enabled';\n\n/**\n * Render the Navigation menu.\n * @param props - The navigation menu view props.\n * @returns Return HTML having INavigationMenuViewProps props with navigation menu.\n */\nconst navigationMenuView = (props: INavigationMenuViewProps & INavigationMenuProps<{}>): JSX.Element => {\n if (props.config.enabletopMenu) {\n return ;\n }\n\n return ;\n};\n\nexport default navigationMenuView;\n","/*--------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * See License.txt in the project root for license information.\n *--------------------------------------------------------------*/\n\nimport { CategoryHierarchy } from '@msdyn365-commerce/commerce-entities';\nimport { AsyncResult } from '@msdyn365-commerce/retail-proxy';\n\nimport { ICategoryPromotionalContentData } from './navigation-menu.props.autogenerated';\n\nexport interface INavigationMenuData {\n categories: AsyncResult;\n}\n\nexport interface IMenuItemData {\n id?: number;\n linkText?: string;\n linkURL?: string;\n imageSource?: string;\n imageDestinationURL?: string;\n subMenu?: IMenuItemData[];\n promotionalContent?: ICategoryPromotionalContentData[];\n menuSource?: string;\n shouldOpenNewTab?: boolean;\n ariaLabel?: string;\n}\n\n/**\n *\n * Menu type index id.\n */\nexport enum MenuTypeIndexId {\n Cms = 1000,\n Retail = 5000\n}\n\n/**\n *\n * Menu type source.\n */\nexport enum MenuSource {\n Cms = 'Cms',\n Retail = 'Retail'\n}\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { CategoryHierarchy } from '@msdyn365-commerce/commerce-entities';\nimport MsDyn365, { IActionContext, IGridSettings, IImageSettings, isEmptyOrNullObject } from '@msdyn365-commerce/core';\nimport { TextValueTranslation } from '@msdyn365-commerce/retail-proxy';\nimport { ArrayExtensions, getCategoryUrl } from '@msdyn365-commerce-modules/retail-actions';\nimport { addThrottledEvent, IModuleProps, INodeProps } from '@msdyn365-commerce-modules/utilities';\nimport classnames from 'classnames';\nimport { computed, observable } from 'mobx';\nimport * as React from 'react';\n\nimport { IMenuItemData, INavigationMenuData, MenuSource, MenuTypeIndexId } from './navigation-menu.data';\nimport { ICmsNavItemsData, INavigationMenuProps, ISubMenusData, navigationMenuSource } from './navigation-menu.props.autogenerated';\n\nexport interface INavigationMenuViewProps extends INavigationMenuProps {\n className: string;\n menuItemData: IMenuItemData[];\n Navigation: IModuleProps;\n MenuList: INodeProps;\n ListItem: INodeProps;\n Link: INodeProps;\n Button: INodeProps;\n Span: INodeProps;\n ImageContainer: INodeProps;\n MobileDescriptionContainer: INodeProps;\n MobileBackButton: INodeProps;\n MobileDescriptionLabel: INodeProps;\n imageSettings: IImageSettings;\n gridSettings: IGridSettings;\n isMobileView: boolean;\n DivContainer?: INodeProps;\n ImageDivContainer?: INodeProps;\n showCategoryImage?: boolean;\n showPromotionalContent?: boolean;\n}\n\nexport type GridSize = 'xs' | 'sm' | 'md' | 'lg' | 'xl';\n\nexport interface INavigationMenuState {\n isMobile: boolean;\n}\n\n/**\n *\n * NavigationMenu component.\n * @extends {React.PureComponent>}\n */\nclass NavigationMenu extends React.PureComponent, INavigationMenuState> {\n private static CMSItemIdInit: number = MenuTypeIndexId.Cms;\n\n private static RSItemIdInit: number = MenuTypeIndexId.Retail;\n\n private resizeThrottledEventHandler?: (event: Event) => void;\n\n private menuItemList: IMenuItemData[];\n\n private isRetail: boolean = true;\n\n private isCMS: boolean = true;\n\n @observable\n private viewport: GridSize;\n\n public static getFriendlyName(locale: string, nameTranslations?: TextValueTranslation[]): string | undefined {\n let nameTranslation: TextValueTranslation | undefined;\n if (locale && nameTranslations && nameTranslations.length > 0) {\n nameTranslation = nameTranslations.find(item => item.Language!.toLowerCase() === locale.toLowerCase());\n }\n\n return nameTranslation && nameTranslation.Text;\n }\n\n constructor(props: INavigationMenuProps) {\n super(props);\n this._updateViewport = this._updateViewport.bind(this);\n this.viewport =\n props.context.request && props.context.request.device && props.context.request.device.Type === 'Mobile' ? 'xs' : 'lg';\n this._setNavigationSource(this.props.config && this.props.config.navigationMenuSource);\n this.state = { isMobile: this.isMobile };\n this.menuItemList = [];\n }\n\n @computed get isMobile(): boolean {\n return this.viewport === 'xs' || this.viewport === 'sm';\n }\n\n public componentDidMount(): void {\n if (MsDyn365.isBrowser) {\n this.resizeThrottledEventHandler = addThrottledEvent(window, 'resize', this._updateViewport as EventListener);\n }\n this._updateViewport();\n }\n\n public componentWillUnmount(): void {\n if (MsDyn365.isBrowser) {\n window.removeEventListener('resize', this.resizeThrottledEventHandler!, false);\n }\n }\n\n public render(): JSX.Element | null {\n this.menuItemList = this._mapData();\n if (isEmptyOrNullObject(this.props.data)) {\n this.props.telemetry.error('Navigatiomenu returned null');\n return null;\n }\n\n const defaultImageSettings: IImageSettings = {\n viewports: {\n xs: { q: 'w=224&h=300&m=6', w: 0, h: 0 },\n xl: { q: 'w=224&h=300&m=6', w: 0, h: 0 }\n },\n lazyload: true\n };\n\n const viewProps = {\n ...this.props,\n ...this.state,\n imageSettings: defaultImageSettings,\n gridSettings: this.props.context.request.gridSettings,\n Navigation: {\n moduleProps: this.props,\n className: classnames('ms-nav', this.props.config.className, this.state.isMobile ? 'mobile-vp' : 'desktop-vp'),\n tag: 'nav',\n role: this.isMobile ? 'listbox' : 'navigation'\n },\n MenuList: {\n className: 'ms-nav__list',\n tag: 'ul',\n role: this.isMobile ? 'listbox' : 'menu'\n },\n ListItem: {\n className: 'ms-nav__list__item',\n role: 'presentation',\n tag: 'li'\n },\n showCategoryImage: this.props.config.displayCategoryImage ?? false,\n showPromotionalContent: this.props.config.displayPromotionalImage ?? false,\n Link: {\n tag: 'a',\n className: 'ms-nav__list__item__link',\n role: this.isMobile ? 'option' : 'menuitem'\n },\n DivContainer: {\n tag: 'div',\n className: 'ms-nav__feature'\n },\n ImageDivContainer: {\n tag: 'div',\n className: 'category-image',\n role: 'tabpanel'\n },\n Button: {\n className: 'ms-nav__list__item__button',\n tag: 'button',\n role: this.isMobile ? 'option' : 'menuitem',\n onClick: this.props\n },\n ImageContainer: {\n className: 'ms-nav__list__item__image'\n },\n Span: {\n className: 'ms-nav__list__item__span',\n tag: 'span'\n },\n MobileDescriptionContainer: {\n className: 'ms-nav__list__mobile__container'\n },\n MobileBackButton: {\n className: 'ms-nav__list__mobile__container__button',\n tag: 'button',\n 'aria-label': this.props.resources.backButtonAriaLabel,\n onClick: this.props\n },\n MobileDescriptionLabel: {\n className: 'ms-nav__list__mobile__container__span',\n tag: 'span'\n },\n isMobileView: this.state.isMobile,\n menuItemData: this.menuItemList,\n className: classnames('ms-nav', this.props.config.className)\n };\n\n return this.props.renderView(viewProps) as React.ReactElement;\n }\n\n private _mapData(): IMenuItemData[] {\n const { data, config } = this.props;\n const mergedData: IMenuItemData[] = [];\n if (this.isRetail && data && data.categories && data.categories.result && data.categories.result.length > 0) {\n data.categories.result.map((item: CategoryHierarchy, index) =>\n mergedData.push(this._constructMenuItemData(item, undefined, true, index, true))\n );\n }\n\n if (this.isCMS && config.cmsNavItems && config.cmsNavItems.length > 0) {\n config.cmsNavItems.map((item: ICmsNavItemsData, idx: number) =>\n mergedData.push(this._constructMenuItemData(undefined, item, false, idx + 1))\n );\n }\n return this._constructTopMenuItemData(mergedData);\n }\n\n private _constructTopMenuItemData(mergedData: IMenuItemData[]): IMenuItemData[] {\n const enableTopLevelMenu = this.props.config.enabletopMenu ?? false;\n if (!enableTopLevelMenu) {\n return mergedData;\n }\n const mergedRootMenuData: IMenuItemData[] = [];\n const topMenu = {\n id: 1,\n linkText: this.props.config.rootMenuNavigation ?? '...',\n linkURL: '#',\n imageSource: undefined,\n subMenu: mergedData\n } as IMenuItemData;\n mergedRootMenuData.push(topMenu);\n\n return mergedRootMenuData;\n }\n\n private _constructMenuItemData(\n retailItem?: CategoryHierarchy,\n cmsItem?: ICmsNavItemsData,\n isRetail?: boolean,\n idx?: number,\n addedAllMenu?: boolean\n ): IMenuItemData {\n const locale =\n this.props.context && this.props.context.request && this.props.context.request.locale\n ? this.props.context.request.locale\n : 'en-us';\n const { categoryPromotionalContent } = this.props.config;\n const cmsItemText = (cmsItem && cmsItem.linkText) || '';\n const { menuAriaLabel } = this.props.resources;\n\n // Filter category promotional data based on category name\n const promotionalData =\n retailItem &&\n categoryPromotionalContent?.filter(promoItem => promoItem.categoryName?.toLowerCase() === retailItem?.Name?.toLowerCase());\n\n // First check if image is available from promotional data else read from retail server\n let imageSource: string = 'empty';\n if (ArrayExtensions.hasElements(retailItem?.Images) && retailItem!.Images[0].Uri) {\n imageSource = retailItem!.Images[0].Uri;\n }\n if (isRetail) {\n return {\n id: NavigationMenu.RSItemIdInit++,\n linkText: NavigationMenu.getFriendlyName(locale, retailItem?.NameTranslations) ?? '',\n linkURL: retailItem?.Url,\n imageSource,\n subMenu: this._getNestedChildren(retailItem, imageSource, addedAllMenu),\n promotionalContent: this.props.config.displayPromotionalImage && promotionalData,\n menuSource: MenuSource.Retail,\n ariaLabel: `${NavigationMenu.getFriendlyName(locale, retailItem?.NameTranslations) ?? ''} ${menuAriaLabel}`\n } as IMenuItemData;\n }\n return {\n id: NavigationMenu.CMSItemIdInit++,\n linkText: cmsItemText,\n linkURL: (cmsItem && cmsItem.linkUrl && cmsItem.linkUrl.destinationUrl) || '',\n imageDestinationURL: (cmsItem && cmsItem.imageLink && cmsItem.imageLink.destinationUrl) || '',\n imageSource: (cmsItem && cmsItem.image && cmsItem.image.src) || '',\n subMenu: this._getCMSNestedChildren(cmsItem),\n menuSource: MenuSource.Cms,\n shouldOpenNewTab: cmsItem?.openInNewTab,\n ariaLabel: `${cmsItemText} ${menuAriaLabel}`\n } as IMenuItemData;\n }\n\n private _getNestedChildren(category?: CategoryHierarchy, imageSourceUrl?: string, addedAllMenu: boolean = false): IMenuItemData[] {\n const nestedChildren: IMenuItemData[] = [];\n if (!category || !category.Children || category.Children.length === 0) {\n return [];\n }\n if (!this.props.config.enabletopMenu && addedAllMenu) {\n nestedChildren.push({\n linkText: this.props.resources.allCategoryMenuText,\n imageSource: imageSourceUrl,\n linkURL: getCategoryUrl(category, (this.props.context as unknown) as IActionContext, {})\n });\n }\n category.Children.map((item: CategoryHierarchy, index) => {\n nestedChildren.push(this._constructMenuItemData(item, undefined, true, index, false));\n });\n return nestedChildren;\n }\n\n private _getCMSNestedChildren(category?: ICmsNavItemsData): IMenuItemData[] {\n const nestedChildren: IMenuItemData[] = [];\n\n if (!category || !category.subMenus || category.subMenus.length === 0) {\n return [];\n }\n\n category.subMenus.map((item: ISubMenusData, idx: number) => {\n nestedChildren.push(this._constructMenuItemData(undefined, item, false, idx));\n });\n return nestedChildren;\n }\n\n private readonly _setNavigationSource = (sourceType?: navigationMenuSource): void => {\n switch (sourceType) {\n case navigationMenuSource.retailServerOnly:\n this.isRetail = true;\n this.isCMS = false;\n break;\n case navigationMenuSource.cmsOnly:\n this.isRetail = false;\n this.isCMS = true;\n break;\n case navigationMenuSource.all:\n this.isRetail = true;\n this.isCMS = true;\n break;\n default:\n }\n };\n\n private _updateViewport(): void {\n this.viewport = this._getViewport();\n this.setState({ isMobile: this.isMobile });\n }\n\n private _getViewport(): GridSize {\n const { context } = this.props;\n\n // Always render in mobile viewport on a mobile device\n if (context.request && context.request.device && context.request.device.Type === 'Mobile') {\n return 'xs';\n }\n\n if (MsDyn365.isBrowser && window.innerWidth) {\n const gridSettings = context.request.gridSettings;\n if (gridSettings) {\n if (gridSettings.xs && window.innerWidth <= gridSettings.xs.w) {\n return 'xs';\n } else if (gridSettings.sm && window.innerWidth <= gridSettings.sm.w) {\n return 'sm';\n } else if (gridSettings.md && window.innerWidth <= gridSettings.md.w) {\n return 'md';\n } else if (gridSettings.lg && window.innerWidth <= gridSettings.lg.w) {\n return 'lg';\n }\n return 'xl';\n }\n }\n\n return 'xs';\n }\n}\n\nexport default NavigationMenu;\n","/*--------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * See License.txt in the project root for license information.\r\n *--------------------------------------------------------------*/\r\n\r\nimport * as Msdyn365 from '@msdyn365-commerce/core';\r\nimport { INavigationMenuViewProps } from '@msdyn365-commerce-modules/navigation-menu';\r\nimport { generateImageUrl } from '@msdyn365-commerce-modules/retail-actions';\r\nimport * as React from 'react';\r\n\r\nimport { INavigationMenuProps } from '../../definition-extensions/navigation-menu.ext.props.autogenerated';\r\n\r\n/**\r\n * INavigationMenuViewRootProps.\r\n */\r\nexport interface INavigationMenuViewRootProps {\r\n navProps: INavigationMenuViewProps & INavigationMenuProps<{}>;\r\n}\r\n\r\n/**\r\n * Represent navigation menu state interface.\r\n */\r\nexport interface INavigationState {\r\n parentMenu?: number;\r\n activeMenu?: number;\r\n categoryImage?: Msdyn365.IImageData[] | null;\r\n mobileViewLabelText?: string;\r\n isDrawerOpen: boolean;\r\n desktopCategoryId: number;\r\n isOnlyMobile: boolean;\r\n isNavOpen: boolean;\r\n}\r\n\r\n/**\r\n * NavMenuConstants enum.\r\n */\r\nexport enum NavMenuConstants {\r\n zero = 0,\r\n one = 1,\r\n two = 2,\r\n three = 3,\r\n four = 4,\r\n escapeKey = 27,\r\n rootMenu = 1\r\n}\r\n\r\n/**\r\n * GridSizes.\r\n */\r\nexport type GridSize = 'xs' | 'sm' | 'md' | 'lg' | 'xl';\r\n\r\n/**\r\n * Get category image.\r\n * @param props - Navigation menu props.\r\n * @param categoryImage - Category Image.\r\n * @param alttext - AltText String.\r\n * @returns Returns Node.\r\n */\r\nexport const getCategoryImage = (props: INavigationMenuViewRootProps, categoryImage: string, alttext: string): React.ReactNode | null => {\r\n\r\n const categoryImageUrl = generateImageUrl(`${categoryImage}`, props.navProps.context.actionContext.requestContext.apiSettings);\r\n const defaultImageSettings: Msdyn365.IImageSettings = {\r\n viewports: {\r\n xs: { q: 'w=162&h=162&m=8', w: 0, h: 0 },\r\n sm: { q: 'w=162&h=162&m=8', w: 0, h: 0 },\r\n md: { q: 'w=203&h=203&m=8', w: 0, h: 0 },\r\n lg: { q: 'w=203&h=203&m=8', w: 0, h: 0 }\r\n },\r\n lazyload: true\r\n };\r\n if (categoryImageUrl !== undefined) {\r\n const imageData: Msdyn365.IImageData = { src: categoryImageUrl };\r\n return (\r\n \r\n );\r\n }\r\n return null;\r\n};\r\n","/*--------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * See License.txt in the project root for license information.\r\n *--------------------------------------------------------------*/\r\n\r\nimport * as Msdyn365 from '@msdyn365-commerce/core';\r\nimport { IMenuItemData, MenuTypeIndexId } from '@msdyn365-commerce-modules/navigation-menu';\r\nimport { ArrayExtensions, StringExtensions } from '@msdyn365-commerce-modules/retail-actions';\r\nimport {\r\n addThrottledEvent,\r\n Button,\r\n Collapse, Drawer,\r\n getPayloadObject,\r\n getTelemetryAttributes,\r\n getTelemetryObject,\r\n IPayLoad,\r\n isMobile,\r\n ITelemetryContent,\r\n Module,\r\n Node,\r\n onTelemetryClick,\r\n VariantType\r\n} from '@msdyn365-commerce-modules/utilities';\r\nimport classnames from 'classnames';\r\nimport { computed } from 'mobx';\r\nimport * as React from 'react';\r\n\r\nimport { getCategoryImage, INavigationMenuViewRootProps, INavigationState, NavMenuConstants } from './navigation-menu-utilities';\r\n\r\n/**\r\n *\r\n * NavigationMenuRootDisabled component.\r\n * @extends {React.PureComponent}\r\n */\r\nexport class NavigationMenuRootDisabled extends React.PureComponent {\r\n private static isBackTrack: boolean = false;\r\n\r\n private readonly supportedLevel: number = NavMenuConstants.four;\r\n\r\n private currentLevel: number = NavMenuConstants.zero;\r\n\r\n private readonly menuNode: React.RefObject;\r\n\r\n private readonly menuItemRef: React.RefObject;\r\n\r\n private readonly escapeKey: number = NavMenuConstants.escapeKey;\r\n\r\n private readonly telemetryContent: ITelemetryContent;\r\n\r\n private readonly promotionalImage: Msdyn365.IImageData[] = [];\r\n\r\n private readonly payLoad: IPayLoad;\r\n\r\n private readonly attributes?: Msdyn365.IDictionary;\r\n\r\n private customResizeThrottledEventHandler?: (event: Event) => void;\r\n\r\n public constructor(props: INavigationMenuViewRootProps) {\r\n super(props);\r\n this.menuNode = React.createRef();\r\n this.menuItemRef = React.createRef();\r\n const { menuItemData } = this.props.navProps;\r\n if (ArrayExtensions.hasElements(menuItemData) && ArrayExtensions.hasElements(menuItemData[0].subMenu)) {\r\n const imagesource = menuItemData[0].subMenu[0].imageSource ? menuItemData[0].subMenu[0].imageSource : '';\r\n const linkText = menuItemData[0].subMenu[0].linkText ? menuItemData[0].subMenu[0].linkText : '';\r\n this.promotionalImage = [{ src: imagesource, altText: linkText }];\r\n\r\n // Read category and promotional image in one array\r\n if (ArrayExtensions.hasElements(menuItemData[0].subMenu[0].promotionalContent)) {\r\n menuItemData[0].subMenu[0].promotionalContent.map(item => {\r\n const imageSource = item.image.src;\r\n this.promotionalImage.push({ src: imageSource, altText: item.text, additionalProperties: { linkUrl: item.linkUrl.destinationUrl } });\r\n return null;\r\n });\r\n }\r\n }\r\n this.state = {\r\n activeMenu: 1,\r\n mobileViewLabelText: '',\r\n parentMenu: undefined,\r\n isDrawerOpen: false,\r\n desktopCategoryId: -1,\r\n isOnlyMobile: this.isOnlyMobile,\r\n categoryImage: this.promotionalImage,\r\n isNavOpen: false\r\n };\r\n this.telemetryContent = getTelemetryObject(this.props.navProps.context.request.telemetryPageName!,\r\n this.props.navProps.friendlyName,\r\n this.props.navProps.telemetry);\r\n this.payLoad = getPayloadObject('click', this.telemetryContent, '', '');\r\n this.attributes = getTelemetryAttributes(this.telemetryContent, this.payLoad);\r\n }\r\n\r\n @computed public get isOnlyMobile(): boolean {\r\n return (isMobile({ variant: VariantType.Browser, context: this.props.navProps.context.request }) === 'xs');\r\n }\r\n\r\n public componentDidMount(): void {\r\n this.customResizeThrottledEventHandler = addThrottledEvent(window, 'resize', this._customUpdateViewport as EventListener);\r\n document.addEventListener('keydown', (this._escFunction as unknown) as EventListener, false);\r\n this._customUpdateViewport();\r\n document.body.addEventListener('mousedown', this._handleClickOutside);\r\n }\r\n\r\n public componentDidUpdate(): void {\r\n if (this.menuItemRef.current?.children[0] && this.props.navProps.isMobileView) {\r\n (this.menuItemRef.current.children[0] as HTMLElement).focus();\r\n }\r\n }\r\n\r\n public componentWillUnmount(): void {\r\n window.removeEventListener('resize', this.customResizeThrottledEventHandler!, false);\r\n document.body.removeEventListener('mousedown', this._handleClickOutside, false);\r\n }\r\n\r\n public render(): JSX.Element | null {\r\n this.currentLevel = 1;\r\n const navbarKey = 'header-nav-mobile';\r\n return (\r\n \r\n {\r\n this.state.isOnlyMobile ? this._renderMobileMenu() : (<>\r\n \r\n {this._renderCollapseMenu()}\r\n )\r\n }\r\n \r\n );\r\n }\r\n\r\n /**\r\n * Function to handle nav bar toggle.\r\n */\r\n private readonly _toggleNavBar = (): void => {\r\n this.setState(previousState => ({\r\n activeMenu: 1,\r\n isNavOpen: !previousState.isNavOpen\r\n }));\r\n };\r\n\r\n private _renderCollapseMenu(): JSX.Element | null {\r\n return (\r\n \r\n {this.state.isOnlyMobile ? this._renderMobileMenu() : this._renderDesktopMenu()}\r\n \r\n );\r\n }\r\n\r\n private _renderMobileMenu(): JSX.Element {\r\n const { MenuList, MobileBackButton, MobileDescriptionContainer, MobileDescriptionLabel, Navigation } = this.props.navProps;\r\n\r\n this.currentLevel = 1;\r\n return (\r\n \r\n \r\n {this.state.isOnlyMobile && this.state.activeMenu !== undefined &&\r\n \r\n \r\n \r\n {this.state.mobileViewLabelText}\r\n \r\n }\r\n {this._renderDisplay()}\r\n \r\n \r\n );\r\n }\r\n\r\n private _renderDesktopMenu(): JSX.Element {\r\n const { MenuList, Navigation } = this.props.navProps;\r\n\r\n return (\r\n \r\n \r\n {this._renderDisplay()}\r\n
\r\n
\r\n
\r\n
\r\n );\r\n }\r\n\r\n private _renderDrawerLink(item: IMenuItemData): JSX.Element | null {\r\n if (item.linkURL && !StringExtensions.isNullOrWhitespace(item.linkURL)) {\r\n return (\r\n this._renderLinkMenuItem(item)\r\n );\r\n } else if (!item.linkURL) {\r\n return (\r\n this._renderSpanMenuItem(item)\r\n );\r\n }\r\n return null;\r\n }\r\n\r\n private _renderDisplay(): JSX.Element[] {\r\n const { ListItem } = this.props.navProps;\r\n const menuItemData: IMenuItemData[] = this.props.navProps.menuItemData;\r\n const { activeMenu } = this.state;\r\n const menuItemList: JSX.Element[] = [];\r\n\r\n if (ArrayExtensions.hasElements(menuItemData)) {\r\n menuItemData[0].id = 1;\r\n }\r\n\r\n if (this.state.isOnlyMobile && activeMenu !== undefined && ArrayExtensions.hasElements(menuItemData)) {\r\n const menuItem = this._getFromSubMenu(undefined, menuItemData);\r\n\r\n if (menuItem) {\r\n menuItemList.push(\r\n \r\n {' '}\r\n {this._createMenuItemList(menuItem)}\r\n {' '}\r\n \r\n );\r\n }\r\n } else {\r\n\r\n for (const [index, item] of menuItemData.entries()) {\r\n menuItemList.push(\r\n \r\n {this._createMenuItemList(item)}\r\n
\r\n );\r\n }\r\n\r\n }\r\n\r\n return menuItemList;\r\n }\r\n\r\n private _getFromSubMenu(parentMenuId?: number, menu?: IMenuItemData[]): IMenuItemData | null {\r\n if (!menu) {\r\n return null;\r\n }\r\n\r\n for (let index = 0; index <= menu.length - NavMenuConstants.one; index++) {\r\n const item: IMenuItemData = menu[Number(index)];\r\n\r\n if (item.id === this.state.activeMenu) {\r\n if (!NavigationMenuRootDisabled.isBackTrack) {\r\n this.setState({ parentMenu: parentMenuId });\r\n } else {\r\n this.setState({ parentMenu: parentMenuId, mobileViewLabelText: item.linkText });\r\n }\r\n return item;\r\n }\r\n const found = this._getFromSubMenu(item.id, item.subMenu);\r\n if (found) {\r\n return found;\r\n }\r\n }\r\n return null;\r\n }\r\n\r\n private _createMenuItemList(menuItemData: IMenuItemData): JSX.Element | null {\r\n if (ArrayExtensions.hasElements(menuItemData.subMenu)) {\r\n if (this.state.isOnlyMobile && this.state.activeMenu !== undefined) {\r\n return (this._renderSubMenu(menuItemData.subMenu, menuItemData.id, false));\r\n }\r\n\r\n return (\r\n <>\r\n {this._renderButtonMenuItem(menuItemData)}\r\n {this._renderSubMenu(menuItemData.subMenu, menuItemData.id)}\r\n \r\n );\r\n\r\n } else if (menuItemData.linkURL && !StringExtensions.isNullOrWhitespace(menuItemData.linkURL)) {\r\n return (this._renderLinkMenuItem(menuItemData, menuItemData.id));\r\n } else if (!menuItemData.linkURL && !(this.state.isOnlyMobile && this.state.activeMenu !== undefined)) {\r\n return (this._renderSpanMenuItem(menuItemData));\r\n }\r\n\r\n return null;\r\n }\r\n\r\n private _renderSubMenu(subMenuArray?: IMenuItemData[], activeMenu?: number, isSubMenu?: boolean): JSX.Element | null {\r\n\r\n let subMenus: IMenuItemData[] | undefined = subMenuArray;\r\n if (activeMenu === NavMenuConstants.rootMenu) {\r\n subMenus = subMenuArray!.filter(subMenuItem => (subMenuItem.id && subMenuItem.id >= MenuTypeIndexId.Retail));\r\n }\r\n\r\n const { ListItem } = this.props.navProps;\r\n const isEnableMultiSupportMenu = this.props.navProps.config.enableMultilevelMenu ?? false;\r\n const multiLevelSupportedMenu = this.props.navProps.config.menuLevelSupport ?? NavMenuConstants.three;\r\n\r\n if (activeMenu && this.state.activeMenu !== activeMenu) {\r\n this.props.navProps.context.telemetry.error('Navigation Active menu content is empty, module wont render.');\r\n return null;\r\n }\r\n\r\n if (!subMenus || !ArrayExtensions.hasElements(subMenus)) {\r\n this.props.navProps.context.telemetry.error('Navigation Submenu content is empty, module wont render.');\r\n return null;\r\n }\r\n\r\n let levelClassName: string = '';\r\n const menuOptions = subMenus.map((option: IMenuItemData, index: number) => {\r\n const hasOptions = (option.subMenu && ArrayExtensions.hasElements(option.subMenu));\r\n let menuItem: JSX.Element | null;\r\n if (hasOptions && this.state.isOnlyMobile) {\r\n menuItem = this._renderButtonMenuItem(option, activeMenu, index);\r\n } else if (this.currentLevel === NavMenuConstants.one || !hasOptions) {\r\n menuItem = this.getMenuItem(option, index);\r\n } else {\r\n menuItem = null;\r\n }\r\n let subMenu;\r\n const isHavingSubmenu = hasOptions && isEnableMultiSupportMenu && (this.currentLevel <= Math.round(multiLevelSupportedMenu) - NavMenuConstants.one);\r\n\r\n if (hasOptions && !this.state.isOnlyMobile) {\r\n\r\n if (this.currentLevel >= NavMenuConstants.two) {\r\n levelClassName = 'level-3';\r\n subMenu = this._renderSubMenuDrawer(levelClassName, option);\r\n } else if (this.currentLevel <= this.supportedLevel) {\r\n this.currentLevel++;\r\n levelClassName = `level-${this.currentLevel.toString()}`;\r\n subMenu = this._renderSubMenu(option.subMenu, undefined, true);\r\n }\r\n }\r\n\r\n if (isHavingSubmenu && this.state.isOnlyMobile) {\r\n this.currentLevel++;\r\n levelClassName = isEnableMultiSupportMenu ? `level-${this.currentLevel.toString()}` : '';\r\n subMenu = this._renderSubMenu(option.subMenu, option.id, true);\r\n }\r\n const imagesource = option.imageSource ? option.imageSource : '';\r\n return (\r\n \r\n { menuItem}\r\n { subMenu}\r\n \r\n );\r\n });\r\n return (this._renderMenu(levelClassName, menuOptions, isSubMenu));\r\n }\r\n\r\n private getMenuItem(option: IMenuItemData, index: number): JSX.Element | null {\r\n let menuItem: JSX.Element | null;\r\n if (this.currentLevel === NavMenuConstants.one) {\r\n menuItem = (option.linkURL ? this._renderLinkMenuItemLevelOne(option, index) : this._renderSpanMenuItem(option));\r\n } else {\r\n menuItem = (option.linkURL ? this._renderLinkMenuItem(option, index) : this._renderSpanMenuItem(option));\r\n }\r\n return menuItem;\r\n }\r\n\r\n private _renderSubMenuDrawer(levelClassName: string, menuItem: IMenuItemData): JSX.Element | null {\r\n return (\r\n \r\n
\r\n {menuItem.subMenu!.map((menuSubItem: IMenuItemData) => {\r\n return this._renderDrawerLink(menuSubItem);\r\n })}\r\n
\r\n \r\n );\r\n }\r\n\r\n /**\r\n * Handle desktop category click.\r\n * @param desktopCategoryId - Desktop category id used to identify the index of the category.\r\n * @returns Returns void.\r\n */\r\n private readonly _bindDesktopCategoryClick = (desktopCategoryId: number) => (): void => {\r\n if (this.state.desktopCategoryId !== desktopCategoryId) {\r\n this.setState({ desktopCategoryId, isDrawerOpen: true });\r\n } else {\r\n this.setState({ desktopCategoryId: -1, isDrawerOpen: false });\r\n }\r\n };\r\n\r\n private _renderButtonMenuItem(option: IMenuItemData, activeMenu?: number, index?: number): JSX.Element | null {\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): JSX.Element | null {\r\n const { Link } = this.props.navProps;\r\n const linkText = option.linkText ? option.linkText : '';\r\n this.payLoad.contentAction.etext = linkText;\r\n const attributes = getTelemetryAttributes(this.telemetryContent, this.payLoad);\r\n return (\r\n \r\n { option.linkText}\r\n \r\n );\r\n }\r\n\r\n private _renderLinkMenuItemLevelOne(option: IMenuItemData, index?: number, isHoverEffect: boolean = true): JSX.Element | null {\r\n const { Link } = this.props.navProps;\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 return (\r\n \r\n { option.linkText}\r\n \r\n );\r\n }\r\n\r\n private _renderPromotionalLink(linkText?: string, linkUrl?: string): JSX.Element | null {\r\n const { Link } = this.props.navProps;\r\n this.payLoad.contentAction.etext = linkText;\r\n const attributes = getTelemetryAttributes(this.telemetryContent, this.payLoad);\r\n if (linkText && linkUrl) {\r\n return (\r\n \r\n { linkText}\r\n \r\n );\r\n }\r\n return null;\r\n\r\n }\r\n\r\n private _renderSpanMenuItem(option: IMenuItemData, index?: number): JSX.Element | null {\r\n const { Span } = this.props.navProps;\r\n return (\r\n \r\n { option.linkText}\r\n \r\n );\r\n }\r\n\r\n private _renderMenu(level: string, menuOptions: JSX.Element[], isSubmenu?: boolean): JSX.Element | null {\r\n const { DivContainer, MenuList, ImageDivContainer, showCategoryImage, showPromotionalContent } = this.props.navProps;\r\n const isCategoryImageDisplay =\r\n !this.state.isOnlyMobile && showCategoryImage && this.state.categoryImage !== null && this.state.categoryImage !== undefined && !isSubmenu;\r\n const isPromotionalContentDisplay =\r\n !this.state.isOnlyMobile && showPromotionalContent && ArrayExtensions.hasElements(this.state.categoryImage) && !isSubmenu;\r\n const divContainerClass = this.currentLevel > NavMenuConstants.two || isCategoryImageDisplay ? DivContainer!.className : 'ms-nav__deafult';\r\n this.currentLevel = NavMenuConstants.one;\r\n const menuLevelSupportClassName = isCategoryImageDisplay && this.props.navProps.config.menuLevelSupport &&\r\n this.props.navProps.config.menuLevelSupport > NavMenuConstants.two && 'navmenu-multi-level';\r\n\r\n const categoryImages = this.state.categoryImage?.filter(image => !StringExtensions.isNullOrWhitespace(image.src));\r\n const imagesContainerKey = categoryImages?.map(item => item.src).join('-');\r\n return (\r\n \r\n \r\n {menuOptions}\r\n \r\n
\r\n {\r\n isCategoryImageDisplay && ArrayExtensions.hasElements(categoryImages) && categoryImages.map(item => (\r\n \r\n { getCategoryImage(this.props, item.src ?? '', item.altText!.toString())}\r\n { isPromotionalContentDisplay && this._renderPromotionalLink(item.altText, item.additionalProperties?.linkUrl)}\r\n ))\r\n }\r\n
\r\n
\r\n );\r\n }\r\n\r\n /**\r\n * Handle Category image update.\r\n * @param categoryImageSource - Image source.\r\n * @param option - Menu Item data.\r\n * @returns Returns empty.\r\n */\r\n private readonly _updateCategoryImage = (categoryImageSource: string, option: IMenuItemData) => () => {\r\n const linkText = option.linkText ? option.linkText : '';\r\n const promotionalImage: Msdyn365.IImageData[] = [{ src: categoryImageSource, altText: linkText }];\r\n\r\n // Read category and promotional image in one array\r\n if (ArrayExtensions.hasElements(option.promotionalContent)) {\r\n for (const item of option.promotionalContent) {\r\n const imageSource = item.image.src;\r\n promotionalImage.push({ src: imageSource, altText: item.text, additionalProperties: { linkUrl: item.linkUrl.destinationUrl } });\r\n }\r\n }\r\n this.setState({\r\n categoryImage: ArrayExtensions.hasElements(promotionalImage) ? promotionalImage : [{ src: 'empty' }]\r\n });\r\n };\r\n\r\n /**\r\n * Handle dropdown toggle.\r\n * @param data - Menu Item data.\r\n * @param parentId - Number.\r\n * @returns Returns empty.\r\n */\r\n private readonly _handleDropdownToggle = (data: IMenuItemData, parentId?: number) => () => {\r\n if (!this.state.isOnlyMobile) {\r\n this.setState({\r\n activeMenu: data.id,\r\n parentMenu: parentId\r\n });\r\n if (this.props.navProps.showCategoryImage) {\r\n this._updateCategoryImage(data.imageSource!, data)();\r\n }\r\n } else {\r\n NavigationMenuRootDisabled.isBackTrack = false;\r\n this.setState({\r\n activeMenu: data.id,\r\n mobileViewLabelText: data.linkText!,\r\n parentMenu: parentId\r\n });\r\n }\r\n\r\n };\r\n\r\n /**\r\n * Handle back navigation for menu items for mobile view.\r\n * @returns Returns empty.\r\n */\r\n private readonly _handleGoBack = () => () => {\r\n NavigationMenuRootDisabled.isBackTrack = true;\r\n this.setState((previousState) => ({ activeMenu: previousState.parentMenu }));\r\n };\r\n\r\n /**\r\n * Function to close the nav menu on click on body.\r\n * @param event - MouseEvent.\r\n */\r\n private readonly _handleClickOutside = (event: MouseEvent) => {\r\n if (this.menuNode.current &&\r\n !this.menuNode.current.contains(event.target as Node)) {\r\n if (!this.state.isOnlyMobile) {\r\n this.setState({ activeMenu: 1, mobileViewLabelText: '', isNavOpen: false });\r\n } else {\r\n this.setState({ activeMenu: undefined, mobileViewLabelText: '', isNavOpen: false });\r\n }\r\n }\r\n };\r\n\r\n /**\r\n * Checks to assign a ref for focus.\r\n * @param index -Sub menu list index.\r\n * @param mobileViewLabelText -Mobile view label text.\r\n * @param optionLinkText -Sub menu item link text.\r\n * @returns Boolean.\r\n */\r\n private readonly _shouldAddFocusMenuRef = (index: number, mobileViewLabelText?: string, optionLinkText?: string) => {\r\n const firstIndex: number = 0;\r\n if (!NavigationMenuRootDisabled.isBackTrack && index === firstIndex) {\r\n return true;\r\n }\r\n if (!optionLinkText || !mobileViewLabelText) {\r\n return false;\r\n }\r\n return mobileViewLabelText === optionLinkText;\r\n };\r\n\r\n /**\r\n * Function to handle nav menu close.\r\n */\r\n private readonly _closeNavMenu = (): void => {\r\n if (!this.state.isOnlyMobile) {\r\n this.setState({ activeMenu: 1, mobileViewLabelText: '', isNavOpen: false });\r\n } else {\r\n this.setState({ activeMenu: undefined, mobileViewLabelText: '', isNavOpen: false });\r\n }\r\n };\r\n\r\n /**\r\n * Function to close the nav menu on esc key.\r\n * @param event - Event.\r\n */\r\n private readonly _escFunction = (event: React.KeyboardEvent) => {\r\n if (event.keyCode === this.escapeKey && !this.state.isOnlyMobile && this.state.isNavOpen) {\r\n this.setState({ activeMenu: 1, mobileViewLabelText: '', isNavOpen: false });\r\n }\r\n };\r\n\r\n /**\r\n * Custom update viewport.\r\n */\r\n private readonly _customUpdateViewport = (): void => {\r\n this.setState({ isOnlyMobile: this.isOnlyMobile });\r\n };\r\n}\r\n\r\nexport default NavigationMenuRootDisabled;\r\n","/*--------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * See License.txt in the project root for license information.\r\n *--------------------------------------------------------------*/\r\n\r\nimport * as Msdyn365 from '@msdyn365-commerce/core';\r\nimport { IMenuItemData, MenuSource, MenuTypeIndexId } from '@msdyn365-commerce-modules/navigation-menu';\r\nimport { ArrayExtensions, StringExtensions } from '@msdyn365-commerce-modules/retail-actions';\r\nimport {\r\n addThrottledEvent,\r\n Button,\r\n Collapse, Drawer,\r\n getPayloadObject,\r\n getTelemetryAttributes,\r\n getTelemetryObject,\r\n IPayLoad,\r\n isMobile,\r\n ITelemetryContent,\r\n Module,\r\n Node,\r\n onTelemetryClick,\r\n VariantType\r\n} from '@msdyn365-commerce-modules/utilities';\r\nimport classnames from 'classnames';\r\nimport { computed } from 'mobx';\r\nimport * as React from 'react';\r\n\r\nimport { getCategoryImage, INavigationMenuViewRootProps, INavigationState, NavMenuConstants } from './navigation-menu-utilities';\r\n\r\n/**\r\n *\r\n * NavigationMenuRootEnabled component.\r\n * @extends {React.PureComponent}\r\n */\r\nexport class NavigationMenuRootEnabled extends React.PureComponent {\r\n private static isBackTrack: boolean = false;\r\n\r\n private readonly supportedLevel: number = NavMenuConstants.four;\r\n\r\n private currentLevel: number = NavMenuConstants.zero;\r\n\r\n private readonly menuNode: React.RefObject;\r\n\r\n private readonly menuItemRef: React.RefObject;\r\n\r\n private readonly escapeKey: number = NavMenuConstants.escapeKey;\r\n\r\n private readonly telemetryContent: ITelemetryContent;\r\n\r\n private readonly promotionalImage: Msdyn365.IImageData[] = [];\r\n\r\n private menuItemData: IMenuItemData[] = [];\r\n\r\n private readonly payLoad: IPayLoad;\r\n\r\n private readonly attributes?: Msdyn365.IDictionary;\r\n\r\n private customResizeThrottledEventHandler?: (event: Event) => void;\r\n\r\n public constructor(props: INavigationMenuViewRootProps) {\r\n super(props);\r\n this.menuNode = React.createRef();\r\n this.menuItemRef = React.createRef();\r\n const { menuItemData } = this.props.navProps;\r\n if (ArrayExtensions.hasElements(menuItemData) && ArrayExtensions.hasElements(menuItemData[0].subMenu)) {\r\n const imagesource = menuItemData[0].subMenu[0].imageSource ? menuItemData[0].subMenu[0].imageSource : '';\r\n const linkText = menuItemData[0].subMenu[0].linkText ? menuItemData[0].subMenu[0].linkText : '';\r\n this.promotionalImage = [{ src: imagesource, altText: linkText }];\r\n\r\n // Read category and promotional image in one array\r\n if (ArrayExtensions.hasElements(menuItemData[0].subMenu[0].promotionalContent)) {\r\n menuItemData[0].subMenu[0].promotionalContent.map(item => {\r\n const imageSource = item.image.src;\r\n this.promotionalImage.push({ src: imageSource, altText: item.text, additionalProperties: { linkUrl: item.linkUrl.destinationUrl } });\r\n return null;\r\n });\r\n }\r\n }\r\n this.state = {\r\n activeMenu: NavMenuConstants.rootMenu,\r\n mobileViewLabelText: '',\r\n parentMenu: undefined,\r\n isDrawerOpen: false,\r\n desktopCategoryId: -1,\r\n isOnlyMobile: this.isOnlyMobile,\r\n categoryImage: this.promotionalImage,\r\n isNavOpen: false\r\n };\r\n\r\n this.telemetryContent = getTelemetryObject(this.props.navProps.context.request.telemetryPageName!,\r\n this.props.navProps.friendlyName,\r\n this.props.navProps.telemetry);\r\n this.payLoad = getPayloadObject('click', this.telemetryContent, '', '');\r\n this.attributes = getTelemetryAttributes(this.telemetryContent, this.payLoad);\r\n }\r\n\r\n @computed public get isOnlyMobile(): boolean {\r\n return (isMobile({ variant: VariantType.Browser, context: this.props.navProps.context.request }) === 'xs');\r\n }\r\n\r\n public componentDidMount(): void {\r\n this.customResizeThrottledEventHandler = addThrottledEvent(window, 'resize', this._customUpdateViewport as EventListener);\r\n document.addEventListener('keydown', (this._escFunction as unknown) as EventListener, false);\r\n this._customUpdateViewport();\r\n document.body.addEventListener('mousedown', this._handleClickOutside);\r\n this._addShopAllLink();\r\n }\r\n\r\n public componentDidUpdate(): void {\r\n if (this.menuItemRef.current?.children[0] && this.props.navProps.isMobileView) {\r\n (this.menuItemRef.current.children[0] as HTMLElement).focus();\r\n }\r\n }\r\n\r\n public componentWillUnmount(): void {\r\n window.removeEventListener('resize', this.customResizeThrottledEventHandler!, false);\r\n document.body.removeEventListener('mousedown', this._handleClickOutside, false);\r\n }\r\n\r\n public render(): JSX.Element | null {\r\n this.currentLevel = NavMenuConstants.one;\r\n const navbarKey = 'header-nav-mobile';\r\n return (\r\n \r\n {\r\n this.state.isOnlyMobile ? this._renderMobileMenu() : (<>\r\n {this.props.navProps.config.rootMenuNavigation}\r\n {this._renderCollapseMenu()}\r\n )\r\n }\r\n \r\n );\r\n }\r\n\r\n /**\r\n * Function to handle nav bar toggle.\r\n */\r\n private readonly _toggleNavBar = (): void => {\r\n this.setState(previousState => ({\r\n activeMenu: NavMenuConstants.rootMenu,\r\n isNavOpen: !previousState.isNavOpen\r\n }));\r\n };\r\n\r\n private _renderCollapseMenu(): JSX.Element | null {\r\n return (\r\n \r\n {this.state.isOnlyMobile ? this._renderMobileMenu() : this._renderDesktopMenu()}\r\n \r\n );\r\n }\r\n\r\n private _renderMobileMenu(): JSX.Element {\r\n const { MobileBackButton, MobileDescriptionContainer, MobileDescriptionLabel, Navigation } = this.props.navProps;\r\n\r\n this.currentLevel = NavMenuConstants.one;\r\n return (\r\n \r\n \r\n {this.state.isOnlyMobile && this.state.activeMenu !== undefined &&\r\n \r\n \r\n \r\n {this.state.mobileViewLabelText}\r\n \r\n }\r\n {this._renderDisplay()}\r\n \r\n \r\n );\r\n }\r\n\r\n private _renderDesktopMenu(): JSX.Element {\r\n const { Navigation } = this.props.navProps;\r\n return (\r\n \r\n \r\n {this._renderDisplay()}\r\n
\r\n
\r\n
\r\n
\r\n );\r\n }\r\n\r\n private _renderDrawerLink(item: IMenuItemData): JSX.Element | null {\r\n if (item.linkURL && !StringExtensions.isNullOrWhitespace(item.linkURL)) {\r\n return (\r\n this._renderLinkMenuItem(item)\r\n );\r\n } else if (!item.linkURL) {\r\n return (\r\n this._renderSpanMenuItem(item)\r\n );\r\n }\r\n return null;\r\n }\r\n\r\n private _renderDisplay(): JSX.Element[] {\r\n const { ListItem } = this.props.navProps;\r\n let menuItemData: IMenuItemData[] = [];\r\n if (this.state.isOnlyMobile) {\r\n menuItemData = this.menuItemData;\r\n } else {\r\n menuItemData = this.props.navProps.menuItemData;\r\n }\r\n const { activeMenu } = this.state;\r\n const menuItemList: JSX.Element[] = [];\r\n let cmsMenuData: IMenuItemData[] | undefined = [];\r\n let retailMenuItemData: IMenuItemData[] | undefined = [];\r\n const retailMenuData = JSON.parse(JSON.stringify(menuItemData)) as IMenuItemData[];\r\n\r\n for (const item of retailMenuData) {\r\n retailMenuItemData = item.subMenu!.filter(subMenuItem => (subMenuItem.id && subMenuItem.id >= MenuTypeIndexId.Retail));\r\n item.subMenu = retailMenuItemData;\r\n }\r\n\r\n for (const item of menuItemData) {\r\n cmsMenuData = item.subMenu!.filter(subMenuItem => (subMenuItem.id && subMenuItem.id < MenuTypeIndexId.Retail));\r\n }\r\n\r\n if (this.state.isOnlyMobile && activeMenu !== undefined && ArrayExtensions.hasElements(menuItemData)) {\r\n let menuItem: IMenuItemData | null = {};\r\n for (const menuItemDatum of menuItemData) {\r\n if (menuItemDatum.id === activeMenu) {\r\n menuItem = menuItemDatum;\r\n if (!NavigationMenuRootEnabled.isBackTrack) {\r\n this.setState({\r\n parentMenu: undefined\r\n });\r\n } else {\r\n this.setState({\r\n parentMenu: undefined,\r\n mobileViewLabelText: menuItemDatum.linkText\r\n });\r\n }\r\n break;\r\n }\r\n menuItem = this._getFromSubMenu(menuItemDatum);\r\n if (menuItem && menuItem.id === activeMenu) {\r\n break;\r\n }\r\n }\r\n\r\n if (menuItem) {\r\n menuItemList.push(\r\n \r\n {' '}\r\n {this._createMenuItemList(menuItem)}\r\n {' '}\r\n \r\n );\r\n }\r\n\r\n } else {\r\n for (const [index, item] of retailMenuData.entries()) {\r\n menuItemList.push(\r\n \r\n {this._createMenuItemList(item)}\r\n
\r\n );\r\n }\r\n\r\n for (const [index, item] of cmsMenuData.entries()) {\r\n menuItemList.push(\r\n \r\n {this._createMenuItemList(item)}\r\n \r\n );\r\n }\r\n }\r\n\r\n return menuItemList;\r\n }\r\n\r\n private _getFromSubMenu(item?: IMenuItemData): IMenuItemData | null {\r\n const subMenus = item?.subMenu;\r\n if (subMenus && ArrayExtensions.hasElements(subMenus)) {\r\n for (let index = 0; index <= subMenus.length - NavMenuConstants.one; index++) {\r\n const subMenu: IMenuItemData = subMenus[Number(index)];\r\n let parentMenuId = item?.id;\r\n\r\n if (subMenu.id === this.state.activeMenu) {\r\n if (parentMenuId === NavMenuConstants.rootMenu && subMenu.id! < MenuTypeIndexId.Retail) {\r\n parentMenuId = undefined;\r\n }\r\n\r\n if (!NavigationMenuRootEnabled.isBackTrack) {\r\n this.setState({ parentMenu: parentMenuId });\r\n } else {\r\n this.setState({ parentMenu: parentMenuId, mobileViewLabelText: subMenu.linkText });\r\n }\r\n return subMenu;\r\n }\r\n const found = this._getFromSubMenu(subMenu);\r\n if (found) {\r\n return found;\r\n }\r\n }\r\n }\r\n return null;\r\n }\r\n\r\n private _createMenuItemList(menuItemData: IMenuItemData): JSX.Element | null {\r\n if (ArrayExtensions.hasElements(menuItemData.subMenu)) {\r\n if (this.state.isOnlyMobile && this.state.activeMenu !== undefined) {\r\n return (this._renderSubMenu(menuItemData.subMenu, menuItemData.id, false));\r\n }\r\n return (\r\n <>\r\n {this._renderButtonMenuItem(menuItemData)}\r\n {this._renderSubMenu(menuItemData.subMenu, menuItemData.id)}\r\n \r\n );\r\n\r\n } else if (menuItemData.linkURL && !StringExtensions.isNullOrWhitespace(menuItemData.linkURL)) {\r\n return (this._renderLinkMenuItem(menuItemData, menuItemData.id));\r\n } else if (!menuItemData.linkURL) {\r\n return (this._renderSpanMenuItem(menuItemData));\r\n }\r\n\r\n return null;\r\n }\r\n\r\n private _renderSubMenu(subMenuArray?: IMenuItemData[], activeMenu?: number, isSubMenu?: boolean): JSX.Element | null {\r\n\r\n let subMenus: IMenuItemData[] | undefined = subMenuArray;\r\n if (activeMenu === NavMenuConstants.rootMenu) {\r\n subMenus = subMenuArray!.filter(subMenuItem => (subMenuItem.id && subMenuItem.id >= MenuTypeIndexId.Retail));\r\n }\r\n\r\n const { ListItem } = this.props.navProps;\r\n const isEnableMultiSupportMenu = this.props.navProps.config.enableMultilevelMenu ?? false;\r\n const multiLevelSupportedMenu = this.props.navProps.config.menuLevelSupport ?? NavMenuConstants.three;\r\n\r\n if (activeMenu && this.state.activeMenu !== activeMenu) {\r\n this.props.navProps.context.telemetry.error('Navigation Active menu content is empty, module wont render.');\r\n return null;\r\n }\r\n\r\n if (!subMenus || !ArrayExtensions.hasElements(subMenus)) {\r\n this.props.navProps.context.telemetry.error('Navigation Submenu content is empty, module wont render.');\r\n return null;\r\n }\r\n\r\n let levelClassName: string = '';\r\n const menuOptions = subMenus.map((option: IMenuItemData, index: number) => {\r\n const hasOptions = (option.subMenu && ArrayExtensions.hasElements(option.subMenu));\r\n let menuItem: JSX.Element | null;\r\n if (hasOptions && this.state.isOnlyMobile) {\r\n menuItem = this._renderButtonMenuItem(option, activeMenu, index);\r\n } else if (this.currentLevel === NavMenuConstants.one || !hasOptions) {\r\n menuItem = this.getMenuItem(option, index);\r\n } else {\r\n menuItem = null;\r\n }\r\n let subMenu;\r\n const isHavingSubmenu = hasOptions && isEnableMultiSupportMenu && (this.currentLevel <= Math.round(multiLevelSupportedMenu) - NavMenuConstants.one);\r\n\r\n if (hasOptions && !this.state.isOnlyMobile) {\r\n if (this.currentLevel >= NavMenuConstants.two) {\r\n levelClassName = 'level-3';\r\n subMenu = this._renderSubMenuDrawer(levelClassName, option);\r\n } else if (this.currentLevel <= this.supportedLevel - NavMenuConstants.one) {\r\n this.currentLevel++;\r\n levelClassName = `level-${this.currentLevel.toString()}`;\r\n subMenu = this._renderSubMenu(option.subMenu, undefined, true);\r\n }\r\n }\r\n if (isHavingSubmenu && this.state.isOnlyMobile) {\r\n this.currentLevel++;\r\n levelClassName = isEnableMultiSupportMenu ? `level-${this.currentLevel.toString()}` : '';\r\n subMenu = this._renderSubMenu(option.subMenu, option.id, true);\r\n }\r\n const imagesource = option.imageSource ? option.imageSource : '';\r\n return (\r\n \r\n { menuItem}\r\n { subMenu}\r\n \r\n );\r\n });\r\n return (this._renderMenu(levelClassName, menuOptions, isSubMenu));\r\n }\r\n\r\n private getMenuItem(option: IMenuItemData, index: number): JSX.Element | null {\r\n let menuItem: JSX.Element | null;\r\n if (this.currentLevel === NavMenuConstants.one) {\r\n menuItem = (option.linkURL ? this._renderLinkMenuItemLevelOne(option, index) : this._renderSpanMenuItem(option));\r\n } else {\r\n menuItem = (option.linkURL ? this._renderLinkMenuItem(option, index) : this._renderSpanMenuItem(option));\r\n }\r\n return menuItem;\r\n }\r\n\r\n private _renderSubMenuDrawer(levelClassName: string, menuItem: IMenuItemData): JSX.Element | null {\r\n return (\r\n \r\n
\r\n {menuItem.subMenu!.map((menuSubItem: IMenuItemData) => {\r\n return this._renderDrawerLink(menuSubItem);\r\n })}\r\n
\r\n \r\n );\r\n }\r\n\r\n /**\r\n * Handle desktop category click.\r\n * @param desktopCategoryId - Desktop category id used to identify the index of the category.\r\n * @returns Returns void.\r\n */\r\n private readonly _bindDesktopCategoryClick = (desktopCategoryId: number) => (): void => {\r\n if (this.state.desktopCategoryId !== desktopCategoryId) {\r\n this.setState({ desktopCategoryId, isDrawerOpen: true });\r\n } else {\r\n this.setState({ desktopCategoryId: -1, isDrawerOpen: false });\r\n }\r\n };\r\n\r\n private _renderButtonMenuItem(option: IMenuItemData, activeMenu?: number, index?: number): JSX.Element | null {\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): JSX.Element | null {\r\n const { Link } = this.props.navProps;\r\n const linkText = option.linkText ? option.linkText : '';\r\n this.payLoad.contentAction.etext = linkText;\r\n const attributes = getTelemetryAttributes(this.telemetryContent, this.payLoad);\r\n return (\r\n \r\n { option.linkText}\r\n \r\n );\r\n }\r\n\r\n private _renderLinkMenuItemLevelOne(option: IMenuItemData, index?: number, isHoverEffect: boolean = true): JSX.Element | null {\r\n const { Link } = this.props.navProps;\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 return (\r\n \r\n { option.linkText}\r\n \r\n );\r\n }\r\n\r\n private _renderPromotionalLink(linkText?: string, linkUrl?: string): JSX.Element | null {\r\n const { Link } = this.props.navProps;\r\n this.payLoad.contentAction.etext = linkText;\r\n const attributes = getTelemetryAttributes(this.telemetryContent, this.payLoad);\r\n if (linkText && linkUrl) {\r\n return (\r\n \r\n { linkText}\r\n \r\n );\r\n }\r\n return null;\r\n\r\n }\r\n\r\n private _renderSpanMenuItem(option: IMenuItemData, index?: number): JSX.Element | null {\r\n const { Span } = this.props.navProps;\r\n return (\r\n \r\n { option.linkText}\r\n \r\n );\r\n }\r\n\r\n private _renderMenu(level: string, menuOptions: JSX.Element[], isSubmenu?: boolean): JSX.Element | null {\r\n const { DivContainer, ImageDivContainer, showCategoryImage, showPromotionalContent } = this.props.navProps;\r\n const isCategoryImageDisplay =\r\n !this.state.isOnlyMobile && showCategoryImage && this.state.categoryImage !== null && this.state.categoryImage !== undefined && !isSubmenu;\r\n const isPromotionalContentDisplay =\r\n !this.state.isOnlyMobile && showPromotionalContent && ArrayExtensions.hasElements(this.state.categoryImage) && !isSubmenu;\r\n const divContainerClass = this.currentLevel > NavMenuConstants.two || isCategoryImageDisplay ? DivContainer!.className : 'ms-nav__deafult';\r\n this.currentLevel = NavMenuConstants.one;\r\n const menuLevelSupportClassName =\r\n isCategoryImageDisplay && this.props.navProps.config.menuLevelSupport &&\r\n this.props.navProps.config.menuLevelSupport > NavMenuConstants.two && 'navmenu-multi-level';\r\n\r\n const categoryImages = this.state.categoryImage?.filter(image => !StringExtensions.isNullOrWhitespace(image.src));\r\n const imagesContainerKey = categoryImages?.map(item => item.src).join('-');\r\n return (\r\n \r\n \r\n {menuOptions}\r\n \r\n
\r\n {\r\n isCategoryImageDisplay && ArrayExtensions.hasElements(categoryImages) && categoryImages.map(item => (\r\n \r\n { getCategoryImage(this.props, item.src ?? '', item.altText!.toString())}\r\n { isPromotionalContentDisplay && this._renderPromotionalLink(item.altText, item.additionalProperties?.linkUrl)}\r\n ))\r\n }\r\n
\r\n \r\n );\r\n }\r\n\r\n /**\r\n * Handle Category image update.\r\n * @param categoryImageSource - Image source.\r\n * @param option - Menu Item data.\r\n * @returns Returns empty.\r\n */\r\n private readonly _updateCategoryImage = (categoryImageSource: string, option: IMenuItemData) => () => {\r\n const linkText = option.linkText ? option.linkText : '';\r\n const promotionalImage: Msdyn365.IImageData[] = [{ src: categoryImageSource, altText: linkText }];\r\n\r\n // Read category and promotional image in one array\r\n if (ArrayExtensions.hasElements(option.promotionalContent)) {\r\n for (const item of option.promotionalContent) {\r\n const imageSource = item.image.src;\r\n promotionalImage.push({ src: imageSource, altText: item.text, additionalProperties: { linkUrl: item.linkUrl.destinationUrl } });\r\n }\r\n }\r\n this.setState({\r\n categoryImage: ArrayExtensions.hasElements(promotionalImage) ? promotionalImage : [{ src: 'empty' }]\r\n });\r\n };\r\n\r\n /**\r\n * Handle dropdown toggle.\r\n * @param data - Menu Item data.\r\n * @param parentId - Number.\r\n * @returns Returns empty.\r\n */\r\n private readonly _handleDropdownToggle = (data: IMenuItemData, parentId?: number) => () => {\r\n if (!this.state.isOnlyMobile) {\r\n this.setState({\r\n activeMenu: data.id,\r\n parentMenu: parentId\r\n });\r\n if (this.props.navProps.showCategoryImage) {\r\n this._updateCategoryImage(data.imageSource!, data)();\r\n }\r\n } else {\r\n NavigationMenuRootEnabled.isBackTrack = false;\r\n this.setState({\r\n activeMenu: data.id,\r\n mobileViewLabelText: data.linkText!,\r\n parentMenu: parentId\r\n });\r\n }\r\n\r\n };\r\n\r\n /**\r\n * Handle back navigation for menu items for mobile view.\r\n * @returns Returns empty.\r\n */\r\n private readonly _handleGoBack = () => () => {\r\n NavigationMenuRootEnabled.isBackTrack = true;\r\n this.setState((previousState) => ({ activeMenu: previousState.parentMenu }));\r\n };\r\n\r\n /**\r\n * Function to close the nav menu on click on body.\r\n * @param event - MouseEvent.\r\n */\r\n private readonly _handleClickOutside = (event: MouseEvent) => {\r\n if (this.menuNode.current &&\r\n !this.menuNode.current.contains(event.target as Node)) {\r\n if (!this.state.isOnlyMobile) {\r\n this.setState({ activeMenu: NavMenuConstants.rootMenu, mobileViewLabelText: '', isNavOpen: false });\r\n } else {\r\n this.setState({ activeMenu: undefined, mobileViewLabelText: '', isNavOpen: false });\r\n }\r\n }\r\n };\r\n\r\n /**\r\n * Add shop all link for Mobile submenu.\r\n */\r\n private readonly _addShopAllLink = (): void => {\r\n const { menuItemData } = this.props.navProps;\r\n this.menuItemData = menuItemData;\r\n if (ArrayExtensions.hasElements(menuItemData) && ArrayExtensions.hasElements(menuItemData[0].subMenu)) {\r\n this.menuItemData[0].subMenu?.map(item => {\r\n const shopAllObject = {};\r\n Object.assign(shopAllObject, { imageSource: item.imageSource });\r\n Object.assign(shopAllObject, { linkText: this.props.navProps.resources.allCategoryMenuText });\r\n Object.assign(shopAllObject, { linkURL: item.linkURL });\r\n if (ArrayExtensions.hasElements(item.subMenu) && item.menuSource === MenuSource.Retail) {\r\n item.subMenu.unshift(shopAllObject);\r\n }\r\n return item;\r\n });\r\n }\r\n };\r\n\r\n /**\r\n * Checks to assign a ref for focus.\r\n * @param index -Sub menu list index.\r\n * @param mobileViewLabelText -Mobile view label text.\r\n * @param optionLinkText -Sub menu item link text.\r\n * @returns Boolean.\r\n */\r\n private readonly _shouldAddFocusMenuRef = (index: number, mobileViewLabelText?: string, optionLinkText?: string) => {\r\n const firstIndex: number = 0;\r\n if (!NavigationMenuRootEnabled.isBackTrack && index === firstIndex) {\r\n return true;\r\n }\r\n if (!optionLinkText || !mobileViewLabelText) {\r\n return false;\r\n }\r\n return mobileViewLabelText === optionLinkText;\r\n };\r\n\r\n /**\r\n * Function to handle nav menu close.\r\n */\r\n private readonly _closeNavMenu = (): void => {\r\n if (!this.state.isOnlyMobile) {\r\n this.setState({ activeMenu: NavMenuConstants.rootMenu, mobileViewLabelText: '', isNavOpen: false });\r\n } else {\r\n this.setState({ activeMenu: undefined, mobileViewLabelText: '', isNavOpen: false });\r\n }\r\n };\r\n\r\n /**\r\n * Function to close the nav menu on esc key.\r\n * @param event - Event.\r\n */\r\n private readonly _escFunction = (event: React.KeyboardEvent) => {\r\n if (event.keyCode === this.escapeKey && !this.state.isOnlyMobile && this.state.isNavOpen) {\r\n this.setState({ activeMenu: NavMenuConstants.rootMenu, mobileViewLabelText: '', isNavOpen: false });\r\n }\r\n };\r\n\r\n /**\r\n * Custom update viewport.\r\n */\r\n private readonly _customUpdateViewport = (): void => {\r\n this.setState({ isOnlyMobile: this.isOnlyMobile });\r\n };\r\n\r\n}\r\n\r\nexport default NavigationMenuRootEnabled;\r\n","/*--------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * See License.txt in the project root for license information.\r\n *--------------------------------------------------------------*/\r\n\r\nimport { INavigationMenuViewProps } from '@msdyn365-commerce-modules/navigation-menu';\r\nimport * as React from 'react';\r\n\r\nimport { INavigationMenuProps } from '../definition-extensions/navigation-menu.ext.props.autogenerated';\r\nimport NavigationMenuRootDisabled from './components/navigation-menu-root-disabled';\r\nimport NavigationMenuRootEnabled from './components/navigation-menu-root-enabled';\r\n\r\n/**\r\n * Render the Navigation menu.\r\n * @param props - The navigation menu view props.\r\n * @returns Return HTML having INavigationMenuViewProps props with navigation menu.\r\n */\r\nconst navigationMenuView = (props: INavigationMenuViewProps & INavigationMenuProps<{}>): JSX.Element => {\r\n\r\n if (props.config.enabletopMenu) {\r\n return ;\r\n }\r\n\r\n return ;\r\n\r\n};\r\n\r\nexport default navigationMenuView;\r\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport MsDyn365, { IImageData, IImageSettings, Image } from '@msdyn365-commerce/core';\nimport { ArrayExtensions, generateImageUrl } from '@msdyn365-commerce-modules/retail-actions';\nimport {\n getPayloadObject,\n getTelemetryAttributes,\n getTelemetryObject,\n IPayLoad,\n ITelemetryContent,\n Module,\n Node,\n onTelemetryClick\n} from '@msdyn365-commerce-modules/utilities';\nimport classnames from 'classnames';\nimport * as React from 'react';\n\nimport { INavigationMenuViewProps } from './navigation-menu';\nimport { IMenuItemData } from './navigation-menu.data';\n\ninterface INavigationState {\n parentMenu?: number;\n activeMenu?: number;\n categoryImage?: IImageData[] | null;\n mobileViewLabelText?: string;\n categoryImageAltText: string;\n}\n\n/**\n *\n * NavigationMenuView component.\n * @extends {React.PureComponent}\n */\nexport class NavigationMenuView extends React.PureComponent {\n private static isBackTrack: boolean = false;\n\n private currentLevel: number = 0;\n\n private readonly menuNode: React.RefObject;\n\n private readonly menuItemRef: React.RefObject;\n\n private readonly telemetryContent: ITelemetryContent;\n\n private readonly payLoad: IPayLoad;\n\n constructor(props: INavigationMenuViewProps) {\n super(props);\n this.menuNode = React.createRef();\n this.menuItemRef = React.createRef();\n this.state = { activeMenu: undefined, mobileViewLabelText: '', parentMenu: undefined, categoryImageAltText: '' };\n this._closeSubmenu = this._closeSubmenu.bind(this);\n this.telemetryContent = getTelemetryObject(\n this.props.context.request.telemetryPageName!,\n this.props.friendlyName,\n this.props.telemetry\n );\n this.payLoad = getPayloadObject('click', this.telemetryContent, '', '');\n }\n\n public componentDidMount(): void {\n if (MsDyn365.isBrowser) {\n document.body.addEventListener('mousedown', this._handleClickOutside);\n document.body.addEventListener('focusout', this._handleFocusOutside);\n }\n }\n\n public componentDidUpdate(): void {\n if (this.menuItemRef.current?.children[0] && this.props.isMobileView) {\n (this.menuItemRef.current.children[0] as HTMLElement).focus();\n }\n }\n\n public componentWillUnmount(): void {\n if (MsDyn365.isBrowser) {\n document.body.removeEventListener('mousedown', this._handleClickOutside, false);\n document.body.removeEventListener('focusout', this._handleFocusOutside, false);\n }\n }\n\n public render(): JSX.Element | null {\n const { isMobileView, MenuList, MobileBackButton, MobileDescriptionContainer, MobileDescriptionLabel, Navigation } = this.props;\n\n this.currentLevel = 1;\n return (\n \n \n {isMobileView && this.state.activeMenu !== undefined && (\n \n \n {this.state.mobileViewLabelText}\n \n )}\n {this._renderDisplay()}\n \n \n );\n }\n\n private _renderDisplay(): JSX.Element[] {\n const { ListItem, menuItemData, isMobileView } = this.props;\n const { activeMenu } = this.state;\n const menuItemList: JSX.Element[] = [];\n\n if (isMobileView && activeMenu !== undefined && menuItemData.length > 0) {\n let menuItem: IMenuItemData = {};\n for (const menuItemDatum of menuItemData) {\n if (menuItemDatum && menuItemDatum.id === activeMenu) {\n menuItem = menuItemDatum;\n !NavigationMenuView.isBackTrack\n ? this.setState({ parentMenu: undefined })\n : this.setState({ parentMenu: undefined, mobileViewLabelText: menuItemDatum.linkText });\n break;\n }\n menuItem = this._getFromSubMenu(menuItemDatum) as IMenuItemData;\n if (menuItem && menuItem.id === activeMenu) {\n break;\n }\n }\n\n menuItem &&\n menuItemList.push(\n \n {' '}\n {this._createMenuItemList(menuItem)}{' '}\n \n );\n } else {\n menuItemData.forEach((item: IMenuItemData, index: number) => {\n menuItemList.push(\n \n {this._createMenuItemList(item)}\n \n );\n });\n }\n\n return menuItemList;\n }\n\n private _getFromSubMenu(item?: IMenuItemData): IMenuItemData | null {\n const subMenus = item && item.subMenu;\n if (subMenus && subMenus.length > 0) {\n for (let i = 0; i <= subMenus.length - 1; i++) {\n if (subMenus[i].id === this.state.activeMenu) {\n !NavigationMenuView.isBackTrack\n ? this.setState({ parentMenu: item?.id })\n : this.setState({ parentMenu: item && item.id, mobileViewLabelText: subMenus[i].linkText });\n return subMenus[i];\n }\n const found = this._getFromSubMenu(subMenus[i]);\n if (found) {\n return found;\n }\n }\n }\n this.props.context.telemetry.error('Submenu content is empty, module wont render.');\n return null;\n }\n\n private _createMenuItemList(menuItemData: IMenuItemData): JSX.Element | null {\n if (menuItemData && menuItemData.subMenu && menuItemData.subMenu.length > 0) {\n if (this.props.isMobileView && this.state.activeMenu !== undefined) {\n return this._renderSubMenu(menuItemData.subMenu, menuItemData.id, false);\n }\n return (\n <>\n {this._renderButtonMenuItem(menuItemData)}\n {this._renderSubMenu(menuItemData.subMenu, menuItemData.id, false)}\n \n );\n } else if (menuItemData && menuItemData.linkText && menuItemData.linkURL && menuItemData.linkURL.length > 0) {\n return this._renderLinkMenuItem(menuItemData, menuItemData.id, false, true);\n } else if (menuItemData && menuItemData.linkText && !menuItemData.linkURL) {\n return this._renderSpanMenuItem(menuItemData, menuItemData.id, true);\n }\n this.props.context.telemetry.error('Navigation menu content is empty, module wont render.');\n return null;\n }\n\n private _renderSubMenu(subMenus?: IMenuItemData[], activeMenu?: number, IsSubMenu?: boolean): JSX.Element | null {\n const { isMobileView, ListItem } = this.props;\n const enableMultiSupportMenu = this.props.config.enableMultilevelMenu || false;\n const multiLevelSupportedMenu = this.props.config.menuLevelSupport || 3;\n\n // Const isParentMenu:boolean= false;\n if (activeMenu && this.state.activeMenu !== activeMenu) {\n this.props.context.telemetry.error('Navigation Active menu content is empty, module wont render.');\n return null;\n }\n\n if (!subMenus || subMenus.length === 0) {\n this.props.context.telemetry.error('Navigation Submenu content is empty, module wont render.');\n return null;\n }\n\n let levelClassName: string = '';\n const menuOptions =\n subMenus &&\n subMenus.map((option: IMenuItemData, idx: number) => {\n const hasOptions = option.subMenu && option.subMenu.length > 0;\n let menuItem: JSX.Element | null;\n if (hasOptions && isMobileView) {\n menuItem = this._renderButtonMenuItem(option, activeMenu, idx);\n } else {\n menuItem = option.linkURL ? this._renderLinkMenuItem(option, idx) : this._renderSpanMenuItem(option);\n }\n\n let subMenu;\n const haveSubmenu = hasOptions && enableMultiSupportMenu && this.currentLevel <= Math.round(multiLevelSupportedMenu) - 1;\n if (haveSubmenu) {\n this.currentLevel++;\n levelClassName = enableMultiSupportMenu ? `level-${this.currentLevel.toString()}` : '';\n subMenu = this._renderSubMenu(option.subMenu, isMobileView ? option.id : undefined, true);\n }\n return (\n \n {menuItem}\n {subMenu}\n \n );\n });\n return this._renderMenu(levelClassName, menuOptions, activeMenu, IsSubMenu);\n }\n\n private _renderButtonMenuItem(option: IMenuItemData, activeMenu?: number, index?: number): JSX.Element | null {\n const { Button } = this.props;\n return (\n \n {option.linkText}\n \n );\n }\n\n private _renderLinkMenuItem(\n option: IMenuItemData,\n index?: number,\n hoverEffect: boolean = true,\n isParent: boolean = false\n ): JSX.Element | null {\n const { Link } = this.props;\n const linkText = option.linkText ? option.linkText : '';\n const imagesource = option.imageSource ? option.imageSource : '';\n this.payLoad.contentAction.etext = linkText;\n const attributes = getTelemetryAttributes(this.telemetryContent, this.payLoad);\n return (\n \n {option.linkText}\n \n );\n }\n\n private _renderPromotionalLink(linkText?: string, linkUrl?: string): JSX.Element | null {\n const { Link } = this.props;\n this.payLoad.contentAction.etext = linkText;\n const attributes = getTelemetryAttributes(this.telemetryContent, this.payLoad);\n if (linkText && linkUrl) {\n return (\n \n {linkText}\n \n );\n }\n return null;\n }\n\n private _renderSpanMenuItem(option: IMenuItemData, index?: number, isParent: boolean = false): JSX.Element | null {\n const { Span } = this.props;\n return (\n \n {option.linkText}\n \n );\n }\n\n private _renderMenu(level: string, menuOptions: JSX.Element[], currentItem?: number, submenu?: boolean): JSX.Element | null {\n const { DivContainer, MenuList, ImageDivContainer, showCategoryImage, showPromotionalContent, isMobileView } = this.props;\n const categoryImageDisplay =\n !isMobileView &&\n (showCategoryImage || showPromotionalContent) &&\n !ArrayExtensions.hasElements(this.state.categoryImage) &&\n !submenu;\n const promotionalContentDisplay =\n !isMobileView && showPromotionalContent && ArrayExtensions.hasElements(this.state.categoryImage) && !submenu;\n const DivContainerClass = this.currentLevel > 2 || categoryImageDisplay ? DivContainer!.className : 'ms-nav__deafult';\n this.currentLevel = 1;\n return (\n \n 2 &&\n 'navmenu-multi-level'\n )}\n >\n {menuOptions}\n \n {categoryImageDisplay &&\n this.state.categoryImage &&\n this.state.categoryImage.map(item => (\n \n {this.state.categoryImage && this._getCategoryImage(item)}\n {promotionalContentDisplay && this._renderPromotionalLink(item.altText, item.additionalProperties?.linkUrl)}\n \n ))}\n \n );\n }\n\n private readonly _updateCategoryImage = (categoryImageSrc: string, option: IMenuItemData) => () => {\n const linkText = option && option.linkText ? option.linkText : '';\n const promotionalImage: IImageData[] = [{ src: categoryImageSrc, altText: linkText }];\n\n // Read category and promotional image in one array\n if (ArrayExtensions.hasElements(option.promotionalContent)) {\n option.promotionalContent.map(item => {\n if (item && item.image) {\n const imageSrc = item.image.src;\n const promotionalItemImageSettings = item.image.imageSettings;\n promotionalImage.push({\n src: imageSrc,\n altText: item.text,\n imageSettings: promotionalItemImageSettings,\n additionalProperties: { linkUrl: item.linkUrl.destinationUrl }\n });\n }\n });\n }\n this.setState({\n categoryImage: promotionalImage.length > 0 ? promotionalImage : [{ src: 'empty' }],\n categoryImageAltText: linkText\n });\n };\n\n private readonly _handleDropdownToggle = (data: IMenuItemData, parentId?: number) => () => {\n if (!this.props.isMobileView) {\n this.setState({\n activeMenu: this.state.activeMenu && this.state.activeMenu === data.id! ? undefined : data.id!,\n parentMenu: parentId\n });\n if (this.props.showCategoryImage) {\n this._updateCategoryImage(data.imageSource!, data)();\n }\n } else {\n NavigationMenuView.isBackTrack = false;\n this.setState({\n activeMenu: data.id,\n mobileViewLabelText: data.linkText!,\n parentMenu: parentId\n });\n }\n };\n\n private readonly _handleGoBack = () => () => {\n NavigationMenuView.isBackTrack = true;\n this.setState({ activeMenu: this.state.parentMenu });\n };\n\n /**\n * Method to handle click outside of menu.\n * @param event -HTML event.\n */\n private readonly _handleClickOutside = (event: MouseEvent) => {\n if (this.menuNode.current && !this.menuNode.current.contains(event.target as Node)) {\n this.setState({\n activeMenu: undefined,\n mobileViewLabelText: '',\n categoryImage: null\n });\n }\n };\n\n /**\n * Method to handle click outside of menu.\n * @param event -HTML event.\n */\n private readonly _handleFocusOutside = (event: FocusEvent) => {\n if (this.menuNode.current && !this.menuNode.current.contains(event.relatedTarget as Node)) {\n this._closeSubmenu();\n }\n };\n\n /**\n * Checks to assign a ref for focus.\n * @param index -Sub menu list index.\n * @param mobileViewLabelText -Parent user clicked Sub menu list.\n * @param optionLinkText -Sub menu list.\n * @returns Ref.\n */\n private readonly _shouldAddFocusMenuRef = (index: number, mobileViewLabelText?: string, optionLinkText?: string) => {\n if (!NavigationMenuView.isBackTrack && index === 0) {\n return true;\n }\n if (!optionLinkText || !mobileViewLabelText) {\n return false;\n }\n return mobileViewLabelText === optionLinkText;\n };\n\n private _closeSubmenu(): void {\n if (!this.props.isMobileView) {\n this.setState({ activeMenu: undefined, categoryImage: null, mobileViewLabelText: '' });\n }\n }\n\n private readonly _getCategoryImage = (categoryImage?: IImageData): React.ReactNode | null => {\n if (!categoryImage || !categoryImage.src) {\n return null;\n }\n\n const categoryImageUrl = generateImageUrl(`${categoryImage.src}`, this.props.context.actionContext.requestContext.apiSettings);\n const defaultImageSettings: IImageSettings = {\n viewports: {\n xs: { q: 'w=300&h=250&m=8', w: 0, h: 0 },\n sm: { q: 'w=300&h=250&m=8', w: 0, h: 0 },\n md: { q: 'w=300&h=250&m=8', w: 0, h: 0 },\n lg: { q: 'w=300&h=250&m=8', w: 0, h: 0 }\n },\n lazyload: true\n };\n if (categoryImageUrl !== undefined) {\n return (\n \n );\n }\n return null;\n };\n}\n\nexport default NavigationMenuView;\n"],"sourceRoot":""}