{"version":3,"sources":["webpack:///src/modules/fabrikam/views/navigation-menu.view.tsx?5991","webpack:///src/modules/navigation-menu/navigation-menu.data.ts?a9f0","webpack:///src/modules/navigation-menu/navigation-menu.tsx?390c","webpack:///external \"React\"?c481","webpack:///./lib/navigation-menu/module-registration.js?7039","webpack:///./src/themes/dobbies/definition-extensions/navigation-menu.ext.props.autogenerated.ts?fcb0","webpack:///./src/themes/dobbies/views/navigation-menu.view.tsx?da8f","webpack:///external \"ReactDOM\"?4b2d","webpack:///src/modules/navigation-menu/navigation-menu.view.tsx?df40"],"names":["NavigationMenuView","React","constructor","props","super","currentLevel","_positionInSetOffset","escapeKey","_updateCategoryImage","categoryImageSrc","option","linkText","promotionalImage","src","altText","ArrayExtensions","hasElements","promotionalContent","map","item","image","imageSrc","promotionalItemImageSettings","imageSettings","push","text","additionalProperties","linkUrl","destinationUrl","this","setState","categoryImage","length","categoryImageAltText","_handleDropdownToggle","data","parentId","isMobileView","activeMenu","id","parentMenu","state","undefined","showCategoryImage","imageSource","_resetFocus","setTimeout","menuNode","current","focus","_handleClickOutside","event","contains","target","_handleFocusOutside","relatedTarget","_closeSubmenu","_escFunction","keyCode","navDrawerList","Array","from","childNodes","navDrawerButton","firstChild","getAttribute","_getCategoryImage","categoryImageUrl","generateImageUrl","context","actionContext","requestContext","apiSettings","defaultImageSettings","viewports","xs","q","w","h","sm","md","lg","lazyload","ImageData","Image","Object","className","gridSettings","request","config","categoryImageSettings","loadFailureBehavior","role","_onDrawerChange","drawerState","drawerKeyValue","newPair","buttonText","isOpen","bind","telemetryContent","getTelemetryObject","telemetryPageName","friendlyName","telemetry","payLoad","getPayloadObject","componentDidMount","MsDyn365","isBrowser","document","body","addEventListener","componentWillUnmount","removeEventListener","render","_renderMobileMenu","_renderDesktopMenu","menuItemData","Navigation","Module","classnames","menuItem","posinset","_renderDrawerMenu","MenuList","Node","ref","tabIndex","_renderDisplay","setSize","subMenu","_renderDrawer","_renderLinkMenuItem","toggleButtonText","keyValue","keys","isDrawerOpen","colProps","Drawer","toggleButtonProps","ariaLabel","key","openGlyph","onToggle","collapseProps","closeGlyph","glyphPlacement","_renderLinkText","menuSubItem","currentPos","_renderDrawerLink","linkURL","_renderSpanMenuItem","ListItem","menuItemList","menuItemDatum","_getFromSubMenu","_createMenuItemList","forEach","index","subMenus","i","found","_renderSubMenu","_renderButtonMenuItem","IsSubMenu","enableMultiSupportMenu","enableMultilevelMenu","multiLevelSupportedMenu","menuLevelSupport","error","levelClassName","menuOptions","idx","hasOptions","haveSubmenu","Math","round","toString","_renderMenu","Button","onClick","onFocus","hoverEffect","isParent","Link","imagesource","contentAction","etext","attributes","getTelemetryAttributes","shouldOpenNewTab","onMouseOver","href","onTelemetryClick","_renderPromotionalLink","Span","level","currentItem","submenu","DivContainer","ImageDivContainer","showPromotionalContent","categoryImageDisplay","promotionalContentDisplay","DivContainerClass","MenuTypeIndexId","MenuSource","NavigationMenu","isRetail","isCMS","_setNavigationSource","sourceType","_updateViewport","viewport","device","Type","navigationMenuSource","isMobile","locale","nameTranslations","nameTranslation","find","Language","toLowerCase","Text","resizeThrottledEventHandler","addThrottledEvent","window","_mapData","isEmptyOrNullObject","viewProps","xl","moduleProps","tag","displayCategoryImage","displayPromotionalImage","ImageContainer","MobileDescriptionContainer","MobileBackButton","resources","backButtonAriaLabel","MobileDescriptionLabel","renderView","mergedData","categories","result","_constructMenuItemData","cmsNavItems","_constructTopMenuItemData","enabletopMenu","mergedRootMenuData","topMenu","rootMenuNavigation","retailItem","cmsItem","addedAllMenu","categoryPromotionalContent","cmsItemText","menuAriaLabel","promotionalData","filter","promoItem","categoryName","Name","Images","Uri","RSItemIdInit","getFriendlyName","NameTranslations","Url","_getNestedChildren","menuSource","Retail","CMSItemIdInit","imageDestinationURL","imageLink","_getCMSNestedChildren","Cms","openInNewTab","category","imageSourceUrl","nestedChildren","Children","allCategoryMenuText","getCategoryUrl","_getViewport","innerWidth","__decorate","observable","computed","module","exports","binding","modules","dataActions","c","require","$type","da","name","path","runOn","iNM","ns","n","p","pdp","sanitizedActionPath","dataAction","default","Error","prototype","RegistrationId","registerSanitizedActionPath","__bindings__","viewDictionary","cn","NAMES_TO_HIDE","shouldHideMenuItem","menuName","some","startsWith","supportedLevel","currentLevelMobile","mouseDownRefs","retailServerOnly","cmsOnly","all","conditionalRoutingMenuItem","dobbiesClubLink","updatedMenuItem","_getTierId","loyaltyGroup","highestActiveLoyaltyCardTier","HighestActiveLoyaltyCardTier","loyaltyCardTiers","LoyaltyCardTiers","_","loyaltyCardTier","entries","RecordId","TierId","_getRedirectionLink","loyaltyCard","tierId","clubFreeTierText","clubPlusTierText","CardNumber","trim","getUrlSync","selectedCategoryName","categoryImageLinks","selectedCategory","categoryLink","categoryImageLink","_gotoCategoryPage","categoryPageURL","location","_handleMouseHover","optionID","_isChild","_activeItem","currentCategory","_handleLinkClick","_getSubMenuLength","menuItemId","htmlElement","documentRef","getElementById","menuItemHeight","offsetHeight","isBackTrack","mobileViewLabelText","isBackBtnClicked","_handleGoBack","isInViewport","bounding","navRef","getBoundingClientRect","top","_mainMenuScroll","scrollClass","navigationSearch","then","LoyaltyGroups","redirectionLink","menuHeading","searchSlot","_getSlot","search","slotName","slots","showCannedSearches","query","cmsNavItemsNew","imageSouce","_renderMobileSubMenu","dobbiesClubNavItemText","user","isAuthenticated","style","height","updatedMenuItemData","isChild","parentName","showOptionAll","_subMenus","subItem","allOptionFound","isActiveOption","renderChildMenu","onMouseEnter","optionLinkText","ReactDOM","_shouldAddFocusMenuRef","menuItemRef","componentDidUpdate","children"],"mappings":"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","file":"static/js/147.cf2062b61ad4d01309c9.chunk.js","sourcesContent":["/*--------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * See License.txt in the project root for license information.\n *--------------------------------------------------------------*/\n\nimport MsDyn365, { IDictionary, IImageData, IImageSettings, Image } from '@msdyn365-commerce/core';\nimport { IMenuItemData, INavigationMenuViewProps } from '@msdyn365-commerce-modules/navigation-menu';\nimport { ArrayExtensions, generateImageUrl } from '@msdyn365-commerce-modules/retail-actions';\nimport {\n Drawer,\n getPayloadObject,\n getTelemetryAttributes,\n getTelemetryObject,\n ICollapseProps,\n IDrawerState,\n IPayLoad,\n ITelemetryContent,\n Module,\n Node,\n onTelemetryClick } from '@msdyn365-commerce-modules/utilities';\nimport classnames from 'classnames';\nimport * as React from 'react';\n\ninterface INavigationState {\n parentMenu?: number;\n activeMenu?: number;\n categoryImage?: IImageData[] | null;\n categoryImageAltText: string;\n drawerKeyValue: IDictionary;\n}\n\n/**\n *\n * NavigationMenuView component.\n * @extends {React.PureComponent}\n */\nexport class NavigationMenuView extends React.PureComponent {\n private currentLevel: number = 0;\n\n private readonly _positionInSetOffset: number = 1;\n\n private readonly escapeKey: number = 27;\n\n private readonly menuNode: 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.state = { activeMenu: undefined, parentMenu: undefined, categoryImageAltText: '', drawerKeyValue: {} };\n this._closeSubmenu = this._closeSubmenu.bind(this);\n this._escFunction = this._escFunction.bind(this);\n this.telemetryContent = getTelemetryObject(this.props.context.request.telemetryPageName!,\n this.props.friendlyName,\n this.props.telemetry);\n this.payLoad = getPayloadObject('click', this.telemetryContent, '', '');\n }\n\n public componentDidMount(): void {\n if (MsDyn365.isBrowser) {\n document.body.addEventListener('keydown', (this._escFunction as unknown) as EventListener, false);\n document.body.addEventListener('mousedown', this._handleClickOutside);\n document.body.addEventListener('focusout', this._handleFocusOutside);\n }\n\n }\n\n public componentWillUnmount(): void {\n if (MsDyn365.isBrowser) {\n document.removeEventListener('keydown', (this._escFunction as unknown) as EventListener, false);\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 } = this.props;\n\n this.currentLevel = 1;\n return (\n <>\n {isMobileView ? this._renderMobileMenu() : this._renderDesktopMenu()}\n \n );\n }\n\n /**\n * Method to render mobile menu.\n * @returns Jsx element.\n */\n private _renderMobileMenu(): JSX.Element {\n const { isMobileView, menuItemData, Navigation } = this.props;\n return (\n \n {menuItemData.map((menuItem: IMenuItemData, posinset: number) => {\n return this._renderDrawerMenu(menuItem, menuItemData.length, posinset + this._positionInSetOffset);\n })}\n \n );\n }\n\n /**\n * Method to render desktop menu.\n * @returns Jsx element.\n */\n private _renderDesktopMenu(): JSX.Element {\n const { MenuList, Navigation } = this.props;\n return (\n \n \n {this._renderDisplay()}\n \n \n );\n }\n\n /**\n * Method to render drawer menu.\n * @param menuItem -Menuitem data.\n * @param setSize -Setsize data.\n * @param posinset -Current position.\n * @returns Jsx element.\n */\n private _renderDrawerMenu(menuItem: IMenuItemData, setSize: number, posinset: number): JSX.Element | null {\n if (menuItem && menuItem.subMenu && ArrayExtensions.hasElements(menuItem.subMenu)) {\n return (this._renderDrawer(menuItem, setSize, posinset));\n }\n return (this._renderLinkMenuItem(menuItem, undefined, true, false, setSize, posinset));\n\n }\n\n /**\n * Method to render drawer component.\n * @param menuItem -Menuitem data.\n * @param setSize -Setsize data.\n * @param posinset -Current position.\n * @returns Jsx element.\n */\n private _renderDrawer(menuItem: IMenuItemData, setSize?: number, posinset?: number): JSX.Element | null {\n const toggleButtonText = menuItem.linkText;\n const keyValue = this.state.drawerKeyValue;\n const buttonText = toggleButtonText !== undefined ? toggleButtonText : '';\n const keys = keyValue !== undefined ? keyValue : {};\n const { isMobileView } = this.props;\n\n let isDrawerOpen = false;\n if (keys[buttonText]) {\n isDrawerOpen = true;\n }\n const colProps: ICollapseProps = { isOpen: isDrawerOpen };\n return (\n \n
\n {menuItem.subMenu!.map((menuSubItem: IMenuItemData, currentPos: number) => {\n if (ArrayExtensions.hasElements(menuSubItem.subMenu)) {\n return (this._renderDrawer(menuSubItem, menuItem.subMenu?.length, currentPos + this._positionInSetOffset));\n }\n return this._renderDrawerLink(menuSubItem, menuItem.subMenu?.length, currentPos + this._positionInSetOffset);\n })}\n
\n \n );\n }\n\n /**\n * Method to render link.\n * @param linkText -Text on Menu link.\n * @param setSize -Setsize data.\n * @param posinset -Current position.\n * @returns Jsx element.\n */\n private _renderLinkText(linkText: string | undefined, setSize: number | undefined, posinset: number | undefined): JSX.Element {\n return (\n \n {linkText}\n \n );\n }\n\n /**\n * Method to render drawer link.\n * @param item -Single Menuitem.\n * @param setSize -Setsize data.\n * @param posinset -Current position.\n * @returns Jsx element.\n */\n private _renderDrawerLink(item: IMenuItemData, setSize: number | undefined, posinset: number): JSX.Element | null {\n if (item && item.linkText && item.linkURL && item.linkURL.length > 0) {\n return (\n this._renderLinkMenuItem(item, undefined, true, false, setSize, posinset)\n );\n } else if (item && item.linkText && !item.linkURL) {\n return (\n this._renderSpanMenuItem(item)\n );\n }\n return null;\n }\n\n /**\n * Method to generate menu.\n * @returns Jsx element.\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 this.setState({ parentMenu: undefined });\n break;\n }\n menuItem = this._getFromSubMenu(menuItemDatum) as IMenuItemData;\n if (menuItem && menuItem.id === activeMenu) {\n break;\n }\n }\n\n menuItem && menuItemList.push(\n \n {' '}\n {this._createMenuItemList(menuItem)}\n {' '}\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 /**\n * Method to get data for submenu.\n * @param item -Single Menuitem.\n * @returns IMenuItemData.\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 this.setState({ parentMenu: item?.id });\n return subMenus[i];\n }\n const found = this._getFromSubMenu(subMenus[i]);\n if (found) {\n return found;\n }\n }\n }\n return null;\n }\n\n /**\n * Method to create item list.\n * @param menuItemData -Single Menuitem.\n * @returns Jsx element.\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));\n }\n return (\n <>\n {this._renderButtonMenuItem(menuItemData)}\n {this._renderSubMenu(menuItemData.subMenu, menuItemData.id)}\n \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\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 subMenuLevel = 3;\n const multiLevelSupportedMenu = this.props.config.menuLevelSupport || subMenuLevel;\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 = subMenus && 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 /**\n * Method to render button menu item.\n * @param option -Single Menuitem.\n * @param activeMenu -Active menu number.\n * @param index -Active menu index.\n * @returns Jsx element.\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 /**\n * Method to render link menu item.\n * @param option -Single Menuitem.\n * @param index -Active menu index.\n * @param hoverEffect -Active menu effect.\n * @param isParent -Is parent menu.\n * @param setSize -Setsize data.\n * @param posinset -Current position.\n * @returns Jsx element.\n */\n private _renderLinkMenuItem(option: IMenuItemData, index?: number, hoverEffect: boolean = true, isParent: boolean = false,\n setSize?: number, posinset?: number): JSX.Element | null {\n const { Link, isMobileView } = 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 /**\n * Method to render promotional link.\n * @param linkText -Link text.\n * @param linkUrl -Link url.\n * @returns Jsx element.\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\n /**\n * Method to render span menu item.\n * @param option -Single Menu Item.\n * @param index -Index.\n * @param isParent -Is parent menu.\n * @returns Jsx element.\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 /**\n * Method to render menu.\n * @param level -Menu level.\n * @param menuOptions -Menu lists.\n * @param currentItem -Menu current.\n * @param submenu -Mneu has submenu or not.\n * @returns Jsx element.\n */\n private _renderMenu(level: string, menuOptions: JSX.Element[], currentItem?: number, submenu?: boolean): JSX.Element | null {\n\n const { DivContainer, MenuList, ImageDivContainer, showCategoryImage, isMobileView, showPromotionalContent } = this.props;\n const categoryImageDisplay = !isMobileView && showCategoryImage && this.state.categoryImage !== null && this.state.categoryImage !== undefined && !submenu;\n const promotionalContentDisplay = !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 && 'navmenu-multi-level')}>\n { menuOptions }\n \n
\n {\n categoryImageDisplay && this.state.categoryImage && 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\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({ src: imageSrc, altText: item.text, imageSettings: promotionalItemImageSettings,\n additionalProperties: { linkUrl: item.linkUrl.destinationUrl } });\n }\n });\n }\n this.setState({\n categoryImage: promotionalImage.length > 0 ? promotionalImage : [{ src: 'empty' }],\n categoryImageAltText: linkText\n });\n };\n\n /**\n * Method to handle dropdwon change.\n * @param data -Menuitem data.\n * @param parentId -Menu parent.\n * @returns Jsx element.\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 this.setState({\n activeMenu: data.id,\n parentMenu: parentId\n });\n }\n\n this._resetFocus();\n };\n\n /**\n * Method to call when focus lost from menu.\n */\n private readonly _resetFocus = () => {\n if (this.props.isMobileView) {\n setTimeout(() => {\n this.menuNode && this.menuNode.current && this.menuNode.current.focus();\n }, 0);\n }\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 {\n activeMenu: undefined,\n categoryImage: null\n }\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 * Method to handle close submenu event.\n */\n private _closeSubmenu(): void {\n if (!this.props.isMobileView) {\n this.setState({ activeMenu: undefined });\n }\n }\n\n /**\n * Method to handle escape key event.\n * @param event -HTML event.\n */\n private readonly _escFunction = (event: React.KeyboardEvent) => {\n\n if (event.keyCode === this.escapeKey) {\n if (!this.props.isMobileView) {\n const navDrawerList = Array.from(this.menuNode.current!.childNodes);\n for (const item of navDrawerList) {\n const navDrawerButton = item.firstChild as HTMLButtonElement;\n if (navDrawerButton.getAttribute('aria-expanded') === 'true') {\n navDrawerButton.focus();\n }\n }\n }\n this._closeSubmenu();\n }\n };\n\n private readonly _getCategoryImage = (categoryImage?: IImageData): React.ReactNode | null => {\n\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 const ImageData: IImageData = { src: categoryImageUrl };\n return (\n \n );\n }\n return null;\n };\n\n /**\n * Method to handle escape key event.\n * @param drawerState -HTML event.\n */\n private readonly _onDrawerChange = (drawerState: IDrawerState) => {\n const { drawerKeyValue } = this.state;\n const drawerText: string = drawerState.buttonText !== undefined ? drawerState.buttonText : '';\n const newPair = { [drawerText]: drawerState.isOpen };\n this.setState({ drawerKeyValue: { ...drawerKeyValue, ...newPair } });\n };\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. All rights reserved.\n * See License.txt 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 = 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: '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 {\n tag: 'div',\n className: 'ms-nav__feature'\n },\n ImageDivContainer:\n {\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(retailItem?: CategoryHierarchy, cmsItem?: ICmsNavItemsData, isRetail?: boolean, idx?: number, addedAllMenu?: boolean): IMenuItemData {\n const locale = this.props.context && this.props.context.request && this.props.context.request.locale ? this.props.context.request.locale : '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 = retailItem && categoryPromotionalContent?.filter(\n 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\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({ linkText: this.props.resources.allCategoryMenuText, imageSource: imageSourceUrl, linkURL: getCategoryUrl(category, this.props.context as unknown as IActionContext, {}) });\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\n return 'xs';\n }\n}\n\nexport default NavigationMenu;\n","module.exports = React;","const binding = { modules: {}, dataActions: {} };\n\n const registerActionId = (actionPath) => {\n if (binding.dataActions[actionPath] &&\n binding.dataActions[actionPath].default &&\n binding.dataActions[actionPath].default.prototype &&\n binding.dataActions[actionPath].default.prototype.id) {\n binding.dataActions[binding.dataActions[actionPath].default.prototype.id] = binding.dataActions[actionPath];\n } else {\n Object.keys(binding.dataActions[actionPath] || {}).forEach(exportName => {\n if (binding.dataActions[actionPath][exportName] &&\n binding.dataActions[actionPath][exportName].prototype &&\n binding.dataActions[actionPath][exportName].prototype.Action) {\n binding.dataActions[binding.dataActions[actionPath][exportName].prototype.id] = binding.dataActions[actionPath][exportName];\n }\n })\n }\n };\n\n const registerSanitizedActionPath = (sanitizedActionPath, dataAction) => {\n if (process.env.NODE_ENV === 'development') {\n if (!dataAction.default) {\n throw new Error('Data action path does not have a default export');\n }\n if (!(dataAction.default.prototype.id && binding.dataActions[dataAction.default.prototype.id]) || !binding.dataActions[sanitizedActionPath]) {\n binding.dataActions[sanitizedActionPath] = dataAction;\n }\n } else {\n binding.dataActions[sanitizedActionPath] = dataAction;\n if (!binding.dataActions[sanitizedActionPath].default) {\n throw new Error('Data action path ' + sanitizedActionPath + ' does not have a default export');\n }\n binding.dataActions[sanitizedActionPath].default.prototype.RegistrationId = sanitizedActionPath;\n if (binding.dataActions[sanitizedActionPath].default.prototype.id) {\n binding.dataActions[binding.dataActions[sanitizedActionPath].default.prototype.id] = sanitizedActionPath;\n }\n }\n };\n \n\n (binding.modules['navigation-menu'] = {\n c: () => require('@msdyn365-commerce-modules/navigation-menu/dist/lib/modules/navigation-menu/navigation-menu'),\n $type: 'contentModule',\n da: [{name:'categories', path:'@msdyn365-commerce-modules/retail-actions/dist/lib/get-categories-hierarchy', runOn: 0}],\n \n iNM: true,\n ns: '@msdyn365-commerce-modules',\n n: 'navigation-menu',\n p: 'navigation-menu',\n \n pdp: '',\n \n \n md: 'node_modules/@msdyn365-commerce-modules/navigation-menu/dist/lib/modules/navigation-menu'\n });\n \n\n {\n const sanitizedActionPath = '@msdyn365-commerce-modules/retail-actions/dist/lib/get-categories-hierarchy';\n let dataAction = require('@msdyn365-commerce-modules/retail-actions/dist/lib/get-categories-hierarchy');\n registerSanitizedActionPath(sanitizedActionPath, dataAction);\n }\n \n\n \n window.__bindings__ = window.__bindings__ || {};\n window.__bindings__.modules = {\n ...window.__bindings__.modules || {},\n ...binding.modules\n };\n \n window.__bindings__.dataActions = {\n ...window.__bindings__.dataActions || {},\n ...binding.dataActions\n };\n export const viewDictionary = {};\n viewDictionary['__local__|__local__|themes|dobbies|views|navigation-menu'] = {\n c: () => require('partner/themes/dobbies/views/navigation-menu.view.tsx'),\n cn: '__local__-__local__-navigation-menu'\n };\nviewDictionary['@msdyn365-commerce-modules|fabrikam-design-kit|modules|fabrikam|views|navigation-menu'] = {\n c: () => require('@msdyn365-commerce-modules/fabrikam-design-kit/dist/lib/modules/fabrikam/views/navigation-menu.view.js'),\n cn: '@msdyn365-commerce-modules-fabrikam-design-kit-navigation-menu'\n };\nviewDictionary['@msdyn365-commerce-modules|navigation-menu|modules|navigation-menu|navigation-menu'] = {\n c: () => require('@msdyn365-commerce-modules/navigation-menu/dist/lib/modules/navigation-menu/navigation-menu.view.js'),\n cn: '@msdyn365-commerce-modules-navigation-menu-navigation-menu'\n };\nwindow.__bindings__ = window.__bindings__ || {};\nwindow.__bindings__.viewDictionary = {\n ...window.__bindings__.viewDictionary || {},\n ...viewDictionary\n };","/**\r\n * Copyright (c) Microsoft Corporation\r\n * All rights reserved. See License.txt in the project root for license information.\r\n * INavigationMenu contentModule Interface Properties\r\n * THIS FILE IS AUTO-GENERATED - MANUAL MODIFICATIONS WILL BE LOST\r\n */\r\n\r\nimport * as Msdyn365 from '@msdyn365-commerce/core';\r\nimport * as React from 'react';\r\n\r\nexport const enum navigationMenuSource {\r\n all = 'all',\r\n retailServerOnly = 'retailServerOnly',\r\n cmsOnly = 'cmsOnly'\r\n}\r\n\r\nexport interface INavigationMenuConfig extends Msdyn365.IModuleConfig {\r\n navigationMenuSource?: navigationMenuSource;\r\n cmsNavItems?: ICmsNavItemsData[];\r\n enableMultilevelMenu?: boolean;\r\n enabletopMenu?: boolean;\r\n menuLevelSupport?: number;\r\n rootMenuNavigation?: string;\r\n displayCategoryImage?: boolean;\r\n displayPromotionalImage?: boolean;\r\n categoryPromotionalContent?: ICategoryPromotionalContentData[];\r\n categoryImageSettings?: Msdyn365.IImageSettings;\r\n className?: string;\r\n clientRender?: boolean;\r\n cmsNavItemsNew?: ICmsNavItemsNewData[];\r\n menuHeading?: string;\r\n dobbiesClubNavItemText?: string;\r\n clubFreeTierText?: string;\r\n clubPlusTierText?: string;\r\n showOptionAll?: boolean;\r\n imageSettings?: IImageSettingsData[];\r\n categoryImageLinks?: ICategoryImageLinksData[];\r\n}\r\n\r\nexport interface INavigationMenuResources {\r\n menuAriaLabel: string;\r\n backButtonAriaLabel: string;\r\n allCategoryMenuText: string;\r\n}\r\n\r\nexport interface ICmsNavItemsData {\r\n linkText?: string;\r\n linkUrl?: Msdyn365.ILinkData;\r\n image?: Msdyn365.IImageData;\r\n imageLink?: Msdyn365.ILinkData;\r\n ariaLabel?: string;\r\n openInNewTab?: boolean;\r\n subMenus?: ISubMenusData[];\r\n}\r\n\r\nexport interface ICategoryPromotionalContentData {\r\n categoryName?: string;\r\n image: Msdyn365.IImageData;\r\n text?: string;\r\n linkUrl: Msdyn365.ILinkData;\r\n}\r\n\r\nexport interface ICmsNavItemsNewData {\r\n linkText?: string;\r\n linkUrl?: Msdyn365.ILinkData;\r\n image?: Msdyn365.IImageData;\r\n imageLink?: Msdyn365.ILinkData;\r\n ariaLabel?: string;\r\n openInNewTab?: boolean;\r\n subMenus?: ISubMenusData[];\r\n}\r\n\r\nexport interface IImageSettingsData {\r\n width?: number;\r\n height?: number;\r\n}\r\n\r\nexport interface ICategoryImageLinksData {\r\n categoryName?: string;\r\n categoryImageLink?: Msdyn365.ILinkData;\r\n}\r\n\r\nexport interface ISubMenusData {\r\n linkText?: string;\r\n linkUrl: Msdyn365.ILinkData;\r\n ariaLabel?: string;\r\n image?: Msdyn365.IImageData;\r\n imageLink?: Msdyn365.ILinkData;\r\n subMenus?: ISubMenusData[];\r\n}\r\n\r\nexport interface ISubMenusData {\r\n linkText?: string;\r\n linkUrl: Msdyn365.ILinkData;\r\n ariaLabel?: string;\r\n image?: Msdyn365.IImageData;\r\n imageLink?: Msdyn365.ILinkData;\r\n subMenus?: ISubMenusData[];\r\n}\r\n\r\nexport interface ISubMenusData {\r\n linkText?: string;\r\n linkUrl: Msdyn365.ILinkData;\r\n ariaLabel?: string;\r\n image?: Msdyn365.IImageData;\r\n imageLink?: Msdyn365.ILinkData;\r\n}\r\n\r\nexport interface ISubMenusData {\r\n linkText?: string;\r\n linkUrl: Msdyn365.ILinkData;\r\n ariaLabel?: string;\r\n image?: Msdyn365.IImageData;\r\n imageLink?: Msdyn365.ILinkData;\r\n}\r\n\r\nexport interface INavigationMenuProps extends Msdyn365.IModule {\r\n resources: INavigationMenuResources;\r\n config: INavigationMenuConfig;\r\n slots: {\r\n search: React.ReactNode[];\r\n };\r\n}\r\n","/*---------------------------------------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License. See License.txt in the project root for license information.\r\n *--------------------------------------------------------------------------------------------*/\r\nimport { ICmsNavItemsData, IMenuItemData, INavigationMenuViewProps } from '@msdyn365-commerce-modules/navigation-menu';\r\nimport {\r\n Module,\r\n getPayloadObject,\r\n getTelemetryAttributes,\r\n getTelemetryObject,\r\n IPayLoad,\r\n ITelemetryContent,\r\n Node,\r\n onTelemetryClick\r\n} from '@msdyn365-commerce-modules/utilities';\r\nimport classnames from 'classnames';\r\nimport * as React from 'react';\r\n\r\n/* VSI Customization - START */\r\nimport { generateImageUrl, getCategoryUrl } from '@msdyn365-commerce-modules/retail-actions';\r\nimport { CategoryHierarchy } from '@msdyn365-commerce/commerce-entities';\r\nimport { getUrlSync, IActionContext, IImageData, Image, Text } from '@msdyn365-commerce/core';\r\nimport { LoyaltyCard, LoyaltyGroup, TextValueTranslation } from '@msdyn365-commerce/retail-proxy';\r\nimport {\r\n INavigationMenuProps,\r\n ISubMenusData,\r\n navigationMenuSource\r\n} from '../definition-extensions/navigation-menu.ext.props.autogenerated';\r\nimport { INavigationMenuData } from './navigation-menu.data';\r\n/* VSI Customization - END */\r\n\r\ninterface INavigationState {\r\n parentMenu?: number;\r\n activeMenu?: number;\r\n scrollClass: boolean;\r\n mobileViewLabelText?: string;\r\n /* VSI Customization - START\r\n when mouse moves on any submneu item, currentcategory shows its option at ID if at level 2 and previous category ID (which is actually its parent ID) if at level 3 */\r\n currentCategory?: number | undefined;\r\n // checks whether back button is clicked or not on mobile menu\r\n isBackBtnClicked?: boolean;\r\n categoryImage?: string | null;\r\n categoryImageLink?: string;\r\n dobbiesClubLink?: string; // Check if user is club or club plus member, clicking on Dobbies club will navigate to loyalty page otherwise to dobbies marketing or as configured in CMS page\r\n /* VSI Customization - END */\r\n navigationSearch: boolean;\r\n}\r\n\r\nconst NAMES_TO_HIDE = ['Edits', 'CS-'];\r\n\r\nconst shouldHideMenuItem = (menuName: string | undefined): boolean => {\r\n if (menuName === undefined) return true;\r\n return NAMES_TO_HIDE.some(name => menuName.startsWith(name));\r\n};\r\n\r\n/**\r\n *\r\n * NavigationMenuView component\r\n * @extends {React.PureComponent}\r\n */\r\nexport class NavigationMenuView extends React.PureComponent<\r\n INavigationMenuViewProps & INavigationMenuProps,\r\n INavigationState\r\n> {\r\n private static isBackTrack: boolean = false;\r\n private static CMSItemIdInit: number = 1000;\r\n private static RSItemIdInit: number = 5000;\r\n private supportedLevel: number = 3;\r\n private currentLevel: number = 0;\r\n /* VSI Customization - START - 13/11/20 */\r\n // Tells current active level on mobile\r\n private currentLevelMobile: number = 0;\r\n private menuItemData: IMenuItemData[];\r\n private isRetail: boolean = true;\r\n private isCMS: boolean = true;\r\n /* VSI Customization - END */\r\n private menuNode: React.RefObject;\r\n private telemetryContent: ITelemetryContent;\r\n private payLoad: IPayLoad;\r\n private documentRef: Document | undefined;\r\n\r\n private mouseDownRefs: ((e: any) => void)[] = [];\r\n private navRef: React.RefObject;\r\n\r\n public static getFriendlyName(locale: string, nameTranslations?: TextValueTranslation[]): string | undefined {\r\n let nameTranslation: TextValueTranslation | undefined;\r\n if (locale && nameTranslations && nameTranslations.length > 0) {\r\n nameTranslation = nameTranslations.find(item => item.Language!.toLowerCase() === locale.toLowerCase());\r\n }\r\n\r\n return nameTranslation && nameTranslation.Text;\r\n }\r\n\r\n constructor(props: INavigationMenuViewProps & INavigationMenuProps, state: INavigationState) {\r\n super(props);\r\n this.menuNode = React.createRef();\r\n this.navRef = React.createRef();\r\n this.menuItemData = this._mapData();\r\n this._setNavigationSource(this.props.config && this.props.config.navigationMenuSource);\r\n this.state = {\r\n navigationSearch: true,\r\n activeMenu: undefined,\r\n mobileViewLabelText: '',\r\n parentMenu: undefined,\r\n scrollClass: false,\r\n isBackBtnClicked: false\r\n };\r\n this._closeSubmenu = this._closeSubmenu.bind(this);\r\n this.telemetryContent = getTelemetryObject(\r\n this.props.context.request.telemetryPageName!,\r\n this.props.friendlyName,\r\n this.props.telemetry\r\n );\r\n this.payLoad = getPayloadObject('click', this.telemetryContent, '', '');\r\n }\r\n\r\n public componentDidMount(): void {\r\n this.documentRef = document;\r\n\r\n if (document.body) {\r\n this.mouseDownRefs.push(this._handleClickOutside);\r\n this.mouseDownRefs.push(this._handleMouseHover(undefined));\r\n this.mouseDownRefs.push(this._handleLinkClick(undefined));\r\n this.mouseDownRefs.forEach(ref => document.body.addEventListener('mousedown', ref));\r\n }\r\n window.addEventListener('scroll', this._mainMenuScroll);\r\n\r\n // Get Customer Loyalty card details if he/she is authenticated and state is not set yet\r\n this.props.data.loyaltyCard.then(loyaltyCard => {\r\n const loyaltyGroup = loyaltyCard && loyaltyCard.LoyaltyGroups && loyaltyCard.LoyaltyGroups[0];\r\n const tierId = loyaltyGroup && this._getTierId(loyaltyGroup);\r\n const redirectionLink = loyaltyCard && tierId && this._getRedirectionLink(loyaltyCard, tierId);\r\n this.setState({ dobbiesClubLink: redirectionLink });\r\n });\r\n }\r\n\r\n public componentWillUnmount(): void {\r\n this.mouseDownRefs.forEach(ref => document.body.removeEventListener('mousedown', ref));\r\n window.addEventListener('scroll', this._mainMenuScroll);\r\n }\r\n\r\n public render(): JSX.Element | null {\r\n const {\r\n isMobileView,\r\n MenuList,\r\n MobileBackButton,\r\n MobileDescriptionContainer,\r\n MobileDescriptionLabel,\r\n Navigation,\r\n config: { menuHeading }\r\n } = this.props;\r\n this.currentLevel = 1;\r\n const searchSlot = this._getSlot('search');\r\n const search = (searchSlot && searchSlot.length && searchSlot) || [];\r\n\r\n return (\r\n /* Below line updated for Sticky Navigation */\r\n
\r\n \r\n {/* VSI Customization - START\r\n Mobile menu heading */}\r\n {isMobileView && this.state.activeMenu === undefined && (\r\n \r\n \r\n \r\n )}\r\n {/* VSI Customization - END */}\r\n \r\n {isMobileView && this.state.activeMenu !== undefined && (\r\n \r\n \r\n {this.state.mobileViewLabelText}\r\n \r\n )}\r\n\r\n {this.state.navigationSearch ? this._renderDisplay() : ''}\r\n {this.state.scrollClass &&\r\n (this.state.navigationSearch ? (\r\n
this.setState({ navigationSearch: false })}>
\r\n ) : (\r\n <>\r\n {search} \r\n
this.setState({ navigationSearch: true })}>
\r\n \r\n ))}\r\n
\r\n \r\n
\r\n );\r\n }\r\n\r\n private _getSlot(slotName: string): React.ReactNode[] | null {\r\n const { slots } = this.props;\r\n return (slots! && slots[slotName]! && slots[slotName].length! && slots[slotName]!) || null;\r\n }\r\n\r\n private _renderDisplay(): JSX.Element[] {\r\n const { ListItem, isMobileView } = this.props;\r\n const { activeMenu } = this.state;\r\n const { menuItemData } = this;\r\n const menuItemList: JSX.Element[] = [];\r\n\r\n if (isMobileView && activeMenu !== undefined && menuItemData.length > 0) {\r\n let menuItem: IMenuItemData = {};\r\n for (let i = 0; i < menuItemData.length; i++) {\r\n if (menuItemData[i] && menuItemData[i].id === activeMenu) {\r\n menuItem = menuItemData[i];\r\n !NavigationMenuView.isBackTrack\r\n ? this.setState({ parentMenu: undefined })\r\n : this.setState({ parentMenu: undefined, mobileViewLabelText: menuItemData[i].linkText });\r\n break;\r\n }\r\n menuItem = this._getFromSubMenu(menuItemData[i]) as IMenuItemData;\r\n if (menuItem && menuItem.id === activeMenu) {\r\n break;\r\n }\r\n }\r\n /* VSI Customization - START - 13/11/20 */\r\n if (menuItem) {\r\n // if user is on level < supported level, add 1 in currentLevelMobile\r\n // but if user clicks on back button and go to previous menu, currentLevelMobile will not be incremented\r\n this.currentLevelMobile < this.supportedLevel && this.state.isBackBtnClicked === false && this.currentLevelMobile++;\r\n menuItemList.push(\r\n \r\n {' '}\r\n {this._createMenuItemList(menuItem)}{' '}\r\n \r\n );\r\n }\r\n /* VSI Customization - END */\r\n } else {\r\n /* VSI Customization - START -13/11/20 */\r\n // if user is on first/root navigation menu level\r\n this.currentLevelMobile = 0;\r\n /* VSI Customization - END */\r\n menuItemData.forEach((item: IMenuItemData, index: number) => {\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 /* VSI Customization - START - 17/06/21 - Copied following functions from tsx file to display all option on 3rd level */\r\n private _mapData(): IMenuItemData[] {\r\n const { data, config } = this.props;\r\n const showCannedSearches = this.props.context.request.query?.showCannedSearches;\r\n const mergedData: IMenuItemData[] = [];\r\n /* VSI Customization - START - 8/31/22 /** adding another menu */\r\n if (this.isCMS && config.cmsNavItemsNew && config.cmsNavItemsNew.length > 0) {\r\n config.cmsNavItemsNew.map((item: ICmsNavItemsData, idx: number) =>\r\n mergedData.push(this._constructMenuItemData(undefined, item, false, idx + 1))\r\n );\r\n }\r\n /* VSI Customization - END - 8/31/22 /** adding another menu */\r\n\r\n if (\r\n this.isRetail &&\r\n config.navigationMenuSource === 'all' &&\r\n data &&\r\n data.categories &&\r\n data.categories.result &&\r\n data.categories.result.length > 0\r\n ) {\r\n data.categories.result.map((item: CategoryHierarchy, index) => {\r\n if (item.Name === 'Sale') {\r\n return;\r\n }\r\n (showCannedSearches || !shouldHideMenuItem(item.Name)) &&\r\n mergedData.push(this._constructMenuItemData(item, undefined, true, index, true));\r\n });\r\n }\r\n\r\n if (this.isCMS && config.cmsNavItems && config.cmsNavItems.length > 0) {\r\n config.cmsNavItems.map((item: ICmsNavItemsData, idx: number) =>\r\n mergedData.push(this._constructMenuItemData(undefined, item, false, idx + 1))\r\n );\r\n }\r\n return this._constructTopMenuItemData(mergedData);\r\n }\r\n\r\n private _constructTopMenuItemData(mergedData: IMenuItemData[]): IMenuItemData[] {\r\n const enableTopLevelMenu = this.props.config.enabletopMenu || false;\r\n if (!enableTopLevelMenu) {\r\n return mergedData;\r\n }\r\n const mergedRootMenuData: IMenuItemData[] = [];\r\n const topMenu = {\r\n id: 1,\r\n linkText: this.props.config.rootMenuNavigation || '...',\r\n linkURL: '#',\r\n imageSource: undefined,\r\n subMenu: mergedData\r\n } as IMenuItemData;\r\n mergedRootMenuData.push(topMenu);\r\n\r\n return mergedRootMenuData;\r\n }\r\n\r\n // tslint:disable-next-line: cyclomatic-complexity\r\n private _constructMenuItemData(\r\n retailItem?: CategoryHierarchy,\r\n cmsItem?: ICmsNavItemsData,\r\n isRetail?: boolean,\r\n idx?: number,\r\n addedAllMenu?: boolean\r\n ): IMenuItemData {\r\n const locale =\r\n this.props.context && this.props.context.request && this.props.context.request.locale\r\n ? this.props.context.request.locale\r\n : 'en-us';\r\n const imageSouce = retailItem && retailItem.Images && retailItem.Images[0].Uri ? retailItem.Images[0].Uri : 'empty';\r\n if (isRetail) {\r\n return {\r\n id: NavigationMenuView.RSItemIdInit++,\r\n linkText: NavigationMenuView.getFriendlyName(locale, retailItem && retailItem.NameTranslations) || '',\r\n linkURL: retailItem && retailItem.Url,\r\n imageSource: imageSouce,\r\n subMenu: this._getNestedChildren(retailItem, imageSouce, addedAllMenu)\r\n } as IMenuItemData;\r\n } else {\r\n return {\r\n id: NavigationMenuView.CMSItemIdInit++,\r\n linkText: (cmsItem && cmsItem.linkText) || '',\r\n linkURL: (cmsItem && cmsItem.linkUrl && cmsItem.linkUrl.destinationUrl) || '',\r\n imageDestinationURL: (cmsItem && cmsItem.imageLink && cmsItem.imageLink.destinationUrl) || '',\r\n imageSource: (cmsItem && cmsItem.image && cmsItem.image.src) || '',\r\n subMenu: this._getCMSNestedChildren(cmsItem)\r\n } as IMenuItemData;\r\n }\r\n }\r\n\r\n private _getNestedChildren(category?: CategoryHierarchy, imageSourceUrl?: string, addedAllMenu: boolean = false): IMenuItemData[] {\r\n const nestedChildren: IMenuItemData[] = [];\r\n const showCannedSearches = this.props.context.request.query?.showCannedSearches;\r\n if (!category || !category.Children || !category.Children.length) {\r\n return [];\r\n }\r\n if (!this.props.config.enabletopMenu && addedAllMenu) {\r\n nestedChildren.push({\r\n linkText: this.props.resources.allCategoryMenuText,\r\n imageSource: imageSourceUrl,\r\n linkURL: getCategoryUrl(category, (this.props.context as unknown) as IActionContext, {})\r\n });\r\n }\r\n category.Children.map((item: CategoryHierarchy, index) => {\r\n (showCannedSearches || !shouldHideMenuItem(item.Name)) &&\r\n nestedChildren.push(this._constructMenuItemData(item, undefined, true, index, true));\r\n });\r\n return nestedChildren;\r\n }\r\n\r\n private _getCMSNestedChildren(category?: ICmsNavItemsData): IMenuItemData[] {\r\n const nestedChildren: IMenuItemData[] = [];\r\n\r\n if (!category || !category.subMenus || !category.subMenus.length) {\r\n return [];\r\n }\r\n\r\n category.subMenus.map((item: ISubMenusData, idx: number) => {\r\n nestedChildren.push(this._constructMenuItemData(undefined, item, false, idx));\r\n });\r\n return nestedChildren;\r\n }\r\n\r\n private _setNavigationSource = (sourceType?: navigationMenuSource): void => {\r\n switch (sourceType) {\r\n case navigationMenuSource.retailServerOnly:\r\n this.isRetail = true;\r\n this.isCMS = false;\r\n break;\r\n case navigationMenuSource.cmsOnly:\r\n this.isRetail = false;\r\n this.isCMS = true;\r\n break;\r\n case navigationMenuSource.all:\r\n this.isRetail = true;\r\n this.isCMS = true;\r\n break;\r\n default:\r\n }\r\n };\r\n /* VSI Customization - END - 17/04/21 */\r\n private _getFromSubMenu(item?: IMenuItemData): IMenuItemData | null {\r\n const subMenus = item && item.subMenu;\r\n if (subMenus && subMenus.length > 0) {\r\n for (let i = 0; i <= subMenus.length - 1; i++) {\r\n if (subMenus[i].id === this.state.activeMenu) {\r\n !NavigationMenuView.isBackTrack\r\n ? this.setState({ parentMenu: item && item.id })\r\n : this.setState({ parentMenu: item && item.id, mobileViewLabelText: subMenus[i].linkText });\r\n return subMenus[i];\r\n }\r\n const found = this._getFromSubMenu(subMenus[i]);\r\n if (found) {\r\n return found;\r\n }\r\n }\r\n }\r\n this.props.context.telemetry.error('Submenu content is empty, module wont render.');\r\n return null;\r\n }\r\n private _renderMobileSubMenu(menuItemData: IMenuItemData): JSX.Element | null {\r\n return (\r\n \r\n {this._renderButtonMenuItem(menuItemData)}\r\n {this._renderSubMenu(menuItemData.subMenu, menuItemData.id, undefined, menuItemData.linkText)}\r\n \r\n );\r\n }\r\n\r\n private _createMenuItemList(menuItemData: IMenuItemData): JSX.Element | null {\r\n const {\r\n isMobileView,\r\n config: { dobbiesClubNavItemText },\r\n context: {\r\n request: {\r\n user: { isAuthenticated }\r\n }\r\n }\r\n } = this.props;\r\n if (menuItemData && menuItemData.subMenu && menuItemData.subMenu.length > 0) {\r\n if (isMobileView && this.state.activeMenu !== undefined) {\r\n return this._renderSubMenu(menuItemData.subMenu, menuItemData.id, undefined, menuItemData.linkText);\r\n } else {\r\n /* VSI Customization - START */\r\n if (isMobileView) {\r\n return this._renderMobileSubMenu(menuItemData);\r\n }\r\n return (\r\n \r\n {this._renderButtonMenuItem(menuItemData)}\r\n \r\n {this._renderSubMenu(menuItemData.subMenu, menuItemData.id, undefined)}\r\n \r\n \r\n \r\n );\r\n /* VSI Customization - END */\r\n }\r\n } else if (menuItemData && menuItemData.linkText && menuItemData.linkURL && menuItemData.linkURL.length > 0) {\r\n /* VSI Customization - START - 11/11/20 */\r\n // Check if user is club or club plus member, clicking on Dobbies club will navigate to loyalty page otherwise to dobbies marketing or as configured in CMS page\r\n let updatedMenuItemData: IMenuItemData = menuItemData;\r\n if (isAuthenticated && menuItemData.linkText?.toLowerCase() === dobbiesClubNavItemText?.toLowerCase()) {\r\n updatedMenuItemData = this.conditionalRoutingMenuItem(menuItemData);\r\n }\r\n /* Displayed static menu items as buttons in desktop view and as link menu items in mobile/iPad view */\r\n if (isMobileView) {\r\n return this._renderLinkMenuItem(updatedMenuItemData);\r\n }\r\n return this._renderButtonMenuItem(updatedMenuItemData);\r\n /* VSI Customization - END */\r\n } else if (menuItemData && menuItemData.linkText && !menuItemData.linkURL) {\r\n return this._renderSpanMenuItem(menuItemData);\r\n }\r\n this.props.context.telemetry.error('Navigation menu content is empty, module wont render.');\r\n return null;\r\n }\r\n\r\n /* VSI Customization - START - 07/04/21 - Conditional routing of dobbies club navigation menu item */\r\n\r\n // Route conditionally on clicking Dobbies Club nav item, it updated menu item url and returns updated menuItemData\r\n private conditionalRoutingMenuItem = (menuItemData: IMenuItemData): IMenuItemData => {\r\n const { dobbiesClubLink } = this.state;\r\n\r\n if (dobbiesClubLink) {\r\n const updatedMenuItem = menuItemData;\r\n updatedMenuItem.linkURL = dobbiesClubLink;\r\n return updatedMenuItem;\r\n }\r\n return menuItemData;\r\n };\r\n\r\n // Provide the TierId of user's loyalty\r\n private _getTierId = (loyaltyGroup: LoyaltyGroup | undefined) => {\r\n // highestLoyaltCardTier\r\n const highestActiveLoyaltyCardTier = loyaltyGroup && loyaltyGroup.HighestActiveLoyaltyCardTier;\r\n const loyaltyCardTiers = loyaltyGroup && loyaltyGroup.LoyaltyCardTiers;\r\n if (loyaltyCardTiers && loyaltyCardTiers?.length > 0) {\r\n for (const [_, loyaltyCardTier] of loyaltyCardTiers.entries()) {\r\n if (loyaltyCardTier.RecordId === highestActiveLoyaltyCardTier) {\r\n return loyaltyCardTier.TierId;\r\n }\r\n }\r\n }\r\n return;\r\n };\r\n\r\n // Redirects the user based on certain criteria defined inside function\r\n private _getRedirectionLink = (loyaltyCard: LoyaltyCard, tierId: string | undefined) => {\r\n const {\r\n config: { clubFreeTierText, clubPlusTierText }\r\n } = this.props;\r\n\r\n if (!loyaltyCard.CardNumber || !tierId || !clubFreeTierText || !clubPlusTierText) {\r\n return undefined;\r\n }\r\n\r\n tierId = tierId.toLowerCase().trim();\r\n // If user is already dobbies club free/plus member and clicks on dobbies club nav item, navigate him to loyalty page\r\n if (tierId === clubFreeTierText.toLowerCase() || tierId === clubPlusTierText.toLowerCase()) {\r\n return getUrlSync('loyalty', this.props.context.actionContext);\r\n }\r\n\r\n return undefined;\r\n };\r\n\r\n /* VSI Customization - END */\r\n private _getCategoryImage = (categoryImage: string): React.ReactNode | null => {\r\n const categoryImageUrl = generateImageUrl(`${categoryImage}`, this.props.context.actionContext.requestContext.apiSettings);\r\n if (categoryImageUrl !== undefined) {\r\n const ImageData: IImageData = { src: categoryImageUrl };\r\n return (\r\n \r\n );\r\n }\r\n return null;\r\n };\r\n\r\n private _updateCategoryImage = (categoryImage: string, selectedCategoryName: string) => () => {\r\n /* VSI Customization - START - 16/03/21 */\r\n // Get category image data matched with currenct category\r\n const {\r\n config: { categoryImageLinks }\r\n } = this.props;\r\n const selectedCategory =\r\n categoryImageLinks &&\r\n categoryImageLinks.find(category => {\r\n const categoryName = category.categoryName && category.categoryName.trim().toLowerCase();\r\n return selectedCategoryName.toLowerCase().trim() === categoryName;\r\n });\r\n const categoryLink = selectedCategory && selectedCategory.categoryImageLink && selectedCategory.categoryImageLink.destinationUrl;\r\n /* VSI Customization - END */\r\n this.setState({\r\n categoryImage: categoryImage !== '' ? categoryImage : 'empty',\r\n categoryImageLink: categoryImage !== '' ? categoryLink : undefined\r\n });\r\n };\r\n\r\n private _renderSubMenu(subMenus?: IMenuItemData[], activeMenu?: number, isChild?: boolean, parentName?: string): JSX.Element | null {\r\n const {\r\n isMobileView,\r\n ListItem,\r\n MenuList,\r\n config: { showOptionAll }\r\n } = this.props;\r\n /* VSI Customization - START */\r\n /* Added isMobileView condition to check this condition just for mobile to fill submenu by default in case of desktop */\r\n if (isMobileView && activeMenu && this.state.activeMenu !== activeMenu) {\r\n this.props.context.telemetry.error('Navigation Active menu content is empty, module wont render.');\r\n return null;\r\n }\r\n /* VSI Customization - END */\r\n if (!subMenus || subMenus.length === 0) {\r\n this.props.context.telemetry.error('Navigation Submenu content is empty, module wont render.');\r\n return null;\r\n }\r\n /* VSI Customization - START - 02/11/20 */\r\n let _subMenus: IMenuItemData[];\r\n if (isChild === undefined && !showOptionAll) {\r\n if (!isMobileView) {\r\n // Second level menu will not include option 'All' on desktop\r\n _subMenus =\r\n subMenus &&\r\n subMenus.filter(subItem => {\r\n return subItem.linkText && subItem.linkText.toLowerCase() !== 'all';\r\n });\r\n } else {\r\n // display parentName instead of all in third level on desktop\r\n let allOptionFound = false;\r\n _subMenus = subMenus;\r\n _subMenus &&\r\n _subMenus.map(submenu => {\r\n if (!allOptionFound && submenu.linkText && submenu.linkText.toLowerCase() === 'all') {\r\n submenu.linkText = `${submenu.linkText} ${parentName}`;\r\n allOptionFound = true;\r\n }\r\n });\r\n }\r\n } else {\r\n // Third level menu\r\n // on desktop, do not show the all category menu on the third level\r\n _subMenus = subMenus;\r\n _subMenus =\r\n subMenus &&\r\n subMenus.filter(subItem => {\r\n return subItem.linkText && subItem.linkText.toLowerCase() !== 'all';\r\n });\r\n }\r\n /* VSI Customization - END */\r\n let levelClassName: string = '';\r\n const menuOptions =\r\n _subMenus &&\r\n _subMenus.map((option: IMenuItemData, idx: number) => {\r\n let isActiveOption = option.id !== undefined && this.state.currentCategory === option.id;\r\n isActiveOption = isActiveOption && 'id' in option; // if any option doesn't have id value, its submenu will not be created\r\n const hasOptions = (option.subMenu && option.subMenu.length > 0) || false;\r\n const renderChildMenu = isMobileView ? hasOptions : isActiveOption;\r\n\r\n let menuItem: JSX.Element | null;\r\n if (hasOptions && isMobileView && this.currentLevelMobile < this.supportedLevel - 1) {\r\n menuItem = this._renderButtonMenuItem(option, activeMenu, idx);\r\n } else {\r\n menuItem = option.linkURL\r\n ? this._renderLinkMenuItem(option, idx, activeMenu, isChild, parentName)\r\n : this._renderSpanMenuItem(option);\r\n }\r\n let subMenu;\r\n if (renderChildMenu === true) {\r\n this.currentLevel++;\r\n if (this.currentLevel <= this.supportedLevel - 1) {\r\n levelClassName = `level-${this.currentLevel.toString()}`;\r\n /* Last parameter indicated if it is child or not */\r\n subMenu = this._renderSubMenu(option.subMenu, isMobileView ? option.id : undefined, true, option.linkText);\r\n }\r\n }\r\n return (\r\n <>\r\n \r\n {menuItem}\r\n {/* VSI Customization - START */}\r\n {isMobileView && subMenu}\r\n {/* Following node displays submenu against a menu item when user moves mouse on it on desktop*/}\r\n {!isMobileView && (\r\n \r\n \r\n {subMenu}\r\n \r\n \r\n )}\r\n {/* VSI Customization - END */}\r\n \r\n \r\n );\r\n });\r\n\r\n return this._renderMenu(levelClassName, menuOptions, activeMenu);\r\n }\r\n /* VSI Customization - START */\r\n /* Following function navigate to category page */\r\n private _gotoCategoryPage = (categoryPageURL: string | undefined) => () => {\r\n if (categoryPageURL) {\r\n window.location.href = categoryPageURL;\r\n }\r\n };\r\n /* VSI Customization - END */\r\n private _renderButtonMenuItem(option: IMenuItemData, activeMenu?: number, index?: number): JSX.Element | null {\r\n const { Button, isMobileView } = this.props;\r\n /* VSI Customization - START */\r\n\r\n if (isMobileView) {\r\n return (\r\n \r\n
{option.linkText}
\r\n \r\n );\r\n } else {\r\n /* Mouse Hover on menuitem displays its submenu till level 3 */\r\n /* Mouse Click on menuitem will navigate to its category page */\r\n\r\n return (\r\n \r\n
{option.linkText}
\r\n \r\n );\r\n }\r\n /* VSI Customization - START */\r\n }\r\n private _renderLinkMenuItem(\r\n option: IMenuItemData,\r\n index?: number,\r\n activeMenu?: number | undefined,\r\n _isChild?: boolean | undefined,\r\n parentName?: string\r\n ): JSX.Element | null {\r\n const { isMobileView } = this.props;\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 const optionLinkText = _isChild && linkText === parentName ? {linkText} : linkText;\r\n /* VSI Customization - START*/\r\n if (isMobileView) {\r\n return (\r\n \r\n {optionLinkText}\r\n \r\n );\r\n } else {\r\n /* onClick navigates to category page if clicked item is child item (level 3) */\r\n const onClick = _isChild ? { onClick: this._handleLinkClick(option.linkText) } : undefined;\r\n return (\r\n \r\n {optionLinkText}\r\n {!_isChild && option.subMenu && option.subMenu.length > 0 ? : undefined}\r\n \r\n );\r\n }\r\n /* VSI Customization - END - 31/10/20 */\r\n }\r\n\r\n /* VSI Customization - START */\r\n /* Following function sets value of previous current category in case of level 3 and option.id in case of level 2 */\r\n private _handleMouseHover = (optionID: number | undefined, _isChild?: boolean | undefined) => () => {\r\n const _activeItem = _isChild ? this.state.currentCategory : optionID;\r\n _activeItem !== undefined && this.setState({ currentCategory: _activeItem });\r\n };\r\n /* onClick navigates to category page if clicked item is child item */\r\n private _handleLinkClick = (linkURL: string | undefined) => () => {\r\n this._gotoCategoryPage(linkURL);\r\n };\r\n /* VSI Customization - END */\r\n private _renderSpanMenuItem(option: IMenuItemData, index?: number): JSX.Element | null {\r\n const { Span } = this.props;\r\n return (\r\n \r\n {option.linkText}\r\n \r\n );\r\n }\r\n // VSI Customization - Added categoryImageLink has been added\r\n private _renderMenu(level: string, menuOptions: JSX.Element[], currentItem?: number): JSX.Element | null {\r\n const { DivContainer, MenuList, ImageDivContainer, showCategoryImage } = this.props;\r\n const { categoryImage, categoryImageLink } = this.state;\r\n this.currentLevel = 1;\r\n if (showCategoryImage) {\r\n return (\r\n \r\n \r\n {menuOptions}\r\n \r\n \r\n {categoryImage !== undefined && categoryImage !== null && (\r\n <>\r\n {categoryImageLink ? (\r\n {this._getCategoryImage(categoryImage)}\r\n ) : (\r\n this._getCategoryImage(categoryImage)\r\n )}\r\n \r\n )}\r\n \r\n \r\n );\r\n }\r\n return (\r\n \r\n \r\n {menuOptions}\r\n \r\n \r\n );\r\n }\r\n\r\n /* VSI Customization - START - 04/01/21 */\r\n private _getSubMenuLength = (menuItemId: number | undefined) => {\r\n const menuItem = menuItemId && menuItemId.toString();\r\n const htmlElement = menuItem && this.documentRef && this.documentRef.getElementById(menuItem);\r\n const menuItemHeight = htmlElement && htmlElement.offsetHeight;\r\n return menuItemHeight === 0 ? undefined : menuItemHeight;\r\n };\r\n /* VSI Customization - END */\r\n\r\n private _handleDropdownToggle = (data: IMenuItemData, parentId?: number) => () => {\r\n if (!this.props.isMobileView) {\r\n this.setState({\r\n activeMenu: this.state.activeMenu && this.state.activeMenu === data.id! ? undefined : data.id!,\r\n parentMenu: parentId,\r\n currentCategory: undefined // parent of third menu to render third level menu\r\n });\r\n if (this.props.showCategoryImage) {\r\n this._updateCategoryImage(data.imageSource!, data.linkText!)();\r\n }\r\n } else {\r\n NavigationMenuView.isBackTrack = false;\r\n this.setState({\r\n activeMenu: data.id,\r\n mobileViewLabelText: data.linkText!,\r\n parentMenu: parentId,\r\n isBackBtnClicked: false\r\n });\r\n }\r\n\r\n this._resetFocus();\r\n };\r\n\r\n private _handleGoBack = () => () => {\r\n NavigationMenuView.isBackTrack = true;\r\n this.setState({ activeMenu: this.state.parentMenu, isBackBtnClicked: true });\r\n /* VSI Customization - START -13/11/20 */\r\n // decrement of 1 in currentLevelMobile when user clicks on back button\r\n this.currentLevelMobile--;\r\n /* VSI Customization - END */\r\n this._resetFocus();\r\n };\r\n\r\n private _resetFocus = () => {\r\n if (this.props.isMobileView) {\r\n setTimeout(() => {\r\n this.menuNode && this.menuNode.current && this.menuNode.current.focus();\r\n }, 0);\r\n }\r\n };\r\n\r\n // tslint:disable-next-line:no-any\r\n private _handleClickOutside = (event: any) => {\r\n if (this.menuNode.current && !this.menuNode.current.contains(event.target)) {\r\n this.setState({ activeMenu: undefined, mobileViewLabelText: '' });\r\n }\r\n };\r\n\r\n private _closeSubmenu(): void {\r\n if (!this.props.isMobileView) {\r\n this.setState({ activeMenu: undefined, mobileViewLabelText: '' });\r\n }\r\n }\r\n\r\n private isInViewport = () => {\r\n const bounding = this.navRef.current?.getBoundingClientRect();\r\n return bounding && bounding.top >= 0;\r\n };\r\n\r\n /* VSI Customization - START - 29/10/20 */\r\n /* Sticky Navigation function added */\r\n private _mainMenuScroll = (): void => {\r\n if (this.isInViewport()) {\r\n this.setState({\r\n scrollClass: false,\r\n navigationSearch: true\r\n });\r\n } else if (!this.state.scrollClass) {\r\n this.setState({\r\n scrollClass: true,\r\n navigationSearch: true\r\n });\r\n }\r\n };\r\n /* VSI Customization - END - 29/10/20 */\r\n}\r\n\r\nexport default NavigationMenuView;\r\n","module.exports = ReactDOM;","/*--------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * See License.txt 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 { getPayloadObject, getTelemetryAttributes, getTelemetryObject, IPayLoad, ITelemetryContent, Module, Node, onTelemetryClick } 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(this.props.context.request.telemetryPageName!,\n this.props.friendlyName,\n this.props.telemetry);\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\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 \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 ? this.setState({ parentMenu: undefined }) : 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 && menuItemList.push(\n \n {' '}\n {this._createMenuItemList(menuItem)}\n {' '}\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 ? this.setState(\n { parentMenu: item?.id }\n ) : this.setState(\n { parentMenu: item && item.id, mobileViewLabelText: subMenus[i].linkText }\n );\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\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 = subMenus && 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(option: IMenuItemData, index?: number, hoverEffect: boolean = true, isParent: boolean = false): 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\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\n const { DivContainer, MenuList, ImageDivContainer, showCategoryImage, showPromotionalContent, isMobileView } = this.props;\n const categoryImageDisplay = !isMobileView && (showCategoryImage || showPromotionalContent) && !ArrayExtensions.hasElements(this.state.categoryImage) && !submenu;\n const promotionalContentDisplay = !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 && 'navmenu-multi-level')}>\n { menuOptions }\n \n {\n categoryImageDisplay && this.state.categoryImage && 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({ src: imageSrc, altText: item.text, imageSettings: promotionalItemImageSettings,\n additionalProperties: { linkUrl: item.linkUrl.destinationUrl } });\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 {\n activeMenu: undefined,\n mobileViewLabelText: '',\n categoryImage: null\n }\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\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":""}