{"version":3,"sources":["webpack:///./src/themes/elicit/views/smwe-navigation-menu.view.tsx?8f1a","webpack:///./src/themes/north-star/views/smwe-navigation-menu.view.tsx?e279","webpack:///./src/modules/smwe-navigation-menu/smwe-navigation-menu.props.autogenerated.ts?208d","webpack:///./src/modules/smwe-navigation-menu/smwe-navigation-menu.tsx?d557","webpack:///./src/themes/conn-creek/views/smwe-navigation-menu.view.tsx?857b","webpack:///./src/themes/stemichelle/views/smwe-navigation-menu.view.tsx?3d07","webpack:///./src/themes/lql/views/smwe-navigation-menu.view.tsx?c4c8","webpack:///./src/themes/spring-valley-vineyard/views/smwe-navigation-menu.view.tsx?ab00","webpack:///./src/themes/erath/views/smwe-navigation-menu.view.tsx?ab2a","webpack:///./src/themes/blend/views/smwe-navigation-menu.view.tsx?3752","webpack:///./src/themes/generazioni/views/smwe-navigation-menu.view.tsx?d932","webpack:///./src/modules/smwe-navigation-menu/smwe-navigation-menu.view.tsx?af3c","webpack:///./src/themes/patzhall/views/smwe-navigation-menu.view.tsx?57a5","webpack:///./src/themes/stagsleap/views/smwe-navigation-menu.view.tsx?da1d","webpack:///./src/themes/smwe/views/smwe-navigation-menu.view.tsx?48d2","webpack:///./src/themes/h3-theme/views/smwe-navigation-menu.view.tsx?25c1","webpack:///./src/themes/colsolare/views/smwe-navigation-menu.view.tsx?da1f","webpack:///./src/themes/enoteca/views/smwe-navigation-menu.view.tsx?fd58","webpack:///./src/themes/columbiacrest/views/smwe-navigation-menu.view.tsx?5947","webpack:///./src/themes/stemichelle-new/views/smwe-navigation-menu.view.tsx?9e1e","webpack:///./src/themes/fth/views/smwe-navigation-menu.view.tsx?5fe5"],"names":["NavigationMenuView","React","constructor","props","super","supportedLevel","currentLevel","pathName","activeClassName","activeMenuItem","activeSubMenuItem","_mainNavClick","option","link","linkURL","window","location","href","_handleDropdownToggle","data","parentId","activeMenu","this","isMobileView","state","id","undefined","setState","parentMenu","_resetFocus","setTimeout","menuNode","current","focus","_handleClickOutside","event","burgerMenu","target","className","contains","navOpen","mobileViewLabelText","_closeSubmenu","bind","_onMobNavTrigger","componentDidMount","document","body","addEventListener","componentWillUnmount","removeEventListener","render","MenuList","Navigation","pathname","menuItemData","forEach","item","index","_item$linkText","_this$props$config$hi","linkText","toLowerCase","config","hiddenUrl","subMenu","length","hiddenSubMenuItem","_removeSubItem","ItemPath","_getPathNameFromURL","subItem","subIndex","onClick","Module","Object","assign","classnames","Node","ref","role","_renderDisplay","subMenuArray","subItemToRemove","i","_subMenuArray$i$linkT","splice","URL","_unused","split","ListItem","menuItemList","push","key","onMouseLeave","_createMenuItemList","_renderButtonMenuItem","_renderSubMenu","_renderLinkMenuItem","_renderSpanMenuItem","subMenus","levelClassName","menuOptions","map","idx","hasOptions","menuItem","toString","_renderMenu","Button","isActive","activeClass","onMouseEnter","onFocus","Link","Span","level","currentItem","expandOnClick","navigationMenuSource","alignment","NavigationMenu","isRetail","isCMS","_formatLinkData","path","destinationUrl","context","request","url","requestUrl","_setNavigationSource","sourceType","retailServerOnly","cmsOnly","all","_updateViewport","viewport","device","Type","isMobile","locale","nameTranslations","nameTranslation","find","Language","Text","resizeThrottledEventHandler","addThrottledEvent","_mapData","isEmptyOrNullObject","telemetry","error","defaultImageSettings","viewports","xs","q","w","h","xl","lazyload","viewProps","_objectSpread","imageSettings","gridSettings","moduleProps","tag","resources","menuAriaLabel","ImageContainer","MobileDescriptionContainer","MobileBackButton","backButtonAriaLabel","MobileDescriptionLabel","renderView","retailServerNavItems","mergedData","navigationmenu","categories","result","_this$props$config$to","filter","x","Children","retailServerMainMenu","hiddenRetailMenuItems","hiddenItemsArray","trim","fetchedRetailMenuItems","navItem","RecordId","_navItem$Name","Name","_injectCmsMenu","cmsRetailItemMenu","topLvlCategory","Url","overrideServerName","topLvlCategoryText","_constructMenuItemData","cmsNavItems","sliceIndex","_swapArrayPos","categoryMenu","cmsMenu","menu","cmsMenuSort","sort","first","second","idGenerator","_isInMenu","Math","max","ClassName","altStyle","linkUrl","NameTranslations","category","oldIndex","newIndex","k","_constructMenuItemFromRetailItem","retailItem","arguments","RSItemIdInit","getFriendlyName","_getNestedChildren","cmsItem","CMSItemIdInit","imageDestinationURL","imageLink","imageSource","image","src","_getCMSNestedChildren","nestedChildren","hideRetailAllMenu","allCategoryMenuText","getCategoryUrl","_getViewport","innerWidth","sm","md","lg","__decorate","observable","computed","isOpen","Navbar","expand","light","NavbarToggler","Collapse","navbar","Nav","UncontrolledDropdown","nav","inNavbar","DropdownMenu","right","_renderTextMenuItem","DropdownToggle","caret","NavItem","NavLink","DropdownItem","subnavHeight","componentDidUpdate","msdyn365Commerce","isBrowser","querySelectorAll","_subnavMenuItems$item","subnavMenuItems","clientHeight","documentElement","style","setProperty","openSubmenuItemsNewTab","openSubmenuItemsNewTabArray","openInNewTab","_option$linkText","alt","rel","_renderSubNavButton","type","trapFocusInsideMenu","firstFocusableElement","getElementsByClassName","lastFocusableElement","children","msNavList","tagName","msNavListItem","lastMenuItem","submenu","Array","from","subnavShow","s","classList","includes","b","activeElement","preventDefault","HTMLButtonElement","HTMLAnchorElement","sideNavOpened","_addFixedBodyPosition","_removeFixedBodyPosition","_onMobNavOpen","_onMobNavClose","_document$getElementB","getElementById","_document$getElementB2","_this$props$menuItemD","firstNavItem","_document$body","add","_document$body2","remove","menuHeight","initialMenuItem","_this$menuNode$curren","stateClass"],"mappings":"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","file":"static/js/34.a8492af32296e9923746.chunk.js","sourcesContent":["/*---------------------------------------------------------------------------------------------\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 { Module, Node } from '@msdyn365-commerce-modules/utilities';\r\nimport classnames from 'classnames';\r\nimport * as React from 'react';\r\nimport { INavigationMenuViewProps } from '../../../modules/smwe-navigation-menu/./smwe-navigation-menu';\r\nimport { IMenuItemData } from '../../../modules/smwe-navigation-menu/./smwe-navigation-menu.data';\r\nimport { ISmweNavigationMenuProps } from '../definition-extensions/smwe-navigation-menu.ext.props.autogenerated';\r\n\r\ninterface INavigationState {\r\n parentMenu?: number;\r\n activeMenu?: number;\r\n mobileViewLabelText?: string;\r\n navOpen: boolean;\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, INavigationState> {\r\n private supportedLevel: number = 3;\r\n private currentLevel: number = 0;\r\n private menuNode: React.RefObject;\r\n private pathName: string = '';\r\n private activeClassName: string = 'selected';\r\n private activeMenuItem: IMenuItemData = {};\r\n private activeSubMenuItem: IMenuItemData = {};\r\n\r\n constructor(props: INavigationMenuViewProps & ISmweNavigationMenuProps<{}>) {\r\n super(props);\r\n this.menuNode = React.createRef();\r\n this.state = { activeMenu: undefined, mobileViewLabelText: '', parentMenu: undefined, navOpen: false };\r\n this._closeSubmenu = this._closeSubmenu.bind(this);\r\n this._onMobNavTrigger = this._onMobNavTrigger.bind(this);\r\n }\r\n\r\n public componentDidMount(): void {\r\n document.body && document.body.addEventListener('mousedown', this._handleClickOutside);\r\n }\r\n\r\n public componentWillUnmount(): void {\r\n document.body && document.body.removeEventListener('mousedown', this._handleClickOutside, false);\r\n }\r\n\r\n public render(): JSX.Element | null {\r\n const { isMobileView, MenuList, Navigation } = this.props;\r\n // get current pathname\r\n if (process.env.CURRENT_ENVIRONMENT === 'web') {\r\n this.pathName = window.location.pathname;\r\n } else {\r\n this.pathName = this.props.context.request.url.requestUrl.pathname;\r\n }\r\n\r\n this.props.menuItemData.forEach((item, index) => {\r\n if (item.linkText?.toLowerCase() === this.props.config.hiddenUrl?.toLowerCase()) {\r\n item.linkURL = '';\r\n }\r\n if (item.subMenu && item.subMenu.length > 0 && this.props.config.hiddenSubMenuItem) {\r\n this._removeSubItem(item.subMenu, this.props.config.hiddenSubMenuItem);\r\n }\r\n const ItemPath = this._getPathNameFromURL(item.linkURL || '');\r\n item.subMenu && item.subMenu.forEach((subItem, subIndex) => {\r\n const subItemPath = this._getPathNameFromURL(subItem.linkURL || '');\r\n if (subItemPath === this.pathName) {\r\n this.activeMenuItem = item;\r\n this.activeSubMenuItem = subItem;\r\n }\r\n });\r\n if (ItemPath === this.pathName) {\r\n this.activeMenuItem = item;\r\n }\r\n });\r\n\r\n this.currentLevel = 1;\r\n return (\r\n \r\n \r\n );\r\n }\r\n\r\n // helper function created to remove elements from navigation submenus\r\n private _removeSubItem(subMenuArray: IMenuItemData[], subItemToRemove: string): IMenuItemData[] {\r\n let i = 0;\r\n while (i < subMenuArray.length) {\r\n if (subMenuArray[i].linkText?.toLowerCase() === subItemToRemove.toLowerCase()) {\r\n subMenuArray.splice(i, 1);\r\n } else {\r\n ++i;\r\n }\r\n }\r\n return subMenuArray;\r\n }\r\n\r\n private _getPathNameFromURL(linkURL: string): string {\r\n let pathName = '';\r\n try {\r\n // if linkURL is a full url\r\n pathName = new URL(linkURL).pathname;\r\n } catch {\r\n pathName = linkURL.split('?')[0];\r\n }\r\n return pathName;\r\n }\r\n\r\n private _onMobNavTrigger(): void {\r\n this.setState(state => ({\r\n navOpen: !state.navOpen\r\n }));\r\n }\r\n\r\n private _renderDisplay(): JSX.Element[] {\r\n const { ListItem, menuItemData } = this.props;\r\n const menuItemList: JSX.Element[] = [];\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 return menuItemList;\r\n }\r\n\r\n private _createMenuItemList(menuItemData: IMenuItemData): JSX.Element | null {\r\n if (menuItemData && menuItemData.subMenu && menuItemData.subMenu.length > 0) {\r\n if (this.props.isMobileView) {\r\n return (\r\n \r\n {this._renderButtonMenuItem(menuItemData)}\r\n \r\n {this._renderSubMenu(menuItemData.subMenu, menuItemData.id)}\r\n \r\n );\r\n } else {\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 && menuItemData.linkText && menuItemData.linkURL && menuItemData.linkURL.length > 0) {\r\n return (this._renderLinkMenuItem(menuItemData));\r\n } else if (menuItemData && menuItemData.linkText && !menuItemData.linkURL) {\r\n return (this._renderSpanMenuItem(menuItemData));\r\n }\r\n\r\n return null;\r\n }\r\n\r\n private _renderSubMenu(subMenus?: IMenuItemData[], activeMenu?: number): JSX.Element | null {\r\n const { isMobileView, ListItem } = this.props;\r\n if (activeMenu && this.state.activeMenu !== activeMenu && !isMobileView) {\r\n return null;\r\n }\r\n\r\n if (!subMenus || subMenus.length === 0) {\r\n return null;\r\n }\r\n\r\n let levelClassName: string = '';\r\n const menuOptions = subMenus && subMenus.map((option: IMenuItemData, idx: number) => {\r\n const hasOptions = (option.subMenu && option.subMenu.length > 0);\r\n let menuItem: JSX.Element | null;\r\n if (hasOptions && isMobileView) {\r\n menuItem = this._renderButtonMenuItem(option, activeMenu, idx);\r\n } else {\r\n menuItem = (option.linkURL\r\n ? this._renderLinkMenuItem(option, idx)\r\n : this._renderSpanMenuItem(option)\r\n );\r\n }\r\n\r\n let subMenu;\r\n\r\n if (hasOptions) {\r\n this.currentLevel++;\r\n if (this.currentLevel <= this.supportedLevel - 1) {\r\n levelClassName = `level-${this.currentLevel.toString()}`;\r\n subMenu = this._renderSubMenu(option.subMenu, isMobileView ? option.id : undefined);\r\n }\r\n }\r\n\r\n return (\r\n \r\n {menuItem}\r\n {subMenu}\r\n \r\n );\r\n });\r\n\r\n return (this._renderMenu(levelClassName, menuOptions, activeMenu));\r\n }\r\n\r\n private _renderButtonMenuItem(option: IMenuItemData, activeMenu?: number, index?: number): JSX.Element | null {\r\n const { Button } = this.props;\r\n const isActive = (option === this.activeMenuItem) || (option === this.activeSubMenuItem);\r\n const activeClass = `${Button.className} ${isActive ? this.activeClassName : ''}`;\r\n\r\n return (\r\n this._mainNavClick(option) : this._handleDropdownToggle(option, activeMenu)}\r\n onMouseEnter={!this.props.isMobileView ? this._handleDropdownToggle(option, activeMenu) : false}\r\n onFocus={!this.props.isMobileView ? this._handleDropdownToggle(option, activeMenu) : false}\r\n aria-haspopup={true}\r\n aria-expanded={this.state.activeMenu && this.state.activeMenu === option.id ? true : false}\r\n data-parent={activeMenu}\r\n aria-current={isActive && 'page'}\r\n >\r\n {option.linkText}\r\n \r\n );\r\n }\r\n\r\n private _mainNavClick = (option: IMenuItemData) => {\r\n const link = option.linkURL;\r\n if (link) {\r\n window.location.href = link;\r\n }\r\n };\r\n\r\n private _renderLinkMenuItem(option: IMenuItemData, index?: number): JSX.Element | null {\r\n const { Link } = this.props;\r\n const isActive = (option === this.activeSubMenuItem) || (option === this.activeMenuItem);\r\n const activeClass = `${Link.className} ${isActive ? this.activeClassName : ''}`;\r\n\r\n return (\r\n \r\n {option.linkText}\r\n \r\n );\r\n }\r\n\r\n private _renderSpanMenuItem(option: IMenuItemData, index?: number): JSX.Element | null {\r\n const { Span } = this.props;\r\n return (\r\n {option.linkText}\r\n );\r\n }\r\n\r\n private _renderMenu(level: string, menuOptions: JSX.Element[], currentItem?: number): JSX.Element | null {\r\n const { MenuList } = this.props;\r\n this.currentLevel = 1;\r\n return (\r\n \r\n {menuOptions}\r\n \r\n );\r\n }\r\n\r\n private _handleDropdownToggle = (data: IMenuItemData, parentId?: number) => () => {\r\n let activeMenu;\r\n if(this.props.isMobileView) {\r\n activeMenu = (this.state.activeMenu && this.state.activeMenu === data.id!) ? undefined : data.id!;\r\n } else {\r\n activeMenu = data.id;\r\n }\r\n this.setState({\r\n activeMenu,\r\n parentMenu: parentId\r\n });\r\n\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 const burgerMenu:boolean = event.target.className === 'ms-header__nav-icon msc-btn';\r\n if (this.menuNode.current && !this.menuNode.current.contains(event.target) && !burgerMenu) {\r\n this.setState({ navOpen: false });\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\r\nexport default NavigationMenuView;","/*---------------------------------------------------------------------------------------------\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 { Module, Node } from '@msdyn365-commerce-modules/utilities';\r\nimport classnames from 'classnames';\r\nimport * as React from 'react';\r\nimport { INavigationMenuViewProps } from '../../../modules/smwe-navigation-menu/./smwe-navigation-menu';\r\nimport { IMenuItemData } from '../../../modules/smwe-navigation-menu/./smwe-navigation-menu.data';\r\nimport { ISmweNavigationMenuProps } from '../definition-extensions/smwe-navigation-menu.ext.props.autogenerated';\r\n\r\ninterface INavigationState {\r\n parentMenu?: number;\r\n activeMenu?: number;\r\n mobileViewLabelText?: string;\r\n navOpen: boolean;\r\n}\r\n\r\ninterface IMenuItemDataClass extends IMenuItemData {\r\n className?: string;\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, INavigationState> {\r\n private supportedLevel: number = 3;\r\n private currentLevel: number = 0;\r\n private menuNode: React.RefObject;\r\n private pathName: string = '';\r\n private activeClassName: string = 'selected';\r\n private activeMenuItem: IMenuItemData = {};\r\n private activeSubMenuItem: IMenuItemData = {};\r\n\r\n constructor(props: INavigationMenuViewProps & ISmweNavigationMenuProps<{}>) {\r\n super(props);\r\n this.menuNode = React.createRef();\r\n this.state = { activeMenu: undefined, mobileViewLabelText: '', parentMenu: undefined, navOpen: false };\r\n this._closeSubmenu = this._closeSubmenu.bind(this);\r\n this._onMobNavTrigger = this._onMobNavTrigger.bind(this);\r\n }\r\n\r\n public componentDidMount(): void {\r\n document.body && document.body.addEventListener('mousedown', this._handleClickOutside);\r\n }\r\n\r\n public componentWillUnmount(): void {\r\n document.body && document.body.removeEventListener('mousedown', this._handleClickOutside, false);\r\n }\r\n\r\n public render(): JSX.Element | null {\r\n const { isMobileView, MenuList, Navigation } = this.props;\r\n // get current pathname\r\n if (process.env.CURRENT_ENVIRONMENT === 'web') {\r\n this.pathName = window.location.pathname;\r\n } else {\r\n this.pathName = this.props.context.request.url.requestUrl.pathname;\r\n }\r\n\r\n // for wine-shop links, only \"all wines\" page should make \"wine shop\" link active\r\n // TODO: \"wine shop\" menu link has different behavior, it doesn't get highlighted unless on the \"all wines\" page\r\n\r\n // if (this.pathName.startsWith('/fth/wine-shop/')) {\r\n // if (this.pathName.startsWith('/fth/wine-shop/5637149842.c') || this.pathName.startsWith('/fth/wine-shop/all-wines/5637149843.c')) {\r\n // // get \"wine shop\" menu item\r\n // this.props.menuItemData.forEach((item, index) => {\r\n // if (item.linkURL && item.linkURL.startsWith('/fth/wine-shop/')) {\r\n // this.activeMenuItem = item;\r\n // }\r\n // });\r\n // }\r\n // } else {\r\n this.props.menuItemData.forEach((item, index) => {\r\n const ItemPath = this._getPathNameFromURL(item.linkURL || '');\r\n item.subMenu && item.subMenu.forEach((subItem, subIndex) => {\r\n const subItemPath = this._getPathNameFromURL(subItem.linkURL || '');\r\n if (subItemPath === this.pathName) {\r\n this.activeMenuItem = item;\r\n this.activeSubMenuItem = subItem;\r\n }\r\n });\r\n if (ItemPath === this.pathName) {\r\n this.activeMenuItem = item;\r\n }\r\n });\r\n // }\r\n\r\n this.currentLevel = 1;\r\n return (\r\n \r\n \r\n \r\n \r\n {this._renderDisplay()}\r\n \r\n \r\n \r\n );\r\n }\r\n\r\n private _getPathNameFromURL(linkURL: string): string {\r\n let pathName = '';\r\n try {\r\n // if linkURL is a full url\r\n pathName = new URL(linkURL).pathname;\r\n } catch {\r\n pathName = linkURL.split('?')[0];\r\n }\r\n return pathName;\r\n }\r\n\r\n private _onMobNavTrigger(): void {\r\n this.setState(state => ({\r\n navOpen: !state.navOpen\r\n }));\r\n }\r\n\r\n private _renderDisplay(): JSX.Element[] {\r\n const { ListItem, menuItemData } = this.props;\r\n const menuItemList: JSX.Element[] = [];\r\n const isMobileView: boolean = this.props.isMobileView || false;\r\n const expandOnClick: boolean = this.props.config.expandOnClick || false;\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 return menuItemList;\r\n }\r\n\r\n private _createMenuItemList(menuItemData: IMenuItemData): JSX.Element | null {\r\n if (menuItemData && menuItemData.subMenu && menuItemData.subMenu.length > 0) {\r\n if (this.props.isMobileView) {\r\n return (\r\n \r\n {this._renderButtonMenuItem(menuItemData)}\r\n \r\n {this._renderSubMenu(menuItemData.subMenu, menuItemData.id)}\r\n \r\n );\r\n } else {\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 && menuItemData.linkText && menuItemData.linkURL && menuItemData.linkURL.length > 0) {\r\n return (this._renderLinkMenuItem(menuItemData));\r\n } else if (menuItemData && menuItemData.linkText && !menuItemData.linkURL) {\r\n return (this._renderSpanMenuItem(menuItemData));\r\n }\r\n\r\n return null;\r\n }\r\n\r\n private _renderSubMenu(subMenus?: IMenuItemDataClass[], activeMenu?: number): JSX.Element | null {\r\n const { isMobileView, ListItem } = this.props;\r\n if (activeMenu && this.state.activeMenu !== activeMenu && !isMobileView) {\r\n return null;\r\n }\r\n\r\n if (!subMenus || subMenus.length === 0) {\r\n return null;\r\n }\r\n\r\n let levelClassName: string = '';\r\n const menuOptions = subMenus && subMenus.map((option: IMenuItemDataClass, idx: number) => {\r\n const hasOptions = (option.subMenu && option.subMenu.length > 0);\r\n let menuItem: JSX.Element | null;\r\n if (hasOptions && isMobileView) {\r\n menuItem = this._renderButtonMenuItem(option, activeMenu, idx);\r\n } else {\r\n menuItem = (option.linkURL\r\n ? this._renderLinkMenuItem(option, idx)\r\n : this._renderSpanMenuItem(option)\r\n );\r\n }\r\n\r\n let subMenu;\r\n\r\n if (hasOptions) {\r\n this.currentLevel++;\r\n if (this.currentLevel <= this.supportedLevel - 1) {\r\n levelClassName = `level-${this.currentLevel.toString()}`;\r\n subMenu = this._renderSubMenu(option.subMenu, isMobileView ? option.id : undefined);\r\n }\r\n }\r\n\r\n return (\r\n \r\n {menuItem}\r\n {subMenu}\r\n \r\n );\r\n });\r\n\r\n return (this._renderMenu(levelClassName, menuOptions, activeMenu));\r\n }\r\n\r\n private _renderButtonMenuItem(option: IMenuItemData, activeMenu?: number, index?: number): JSX.Element | null {\r\n const { Button } = this.props;\r\n const isActive = (option === this.activeMenuItem) || (option === this.activeSubMenuItem);\r\n const activeClass = `${Button.className} ${isActive ? this.activeClassName : ''}`;\r\n const isMobileView: boolean = this.props.isMobileView || false;\r\n const expandOnClick: boolean = this.props.config.expandOnClick || false;\r\n\r\n return (\r\n this._mainNavClick(option)}\r\n onMouseEnter={isMobileView || expandOnClick ? false : this._handleDropdownToggle(option, activeMenu)}\r\n aria-haspopup={true}\r\n aria-expanded={this.state.activeMenu && this.state.activeMenu === option.id ? true : false}\r\n data-parent={activeMenu}\r\n role=\"menuitem\"\r\n aria-current={isActive && 'page'}\r\n >\r\n {option.linkText}{(this.state.navOpen && this.state.activeMenu && this.state.activeMenu === option.id) ? :}\r\n \r\n );\r\n }\r\n\r\n private _mainNavClick = (option: IMenuItemData) => {\r\n const link = option.linkURL;\r\n if (link) {\r\n window.location.href = link;\r\n }\r\n };\r\n\r\n private _renderLinkMenuItem(option: IMenuItemData, index?: number): JSX.Element | null {\r\n const { Link } = this.props;\r\n const isActive = (option === this.activeSubMenuItem) || (option === this.activeMenuItem);\r\n const activeClass = `${Link.className} ${isActive ? this.activeClassName : ''}`;\r\n\r\n return (\r\n \r\n {option.linkText}\r\n \r\n );\r\n }\r\n\r\n private _renderSpanMenuItem(option: IMenuItemData, index?: number): JSX.Element | null {\r\n const { Span } = this.props;\r\n return (\r\n {option.linkText}\r\n );\r\n }\r\n\r\n private _renderMenu(level: string, menuOptions: JSX.Element[], currentItem?: number): JSX.Element | null {\r\n const { MenuList } = this.props;\r\n this.currentLevel = 1;\r\n return (\r\n \r\n {menuOptions}\r\n \r\n );\r\n }\r\n\r\n private _handleDropdownToggle = (data: IMenuItemData, parentId?: number) => () => {\r\n let activeMenu;\r\n if(this.props.isMobileView) {\r\n activeMenu = (this.state.activeMenu && this.state.activeMenu === data.id!) ? undefined : data.id!;\r\n } else {\r\n activeMenu = data.id;\r\n }\r\n this.setState({\r\n activeMenu,\r\n parentMenu: parentId,\r\n navOpen: true\r\n });\r\n\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 const burgerMenu:boolean = event.target.className === 'ms-header__nav-icon msc-btn';\r\n if (this.menuNode.current && !this.menuNode.current.contains(event.target)) {\r\n this.setState({ activeMenu: undefined, mobileViewLabelText: '' });\r\n\r\n if (!burgerMenu) {\r\n this.setState({ navOpen: false });\r\n }\r\n }\r\n };\r\n\r\n private _closeSubmenu(): void {\r\n if (!this.props.isMobileView) {\r\n this.setState({ activeMenu: undefined, mobileViewLabelText: '', navOpen: false });\r\n }\r\n }\r\n}\r\n\r\nexport default NavigationMenuView;","/**\r\n * Copyright (c) Microsoft Corporation\r\n * All rights reserved. See License.txt in the project root for license information.\r\n * ISmweNavigationMenu contentModule Interface Properties\r\n * THIS FILE IS AUTO-GENERATED - MANUAL MODIFICATIONS WILL BE LOST\r\n */\r\n\r\nimport * as Msdyn365 from '@msdyn365-commerce/core';\r\n\r\nexport const enum navigationMenuSource {\r\n retailServerOnly = 'retailServerOnly',\r\n cmsOnly = 'cmsOnly',\r\n all = 'all'\r\n}\r\n\r\nexport const enum alignment {\r\n left = 'left',\r\n center = 'center',\r\n right = 'right'\r\n}\r\n\r\nexport interface ISmweNavigationMenuConfig extends Msdyn365.IModuleConfig {\r\n topLvlCategory?: Msdyn365.ILinkData;\r\n topLvlCategoryText?: string;\r\n navigationMenuSource?: navigationMenuSource;\r\n cmsNavItems?: ICmsNavItemsData[];\r\n className?: string;\r\n hideRetailAllMenu?: boolean;\r\n hiddenRetailMenuItems?: string;\r\n alignment?: alignment;\r\n sliceIndex?: number;\r\n cmsRetailItemMenu?: ICmsRetailItemMenuData;\r\n overFlowMenuText?: string;\r\n initialOverFlowMenuCount?: number;\r\n}\r\n\r\nexport interface ISmweNavigationMenuResources {\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 ICmsRetailItemMenuData {\r\n menu?: IMenuData[];\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 IMenuData {\r\n linkText?: string;\r\n linkUrl: Msdyn365.ILinkData;\r\n altStyle?: boolean;\r\n sliceIndex?: number;\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 ISmweNavigationMenuProps extends Msdyn365.IModule {\r\n resources: ISmweNavigationMenuResources;\r\n config: ISmweNavigationMenuConfig;\r\n}\r\n","/*---------------------------------------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License. See License.txt in the project root for license information.\r\n *--------------------------------------------------------------------------------------------*/\r\nimport { getCategoryUrl } from '@msdyn365-commerce-modules/retail-actions';\r\nimport {\r\n addThrottledEvent,\r\n IModuleProps,\r\n INodeProps\r\n} from '@msdyn365-commerce-modules/utilities';\r\nimport { CategoryHierarchy } from '@msdyn365-commerce/commerce-entities';\r\nimport {\r\n IActionContext,\r\n IGridSettings,\r\n IImageSettings,\r\n ILinkData,\r\n isEmptyOrNullObject\r\n} from '@msdyn365-commerce/core';\r\nimport { TextValueTranslation } from '@msdyn365-commerce/retail-proxy';\r\nimport classnames from 'classnames';\r\nimport { computed, observable } from 'mobx';\r\nimport * as React from 'react';\r\nimport {\r\n IMenuItemData,\r\n ISmweNavigationMenuData\r\n} from './smwe-navigation-menu.data';\r\nimport {\r\n ICmsNavItemsData,\r\n ICmsRetailItemMenuData,\r\n IMenuData,\r\n ISmweNavigationMenuProps,\r\n ISubMenusData,\r\n navigationMenuSource\r\n} from './smwe-navigation-menu.props.autogenerated';\r\n\r\nexport interface INavigationMenuViewProps\r\n extends ISmweNavigationMenuProps {\r\n className: string;\r\n menuItemData: IMenuItemData[];\r\n Navigation: IModuleProps;\r\n MenuList: INodeProps;\r\n ListItem: INodeProps;\r\n Link: INodeProps;\r\n Button: INodeProps;\r\n Span: INodeProps;\r\n ImageContainer: INodeProps;\r\n MobileDescriptionContainer: INodeProps;\r\n MobileBackButton: INodeProps;\r\n MobileDescriptionLabel: INodeProps;\r\n imageSettings: IImageSettings;\r\n gridSettings: IGridSettings;\r\n isMobileView: boolean;\r\n}\r\n\r\ninterface ICategoryHierarchyClass extends CategoryHierarchy {\r\n ClassName?: string;\r\n Children: CategoryHierarchy[] | ICategoryHierarchyClass[];\r\n}\r\n\r\nexport type GridSize = 'xs' | 'sm' | 'md' | 'lg' | 'xl';\r\n\r\nexport interface INavigationMenuState {\r\n isMobile: boolean;\r\n}\r\n\r\n/**\r\n *\r\n * NavigationMenu component\r\n * @extends {React.PureComponent>}\r\n */\r\nclass NavigationMenu extends React.PureComponent<\r\n ISmweNavigationMenuProps,\r\n INavigationMenuState\r\n > {\r\n private static CMSItemIdInit: number = 1000;\r\n private static RSItemIdInit: number = 5000;\r\n private resizeThrottledEventHandler?: (event: Event) => void;\r\n private menuItemList: IMenuItemData[];\r\n private isRetail: boolean = true;\r\n private isCMS: boolean = true;\r\n @observable\r\n private viewport: GridSize;\r\n public static getFriendlyName(\r\n locale: string,\r\n nameTranslations?: TextValueTranslation[]\r\n ): string | undefined {\r\n let nameTranslation: TextValueTranslation | undefined;\r\n if (locale && nameTranslations && nameTranslations.length > 0) {\r\n nameTranslation = nameTranslations.find(\r\n item => item.Language!.toLowerCase() === locale.toLowerCase()\r\n );\r\n }\r\n\r\n return nameTranslation && nameTranslation.Text;\r\n }\r\n\r\n constructor(props: ISmweNavigationMenuProps) {\r\n super(props);\r\n this._updateViewport = this._updateViewport.bind(this);\r\n this.viewport =\r\n props.context.request &&\r\n props.context.request.device &&\r\n props.context.request.device.Type === 'Mobile'\r\n ? 'xs'\r\n : 'lg';\r\n this._setNavigationSource(\r\n this.props.config && this.props.config.navigationMenuSource\r\n );\r\n this.state = { isMobile: this.isMobile };\r\n this.menuItemList = [];\r\n }\r\n\r\n @computed get isMobile(): boolean {\r\n return this.viewport === 'xs';\r\n }\r\n\r\n public componentDidMount(): void {\r\n this.resizeThrottledEventHandler =\r\n window &&\r\n addThrottledEvent(\r\n window,\r\n 'resize',\r\n this._updateViewport as EventListener\r\n );\r\n this._updateViewport();\r\n }\r\n\r\n public componentWillUnmount(): void {\r\n window &&\r\n window.removeEventListener(\r\n 'resize',\r\n this.resizeThrottledEventHandler!,\r\n false\r\n );\r\n }\r\n\r\n public render(): JSX.Element | null {\r\n this.menuItemList = this._mapData();\r\n\r\n if (isEmptyOrNullObject(this.props.data)) {\r\n this.props.telemetry.error('Navigatiomenu returned null');\r\n return null;\r\n }\r\n\r\n const defaultImageSettings: IImageSettings = {\r\n viewports: {\r\n xs: { q: `w=224&h=300&m=6`, w: 0, h: 0 },\r\n xl: { q: `w=224&h=300&m=6`, w: 0, h: 0 }\r\n },\r\n lazyload: true\r\n };\r\n\r\n const viewProps = {\r\n ...this.props,\r\n ...this.state,\r\n imageSettings: defaultImageSettings,\r\n gridSettings: this.props.context.request.gridSettings,\r\n Navigation: {\r\n moduleProps: this.props,\r\n className: classnames(\r\n 'ms-nav',\r\n this.props.config.className,\r\n this.state.isMobile ? 'mobile-vp navbar-collapse' : 'desktop-vp'\r\n ),\r\n tag: 'nav',\r\n 'aria-label': this.props.resources.menuAriaLabel\r\n },\r\n MenuList: {\r\n className: 'ms-nav__list',\r\n tag: 'ul'\r\n },\r\n ListItem: {\r\n className: 'ms-nav__list__item',\r\n tag: 'li',\r\n role: 'menu'\r\n },\r\n Link: {\r\n tag: 'a',\r\n className: 'ms-nav__list__item__link'\r\n },\r\n Button: {\r\n className: 'ms-nav__list__item__button',\r\n tag: 'button',\r\n\r\n onClick: this.props\r\n },\r\n ImageContainer: {\r\n className: 'ms-nav__list__item__image'\r\n },\r\n Span: {\r\n className: 'ms-nav__list__item__span',\r\n tag: 'span'\r\n },\r\n MobileDescriptionContainer: {\r\n className: 'ms-nav__list__mobile__container'\r\n },\r\n MobileBackButton: {\r\n className: 'ms-nav__list__mobile__container__button',\r\n tag: 'button',\r\n 'aria-label': this.props.resources.backButtonAriaLabel,\r\n onClick: this.props\r\n },\r\n MobileDescriptionLabel: {\r\n className: 'ms-nav__list__mobile__container__span',\r\n tag: 'span'\r\n },\r\n isMobileView: this.state.isMobile,\r\n menuItemData: this.menuItemList,\r\n className: classnames('ms-nav', this.props.config.className)\r\n };\r\n\r\n return this.props.renderView(viewProps) as React.ReactElement;\r\n }\r\n\r\n private _formatLinkData = (href: ILinkData | string | undefined): string => {\r\n if (href === undefined) {\r\n return '';\r\n }\r\n\r\n const path: string = (href as ILinkData).destinationUrl || (href as string);\r\n return (new URL(path, this.props.context.request.url.requestUrl)).href;\r\n};\r\n\r\n private _mapData(): IMenuItemData[] {\r\n const { config } = this.props;\r\n let mergedData: IMenuItemData[] = [];\r\n\r\n // will contain the nav's from the retail server later\r\n let retailServerNavItems: CategoryHierarchy[] | undefined;\r\n\r\n const navigationmenu: ISmweNavigationMenuData = this.props.data;\r\n\r\n // if there are categories to be pulled from the retail server, check them\r\n // out and potentially pull the ones with children into the retailSeverNavItems object\r\n if (\r\n navigationmenu.categories.result &&\r\n navigationmenu.categories.result.length > 0\r\n ) {\r\n retailServerNavItems = navigationmenu.categories.result.filter(\r\n x => x.Children && x.Children.length > 0\r\n );\r\n\r\n const retailServerMainMenu = retailServerNavItems[0];\r\n const hiddenRetailMenuItems = this.props.config.hiddenRetailMenuItems;\r\n\r\n if (hiddenRetailMenuItems) {\r\n // If there are specified items to hide in the Retail Menu, create an array with those items all\r\n // lowercase, separated by commas, with surrounding spaces trimmed.\r\n const hiddenItemsArray = hiddenRetailMenuItems.toLowerCase().split(',').map(item => item.trim()) || [];\r\n\r\n // To only compare hidden items to originally fetched Retail server menu, we have to remove items\r\n // that have already been injected by the CMS.\r\n const fetchedRetailMenuItems = retailServerNavItems[0].Children.filter(navItem => navItem.RecordId > 0);\r\n\r\n // Filter out Retail Menu items that match the hidden items specified.\r\n retailServerMainMenu.Children = fetchedRetailMenuItems.filter(navItem => {\r\n const hiddenItem = hiddenItemsArray.find(item => item === navItem.Name?.toLowerCase());\r\n return !hiddenItem;\r\n });\r\n }\r\n\r\n // this is where we inject the CMSMenu into the retailMenu\r\n this._injectCmsMenu(retailServerMainMenu, this.props.config.cmsRetailItemMenu);\r\n\r\n // Note: Below code will render all the Retail server navigation\r\n // retailServerNavItems.map((item: CategoryHierarchy) => (\r\n // mergedData.push(this._constructMenuItemData(item, undefined, true))\r\n // ));\r\n\r\n // Note: In order to display full retail menu, please commentout following line\r\n // and enable above code\r\n\r\n // **NOTE**\r\n // this will need to later be refactored if the above code is uncommented\r\n const url = this.props.config.topLvlCategory?.destinationUrl;\r\n if (url) {\r\n retailServerMainMenu.Url = url;\r\n }\r\n\r\n const overrideServerName = this.props.config.topLvlCategoryText !== undefined && this.props.config.topLvlCategoryText !== null && this.props.config.topLvlCategoryText !== '';\r\n mergedData.push(\r\n this._constructMenuItemData(\r\n retailServerMainMenu,\r\n undefined,\r\n this.isRetail,\r\n 0,\r\n overrideServerName\r\n )\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(\r\n this._constructMenuItemData(undefined, item, false, idx + 1)\r\n )\r\n );\r\n }\r\n\r\n if (config.sliceIndex && config.sliceIndex > 0) {\r\n mergedData = this._swapArrayPos(mergedData, 0, config.sliceIndex);\r\n }\r\n\r\n return mergedData;\r\n }\r\n\r\n /**\r\n * Injects the regular menu into the category menu\r\n *\r\n * @param categoryMenu category pulled from 365\r\n * @param cmsMenu regular cms menu\r\n */\r\n private _injectCmsMenu(\r\n categoryMenu: ICategoryHierarchyClass,\r\n cmsMenu: ICmsRetailItemMenuData | undefined\r\n ): ICategoryHierarchyClass {\r\n // ensure that the cmsMenu actually exists before attempting to add it\r\n if (cmsMenu && cmsMenu.menu) {\r\n // sort the menu in ascending order so we can insert them straight\r\n const cmsMenuSort = cmsMenu.menu.sort(\r\n (first, second) => first.sliceIndex! - second.sliceIndex!\r\n );\r\n\r\n // generates a \"unique\" id where they are below 0 so no conflicts\r\n // happen with real record ids\r\n let idGenerator = 0;\r\n\r\n // insert each item into the category menu\r\n cmsMenuSort.forEach(item => {\r\n // if its not in the menu already, add it\r\n if (!this._isInMenu(item, categoryMenu)) {\r\n idGenerator--;\r\n // we need to spoof the cmsMenu into a categoryMenu because\r\n // they are rendered in batches. The renderer for the CMS is\r\n // different than the renderer for the categoryMenu, therefore\r\n // we need to spoof it.\r\n categoryMenu.Children.splice(Math.max(0, item.sliceIndex! - 1), 0, {\r\n Name: item.linkText,\r\n ClassName: item.altStyle ? 'ms-nav__list__item-alt' : undefined,\r\n Url: item.linkUrl.destinationUrl,\r\n RecordId: idGenerator,\r\n Children: [],\r\n NameTranslations: [\r\n {\r\n Text: item.linkText,\r\n Language: 'en-us'\r\n }\r\n ]\r\n });\r\n }\r\n });\r\n }\r\n return categoryMenu;\r\n }\r\n\r\n /**\r\n * checks to ensure that the current menu item is in the current category.\r\n *\r\n * The reason why we need to check this is to ensure we don't duplicate the\r\n * addition of the menu multiple times.\r\n *\r\n * @param menu regular menu datapoint from the CMS\r\n * @param category category pulled from 365\r\n */\r\n private _isInMenu(menu: IMenuData, category: CategoryHierarchy): boolean {\r\n return !!category.Children.find(\r\n item => item.RecordId < 0 && item.Name === menu.linkText\r\n );\r\n }\r\n\r\n private _swapArrayPos(\r\n mergedData: IMenuItemData[],\r\n oldIndex: number,\r\n newIndex: number\r\n ): IMenuItemData[] {\r\n if (newIndex >= mergedData.length) {\r\n let k = newIndex - mergedData.length + 1;\r\n while (k--) {\r\n mergedData.push();\r\n }\r\n }\r\n mergedData.splice(newIndex, 0, mergedData.splice(oldIndex, 1)[0]);\r\n return mergedData;\r\n }\r\n\r\n private _constructMenuItemFromRetailItem(\r\n retailItem?: ICategoryHierarchyClass,\r\n overrideServerName:boolean = false\r\n ): IMenuItemData {\r\n const locale =\r\n this.props.context &&\r\n this.props.context.request &&\r\n this.props.context.request.locale\r\n ? this.props.context.request.locale\r\n : 'en-us';\r\n\r\n return {\r\n id: NavigationMenu.RSItemIdInit++,\r\n linkText: overrideServerName?this.props.config.topLvlCategoryText || '':\r\n NavigationMenu.getFriendlyName(\r\n locale,\r\n retailItem && retailItem.NameTranslations\r\n ) || '',\r\n linkURL: retailItem && this._formatLinkData(retailItem.Url),\r\n className: retailItem?.ClassName,\r\n subMenu: this._getNestedChildren(retailItem)\r\n } as IMenuItemData;\r\n }\r\n\r\n private _constructMenuItemData(\r\n retailItem?: ICategoryHierarchyClass,\r\n cmsItem?: ICmsNavItemsData,\r\n isRetail?: boolean,\r\n idx?: number,\r\n overrideServerName:boolean = false\r\n ): IMenuItemData {\r\n if (isRetail) {\r\n return this._constructMenuItemFromRetailItem(retailItem, overrideServerName);\r\n } else {\r\n return {\r\n id: NavigationMenu.CMSItemIdInit++,\r\n linkText: (cmsItem && cmsItem.linkText) || '',\r\n linkURL:\r\n (cmsItem && cmsItem.linkUrl && this._formatLinkData(cmsItem.linkUrl.destinationUrl)) || '',\r\n imageDestinationURL:\r\n (cmsItem && cmsItem.imageLink && this._formatLinkData(cmsItem.imageLink.destinationUrl)) ||\r\n '',\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): IMenuItemData[] {\r\n const nestedChildren: IMenuItemData[] = [];\r\n if (!category || !category.Children || !category.Children.length) {\r\n return [];\r\n }\r\n if(!this.props.config.hideRetailAllMenu) {\r\n nestedChildren.push({\r\n linkText: this.props.resources.allCategoryMenuText,\r\n linkURL: this._formatLinkData(getCategoryUrl(\r\n category,\r\n (this.props.context as unknown) as IActionContext,\r\n {}\r\n ))\r\n });\r\n }\r\n category.Children.map((item: CategoryHierarchy) => {\r\n nestedChildren.push(this._constructMenuItemData(item, undefined, 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(\r\n this._constructMenuItemData(undefined, item, false, idx)\r\n );\r\n });\r\n return nestedChildren;\r\n }\r\n\r\n private _setNavigationSource = (sourceType?: navigationMenuSource): void => {\r\n switch (sourceType) {\r\n case navigationMenuSource.retailServerOnly:\r\n this.isRetail = true;\r\n this.isCMS = false;\r\n break;\r\n case navigationMenuSource.cmsOnly:\r\n this.isRetail = false;\r\n this.isCMS = true;\r\n break;\r\n case navigationMenuSource.all:\r\n this.isRetail = true;\r\n this.isCMS = true;\r\n break;\r\n default:\r\n }\r\n };\r\n\r\n private _updateViewport(): void {\r\n this.viewport = this._getViewport();\r\n this.setState({ isMobile: this.isMobile });\r\n }\r\n\r\n private _getViewport(): GridSize {\r\n const { context } = this.props;\r\n\r\n // always render in mobile viewport on a mobile device\r\n if (\r\n context.request &&\r\n context.request.device &&\r\n context.request.device.Type === 'Mobile'\r\n ) {\r\n return 'xs';\r\n }\r\n\r\n if (typeof window !== undefined && window.innerWidth) {\r\n const gridSettings = context.request.gridSettings;\r\n if (gridSettings) {\r\n if (gridSettings.xs && window.innerWidth <= gridSettings.xs.w) {\r\n return 'xs';\r\n } else if (gridSettings.sm && window.innerWidth <= gridSettings.sm.w) {\r\n return 'xs';\r\n } else if (gridSettings.md && window.innerWidth <= gridSettings.md.w) {\r\n return 'md';\r\n } else if (gridSettings.lg && window.innerWidth <= gridSettings.lg.w) {\r\n return 'lg';\r\n } else {\r\n return 'xl';\r\n }\r\n }\r\n }\r\n\r\n return 'xs';\r\n }\r\n}\r\n\r\nexport default NavigationMenu;\r\n","/*---------------------------------------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License. See License.txt in the project root for license information.\r\n *--------------------------------------------------------------------------------------------*/\r\nimport { IMenuItemData, INavigationMenuViewProps } from '@msdyn365-commerce-modules/navigation-menu';\r\nimport { Navbar, NavbarToggler, Nav, NavItem, NavLink, Collapse, UncontrolledDropdown, DropdownToggle, DropdownMenu } from 'reactstrap';\r\nimport * as React from 'react';\r\nimport DropdownItem from 'reactstrap/lib/DropdownItem';\r\n\r\ninterface IMenuItemDataClass extends IMenuItemData {\r\n className?: string;\r\n}\r\n\r\ninterface NavState {\r\n isOpen: boolean;\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 private currentLevel: number = 0;\r\n constructor(props: INavigationMenuViewProps) {\r\n super(props);\r\n this.state = {\r\n isOpen: false\r\n };\r\n }\r\n\r\n public render(): JSX.Element | null {\r\n\r\n return (\r\n \r\n this.setState({isOpen: !this.state.isOpen})} className=\"ml-auto\" />\r\n \r\n \r\n \r\n \r\n );\r\n }\r\n private _renderDisplay(): JSX.Element[] {\r\n const { menuItemData } = this.props;\r\n const menuItemList: JSX.Element[] = [];\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 return menuItemList;\r\n }\r\n private _createMenuItemList(menuItemData: IMenuItemData): JSX.Element | null {\r\n this.currentLevel = 1;\r\n if (menuItemData && menuItemData.subMenu && menuItemData.subMenu.length > 0) {\r\n return (\r\n \r\n {this._renderButtonMenuItem(menuItemData)}\r\n \r\n {this._renderSubMenu(menuItemData.subMenu)}\r\n \r\n \r\n );\r\n } else if (menuItemData && menuItemData.linkText && menuItemData.linkURL && menuItemData.linkURL.length > 0) {\r\n return (this._renderLinkMenuItem(menuItemData));\r\n } else if (menuItemData && menuItemData.linkText && !menuItemData.linkURL) {\r\n return (this._renderTextMenuItem(menuItemData));\r\n }\r\n return null;\r\n }\r\n private _renderSubMenu(subMenus?: IMenuItemDataClass[]): JSX.Element | null {\r\n if (!subMenus || subMenus.length === 0) {\r\n return null;\r\n }\r\n this.currentLevel++;\r\n const menuOptions = subMenus && subMenus.map((option: IMenuItemDataClass, idx: number) => {\r\n const hasOptions = (option.subMenu && option.subMenu.length > 0);\r\n let menuItem: JSX.Element | null;\r\n if (hasOptions) {\r\n menuItem = this._renderButtonMenuItem(option, idx);\r\n } else {\r\n menuItem = (option.linkURL\r\n ? this._renderLinkMenuItem(option)\r\n : this._renderTextMenuItem(option)\r\n );\r\n }\r\n return (\r\n \r\n {menuItem}\r\n \r\n );\r\n });\r\n return (this._renderMenu(menuOptions));\r\n }\r\n private _renderButtonMenuItem(option: IMenuItemData, 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): JSX.Element | null {\r\n if (this.currentLevel === 1) {\r\n return (\r\n \r\n \r\n {option.linkText}\r\n \r\n \r\n );\r\n }\r\n return (\r\n \r\n {option.linkText}\r\n \r\n );\r\n }\r\n private _renderTextMenuItem(option: IMenuItemData, index?: number): JSX.Element | null {\r\n return (\r\n {option.linkText}\r\n );\r\n }\r\n private _renderMenu(menuOptions: JSX.Element[]): JSX.Element | null {\r\n return (\r\n \r\n {menuOptions}\r\n \r\n );\r\n }\r\n}\r\nexport default NavigationMenuView;","/*---------------------------------------------------------------------------------------------\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 { IMenuItemData, INavigationMenuViewProps } from '@msdyn365-commerce-modules/navigation-menu';\r\nimport { Module, Node } from '@msdyn365-commerce-modules/utilities';\r\nimport msdyn365Commerce from '@msdyn365-commerce/core-internal';\r\nimport classnames from 'classnames';\r\nimport * as React from 'react';\r\n\r\ninterface INavigationState {\r\n parentMenu?: number;\r\n activeMenu?: number;\r\n mobileViewLabelText?: string;\r\n navOpen: boolean;\r\n subnavHeight?: number;\r\n}\r\n\r\ninterface IMenuItemDataClass extends IMenuItemData {\r\n className?: string;\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 private supportedLevel: number = 3;\r\n private currentLevel: number = 0;\r\n private menuNode: React.RefObject;\r\n private pathName: string = '';\r\n private activeClassName: string = 'selected';\r\n private activeMenuItem: IMenuItemData = {};\r\n private activeSubMenuItem: IMenuItemData = {};\r\n\r\n constructor(props: INavigationMenuViewProps) {\r\n super(props);\r\n this.menuNode = React.createRef();\r\n this.state = { activeMenu: undefined, mobileViewLabelText: '', parentMenu: undefined, navOpen: false, subnavHeight: 0 };\r\n this._closeSubmenu = this._closeSubmenu.bind(this);\r\n this._onMobNavTrigger = this._onMobNavTrigger.bind(this);\r\n }\r\n\r\n public componentDidMount(): void {\r\n document.body && document.body.addEventListener('mousedown', this._handleClickOutside);\r\n }\r\n\r\n public componentDidUpdate(): void {\r\n if (msdyn365Commerce.isBrowser && document.querySelectorAll('.subnav-menu.subnav-show')) {\r\n const subnavMenuItems = document.querySelectorAll('.subnav-menu.subnav-show > ul');\r\n this.setState({ subnavHeight: subnavMenuItems?.item(0)?.clientHeight || 0 });\r\n document.documentElement.style.setProperty('--subnavHeight', `${this.state.subnavHeight}px`);\r\n }\r\n }\r\n\r\n public componentWillUnmount(): void {\r\n document.body && document.body.removeEventListener('mousedown', this._handleClickOutside, false);\r\n }\r\n\r\n public render(): JSX.Element | null {\r\n const { isMobileView, MenuList, Navigation } = this.props;\r\n // get current pathname\r\n if (process.env.CURRENT_ENVIRONMENT === 'web') {\r\n this.pathName = window.location.pathname;\r\n } else {\r\n this.pathName = this.props.context.request.url.requestUrl.pathname;\r\n }\r\n\r\n // for wine-shop links, only \"all wines\" page should make \"wine shop\" link active\r\n // TODO: \"wine shop\" menu link has different behavior, it doesn't get highlighted unless on the \"all wines\" page\r\n\r\n // if (this.pathName.startsWith('/fth/wine-shop/')) {\r\n // if (this.pathName.startsWith('/fth/wine-shop/5637149842.c') || this.pathName.startsWith('/fth/wine-shop/all-wines/5637149843.c')) {\r\n // // get \"wine shop\" menu item\r\n // this.props.menuItemData.forEach((item, index) => {\r\n // if (item.linkURL && item.linkURL.startsWith('/fth/wine-shop/')) {\r\n // this.activeMenuItem = item;\r\n // }\r\n // });\r\n // }\r\n // } else {\r\n this.props.menuItemData.forEach((item, index) => {\r\n const ItemPath = this._getPathNameFromURL(item.linkURL || '');\r\n item.subMenu && item.subMenu.forEach((subItem, subIndex) => {\r\n const subItemPath = this._getPathNameFromURL(subItem.linkURL || '');\r\n if (subItemPath === this.pathName) {\r\n this.activeMenuItem = item;\r\n this.activeSubMenuItem = subItem;\r\n }\r\n });\r\n if (ItemPath === this.pathName) {\r\n this.activeMenuItem = item;\r\n }\r\n });\r\n // }\r\n\r\n this.currentLevel = 1;\r\n return (\r\n \r\n \r\n \r\n \r\n {this._renderDisplay()}\r\n \r\n \r\n \r\n );\r\n }\r\n\r\n private _getPathNameFromURL(linkURL: string): string {\r\n let pathName = '';\r\n try {\r\n // if linkURL is a full url\r\n pathName = new URL(linkURL).pathname;\r\n } catch {\r\n pathName = linkURL.split('?')[0];\r\n }\r\n return pathName;\r\n }\r\n\r\n private _onMobNavTrigger(): void {\r\n this.setState(state => ({\r\n navOpen: !state.navOpen\r\n }));\r\n }\r\n\r\n private _renderDisplay(): JSX.Element[] {\r\n const { ListItem, menuItemData } = this.props;\r\n const menuItemList: JSX.Element[] = [];\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 return menuItemList;\r\n }\r\n\r\n private _createMenuItemList(menuItemData: IMenuItemData): JSX.Element | null {\r\n if (menuItemData && menuItemData.subMenu && menuItemData.subMenu.length > 0) {\r\n if (this.props.isMobileView) {\r\n return (\r\n \r\n {this._renderButtonMenuItem(menuItemData)}\r\n \r\n {this._renderSubMenu(menuItemData.subMenu, menuItemData.id)}\r\n \r\n );\r\n } else {\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 && menuItemData.linkText && menuItemData.linkURL && menuItemData.linkURL.length > 0) {\r\n return (this._renderLinkMenuItem(menuItemData));\r\n } else if (menuItemData && menuItemData.linkText && !menuItemData.linkURL) {\r\n return (this._renderSpanMenuItem(menuItemData));\r\n }\r\n\r\n return null;\r\n }\r\n\r\n private _renderSubMenu(subMenus?: IMenuItemDataClass[], activeMenu?: number): JSX.Element | null {\r\n const { isMobileView, ListItem } = this.props;\r\n if (activeMenu && this.state.activeMenu !== activeMenu && !isMobileView) {\r\n return null;\r\n }\r\n\r\n if (!subMenus || subMenus.length === 0) {\r\n return null;\r\n }\r\n\r\n let levelClassName: string = '';\r\n const menuOptions = subMenus && subMenus.map((option: IMenuItemDataClass, idx: number) => {\r\n const hasOptions = (option.subMenu && option.subMenu.length > 0);\r\n let menuItem: JSX.Element | null;\r\n if (hasOptions && isMobileView) {\r\n menuItem = this._renderButtonMenuItem(option, activeMenu, idx);\r\n } else {\r\n menuItem = (option.linkURL\r\n ? this._renderLinkMenuItem(option, idx)\r\n : this._renderSpanMenuItem(option)\r\n );\r\n }\r\n\r\n let subMenu;\r\n\r\n if (hasOptions) {\r\n this.currentLevel++;\r\n if (this.currentLevel <= this.supportedLevel - 1) {\r\n levelClassName = `level-${this.currentLevel.toString()}`;\r\n subMenu = this._renderSubMenu(option.subMenu, isMobileView ? option.id : undefined);\r\n }\r\n }\r\n\r\n return (\r\n \r\n {menuItem}\r\n {subMenu}\r\n \r\n );\r\n });\r\n\r\n return (this._renderMenu(levelClassName, menuOptions, activeMenu));\r\n }\r\n\r\n private _renderButtonMenuItem(option: IMenuItemData, activeMenu?: number, index?: number): JSX.Element | null {\r\n const { Button } = this.props;\r\n const isActive = (option === this.activeMenuItem) || (option === this.activeSubMenuItem);\r\n const activeClass = `${Button.className} ${isActive ? this.activeClassName : ''}`;\r\n\r\n return (\r\n this._mainNavClick(option) : this._handleDropdownToggle(option, activeMenu)}\r\n onMouseEnter={!this.props.isMobileView ? this._handleDropdownToggle(option, activeMenu) : false}\r\n onFocus={!this.props.isMobileView ? this._handleDropdownToggle(option, activeMenu) : false}\r\n aria-haspopup={true}\r\n aria-expanded={this.state.activeMenu && this.state.activeMenu === option.id ? true : false}\r\n data-parent={activeMenu}\r\n aria-current={isActive && 'page'}\r\n >\r\n {option.linkText}\r\n \r\n );\r\n }\r\n\r\n private _mainNavClick = (option: IMenuItemData) => {\r\n const link = option.linkURL;\r\n if (link) {\r\n window.location.href = link;\r\n }\r\n };\r\n\r\n private _renderLinkMenuItem(option: IMenuItemData, index?: number): JSX.Element | null {\r\n const { Link } = this.props;\r\n const isActive = (option === this.activeSubMenuItem) || (option === this.activeMenuItem);\r\n const activeClass = `${Link.className} ${isActive ? this.activeClassName : ''}`;\r\n\r\n return (\r\n \r\n {option.linkText}\r\n \r\n );\r\n }\r\n\r\n private _renderSpanMenuItem(option: IMenuItemData, index?: number): JSX.Element | null {\r\n const { Span } = this.props;\r\n return (\r\n {option.linkText}\r\n );\r\n }\r\n\r\n private _renderMenu(level: string, menuOptions: JSX.Element[], currentItem?: number): JSX.Element | null {\r\n const { MenuList } = this.props;\r\n this.currentLevel = 1;\r\n return (\r\n \r\n {menuOptions}\r\n \r\n );\r\n }\r\n\r\n private _handleDropdownToggle = (data: IMenuItemData, parentId?: number) => () => {\r\n let activeMenu;\r\n if(this.props.isMobileView) {\r\n activeMenu = (this.state.activeMenu && this.state.activeMenu === data.id!) ? undefined : data.id!;\r\n } else {\r\n activeMenu = data.id;\r\n }\r\n this.setState({\r\n activeMenu,\r\n parentMenu: parentId\r\n });\r\n\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 const burgerMenu:boolean = event.target.className === 'ms-header__nav-icon msc-btn';\r\n if (this.menuNode.current && !this.menuNode.current.contains(event.target) && !burgerMenu) {\r\n this.setState({ navOpen: false });\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\r\nexport default NavigationMenuView;","/*---------------------------------------------------------------------------------------------\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 { Module, Node } from '@msdyn365-commerce-modules/utilities';\r\nimport classnames from 'classnames';\r\nimport * as React from 'react';\r\nimport { INavigationMenuViewProps } from '../../../modules/smwe-navigation-menu/./smwe-navigation-menu';\r\nimport { IMenuItemData } from '../../../modules/smwe-navigation-menu/./smwe-navigation-menu.data';\r\nimport { ISmweNavigationMenuProps } from '../definition-extensions/smwe-navigation-menu.ext.props.autogenerated';\r\n\r\ninterface INavigationState {\r\n parentMenu?: number;\r\n activeMenu?: number;\r\n mobileViewLabelText?: string;\r\n navOpen: boolean;\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, INavigationState> {\r\n private supportedLevel: number = 3;\r\n private currentLevel: number = 0;\r\n private menuNode: React.RefObject;\r\n private pathName: string = '';\r\n private activeClassName: string = 'selected';\r\n private activeMenuItem: IMenuItemData = {};\r\n private activeSubMenuItem: IMenuItemData = {};\r\n\r\n constructor(props: INavigationMenuViewProps & ISmweNavigationMenuProps<{}>) {\r\n super(props);\r\n this.menuNode = React.createRef();\r\n this.state = {\r\n activeMenu: undefined,\r\n mobileViewLabelText: '',\r\n parentMenu: undefined,\r\n navOpen: false\r\n };\r\n this._closeSubmenu = this._closeSubmenu.bind(this);\r\n this._onMobNavTrigger = this._onMobNavTrigger.bind(this);\r\n }\r\n\r\n public componentDidMount(): void {\r\n document.body && document.body.addEventListener('mousedown', this._handleClickOutside);\r\n }\r\n\r\n public componentWillUnmount(): void {\r\n document.body && document.body.removeEventListener('mousedown', this._handleClickOutside, false);\r\n }\r\n\r\n public render(): JSX.Element | null {\r\n const { isMobileView, MenuList, Navigation } = this.props;\r\n const className = this.props.config.className;\r\n // get current pathname\r\n if (process.env.CURRENT_ENVIRONMENT === 'web') {\r\n this.pathName = window.location.pathname;\r\n } else {\r\n this.pathName = this.props.context.request.url.requestUrl.pathname;\r\n }\r\n\r\n this.props.menuItemData.forEach((item, index) => {\r\n const ItemPath = this._getPathNameFromURL(item.linkURL || '');\r\n item.subMenu && item.subMenu.forEach((subItem, subIndex) => {\r\n const subItemPath = this._getPathNameFromURL(subItem.linkURL || '');\r\n if (subItemPath === this.pathName) {\r\n this.activeMenuItem = item;\r\n this.activeSubMenuItem = subItem;\r\n }\r\n });\r\n if (ItemPath === this.pathName) {\r\n this.activeMenuItem = item;\r\n }\r\n });\r\n\r\n this.currentLevel = 1;\r\n return (\r\n \r\n \r\n \r\n \r\n {this._renderDisplay()}\r\n \r\n \r\n \r\n );\r\n }\r\n\r\n private _getPathNameFromURL(linkURL: string): string {\r\n let pathName = '';\r\n try {\r\n // if linkURL is a full url\r\n pathName = new URL(linkURL).pathname;\r\n } catch {\r\n pathName = linkURL.split('?')[0];\r\n }\r\n return pathName;\r\n }\r\n\r\n private _onMobNavTrigger(): void {\r\n this.setState(state => ({\r\n navOpen: !state.navOpen\r\n }));\r\n }\r\n\r\n private _renderDisplay(): JSX.Element[] {\r\n const { ListItem, menuItemData } = this.props;\r\n const menuItemList: JSX.Element[] = [];\r\n const isMobileView: boolean = this.props.isMobileView || false;\r\n const expandOnClick: boolean = this.props.config.expandOnClick || false;\r\n\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 return menuItemList;\r\n }\r\n\r\n private _createMenuItemList(menuItemData: IMenuItemData): JSX.Element | null {\r\n if (menuItemData && menuItemData.subMenu && menuItemData.subMenu.length > 0) {\r\n if (this.props.isMobileView) {\r\n return (\r\n \r\n {this._renderButtonMenuItem(menuItemData)}\r\n \r\n \r\n {this._renderSubMenu(menuItemData.subMenu, menuItemData.id)}\r\n \r\n \r\n );\r\n } else {\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 && menuItemData.linkText && menuItemData.linkURL && menuItemData.linkURL.length > 0) {\r\n return (this._renderLinkMenuItem(menuItemData));\r\n } else if (menuItemData && menuItemData.linkText && !menuItemData.linkURL) {\r\n return (this._renderSpanMenuItem(menuItemData));\r\n }\r\n\r\n return null;\r\n }\r\n\r\n private _renderSubMenu(subMenus?: IMenuItemData[], activeMenu?: number): JSX.Element | null {\r\n const { isMobileView, ListItem } = this.props;\r\n\r\n if (!subMenus || subMenus.length === 0) {\r\n return null;\r\n }\r\n\r\n let levelClassName: string = '';\r\n const menuOptions = subMenus && subMenus.map((option: IMenuItemData, idx: number) => {\r\n const hasOptions = (option.subMenu && option.subMenu.length > 0);\r\n let menuItem: JSX.Element | null;\r\n if (hasOptions && isMobileView) {\r\n menuItem = this._renderButtonMenuItem(option, activeMenu, idx);\r\n } else {\r\n menuItem = (option.linkURL\r\n ? this._renderLinkMenuItem(option, idx)\r\n : this._renderSpanMenuItem(option)\r\n );\r\n }\r\n\r\n let subMenu;\r\n\r\n if (hasOptions) {\r\n this.currentLevel++;\r\n if (this.currentLevel <= this.supportedLevel - 1) {\r\n levelClassName = `level-${this.currentLevel.toString()}`;\r\n subMenu = this._renderSubMenu(option.subMenu, isMobileView ? option.id : undefined);\r\n }\r\n }\r\n\r\n return (\r\n \r\n {menuItem}\r\n {subMenu}\r\n \r\n );\r\n });\r\n\r\n return this._renderMenu(levelClassName, menuOptions, activeMenu);\r\n }\r\n\r\n private _renderButtonMenuItem(option: IMenuItemData, activeMenu?: number, index?: number): JSX.Element | null {\r\n const { Button } = this.props;\r\n const isActive = (option === this.activeMenuItem) || (option === this.activeSubMenuItem);\r\n const activeClass = `${Button.className} ${isActive ? this.activeClassName : ''}`;\r\n const isMobileView: boolean = this.props.isMobileView || false;\r\n const expandOnClick: boolean = this.props.config.expandOnClick || false;\r\n\r\n return (\r\n this._mainNavClick(option)}\r\n onMouseEnter={isMobileView || expandOnClick ? false : this._handleDropdownToggle(option, activeMenu)}\r\n onFocus={isMobileView || expandOnClick ? this._closeSubmenu : this._handleDropdownToggle(option, activeMenu)}\r\n aria-haspopup={true}\r\n aria-expanded={this.state.activeMenu && this.state.activeMenu === option.id ? true : false}\r\n data-parent={activeMenu}\r\n aria-current={isActive && 'page'}\r\n >\r\n {option.linkText}\r\n \r\n );\r\n }\r\n\r\n private _mainNavClick = (option: IMenuItemData) => {\r\n const link = option.linkURL;\r\n if (link) {\r\n window.location.href = link;\r\n }\r\n };\r\n\r\n private _renderLinkMenuItem(option: IMenuItemData, index?: number): JSX.Element | null {\r\n const { Link } = this.props;\r\n const { openSubmenuItemsNewTab } = this.props.config;\r\n const openSubmenuItemsNewTabArray = openSubmenuItemsNewTab && openSubmenuItemsNewTab.split(',');\r\n const openInNewTab = openSubmenuItemsNewTabArray && openSubmenuItemsNewTabArray.find(item => item.toLowerCase() === option.linkText?.toLowerCase());\r\n const isActive = (option === this.activeSubMenuItem) || (option === this.activeMenuItem);\r\n\r\n return (\r\n \r\n {option.imageSource && (\r\n
\r\n {option.linkText}\r\n
\r\n )}\r\n \r\n {option.linkText}\r\n \r\n
\r\n );\r\n }\r\n\r\n private _renderSpanMenuItem(option: IMenuItemData, index?: number): JSX.Element | null {\r\n const { Span } = this.props;\r\n return (\r\n {option.linkText}\r\n );\r\n }\r\n\r\n private _renderMenu(level: string, menuOptions: JSX.Element[], currentItem?: number): JSX.Element | null {\r\n const { MenuList } = this.props;\r\n this.currentLevel = 1;\r\n\r\n return (\r\n \r\n {level === 'level-2' && currentItem && this._renderSubNavButton(currentItem)}\r\n {menuOptions}\r\n \r\n );\r\n }\r\n\r\n private _renderSubNavButton(currentItem: number): JSX.Element {\r\n return (\r\n \r\n );\r\n }\r\n\r\n private _handleDropdownToggle = (data: IMenuItemData, parentId?: number) => () => {\r\n let activeMenu;\r\n if (this.props.isMobileView) {\r\n activeMenu = (this.state.activeMenu && this.state.activeMenu === data.id!) ? undefined : data.id!;\r\n } else {\r\n activeMenu = data.id;\r\n }\r\n this.setState({\r\n activeMenu,\r\n parentMenu: parentId\r\n });\r\n\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 const burgerMenu: boolean = event.target.className === 'ms-header__nav-icon msc-btn';\r\n\r\n if (this.menuNode.current && !this.menuNode.current.contains(event.target)) {\r\n this.setState({ activeMenu: undefined, mobileViewLabelText: '' });\r\n\r\n if (!burgerMenu) {\r\n this.setState({ navOpen: false });\r\n }\r\n }\r\n };\r\n\r\n private _closeSubmenu(): void {\r\n this.setState({ activeMenu: undefined, mobileViewLabelText: '' });\r\n }\r\n}\r\n\r\nexport default NavigationMenuView;\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 { Module, Node } from '@msdyn365-commerce-modules/utilities';\r\nimport classnames from 'classnames';\r\nimport * as React from 'react';\r\nimport { INavigationMenuViewProps } from '../../../modules/smwe-navigation-menu/./smwe-navigation-menu';\r\nimport { IMenuItemData } from '../../../modules/smwe-navigation-menu/./smwe-navigation-menu.data';\r\nimport { ISmweNavigationMenuProps } from '../definition-extensions/smwe-navigation-menu.ext.props.autogenerated';\r\n\r\ninterface INavigationState {\r\n parentMenu?: number;\r\n activeMenu?: number;\r\n mobileViewLabelText?: string;\r\n navOpen: boolean;\r\n}\r\n\r\ninterface IMenuItemDataClass extends IMenuItemData {\r\n className?: string;\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, INavigationState> {\r\n private supportedLevel: number = 3;\r\n private currentLevel: number = 0;\r\n private menuNode: React.RefObject;\r\n private pathName: string = '';\r\n private activeClassName: string = 'selected';\r\n private activeMenuItem: IMenuItemData = {};\r\n private activeSubMenuItem: IMenuItemData = {};\r\n\r\n constructor(props: INavigationMenuViewProps & ISmweNavigationMenuProps<{}>) {\r\n super(props);\r\n this.menuNode = React.createRef();\r\n this.state = { activeMenu: undefined, mobileViewLabelText: '', parentMenu: undefined, navOpen: false };\r\n this._closeSubmenu = this._closeSubmenu.bind(this);\r\n this._onMobNavTrigger = this._onMobNavTrigger.bind(this);\r\n }\r\n\r\n public componentDidMount(): void {\r\n document.body && document.body.addEventListener('mousedown', this._handleClickOutside);\r\n }\r\n\r\n public componentWillUnmount(): void {\r\n document.body && document.body.removeEventListener('mousedown', this._handleClickOutside, false);\r\n }\r\n\r\n public render(): JSX.Element | null {\r\n const { isMobileView, MenuList, Navigation } = this.props;\r\n // get current pathname\r\n if (process.env.CURRENT_ENVIRONMENT === 'web') {\r\n this.pathName = window.location.pathname;\r\n } else {\r\n this.pathName = this.props.context.request.url.requestUrl.pathname;\r\n }\r\n\r\n // for wine-shop links, only \"all wines\" page should make \"wine shop\" link active\r\n // TODO: \"wine shop\" menu link has different behavior, it doesn't get highlighted unless on the \"all wines\" page\r\n\r\n // if (this.pathName.startsWith('/fth/wine-shop/')) {\r\n // if (this.pathName.startsWith('/fth/wine-shop/5637149842.c') || this.pathName.startsWith('/fth/wine-shop/all-wines/5637149843.c')) {\r\n // // get \"wine shop\" menu item\r\n // this.props.menuItemData.forEach((item, index) => {\r\n // if (item.linkURL && item.linkURL.startsWith('/fth/wine-shop/')) {\r\n // this.activeMenuItem = item;\r\n // }\r\n // });\r\n // }\r\n // } else {\r\n this.props.menuItemData.forEach((item, index) => {\r\n const ItemPath = this._getPathNameFromURL(item.linkURL || '');\r\n item.subMenu && item.subMenu.forEach((subItem, subIndex) => {\r\n const subItemPath = this._getPathNameFromURL(subItem.linkURL || '');\r\n if (subItemPath === this.pathName) {\r\n this.activeMenuItem = item;\r\n this.activeSubMenuItem = subItem;\r\n }\r\n });\r\n if (ItemPath === this.pathName) {\r\n this.activeMenuItem = item;\r\n }\r\n });\r\n // }\r\n\r\n this.currentLevel = 1;\r\n return (\r\n \r\n \r\n \r\n \r\n {this._renderDisplay()}\r\n \r\n \r\n \r\n );\r\n }\r\n\r\n private _getPathNameFromURL(linkURL: string): string {\r\n let pathName = '';\r\n try {\r\n // if linkURL is a full url\r\n pathName = new URL(linkURL).pathname;\r\n } catch {\r\n pathName = linkURL.split('?')[0];\r\n }\r\n return pathName;\r\n }\r\n\r\n private _onMobNavTrigger(): void {\r\n this.setState(state => ({\r\n navOpen: !state.navOpen\r\n }));\r\n }\r\n\r\n private _renderDisplay(): JSX.Element[] {\r\n const { ListItem, menuItemData } = this.props;\r\n const menuItemList: JSX.Element[] = [];\r\n const isMobileView: boolean = this.props.isMobileView || false;\r\n const expandOnClick: boolean = this.props.config.expandOnClick || false;\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 return menuItemList;\r\n }\r\n\r\n private _createMenuItemList(menuItemData: IMenuItemData): JSX.Element | null {\r\n if (menuItemData && menuItemData.subMenu && menuItemData.subMenu.length > 0) {\r\n if (this.props.isMobileView) {\r\n return (\r\n \r\n {this._renderButtonMenuItem(menuItemData)}\r\n \r\n {this._renderSubMenu(menuItemData.subMenu, menuItemData.id)}\r\n \r\n );\r\n } else {\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 && menuItemData.linkText && menuItemData.linkURL && menuItemData.linkURL.length > 0) {\r\n return (this._renderLinkMenuItem(menuItemData));\r\n } else if (menuItemData && menuItemData.linkText && !menuItemData.linkURL) {\r\n return (this._renderSpanMenuItem(menuItemData));\r\n }\r\n\r\n return null;\r\n }\r\n\r\n private _renderSubMenu(subMenus?: IMenuItemDataClass[], activeMenu?: number): JSX.Element | null {\r\n const { isMobileView, ListItem } = this.props;\r\n if (activeMenu && this.state.activeMenu !== activeMenu && !isMobileView) {\r\n return null;\r\n }\r\n\r\n if (!subMenus || subMenus.length === 0) {\r\n return null;\r\n }\r\n\r\n let levelClassName: string = '';\r\n const menuOptions = subMenus && subMenus.map((option: IMenuItemDataClass, idx: number) => {\r\n const hasOptions = (option.subMenu && option.subMenu.length > 0);\r\n let menuItem: JSX.Element | null;\r\n if (hasOptions && isMobileView) {\r\n menuItem = this._renderButtonMenuItem(option, activeMenu, idx);\r\n } else {\r\n menuItem = (option.linkURL\r\n ? this._renderLinkMenuItem(option, idx)\r\n : this._renderSpanMenuItem(option)\r\n );\r\n }\r\n\r\n let subMenu;\r\n\r\n if (hasOptions) {\r\n this.currentLevel++;\r\n if (this.currentLevel <= this.supportedLevel - 1) {\r\n levelClassName = `level-${this.currentLevel.toString()}`;\r\n subMenu = this._renderSubMenu(option.subMenu, isMobileView ? option.id : undefined);\r\n }\r\n }\r\n\r\n return (\r\n \r\n {menuItem}\r\n {subMenu}\r\n \r\n );\r\n });\r\n\r\n return (this._renderMenu(levelClassName, menuOptions, activeMenu));\r\n }\r\n\r\n private _renderButtonMenuItem(option: IMenuItemData, activeMenu?: number, index?: number): JSX.Element | null {\r\n const { Button } = this.props;\r\n const isActive = (option === this.activeMenuItem) || (option === this.activeSubMenuItem);\r\n const activeClass = `${Button.className} ${isActive ? this.activeClassName : ''}`;\r\n const isMobileView: boolean = this.props.isMobileView || false;\r\n const expandOnClick: boolean = this.props.config.expandOnClick || false;\r\n\r\n return (\r\n this._mainNavClick(option)}\r\n onMouseEnter={isMobileView || expandOnClick ? false : this._handleDropdownToggle(option, activeMenu)}\r\n aria-haspopup={true}\r\n aria-expanded={this.state.activeMenu && this.state.activeMenu === option.id ? true : false}\r\n data-parent={activeMenu}\r\n aria-current={isActive && 'page'}\r\n >\r\n {option.linkText}{(this.state.navOpen && this.state.activeMenu && this.state.activeMenu === option.id) ? :}\r\n \r\n );\r\n }\r\n\r\n private _mainNavClick = (option: IMenuItemData) => {\r\n const link = option.linkURL;\r\n if (link) {\r\n window.location.href = link;\r\n }\r\n };\r\n\r\n private _renderLinkMenuItem(option: IMenuItemData, index?: number): JSX.Element | null {\r\n const { Link } = this.props;\r\n const isActive = (option === this.activeSubMenuItem) || (option === this.activeMenuItem);\r\n const activeClass = `${Link.className} ${isActive ? this.activeClassName : ''}`;\r\n\r\n return (\r\n \r\n {option.linkText}\r\n \r\n );\r\n }\r\n\r\n private _renderSpanMenuItem(option: IMenuItemData, index?: number): JSX.Element | null {\r\n const { Span } = this.props;\r\n return (\r\n {option.linkText}\r\n );\r\n }\r\n\r\n private _renderMenu(level: string, menuOptions: JSX.Element[], currentItem?: number): JSX.Element | null {\r\n const { MenuList } = this.props;\r\n this.currentLevel = 1;\r\n return (\r\n \r\n {menuOptions}\r\n \r\n );\r\n }\r\n\r\n private _handleDropdownToggle = (data: IMenuItemData, parentId?: number) => () => {\r\n let activeMenu;\r\n if(this.props.isMobileView) {\r\n activeMenu = (this.state.activeMenu && this.state.activeMenu === data.id!) ? undefined : data.id!;\r\n } else {\r\n activeMenu = data.id;\r\n }\r\n this.setState({\r\n activeMenu,\r\n parentMenu: parentId,\r\n navOpen: true\r\n });\r\n\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 const burgerMenu:boolean = event.target.className === 'ms-header__nav-icon msc-btn';\r\n if (this.menuNode.current && !this.menuNode.current.contains(event.target)) {\r\n this.setState({ activeMenu: undefined, mobileViewLabelText: '' });\r\n\r\n if (!burgerMenu) {\r\n this.setState({ navOpen: false });\r\n }\r\n }\r\n };\r\n\r\n private _closeSubmenu(): void {\r\n if (!this.props.isMobileView) {\r\n this.setState({ activeMenu: undefined, mobileViewLabelText: '', navOpen: false });\r\n }\r\n }\r\n}\r\n\r\nexport default NavigationMenuView;","/*---------------------------------------------------------------------------------------------\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 { IMenuItemData, INavigationMenuViewProps } from '@msdyn365-commerce-modules/navigation-menu';\r\nimport { Module, Node } from '@msdyn365-commerce-modules/utilities';\r\nimport classnames from 'classnames';\r\nimport * as React from 'react';\r\n\r\ninterface INavigationState {\r\n parentMenu?: number;\r\n activeMenu?: number;\r\n mobileViewLabelText?: string;\r\n navOpen: boolean;\r\n}\r\ninterface IMenuItemDataClass extends IMenuItemData {\r\n className?: string;\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 private supportedLevel: number = 3;\r\n private currentLevel: number = 0;\r\n private menuNode: React.RefObject;\r\n private pathName: string = '';\r\n private activeClassName: string = 'selected';\r\n private activeMenuItem: IMenuItemData = {};\r\n private activeSubMenuItem: IMenuItemData = {};\r\n constructor(props: INavigationMenuViewProps) {\r\n super(props);\r\n this.menuNode = React.createRef();\r\n this.state = { activeMenu: undefined, mobileViewLabelText: '', parentMenu: undefined, navOpen: false };\r\n this._closeSubmenu = this._closeSubmenu.bind(this);\r\n this._onMobNavTrigger = this._onMobNavTrigger.bind(this);\r\n }\r\n public componentDidMount(): void {\r\n document.body && document.body.addEventListener('mousedown', this._handleClickOutside);\r\n }\r\n public componentWillUnmount(): void {\r\n document.body && document.body.removeEventListener('mousedown', this._handleClickOutside, false);\r\n }\r\n public render(): JSX.Element | null {\r\n const { isMobileView, MenuList, Navigation } = this.props;\r\n // get current pathname\r\n if (process.env.CURRENT_ENVIRONMENT === 'web') {\r\n this.pathName = window.location.pathname;\r\n } else {\r\n this.pathName = this.props.context.request.url.requestUrl.pathname;\r\n }\r\n // for wine-shop links, only \"all wines\" page should make \"wine shop\" link active\r\n // TODO: \"wine shop\" menu link has different behavior, it doesn't get highlighted unless on the \"all wines\" page\r\n // if (this.pathName.startsWith('/fth/wine-shop/')) {\r\n // if (this.pathName.startsWith('/fth/wine-shop/5637149842.c') || this.pathName.startsWith('/fth/wine-shop/all-wines/5637149843.c')) {\r\n // // get \"wine shop\" menu item\r\n // this.props.menuItemData.forEach((item, index) => {\r\n // if (item.linkURL && item.linkURL.startsWith('/fth/wine-shop/')) {\r\n // this.activeMenuItem = item;\r\n // }\r\n // });\r\n // }\r\n // } else {\r\n this.props.menuItemData.forEach((item, index) => {\r\n const ItemPath = this._getPathNameFromURL(item.linkURL || '');\r\n item.subMenu && item.subMenu.forEach((subItem, subIndex) => {\r\n const subItemPath = this._getPathNameFromURL(subItem.linkURL || '');\r\n if (subItemPath === this.pathName) {\r\n this.activeMenuItem = item;\r\n this.activeSubMenuItem = subItem;\r\n }\r\n });\r\n if (ItemPath === this.pathName) {\r\n this.activeMenuItem = item;\r\n }\r\n });\r\n // }\r\n this.currentLevel = 1;\r\n return (\r\n \r\n \r\n \r\n \r\n {this._renderDisplay()}\r\n \r\n \r\n \r\n );\r\n }\r\n private _getPathNameFromURL(linkURL: string): string {\r\n let pathName = '';\r\n try {\r\n // if linkURL is a full url\r\n pathName = new URL(linkURL).pathname;\r\n } catch {\r\n pathName = linkURL.split('?')[0];\r\n }\r\n return pathName;\r\n }\r\n private _onMobNavTrigger(): void {\r\n this.setState(state => ({\r\n navOpen: !state.navOpen\r\n }));\r\n }\r\n private _renderDisplay(): JSX.Element[] {\r\n const { ListItem, menuItemData } = this.props;\r\n const menuItemList: JSX.Element[] = [];\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 return menuItemList;\r\n }\r\n private _createMenuItemList(menuItemData: IMenuItemData): JSX.Element | null {\r\n if (menuItemData && menuItemData.subMenu && menuItemData.subMenu.length > 0) {\r\n if (this.props.isMobileView) {\r\n return (\r\n \r\n {this._renderButtonMenuItem(menuItemData)}\r\n \r\n {this._renderSubMenu(menuItemData.subMenu, menuItemData.id)}\r\n \r\n );\r\n } else {\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 && menuItemData.linkText && menuItemData.linkURL && menuItemData.linkURL.length > 0) {\r\n return (this._renderLinkMenuItem(menuItemData));\r\n } else if (menuItemData && menuItemData.linkText && !menuItemData.linkURL) {\r\n return (this._renderSpanMenuItem(menuItemData));\r\n }\r\n return null;\r\n }\r\n private _renderSubMenu(subMenus?: IMenuItemDataClass[], activeMenu?: number): JSX.Element | null {\r\n const { isMobileView, ListItem } = this.props;\r\n if (activeMenu && this.state.activeMenu !== activeMenu && !isMobileView) {\r\n return null;\r\n }\r\n if (!subMenus || subMenus.length === 0) {\r\n return null;\r\n }\r\n let levelClassName: string = '';\r\n const menuOptions = subMenus && subMenus.map((option: IMenuItemDataClass, idx: number) => {\r\n const hasOptions = (option.subMenu && option.subMenu.length > 0);\r\n let menuItem: JSX.Element | null;\r\n if (hasOptions && isMobileView) {\r\n menuItem = this._renderButtonMenuItem(option, activeMenu, idx);\r\n } else {\r\n menuItem = (option.linkURL\r\n ? this._renderLinkMenuItem(option, idx)\r\n : this._renderSpanMenuItem(option)\r\n );\r\n }\r\n let subMenu;\r\n if (hasOptions) {\r\n this.currentLevel++;\r\n if (this.currentLevel <= this.supportedLevel - 1) {\r\n levelClassName = `level-${this.currentLevel.toString()}`;\r\n subMenu = this._renderSubMenu(option.subMenu, isMobileView ? option.id : undefined);\r\n }\r\n }\r\n return (\r\n \r\n {menuItem}\r\n {subMenu}\r\n \r\n );\r\n });\r\n return (this._renderMenu(levelClassName, menuOptions, activeMenu));\r\n }\r\n private _renderButtonMenuItem(option: IMenuItemData, activeMenu?: number, index?: number): JSX.Element | null {\r\n const { Button } = this.props;\r\n const isActive = (option === this.activeMenuItem) || (option === this.activeSubMenuItem);\r\n const activeClass = `${Button.className} ${isActive ? this.activeClassName : ''}`;\r\n return (\r\n this._mainNavClick(option) : this._handleDropdownToggle(option, activeMenu)}\r\n onMouseEnter={!this.props.isMobileView ? this._handleDropdownToggle(option, activeMenu) : false}\r\n onFocus={!this.props.isMobileView ? this._handleDropdownToggle(option, activeMenu) : false}\r\n aria-haspopup={true}\r\n aria-expanded={this.state.activeMenu && this.state.activeMenu === option.id ? true : false}\r\n data-parent={activeMenu}\r\n aria-current={isActive && 'page'}\r\n >\r\n {option.linkText}\r\n \r\n );\r\n }\r\n private _mainNavClick = (option: IMenuItemData) => {\r\n const link = option.linkURL;\r\n if (link) {\r\n window.location.href = link;\r\n }\r\n };\r\n private _renderLinkMenuItem(option: IMenuItemData, index?: number): JSX.Element | null {\r\n const { Link } = this.props;\r\n const isActive = (option === this.activeSubMenuItem) || (option === this.activeMenuItem);\r\n const activeClass = `${Link.className} ${isActive ? this.activeClassName : ''}`;\r\n return (\r\n \r\n {option.linkText}\r\n \r\n );\r\n }\r\n private _renderSpanMenuItem(option: IMenuItemData, index?: number): JSX.Element | null {\r\n const { Span } = this.props;\r\n return (\r\n {option.linkText}\r\n );\r\n }\r\n private _renderMenu(level: string, menuOptions: JSX.Element[], currentItem?: number): JSX.Element | null {\r\n const { MenuList } = this.props;\r\n this.currentLevel = 1;\r\n return (\r\n \r\n {menuOptions}\r\n \r\n );\r\n }\r\n private _handleDropdownToggle = (data: IMenuItemData, parentId?: number) => () => {\r\n let activeMenu;\r\n if(this.props.isMobileView) {\r\n activeMenu = (this.state.activeMenu && this.state.activeMenu === data.id!) ? undefined : data.id!;\r\n } else {\r\n activeMenu = data.id;\r\n }\r\n this.setState({\r\n activeMenu,\r\n parentMenu: parentId\r\n });\r\n this._resetFocus();\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 // tslint:disable-next-line:no-any\r\n private _handleClickOutside = (event: any) => {\r\n const burgerMenu:boolean = event.target.className === 'ms-header__nav-icon msc-btn';\r\n if (this.menuNode.current && !this.menuNode.current.contains(event.target) && !burgerMenu) {\r\n this.setState({ navOpen: false });\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\nexport default NavigationMenuView;","/*---------------------------------------------------------------------------------------------\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 { Module, Node } from '@msdyn365-commerce-modules/utilities';\r\nimport classnames from 'classnames';\r\nimport * as React from 'react';\r\nimport { INavigationMenuViewProps } from '../../../modules/smwe-navigation-menu/./smwe-navigation-menu';\r\nimport { IMenuItemData } from '../../../modules/smwe-navigation-menu/./smwe-navigation-menu.data';\r\nimport { ISmweNavigationMenuProps } from '../definition-extensions/smwe-navigation-menu.ext.props.autogenerated';\r\n\r\ninterface INavigationState {\r\n parentMenu?: number;\r\n activeMenu?: number;\r\n mobileViewLabelText?: string;\r\n navOpen: boolean;\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, INavigationState> {\r\n private supportedLevel: number = 3;\r\n private currentLevel: number = 0;\r\n private menuNode: React.RefObject;\r\n private pathName: string = '';\r\n private activeClassName: string = 'selected';\r\n private activeMenuItem: IMenuItemData = {};\r\n private activeSubMenuItem: IMenuItemData = {};\r\n\r\n constructor(props: INavigationMenuViewProps & ISmweNavigationMenuProps<{}>) {\r\n super(props);\r\n this.menuNode = React.createRef();\r\n this.state = { activeMenu: undefined, mobileViewLabelText: '', parentMenu: undefined, navOpen: false };\r\n this._closeSubmenu = this._closeSubmenu.bind(this);\r\n this._onMobNavTrigger = this._onMobNavTrigger.bind(this);\r\n }\r\n\r\n public componentDidMount(): void {\r\n document.body && document.body.addEventListener('mousedown', this._handleClickOutside);\r\n }\r\n\r\n public componentWillUnmount(): void {\r\n document.body && document.body.removeEventListener('mousedown', this._handleClickOutside, false);\r\n }\r\n\r\n public render(): JSX.Element | null {\r\n const { isMobileView, MenuList, Navigation } = this.props;\r\n // get current pathname\r\n if (process.env.CURRENT_ENVIRONMENT === 'web') {\r\n this.pathName = window.location.pathname;\r\n } else {\r\n this.pathName = this.props.context.request.url.requestUrl.pathname;\r\n }\r\n\r\n this.props.menuItemData.forEach((item, index) => {\r\n if (item.linkText?.toLowerCase() === this.props.config.hiddenUrl?.toLowerCase()) {\r\n item.linkURL = '';\r\n }\r\n if (item.subMenu && item.subMenu.length > 0 && this.props.config.hiddenSubMenuItem) {\r\n this._removeSubItem(item.subMenu, this.props.config.hiddenSubMenuItem);\r\n }\r\n const ItemPath = this._getPathNameFromURL(item.linkURL || '');\r\n item.subMenu && item.subMenu.forEach((subItem, subIndex) => {\r\n const subItemPath = this._getPathNameFromURL(subItem.linkURL || '');\r\n if (subItemPath === this.pathName) {\r\n this.activeMenuItem = item;\r\n this.activeSubMenuItem = subItem;\r\n }\r\n });\r\n if (ItemPath === this.pathName) {\r\n this.activeMenuItem = item;\r\n }\r\n });\r\n\r\n this.currentLevel = 1;\r\n return (\r\n \r\n \r\n );\r\n }\r\n\r\n // helper function created to remove elements from navigation submenus\r\n private _removeSubItem(subMenuArray: IMenuItemData[], subItemToRemove: string): IMenuItemData[] {\r\n let i = 0;\r\n while (i < subMenuArray.length) {\r\n if (subMenuArray[i].linkText?.toLowerCase() === subItemToRemove.toLowerCase()) {\r\n subMenuArray.splice(i, 1);\r\n } else {\r\n ++i;\r\n }\r\n }\r\n return subMenuArray;\r\n }\r\n\r\n private _getPathNameFromURL(linkURL: string): string {\r\n let pathName = '';\r\n try {\r\n // if linkURL is a full url\r\n pathName = new URL(linkURL).pathname;\r\n } catch {\r\n pathName = linkURL.split('?')[0];\r\n }\r\n return pathName;\r\n }\r\n\r\n private _onMobNavTrigger(): void {\r\n this.setState(state => ({\r\n navOpen: !state.navOpen\r\n }));\r\n }\r\n\r\n private _renderDisplay(): JSX.Element[] {\r\n const { ListItem, menuItemData } = this.props;\r\n const menuItemList: JSX.Element[] = [];\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 return menuItemList;\r\n }\r\n\r\n private _createMenuItemList(menuItemData: IMenuItemData): JSX.Element | null {\r\n if (menuItemData && menuItemData.subMenu && menuItemData.subMenu.length > 0) {\r\n if (this.props.isMobileView) {\r\n return (\r\n \r\n {this._renderButtonMenuItem(menuItemData)}\r\n \r\n {this._renderSubMenu(menuItemData.subMenu, menuItemData.id)}\r\n \r\n );\r\n } else {\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 && menuItemData.linkText && menuItemData.linkURL && menuItemData.linkURL.length > 0) {\r\n return (this._renderLinkMenuItem(menuItemData));\r\n } else if (menuItemData && menuItemData.linkText && !menuItemData.linkURL) {\r\n return (this._renderSpanMenuItem(menuItemData));\r\n }\r\n\r\n return null;\r\n }\r\n\r\n private _renderSubMenu(subMenus?: IMenuItemData[], activeMenu?: number): JSX.Element | null {\r\n const { isMobileView, ListItem } = this.props;\r\n if (activeMenu && this.state.activeMenu !== activeMenu && !isMobileView) {\r\n return null;\r\n }\r\n\r\n if (!subMenus || subMenus.length === 0) {\r\n return null;\r\n }\r\n\r\n let levelClassName: string = '';\r\n const menuOptions = subMenus && subMenus.map((option: IMenuItemData, idx: number) => {\r\n const hasOptions = (option.subMenu && option.subMenu.length > 0);\r\n let menuItem: JSX.Element | null;\r\n if (hasOptions && isMobileView) {\r\n menuItem = this._renderButtonMenuItem(option, activeMenu, idx);\r\n } else {\r\n menuItem = (option.linkURL\r\n ? this._renderLinkMenuItem(option, idx)\r\n : this._renderSpanMenuItem(option)\r\n );\r\n }\r\n\r\n let subMenu;\r\n\r\n if (hasOptions) {\r\n this.currentLevel++;\r\n if (this.currentLevel <= this.supportedLevel - 1) {\r\n levelClassName = `level-${this.currentLevel.toString()}`;\r\n subMenu = this._renderSubMenu(option.subMenu, isMobileView ? option.id : undefined);\r\n }\r\n }\r\n\r\n return (\r\n \r\n {menuItem}\r\n {subMenu}\r\n \r\n );\r\n });\r\n\r\n return (this._renderMenu(levelClassName, menuOptions, activeMenu));\r\n }\r\n\r\n private _renderButtonMenuItem(option: IMenuItemData, activeMenu?: number, index?: number): JSX.Element | null {\r\n const { Button } = this.props;\r\n const isActive = (option === this.activeMenuItem) || (option === this.activeSubMenuItem);\r\n const activeClass = `${Button.className} ${isActive ? this.activeClassName : ''}`;\r\n\r\n return (\r\n this._mainNavClick(option) : this._handleDropdownToggle(option, activeMenu)}\r\n onMouseEnter={!this.props.isMobileView ? this._handleDropdownToggle(option, activeMenu) : false}\r\n onFocus={!this.props.isMobileView ? this._handleDropdownToggle(option, activeMenu) : false}\r\n aria-haspopup={true}\r\n aria-expanded={this.state.activeMenu && this.state.activeMenu === option.id ? true : false}\r\n data-parent={activeMenu}\r\n aria-current={isActive && 'page'}\r\n >\r\n {option.linkText}\r\n \r\n );\r\n }\r\n\r\n private _mainNavClick = (option: IMenuItemData) => {\r\n const link = option.linkURL;\r\n if (link) {\r\n window.location.href = link;\r\n }\r\n };\r\n\r\n private _renderLinkMenuItem(option: IMenuItemData, index?: number): JSX.Element | null {\r\n const { Link } = this.props;\r\n const isActive = (option === this.activeSubMenuItem) || (option === this.activeMenuItem);\r\n const activeClass = `${Link.className} ${isActive ? this.activeClassName : ''}`;\r\n\r\n return (\r\n \r\n {option.linkText}\r\n \r\n );\r\n }\r\n\r\n private _renderSpanMenuItem(option: IMenuItemData, index?: number): JSX.Element | null {\r\n const { Span } = this.props;\r\n return (\r\n {option.linkText}\r\n );\r\n }\r\n\r\n private _renderMenu(level: string, menuOptions: JSX.Element[], currentItem?: number): JSX.Element | null {\r\n const { MenuList } = this.props;\r\n this.currentLevel = 1;\r\n return (\r\n \r\n {menuOptions}\r\n \r\n );\r\n }\r\n\r\n private _handleDropdownToggle = (data: IMenuItemData, parentId?: number) => () => {\r\n let activeMenu;\r\n if(this.props.isMobileView) {\r\n activeMenu = (this.state.activeMenu && this.state.activeMenu === data.id!) ? undefined : data.id!;\r\n } else {\r\n activeMenu = data.id;\r\n }\r\n this.setState({\r\n activeMenu,\r\n parentMenu: parentId\r\n });\r\n\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 const burgerMenu:boolean = event.target.className === 'ms-header__nav-icon msc-btn';\r\n if (this.menuNode.current && !this.menuNode.current.contains(event.target) && !burgerMenu) {\r\n this.setState({ navOpen: false });\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\r\nexport default NavigationMenuView;","/*---------------------------------------------------------------------------------------------\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 { IMenuItemData, INavigationMenuViewProps } from '@msdyn365-commerce-modules/navigation-menu';\r\nimport { Module, Node } from '@msdyn365-commerce-modules/utilities';\r\nimport classnames from 'classnames';\r\nimport * as React from 'react';\r\n\r\ninterface INavigationState {\r\n parentMenu?: number;\r\n activeMenu?: number;\r\n mobileViewLabelText?: string;\r\n navOpen: boolean;\r\n}\r\n\r\ninterface IMenuItemDataClass extends IMenuItemData {\r\n className?: string;\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 private supportedLevel: number = 3;\r\n private currentLevel: number = 0;\r\n private menuNode: React.RefObject;\r\n private pathName: string = '';\r\n private activeClassName: string = 'selected';\r\n private activeMenuItem: IMenuItemData = {};\r\n private activeSubMenuItem: IMenuItemData = {};\r\n\r\n constructor(props: INavigationMenuViewProps) {\r\n super(props);\r\n this.menuNode = React.createRef();\r\n this.state = { activeMenu: undefined, mobileViewLabelText: '', parentMenu: undefined, navOpen: false };\r\n this._closeSubmenu = this._closeSubmenu.bind(this);\r\n this._onMobNavTrigger = this._onMobNavTrigger.bind(this);\r\n }\r\n\r\n public componentDidMount(): void {\r\n document.body && document.body.addEventListener('mousedown', this._handleClickOutside);\r\n }\r\n\r\n public componentWillUnmount(): void {\r\n document.body && document.body.removeEventListener('mousedown', this._handleClickOutside, false);\r\n }\r\n\r\n public render(): JSX.Element | null {\r\n const { isMobileView, MenuList, Navigation } = this.props;\r\n // get current pathname\r\n if (process.env.CURRENT_ENVIRONMENT === 'web') {\r\n this.pathName = window.location.pathname;\r\n } else {\r\n this.pathName = this.props.context.request.url.requestUrl.pathname;\r\n }\r\n\r\n // for wine-shop links, only \"all wines\" page should make \"wine shop\" link active\r\n // TODO: \"wine shop\" menu link has different behavior, it doesn't get highlighted unless on the \"all wines\" page\r\n\r\n // if (this.pathName.startsWith('/fth/wine-shop/')) {\r\n // if (this.pathName.startsWith('/fth/wine-shop/5637149842.c') || this.pathName.startsWith('/fth/wine-shop/all-wines/5637149843.c')) {\r\n // // get \"wine shop\" menu item\r\n // this.props.menuItemData.forEach((item, index) => {\r\n // if (item.linkURL && item.linkURL.startsWith('/fth/wine-shop/')) {\r\n // this.activeMenuItem = item;\r\n // }\r\n // });\r\n // }\r\n // } else {\r\n this.props.menuItemData.forEach((item, index) => {\r\n const ItemPath = this._getPathNameFromURL(item.linkURL || '');\r\n item.subMenu && item.subMenu.forEach((subItem, subIndex) => {\r\n const subItemPath = this._getPathNameFromURL(subItem.linkURL || '');\r\n if (subItemPath === this.pathName) {\r\n this.activeMenuItem = item;\r\n this.activeSubMenuItem = subItem;\r\n }\r\n });\r\n if (ItemPath === this.pathName) {\r\n this.activeMenuItem = item;\r\n }\r\n });\r\n // }\r\n\r\n this.currentLevel = 1;\r\n return (\r\n \r\n \r\n \r\n \r\n {this._renderDisplay()}\r\n \r\n \r\n \r\n );\r\n }\r\n\r\n private _getPathNameFromURL(linkURL: string): string {\r\n let pathName = '';\r\n try {\r\n // if linkURL is a full url\r\n pathName = new URL(linkURL).pathname;\r\n } catch {\r\n pathName = linkURL.split('?')[0];\r\n }\r\n return pathName;\r\n }\r\n\r\n private _onMobNavTrigger(): void {\r\n this.setState(state => ({\r\n navOpen: !state.navOpen\r\n }));\r\n }\r\n\r\n private _renderDisplay(): JSX.Element[] {\r\n const { ListItem, menuItemData } = this.props;\r\n const menuItemList: JSX.Element[] = [];\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 return menuItemList;\r\n }\r\n\r\n private _createMenuItemList(menuItemData: IMenuItemData): JSX.Element | null {\r\n if (menuItemData && menuItemData.subMenu && menuItemData.subMenu.length > 0) {\r\n if (this.props.isMobileView) {\r\n return (\r\n \r\n {this._renderButtonMenuItem(menuItemData)}\r\n \r\n {this._renderSubMenu(menuItemData.subMenu, menuItemData.id)}\r\n \r\n );\r\n } else {\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 && menuItemData.linkText && menuItemData.linkURL && menuItemData.linkURL.length > 0) {\r\n return (this._renderLinkMenuItem(menuItemData));\r\n } else if (menuItemData && menuItemData.linkText && !menuItemData.linkURL) {\r\n return (this._renderSpanMenuItem(menuItemData));\r\n }\r\n\r\n return null;\r\n }\r\n\r\n private _renderSubMenu(subMenus?: IMenuItemDataClass[], activeMenu?: number): JSX.Element | null {\r\n const { isMobileView, ListItem } = this.props;\r\n if (activeMenu && this.state.activeMenu !== activeMenu && !isMobileView) {\r\n return null;\r\n }\r\n\r\n if (!subMenus || subMenus.length === 0) {\r\n return null;\r\n }\r\n\r\n let levelClassName: string = '';\r\n const menuOptions = subMenus && subMenus.map((option: IMenuItemDataClass, idx: number) => {\r\n const hasOptions = (option.subMenu && option.subMenu.length > 0);\r\n let menuItem: JSX.Element | null;\r\n if (hasOptions && isMobileView) {\r\n menuItem = this._renderButtonMenuItem(option, activeMenu, idx);\r\n } else {\r\n menuItem = (option.linkURL\r\n ? this._renderLinkMenuItem(option, idx)\r\n : this._renderSpanMenuItem(option)\r\n );\r\n }\r\n\r\n let subMenu;\r\n\r\n if (hasOptions) {\r\n this.currentLevel++;\r\n if (this.currentLevel <= this.supportedLevel - 1) {\r\n levelClassName = `level-${this.currentLevel.toString()}`;\r\n subMenu = this._renderSubMenu(option.subMenu, isMobileView ? option.id : undefined);\r\n }\r\n }\r\n\r\n return (\r\n \r\n {menuItem}\r\n {subMenu}\r\n \r\n );\r\n });\r\n\r\n return (this._renderMenu(levelClassName, menuOptions, activeMenu));\r\n }\r\n\r\n private _renderButtonMenuItem(option: IMenuItemData, activeMenu?: number, index?: number): JSX.Element | null {\r\n const { Button } = this.props;\r\n const isActive = (option === this.activeMenuItem) || (option === this.activeSubMenuItem);\r\n const activeClass = `${Button.className} ${isActive ? this.activeClassName : ''}`;\r\n\r\n return (\r\n this._mainNavClick(option) : this._handleDropdownToggle(option, activeMenu)}\r\n onMouseEnter={!this.props.isMobileView ? this._handleDropdownToggle(option, activeMenu) : false}\r\n onFocus={!this.props.isMobileView ? this._handleDropdownToggle(option, activeMenu) : false}\r\n aria-haspopup={true}\r\n aria-expanded={this.state.activeMenu && this.state.activeMenu === option.id ? true : false}\r\n data-parent={activeMenu}\r\n aria-current={isActive && 'page'}\r\n >\r\n {option.linkText}\r\n \r\n );\r\n }\r\n\r\n private _mainNavClick = (option: IMenuItemData) => {\r\n const link = option.linkURL;\r\n if (link) {\r\n window.location.href = link;\r\n }\r\n };\r\n\r\n private _renderLinkMenuItem(option: IMenuItemData, index?: number): JSX.Element | null {\r\n const { Link } = this.props;\r\n const isActive = (option === this.activeSubMenuItem) || (option === this.activeMenuItem);\r\n const activeClass = `${Link.className} ${isActive ? this.activeClassName : ''}`;\r\n\r\n return (\r\n \r\n {option.linkText}\r\n \r\n );\r\n }\r\n\r\n private _renderSpanMenuItem(option: IMenuItemData, index?: number): JSX.Element | null {\r\n const { Span } = this.props;\r\n return (\r\n {option.linkText}\r\n );\r\n }\r\n\r\n private _renderMenu(level: string, menuOptions: JSX.Element[], currentItem?: number): JSX.Element | null {\r\n const { MenuList } = this.props;\r\n this.currentLevel = 1;\r\n return (\r\n \r\n {menuOptions}\r\n \r\n );\r\n }\r\n\r\n private _handleDropdownToggle = (data: IMenuItemData, parentId?: number) => () => {\r\n let activeMenu;\r\n if(this.props.isMobileView) {\r\n activeMenu = (this.state.activeMenu && this.state.activeMenu === data.id!) ? undefined : data.id!;\r\n } else {\r\n activeMenu = data.id;\r\n }\r\n this.setState({\r\n activeMenu,\r\n parentMenu: parentId\r\n });\r\n\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 const burgerMenu:boolean = event.target.className === 'ms-header__nav-icon msc-btn';\r\n if (this.menuNode.current && !this.menuNode.current.contains(event.target) && !burgerMenu) {\r\n this.setState({ navOpen: false });\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\r\nexport default NavigationMenuView;","/*---------------------------------------------------------------------------------------------\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 { Module, Node } from '@msdyn365-commerce-modules/utilities';\r\nimport classnames from 'classnames';\r\nimport * as React from 'react';\r\nimport { INavigationMenuViewProps } from './smwe-navigation-menu';\r\nimport { IMenuItemData } from './smwe-navigation-menu.data';\r\n\r\ninterface INavigationState {\r\n parentMenu?: number;\r\n activeMenu?: number;\r\n mobileViewLabelText?: string;\r\n navOpen: boolean;\r\n}\r\n\r\ninterface IMenuItemDataClass extends IMenuItemData {\r\n className?: string;\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 private supportedLevel: number = 3;\r\n private currentLevel: number = 0;\r\n private menuNode: React.RefObject;\r\n private pathName: string = '';\r\n private activeClassName: string = 'selected';\r\n private activeMenuItem: IMenuItemData = {};\r\n private activeSubMenuItem: IMenuItemData = {};\r\n\r\n constructor(props: INavigationMenuViewProps) {\r\n super(props);\r\n this.menuNode = React.createRef();\r\n this.state = { activeMenu: undefined, mobileViewLabelText: '', parentMenu: undefined, navOpen: false };\r\n this._closeSubmenu = this._closeSubmenu.bind(this);\r\n this._onMobNavTrigger = this._onMobNavTrigger.bind(this);\r\n }\r\n\r\n public componentDidMount(): void {\r\n document.body && document.body.addEventListener('mousedown', this._handleClickOutside);\r\n }\r\n\r\n public componentWillUnmount(): void {\r\n document.body && document.body.removeEventListener('mousedown', this._handleClickOutside, false);\r\n }\r\n\r\n public render(): JSX.Element | null {\r\n const { isMobileView, MenuList, Navigation } = this.props;\r\n // get current pathname\r\n if (process.env.CURRENT_ENVIRONMENT === 'web') {\r\n this.pathName = window.location.pathname;\r\n } else {\r\n this.pathName = this.props.context.request.url.requestUrl.pathname;\r\n }\r\n\r\n // for wine-shop links, only \"all wines\" page should make \"wine shop\" link active\r\n // TODO: \"wine shop\" menu link has different behavior, it doesn't get highlighted unless on the \"all wines\" page\r\n\r\n // if (this.pathName.startsWith('/fth/wine-shop/')) {\r\n // if (this.pathName.startsWith('/fth/wine-shop/5637149842.c') || this.pathName.startsWith('/fth/wine-shop/all-wines/5637149843.c')) {\r\n // // get \"wine shop\" menu item\r\n // this.props.menuItemData.forEach((item, index) => {\r\n // if (item.linkURL && item.linkURL.startsWith('/fth/wine-shop/')) {\r\n // this.activeMenuItem = item;\r\n // }\r\n // });\r\n // }\r\n // } else {\r\n this.props.menuItemData.forEach((item, index) => {\r\n const ItemPath = this._getPathNameFromURL(item.linkURL || '');\r\n item.subMenu && item.subMenu.forEach((subItem, subIndex) => {\r\n const subItemPath = this._getPathNameFromURL(subItem.linkURL || '');\r\n if (subItemPath === this.pathName) {\r\n this.activeMenuItem = item;\r\n this.activeSubMenuItem = subItem;\r\n }\r\n });\r\n if (ItemPath === this.pathName) {\r\n this.activeMenuItem = item;\r\n }\r\n });\r\n // }\r\n\r\n this.currentLevel = 1;\r\n return (\r\n \r\n \r\n \r\n \r\n {this._renderDisplay()}\r\n \r\n \r\n \r\n );\r\n }\r\n\r\n private _getPathNameFromURL(linkURL: string): string {\r\n let pathName = '';\r\n try {\r\n // if linkURL is a full url\r\n pathName = new URL(linkURL).pathname;\r\n } catch {\r\n pathName = linkURL.split('?')[0];\r\n }\r\n return pathName;\r\n }\r\n\r\n private _onMobNavTrigger(): void {\r\n this.setState(state => ({\r\n navOpen: !state.navOpen\r\n }));\r\n }\r\n\r\n private _renderDisplay(): JSX.Element[] {\r\n const { ListItem, menuItemData } = this.props;\r\n const menuItemList: JSX.Element[] = [];\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 return menuItemList;\r\n }\r\n\r\n private _createMenuItemList(menuItemData: IMenuItemData): JSX.Element | null {\r\n if (menuItemData && menuItemData.subMenu && menuItemData.subMenu.length > 0) {\r\n if (this.props.isMobileView) {\r\n return (\r\n \r\n {this._renderButtonMenuItem(menuItemData)}\r\n \r\n {this._renderSubMenu(menuItemData.subMenu, menuItemData.id)}\r\n \r\n );\r\n } else {\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 && menuItemData.linkText && menuItemData.linkURL && menuItemData.linkURL.length > 0) {\r\n return (this._renderLinkMenuItem(menuItemData));\r\n } else if (menuItemData && menuItemData.linkText && !menuItemData.linkURL) {\r\n return (this._renderSpanMenuItem(menuItemData));\r\n }\r\n\r\n return null;\r\n }\r\n\r\n private _renderSubMenu(subMenus?: IMenuItemDataClass[], activeMenu?: number): JSX.Element | null {\r\n const { isMobileView, ListItem } = this.props;\r\n if (activeMenu && this.state.activeMenu !== activeMenu && !isMobileView) {\r\n return null;\r\n }\r\n\r\n if (!subMenus || subMenus.length === 0) {\r\n return null;\r\n }\r\n\r\n let levelClassName: string = '';\r\n const menuOptions = subMenus && subMenus.map((option: IMenuItemDataClass, idx: number) => {\r\n const hasOptions = (option.subMenu && option.subMenu.length > 0);\r\n let menuItem: JSX.Element | null;\r\n if (hasOptions && isMobileView) {\r\n menuItem = this._renderButtonMenuItem(option, activeMenu, idx);\r\n } else {\r\n menuItem = (option.linkURL\r\n ? this._renderLinkMenuItem(option, idx)\r\n : this._renderSpanMenuItem(option)\r\n );\r\n }\r\n\r\n let subMenu;\r\n\r\n if (hasOptions) {\r\n this.currentLevel++;\r\n if (this.currentLevel <= this.supportedLevel - 1) {\r\n levelClassName = `level-${this.currentLevel.toString()}`;\r\n subMenu = this._renderSubMenu(option.subMenu, isMobileView ? option.id : undefined);\r\n }\r\n }\r\n\r\n return (\r\n \r\n {menuItem}\r\n {subMenu}\r\n \r\n );\r\n });\r\n\r\n return (this._renderMenu(levelClassName, menuOptions, activeMenu));\r\n }\r\n\r\n private _renderButtonMenuItem(option: IMenuItemData, activeMenu?: number, index?: number): JSX.Element | null {\r\n const { Button } = this.props;\r\n const isActive = (option === this.activeMenuItem) || (option === this.activeSubMenuItem);\r\n const activeClass = `${Button.className} ${isActive ? this.activeClassName : ''}`;\r\n\r\n return (\r\n this._mainNavClick(option) : this._handleDropdownToggle(option, activeMenu)}\r\n onMouseEnter={!this.props.isMobileView ? this._handleDropdownToggle(option, activeMenu) : false}\r\n onFocus={!this.props.isMobileView ? this._handleDropdownToggle(option, activeMenu) : false}\r\n aria-haspopup={true}\r\n aria-expanded={this.state.activeMenu && this.state.activeMenu === option.id ? true : false}\r\n data-parent={activeMenu}\r\n aria-current={isActive && 'page'}\r\n >\r\n {option.linkText}\r\n \r\n );\r\n }\r\n\r\n private _mainNavClick = (option: IMenuItemData) => {\r\n const link = option.linkURL;\r\n if (link) {\r\n window.location.href = link;\r\n }\r\n };\r\n\r\n private _renderLinkMenuItem(option: IMenuItemData, index?: number): JSX.Element | null {\r\n const { Link } = this.props;\r\n const isActive = (option === this.activeSubMenuItem) || (option === this.activeMenuItem);\r\n const activeClass = `${Link.className} ${isActive ? this.activeClassName : ''}`;\r\n\r\n return (\r\n \r\n {option.linkText}\r\n \r\n );\r\n }\r\n\r\n private _renderSpanMenuItem(option: IMenuItemData, index?: number): JSX.Element | null {\r\n const { Span } = this.props;\r\n return (\r\n {option.linkText}\r\n );\r\n }\r\n\r\n private _renderMenu(level: string, menuOptions: JSX.Element[], currentItem?: number): JSX.Element | null {\r\n const { MenuList } = this.props;\r\n this.currentLevel = 1;\r\n return (\r\n \r\n {menuOptions}\r\n \r\n );\r\n }\r\n\r\n private _handleDropdownToggle = (data: IMenuItemData, parentId?: number) => () => {\r\n let activeMenu;\r\n if(this.props.isMobileView) {\r\n activeMenu = (this.state.activeMenu && this.state.activeMenu === data.id!) ? undefined : data.id!;\r\n } else {\r\n activeMenu = data.id;\r\n }\r\n this.setState({\r\n activeMenu,\r\n parentMenu: parentId\r\n });\r\n\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 const burgerMenu:boolean = event.target.className === 'ms-header__nav-icon msc-btn';\r\n if (this.menuNode.current && !this.menuNode.current.contains(event.target) && !burgerMenu) {\r\n this.setState({ navOpen: false });\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\r\nexport default NavigationMenuView;","/*---------------------------------------------------------------------------------------------\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 { IMenuItemData, INavigationMenuViewProps } from '@msdyn365-commerce-modules/navigation-menu';\r\nimport { Module, Node } from '@msdyn365-commerce-modules/utilities';\r\nimport classnames from 'classnames';\r\nimport * as React from 'react';\r\n\r\ninterface INavigationState {\r\n parentMenu?: number;\r\n activeMenu?: number;\r\n mobileViewLabelText?: string;\r\n navOpen: boolean;\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 private supportedLevel: number = 3;\r\n private currentLevel: number = 0;\r\n private menuNode: React.RefObject;\r\n private pathName: string = '';\r\n private activeClassName: string = 'selected';\r\n private activeMenuItem: IMenuItemData = {};\r\n private activeSubMenuItem: IMenuItemData = {};\r\n constructor(props: INavigationMenuViewProps) {\r\n super(props);\r\n this.menuNode = React.createRef();\r\n this.state = { activeMenu: undefined, mobileViewLabelText: '', parentMenu: undefined, navOpen: false };\r\n this._closeSubmenu = this._closeSubmenu.bind(this);\r\n this._onMobNavTrigger = this._onMobNavTrigger.bind(this);\r\n }\r\n\r\n public componentDidMount(): void {\r\n document.body && document.body.addEventListener('click', this._handleClickOutside);\r\n document.body && document.body.addEventListener('keydown', this.trapFocusInsideMenu);\r\n }\r\n public componentWillUnmount(): void {\r\n document.body && document.body.removeEventListener('click', this._handleClickOutside, false);\r\n document.body && document.body.removeEventListener('keydown', this.trapFocusInsideMenu, false);\r\n }\r\n public render(): JSX.Element | null {\r\n const { isMobileView, MenuList, Navigation } = this.props;\r\n // get current pathname\r\n if (process.env.CURRENT_ENVIRONMENT === 'web') {\r\n this.pathName = window.location.pathname;\r\n } else {\r\n this.pathName = this.props.context.request.url.requestUrl.pathname;\r\n }\r\n this.props.menuItemData.forEach((item, index) => {\r\n item.subMenu && item.subMenu.forEach((subItem, subIndex) => {\r\n const subItemPath = this._getPathNameFromURL(subItem.linkURL || '');\r\n if (subItemPath === this.pathName) {\r\n this.activeMenuItem = item;\r\n this.activeSubMenuItem = subItem;\r\n }\r\n });\r\n });\r\n this.currentLevel = 1;\r\n return (\r\n \r\n \r\n \r\n \r\n {this._renderDisplay()}\r\n \r\n \r\n \r\n );\r\n }\r\n\r\n private _getPathNameFromURL(linkURL: string): string {\r\n let pathName = '';\r\n try {\r\n pathName = new URL(linkURL).pathname;\r\n } catch {\r\n pathName = linkURL.split('?')[0];\r\n }\r\n return pathName;\r\n }\r\n private _onMobNavTrigger(): void {\r\n this.setState(state => ({\r\n navOpen: !state.navOpen\r\n }));\r\n }\r\n\r\n private _renderDisplay(): JSX.Element[] {\r\n const { ListItem, menuItemData } = this.props;\r\n const menuItemList: JSX.Element[] = [];\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 return menuItemList;\r\n }\r\n\r\n private _createMenuItemList(menuItemData: IMenuItemData): JSX.Element | null {\r\n if (menuItemData && menuItemData.subMenu && menuItemData.subMenu.length > 0) {\r\n return (\r\n \r\n {this._renderButtonMenuItem(menuItemData)}\r\n \r\n {this._renderSubMenu(menuItemData.subMenu, menuItemData.id)}\r\n \r\n \r\n );\r\n } else if (menuItemData && menuItemData.linkText && menuItemData.linkURL && menuItemData.linkURL.length > 0) {\r\n return (this._renderLinkMenuItem(menuItemData));\r\n } else if (menuItemData && menuItemData.linkText && !menuItemData.linkURL) {\r\n return (this._renderSpanMenuItem(menuItemData));\r\n }\r\n\r\n return null;\r\n }\r\n\r\n private _renderSubMenu(subMenus?: IMenuItemData[], activeMenu?: number): JSX.Element | null {\r\n const { isMobileView, ListItem } = this.props;\r\n if (activeMenu && this.state.activeMenu !== activeMenu && !isMobileView) {\r\n return null;\r\n }\r\n\r\n if (!subMenus || subMenus.length === 0) {\r\n return null;\r\n }\r\n\r\n let levelClassName: string = '';\r\n const menuOptions = subMenus && subMenus.map((option: IMenuItemData, idx: number) => {\r\n const hasOptions = (option.subMenu && option.subMenu.length > 0);\r\n let menuItem: JSX.Element | null;\r\n if (hasOptions && isMobileView) {\r\n menuItem = this._renderButtonMenuItem(option, activeMenu, idx);\r\n } else {\r\n menuItem = (option.linkURL\r\n ? this._renderLinkMenuItem(option, idx)\r\n : this._renderSpanMenuItem(option)\r\n );\r\n }\r\n\r\n let subMenu;\r\n\r\n if (hasOptions) {\r\n this.currentLevel++;\r\n if (this.currentLevel <= this.supportedLevel - 1) {\r\n levelClassName = `level-${this.currentLevel.toString()}`;\r\n subMenu = this._renderSubMenu(option.subMenu, isMobileView ? option.id : undefined);\r\n }\r\n }\r\n\r\n return (\r\n \r\n {menuItem}\r\n {subMenu}\r\n \r\n );\r\n });\r\n\r\n return (this._renderMenu(levelClassName, menuOptions, activeMenu));\r\n }\r\n\r\n private _renderButtonMenuItem(option: IMenuItemData, activeMenu?: number, index?: number): JSX.Element | null {\r\n const { Button } = this.props;\r\n const isActive = option === this.activeMenuItem || option === this.activeSubMenuItem;\r\n const activeClass = `${Button.className} ${isActive ? this.activeClassName : ''}`;\r\n\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;\r\n const isActive = option === this.activeSubMenuItem;\r\n const activeClass = `${Link.className} ${isActive ? this.activeClassName : ''}`;\r\n\r\n return (\r\n \r\n {option.linkText}\r\n \r\n );\r\n }\r\n\r\n private _renderSpanMenuItem(option: IMenuItemData, index?: number): JSX.Element | null {\r\n const { Span } = this.props;\r\n return (\r\n {option.linkText}\r\n );\r\n }\r\n\r\n private _renderMenu(level: string, menuOptions: JSX.Element[], currentItem?: number): JSX.Element | null {\r\n const { MenuList } = this.props;\r\n this.currentLevel = 1;\r\n return (\r\n \r\n {menuOptions}\r\n \r\n );\r\n }\r\n\r\n private _handleDropdownToggle = (data: IMenuItemData, parentId?: number, type?: string) => () => {\r\n if (this.props.isMobileView && type === 'onFocus') {\r\n null;\r\n } else {\r\n let activeMenu = data.id;\r\n if (this.props.isMobileView) {\r\n activeMenu = (this.state.activeMenu && this.state.activeMenu === data.id!) ? undefined : data.id!;\r\n }\r\n\r\n this.setState({\r\n activeMenu,\r\n parentMenu: parentId\r\n });\r\n\r\n this._resetFocus();\r\n }\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 const burgerMenu: boolean = event.target.className === 'ms-header__nav-icon msc-btn';\r\n if (this.menuNode.current && !this.menuNode.current.contains(event.target) && !burgerMenu) {\r\n this.setState({ navOpen: false });\r\n }\r\n this._resetFocus();\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 trapFocusInsideMenu = (event: any) => {\r\n const isTabPressed = event.key === 'Tab';\r\n if (!isTabPressed) {\r\n return;\r\n }\r\n //move forward only if tab key is pressed\r\n const firstFocusableElement: HTMLElement | null = document.getElementsByClassName(\"ms-header__nav-icon msc-btn\").length > 0 ? document.getElementsByClassName(\"ms-header__nav-icon msc-btn\")[0] as HTMLElement : null;\r\n if (document.getElementsByClassName(\"nav-open\").length === 0) {\r\n //Let's return If the navbar is not open\r\n return;\r\n }\r\n else {\r\n let navOpen = document.getElementsByClassName(\"nav-open\")[0];\r\n let lastFocusableElement = null;\r\n //This means the nav bar is open\r\n //lets trap the focus inside the navbar\r\n while (navOpen.children.length > 0) {\r\n const msNavList = navOpen.children;\r\n if (msNavList.length === 1 && msNavList[0].tagName === 'UL') {\r\n const msNavListItem = msNavList[0].children;\r\n if (msNavListItem.length > 0) {\r\n //we have menu items list with us in msNavListItem\r\n const lastMenuItem = msNavListItem[msNavListItem.length - 1];\r\n const submenu = Array.from(lastMenuItem.children);\r\n const subnavShow = submenu.find(s => s.classList.contains(\"subnav-show\"));\r\n if (subnavShow) {\r\n //if we are here then the last menu is open.\r\n //Check for inner submenus\r\n navOpen = subnavShow;\r\n }\r\n else if (submenu[submenu.length - 1].tagName === 'A' && submenu[submenu.length - 1].className.includes(\"ms-nav__list__item__link\")) {\r\n //This means we are at the last menu and there is no further submenu inside it.\r\n lastFocusableElement = submenu[submenu.length - 1];\r\n break;\r\n }\r\n else {\r\n //If we are here then the submenu is not open\r\n lastFocusableElement = Array.from(lastMenuItem.children).find(b=>b.classList.contains(\"ms-nav__list__item__button\"));\r\n break;\r\n }\r\n }\r\n }\r\n }\r\n //We need to see if the focus is on the last sub menu item if so then make the focus to menu open button, Doing so we are traping the focus\r\n //inside the menu.\r\n if (document.activeElement === lastFocusableElement && firstFocusableElement) {\r\n firstFocusableElement.focus();\r\n event.preventDefault();\r\n }\r\n }\r\n };\r\n}\r\n\r\nexport default NavigationMenuView;\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 { IMenuItemData, INavigationMenuViewProps } from '@msdyn365-commerce-modules/navigation-menu';\r\nimport { Module, Node } from '@msdyn365-commerce-modules/utilities';\r\nimport classnames from 'classnames';\r\nimport * as React from 'react';\r\nimport { ISmweNavigationMenuProps } from '../definition-extensions/smwe-navigation-menu.ext.props.autogenerated';\r\n\r\ninterface INavigationState {\r\n parentMenu?: number;\r\n activeMenu?: number;\r\n mobileViewLabelText?: string;\r\n navOpen: boolean;\r\n sideNavOpened: boolean;\r\n}\r\ninterface IMenuItemDataClass extends IMenuItemData {\r\n className?: string;\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, INavigationState> {\r\n private supportedLevel: number = 3;\r\n private currentLevel: number = 0;\r\n private menuNode: React.RefObject;\r\n private pathName: string = '';\r\n private activeClassName: string = 'selected';\r\n private activeMenuItem: IMenuItemData = {};\r\n private activeSubMenuItem: IMenuItemData = {};\r\n\r\n constructor(props: INavigationMenuViewProps & ISmweNavigationMenuProps<{}>) {\r\n super(props);\r\n this.menuNode = React.createRef();\r\n this.state = { activeMenu: undefined, mobileViewLabelText: '', parentMenu: undefined, navOpen: false, sideNavOpened: false };\r\n this._closeSubmenu = this._closeSubmenu.bind(this);\r\n this._onMobNavTrigger = this._onMobNavTrigger.bind(this);\r\n }\r\n\r\n public componentDidMount(): void {\r\n document.body && document.body.addEventListener('click', this._handleClickOutside);\r\n }\r\n\r\n public componentWillUnmount(): void {\r\n document.body && document.body.removeEventListener('click', this._handleClickOutside, false);\r\n }\r\n\r\n public render(): JSX.Element | null {\r\n const { isMobileView, MenuList, Navigation } = this.props;\r\n // get current pathname\r\n if (process.env.CURRENT_ENVIRONMENT === 'web') {\r\n this.pathName = window.location.pathname;\r\n } else {\r\n this.pathName = this.props.context.request.url.requestUrl.pathname;\r\n }\r\n\r\n this.props.menuItemData.forEach((item, index) => {\r\n const ItemPath = this._getPathNameFromURL(item.linkURL || '');\r\n item.subMenu && item.subMenu.forEach((subItem, subIndex) => {\r\n const subItemPath = this._getPathNameFromURL(subItem.linkURL || '');\r\n if (subItemPath === this.pathName) {\r\n this.activeMenuItem = item;\r\n this.activeSubMenuItem = subItem;\r\n }\r\n });\r\n if (ItemPath === this.pathName) {\r\n this.activeMenuItem = item;\r\n }\r\n });\r\n\r\n this.currentLevel = 1;\r\n return (\r\n \r\n \r\n \r\n \r\n {this._renderDisplay()}\r\n \r\n \r\n \r\n );\r\n }\r\n\r\n private _getPathNameFromURL(linkURL: string): string {\r\n let pathName = '';\r\n try {\r\n // if linkURL is a full url\r\n pathName = new URL(linkURL).pathname;\r\n } catch {\r\n pathName = linkURL.split('?')[0];\r\n }\r\n return pathName;\r\n }\r\n\r\n private _onMobNavTrigger(): void {\r\n this.setState(state => ({\r\n sideNavOpened: !state.sideNavOpened\r\n }));\r\n }\r\n\r\n private _renderDisplay(): JSX.Element[] {\r\n const { ListItem, menuItemData } = this.props;\r\n const menuItemList: JSX.Element[] = [];\r\n const isMobileView: boolean = this.props.isMobileView || false;\r\n const expandOnClick: boolean = this.props.config.expandOnClick || true;\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 return menuItemList;\r\n }\r\n\r\n private _createMenuItemList(menuItemData: IMenuItemData): JSX.Element | null {\r\n if (menuItemData && menuItemData.subMenu && menuItemData.subMenu.length > 0) {\r\n if (this.props.isMobileView) {\r\n return (\r\n \r\n {this._renderButtonMenuItem(menuItemData)}\r\n \r\n {this._renderSubMenu(menuItemData.subMenu, menuItemData.id)}\r\n \r\n );\r\n } else {\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 && menuItemData.linkText && menuItemData.linkURL && menuItemData.linkURL.length > 0) {\r\n return (this._renderLinkMenuItem(menuItemData));\r\n } else if (menuItemData && menuItemData.linkText && !menuItemData.linkURL) {\r\n return (this._renderSpanMenuItem(menuItemData));\r\n }\r\n\r\n return null;\r\n }\r\n\r\n private _renderSubMenu(subMenus?: IMenuItemDataClass[], activeMenu?: number): JSX.Element | null {\r\n const { isMobileView, ListItem } = this.props;\r\n if (activeMenu && this.state.activeMenu !== activeMenu && !isMobileView) {\r\n return null;\r\n }\r\n\r\n if (!subMenus || subMenus.length === 0) {\r\n return null;\r\n }\r\n\r\n let levelClassName: string = '';\r\n const menuOptions = subMenus && subMenus.map((option: IMenuItemDataClass, idx: number) => {\r\n const hasOptions = (option.subMenu && option.subMenu.length > 0);\r\n let menuItem: JSX.Element | null;\r\n if (hasOptions && isMobileView) {\r\n menuItem = this._renderButtonMenuItem(option, activeMenu, idx);\r\n } else {\r\n menuItem = (option.linkURL\r\n ? this._renderLinkMenuItem(option, idx)\r\n : this._renderSpanMenuItem(option)\r\n );\r\n }\r\n\r\n let subMenu;\r\n\r\n if (hasOptions) {\r\n this.currentLevel++;\r\n if (this.currentLevel <= this.supportedLevel - 1) {\r\n levelClassName = `level-${this.currentLevel.toString()}`;\r\n subMenu = this._renderSubMenu(option.subMenu, isMobileView ? option.id : undefined);\r\n }\r\n }\r\n\r\n return (\r\n \r\n {menuItem}\r\n {subMenu}\r\n \r\n );\r\n });\r\n\r\n return (this._renderMenu(levelClassName, menuOptions, activeMenu));\r\n }\r\n private _renderButtonMenuItem(option: IMenuItemData, activeMenu?: number, index?: number): JSX.Element | null {\r\n const { Button } = this.props;\r\n const isActive = (option === this.activeMenuItem) || (option === this.activeSubMenuItem);\r\n const activeClass = `${Button.className} ${isActive ? this.activeClassName : ''} ${this.state.activeMenu && this.state.activeMenu === option.id ? 'nav-open' : 'nav-closed'}`;\r\n const isMobileView: boolean = this.props.isMobileView || false;\r\n const expandOnClick: boolean = this.props.config.expandOnClick || true;\r\n\r\n return (\r\n this._mainNavClick(option)}\r\n onMouseEnter={isMobileView || expandOnClick ? false : this._handleDropdownToggle(option, activeMenu)}\r\n aria-haspopup={true}\r\n aria-expanded={this.state.activeMenu && this.state.activeMenu === option.id ? true : false}\r\n data-parent={activeMenu}\r\n role=\"menuitem\"\r\n aria-current={isActive && 'page'}\r\n >\r\n {option.linkText}\r\n \r\n );\r\n }\r\n\r\n private _mainNavClick = (option: IMenuItemData) => {\r\n const link = option.linkURL;\r\n if (link) {\r\n window.location.href = link;\r\n }\r\n };\r\n\r\n private _renderLinkMenuItem(option: IMenuItemData, index?: number): JSX.Element | null {\r\n const { Link } = this.props;\r\n const isActive = (option === this.activeSubMenuItem) || (option === this.activeMenuItem);\r\n const activeClass = `${Link.className} ${isActive ? this.activeClassName : ''}`;\r\n\r\n return (\r\n \r\n {option.linkText}\r\n \r\n );\r\n }\r\n\r\n private _renderSpanMenuItem(option: IMenuItemData, index?: number): JSX.Element | null {\r\n const { Span } = this.props;\r\n return (\r\n {option.linkText}\r\n );\r\n }\r\n\r\n private _renderMenu(level: string, menuOptions: JSX.Element[], currentItem?: number): JSX.Element | null {\r\n const { MenuList } = this.props;\r\n this.currentLevel = 1;\r\n return (\r\n \r\n {menuOptions}\r\n \r\n );\r\n }\r\n\r\n // private _handleFocus = (data: IMenuItemData, parentId?: number) => () => {\r\n // if (!this.props.isMobileView) {\r\n // this.setState({\r\n // activeMenu: data.id!,\r\n // parentMenu: parentId\r\n // });\r\n // }\r\n\r\n // this._resetFocus();\r\n // };\r\n\r\n private _handleDropdownToggle = (data: IMenuItemData, parentId?: number) => () => {\r\n const activeMenu = (this.state.activeMenu && this.state.activeMenu === data.id!) ? undefined : data.id!;\r\n this.setState({\r\n activeMenu,\r\n parentMenu: parentId,\r\n navOpen: true\r\n });\r\n\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 const burgerMenu:boolean = event.target.className === 'ms-header__nav-icon msc-btn';\r\n if (this.menuNode.current && !this.menuNode.current.contains(event.target) && !burgerMenu && !(event.target instanceof HTMLButtonElement || event.target instanceof HTMLAnchorElement)) {\r\n this.setState({ navOpen: false, sideNavOpened: false });\r\n }\r\n };\r\n\r\n private _closeSubmenu(): void {\r\n if (!this.props.isMobileView) {\r\n this.setState({ activeMenu: undefined, mobileViewLabelText: '', navOpen: false });\r\n }\r\n }\r\n}\r\n\r\nexport default NavigationMenuView;","/*---------------------------------------------------------------------------------------------\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 { Module, Node } from '@msdyn365-commerce-modules/utilities';\r\nimport classnames from 'classnames';\r\nimport * as React from 'react';\r\nimport { INavigationMenuViewProps } from '../../../modules/smwe-navigation-menu/./smwe-navigation-menu';\r\nimport { IMenuItemData } from '../../../modules/smwe-navigation-menu/./smwe-navigation-menu.data';\r\nimport { ISmweNavigationMenuProps } from '../definition-extensions/smwe-navigation-menu.ext.props.autogenerated';\r\n\r\ninterface INavigationState {\r\n parentMenu?: number;\r\n activeMenu?: number;\r\n mobileViewLabelText?: string;\r\n navOpen: boolean;\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, INavigationState> {\r\n private supportedLevel: number = 3;\r\n private currentLevel: number = 0;\r\n private menuNode: React.RefObject;\r\n private pathName: string = '';\r\n private activeClassName: string = 'selected';\r\n private activeMenuItem: IMenuItemData = {};\r\n private activeSubMenuItem: IMenuItemData = {};\r\n\r\n constructor(props: INavigationMenuViewProps & ISmweNavigationMenuProps<{}>) {\r\n super(props);\r\n this.menuNode = React.createRef();\r\n this.state = {\r\n activeMenu: undefined,\r\n mobileViewLabelText: '',\r\n parentMenu: undefined,\r\n navOpen: false\r\n };\r\n this._closeSubmenu = this._closeSubmenu.bind(this);\r\n this._onMobNavTrigger = this._onMobNavTrigger.bind(this);\r\n }\r\n\r\n public componentDidMount(): void {\r\n document.body && document.body.addEventListener('mousedown', this._handleClickOutside);\r\n }\r\n\r\n public componentWillUnmount(): void {\r\n document.body && document.body.removeEventListener('mousedown', this._handleClickOutside, false);\r\n }\r\n\r\n public render(): JSX.Element | null {\r\n const { isMobileView, MenuList, Navigation } = this.props;\r\n const className = this.props.config.className;\r\n // get current pathname\r\n if (process.env.CURRENT_ENVIRONMENT === 'web') {\r\n this.pathName = window.location.pathname;\r\n } else {\r\n this.pathName = this.props.context.request.url.requestUrl.pathname;\r\n }\r\n\r\n this.props.menuItemData.forEach((item, index) => {\r\n const ItemPath = this._getPathNameFromURL(item.linkURL || '');\r\n item.subMenu && item.subMenu.forEach((subItem, subIndex) => {\r\n const subItemPath = this._getPathNameFromURL(subItem.linkURL || '');\r\n if (subItemPath === this.pathName) {\r\n this.activeMenuItem = item;\r\n this.activeSubMenuItem = subItem;\r\n }\r\n });\r\n if (ItemPath === this.pathName) {\r\n this.activeMenuItem = item;\r\n }\r\n });\r\n\r\n this.currentLevel = 1;\r\n return (\r\n \r\n \r\n \r\n \r\n {this._renderDisplay()}\r\n \r\n \r\n \r\n );\r\n }\r\n\r\n private _getPathNameFromURL(linkURL: string): string {\r\n let pathName = '';\r\n try {\r\n // if linkURL is a full url\r\n pathName = new URL(linkURL).pathname;\r\n } catch {\r\n pathName = linkURL.split('?')[0];\r\n }\r\n return pathName;\r\n }\r\n\r\n private _onMobNavTrigger(): void {\r\n this.setState(state => ({\r\n navOpen: !state.navOpen\r\n }));\r\n }\r\n\r\n private _renderDisplay(): JSX.Element[] {\r\n const { ListItem, menuItemData } = this.props;\r\n const menuItemList: JSX.Element[] = [];\r\n const isMobileView: boolean = this.props.isMobileView || false;\r\n const expandOnClick: boolean = this.props.config.expandOnClick || false;\r\n\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 return menuItemList;\r\n }\r\n\r\n private _createMenuItemList(menuItemData: IMenuItemData): JSX.Element | null {\r\n if (menuItemData && menuItemData.subMenu && menuItemData.subMenu.length > 0) {\r\n const { openSubmenuItemsNewTab } = this.props.config;\r\n const openInNewTab = (!!openSubmenuItemsNewTab && (openSubmenuItemsNewTab.toLowerCase().includes(menuItemData.linkText!.toLowerCase())));\r\n if (this.props.isMobileView) {\r\n return (\r\n \r\n {this._renderButtonMenuItem(menuItemData)}\r\n \r\n \r\n {this._renderSubMenu(menuItemData.subMenu, menuItemData.id, openInNewTab)}\r\n \r\n );\r\n } else {\r\n return (\r\n \r\n {this._renderButtonMenuItem(menuItemData)}\r\n {this._renderSubMenu(menuItemData.subMenu, menuItemData.id, openInNewTab)}\r\n \r\n );\r\n }\r\n } else if (menuItemData && menuItemData.linkText && menuItemData.linkURL && menuItemData.linkURL.length > 0) {\r\n return (this._renderLinkMenuItem(menuItemData));\r\n } else if (menuItemData && menuItemData.linkText && !menuItemData.linkURL) {\r\n return (this._renderSpanMenuItem(menuItemData));\r\n }\r\n\r\n return null;\r\n }\r\n\r\n private _renderSubMenu(subMenus?: IMenuItemData[], activeMenu?: number, openInNewTab?: boolean): JSX.Element | null {\r\n const { isMobileView, ListItem } = this.props;\r\n\r\n if (!subMenus || subMenus.length === 0) {\r\n return null;\r\n }\r\n\r\n let levelClassName: string = '';\r\n const menuOptions = subMenus && subMenus.map((option: IMenuItemData, idx: number) => {\r\n const hasOptions = (option.subMenu && option.subMenu.length > 0);\r\n let menuItem: JSX.Element | null;\r\n if (hasOptions && isMobileView) {\r\n menuItem = this._renderButtonMenuItem(option, activeMenu, idx);\r\n } else {\r\n menuItem = (option.linkURL\r\n ? this._renderLinkMenuItem(option, idx, openInNewTab)\r\n : this._renderSpanMenuItem(option)\r\n );\r\n }\r\n\r\n let subMenu;\r\n\r\n if (hasOptions) {\r\n this.currentLevel++;\r\n if (this.currentLevel <= this.supportedLevel - 1) {\r\n levelClassName = `level-${this.currentLevel.toString()}`;\r\n subMenu = this._renderSubMenu(option.subMenu, isMobileView ? option.id : undefined, openInNewTab);\r\n }\r\n }\r\n\r\n return (\r\n \r\n {menuItem}\r\n {subMenu}\r\n \r\n );\r\n });\r\n\r\n return this._renderMenu(levelClassName, menuOptions, activeMenu);\r\n }\r\n\r\n private _renderButtonMenuItem(option: IMenuItemData, activeMenu?: number, index?: number): JSX.Element | null {\r\n const { Button } = this.props;\r\n const isActive = (option === this.activeMenuItem) || (option === this.activeSubMenuItem);\r\n const activeClass = `${Button.className} ${isActive ? this.activeClassName : ''}`;\r\n const isMobileView: boolean = this.props.isMobileView || false;\r\n const expandOnClick: boolean = this.props.config.expandOnClick || false;\r\n\r\n return (\r\n this._mainNavClick(option)}\r\n onMouseEnter={isMobileView || expandOnClick ? false : this._handleDropdownToggle(option, activeMenu)}\r\n onFocus={isMobileView || expandOnClick ? this._closeSubmenu : this._handleDropdownToggle(option, activeMenu)}\r\n aria-haspopup={true}\r\n aria-expanded={this.state.activeMenu && this.state.activeMenu === option.id ? true : false}\r\n data-parent={activeMenu}\r\n aria-current={isActive && 'page'}\r\n >\r\n {option.linkText}\r\n \r\n );\r\n }\r\n\r\n private _mainNavClick = (option: IMenuItemData) => {\r\n const link = option.linkURL;\r\n if (link) {\r\n window.location.href = link;\r\n }\r\n };\r\n\r\n private _renderLinkMenuItem(option: IMenuItemData, index?: number, openInNewTab?: boolean): JSX.Element | null {\r\n const { Link } = this.props;\r\n const isActive = (option === this.activeSubMenuItem) || (option === this.activeMenuItem);\r\n\r\n return (\r\n \r\n {option.linkText}\r\n \r\n );\r\n }\r\n\r\n private _renderSpanMenuItem(option: IMenuItemData, index?: number): JSX.Element | null {\r\n const { Span } = this.props;\r\n return (\r\n {option.linkText}\r\n );\r\n }\r\n\r\n private _renderMenu(level: string, menuOptions: JSX.Element[], currentItem?: number): JSX.Element | null {\r\n const { MenuList } = this.props;\r\n this.currentLevel = 1;\r\n\r\n return (\r\n \r\n {level === 'level-2' && currentItem && this._renderSubNavButton(currentItem)}\r\n {menuOptions}\r\n \r\n );\r\n }\r\n\r\n private _renderSubNavButton(currentItem: number): JSX.Element {\r\n return (\r\n \r\n );\r\n }\r\n\r\n private _handleDropdownToggle = (data: IMenuItemData, parentId?: number) => () => {\r\n let activeMenu;\r\n if (this.props.isMobileView) {\r\n activeMenu = (this.state.activeMenu && this.state.activeMenu === data.id!) ? undefined : data.id!;\r\n } else {\r\n activeMenu = data.id;\r\n }\r\n this.setState({\r\n activeMenu,\r\n parentMenu: parentId\r\n });\r\n\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 const burgerMenu: boolean = event.target.className === 'ms-header__nav-icon msc-btn';\r\n\r\n if (this.menuNode.current && !this.menuNode.current.contains(event.target)) {\r\n this.setState({ activeMenu: undefined, mobileViewLabelText: '' });\r\n\r\n if (!burgerMenu) {\r\n this.setState({ navOpen: false });\r\n }\r\n }\r\n };\r\n\r\n private _closeSubmenu(): void {\r\n this.setState({ activeMenu: undefined, mobileViewLabelText: '' });\r\n }\r\n}\r\n\r\nexport default NavigationMenuView;","/*---------------------------------------------------------------------------------------------\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 { Module, Node } from '@msdyn365-commerce-modules/utilities';\r\nimport classnames from 'classnames';\r\nimport * as React from 'react';\r\nimport { INavigationMenuViewProps } from '../../../modules/smwe-navigation-menu/./smwe-navigation-menu';\r\nimport { IMenuItemData } from '../../../modules/smwe-navigation-menu/./smwe-navigation-menu.data';\r\nimport { ISmweNavigationMenuProps } from '../definition-extensions/smwe-navigation-menu.ext.props.autogenerated';\r\n\r\ninterface INavigationState {\r\n parentMenu?: number;\r\n activeMenu?: number;\r\n mobileViewLabelText?: string;\r\n navOpen: boolean;\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, INavigationState> {\r\n private supportedLevel: number = 3;\r\n private currentLevel: number = 0;\r\n private menuNode: React.RefObject;\r\n private pathName: string = '';\r\n private activeClassName: string = 'selected';\r\n private activeMenuItem: IMenuItemData = {};\r\n private activeSubMenuItem: IMenuItemData = {};\r\n\r\n constructor(props: INavigationMenuViewProps & ISmweNavigationMenuProps<{}>) {\r\n super(props);\r\n this.menuNode = React.createRef();\r\n this.state = {\r\n activeMenu: undefined,\r\n mobileViewLabelText: '',\r\n parentMenu: undefined,\r\n navOpen: false\r\n };\r\n this._closeSubmenu = this._closeSubmenu.bind(this);\r\n this._onMobNavTrigger = this._onMobNavTrigger.bind(this);\r\n }\r\n\r\n public componentDidMount(): void {\r\n document.body && document.body.addEventListener('mousedown', this._handleClickOutside);\r\n }\r\n\r\n public componentWillUnmount(): void {\r\n document.body && document.body.removeEventListener('mousedown', this._handleClickOutside, false);\r\n }\r\n\r\n public render(): JSX.Element | null {\r\n const { isMobileView, MenuList, Navigation } = this.props;\r\n const className = this.props.config.className;\r\n // get current pathname\r\n if (process.env.CURRENT_ENVIRONMENT === 'web') {\r\n this.pathName = window.location.pathname;\r\n } else {\r\n this.pathName = this.props.context.request.url.requestUrl.pathname;\r\n }\r\n\r\n this.props.menuItemData.forEach((item, index) => {\r\n const ItemPath = this._getPathNameFromURL(item.linkURL || '');\r\n item.subMenu && item.subMenu.forEach((subItem, subIndex) => {\r\n const subItemPath = this._getPathNameFromURL(subItem.linkURL || '');\r\n if (subItemPath === this.pathName) {\r\n this.activeMenuItem = item;\r\n this.activeSubMenuItem = subItem;\r\n }\r\n });\r\n if (ItemPath === this.pathName) {\r\n this.activeMenuItem = item;\r\n }\r\n });\r\n\r\n this.currentLevel = 1;\r\n return (\r\n \r\n \r\n \r\n \r\n {this._renderDisplay()}\r\n \r\n \r\n \r\n );\r\n }\r\n\r\n private _getPathNameFromURL(linkURL: string): string {\r\n let pathName = '';\r\n try {\r\n // if linkURL is a full url\r\n pathName = new URL(linkURL).pathname;\r\n } catch {\r\n pathName = linkURL.split('?')[0];\r\n }\r\n return pathName;\r\n }\r\n\r\n private _onMobNavTrigger(): void {\r\n this.setState(state => ({\r\n navOpen: !state.navOpen\r\n }));\r\n }\r\n\r\n private _renderDisplay(): JSX.Element[] {\r\n const { ListItem, menuItemData } = this.props;\r\n const menuItemList: JSX.Element[] = [];\r\n const isMobileView: boolean = this.props.isMobileView || false;\r\n const expandOnClick: boolean = this.props.config.expandOnClick || false;\r\n\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 return menuItemList;\r\n }\r\n\r\n private _createMenuItemList(menuItemData: IMenuItemData): JSX.Element | null {\r\n if (menuItemData && menuItemData.subMenu && menuItemData.subMenu.length > 0) {\r\n if (this.props.isMobileView) {\r\n return (\r\n \r\n {this._renderButtonMenuItem(menuItemData)}\r\n \r\n \r\n {this._renderSubMenu(menuItemData.subMenu, menuItemData.id)}\r\n \r\n \r\n );\r\n } else {\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 && menuItemData.linkText && menuItemData.linkURL && menuItemData.linkURL.length > 0) {\r\n return (this._renderLinkMenuItem(menuItemData));\r\n } else if (menuItemData && menuItemData.linkText && !menuItemData.linkURL) {\r\n return (this._renderSpanMenuItem(menuItemData));\r\n }\r\n\r\n return null;\r\n }\r\n\r\n private _renderSubMenu(subMenus?: IMenuItemData[], activeMenu?: number): JSX.Element | null {\r\n const { isMobileView, ListItem } = this.props;\r\n\r\n if (!subMenus || subMenus.length === 0) {\r\n return null;\r\n }\r\n\r\n let levelClassName: string = '';\r\n const menuOptions = subMenus && subMenus.map((option: IMenuItemData, idx: number) => {\r\n const hasOptions = (option.subMenu && option.subMenu.length > 0);\r\n let menuItem: JSX.Element | null;\r\n if (hasOptions && isMobileView) {\r\n menuItem = this._renderButtonMenuItem(option, activeMenu, idx);\r\n } else {\r\n menuItem = (option.linkURL\r\n ? this._renderLinkMenuItem(option, idx)\r\n : this._renderSpanMenuItem(option)\r\n );\r\n }\r\n\r\n let subMenu;\r\n\r\n if (hasOptions) {\r\n this.currentLevel++;\r\n if (this.currentLevel <= this.supportedLevel - 1) {\r\n levelClassName = `level-${this.currentLevel.toString()}`;\r\n subMenu = this._renderSubMenu(option.subMenu, isMobileView ? option.id : undefined);\r\n }\r\n }\r\n\r\n return (\r\n \r\n {menuItem}\r\n {subMenu}\r\n \r\n );\r\n });\r\n\r\n return this._renderMenu(levelClassName, menuOptions, activeMenu);\r\n }\r\n\r\n private _renderButtonMenuItem(option: IMenuItemData, activeMenu?: number, index?: number): JSX.Element | null {\r\n const { Button } = this.props;\r\n const isActive = (option === this.activeMenuItem) || (option === this.activeSubMenuItem);\r\n const activeClass = `${Button.className} ${isActive ? this.activeClassName : ''}`;\r\n const isMobileView: boolean = this.props.isMobileView || false;\r\n const expandOnClick: boolean = this.props.config.expandOnClick || false;\r\n\r\n return (\r\n this._mainNavClick(option)}\r\n onMouseEnter={isMobileView || expandOnClick ? false : this._handleDropdownToggle(option, activeMenu)}\r\n onFocus={isMobileView || expandOnClick ? this._closeSubmenu : this._handleDropdownToggle(option, activeMenu)}\r\n aria-haspopup={true}\r\n aria-expanded={this.state.activeMenu && this.state.activeMenu === option.id ? true : false}\r\n data-parent={activeMenu}\r\n aria-current={isActive && 'page'}\r\n >\r\n {option.linkText}\r\n \r\n );\r\n }\r\n\r\n private _mainNavClick = (option: IMenuItemData) => {\r\n const link = option.linkURL;\r\n if (link) {\r\n window.location.href = link;\r\n }\r\n };\r\n\r\n private _renderLinkMenuItem(option: IMenuItemData, index?: number): JSX.Element | null {\r\n const { Link } = this.props;\r\n const { openSubmenuItemsNewTab } = this.props.config;\r\n const openSubmenuItemsNewTabArray = openSubmenuItemsNewTab && openSubmenuItemsNewTab.split(',');\r\n const openInNewTab = openSubmenuItemsNewTabArray && openSubmenuItemsNewTabArray.find(item => item.toLowerCase() === option.linkText?.toLowerCase());\r\n const isActive = (option === this.activeSubMenuItem) || (option === this.activeMenuItem);\r\n\r\n return (\r\n \r\n {option.imageSource && (\r\n
\r\n {option.linkText}\r\n
\r\n )}\r\n \r\n {option.linkText}\r\n \r\n
\r\n );\r\n }\r\n\r\n private _renderSpanMenuItem(option: IMenuItemData, index?: number): JSX.Element | null {\r\n const { Span } = this.props;\r\n return (\r\n {option.linkText}\r\n );\r\n }\r\n\r\n private _renderMenu(level: string, menuOptions: JSX.Element[], currentItem?: number): JSX.Element | null {\r\n const { MenuList } = this.props;\r\n this.currentLevel = 1;\r\n\r\n return (\r\n \r\n {level === 'level-2' && currentItem && this._renderSubNavButton(currentItem)}\r\n {menuOptions}\r\n \r\n );\r\n }\r\n\r\n private _renderSubNavButton(currentItem: number): JSX.Element {\r\n return (\r\n \r\n );\r\n }\r\n\r\n private _handleDropdownToggle = (data: IMenuItemData, parentId?: number) => () => {\r\n let activeMenu;\r\n if (this.props.isMobileView) {\r\n activeMenu = (this.state.activeMenu && this.state.activeMenu === data.id!) ? undefined : data.id!;\r\n } else {\r\n activeMenu = data.id;\r\n }\r\n this.setState({\r\n activeMenu,\r\n parentMenu: parentId\r\n });\r\n\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 const burgerMenu: boolean = event.target.className === 'ms-header__nav-icon msc-btn';\r\n\r\n if (this.menuNode.current && !this.menuNode.current.contains(event.target)) {\r\n this.setState({ activeMenu: undefined, mobileViewLabelText: '' });\r\n\r\n if (!burgerMenu) {\r\n this.setState({ navOpen: false });\r\n }\r\n }\r\n };\r\n\r\n private _closeSubmenu(): void {\r\n this.setState({ activeMenu: undefined, mobileViewLabelText: '' });\r\n }\r\n}\r\n\r\nexport default NavigationMenuView;\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 { Module, Node } from '@msdyn365-commerce-modules/utilities';\r\nimport classnames from 'classnames';\r\nimport * as React from 'react';\r\nimport { INavigationMenuViewProps } from '../../../modules/smwe-navigation-menu/./smwe-navigation-menu';\r\nimport { IMenuItemData } from '../../../modules/smwe-navigation-menu/./smwe-navigation-menu.data';\r\nimport { ISmweNavigationMenuProps } from '../definition-extensions/smwe-navigation-menu.ext.props.autogenerated';\r\n\r\ninterface INavigationState {\r\n parentMenu?: number;\r\n activeMenu?: number;\r\n mobileViewLabelText?: string;\r\n navOpen: boolean;\r\n}\r\n\r\ninterface IMenuItemDataClass extends IMenuItemData {\r\n className?: string;\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, INavigationState> {\r\n private supportedLevel: number = 3;\r\n private currentLevel: number = 0;\r\n private menuNode: React.RefObject;\r\n private pathName: string = '';\r\n private activeClassName: string = 'selected';\r\n private activeMenuItem: IMenuItemData = {};\r\n private activeSubMenuItem: IMenuItemData = {};\r\n\r\n constructor(props: INavigationMenuViewProps & ISmweNavigationMenuProps<{}>) {\r\n super(props);\r\n this.menuNode = React.createRef();\r\n this.state = { activeMenu: undefined, mobileViewLabelText: '', parentMenu: undefined, navOpen: false };\r\n this._closeSubmenu = this._closeSubmenu.bind(this);\r\n this._onMobNavTrigger = this._onMobNavTrigger.bind(this);\r\n }\r\n\r\n public componentDidMount(): void {\r\n document.body && document.body.addEventListener('mousedown', this._handleClickOutside);\r\n document.body && document.body.addEventListener('keydown', this.trapFocusInsideMenu);\r\n }\r\n\r\n public componentWillUnmount(): void {\r\n document.body && document.body.removeEventListener('mousedown', this._handleClickOutside, false);\r\n document.body && document.body.removeEventListener('keydown', this.trapFocusInsideMenu, false);\r\n }\r\n\r\n public render(): JSX.Element | null {\r\n const { isMobileView, MenuList, Navigation } = this.props;\r\n // get current pathname\r\n if (process.env.CURRENT_ENVIRONMENT === 'web') {\r\n this.pathName = window.location.pathname;\r\n } else {\r\n this.pathName = this.props.context.request.url.requestUrl.pathname;\r\n }\r\n\r\n // for wine-shop links, only \"all wines\" page should make \"wine shop\" link active\r\n // TODO: \"wine shop\" menu link has different behavior, it doesn't get highlighted unless on the \"all wines\" page\r\n\r\n // if (this.pathName.startsWith('/fth/wine-shop/')) {\r\n // if (this.pathName.startsWith('/fth/wine-shop/5637149842.c') || this.pathName.startsWith('/fth/wine-shop/all-wines/5637149843.c')) {\r\n // // get \"wine shop\" menu item\r\n // this.props.menuItemData.forEach((item, index) => {\r\n // if (item.linkURL && item.linkURL.startsWith('/fth/wine-shop/')) {\r\n // this.activeMenuItem = item;\r\n // }\r\n // });\r\n // }\r\n // } else {\r\n this.props.menuItemData.forEach((item, index) => {\r\n const ItemPath = this._getPathNameFromURL(item.linkURL || '');\r\n item.subMenu && item.subMenu.forEach((subItem, subIndex) => {\r\n const subItemPath = this._getPathNameFromURL(subItem.linkURL || '');\r\n if (subItemPath === this.pathName) {\r\n this.activeMenuItem = item;\r\n this.activeSubMenuItem = subItem;\r\n }\r\n });\r\n if (ItemPath === this.pathName) {\r\n this.activeMenuItem = item;\r\n }\r\n });\r\n // }\r\n\r\n this.currentLevel = 1;\r\n return (\r\n \r\n \r\n \r\n \r\n {this._renderDisplay()}\r\n \r\n \r\n \r\n );\r\n }\r\n\r\n private _getPathNameFromURL(linkURL: string): string {\r\n let pathName = '';\r\n try {\r\n // if linkURL is a full url\r\n pathName = new URL(linkURL).pathname;\r\n } catch {\r\n pathName = linkURL.split('?')[0];\r\n }\r\n return pathName;\r\n }\r\n\r\n private _onMobNavTrigger(): void {\r\n this.setState(state => ({\r\n navOpen: !state.navOpen\r\n }));\r\n }\r\n\r\n private _renderDisplay(): JSX.Element[] {\r\n const { ListItem, menuItemData } = this.props;\r\n const menuItemList: JSX.Element[] = [];\r\n const isMobileView: boolean = this.props.isMobileView || false;\r\n const expandOnClick: boolean = this.props.config.expandOnClick || false;\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 return menuItemList;\r\n }\r\n\r\n private _createMenuItemList(menuItemData: IMenuItemData): JSX.Element | null {\r\n if (menuItemData && menuItemData.subMenu && menuItemData.subMenu.length > 0) {\r\n if (this.props.isMobileView) {\r\n return (\r\n \r\n {this._renderButtonMenuItem(menuItemData)}\r\n \r\n {this._renderSubMenu(menuItemData.subMenu, menuItemData.id)}\r\n \r\n );\r\n } else {\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 && menuItemData.linkText && menuItemData.linkURL && menuItemData.linkURL.length > 0) {\r\n return (this._renderLinkMenuItem(menuItemData));\r\n } else if (menuItemData && menuItemData.linkText && !menuItemData.linkURL) {\r\n return (this._renderSpanMenuItem(menuItemData));\r\n }\r\n\r\n return null;\r\n }\r\n\r\n private _renderSubMenu(subMenus?: IMenuItemDataClass[], activeMenu?: number): JSX.Element | null {\r\n const { isMobileView, ListItem } = this.props;\r\n if (activeMenu && this.state.activeMenu !== activeMenu && !isMobileView) {\r\n return null;\r\n }\r\n\r\n if (!subMenus || subMenus.length === 0) {\r\n return null;\r\n }\r\n\r\n let levelClassName: string = '';\r\n const menuOptions = subMenus && subMenus.map((option: IMenuItemDataClass, idx: number) => {\r\n const hasOptions = (option.subMenu && option.subMenu.length > 0);\r\n let menuItem: JSX.Element | null;\r\n if (hasOptions && isMobileView) {\r\n menuItem = this._renderButtonMenuItem(option, activeMenu, idx);\r\n } else {\r\n menuItem = (option.linkURL\r\n ? this._renderLinkMenuItem(option, idx)\r\n : this._renderSpanMenuItem(option)\r\n );\r\n }\r\n\r\n let subMenu;\r\n\r\n if (hasOptions) {\r\n this.currentLevel++;\r\n if (this.currentLevel <= this.supportedLevel - 1) {\r\n levelClassName = `level-${this.currentLevel.toString()}`;\r\n subMenu = this._renderSubMenu(option.subMenu, isMobileView ? option.id : undefined);\r\n }\r\n }\r\n\r\n return (\r\n \r\n {menuItem}\r\n {subMenu}\r\n \r\n );\r\n });\r\n\r\n return (this._renderMenu(levelClassName, menuOptions, activeMenu));\r\n }\r\n\r\n private _renderButtonMenuItem(option: IMenuItemData, activeMenu?: number, index?: number): JSX.Element | null {\r\n const { Button } = this.props;\r\n const isActive = (option === this.activeMenuItem) || (option === this.activeSubMenuItem);\r\n const activeClass = `${Button.className} ${isActive ? this.activeClassName : ''}`;\r\n const isMobileView: boolean = this.props.isMobileView || false;\r\n const expandOnClick: boolean = this.props.config.expandOnClick || false;\r\n\r\n return (\r\n this._mainNavClick(option)}\r\n onMouseEnter={isMobileView || expandOnClick ? false : this._handleDropdownToggle(option, activeMenu)}\r\n aria-haspopup={true}\r\n aria-expanded={this.state.activeMenu && this.state.activeMenu === option.id ? true : false}\r\n data-parent={activeMenu}\r\n aria-current={isActive && 'page'}\r\n >\r\n {option.linkText}{(this.state.navOpen && this.state.activeMenu && this.state.activeMenu === option.id) ? :}\r\n \r\n );\r\n }\r\n\r\n private _mainNavClick = (option: IMenuItemData) => {\r\n const link = option.linkURL;\r\n if (link) {\r\n window.location.href = link;\r\n }\r\n };\r\n\r\n private _renderLinkMenuItem(option: IMenuItemData, index?: number): JSX.Element | null {\r\n const { Link } = this.props;\r\n const isActive = (option === this.activeSubMenuItem) || (option === this.activeMenuItem);\r\n const activeClass = `${Link.className} ${isActive ? this.activeClassName : ''}`;\r\n\r\n return (\r\n \r\n {option.linkText}\r\n \r\n );\r\n }\r\n\r\n private _renderSpanMenuItem(option: IMenuItemData, index?: number): JSX.Element | null {\r\n const { Span } = this.props;\r\n return (\r\n {option.linkText}\r\n );\r\n }\r\n\r\n private _renderMenu(level: string, menuOptions: JSX.Element[], currentItem?: number): JSX.Element | null {\r\n const { MenuList } = this.props;\r\n this.currentLevel = 1;\r\n return (\r\n \r\n {menuOptions}\r\n \r\n );\r\n }\r\n\r\n private _handleDropdownToggle = (data: IMenuItemData, parentId?: number) => () => {\r\n let activeMenu;\r\n if (this.props.isMobileView) {\r\n activeMenu = (this.state.activeMenu && this.state.activeMenu === data.id!) ? undefined : data.id!;\r\n } else {\r\n activeMenu = data.id;\r\n }\r\n this.setState({\r\n activeMenu,\r\n parentMenu: parentId,\r\n navOpen: true\r\n });\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 const burgerMenu: boolean = event.target.className === 'ms-header__nav-icon msc-btn';\r\n if (this.menuNode.current && !this.menuNode.current.contains(event.target)) {\r\n this.setState({ activeMenu: undefined, mobileViewLabelText: '' });\r\n\r\n if (!burgerMenu) {\r\n this.setState({ navOpen: false });\r\n }\r\n }\r\n };\r\n\r\n private _closeSubmenu(): void {\r\n if (!this.props.isMobileView) {\r\n this.setState({ activeMenu: undefined, mobileViewLabelText: '', navOpen: false });\r\n }\r\n }\r\n\r\n private trapFocusInsideMenu = (event: any) => {\r\n const isTabPressed = event.key === 'Tab';\r\n if (!isTabPressed) {\r\n return;\r\n }\r\n //move forward only if tab key is pressed\r\n const firstFocusableElement: HTMLElement | null = document.getElementsByClassName(\"ms-header__nav-icon msc-btn\").length > 0 ? document.getElementsByClassName(\"ms-header__nav-icon msc-btn\")[0] as HTMLElement : null;\r\n if (document.getElementsByClassName(\"nav-open\").length === 0) {\r\n //Let's return If the navbar is not open\r\n return;\r\n }\r\n else {\r\n let navOpen = document.getElementsByClassName(\"nav-open\")[0];\r\n let lastFocusableElement = null;\r\n //This means the nav bar is open\r\n //lets trap the focus inside the navbar\r\n while (navOpen.children.length > 0) {\r\n const msNavList = navOpen.children;\r\n if (msNavList.length === 1 && msNavList[0].tagName === 'UL') {\r\n const msNavListItem = msNavList[0].children;\r\n if (msNavListItem.length > 0) {\r\n //we have menu items list with us in msNavListItem\r\n const lastMenuItem = msNavListItem[msNavListItem.length - 1];\r\n const submenu = Array.from(lastMenuItem.children);\r\n const subnavShow = submenu.find(s => s.classList.contains(\"subnav-show\"));\r\n if (subnavShow) {\r\n //if we are here then the last menu is open.\r\n //Check for inner submenus\r\n navOpen = subnavShow;\r\n }\r\n else if (submenu[submenu.length - 1].tagName === 'A' && submenu[submenu.length - 1].className.includes(\"ms-nav__list__item__link\")) {\r\n //This means we are at the last menu and there is no further submenu inside it.\r\n lastFocusableElement = submenu[submenu.length - 1];\r\n break;\r\n }\r\n else {\r\n //If we are here then the submenu is not open\r\n lastFocusableElement = Array.from(lastMenuItem.children).find(b => b.classList.contains(\"ms-nav__list__item__button\"));\r\n break;\r\n }\r\n }\r\n }\r\n }\r\n //We need to see if the focus is on the last sub menu item if so then make the focus to menu open button, Doing so we are traping the focus\r\n //inside the menu.\r\n if (document.activeElement === lastFocusableElement && firstFocusableElement) {\r\n firstFocusableElement.focus();\r\n event.preventDefault();\r\n }\r\n }\r\n };\r\n}\r\n\r\nexport default NavigationMenuView;","/*---------------------------------------------------------------------------------------------\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 { IMenuItemData, INavigationMenuViewProps } from '@msdyn365-commerce-modules/navigation-menu';\r\nimport { Module, Node } from '@msdyn365-commerce-modules/utilities';\r\nimport classnames from 'classnames';\r\nimport * as React from 'react';\r\n\r\ninterface INavigationState {\r\n parentMenu?: number;\r\n activeMenu?: number;\r\n mobileViewLabelText?: string;\r\n navOpen: boolean;\r\n}\r\n\r\ninterface IMenuItemDataClass extends IMenuItemData {\r\n className?: string;\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 private supportedLevel: number = 3;\r\n private currentLevel: number = 0;\r\n private menuNode: React.RefObject;\r\n private pathName: string = '';\r\n private activeClassName: string = 'selected';\r\n private activeMenuItem: IMenuItemData = {};\r\n private activeSubMenuItem: IMenuItemData = {};\r\n\r\n constructor(props: INavigationMenuViewProps) {\r\n super(props);\r\n this.menuNode = React.createRef();\r\n this.state = { activeMenu: undefined, mobileViewLabelText: '', parentMenu: undefined, navOpen: false };\r\n this._closeSubmenu = this._closeSubmenu.bind(this);\r\n this._onMobNavTrigger = this._onMobNavTrigger.bind(this);\r\n }\r\n\r\n public componentDidMount(): void {\r\n document.body && document.body.addEventListener('mousedown', this._handleClickOutside);\r\n }\r\n\r\n public componentWillUnmount(): void {\r\n document.body && document.body.removeEventListener('mousedown', this._handleClickOutside, false);\r\n }\r\n\r\n public render(): JSX.Element | null {\r\n const { isMobileView, MenuList, Navigation } = this.props;\r\n // get current pathname\r\n if (process.env.CURRENT_ENVIRONMENT === 'web') {\r\n this.pathName = window.location.pathname;\r\n } else {\r\n this.pathName = this.props.context.request.url.requestUrl.pathname;\r\n }\r\n\r\n // for wine-shop links, only \"all wines\" page should make \"wine shop\" link active\r\n // TODO: \"wine shop\" menu link has different behavior, it doesn't get highlighted unless on the \"all wines\" page\r\n\r\n // if (this.pathName.startsWith('/fth/wine-shop/')) {\r\n // if (this.pathName.startsWith('/fth/wine-shop/5637149842.c') || this.pathName.startsWith('/fth/wine-shop/all-wines/5637149843.c')) {\r\n // // get \"wine shop\" menu item\r\n // this.props.menuItemData.forEach((item, index) => {\r\n // if (item.linkURL && item.linkURL.startsWith('/fth/wine-shop/')) {\r\n // this.activeMenuItem = item;\r\n // }\r\n // });\r\n // }\r\n // } else {\r\n this.props.menuItemData.forEach((item, index) => {\r\n const ItemPath = this._getPathNameFromURL(item.linkURL || '');\r\n item.subMenu && item.subMenu.forEach((subItem, subIndex) => {\r\n const subItemPath = this._getPathNameFromURL(subItem.linkURL || '');\r\n if (subItemPath === this.pathName) {\r\n this.activeMenuItem = item;\r\n this.activeSubMenuItem = subItem;\r\n }\r\n });\r\n if (ItemPath === this.pathName) {\r\n this.activeMenuItem = item;\r\n }\r\n });\r\n // }\r\n\r\n this.currentLevel = 1;\r\n return (\r\n \r\n \r\n \r\n \r\n {this._renderDisplay()}\r\n \r\n \r\n \r\n );\r\n }\r\n\r\n private _getPathNameFromURL(linkURL: string): string {\r\n let pathName = '';\r\n try {\r\n // if linkURL is a full url\r\n pathName = new URL(linkURL).pathname;\r\n } catch {\r\n pathName = linkURL.split('?')[0];\r\n }\r\n return pathName;\r\n }\r\n\r\n private _onMobNavTrigger(): void {\r\n this.setState(state => ({\r\n navOpen: !state.navOpen\r\n }));\r\n }\r\n\r\n private _renderDisplay(): JSX.Element[] {\r\n const { ListItem, menuItemData } = this.props;\r\n const menuItemList: JSX.Element[] = [];\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 return menuItemList;\r\n }\r\n\r\n private _createMenuItemList(menuItemData: IMenuItemData): JSX.Element | null {\r\n if (menuItemData && menuItemData.subMenu && menuItemData.subMenu.length > 0) {\r\n if (this.props.isMobileView) {\r\n return (\r\n \r\n {this._renderButtonMenuItem(menuItemData)}\r\n \r\n {this._renderSubMenu(menuItemData.subMenu, menuItemData.id)}\r\n \r\n );\r\n } else {\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 && menuItemData.linkText && menuItemData.linkURL && menuItemData.linkURL.length > 0) {\r\n return (this._renderLinkMenuItem(menuItemData));\r\n } else if (menuItemData && menuItemData.linkText && !menuItemData.linkURL) {\r\n return (this._renderSpanMenuItem(menuItemData));\r\n }\r\n\r\n return null;\r\n }\r\n\r\n private _renderSubMenu(subMenus?: IMenuItemDataClass[], activeMenu?: number): JSX.Element | null {\r\n const { isMobileView, ListItem } = this.props;\r\n if (activeMenu && this.state.activeMenu !== activeMenu && !isMobileView) {\r\n return null;\r\n }\r\n\r\n if (!subMenus || subMenus.length === 0) {\r\n return null;\r\n }\r\n\r\n let levelClassName: string = '';\r\n const menuOptions = subMenus && subMenus.map((option: IMenuItemDataClass, idx: number) => {\r\n const hasOptions = (option.subMenu && option.subMenu.length > 0);\r\n let menuItem: JSX.Element | null;\r\n if (hasOptions && isMobileView) {\r\n menuItem = this._renderButtonMenuItem(option, activeMenu, idx);\r\n } else {\r\n menuItem = (option.linkURL\r\n ? this._renderLinkMenuItem(option, idx)\r\n : this._renderSpanMenuItem(option)\r\n );\r\n }\r\n\r\n let subMenu;\r\n\r\n if (hasOptions) {\r\n this.currentLevel++;\r\n if (this.currentLevel <= this.supportedLevel - 1) {\r\n levelClassName = `level-${this.currentLevel.toString()}`;\r\n subMenu = this._renderSubMenu(option.subMenu, isMobileView ? option.id : undefined);\r\n }\r\n }\r\n\r\n return (\r\n \r\n {menuItem}\r\n {subMenu}\r\n \r\n );\r\n });\r\n\r\n return (this._renderMenu(levelClassName, menuOptions, activeMenu));\r\n }\r\n\r\n private _renderButtonMenuItem(option: IMenuItemData, activeMenu?: number, index?: number): JSX.Element | null {\r\n const { Button } = this.props;\r\n const isActive = (option === this.activeMenuItem) || (option === this.activeSubMenuItem);\r\n const activeClass = `${Button.className} ${isActive ? this.activeClassName : ''}`;\r\n\r\n return (\r\n this._mainNavClick(option) : this._handleDropdownToggle(option, activeMenu)}\r\n onMouseEnter={!this.props.isMobileView ? this._handleDropdownToggle(option, activeMenu) : false}\r\n onFocus={!this.props.isMobileView ? this._handleDropdownToggle(option, activeMenu) : false}\r\n aria-haspopup={true}\r\n aria-expanded={this.state.activeMenu && this.state.activeMenu === option.id ? true : false}\r\n data-parent={activeMenu}\r\n aria-current={isActive && 'page'}\r\n >\r\n {option.linkText}\r\n \r\n );\r\n }\r\n\r\n private _mainNavClick = (option: IMenuItemData) => {\r\n const link = option.linkURL;\r\n if (link) {\r\n window.location.href = link;\r\n }\r\n };\r\n\r\n private _renderLinkMenuItem(option: IMenuItemData, index?: number): JSX.Element | null {\r\n const { Link } = this.props;\r\n const isActive = (option === this.activeSubMenuItem) || (option === this.activeMenuItem);\r\n const activeClass = `${Link.className} ${isActive ? this.activeClassName : ''}`;\r\n\r\n return (\r\n \r\n {option.linkText}\r\n \r\n );\r\n }\r\n\r\n private _renderSpanMenuItem(option: IMenuItemData, index?: number): JSX.Element | null {\r\n const { Span } = this.props;\r\n return (\r\n {option.linkText}\r\n );\r\n }\r\n\r\n private _renderMenu(level: string, menuOptions: JSX.Element[], currentItem?: number): JSX.Element | null {\r\n const { MenuList } = this.props;\r\n this.currentLevel = 1;\r\n return (\r\n \r\n {menuOptions}\r\n \r\n );\r\n }\r\n\r\n private _handleDropdownToggle = (data: IMenuItemData, parentId?: number) => () => {\r\n let activeMenu;\r\n if(this.props.isMobileView) {\r\n activeMenu = (this.state.activeMenu && this.state.activeMenu === data.id!) ? undefined : data.id!;\r\n } else {\r\n activeMenu = data.id;\r\n }\r\n this.setState({\r\n activeMenu,\r\n parentMenu: parentId\r\n });\r\n\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 const burgerMenu:boolean = event.target.className === 'ms-header__nav-icon msc-btn';\r\n if (this.menuNode.current && !this.menuNode.current.contains(event.target) && !burgerMenu) {\r\n this.setState({ navOpen: false });\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\r\nexport default NavigationMenuView;","/*---------------------------------------------------------------------------------------------\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 { Module, Node } from '@msdyn365-commerce-modules/utilities';\r\nimport classnames from 'classnames';\r\nimport * as React from 'react';\r\nimport { INavigationMenuViewProps } from '../../../modules/smwe-navigation-menu/./smwe-navigation-menu';\r\nimport { IMenuItemData } from '../../../modules/smwe-navigation-menu/./smwe-navigation-menu.data';\r\nimport { ISmweNavigationMenuProps } from '../definition-extensions/smwe-navigation-menu.ext.props.autogenerated';\r\n\r\ninterface INavigationState {\r\n parentMenu?: number;\r\n activeMenu?: number;\r\n mobileViewLabelText?: string;\r\n navOpen: boolean;\r\n}\r\n\r\ninterface IMenuItemDataClass extends IMenuItemData {\r\n className?: string;\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, INavigationState> {\r\n private supportedLevel: number = 3;\r\n private currentLevel: number = 0;\r\n private menuNode: React.RefObject;\r\n private pathName: string = '';\r\n private activeClassName: string = 'selected';\r\n private activeMenuItem: IMenuItemData = {};\r\n private activeSubMenuItem: IMenuItemData = {};\r\n\r\n constructor(props: INavigationMenuViewProps & ISmweNavigationMenuProps<{}>) {\r\n super(props);\r\n this.menuNode = React.createRef();\r\n this.state = { activeMenu: undefined, mobileViewLabelText: '', parentMenu: undefined, navOpen: false };\r\n this._closeSubmenu = this._closeSubmenu.bind(this);\r\n this._onMobNavTrigger = this._onMobNavTrigger.bind(this);\r\n }\r\n\r\n public componentDidMount(): void {\r\n document.body && document.body.addEventListener('mousedown', this._handleClickOutside);\r\n }\r\n\r\n public componentWillUnmount(): void {\r\n document.body && document.body.removeEventListener('mousedown', this._handleClickOutside, false);\r\n }\r\n\r\n public render(): JSX.Element | null {\r\n const { isMobileView, MenuList, Navigation } = this.props;\r\n // get current pathname\r\n if (process.env.CURRENT_ENVIRONMENT === 'web') {\r\n this.pathName = window.location.pathname;\r\n } else {\r\n this.pathName = this.props.context.request.url.requestUrl.pathname;\r\n }\r\n\r\n // for wine-shop links, only \"all wines\" page should make \"wine shop\" link active\r\n // TODO: \"wine shop\" menu link has different behavior, it doesn't get highlighted unless on the \"all wines\" page\r\n\r\n // if (this.pathName.startsWith('/fth/wine-shop/')) {\r\n // if (this.pathName.startsWith('/fth/wine-shop/5637149842.c') || this.pathName.startsWith('/fth/wine-shop/all-wines/5637149843.c')) {\r\n // // get \"wine shop\" menu item\r\n // this.props.menuItemData.forEach((item, index) => {\r\n // if (item.linkURL && item.linkURL.startsWith('/fth/wine-shop/')) {\r\n // this.activeMenuItem = item;\r\n // }\r\n // });\r\n // }\r\n // } else {\r\n this.props.menuItemData.forEach((item, index) => {\r\n const ItemPath = this._getPathNameFromURL(item.linkURL || '');\r\n item.subMenu && item.subMenu.forEach((subItem, subIndex) => {\r\n const subItemPath = this._getPathNameFromURL(subItem.linkURL || '');\r\n if (subItemPath === this.pathName) {\r\n this.activeMenuItem = item;\r\n this.activeSubMenuItem = subItem;\r\n }\r\n });\r\n if (ItemPath === this.pathName) {\r\n this.activeMenuItem = item;\r\n }\r\n });\r\n // }\r\n\r\n this.currentLevel = 1;\r\n return (\r\n \r\n \r\n \r\n \r\n {this._renderDisplay()}\r\n \r\n \r\n \r\n );\r\n }\r\n\r\n private _getPathNameFromURL(linkURL: string): string {\r\n let pathName = '';\r\n try {\r\n // if linkURL is a full url\r\n pathName = new URL(linkURL).pathname;\r\n } catch {\r\n pathName = linkURL.split('?')[0];\r\n }\r\n return pathName;\r\n }\r\n\r\n private _onMobNavTrigger(): void {\r\n this.setState(state => ({\r\n navOpen: !state.navOpen\r\n }));\r\n }\r\n\r\n private _renderDisplay(): JSX.Element[] {\r\n const { ListItem, menuItemData } = this.props;\r\n const menuItemList: JSX.Element[] = [];\r\n const isMobileView: boolean = this.props.isMobileView || false;\r\n const expandOnClick: boolean = this.props.config.expandOnClick || false;\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 return menuItemList;\r\n }\r\n\r\n private _createMenuItemList(menuItemData: IMenuItemData): JSX.Element | null {\r\n if (menuItemData && menuItemData.subMenu && menuItemData.subMenu.length > 0) {\r\n if (this.props.isMobileView) {\r\n return (\r\n \r\n {this._renderButtonMenuItem(menuItemData)}\r\n \r\n {this._renderSubMenu(menuItemData.subMenu, menuItemData.id)}\r\n \r\n );\r\n } else {\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 && menuItemData.linkText && menuItemData.linkURL && menuItemData.linkURL.length > 0) {\r\n return (this._renderLinkMenuItem(menuItemData));\r\n } else if (menuItemData && menuItemData.linkText && !menuItemData.linkURL) {\r\n return (this._renderSpanMenuItem(menuItemData));\r\n }\r\n\r\n return null;\r\n }\r\n\r\n private _renderSubMenu(subMenus?: IMenuItemDataClass[], activeMenu?: number): JSX.Element | null {\r\n const { isMobileView, ListItem } = this.props;\r\n if (activeMenu && this.state.activeMenu !== activeMenu && !isMobileView) {\r\n return null;\r\n }\r\n\r\n if (!subMenus || subMenus.length === 0) {\r\n return null;\r\n }\r\n\r\n let levelClassName: string = '';\r\n const menuOptions = subMenus && subMenus.map((option: IMenuItemDataClass, idx: number) => {\r\n const hasOptions = (option.subMenu && option.subMenu.length > 0);\r\n let menuItem: JSX.Element | null;\r\n if (hasOptions && isMobileView) {\r\n menuItem = this._renderButtonMenuItem(option, activeMenu, idx);\r\n } else {\r\n menuItem = (option.linkURL\r\n ? this._renderLinkMenuItem(option, idx)\r\n : this._renderSpanMenuItem(option)\r\n );\r\n }\r\n\r\n let subMenu;\r\n\r\n if (hasOptions) {\r\n this.currentLevel++;\r\n if (this.currentLevel <= this.supportedLevel - 1) {\r\n levelClassName = `level-${this.currentLevel.toString()}`;\r\n subMenu = this._renderSubMenu(option.subMenu, isMobileView ? option.id : undefined);\r\n }\r\n }\r\n\r\n return (\r\n \r\n {menuItem}\r\n {subMenu}\r\n \r\n );\r\n });\r\n\r\n return (this._renderMenu(levelClassName, menuOptions, activeMenu));\r\n }\r\n\r\n private _renderButtonMenuItem(option: IMenuItemData, activeMenu?: number, index?: number): JSX.Element | null {\r\n const { Button } = this.props;\r\n const isActive = (option === this.activeMenuItem) || (option === this.activeSubMenuItem);\r\n const activeClass = `${Button.className} ${isActive ? this.activeClassName : ''}`;\r\n const isMobileView: boolean = this.props.isMobileView || false;\r\n const expandOnClick: boolean = this.props.config.expandOnClick || false;\r\n\r\n return (\r\n this._mainNavClick(option)}\r\n onMouseEnter={isMobileView || expandOnClick ? false : this._handleDropdownToggle(option, activeMenu)}\r\n aria-haspopup={true}\r\n aria-expanded={this.state.activeMenu && this.state.activeMenu === option.id ? true : false}\r\n data-parent={activeMenu}\r\n role=\"menuitem\"\r\n aria-current={isActive && 'page'}\r\n >\r\n {option.linkText}{(this.state.navOpen && this.state.activeMenu && this.state.activeMenu === option.id) ? :}\r\n \r\n );\r\n }\r\n\r\n private _mainNavClick = (option: IMenuItemData) => {\r\n const link = option.linkURL;\r\n if (link) {\r\n window.location.href = link;\r\n }\r\n };\r\n\r\n private _renderLinkMenuItem(option: IMenuItemData, index?: number): JSX.Element | null {\r\n const { Link } = this.props;\r\n const isActive = (option === this.activeSubMenuItem) || (option === this.activeMenuItem);\r\n const activeClass = `${Link.className} ${isActive ? this.activeClassName : ''}`;\r\n\r\n return (\r\n \r\n {option.linkText}\r\n \r\n );\r\n }\r\n\r\n private _renderSpanMenuItem(option: IMenuItemData, index?: number): JSX.Element | null {\r\n const { Span } = this.props;\r\n return (\r\n {option.linkText}\r\n );\r\n }\r\n\r\n private _renderMenu(level: string, menuOptions: JSX.Element[], currentItem?: number): JSX.Element | null {\r\n const { MenuList } = this.props;\r\n this.currentLevel = 1;\r\n return (\r\n \r\n {menuOptions}\r\n \r\n );\r\n }\r\n\r\n private _handleDropdownToggle = (data: IMenuItemData, parentId?: number) => () => {\r\n let activeMenu;\r\n if(this.props.isMobileView) {\r\n activeMenu = (this.state.activeMenu && this.state.activeMenu === data.id!) ? undefined : data.id!;\r\n } else {\r\n activeMenu = data.id;\r\n }\r\n this.setState({\r\n activeMenu,\r\n parentMenu: parentId,\r\n navOpen: true\r\n });\r\n\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 const burgerMenu:boolean = event.target.className === 'ms-header__nav-icon msc-btn';\r\n if (this.menuNode.current && !this.menuNode.current.contains(event.target)) {\r\n this.setState({ activeMenu: undefined, mobileViewLabelText: '' });\r\n\r\n if (!burgerMenu) {\r\n this.setState({ navOpen: false });\r\n }\r\n }\r\n };\r\n\r\n private _closeSubmenu(): void {\r\n if (!this.props.isMobileView) {\r\n this.setState({ activeMenu: undefined, mobileViewLabelText: '', navOpen: false });\r\n }\r\n }\r\n}\r\n\r\nexport default NavigationMenuView;","/*---------------------------------------------------------------------------------------------\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 { Module, Node } from '@msdyn365-commerce-modules/utilities';\r\nimport classnames from 'classnames';\r\nimport * as React from 'react';\r\nimport { INavigationMenuViewProps } from '../../../modules/smwe-navigation-menu/./smwe-navigation-menu';\r\nimport { IMenuItemData } from '../../../modules/smwe-navigation-menu/./smwe-navigation-menu.data';\r\nimport { ISmweNavigationMenuProps } from '../definition-extensions/smwe-navigation-menu.ext.props.autogenerated';\r\n\r\ninterface INavigationState {\r\n parentMenu?: number;\r\n activeMenu?: number;\r\n mobileViewLabelText?: string;\r\n navOpen: boolean;\r\n}\r\n\r\ninterface IMenuItemDataClass extends IMenuItemData {\r\n className?: string;\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, INavigationState> {\r\n private supportedLevel: number = 3;\r\n private currentLevel: number = 0;\r\n private menuNode: React.RefObject;\r\n private pathName: string = '';\r\n private activeClassName: string = 'selected';\r\n private activeMenuItem: IMenuItemData = {};\r\n private activeSubMenuItem: IMenuItemData = {};\r\n\r\n constructor(props: INavigationMenuViewProps & ISmweNavigationMenuProps<{}>) {\r\n super(props);\r\n this.menuNode = React.createRef();\r\n this.state = {\r\n activeMenu: undefined,\r\n mobileViewLabelText: '',\r\n parentMenu: undefined,\r\n navOpen: false\r\n };\r\n this._closeSubmenu = this._closeSubmenu.bind(this);\r\n this._onMobNavOpen = this._onMobNavOpen.bind(this);\r\n this._onMobNavClose = this._onMobNavClose.bind(this);\r\n }\r\n\r\n public componentDidMount(): void {\r\n document.getElementById('ms-header__subnav-fade')?.addEventListener('mousedown', this._handleClickOutside);\r\n }\r\n\r\n public componentWillUnmount(): void {\r\n document.getElementById('ms-header__subnav-fade')?.removeEventListener('mousedown', this._handleClickOutside, false);\r\n }\r\n\r\n public render(): JSX.Element | null {\r\n const { isMobileView, MenuList, Navigation } = this.props;\r\n const className = this.props.config.className;\r\n // get current pathname\r\n if (process.env.CURRENT_ENVIRONMENT === 'web') {\r\n this.pathName = window.location.pathname;\r\n } else {\r\n this.pathName = this.props.context.request.url.requestUrl.pathname;\r\n }\r\n\r\n this.props.menuItemData.forEach((item, index) => {\r\n const ItemPath = this._getPathNameFromURL(item.linkURL || '');\r\n item.subMenu && item.subMenu.forEach((subItem, subIndex) => {\r\n const subItemPath = this._getPathNameFromURL(subItem.linkURL || '');\r\n if (subItemPath === this.pathName) {\r\n this.activeMenuItem = item;\r\n this.activeSubMenuItem = subItem;\r\n }\r\n });\r\n if (ItemPath === this.pathName) {\r\n this.activeMenuItem = item;\r\n }\r\n });\r\n\r\n this.currentLevel = 1;\r\n return (\r\n \r\n \r\n \r\n \r\n {this._renderDisplay()}\r\n \r\n \r\n
\r\n
\r\n \r\n );\r\n }\r\n\r\n private _getPathNameFromURL(linkURL: string): string {\r\n let pathName = '';\r\n try {\r\n // if linkURL is a full url\r\n pathName = new URL(linkURL).pathname;\r\n } catch {\r\n pathName = linkURL.split('?')[0];\r\n }\r\n return pathName;\r\n }\r\n\r\n private _onMobNavOpen(): void {\r\n const firstNavItem = this.props.menuItemData[0]?.id;\r\n\r\n this.setState({\r\n activeMenu: firstNavItem || undefined,\r\n navOpen: true\r\n });\r\n this._addFixedBodyPosition();\r\n }\r\n\r\n private _onMobNavClose(): void {\r\n this.setState({\r\n activeMenu: undefined,\r\n navOpen: false\r\n });\r\n this._removeFixedBodyPosition();\r\n }\r\n\r\n private _renderDisplay(): JSX.Element[] {\r\n const { ListItem, menuItemData } = this.props;\r\n const menuItemList: JSX.Element[] = [];\r\n const isMobileView: boolean = this.props.isMobileView || false;\r\n const expandOnClick: boolean = this.props.config.expandOnClick || false;\r\n\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 return menuItemList;\r\n }\r\n\r\n private _createMenuItemList(menuItemData: IMenuItemData): JSX.Element | null {\r\n if (menuItemData && menuItemData.subMenu && menuItemData.subMenu.length > 0) {\r\n return (\r\n \r\n {this._renderButtonMenuItem(menuItemData)}\r\n {this._renderSubMenu(menuItemData.subMenu, menuItemData.id)}\r\n \r\n );\r\n } else if (menuItemData && menuItemData.linkText && menuItemData.linkURL && menuItemData.linkURL.length > 0) {\r\n return (this._renderLinkMenuItem(menuItemData));\r\n } else if (menuItemData && menuItemData.linkText && !menuItemData.linkURL) {\r\n return (this._renderSpanMenuItem(menuItemData));\r\n }\r\n\r\n return null;\r\n }\r\n\r\n private _renderSubMenu(subMenus?: IMenuItemDataClass[], activeMenu?: number, openInNewTab?: boolean): JSX.Element | null {\r\n const { isMobileView, ListItem } = this.props;\r\n\r\n if (!subMenus || subMenus.length === 0) {\r\n return null;\r\n }\r\n\r\n let levelClassName: string = '';\r\n const menuOptions = subMenus && subMenus.map((option: IMenuItemDataClass, idx: number) => {\r\n const hasOptions = (option.subMenu && option.subMenu.length > 0);\r\n let menuItem: JSX.Element | null;\r\n if (hasOptions) {\r\n menuItem = this._renderButtonMenuItem(option, activeMenu, idx);\r\n } else {\r\n menuItem = (option.linkURL\r\n ? this._renderLinkMenuItem(option, idx, openInNewTab)\r\n : this._renderSpanMenuItem(option)\r\n );\r\n }\r\n\r\n let subMenu;\r\n\r\n if (hasOptions) {\r\n this.currentLevel++;\r\n if (this.currentLevel <= this.supportedLevel - 1) {\r\n levelClassName = `level-${this.currentLevel.toString()}`;\r\n subMenu = this._renderSubMenu(option.subMenu, isMobileView ? option.id : undefined, openInNewTab);\r\n }\r\n }\r\n\r\n return (\r\n \r\n {menuItem}\r\n {subMenu}\r\n \r\n );\r\n });\r\n\r\n return this._renderMenu(levelClassName, menuOptions, activeMenu);\r\n }\r\n\r\n private _renderButtonMenuItem(option: IMenuItemData, activeMenu?: number, index?: number): JSX.Element | null {\r\n const { Button } = this.props;\r\n const isActive = (option === this.activeMenuItem) || (option === this.activeSubMenuItem);\r\n const activeClass = `${Button.className} ${isActive ? this.activeClassName : ''}`;\r\n const isMobileView: boolean = this.props.isMobileView || false;\r\n const expandOnClick: boolean = this.props.config.expandOnClick || false;\r\n\r\n return (\r\n this._mainNavClick(option)}\r\n onMouseEnter={isMobileView || expandOnClick ? false : this._handleDropdownToggle(option, activeMenu)}\r\n aria-haspopup={true}\r\n aria-expanded={this.state.activeMenu && this.state.activeMenu === option.id ? true : false}\r\n data-parent={activeMenu}\r\n aria-current={isActive && 'page'}\r\n >\r\n {option.linkText}\r\n \r\n );\r\n }\r\n\r\n private _mainNavClick = (option: IMenuItemData) => {\r\n const link = option.linkURL;\r\n if (link) {\r\n window.location.href = link;\r\n }\r\n };\r\n\r\n private _renderLinkMenuItem(option: IMenuItemData, index?: number, openInNewTab?: boolean): JSX.Element | null {\r\n const { Link } = this.props;\r\n const isActive = (option === this.activeSubMenuItem) || (option === this.activeMenuItem);\r\n\r\n return (\r\n \r\n {option.linkText}\r\n \r\n );\r\n }\r\n\r\n private _renderSpanMenuItem(option: IMenuItemData, index?: number): JSX.Element | null {\r\n const { Span } = this.props;\r\n return (\r\n {option.linkText}\r\n );\r\n }\r\n\r\n private _renderMenu(level: string, menuOptions: JSX.Element[], currentItem?: number): JSX.Element | null {\r\n const { MenuList } = this.props;\r\n this.currentLevel = 1;\r\n\r\n return (\r\n \r\n {menuOptions}\r\n \r\n );\r\n }\r\n\r\n private _handleDropdownToggle = (data: IMenuItemData, parentId?: number) => () => {\r\n const activeMenu = data.id;\r\n this.setState({\r\n activeMenu,\r\n parentMenu: parentId,\r\n navOpen: true\r\n });\r\n this._addFixedBodyPosition();\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 const burgerMenu: boolean = event.target.className === 'ms-header__nav-icon';\r\n\r\n if (this.menuNode.current && !this.menuNode.current.contains(event.target)) {\r\n this.setState({ activeMenu: undefined, mobileViewLabelText: '' });\r\n\r\n if (!burgerMenu) {\r\n this.setState({ navOpen: false });\r\n }\r\n }\r\n\r\n this._removeFixedBodyPosition();\r\n this._resetFocus();\r\n };\r\n\r\n private _closeSubmenu(): void {\r\n this.setState({\r\n activeMenu: undefined,\r\n mobileViewLabelText: '',\r\n navOpen: false\r\n });\r\n this._removeFixedBodyPosition();\r\n this._resetFocus();\r\n }\r\n\r\n private _addFixedBodyPosition(): void {\r\n document.body?.classList.add('fixed');\r\n }\r\n\r\n private _removeFixedBodyPosition(): void {\r\n document.body?.classList.remove('fixed');\r\n }\r\n}\r\n\r\nexport default NavigationMenuView;\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 { Module, Node } from '@msdyn365-commerce-modules/utilities';\r\nimport msdyn365Commerce from '@msdyn365-commerce/core-internal';\r\nimport classnames from 'classnames';\r\nimport * as React from 'react';\r\nimport { INavigationMenuViewProps } from '../../../modules/smwe-navigation-menu/./smwe-navigation-menu';\r\nimport { IMenuItemData } from '../../../modules/smwe-navigation-menu/./smwe-navigation-menu.data';\r\nimport { ISmweNavigationMenuProps } from '../definition-extensions/smwe-navigation-menu.ext.props.autogenerated';\r\n\r\ninterface INavigationState {\r\n parentMenu?: number;\r\n activeMenu?: number;\r\n mobileViewLabelText?: string;\r\n menuHeight?: number;\r\n initialMenuItem?: number;\r\n navOpen: boolean;\r\n}\r\n\r\ninterface IMenuItemDataClass extends IMenuItemData {\r\n className?: string;\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, INavigationState> {\r\n private supportedLevel: number = 3;\r\n private currentLevel: number = 0;\r\n private menuNode: React.RefObject;\r\n private pathName: string = '';\r\n private activeClassName: string = 'selected';\r\n private activeMenuItem: IMenuItemData = {};\r\n private activeSubMenuItem: IMenuItemData = {};\r\n\r\n constructor(props: INavigationMenuViewProps & ISmweNavigationMenuProps<{}>) {\r\n super(props);\r\n this.menuNode = React.createRef();\r\n this.state = {\r\n activeMenu: undefined,\r\n mobileViewLabelText: '',\r\n parentMenu: undefined,\r\n navOpen: false,\r\n menuHeight: 0,\r\n initialMenuItem: undefined\r\n };\r\n this._closeSubmenu = this._closeSubmenu.bind(this);\r\n this._onMobNavOpen = this._onMobNavOpen.bind(this);\r\n this._onMobNavClose = this._onMobNavClose.bind(this);\r\n }\r\n\r\n public componentDidMount(): void {\r\n document.getElementById('ms-header__subnav-fade')?.addEventListener('mousedown', this._handleClickOutside);\r\n }\r\n\r\n public componentDidUpdate(): void {\r\n const menuHeight = this.menuNode.current?.clientHeight;\r\n this.setState({ menuHeight: menuHeight });\r\n if (msdyn365Commerce.isBrowser) {\r\n document.documentElement.style.setProperty('--navMenuHeight', `${this.state.menuHeight}px`);\r\n }\r\n }\r\n\r\n public componentWillUnmount(): void {\r\n document.getElementById('ms-header__subnav-fade')?.removeEventListener('mousedown', this._handleClickOutside, false);\r\n }\r\n\r\n public render(): JSX.Element | null {\r\n const { isMobileView, MenuList, Navigation } = this.props;\r\n const className = this.props.config.className;\r\n // get current pathname\r\n if (process.env.CURRENT_ENVIRONMENT === 'web') {\r\n this.pathName = window.location.pathname;\r\n } else {\r\n this.pathName = this.props.context.request.url.requestUrl.pathname;\r\n }\r\n\r\n this.props.menuItemData.forEach((item, index) => {\r\n const ItemPath = this._getPathNameFromURL(item.linkURL || '');\r\n item.subMenu && item.subMenu.forEach((subItem, subIndex) => {\r\n const subItemPath = this._getPathNameFromURL(subItem.linkURL || '');\r\n if (subItemPath === this.pathName) {\r\n this.activeMenuItem = item;\r\n this.activeSubMenuItem = subItem;\r\n this.setState({ initialMenuItem: this.activeMenuItem.id });\r\n }\r\n });\r\n if (ItemPath === this.pathName) {\r\n this.activeMenuItem = item;\r\n }\r\n });\r\n\r\n this.currentLevel = 1;\r\n return (\r\n \r\n \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 _getPathNameFromURL(linkURL: string): string {\r\n let pathName = '';\r\n try {\r\n // if linkURL is a full url\r\n pathName = new URL(linkURL).pathname;\r\n } catch {\r\n pathName = linkURL.split('?')[0];\r\n }\r\n return pathName;\r\n }\r\n\r\n private _onMobNavOpen(): void {\r\n const firstNavItem = this.props.menuItemData[0]?.id;\r\n\r\n this.setState({\r\n activeMenu: this.state.initialMenuItem !== undefined ? this.state.initialMenuItem : firstNavItem || undefined,\r\n navOpen: true\r\n });\r\n this._addFixedBodyPosition();\r\n }\r\n\r\n private _onMobNavClose(): void {\r\n this.setState({\r\n activeMenu: undefined,\r\n navOpen: false\r\n });\r\n this._removeFixedBodyPosition();\r\n }\r\n\r\n private _renderDisplay(): JSX.Element[] {\r\n const { ListItem, menuItemData } = this.props;\r\n const menuItemList: JSX.Element[] = [];\r\n const isMobileView: boolean = this.props.isMobileView || false;\r\n const expandOnClick: boolean = this.props.config.expandOnClick || false;\r\n menuItemData.forEach((item: IMenuItemData, index: number) => {\r\n menuItemList.push(\r\n \r\n {this._createMenuItemList(item, item.id)}\r\n \r\n );\r\n });\r\n\r\n return menuItemList;\r\n }\r\n\r\n private _createMenuItemList(menuItemData: IMenuItemData, idx?: number): JSX.Element | null {\r\n if (menuItemData && menuItemData.subMenu && menuItemData.subMenu.length > 0) {\r\n return (\r\n \r\n {this._renderButtonMenuItem(menuItemData, menuItemData.id, idx)}\r\n \r\n {this._renderSubMenu(menuItemData.subMenu, menuItemData.id)}\r\n \r\n \r\n );\r\n } else if (menuItemData && menuItemData.linkText && menuItemData.linkURL && menuItemData.linkURL.length > 0) {\r\n return (this._renderLinkMenuItem(menuItemData));\r\n } else if (menuItemData && menuItemData.linkText && !menuItemData.linkURL) {\r\n return (this._renderSpanMenuItem(menuItemData));\r\n }\r\n\r\n return null;\r\n }\r\n\r\n private _renderSubMenu(subMenus?: IMenuItemDataClass[], activeMenu?: number, openInNewTab?: boolean): JSX.Element | null {\r\n const { ListItem } = this.props;\r\n\r\n if (!subMenus || subMenus.length === 0) {\r\n return null;\r\n }\r\n\r\n let levelClassName: string = '';\r\n const menuOptions = subMenus && subMenus.map((option: IMenuItemDataClass, idx: number) => {\r\n const hasOptions = (option.subMenu && option.subMenu.length > 0);\r\n let menuItem: JSX.Element | null;\r\n if (hasOptions) {\r\n menuItem = this._renderButtonMenuItem(option, activeMenu, idx);\r\n } else {\r\n menuItem = (option.linkURL\r\n ? this._renderLinkMenuItem(option, idx, openInNewTab)\r\n : this._renderSpanMenuItem(option)\r\n );\r\n }\r\n\r\n let subMenu;\r\n\r\n if (hasOptions) {\r\n this.currentLevel++;\r\n if (this.currentLevel <= this.supportedLevel - 1) {\r\n levelClassName = `level-${this.currentLevel.toString()}`;\r\n subMenu = this._renderSubMenu(option.subMenu, option.id, openInNewTab);\r\n }\r\n }\r\n\r\n return (\r\n \r\n {menuItem}\r\n {subMenu}\r\n \r\n );\r\n });\r\n\r\n return this._renderMenu(levelClassName, menuOptions, activeMenu);\r\n }\r\n\r\n private _renderButtonMenuItem(option: IMenuItemData, activeMenu?: number, index?: number): JSX.Element | null {\r\n const { Button } = this.props;\r\n const isActive = (option === this.activeMenuItem) || (option === this.activeSubMenuItem);\r\n const activeClass = `${Button.className} ${isActive ? this.activeClassName : ''}`;\r\n const isMobileView: boolean = this.props.isMobileView || false;\r\n const expandOnClick: boolean = this.props.config.expandOnClick || false;\r\n\r\n return (\r\n this._mainNavClick(option)}\r\n onMouseEnter={isMobileView || expandOnClick ? false : this._handleDropdownToggle(option, activeMenu)}\r\n aria-haspopup={true}\r\n aria-expanded={this.state.activeMenu && this.state.activeMenu === option.id ? true : false}\r\n data-parent={activeMenu}\r\n aria-current={isActive && 'page'}\r\n >\r\n {option.linkText}\r\n \r\n );\r\n }\r\n\r\n private _mainNavClick = (option: IMenuItemData) => {\r\n const link = option.linkURL;\r\n if (link) {\r\n window.location.href = link;\r\n }\r\n };\r\n\r\n private _renderLinkMenuItem(option: IMenuItemData, index?: number, openInNewTab?: boolean): JSX.Element | null {\r\n const { Link } = this.props;\r\n const isActive = (option === this.activeSubMenuItem) || (option === this.activeMenuItem);\r\n\r\n return (\r\n \r\n {option.linkText}\r\n \r\n );\r\n }\r\n\r\n private _renderSpanMenuItem(option: IMenuItemData, index?: number): JSX.Element | null {\r\n const { Span } = this.props;\r\n return (\r\n {option.linkText}\r\n );\r\n }\r\n\r\n private _renderMenu(level: string, menuOptions: JSX.Element[], currentItem?: number): JSX.Element | null {\r\n const { MenuList } = this.props;\r\n this.currentLevel = 1;\r\n const stateClass = currentItem && currentItem === this.state.activeMenu ? 'expanded' : 'collapsed';\r\n\r\n return (\r\n \r\n {menuOptions}\r\n \r\n );\r\n }\r\n\r\n private _handleDropdownToggle = (data: IMenuItemData, parentId?: number) => () => {\r\n const activeMenu = data.id;\r\n this.setState({\r\n activeMenu,\r\n parentMenu: parentId,\r\n navOpen: true\r\n });\r\n this._addFixedBodyPosition();\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 const burgerMenu: boolean = event.target.className === 'ms-header__nav-icon';\r\n\r\n if (this.menuNode.current && !this.menuNode.current.contains(event.target)) {\r\n this.setState({ activeMenu: undefined, mobileViewLabelText: '' });\r\n\r\n if (!burgerMenu) {\r\n this.setState({ navOpen: false });\r\n }\r\n }\r\n\r\n this._removeFixedBodyPosition();\r\n this._resetFocus();\r\n };\r\n\r\n private _closeSubmenu(): void {\r\n this.setState({\r\n activeMenu: undefined,\r\n mobileViewLabelText: '',\r\n navOpen: false\r\n });\r\n this._removeFixedBodyPosition();\r\n this._resetFocus();\r\n }\r\n\r\n private _addFixedBodyPosition(): void {\r\n document.body?.classList.add('fixed');\r\n }\r\n\r\n private _removeFixedBodyPosition(): void {\r\n document.body?.classList.remove('fixed');\r\n }\r\n}\r\n\r\nexport default NavigationMenuView;\r\n"],"sourceRoot":""}