{"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/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","linkText","toLowerCase","config","hiddenUrl","subMenu","length","hiddenSubMenuItem","_removeSubItem","ItemPath","_getPathNameFromURL","subItem","subIndex","onClick","Module","Object","classnames","Node","ref","role","_renderDisplay","subMenuArray","subItemToRemove","i","splice","URL","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","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","imageSettings","gridSettings","moduleProps","tag","resources","menuAriaLabel","ImageContainer","MobileDescriptionContainer","MobileBackButton","backButtonAriaLabel","MobileDescriptionLabel","renderView","retailServerNavItems","mergedData","navigationmenu","categories","result","filter","x","Children","retailServerMainMenu","hiddenRetailMenuItems","hiddenItemsArray","trim","fetchedRetailMenuItems","navItem","RecordId","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","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","type","trapFocusInsideMenu","firstFocusableElement","getElementsByClassName","lastFocusableElement","children","msNavList","tagName","msNavListItem","lastMenuItem","submenu","Array","from","subnavShow","s","classList","includes","activeElement","preventDefault","_handleFocus","onMouseDown","expandOnClick","openSubmenuItemsNewTab","openInNewTab","rel","_renderSubNavButton","openSubmenuItemsNewTabArray","alt","_addFixedBodyPosition","_removeFixedBodyPosition","_onMobNavOpen","_onMobNavClose","getElementById","firstNavItem","add","remove","stateClass"],"mappings":"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","file":"static/js/30.7ef8ffbe65af64e2206d.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 >\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 role=\"menuitem\"\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\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 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 >\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 >\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\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 >\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 >\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 >\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 >\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 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\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('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 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?: 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 : ''} ${this.state.activeMenu && this.state.activeMenu === option.id ? 'nav-open' : 'nav-closed'}`;\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) || (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 });\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 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 >\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 >\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 { 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 >\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 >\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 >\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 = {\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 >\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 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 >\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":""}