{"version":3,"file":"static/js/37.3feae0aea0dca2dcd17b.chunk.js","mappings":"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","sources":["webpack://msdyn365.commerce.online/./src/modules/smwe-navigation-menu/smwe-navigation-menu.props.autogenerated.ts?538e","webpack://msdyn365.commerce.online/./src/modules/smwe-navigation-menu/smwe-navigation-menu.tsx?891b","webpack://msdyn365.commerce.online/./src/modules/smwe-navigation-menu/smwe-navigation-menu.view.tsx?e140","webpack://msdyn365.commerce.online/./src/themes/blend/views/smwe-navigation-menu.view.tsx?9cbd","webpack://msdyn365.commerce.online/./src/themes/colsolare/views/smwe-navigation-menu.view.tsx?887d","webpack://msdyn365.commerce.online/./src/themes/columbiacrest/views/smwe-navigation-menu.view.tsx?8120","webpack://msdyn365.commerce.online/./src/themes/conn-creek/views/smwe-navigation-menu.view.tsx?e58d","webpack://msdyn365.commerce.online/./src/themes/elicit/views/smwe-navigation-menu.view.tsx?8ff3","webpack://msdyn365.commerce.online/./src/themes/enoteca/views/smwe-navigation-menu.view.tsx?c61d","webpack://msdyn365.commerce.online/./src/themes/erath/views/smwe-navigation-menu.view.tsx?9461","webpack://msdyn365.commerce.online/./src/themes/fth/views/smwe-navigation-menu.view.tsx?0ef5","webpack://msdyn365.commerce.online/./src/themes/generazioni/views/smwe-navigation-menu.view.tsx?0f02","webpack://msdyn365.commerce.online/./src/themes/h3-theme/views/smwe-navigation-menu.view.tsx?f60b","webpack://msdyn365.commerce.online/./src/themes/lql/views/smwe-navigation-menu.view.tsx?42e7","webpack://msdyn365.commerce.online/./src/themes/north-star/views/smwe-navigation-menu.view.tsx?75e9","webpack://msdyn365.commerce.online/./src/themes/patzhall/views/smwe-navigation-menu.view.tsx?f98e","webpack://msdyn365.commerce.online/./src/themes/smwe/views/smwe-navigation-menu.view.tsx?a0b6","webpack://msdyn365.commerce.online/./src/themes/spring-valley-vineyard/views/smwe-navigation-menu.view.tsx?278b","webpack://msdyn365.commerce.online/./src/themes/stagsleap/views/smwe-navigation-menu.view.tsx?c1d0","webpack://msdyn365.commerce.online/./src/themes/stemichelle-new/views/smwe-navigation-menu.view.tsx?4792","webpack://msdyn365.commerce.online/./src/themes/stemichelle/views/smwe-navigation-menu.view.tsx?79d5","webpack://msdyn365.commerce.online/./src/themes/wine-estates/views/smwe-navigation-menu.view.tsx?323c"],"sourcesContent":["/**\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 { Module, Node } from '@msdyn365-commerce-modules/utilities';\r\nimport classnames from 'classnames';\r\nimport * as React from 'react';\r\nimport { INavigationMenuViewProps } from './smwe-navigation-menu';\r\nimport { IMenuItemData } from './smwe-navigation-menu.data';\r\n\r\ninterface INavigationState {\r\n parentMenu?: number;\r\n activeMenu?: number;\r\n mobileViewLabelText?: string;\r\n navOpen: boolean;\r\n}\r\n\r\ninterface IMenuItemDataClass extends IMenuItemData {\r\n className?: string;\r\n}\r\n\r\n/**\r\n *\r\n * NavigationMenuView component\r\n * @extends {React.PureComponent}\r\n */\r\nexport class NavigationMenuView extends React.PureComponent {\r\n private supportedLevel: number = 3;\r\n private currentLevel: number = 0;\r\n private menuNode: React.RefObject;\r\n private pathName: string = '';\r\n private activeClassName: string = 'selected';\r\n private activeMenuItem: IMenuItemData = {};\r\n private activeSubMenuItem: IMenuItemData = {};\r\n\r\n constructor(props: INavigationMenuViewProps) {\r\n super(props);\r\n this.menuNode = React.createRef();\r\n this.state = { activeMenu: undefined, mobileViewLabelText: '', parentMenu: undefined, navOpen: false };\r\n this._closeSubmenu = this._closeSubmenu.bind(this);\r\n this._onMobNavTrigger = this._onMobNavTrigger.bind(this);\r\n }\r\n\r\n public componentDidMount(): void {\r\n document.body && document.body.addEventListener('mousedown', this._handleClickOutside);\r\n }\r\n\r\n public componentWillUnmount(): void {\r\n document.body && document.body.removeEventListener('mousedown', this._handleClickOutside, false);\r\n }\r\n\r\n public render(): JSX.Element | null {\r\n const { isMobileView, MenuList, Navigation } = this.props;\r\n // get current pathname\r\n if (process.env.CURRENT_ENVIRONMENT === 'web') {\r\n this.pathName = window.location.pathname;\r\n } else {\r\n this.pathName = this.props.context.request.url.requestUrl.pathname;\r\n }\r\n\r\n // for wine-shop links, only \"all wines\" page should make \"wine shop\" link active\r\n // TODO: \"wine shop\" menu link has different behavior, it doesn't get highlighted unless on the \"all wines\" page\r\n\r\n // if (this.pathName.startsWith('/fth/wine-shop/')) {\r\n // if (this.pathName.startsWith('/fth/wine-shop/5637149842.c') || this.pathName.startsWith('/fth/wine-shop/all-wines/5637149843.c')) {\r\n // // get \"wine shop\" menu item\r\n // this.props.menuItemData.forEach((item, index) => {\r\n // if (item.linkURL && item.linkURL.startsWith('/fth/wine-shop/')) {\r\n // this.activeMenuItem = item;\r\n // }\r\n // });\r\n // }\r\n // } else {\r\n this.props.menuItemData.forEach((item, index) => {\r\n const ItemPath = this._getPathNameFromURL(item.linkURL || '');\r\n item.subMenu && item.subMenu.forEach((subItem, subIndex) => {\r\n const subItemPath = this._getPathNameFromURL(subItem.linkURL || '');\r\n if (subItemPath === this.pathName) {\r\n this.activeMenuItem = item;\r\n this.activeSubMenuItem = subItem;\r\n }\r\n });\r\n if (ItemPath === this.pathName) {\r\n this.activeMenuItem = item;\r\n }\r\n });\r\n // }\r\n\r\n this.currentLevel = 1;\r\n return (\r\n \r\n \r\n \r\n \r\n {this._renderDisplay()}\r\n \r\n \r\n \r\n );\r\n }\r\n\r\n private _getPathNameFromURL(linkURL: string): string {\r\n let pathName = '';\r\n try {\r\n // if linkURL is a full url\r\n pathName = new URL(linkURL).pathname;\r\n } catch {\r\n pathName = linkURL.split('?')[0];\r\n }\r\n return pathName;\r\n }\r\n\r\n private _onMobNavTrigger(): void {\r\n this.setState(state => ({\r\n navOpen: !state.navOpen\r\n }));\r\n }\r\n\r\n private _renderDisplay(): JSX.Element[] {\r\n const { ListItem, menuItemData } = this.props;\r\n const menuItemList: JSX.Element[] = [];\r\n menuItemData.forEach((item: IMenuItemData, index: number) => {\r\n menuItemList.push(\r\n \r\n {this._createMenuItemList(item)}\r\n \r\n );\r\n });\r\n\r\n return menuItemList;\r\n }\r\n\r\n private _createMenuItemList(menuItemData: IMenuItemData): JSX.Element | null {\r\n if (menuItemData && menuItemData.subMenu && menuItemData.subMenu.length > 0) {\r\n if (this.props.isMobileView) {\r\n return (\r\n \r\n {this._renderButtonMenuItem(menuItemData)}\r\n \r\n {this._renderSubMenu(menuItemData.subMenu, menuItemData.id)}\r\n \r\n );\r\n } else {\r\n return (\r\n \r\n {this._renderButtonMenuItem(menuItemData)}\r\n {this._renderSubMenu(menuItemData.subMenu, menuItemData.id)}\r\n \r\n );\r\n }\r\n } else if (menuItemData && menuItemData.linkText && menuItemData.linkURL && menuItemData.linkURL.length > 0) {\r\n return (this._renderLinkMenuItem(menuItemData));\r\n } else if (menuItemData && menuItemData.linkText && !menuItemData.linkURL) {\r\n return (this._renderSpanMenuItem(menuItemData));\r\n }\r\n\r\n return null;\r\n }\r\n\r\n private _renderSubMenu(subMenus?: IMenuItemDataClass[], activeMenu?: number): JSX.Element | null {\r\n const { isMobileView, ListItem } = this.props;\r\n if (activeMenu && this.state.activeMenu !== activeMenu && !isMobileView) {\r\n return null;\r\n }\r\n\r\n if (!subMenus || subMenus.length === 0) {\r\n return null;\r\n }\r\n\r\n let levelClassName: string = '';\r\n const menuOptions = subMenus && subMenus.map((option: IMenuItemDataClass, idx: number) => {\r\n const hasOptions = (option.subMenu && option.subMenu.length > 0);\r\n let menuItem: JSX.Element | null;\r\n if (hasOptions && isMobileView) {\r\n menuItem = this._renderButtonMenuItem(option, activeMenu, idx);\r\n } else {\r\n menuItem = (option.linkURL\r\n ? this._renderLinkMenuItem(option, idx)\r\n : this._renderSpanMenuItem(option)\r\n );\r\n }\r\n\r\n let subMenu;\r\n\r\n if (hasOptions) {\r\n this.currentLevel++;\r\n if (this.currentLevel <= this.supportedLevel - 1) {\r\n levelClassName = `level-${this.currentLevel.toString()}`;\r\n subMenu = this._renderSubMenu(option.subMenu, isMobileView ? option.id : undefined);\r\n }\r\n }\r\n\r\n return (\r\n \r\n {menuItem}\r\n {subMenu}\r\n \r\n );\r\n });\r\n\r\n return (this._renderMenu(levelClassName, menuOptions, activeMenu));\r\n }\r\n\r\n private _renderButtonMenuItem(option: IMenuItemData, activeMenu?: number, index?: number): JSX.Element | null {\r\n const { Button } = this.props;\r\n const isActive = (option === this.activeMenuItem) || (option === this.activeSubMenuItem);\r\n const activeClass = `${Button.className} ${isActive ? this.activeClassName : ''}`;\r\n\r\n return (\r\n this._mainNavClick(option) : this._handleDropdownToggle(option, activeMenu)}\r\n onMouseEnter={!this.props.isMobileView ? this._handleDropdownToggle(option, activeMenu) : false}\r\n onFocus={!this.props.isMobileView ? this._handleDropdownToggle(option, activeMenu) : false}\r\n aria-haspopup={true}\r\n aria-expanded={this.state.activeMenu && this.state.activeMenu === option.id ? true : false}\r\n data-parent={activeMenu}\r\n aria-current={isActive && 'page'}\r\n >\r\n {option.linkText}\r\n \r\n );\r\n }\r\n\r\n private _mainNavClick = (option: IMenuItemData) => {\r\n const link = option.linkURL;\r\n if (link) {\r\n window.location.href = link;\r\n }\r\n };\r\n\r\n private _renderLinkMenuItem(option: IMenuItemData, index?: number): JSX.Element | null {\r\n const { Link } = this.props;\r\n const isActive = (option === this.activeSubMenuItem) || (option === this.activeMenuItem);\r\n const activeClass = `${Link.className} ${isActive ? this.activeClassName : ''}`;\r\n\r\n return (\r\n \r\n {option.linkText}\r\n \r\n );\r\n }\r\n\r\n private _renderSpanMenuItem(option: IMenuItemData, index?: number): JSX.Element | null {\r\n const { Span } = this.props;\r\n return (\r\n {option.linkText}\r\n );\r\n }\r\n\r\n private _renderMenu(level: string, menuOptions: JSX.Element[], currentItem?: number): JSX.Element | null {\r\n const { MenuList } = this.props;\r\n this.currentLevel = 1;\r\n return (\r\n \r\n {menuOptions}\r\n \r\n );\r\n }\r\n\r\n private _handleDropdownToggle = (data: IMenuItemData, parentId?: number) => () => {\r\n let activeMenu;\r\n if(this.props.isMobileView) {\r\n activeMenu = (this.state.activeMenu && this.state.activeMenu === data.id!) ? undefined : data.id!;\r\n } else {\r\n activeMenu = data.id;\r\n }\r\n this.setState({\r\n activeMenu,\r\n parentMenu: parentId\r\n });\r\n\r\n this._resetFocus();\r\n };\r\n\r\n private _resetFocus = () => {\r\n if (this.props.isMobileView) {\r\n setTimeout(() => {\r\n this.menuNode && this.menuNode.current && this.menuNode.current.focus();\r\n }, 0);\r\n }\r\n };\r\n\r\n // tslint:disable-next-line:no-any\r\n private _handleClickOutside = (event: any) => {\r\n const burgerMenu:boolean = event.target.className === 'ms-header__nav-icon msc-btn';\r\n if (this.menuNode.current && !this.menuNode.current.contains(event.target) && !burgerMenu) {\r\n this.setState({ navOpen: false });\r\n }\r\n };\r\n\r\n private _closeSubmenu(): void {\r\n if (!this.props.isMobileView) {\r\n this.setState({ activeMenu: undefined, mobileViewLabelText: '' });\r\n }\r\n }\r\n}\r\n\r\nexport default NavigationMenuView;","/*---------------------------------------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License. See License.txt in the project root for license information.\r\n *--------------------------------------------------------------------------------------------*/\r\nimport { Module, Node } from '@msdyn365-commerce-modules/utilities';\r\nimport classnames from 'classnames';\r\nimport * as React from 'react';\r\nimport { INavigationMenuViewProps } from '../../../modules/smwe-navigation-menu/./smwe-navigation-menu';\r\nimport { IMenuItemData } from '../../../modules/smwe-navigation-menu/./smwe-navigation-menu.data';\r\nimport { ISmweNavigationMenuProps } from '../definition-extensions/smwe-navigation-menu.ext.props.autogenerated';\r\n\r\ninterface INavigationState {\r\n parentMenu?: number;\r\n activeMenu?: number;\r\n mobileViewLabelText?: string;\r\n navOpen: boolean;\r\n}\r\n\r\n/**\r\n *\r\n * NavigationMenuView component\r\n * @extends {React.PureComponent}\r\n */\r\nexport class NavigationMenuView extends React.PureComponent, INavigationState> {\r\n private supportedLevel: number = 3;\r\n private currentLevel: number = 0;\r\n private menuNode: React.RefObject;\r\n private pathName: string = '';\r\n private activeClassName: string = 'selected';\r\n private activeMenuItem: IMenuItemData = {};\r\n private activeSubMenuItem: IMenuItemData = {};\r\n\r\n constructor(props: INavigationMenuViewProps & ISmweNavigationMenuProps<{}>) {\r\n super(props);\r\n this.menuNode = React.createRef();\r\n this.state = { activeMenu: undefined, mobileViewLabelText: '', parentMenu: undefined, navOpen: false };\r\n this._closeSubmenu = this._closeSubmenu.bind(this);\r\n this._onMobNavTrigger = this._onMobNavTrigger.bind(this);\r\n }\r\n\r\n public componentDidMount(): void {\r\n document.body && document.body.addEventListener('mousedown', this._handleClickOutside);\r\n }\r\n\r\n public componentWillUnmount(): void {\r\n document.body && document.body.removeEventListener('mousedown', this._handleClickOutside, false);\r\n }\r\n\r\n public render(): JSX.Element | null {\r\n const { isMobileView, MenuList, Navigation } = this.props;\r\n // get current pathname\r\n if (process.env.CURRENT_ENVIRONMENT === 'web') {\r\n this.pathName = window.location.pathname;\r\n } else {\r\n this.pathName = this.props.context.request.url.requestUrl.pathname;\r\n }\r\n\r\n this.props.menuItemData.forEach((item, index) => {\r\n if (item.linkText?.toLowerCase() === this.props.config.hiddenUrl?.toLowerCase()) {\r\n item.linkURL = '';\r\n }\r\n if (item.subMenu && item.subMenu.length > 0 && this.props.config.hiddenSubMenuItem) {\r\n this._removeSubItem(item.subMenu, this.props.config.hiddenSubMenuItem);\r\n }\r\n const ItemPath = this._getPathNameFromURL(item.linkURL || '');\r\n item.subMenu && item.subMenu.forEach((subItem, subIndex) => {\r\n const subItemPath = this._getPathNameFromURL(subItem.linkURL || '');\r\n if (subItemPath === this.pathName) {\r\n this.activeMenuItem = item;\r\n this.activeSubMenuItem = subItem;\r\n }\r\n });\r\n if (ItemPath === this.pathName) {\r\n this.activeMenuItem = item;\r\n }\r\n });\r\n\r\n this.currentLevel = 1;\r\n return (\r\n \r\n \r\n );\r\n }\r\n\r\n // helper function created to remove elements from navigation submenus\r\n private _removeSubItem(subMenuArray: IMenuItemData[], subItemToRemove: string): IMenuItemData[] {\r\n let i = 0;\r\n while (i < subMenuArray.length) {\r\n if (subMenuArray[i].linkText?.toLowerCase() === subItemToRemove.toLowerCase()) {\r\n subMenuArray.splice(i, 1);\r\n } else {\r\n ++i;\r\n }\r\n }\r\n return subMenuArray;\r\n }\r\n\r\n private _getPathNameFromURL(linkURL: string): string {\r\n let pathName = '';\r\n try {\r\n // if linkURL is a full url\r\n pathName = new URL(linkURL).pathname;\r\n } catch {\r\n pathName = linkURL.split('?')[0];\r\n }\r\n return pathName;\r\n }\r\n\r\n private _onMobNavTrigger(): void {\r\n this.setState(state => ({\r\n navOpen: !state.navOpen\r\n }));\r\n }\r\n\r\n private _renderDisplay(): JSX.Element[] {\r\n const { ListItem, menuItemData } = this.props;\r\n const menuItemList: JSX.Element[] = [];\r\n menuItemData.forEach((item: IMenuItemData, index: number) => {\r\n menuItemList.push(\r\n \r\n {this._createMenuItemList(item)}\r\n \r\n );\r\n });\r\n return menuItemList;\r\n }\r\n\r\n private _createMenuItemList(menuItemData: IMenuItemData): JSX.Element | null {\r\n if (menuItemData && menuItemData.subMenu && menuItemData.subMenu.length > 0) {\r\n if (this.props.isMobileView) {\r\n return (\r\n \r\n {this._renderButtonMenuItem(menuItemData)}\r\n \r\n {this._renderSubMenu(menuItemData.subMenu, menuItemData.id)}\r\n \r\n );\r\n } else {\r\n return (\r\n \r\n {this._renderButtonMenuItem(menuItemData)}\r\n {this._renderSubMenu(menuItemData.subMenu, menuItemData.id)}\r\n \r\n );\r\n }\r\n } else if (menuItemData && menuItemData.linkText && menuItemData.linkURL && menuItemData.linkURL.length > 0) {\r\n return (this._renderLinkMenuItem(menuItemData));\r\n } else if (menuItemData && menuItemData.linkText && !menuItemData.linkURL) {\r\n return (this._renderSpanMenuItem(menuItemData));\r\n }\r\n\r\n return null;\r\n }\r\n\r\n private _renderSubMenu(subMenus?: IMenuItemData[], activeMenu?: number): JSX.Element | null {\r\n const { isMobileView, ListItem } = this.props;\r\n if (activeMenu && this.state.activeMenu !== activeMenu && !isMobileView) {\r\n return null;\r\n }\r\n\r\n if (!subMenus || subMenus.length === 0) {\r\n return null;\r\n }\r\n\r\n let levelClassName: string = '';\r\n const menuOptions = subMenus && subMenus.map((option: IMenuItemData, idx: number) => {\r\n const hasOptions = (option.subMenu && option.subMenu.length > 0);\r\n let menuItem: JSX.Element | null;\r\n if (hasOptions && isMobileView) {\r\n menuItem = this._renderButtonMenuItem(option, activeMenu, idx);\r\n } else {\r\n menuItem = (option.linkURL\r\n ? this._renderLinkMenuItem(option, idx)\r\n : this._renderSpanMenuItem(option)\r\n );\r\n }\r\n\r\n let subMenu;\r\n\r\n if (hasOptions) {\r\n this.currentLevel++;\r\n if (this.currentLevel <= this.supportedLevel - 1) {\r\n levelClassName = `level-${this.currentLevel.toString()}`;\r\n subMenu = this._renderSubMenu(option.subMenu, isMobileView ? option.id : undefined);\r\n }\r\n }\r\n\r\n return (\r\n \r\n {menuItem}\r\n {subMenu}\r\n \r\n );\r\n });\r\n\r\n return (this._renderMenu(levelClassName, menuOptions, activeMenu));\r\n }\r\n\r\n private _renderButtonMenuItem(option: IMenuItemData, activeMenu?: number, index?: number): JSX.Element | null {\r\n const { Button } = this.props;\r\n const isActive = (option === this.activeMenuItem) || (option === this.activeSubMenuItem);\r\n const activeClass = `${Button.className} ${isActive ? this.activeClassName : ''}`;\r\n\r\n return (\r\n this._mainNavClick(option) : this._handleDropdownToggle(option, activeMenu)}\r\n onMouseEnter={!this.props.isMobileView ? this._handleDropdownToggle(option, activeMenu) : false}\r\n onFocus={!this.props.isMobileView ? this._handleDropdownToggle(option, activeMenu) : false}\r\n aria-haspopup={true}\r\n aria-expanded={this.state.activeMenu && this.state.activeMenu === option.id ? true : false}\r\n data-parent={activeMenu}\r\n aria-current={isActive && 'page'}\r\n >\r\n {option.linkText}\r\n \r\n );\r\n }\r\n\r\n private _mainNavClick = (option: IMenuItemData) => {\r\n const link = option.linkURL;\r\n if (link) {\r\n window.location.href = link;\r\n }\r\n };\r\n\r\n private _renderLinkMenuItem(option: IMenuItemData, index?: number): JSX.Element | null {\r\n const { Link } = this.props;\r\n const isActive = (option === this.activeSubMenuItem) || (option === this.activeMenuItem);\r\n const activeClass = `${Link.className} ${isActive ? this.activeClassName : ''}`;\r\n\r\n return (\r\n \r\n {option.linkText}\r\n \r\n );\r\n }\r\n\r\n private _renderSpanMenuItem(option: IMenuItemData, index?: number): JSX.Element | null {\r\n const { Span } = this.props;\r\n return (\r\n {option.linkText}\r\n );\r\n }\r\n\r\n private _renderMenu(level: string, menuOptions: JSX.Element[], currentItem?: number): JSX.Element | null {\r\n const { MenuList } = this.props;\r\n this.currentLevel = 1;\r\n return (\r\n \r\n {menuOptions}\r\n \r\n );\r\n }\r\n\r\n private _handleDropdownToggle = (data: IMenuItemData, parentId?: number) => () => {\r\n let activeMenu;\r\n if(this.props.isMobileView) {\r\n activeMenu = (this.state.activeMenu && this.state.activeMenu === data.id!) ? undefined : data.id!;\r\n } else {\r\n activeMenu = data.id;\r\n }\r\n this.setState({\r\n activeMenu,\r\n parentMenu: parentId\r\n });\r\n\r\n this._resetFocus();\r\n };\r\n\r\n private _resetFocus = () => {\r\n if (this.props.isMobileView) {\r\n setTimeout(() => {\r\n this.menuNode && this.menuNode.current && this.menuNode.current.focus();\r\n }, 0);\r\n }\r\n };\r\n\r\n // tslint:disable-next-line:no-any\r\n private _handleClickOutside = (event: any) => {\r\n const burgerMenu:boolean = event.target.className === 'ms-header__nav-icon msc-btn';\r\n if (this.menuNode.current && !this.menuNode.current.contains(event.target) && !burgerMenu) {\r\n this.setState({ navOpen: false });\r\n }\r\n };\r\n\r\n private _closeSubmenu(): void {\r\n if (!this.props.isMobileView) {\r\n this.setState({ activeMenu: undefined, mobileViewLabelText: '' });\r\n }\r\n }\r\n}\r\n\r\nexport default NavigationMenuView;","/*---------------------------------------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License. See License.txt in the project root for license information.\r\n *--------------------------------------------------------------------------------------------*/\r\nimport { Module, Node } from '@msdyn365-commerce-modules/utilities';\r\nimport classnames from 'classnames';\r\nimport * as React from 'react';\r\nimport { INavigationMenuViewProps } from '../../../modules/smwe-navigation-menu/./smwe-navigation-menu';\r\nimport { IMenuItemData } from '../../../modules/smwe-navigation-menu/./smwe-navigation-menu.data';\r\nimport { ISmweNavigationMenuProps } from '../definition-extensions/smwe-navigation-menu.ext.props.autogenerated';\r\n\r\ninterface INavigationState {\r\n parentMenu?: number;\r\n activeMenu?: number;\r\n mobileViewLabelText?: string;\r\n navOpen: boolean;\r\n}\r\n\r\ninterface IMenuItemDataClass extends IMenuItemData {\r\n className?: string;\r\n}\r\n\r\n/**\r\n *\r\n * NavigationMenuView component\r\n * @extends {React.PureComponent}\r\n */\r\nexport class NavigationMenuView extends React.PureComponent, INavigationState> {\r\n private supportedLevel: number = 3;\r\n private currentLevel: number = 0;\r\n private menuNode: React.RefObject;\r\n private pathName: string = '';\r\n private activeClassName: string = 'selected';\r\n private activeMenuItem: IMenuItemData = {};\r\n private activeSubMenuItem: IMenuItemData = {};\r\n\r\n constructor(props: INavigationMenuViewProps & ISmweNavigationMenuProps<{}>) {\r\n super(props);\r\n this.menuNode = React.createRef();\r\n this.state = { activeMenu: undefined, mobileViewLabelText: '', parentMenu: undefined, navOpen: false };\r\n this._closeSubmenu = this._closeSubmenu.bind(this);\r\n this._onMobNavTrigger = this._onMobNavTrigger.bind(this);\r\n }\r\n\r\n public componentDidMount(): void {\r\n document.body && document.body.addEventListener('mousedown', this._handleClickOutside);\r\n document.body && document.body.addEventListener('keydown', this.trapFocusInsideMenu);\r\n }\r\n\r\n public componentWillUnmount(): void {\r\n document.body && document.body.removeEventListener('mousedown', this._handleClickOutside, false);\r\n document.body && document.body.removeEventListener('keydown', this.trapFocusInsideMenu, false);\r\n }\r\n\r\n public render(): JSX.Element | null {\r\n const { isMobileView, MenuList, Navigation } = this.props;\r\n // get current pathname\r\n if (process.env.CURRENT_ENVIRONMENT === 'web') {\r\n this.pathName = window.location.pathname;\r\n } else {\r\n this.pathName = this.props.context.request.url.requestUrl.pathname;\r\n }\r\n\r\n // for wine-shop links, only \"all wines\" page should make \"wine shop\" link active\r\n // TODO: \"wine shop\" menu link has different behavior, it doesn't get highlighted unless on the \"all wines\" page\r\n\r\n // if (this.pathName.startsWith('/fth/wine-shop/')) {\r\n // if (this.pathName.startsWith('/fth/wine-shop/5637149842.c') || this.pathName.startsWith('/fth/wine-shop/all-wines/5637149843.c')) {\r\n // // get \"wine shop\" menu item\r\n // this.props.menuItemData.forEach((item, index) => {\r\n // if (item.linkURL && item.linkURL.startsWith('/fth/wine-shop/')) {\r\n // this.activeMenuItem = item;\r\n // }\r\n // });\r\n // }\r\n // } else {\r\n this.props.menuItemData.forEach((item, index) => {\r\n const ItemPath = this._getPathNameFromURL(item.linkURL || '');\r\n item.subMenu && item.subMenu.forEach((subItem, subIndex) => {\r\n const subItemPath = this._getPathNameFromURL(subItem.linkURL || '');\r\n if (subItemPath === this.pathName) {\r\n this.activeMenuItem = item;\r\n this.activeSubMenuItem = subItem;\r\n }\r\n });\r\n if (ItemPath === this.pathName) {\r\n this.activeMenuItem = item;\r\n }\r\n });\r\n // }\r\n\r\n this.currentLevel = 1;\r\n return (\r\n \r\n \r\n \r\n \r\n {this._renderDisplay()}\r\n \r\n \r\n \r\n );\r\n }\r\n\r\n private _getPathNameFromURL(linkURL: string): string {\r\n let pathName = '';\r\n try {\r\n // if linkURL is a full url\r\n pathName = new URL(linkURL).pathname;\r\n } catch {\r\n pathName = linkURL.split('?')[0];\r\n }\r\n return pathName;\r\n }\r\n\r\n private _onMobNavTrigger(): void {\r\n this.setState(state => ({\r\n navOpen: !state.navOpen\r\n }));\r\n }\r\n\r\n private _renderDisplay(): JSX.Element[] {\r\n const { ListItem, menuItemData } = this.props;\r\n const menuItemList: JSX.Element[] = [];\r\n const isMobileView: boolean = this.props.isMobileView || false;\r\n const expandOnClick: boolean = this.props.config.expandOnClick || false;\r\n menuItemData.forEach((item: IMenuItemData, index: number) => {\r\n menuItemList.push(\r\n \r\n {this._createMenuItemList(item)}\r\n \r\n );\r\n });\r\n\r\n return menuItemList;\r\n }\r\n\r\n private _createMenuItemList(menuItemData: IMenuItemData): JSX.Element | null {\r\n if (menuItemData && menuItemData.subMenu && menuItemData.subMenu.length > 0) {\r\n if (this.props.isMobileView) {\r\n return (\r\n \r\n {this._renderButtonMenuItem(menuItemData)}\r\n \r\n {this._renderSubMenu(menuItemData.subMenu, menuItemData.id)}\r\n \r\n );\r\n } else {\r\n return (\r\n \r\n {this._renderButtonMenuItem(menuItemData)}\r\n {this._renderSubMenu(menuItemData.subMenu, menuItemData.id)}\r\n \r\n );\r\n }\r\n } else if (menuItemData && menuItemData.linkText && menuItemData.linkURL && menuItemData.linkURL.length > 0) {\r\n return (this._renderLinkMenuItem(menuItemData));\r\n } else if (menuItemData && menuItemData.linkText && !menuItemData.linkURL) {\r\n return (this._renderSpanMenuItem(menuItemData));\r\n }\r\n\r\n return null;\r\n }\r\n\r\n private _renderSubMenu(subMenus?: IMenuItemDataClass[], activeMenu?: number): JSX.Element | null {\r\n const { isMobileView, ListItem } = this.props;\r\n if (activeMenu && this.state.activeMenu !== activeMenu && !isMobileView) {\r\n return null;\r\n }\r\n\r\n if (!subMenus || subMenus.length === 0) {\r\n return null;\r\n }\r\n\r\n let levelClassName: string = '';\r\n const menuOptions = subMenus && subMenus.map((option: IMenuItemDataClass, idx: number) => {\r\n const hasOptions = (option.subMenu && option.subMenu.length > 0);\r\n let menuItem: JSX.Element | null;\r\n if (hasOptions && isMobileView) {\r\n menuItem = this._renderButtonMenuItem(option, activeMenu, idx);\r\n } else {\r\n menuItem = (option.linkURL\r\n ? this._renderLinkMenuItem(option, idx)\r\n : this._renderSpanMenuItem(option)\r\n );\r\n }\r\n\r\n let subMenu;\r\n\r\n if (hasOptions) {\r\n this.currentLevel++;\r\n if (this.currentLevel <= this.supportedLevel - 1) {\r\n levelClassName = `level-${this.currentLevel.toString()}`;\r\n subMenu = this._renderSubMenu(option.subMenu, isMobileView ? option.id : undefined);\r\n }\r\n }\r\n\r\n return (\r\n \r\n {menuItem}\r\n {subMenu}\r\n \r\n );\r\n });\r\n\r\n return (this._renderMenu(levelClassName, menuOptions, activeMenu));\r\n }\r\n\r\n private _renderButtonMenuItem(option: IMenuItemData, activeMenu?: number, index?: number): JSX.Element | null {\r\n const { Button } = this.props;\r\n const isActive = (option === this.activeMenuItem) || (option === this.activeSubMenuItem);\r\n const activeClass = `${Button.className} ${isActive ? this.activeClassName : ''}`;\r\n const isMobileView: boolean = this.props.isMobileView || false;\r\n const expandOnClick: boolean = this.props.config.expandOnClick || false;\r\n\r\n return (\r\n this._mainNavClick(option)}\r\n onMouseEnter={isMobileView || expandOnClick ? false : this._handleDropdownToggle(option, activeMenu)}\r\n aria-haspopup={true}\r\n aria-expanded={this.state.activeMenu && this.state.activeMenu === option.id ? true : false}\r\n data-parent={activeMenu}\r\n aria-current={isActive && 'page'}\r\n >\r\n {option.linkText}{(this.state.navOpen && this.state.activeMenu && this.state.activeMenu === option.id) ? :}\r\n \r\n );\r\n }\r\n\r\n private _mainNavClick = (option: IMenuItemData) => {\r\n const link = option.linkURL;\r\n if (link) {\r\n window.location.href = link;\r\n }\r\n };\r\n\r\n private _renderLinkMenuItem(option: IMenuItemData, index?: number): JSX.Element | null {\r\n const { Link } = this.props;\r\n const isActive = (option === this.activeSubMenuItem) || (option === this.activeMenuItem);\r\n const activeClass = `${Link.className} ${isActive ? this.activeClassName : ''}`;\r\n\r\n return (\r\n \r\n {option.linkText}\r\n \r\n );\r\n }\r\n\r\n private _renderSpanMenuItem(option: IMenuItemData, index?: number): JSX.Element | null {\r\n const { Span } = this.props;\r\n return (\r\n {option.linkText}\r\n );\r\n }\r\n\r\n private _renderMenu(level: string, menuOptions: JSX.Element[], currentItem?: number): JSX.Element | null {\r\n const { MenuList } = this.props;\r\n this.currentLevel = 1;\r\n return (\r\n \r\n {menuOptions}\r\n \r\n );\r\n }\r\n\r\n private _handleDropdownToggle = (data: IMenuItemData, parentId?: number) => () => {\r\n let activeMenu;\r\n if (this.props.isMobileView) {\r\n activeMenu = (this.state.activeMenu && this.state.activeMenu === data.id!) ? undefined : data.id!;\r\n } else {\r\n activeMenu = data.id;\r\n }\r\n this.setState({\r\n activeMenu,\r\n parentMenu: parentId,\r\n navOpen: true\r\n });\r\n this._resetFocus();\r\n };\r\n\r\n private _resetFocus = () => {\r\n if (this.props.isMobileView) {\r\n setTimeout(() => {\r\n this.menuNode && this.menuNode.current && this.menuNode.current.focus();\r\n }, 0);\r\n }\r\n };\r\n\r\n // tslint:disable-next-line:no-any\r\n private _handleClickOutside = (event: any) => {\r\n const burgerMenu: boolean = event.target.className === 'ms-header__nav-icon msc-btn';\r\n if (this.menuNode.current && !this.menuNode.current.contains(event.target)) {\r\n this.setState({ activeMenu: undefined, mobileViewLabelText: '' });\r\n\r\n if (!burgerMenu) {\r\n this.setState({ navOpen: false });\r\n }\r\n }\r\n };\r\n\r\n private _closeSubmenu(): void {\r\n if (!this.props.isMobileView) {\r\n this.setState({ activeMenu: undefined, mobileViewLabelText: '', navOpen: false });\r\n }\r\n }\r\n\r\n private trapFocusInsideMenu = (event: any) => {\r\n const isTabPressed = event.key === 'Tab';\r\n if (!isTabPressed) {\r\n return;\r\n }\r\n //move forward only if tab key is pressed\r\n const firstFocusableElement: HTMLElement | null = document.getElementsByClassName(\"ms-header__nav-icon msc-btn\").length > 0 ? document.getElementsByClassName(\"ms-header__nav-icon msc-btn\")[0] as HTMLElement : null;\r\n if (document.getElementsByClassName(\"nav-open\").length === 0) {\r\n //Let's return If the navbar is not open\r\n return;\r\n }\r\n else {\r\n let navOpen = document.getElementsByClassName(\"nav-open\")[0];\r\n let lastFocusableElement = null;\r\n //This means the nav bar is open\r\n //lets trap the focus inside the navbar\r\n while (navOpen.children.length > 0) {\r\n const msNavList = navOpen.children;\r\n if (msNavList.length === 1 && msNavList[0].tagName === 'UL') {\r\n const msNavListItem = msNavList[0].children;\r\n if (msNavListItem.length > 0) {\r\n //we have menu items list with us in msNavListItem\r\n const lastMenuItem = msNavListItem[msNavListItem.length - 1];\r\n const submenu = Array.from(lastMenuItem.children);\r\n const subnavShow = submenu.find(s => s.classList.contains(\"subnav-show\"));\r\n if (subnavShow) {\r\n //if we are here then the last menu is open.\r\n //Check for inner submenus\r\n navOpen = subnavShow;\r\n }\r\n else if (submenu[submenu.length - 1].tagName === 'A' && submenu[submenu.length - 1].className.includes(\"ms-nav__list__item__link\")) {\r\n //This means we are at the last menu and there is no further submenu inside it.\r\n lastFocusableElement = submenu[submenu.length - 1];\r\n break;\r\n }\r\n else {\r\n //If we are here then the submenu is not open\r\n lastFocusableElement = Array.from(lastMenuItem.children).find(b => b.classList.contains(\"ms-nav__list__item__button\"));\r\n break;\r\n }\r\n }\r\n }\r\n }\r\n //We need to see if the focus is on the last sub menu item if so then make the focus to menu open button, Doing so we are traping the focus\r\n //inside the menu.\r\n if (document.activeElement === lastFocusableElement && firstFocusableElement) {\r\n firstFocusableElement.focus();\r\n event.preventDefault();\r\n }\r\n }\r\n };\r\n}\r\n\r\nexport default NavigationMenuView;","/*---------------------------------------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License. See License.txt in the project root for license information.\r\n *--------------------------------------------------------------------------------------------*/\r\nimport { Module, Node } from '@msdyn365-commerce-modules/utilities';\r\nimport classnames from 'classnames';\r\nimport * as React from 'react';\r\nimport { INavigationMenuViewProps } from '../../../modules/smwe-navigation-menu/./smwe-navigation-menu';\r\nimport { IMenuItemData } from '../../../modules/smwe-navigation-menu/./smwe-navigation-menu.data';\r\nimport { ISmweNavigationMenuProps } from '../definition-extensions/smwe-navigation-menu.ext.props.autogenerated';\r\n\r\ninterface INavigationState {\r\n parentMenu?: number;\r\n activeMenu?: number;\r\n mobileViewLabelText?: string;\r\n navOpen: boolean;\r\n}\r\n\r\ninterface IMenuItemDataClass extends IMenuItemData {\r\n className?: string;\r\n}\r\n\r\n/**\r\n *\r\n * NavigationMenuView component\r\n * @extends {React.PureComponent}\r\n */\r\nexport class NavigationMenuView extends React.PureComponent, INavigationState> {\r\n private supportedLevel: number = 3;\r\n private currentLevel: number = 0;\r\n private menuNode: React.RefObject;\r\n private pathName: string = '';\r\n private activeClassName: string = 'selected';\r\n private activeMenuItem: IMenuItemData = {};\r\n private activeSubMenuItem: IMenuItemData = {};\r\n\r\n constructor(props: INavigationMenuViewProps & ISmweNavigationMenuProps<{}>) {\r\n super(props);\r\n this.menuNode = React.createRef();\r\n this.state = { activeMenu: undefined, mobileViewLabelText: '', parentMenu: undefined, navOpen: false };\r\n this._closeSubmenu = this._closeSubmenu.bind(this);\r\n this._onMobNavTrigger = this._onMobNavTrigger.bind(this);\r\n }\r\n\r\n public componentDidMount(): void {\r\n document.body && document.body.addEventListener('mousedown', this._handleClickOutside);\r\n }\r\n\r\n public componentWillUnmount(): void {\r\n document.body && document.body.removeEventListener('mousedown', this._handleClickOutside, false);\r\n }\r\n\r\n public render(): JSX.Element | null {\r\n const { isMobileView, MenuList, Navigation } = this.props;\r\n // get current pathname\r\n if (process.env.CURRENT_ENVIRONMENT === 'web') {\r\n this.pathName = window.location.pathname;\r\n } else {\r\n this.pathName = this.props.context.request.url.requestUrl.pathname;\r\n }\r\n\r\n // for wine-shop links, only \"all wines\" page should make \"wine shop\" link active\r\n // TODO: \"wine shop\" menu link has different behavior, it doesn't get highlighted unless on the \"all wines\" page\r\n\r\n // if (this.pathName.startsWith('/fth/wine-shop/')) {\r\n // if (this.pathName.startsWith('/fth/wine-shop/5637149842.c') || this.pathName.startsWith('/fth/wine-shop/all-wines/5637149843.c')) {\r\n // // get \"wine shop\" menu item\r\n // this.props.menuItemData.forEach((item, index) => {\r\n // if (item.linkURL && item.linkURL.startsWith('/fth/wine-shop/')) {\r\n // this.activeMenuItem = item;\r\n // }\r\n // });\r\n // }\r\n // } else {\r\n this.props.menuItemData.forEach((item, index) => {\r\n const ItemPath = this._getPathNameFromURL(item.linkURL || '');\r\n item.subMenu && item.subMenu.forEach((subItem, subIndex) => {\r\n const subItemPath = this._getPathNameFromURL(subItem.linkURL || '');\r\n if (subItemPath === this.pathName) {\r\n this.activeMenuItem = item;\r\n this.activeSubMenuItem = subItem;\r\n }\r\n });\r\n if (ItemPath === this.pathName) {\r\n this.activeMenuItem = item;\r\n }\r\n });\r\n // }\r\n\r\n this.currentLevel = 1;\r\n return (\r\n \r\n \r\n \r\n \r\n {this._renderDisplay()}\r\n \r\n \r\n \r\n );\r\n }\r\n\r\n private _getPathNameFromURL(linkURL: string): string {\r\n let pathName = '';\r\n try {\r\n // if linkURL is a full url\r\n pathName = new URL(linkURL).pathname;\r\n } catch {\r\n pathName = linkURL.split('?')[0];\r\n }\r\n return pathName;\r\n }\r\n\r\n private _onMobNavTrigger(): void {\r\n this.setState(state => ({\r\n navOpen: !state.navOpen\r\n }));\r\n }\r\n\r\n private _renderDisplay(): JSX.Element[] {\r\n const { ListItem, menuItemData } = this.props;\r\n const menuItemList: JSX.Element[] = [];\r\n const isMobileView: boolean = this.props.isMobileView || false;\r\n const expandOnClick: boolean = this.props.config.expandOnClick || false;\r\n menuItemData.forEach((item: IMenuItemData, index: number) => {\r\n menuItemList.push(\r\n \r\n {this._createMenuItemList(item)}\r\n \r\n );\r\n });\r\n\r\n return menuItemList;\r\n }\r\n\r\n private _createMenuItemList(menuItemData: IMenuItemData): JSX.Element | null {\r\n if (menuItemData && menuItemData.subMenu && menuItemData.subMenu.length > 0) {\r\n if (this.props.isMobileView) {\r\n return (\r\n \r\n {this._renderButtonMenuItem(menuItemData)}\r\n \r\n {this._renderSubMenu(menuItemData.subMenu, menuItemData.id)}\r\n \r\n );\r\n } else {\r\n return (\r\n \r\n {this._renderButtonMenuItem(menuItemData)}\r\n {this._renderSubMenu(menuItemData.subMenu, menuItemData.id)}\r\n \r\n );\r\n }\r\n } else if (menuItemData && menuItemData.linkText && menuItemData.linkURL && menuItemData.linkURL.length > 0) {\r\n return (this._renderLinkMenuItem(menuItemData));\r\n } else if (menuItemData && menuItemData.linkText && !menuItemData.linkURL) {\r\n return (this._renderSpanMenuItem(menuItemData));\r\n }\r\n\r\n return null;\r\n }\r\n\r\n private _renderSubMenu(subMenus?: IMenuItemDataClass[], activeMenu?: number): JSX.Element | null {\r\n const { isMobileView, ListItem } = this.props;\r\n if (activeMenu && this.state.activeMenu !== activeMenu && !isMobileView) {\r\n return null;\r\n }\r\n\r\n if (!subMenus || subMenus.length === 0) {\r\n return null;\r\n }\r\n\r\n let levelClassName: string = '';\r\n const menuOptions = subMenus && subMenus.map((option: IMenuItemDataClass, idx: number) => {\r\n const hasOptions = (option.subMenu && option.subMenu.length > 0);\r\n let menuItem: JSX.Element | null;\r\n if (hasOptions && isMobileView) {\r\n menuItem = this._renderButtonMenuItem(option, activeMenu, idx);\r\n } else {\r\n menuItem = (option.linkURL\r\n ? this._renderLinkMenuItem(option, idx)\r\n : this._renderSpanMenuItem(option)\r\n );\r\n }\r\n\r\n let subMenu;\r\n\r\n if (hasOptions) {\r\n this.currentLevel++;\r\n if (this.currentLevel <= this.supportedLevel - 1) {\r\n levelClassName = `level-${this.currentLevel.toString()}`;\r\n subMenu = this._renderSubMenu(option.subMenu, isMobileView ? option.id : undefined);\r\n }\r\n }\r\n\r\n return (\r\n \r\n {menuItem}\r\n {subMenu}\r\n \r\n );\r\n });\r\n\r\n return (this._renderMenu(levelClassName, menuOptions, activeMenu));\r\n }\r\n\r\n private _renderButtonMenuItem(option: IMenuItemData, activeMenu?: number, index?: number): JSX.Element | null {\r\n const { Button } = this.props;\r\n const isActive = (option === this.activeMenuItem) || (option === this.activeSubMenuItem);\r\n const activeClass = `${Button.className} ${isActive ? this.activeClassName : ''}`;\r\n const isMobileView: boolean = this.props.isMobileView || false;\r\n const expandOnClick: boolean = this.props.config.expandOnClick || false;\r\n\r\n return (\r\n this._mainNavClick(option)}\r\n onMouseEnter={isMobileView || expandOnClick ? false : this._handleDropdownToggle(option, activeMenu)}\r\n aria-haspopup={true}\r\n aria-expanded={this.state.activeMenu && this.state.activeMenu === option.id ? true : false}\r\n data-parent={activeMenu}\r\n role=\"menuitem\"\r\n aria-current={isActive && 'page'}\r\n >\r\n {option.linkText}{(this.state.navOpen && this.state.activeMenu && this.state.activeMenu === option.id) ? :}\r\n \r\n );\r\n }\r\n\r\n private _mainNavClick = (option: IMenuItemData) => {\r\n const link = option.linkURL;\r\n if (link) {\r\n window.location.href = link;\r\n }\r\n };\r\n\r\n private _renderLinkMenuItem(option: IMenuItemData, index?: number): JSX.Element | null {\r\n const { Link } = this.props;\r\n const isActive = (option === this.activeSubMenuItem) || (option === this.activeMenuItem);\r\n const activeClass = `${Link.className} ${isActive ? this.activeClassName : ''}`;\r\n\r\n return (\r\n \r\n {option.linkText}\r\n \r\n );\r\n }\r\n\r\n private _renderSpanMenuItem(option: IMenuItemData, index?: number): JSX.Element | null {\r\n const { Span } = this.props;\r\n return (\r\n {option.linkText}\r\n );\r\n }\r\n\r\n private _renderMenu(level: string, menuOptions: JSX.Element[], currentItem?: number): JSX.Element | null {\r\n const { MenuList } = this.props;\r\n this.currentLevel = 1;\r\n return (\r\n \r\n {menuOptions}\r\n \r\n );\r\n }\r\n\r\n private _handleDropdownToggle = (data: IMenuItemData, parentId?: number) => () => {\r\n let activeMenu;\r\n if(this.props.isMobileView) {\r\n activeMenu = (this.state.activeMenu && this.state.activeMenu === data.id!) ? undefined : data.id!;\r\n } else {\r\n activeMenu = data.id;\r\n }\r\n this.setState({\r\n activeMenu,\r\n parentMenu: parentId,\r\n navOpen: true\r\n });\r\n\r\n this._resetFocus();\r\n };\r\n\r\n private _resetFocus = () => {\r\n if (this.props.isMobileView) {\r\n setTimeout(() => {\r\n this.menuNode && this.menuNode.current && this.menuNode.current.focus();\r\n }, 0);\r\n }\r\n };\r\n\r\n // tslint:disable-next-line:no-any\r\n private _handleClickOutside = (event: any) => {\r\n const burgerMenu:boolean = event.target.className === 'ms-header__nav-icon msc-btn';\r\n if (this.menuNode.current && !this.menuNode.current.contains(event.target)) {\r\n this.setState({ activeMenu: undefined, mobileViewLabelText: '' });\r\n\r\n if (!burgerMenu) {\r\n this.setState({ navOpen: false });\r\n }\r\n }\r\n };\r\n\r\n private _closeSubmenu(): void {\r\n if (!this.props.isMobileView) {\r\n this.setState({ activeMenu: undefined, mobileViewLabelText: '', navOpen: false });\r\n }\r\n }\r\n}\r\n\r\nexport default NavigationMenuView;","/*---------------------------------------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License. See License.txt in the project root for license information.\r\n *--------------------------------------------------------------------------------------------*/\r\nimport { 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 { Module, Node } from '@msdyn365-commerce-modules/utilities';\r\nimport classnames from 'classnames';\r\nimport * as React from 'react';\r\nimport { INavigationMenuViewProps } from '../../../modules/smwe-navigation-menu/./smwe-navigation-menu';\r\nimport { IMenuItemData } from '../../../modules/smwe-navigation-menu/./smwe-navigation-menu.data';\r\nimport { ISmweNavigationMenuProps } from '../definition-extensions/smwe-navigation-menu.ext.props.autogenerated';\r\n\r\ninterface INavigationState {\r\n parentMenu?: number;\r\n activeMenu?: number;\r\n mobileViewLabelText?: string;\r\n navOpen: boolean;\r\n}\r\n\r\n/**\r\n *\r\n * NavigationMenuView component\r\n * @extends {React.PureComponent}\r\n */\r\nexport class NavigationMenuView extends React.PureComponent, INavigationState> {\r\n private supportedLevel: number = 3;\r\n private currentLevel: number = 0;\r\n private menuNode: React.RefObject;\r\n private pathName: string = '';\r\n private activeClassName: string = 'selected';\r\n private activeMenuItem: IMenuItemData = {};\r\n private activeSubMenuItem: IMenuItemData = {};\r\n\r\n constructor(props: INavigationMenuViewProps & ISmweNavigationMenuProps<{}>) {\r\n super(props);\r\n this.menuNode = React.createRef();\r\n this.state = { activeMenu: undefined, mobileViewLabelText: '', parentMenu: undefined, navOpen: false };\r\n this._closeSubmenu = this._closeSubmenu.bind(this);\r\n this._onMobNavTrigger = this._onMobNavTrigger.bind(this);\r\n }\r\n\r\n public componentDidMount(): void {\r\n document.body && document.body.addEventListener('mousedown', this._handleClickOutside);\r\n }\r\n\r\n public componentWillUnmount(): void {\r\n document.body && document.body.removeEventListener('mousedown', this._handleClickOutside, false);\r\n }\r\n\r\n public render(): JSX.Element | null {\r\n const { isMobileView, MenuList, Navigation } = this.props;\r\n // get current pathname\r\n if (process.env.CURRENT_ENVIRONMENT === 'web') {\r\n this.pathName = window.location.pathname;\r\n } else {\r\n this.pathName = this.props.context.request.url.requestUrl.pathname;\r\n }\r\n\r\n this.props.menuItemData.forEach((item, index) => {\r\n if (item.linkText?.toLowerCase() === this.props.config.hiddenUrl?.toLowerCase()) {\r\n item.linkURL = '';\r\n }\r\n if (item.subMenu && item.subMenu.length > 0 && this.props.config.hiddenSubMenuItem) {\r\n this._removeSubItem(item.subMenu, this.props.config.hiddenSubMenuItem);\r\n }\r\n const ItemPath = this._getPathNameFromURL(item.linkURL || '');\r\n item.subMenu && item.subMenu.forEach((subItem, subIndex) => {\r\n const subItemPath = this._getPathNameFromURL(subItem.linkURL || '');\r\n if (subItemPath === this.pathName) {\r\n this.activeMenuItem = item;\r\n this.activeSubMenuItem = subItem;\r\n }\r\n });\r\n if (ItemPath === this.pathName) {\r\n this.activeMenuItem = item;\r\n }\r\n });\r\n\r\n this.currentLevel = 1;\r\n return (\r\n \r\n \r\n );\r\n }\r\n\r\n // helper function created to remove elements from navigation submenus\r\n private _removeSubItem(subMenuArray: IMenuItemData[], subItemToRemove: string): IMenuItemData[] {\r\n let i = 0;\r\n while (i < subMenuArray.length) {\r\n if (subMenuArray[i].linkText?.toLowerCase() === subItemToRemove.toLowerCase()) {\r\n subMenuArray.splice(i, 1);\r\n } else {\r\n ++i;\r\n }\r\n }\r\n return subMenuArray;\r\n }\r\n\r\n private _getPathNameFromURL(linkURL: string): string {\r\n let pathName = '';\r\n try {\r\n // if linkURL is a full url\r\n pathName = new URL(linkURL).pathname;\r\n } catch {\r\n pathName = linkURL.split('?')[0];\r\n }\r\n return pathName;\r\n }\r\n\r\n private _onMobNavTrigger(): void {\r\n this.setState(state => ({\r\n navOpen: !state.navOpen\r\n }));\r\n }\r\n\r\n private _renderDisplay(): JSX.Element[] {\r\n const { ListItem, menuItemData } = this.props;\r\n const menuItemList: JSX.Element[] = [];\r\n menuItemData.forEach((item: IMenuItemData, index: number) => {\r\n menuItemList.push(\r\n \r\n {this._createMenuItemList(item)}\r\n \r\n );\r\n });\r\n return menuItemList;\r\n }\r\n\r\n private _createMenuItemList(menuItemData: IMenuItemData): JSX.Element | null {\r\n if (menuItemData && menuItemData.subMenu && menuItemData.subMenu.length > 0) {\r\n if (this.props.isMobileView) {\r\n return (\r\n \r\n {this._renderButtonMenuItem(menuItemData)}\r\n \r\n {this._renderSubMenu(menuItemData.subMenu, menuItemData.id)}\r\n \r\n );\r\n } else {\r\n return (\r\n \r\n {this._renderButtonMenuItem(menuItemData)}\r\n {this._renderSubMenu(menuItemData.subMenu, menuItemData.id)}\r\n \r\n );\r\n }\r\n } else if (menuItemData && menuItemData.linkText && menuItemData.linkURL && menuItemData.linkURL.length > 0) {\r\n return (this._renderLinkMenuItem(menuItemData));\r\n } else if (menuItemData && menuItemData.linkText && !menuItemData.linkURL) {\r\n return (this._renderSpanMenuItem(menuItemData));\r\n }\r\n\r\n return null;\r\n }\r\n\r\n private _renderSubMenu(subMenus?: IMenuItemData[], activeMenu?: number): JSX.Element | null {\r\n const { isMobileView, ListItem } = this.props;\r\n if (activeMenu && this.state.activeMenu !== activeMenu && !isMobileView) {\r\n return null;\r\n }\r\n\r\n if (!subMenus || subMenus.length === 0) {\r\n return null;\r\n }\r\n\r\n let levelClassName: string = '';\r\n const menuOptions = subMenus && subMenus.map((option: IMenuItemData, idx: number) => {\r\n const hasOptions = (option.subMenu && option.subMenu.length > 0);\r\n let menuItem: JSX.Element | null;\r\n if (hasOptions && isMobileView) {\r\n menuItem = this._renderButtonMenuItem(option, activeMenu, idx);\r\n } else {\r\n menuItem = (option.linkURL\r\n ? this._renderLinkMenuItem(option, idx)\r\n : this._renderSpanMenuItem(option)\r\n );\r\n }\r\n\r\n let subMenu;\r\n\r\n if (hasOptions) {\r\n this.currentLevel++;\r\n if (this.currentLevel <= this.supportedLevel - 1) {\r\n levelClassName = `level-${this.currentLevel.toString()}`;\r\n subMenu = this._renderSubMenu(option.subMenu, isMobileView ? option.id : undefined);\r\n }\r\n }\r\n\r\n return (\r\n \r\n {menuItem}\r\n {subMenu}\r\n \r\n );\r\n });\r\n\r\n return (this._renderMenu(levelClassName, menuOptions, activeMenu));\r\n }\r\n\r\n private _renderButtonMenuItem(option: IMenuItemData, activeMenu?: number, index?: number): JSX.Element | null {\r\n const { Button } = this.props;\r\n const isActive = (option === this.activeMenuItem) || (option === this.activeSubMenuItem);\r\n const activeClass = `${Button.className} ${isActive ? this.activeClassName : ''}`;\r\n\r\n return (\r\n this._mainNavClick(option) : this._handleDropdownToggle(option, activeMenu)}\r\n onMouseEnter={!this.props.isMobileView ? this._handleDropdownToggle(option, activeMenu) : false}\r\n onFocus={!this.props.isMobileView ? this._handleDropdownToggle(option, activeMenu) : false}\r\n aria-haspopup={true}\r\n aria-expanded={this.state.activeMenu && this.state.activeMenu === option.id ? true : false}\r\n data-parent={activeMenu}\r\n aria-current={isActive && 'page'}\r\n >\r\n {option.linkText}\r\n \r\n );\r\n }\r\n\r\n private _mainNavClick = (option: IMenuItemData) => {\r\n const link = option.linkURL;\r\n if (link) {\r\n window.location.href = link;\r\n }\r\n };\r\n\r\n private _renderLinkMenuItem(option: IMenuItemData, index?: number): JSX.Element | null {\r\n const { Link } = this.props;\r\n const isActive = (option === this.activeSubMenuItem) || (option === this.activeMenuItem);\r\n const activeClass = `${Link.className} ${isActive ? this.activeClassName : ''}`;\r\n\r\n return (\r\n \r\n {option.linkText}\r\n \r\n );\r\n }\r\n\r\n private _renderSpanMenuItem(option: IMenuItemData, index?: number): JSX.Element | null {\r\n const { Span } = this.props;\r\n return (\r\n {option.linkText}\r\n );\r\n }\r\n\r\n private _renderMenu(level: string, menuOptions: JSX.Element[], currentItem?: number): JSX.Element | null {\r\n const { MenuList } = this.props;\r\n this.currentLevel = 1;\r\n return (\r\n \r\n {menuOptions}\r\n \r\n );\r\n }\r\n\r\n private _handleDropdownToggle = (data: IMenuItemData, parentId?: number) => () => {\r\n let activeMenu;\r\n if(this.props.isMobileView) {\r\n activeMenu = (this.state.activeMenu && this.state.activeMenu === data.id!) ? undefined : data.id!;\r\n } else {\r\n activeMenu = data.id;\r\n }\r\n this.setState({\r\n activeMenu,\r\n parentMenu: parentId\r\n });\r\n\r\n this._resetFocus();\r\n };\r\n\r\n private _resetFocus = () => {\r\n if (this.props.isMobileView) {\r\n setTimeout(() => {\r\n this.menuNode && this.menuNode.current && this.menuNode.current.focus();\r\n }, 0);\r\n }\r\n };\r\n\r\n // tslint:disable-next-line:no-any\r\n private _handleClickOutside = (event: any) => {\r\n const burgerMenu:boolean = event.target.className === 'ms-header__nav-icon msc-btn';\r\n if (this.menuNode.current && !this.menuNode.current.contains(event.target) && !burgerMenu) {\r\n this.setState({ navOpen: false });\r\n }\r\n };\r\n\r\n private _closeSubmenu(): void {\r\n if (!this.props.isMobileView) {\r\n this.setState({ activeMenu: undefined, mobileViewLabelText: '' });\r\n }\r\n }\r\n}\r\n\r\nexport default NavigationMenuView;","/*---------------------------------------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License. See License.txt in the project root for license information.\r\n *--------------------------------------------------------------------------------------------*/\r\nimport { IMenuItemData, INavigationMenuViewProps } from '@msdyn365-commerce-modules/navigation-menu';\r\nimport { Module, Node } from '@msdyn365-commerce-modules/utilities';\r\nimport classnames from 'classnames';\r\nimport * as React from 'react';\r\n\r\ninterface INavigationState {\r\n parentMenu?: number;\r\n activeMenu?: number;\r\n mobileViewLabelText?: string;\r\n navOpen: boolean;\r\n}\r\n\r\ninterface IMenuItemDataClass extends IMenuItemData {\r\n className?: string;\r\n}\r\n\r\n/**\r\n *\r\n * NavigationMenuView component\r\n * @extends {React.PureComponent}\r\n */\r\nexport class NavigationMenuView extends React.PureComponent {\r\n private supportedLevel: number = 3;\r\n private currentLevel: number = 0;\r\n private menuNode: React.RefObject;\r\n private pathName: string = '';\r\n private activeClassName: string = 'selected';\r\n private activeMenuItem: IMenuItemData = {};\r\n private activeSubMenuItem: IMenuItemData = {};\r\n\r\n constructor(props: INavigationMenuViewProps) {\r\n super(props);\r\n this.menuNode = React.createRef();\r\n this.state = { activeMenu: undefined, mobileViewLabelText: '', parentMenu: undefined, navOpen: false };\r\n this._closeSubmenu = this._closeSubmenu.bind(this);\r\n this._onMobNavTrigger = this._onMobNavTrigger.bind(this);\r\n }\r\n\r\n public componentDidMount(): void {\r\n document.body && document.body.addEventListener('mousedown', this._handleClickOutside);\r\n }\r\n\r\n public componentWillUnmount(): void {\r\n document.body && document.body.removeEventListener('mousedown', this._handleClickOutside, false);\r\n }\r\n\r\n public render(): JSX.Element | null {\r\n const { isMobileView, MenuList, Navigation } = this.props;\r\n // get current pathname\r\n if (process.env.CURRENT_ENVIRONMENT === 'web') {\r\n this.pathName = window.location.pathname;\r\n } else {\r\n this.pathName = this.props.context.request.url.requestUrl.pathname;\r\n }\r\n\r\n // for wine-shop links, only \"all wines\" page should make \"wine shop\" link active\r\n // TODO: \"wine shop\" menu link has different behavior, it doesn't get highlighted unless on the \"all wines\" page\r\n\r\n // if (this.pathName.startsWith('/fth/wine-shop/')) {\r\n // if (this.pathName.startsWith('/fth/wine-shop/5637149842.c') || this.pathName.startsWith('/fth/wine-shop/all-wines/5637149843.c')) {\r\n // // get \"wine shop\" menu item\r\n // this.props.menuItemData.forEach((item, index) => {\r\n // if (item.linkURL && item.linkURL.startsWith('/fth/wine-shop/')) {\r\n // this.activeMenuItem = item;\r\n // }\r\n // });\r\n // }\r\n // } else {\r\n this.props.menuItemData.forEach((item, index) => {\r\n const ItemPath = this._getPathNameFromURL(item.linkURL || '');\r\n item.subMenu && item.subMenu.forEach((subItem, subIndex) => {\r\n const subItemPath = this._getPathNameFromURL(subItem.linkURL || '');\r\n if (subItemPath === this.pathName) {\r\n this.activeMenuItem = item;\r\n this.activeSubMenuItem = subItem;\r\n }\r\n });\r\n if (ItemPath === this.pathName) {\r\n this.activeMenuItem = item;\r\n }\r\n });\r\n // }\r\n\r\n this.currentLevel = 1;\r\n return (\r\n \r\n \r\n \r\n \r\n {this._renderDisplay()}\r\n \r\n \r\n \r\n );\r\n }\r\n\r\n private _getPathNameFromURL(linkURL: string): string {\r\n let pathName = '';\r\n try {\r\n // if linkURL is a full url\r\n pathName = new URL(linkURL).pathname;\r\n } catch {\r\n pathName = linkURL.split('?')[0];\r\n }\r\n return pathName;\r\n }\r\n\r\n private _onMobNavTrigger(): void {\r\n this.setState(state => ({\r\n navOpen: !state.navOpen\r\n }));\r\n }\r\n\r\n private _renderDisplay(): JSX.Element[] {\r\n const { ListItem, menuItemData } = this.props;\r\n const menuItemList: JSX.Element[] = [];\r\n menuItemData.forEach((item: IMenuItemData, index: number) => {\r\n menuItemList.push(\r\n \r\n {this._createMenuItemList(item)}\r\n \r\n );\r\n });\r\n\r\n return menuItemList;\r\n }\r\n\r\n private _createMenuItemList(menuItemData: IMenuItemData): JSX.Element | null {\r\n if (menuItemData && menuItemData.subMenu && menuItemData.subMenu.length > 0) {\r\n if (this.props.isMobileView) {\r\n return (\r\n \r\n {this._renderButtonMenuItem(menuItemData)}\r\n \r\n {this._renderSubMenu(menuItemData.subMenu, menuItemData.id)}\r\n \r\n );\r\n } else {\r\n return (\r\n \r\n {this._renderButtonMenuItem(menuItemData)}\r\n {this._renderSubMenu(menuItemData.subMenu, menuItemData.id)}\r\n \r\n );\r\n }\r\n } else if (menuItemData && menuItemData.linkText && menuItemData.linkURL && menuItemData.linkURL.length > 0) {\r\n return (this._renderLinkMenuItem(menuItemData));\r\n } else if (menuItemData && menuItemData.linkText && !menuItemData.linkURL) {\r\n return (this._renderSpanMenuItem(menuItemData));\r\n }\r\n\r\n return null;\r\n }\r\n\r\n private _renderSubMenu(subMenus?: IMenuItemDataClass[], activeMenu?: number): JSX.Element | null {\r\n const { isMobileView, ListItem } = this.props;\r\n if (activeMenu && this.state.activeMenu !== activeMenu && !isMobileView) {\r\n return null;\r\n }\r\n\r\n if (!subMenus || subMenus.length === 0) {\r\n return null;\r\n }\r\n\r\n let levelClassName: string = '';\r\n const menuOptions = subMenus && subMenus.map((option: IMenuItemDataClass, idx: number) => {\r\n const hasOptions = (option.subMenu && option.subMenu.length > 0);\r\n let menuItem: JSX.Element | null;\r\n if (hasOptions && isMobileView) {\r\n menuItem = this._renderButtonMenuItem(option, activeMenu, idx);\r\n } else {\r\n menuItem = (option.linkURL\r\n ? this._renderLinkMenuItem(option, idx)\r\n : this._renderSpanMenuItem(option)\r\n );\r\n }\r\n\r\n let subMenu;\r\n\r\n if (hasOptions) {\r\n this.currentLevel++;\r\n if (this.currentLevel <= this.supportedLevel - 1) {\r\n levelClassName = `level-${this.currentLevel.toString()}`;\r\n subMenu = this._renderSubMenu(option.subMenu, isMobileView ? option.id : undefined);\r\n }\r\n }\r\n\r\n return (\r\n \r\n {menuItem}\r\n {subMenu}\r\n \r\n );\r\n });\r\n\r\n return (this._renderMenu(levelClassName, menuOptions, activeMenu));\r\n }\r\n\r\n private _renderButtonMenuItem(option: IMenuItemData, activeMenu?: number, index?: number): JSX.Element | null {\r\n const { Button } = this.props;\r\n const isActive = (option === this.activeMenuItem) || (option === this.activeSubMenuItem);\r\n const activeClass = `${Button.className} ${isActive ? this.activeClassName : ''}`;\r\n\r\n return (\r\n this._mainNavClick(option) : this._handleDropdownToggle(option, activeMenu)}\r\n onMouseEnter={!this.props.isMobileView ? this._handleDropdownToggle(option, activeMenu) : false}\r\n onFocus={!this.props.isMobileView ? this._handleDropdownToggle(option, activeMenu) : false}\r\n aria-haspopup={true}\r\n aria-expanded={this.state.activeMenu && this.state.activeMenu === option.id ? true : false}\r\n data-parent={activeMenu}\r\n aria-current={isActive && 'page'}\r\n >\r\n {option.linkText}\r\n \r\n );\r\n }\r\n\r\n private _mainNavClick = (option: IMenuItemData) => {\r\n const link = option.linkURL;\r\n if (link) {\r\n window.location.href = link;\r\n }\r\n };\r\n\r\n private _renderLinkMenuItem(option: IMenuItemData, index?: number): JSX.Element | null {\r\n const { Link } = this.props;\r\n const isActive = (option === this.activeSubMenuItem) || (option === this.activeMenuItem);\r\n const activeClass = `${Link.className} ${isActive ? this.activeClassName : ''}`;\r\n\r\n return (\r\n \r\n {option.linkText}\r\n \r\n );\r\n }\r\n\r\n private _renderSpanMenuItem(option: IMenuItemData, index?: number): JSX.Element | null {\r\n const { Span } = this.props;\r\n return (\r\n {option.linkText}\r\n );\r\n }\r\n\r\n private _renderMenu(level: string, menuOptions: JSX.Element[], currentItem?: number): JSX.Element | null {\r\n const { MenuList } = this.props;\r\n this.currentLevel = 1;\r\n return (\r\n \r\n {menuOptions}\r\n \r\n );\r\n }\r\n\r\n private _handleDropdownToggle = (data: IMenuItemData, parentId?: number) => () => {\r\n let activeMenu;\r\n if(this.props.isMobileView) {\r\n activeMenu = (this.state.activeMenu && this.state.activeMenu === data.id!) ? undefined : data.id!;\r\n } else {\r\n activeMenu = data.id;\r\n }\r\n this.setState({\r\n activeMenu,\r\n parentMenu: parentId\r\n });\r\n\r\n this._resetFocus();\r\n };\r\n\r\n private _resetFocus = () => {\r\n if (this.props.isMobileView) {\r\n setTimeout(() => {\r\n this.menuNode && this.menuNode.current && this.menuNode.current.focus();\r\n }, 0);\r\n }\r\n };\r\n\r\n // tslint:disable-next-line:no-any\r\n private _handleClickOutside = (event: any) => {\r\n const burgerMenu:boolean = event.target.className === 'ms-header__nav-icon msc-btn';\r\n if (this.menuNode.current && !this.menuNode.current.contains(event.target) && !burgerMenu) {\r\n this.setState({ navOpen: false });\r\n }\r\n };\r\n\r\n private _closeSubmenu(): void {\r\n if (!this.props.isMobileView) {\r\n this.setState({ activeMenu: undefined, mobileViewLabelText: '' });\r\n }\r\n }\r\n}\r\n\r\nexport default NavigationMenuView;","/*---------------------------------------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License. See License.txt in the project root for license information.\r\n *--------------------------------------------------------------------------------------------*/\r\nimport { IMenuItemData, INavigationMenuViewProps } from '@msdyn365-commerce-modules/navigation-menu';\r\nimport { Module, Node } from '@msdyn365-commerce-modules/utilities';\r\nimport classnames from 'classnames';\r\nimport * as React from 'react';\r\n\r\ninterface INavigationState {\r\n parentMenu?: number;\r\n activeMenu?: number;\r\n mobileViewLabelText?: string;\r\n navOpen: boolean;\r\n}\r\ninterface IMenuItemDataClass extends IMenuItemData {\r\n className?: string;\r\n}\r\n/**\r\n *\r\n * NavigationMenuView component\r\n * @extends {React.PureComponent}\r\n */\r\nexport class NavigationMenuView extends React.PureComponent {\r\n private supportedLevel: number = 3;\r\n private currentLevel: number = 0;\r\n private menuNode: React.RefObject;\r\n private pathName: string = '';\r\n private activeClassName: string = 'selected';\r\n private activeMenuItem: IMenuItemData = {};\r\n private activeSubMenuItem: IMenuItemData = {};\r\n constructor(props: INavigationMenuViewProps) {\r\n super(props);\r\n this.menuNode = React.createRef();\r\n this.state = { activeMenu: undefined, mobileViewLabelText: '', parentMenu: undefined, navOpen: false };\r\n this._closeSubmenu = this._closeSubmenu.bind(this);\r\n this._onMobNavTrigger = this._onMobNavTrigger.bind(this);\r\n }\r\n public componentDidMount(): void {\r\n document.body && document.body.addEventListener('mousedown', this._handleClickOutside);\r\n }\r\n public componentWillUnmount(): void {\r\n document.body && document.body.removeEventListener('mousedown', this._handleClickOutside, false);\r\n }\r\n public render(): JSX.Element | null {\r\n const { isMobileView, MenuList, Navigation } = this.props;\r\n // get current pathname\r\n if (process.env.CURRENT_ENVIRONMENT === 'web') {\r\n this.pathName = window.location.pathname;\r\n } else {\r\n this.pathName = this.props.context.request.url.requestUrl.pathname;\r\n }\r\n // for wine-shop links, only \"all wines\" page should make \"wine shop\" link active\r\n // TODO: \"wine shop\" menu link has different behavior, it doesn't get highlighted unless on the \"all wines\" page\r\n // if (this.pathName.startsWith('/fth/wine-shop/')) {\r\n // if (this.pathName.startsWith('/fth/wine-shop/5637149842.c') || this.pathName.startsWith('/fth/wine-shop/all-wines/5637149843.c')) {\r\n // // get \"wine shop\" menu item\r\n // this.props.menuItemData.forEach((item, index) => {\r\n // if (item.linkURL && item.linkURL.startsWith('/fth/wine-shop/')) {\r\n // this.activeMenuItem = item;\r\n // }\r\n // });\r\n // }\r\n // } else {\r\n this.props.menuItemData.forEach((item, index) => {\r\n const ItemPath = this._getPathNameFromURL(item.linkURL || '');\r\n item.subMenu && item.subMenu.forEach((subItem, subIndex) => {\r\n const subItemPath = this._getPathNameFromURL(subItem.linkURL || '');\r\n if (subItemPath === this.pathName) {\r\n this.activeMenuItem = item;\r\n this.activeSubMenuItem = subItem;\r\n }\r\n });\r\n if (ItemPath === this.pathName) {\r\n this.activeMenuItem = item;\r\n }\r\n });\r\n // }\r\n this.currentLevel = 1;\r\n return (\r\n \r\n \r\n \r\n \r\n {this._renderDisplay()}\r\n \r\n \r\n \r\n );\r\n }\r\n private _getPathNameFromURL(linkURL: string): string {\r\n let pathName = '';\r\n try {\r\n // if linkURL is a full url\r\n pathName = new URL(linkURL).pathname;\r\n } catch {\r\n pathName = linkURL.split('?')[0];\r\n }\r\n return pathName;\r\n }\r\n private _onMobNavTrigger(): void {\r\n this.setState(state => ({\r\n navOpen: !state.navOpen\r\n }));\r\n }\r\n private _renderDisplay(): JSX.Element[] {\r\n const { ListItem, menuItemData } = this.props;\r\n const menuItemList: JSX.Element[] = [];\r\n menuItemData.forEach((item: IMenuItemData, index: number) => {\r\n menuItemList.push(\r\n \r\n {this._createMenuItemList(item)}\r\n \r\n );\r\n });\r\n return menuItemList;\r\n }\r\n private _createMenuItemList(menuItemData: IMenuItemData): JSX.Element | null {\r\n if (menuItemData && menuItemData.subMenu && menuItemData.subMenu.length > 0) {\r\n if (this.props.isMobileView) {\r\n return (\r\n \r\n {this._renderButtonMenuItem(menuItemData)}\r\n \r\n {this._renderSubMenu(menuItemData.subMenu, menuItemData.id)}\r\n \r\n );\r\n } else {\r\n return (\r\n \r\n {this._renderButtonMenuItem(menuItemData)}\r\n {this._renderSubMenu(menuItemData.subMenu, menuItemData.id)}\r\n \r\n );\r\n }\r\n } else if (menuItemData && menuItemData.linkText && menuItemData.linkURL && menuItemData.linkURL.length > 0) {\r\n return (this._renderLinkMenuItem(menuItemData));\r\n } else if (menuItemData && menuItemData.linkText && !menuItemData.linkURL) {\r\n return (this._renderSpanMenuItem(menuItemData));\r\n }\r\n return null;\r\n }\r\n private _renderSubMenu(subMenus?: IMenuItemDataClass[], activeMenu?: number): JSX.Element | null {\r\n const { isMobileView, ListItem } = this.props;\r\n if (activeMenu && this.state.activeMenu !== activeMenu && !isMobileView) {\r\n return null;\r\n }\r\n if (!subMenus || subMenus.length === 0) {\r\n return null;\r\n }\r\n let levelClassName: string = '';\r\n const menuOptions = subMenus && subMenus.map((option: IMenuItemDataClass, idx: number) => {\r\n const hasOptions = (option.subMenu && option.subMenu.length > 0);\r\n let menuItem: JSX.Element | null;\r\n if (hasOptions && isMobileView) {\r\n menuItem = this._renderButtonMenuItem(option, activeMenu, idx);\r\n } else {\r\n menuItem = (option.linkURL\r\n ? this._renderLinkMenuItem(option, idx)\r\n : this._renderSpanMenuItem(option)\r\n );\r\n }\r\n let subMenu;\r\n if (hasOptions) {\r\n this.currentLevel++;\r\n if (this.currentLevel <= this.supportedLevel - 1) {\r\n levelClassName = `level-${this.currentLevel.toString()}`;\r\n subMenu = this._renderSubMenu(option.subMenu, isMobileView ? option.id : undefined);\r\n }\r\n }\r\n return (\r\n \r\n {menuItem}\r\n {subMenu}\r\n \r\n );\r\n });\r\n return (this._renderMenu(levelClassName, menuOptions, activeMenu));\r\n }\r\n private _renderButtonMenuItem(option: IMenuItemData, activeMenu?: number, index?: number): JSX.Element | null {\r\n const { Button } = this.props;\r\n const isActive = (option === this.activeMenuItem) || (option === this.activeSubMenuItem);\r\n const activeClass = `${Button.className} ${isActive ? this.activeClassName : ''}`;\r\n return (\r\n this._mainNavClick(option) : this._handleDropdownToggle(option, activeMenu)}\r\n onMouseEnter={!this.props.isMobileView ? this._handleDropdownToggle(option, activeMenu) : false}\r\n onFocus={!this.props.isMobileView ? this._handleDropdownToggle(option, activeMenu) : false}\r\n aria-haspopup={true}\r\n aria-expanded={this.state.activeMenu && this.state.activeMenu === option.id ? true : false}\r\n data-parent={activeMenu}\r\n aria-current={isActive && 'page'}\r\n >\r\n {option.linkText}\r\n \r\n );\r\n }\r\n private _mainNavClick = (option: IMenuItemData) => {\r\n const link = option.linkURL;\r\n if (link) {\r\n window.location.href = link;\r\n }\r\n };\r\n private _renderLinkMenuItem(option: IMenuItemData, index?: number): JSX.Element | null {\r\n const { Link } = this.props;\r\n const isActive = (option === this.activeSubMenuItem) || (option === this.activeMenuItem);\r\n const activeClass = `${Link.className} ${isActive ? this.activeClassName : ''}`;\r\n return (\r\n \r\n {option.linkText}\r\n \r\n );\r\n }\r\n private _renderSpanMenuItem(option: IMenuItemData, index?: number): JSX.Element | null {\r\n const { Span } = this.props;\r\n return (\r\n {option.linkText}\r\n );\r\n }\r\n private _renderMenu(level: string, menuOptions: JSX.Element[], currentItem?: number): JSX.Element | null {\r\n const { MenuList } = this.props;\r\n this.currentLevel = 1;\r\n return (\r\n \r\n {menuOptions}\r\n \r\n );\r\n }\r\n private _handleDropdownToggle = (data: IMenuItemData, parentId?: number) => () => {\r\n let activeMenu;\r\n if(this.props.isMobileView) {\r\n activeMenu = (this.state.activeMenu && this.state.activeMenu === data.id!) ? undefined : data.id!;\r\n } else {\r\n activeMenu = data.id;\r\n }\r\n this.setState({\r\n activeMenu,\r\n parentMenu: parentId\r\n });\r\n this._resetFocus();\r\n };\r\n private _resetFocus = () => {\r\n if (this.props.isMobileView) {\r\n setTimeout(() => {\r\n this.menuNode && this.menuNode.current && this.menuNode.current.focus();\r\n }, 0);\r\n }\r\n };\r\n // tslint:disable-next-line:no-any\r\n private _handleClickOutside = (event: any) => {\r\n const burgerMenu:boolean = event.target.className === 'ms-header__nav-icon msc-btn';\r\n if (this.menuNode.current && !this.menuNode.current.contains(event.target) && !burgerMenu) {\r\n this.setState({ navOpen: false });\r\n }\r\n };\r\n private _closeSubmenu(): void {\r\n if (!this.props.isMobileView) {\r\n this.setState({ activeMenu: undefined, mobileViewLabelText: '' });\r\n }\r\n }\r\n}\r\nexport default NavigationMenuView;","/*---------------------------------------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License. See License.txt in the project root for license information.\r\n *--------------------------------------------------------------------------------------------*/\r\nimport { Module, Node } from '@msdyn365-commerce-modules/utilities';\r\nimport msdyn365Commerce from '@msdyn365-commerce/core-internal';\r\nimport classnames from 'classnames';\r\nimport * as React from 'react';\r\nimport { INavigationMenuViewProps } from '../../../modules/smwe-navigation-menu/./smwe-navigation-menu';\r\nimport { IMenuItemData } from '../../../modules/smwe-navigation-menu/./smwe-navigation-menu.data';\r\nimport { ISmweNavigationMenuProps } from '../definition-extensions/smwe-navigation-menu.ext.props.autogenerated';\r\n\r\ninterface INavigationState {\r\n parentMenu?: number;\r\n activeMenu?: number;\r\n mobileViewLabelText?: string;\r\n menuHeight?: number;\r\n initialMenuItem?: number;\r\n navOpen: boolean;\r\n}\r\n\r\ninterface IMenuItemDataClass extends IMenuItemData {\r\n className?: string;\r\n}\r\n\r\n/**\r\n *\r\n * NavigationMenuView component\r\n * @extends {React.PureComponent}\r\n */\r\nexport class NavigationMenuView extends React.PureComponent, INavigationState> {\r\n private supportedLevel: number = 3;\r\n private currentLevel: number = 0;\r\n private menuNode: React.RefObject;\r\n private pathName: string = '';\r\n private activeClassName: string = 'selected';\r\n private activeMenuItem: IMenuItemData = {};\r\n private activeSubMenuItem: IMenuItemData = {};\r\n\r\n constructor(props: INavigationMenuViewProps & ISmweNavigationMenuProps<{}>) {\r\n super(props);\r\n this.menuNode = React.createRef();\r\n this.state = {\r\n activeMenu: undefined,\r\n mobileViewLabelText: '',\r\n parentMenu: undefined,\r\n navOpen: false,\r\n menuHeight: 0,\r\n initialMenuItem: undefined\r\n };\r\n this._closeSubmenu = this._closeSubmenu.bind(this);\r\n this._onMobNavOpen = this._onMobNavOpen.bind(this);\r\n this._onMobNavClose = this._onMobNavClose.bind(this);\r\n }\r\n\r\n public componentDidMount(): void {\r\n document.getElementById('ms-header__subnav-fade')?.addEventListener('mousedown', this._handleClickOutside);\r\n }\r\n\r\n public componentDidUpdate(): void {\r\n const menuHeight = this.menuNode.current?.clientHeight;\r\n this.setState({ menuHeight: menuHeight });\r\n if (msdyn365Commerce.isBrowser) {\r\n document.documentElement.style.setProperty('--navMenuHeight', `${this.state.menuHeight}px`);\r\n }\r\n }\r\n\r\n public componentWillUnmount(): void {\r\n document.getElementById('ms-header__subnav-fade')?.removeEventListener('mousedown', this._handleClickOutside, false);\r\n }\r\n\r\n public render(): JSX.Element | null {\r\n const { isMobileView, MenuList, Navigation } = this.props;\r\n const className = this.props.config.className;\r\n // get current pathname\r\n if (process.env.CURRENT_ENVIRONMENT === 'web') {\r\n this.pathName = window.location.pathname;\r\n } else {\r\n this.pathName = this.props.context.request.url.requestUrl.pathname;\r\n }\r\n\r\n this.props.menuItemData.forEach((item, index) => {\r\n const ItemPath = this._getPathNameFromURL(item.linkURL || '');\r\n item.subMenu && item.subMenu.forEach((subItem, subIndex) => {\r\n const subItemPath = this._getPathNameFromURL(subItem.linkURL || '');\r\n if (subItemPath === this.pathName) {\r\n this.activeMenuItem = item;\r\n this.activeSubMenuItem = subItem;\r\n this.setState({ initialMenuItem: this.activeMenuItem.id });\r\n }\r\n });\r\n if (ItemPath === this.pathName) {\r\n this.activeMenuItem = item;\r\n }\r\n });\r\n\r\n this.currentLevel = 1;\r\n return (\r\n \r\n \r\n \r\n \r\n {this._renderDisplay()}\r\n \r\n \r\n
\r\n \r\n );\r\n }\r\n\r\n private _getPathNameFromURL(linkURL: string): string {\r\n let pathName = '';\r\n try {\r\n // if linkURL is a full url\r\n pathName = new URL(linkURL).pathname;\r\n } catch {\r\n pathName = linkURL.split('?')[0];\r\n }\r\n return pathName;\r\n }\r\n\r\n private _onMobNavOpen(): void {\r\n const firstNavItem = this.props.menuItemData[0]?.id;\r\n\r\n this.setState({\r\n activeMenu: this.state.initialMenuItem !== undefined ? this.state.initialMenuItem : firstNavItem || undefined,\r\n navOpen: true\r\n });\r\n this._addFixedBodyPosition();\r\n }\r\n\r\n private _onMobNavClose(): void {\r\n this.setState({\r\n activeMenu: undefined,\r\n navOpen: false\r\n });\r\n this._removeFixedBodyPosition();\r\n }\r\n\r\n private _renderDisplay(): JSX.Element[] {\r\n const { ListItem, menuItemData } = this.props;\r\n const menuItemList: JSX.Element[] = [];\r\n const isMobileView: boolean = this.props.isMobileView || false;\r\n const expandOnClick: boolean = this.props.config.expandOnClick || false;\r\n menuItemData.forEach((item: IMenuItemData, index: number) => {\r\n menuItemList.push(\r\n \r\n {this._createMenuItemList(item, item.id)}\r\n \r\n );\r\n });\r\n\r\n return menuItemList;\r\n }\r\n\r\n private _createMenuItemList(menuItemData: IMenuItemData, idx?: number): JSX.Element | null {\r\n if (menuItemData && menuItemData.subMenu && menuItemData.subMenu.length > 0) {\r\n return (\r\n \r\n {this._renderButtonMenuItem(menuItemData, menuItemData.id, idx)}\r\n \r\n {this._renderSubMenu(menuItemData.subMenu, menuItemData.id)}\r\n \r\n \r\n );\r\n } else if (menuItemData && menuItemData.linkText && menuItemData.linkURL && menuItemData.linkURL.length > 0) {\r\n return (this._renderLinkMenuItem(menuItemData));\r\n } else if (menuItemData && menuItemData.linkText && !menuItemData.linkURL) {\r\n return (this._renderSpanMenuItem(menuItemData));\r\n }\r\n\r\n return null;\r\n }\r\n\r\n private _renderSubMenu(subMenus?: IMenuItemDataClass[], activeMenu?: number, openInNewTab?: boolean): JSX.Element | null {\r\n const { ListItem } = this.props;\r\n\r\n if (!subMenus || subMenus.length === 0) {\r\n return null;\r\n }\r\n\r\n let levelClassName: string = '';\r\n const menuOptions = subMenus && subMenus.map((option: IMenuItemDataClass, idx: number) => {\r\n const hasOptions = (option.subMenu && option.subMenu.length > 0);\r\n let menuItem: JSX.Element | null;\r\n if (hasOptions) {\r\n menuItem = this._renderButtonMenuItem(option, activeMenu, idx);\r\n } else {\r\n menuItem = (option.linkURL\r\n ? this._renderLinkMenuItem(option, idx, openInNewTab)\r\n : this._renderSpanMenuItem(option)\r\n );\r\n }\r\n\r\n let subMenu;\r\n\r\n if (hasOptions) {\r\n this.currentLevel++;\r\n if (this.currentLevel <= this.supportedLevel - 1) {\r\n levelClassName = `level-${this.currentLevel.toString()}`;\r\n subMenu = this._renderSubMenu(option.subMenu, option.id, openInNewTab);\r\n }\r\n }\r\n\r\n return (\r\n \r\n {menuItem}\r\n {subMenu}\r\n \r\n );\r\n });\r\n\r\n return this._renderMenu(levelClassName, menuOptions, activeMenu);\r\n }\r\n\r\n private _renderButtonMenuItem(option: IMenuItemData, activeMenu?: number, index?: number): JSX.Element | null {\r\n const { Button } = this.props;\r\n const isActive = (option === this.activeMenuItem) || (option === this.activeSubMenuItem);\r\n const activeClass = `${Button.className} ${isActive ? this.activeClassName : ''}`;\r\n const isMobileView: boolean = this.props.isMobileView || false;\r\n const expandOnClick: boolean = this.props.config.expandOnClick || false;\r\n\r\n return (\r\n this._mainNavClick(option)}\r\n onMouseEnter={isMobileView || expandOnClick ? false : this._handleDropdownToggle(option, activeMenu)}\r\n aria-haspopup={true}\r\n aria-expanded={this.state.activeMenu && this.state.activeMenu === option.id ? true : false}\r\n data-parent={activeMenu}\r\n aria-current={isActive && 'page'}\r\n >\r\n {option.linkText}\r\n \r\n );\r\n }\r\n\r\n private _mainNavClick = (option: IMenuItemData) => {\r\n const link = option.linkURL;\r\n if (link) {\r\n window.location.href = link;\r\n }\r\n };\r\n\r\n private _renderLinkMenuItem(option: IMenuItemData, index?: number, openInNewTab?: boolean): JSX.Element | null {\r\n const { Link } = this.props;\r\n const isActive = (option === this.activeSubMenuItem) || (option === this.activeMenuItem);\r\n\r\n return (\r\n \r\n {option.linkText}\r\n \r\n );\r\n }\r\n\r\n private _renderSpanMenuItem(option: IMenuItemData, index?: number): JSX.Element | null {\r\n const { Span } = this.props;\r\n return (\r\n {option.linkText}\r\n );\r\n }\r\n\r\n private _renderMenu(level: string, menuOptions: JSX.Element[], currentItem?: number): JSX.Element | null {\r\n const { MenuList } = this.props;\r\n this.currentLevel = 1;\r\n const stateClass = currentItem && currentItem === this.state.activeMenu ? 'expanded' : 'collapsed';\r\n\r\n return (\r\n \r\n {menuOptions}\r\n \r\n );\r\n }\r\n\r\n private _handleDropdownToggle = (data: IMenuItemData, parentId?: number) => () => {\r\n const activeMenu = data.id;\r\n this.setState({\r\n activeMenu,\r\n parentMenu: parentId,\r\n navOpen: true\r\n });\r\n this._addFixedBodyPosition();\r\n this._resetFocus();\r\n };\r\n\r\n private _resetFocus = () => {\r\n if (this.props.isMobileView) {\r\n setTimeout(() => {\r\n this.menuNode && this.menuNode.current && this.menuNode.current.focus();\r\n }, 0);\r\n }\r\n };\r\n\r\n // tslint:disable-next-line:no-any\r\n private _handleClickOutside = (event: any) => {\r\n const burgerMenu: boolean = event.target.className === 'ms-header__nav-icon';\r\n\r\n if (this.menuNode.current && !this.menuNode.current.contains(event.target)) {\r\n this.setState({ activeMenu: undefined, mobileViewLabelText: '' });\r\n\r\n if (!burgerMenu) {\r\n this.setState({ navOpen: false });\r\n }\r\n }\r\n\r\n this._removeFixedBodyPosition();\r\n this._resetFocus();\r\n };\r\n\r\n private _closeSubmenu(): void {\r\n this.setState({\r\n activeMenu: undefined,\r\n mobileViewLabelText: '',\r\n navOpen: false\r\n });\r\n this._removeFixedBodyPosition();\r\n this._resetFocus();\r\n }\r\n\r\n private _addFixedBodyPosition(): void {\r\n document.body?.classList.add('fixed');\r\n }\r\n\r\n private _removeFixedBodyPosition(): void {\r\n document.body?.classList.remove('fixed');\r\n }\r\n}\r\n\r\nexport default NavigationMenuView;\r\n","/*---------------------------------------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License. See License.txt in the project root for license information.\r\n *--------------------------------------------------------------------------------------------*/\r\nimport { IMenuItemData, INavigationMenuViewProps } from '@msdyn365-commerce-modules/navigation-menu';\r\nimport { Module, Node } from '@msdyn365-commerce-modules/utilities';\r\nimport classnames from 'classnames';\r\nimport * as React from 'react';\r\n\r\ninterface INavigationState {\r\n parentMenu?: number;\r\n activeMenu?: number;\r\n mobileViewLabelText?: string;\r\n navOpen: boolean;\r\n}\r\n\r\ninterface IMenuItemDataClass extends IMenuItemData {\r\n className?: string;\r\n}\r\n\r\n/**\r\n *\r\n * NavigationMenuView component\r\n * @extends {React.PureComponent}\r\n */\r\nexport class NavigationMenuView extends React.PureComponent {\r\n private supportedLevel: number = 3;\r\n private currentLevel: number = 0;\r\n private menuNode: React.RefObject;\r\n private pathName: string = '';\r\n private activeClassName: string = 'selected';\r\n private activeMenuItem: IMenuItemData = {};\r\n private activeSubMenuItem: IMenuItemData = {};\r\n\r\n constructor(props: INavigationMenuViewProps) {\r\n super(props);\r\n this.menuNode = React.createRef();\r\n this.state = { activeMenu: undefined, mobileViewLabelText: '', parentMenu: undefined, navOpen: false };\r\n this._closeSubmenu = this._closeSubmenu.bind(this);\r\n this._onMobNavTrigger = this._onMobNavTrigger.bind(this);\r\n }\r\n\r\n public componentDidMount(): void {\r\n document.body && document.body.addEventListener('mousedown', this._handleClickOutside);\r\n }\r\n\r\n public componentWillUnmount(): void {\r\n document.body && document.body.removeEventListener('mousedown', this._handleClickOutside, false);\r\n }\r\n\r\n public render(): JSX.Element | null {\r\n const { isMobileView, MenuList, Navigation } = this.props;\r\n // get current pathname\r\n if (process.env.CURRENT_ENVIRONMENT === 'web') {\r\n this.pathName = window.location.pathname;\r\n } else {\r\n this.pathName = this.props.context.request.url.requestUrl.pathname;\r\n }\r\n\r\n // for wine-shop links, only \"all wines\" page should make \"wine shop\" link active\r\n // TODO: \"wine shop\" menu link has different behavior, it doesn't get highlighted unless on the \"all wines\" page\r\n\r\n // if (this.pathName.startsWith('/fth/wine-shop/')) {\r\n // if (this.pathName.startsWith('/fth/wine-shop/5637149842.c') || this.pathName.startsWith('/fth/wine-shop/all-wines/5637149843.c')) {\r\n // // get \"wine shop\" menu item\r\n // this.props.menuItemData.forEach((item, index) => {\r\n // if (item.linkURL && item.linkURL.startsWith('/fth/wine-shop/')) {\r\n // this.activeMenuItem = item;\r\n // }\r\n // });\r\n // }\r\n // } else {\r\n this.props.menuItemData.forEach((item, index) => {\r\n const ItemPath = this._getPathNameFromURL(item.linkURL || '');\r\n item.subMenu && item.subMenu.forEach((subItem, subIndex) => {\r\n const subItemPath = this._getPathNameFromURL(subItem.linkURL || '');\r\n if (subItemPath === this.pathName) {\r\n this.activeMenuItem = item;\r\n this.activeSubMenuItem = subItem;\r\n }\r\n });\r\n if (ItemPath === this.pathName) {\r\n this.activeMenuItem = item;\r\n }\r\n });\r\n // }\r\n\r\n this.currentLevel = 1;\r\n return (\r\n \r\n \r\n \r\n \r\n {this._renderDisplay()}\r\n \r\n \r\n \r\n );\r\n }\r\n\r\n private _getPathNameFromURL(linkURL: string): string {\r\n let pathName = '';\r\n try {\r\n // if linkURL is a full url\r\n pathName = new URL(linkURL).pathname;\r\n } catch {\r\n pathName = linkURL.split('?')[0];\r\n }\r\n return pathName;\r\n }\r\n\r\n private _onMobNavTrigger(): void {\r\n this.setState(state => ({\r\n navOpen: !state.navOpen\r\n }));\r\n }\r\n\r\n private _renderDisplay(): JSX.Element[] {\r\n const { ListItem, menuItemData } = this.props;\r\n const menuItemList: JSX.Element[] = [];\r\n menuItemData.forEach((item: IMenuItemData, index: number) => {\r\n menuItemList.push(\r\n \r\n {this._createMenuItemList(item)}\r\n \r\n );\r\n });\r\n\r\n return menuItemList;\r\n }\r\n\r\n private _createMenuItemList(menuItemData: IMenuItemData): JSX.Element | null {\r\n if (menuItemData && menuItemData.subMenu && menuItemData.subMenu.length > 0) {\r\n if (this.props.isMobileView) {\r\n return (\r\n \r\n {this._renderButtonMenuItem(menuItemData)}\r\n \r\n {this._renderSubMenu(menuItemData.subMenu, menuItemData.id)}\r\n \r\n );\r\n } else {\r\n return (\r\n \r\n {this._renderButtonMenuItem(menuItemData)}\r\n {this._renderSubMenu(menuItemData.subMenu, menuItemData.id)}\r\n \r\n );\r\n }\r\n } else if (menuItemData && menuItemData.linkText && menuItemData.linkURL && menuItemData.linkURL.length > 0) {\r\n return (this._renderLinkMenuItem(menuItemData));\r\n } else if (menuItemData && menuItemData.linkText && !menuItemData.linkURL) {\r\n return (this._renderSpanMenuItem(menuItemData));\r\n }\r\n\r\n return null;\r\n }\r\n\r\n private _renderSubMenu(subMenus?: IMenuItemDataClass[], activeMenu?: number): JSX.Element | null {\r\n const { isMobileView, ListItem } = this.props;\r\n if (activeMenu && this.state.activeMenu !== activeMenu && !isMobileView) {\r\n return null;\r\n }\r\n\r\n if (!subMenus || subMenus.length === 0) {\r\n return null;\r\n }\r\n\r\n let levelClassName: string = '';\r\n const menuOptions = subMenus && subMenus.map((option: IMenuItemDataClass, idx: number) => {\r\n const hasOptions = (option.subMenu && option.subMenu.length > 0);\r\n let menuItem: JSX.Element | null;\r\n if (hasOptions && isMobileView) {\r\n menuItem = this._renderButtonMenuItem(option, activeMenu, idx);\r\n } else {\r\n menuItem = (option.linkURL\r\n ? this._renderLinkMenuItem(option, idx)\r\n : this._renderSpanMenuItem(option)\r\n );\r\n }\r\n\r\n let subMenu;\r\n\r\n if (hasOptions) {\r\n this.currentLevel++;\r\n if (this.currentLevel <= this.supportedLevel - 1) {\r\n levelClassName = `level-${this.currentLevel.toString()}`;\r\n subMenu = this._renderSubMenu(option.subMenu, isMobileView ? option.id : undefined);\r\n }\r\n }\r\n\r\n return (\r\n \r\n {menuItem}\r\n {subMenu}\r\n \r\n );\r\n });\r\n\r\n return (this._renderMenu(levelClassName, menuOptions, activeMenu));\r\n }\r\n\r\n private _renderButtonMenuItem(option: IMenuItemData, activeMenu?: number, index?: number): JSX.Element | null {\r\n const { Button } = this.props;\r\n const isActive = (option === this.activeMenuItem) || (option === this.activeSubMenuItem);\r\n const activeClass = `${Button.className} ${isActive ? this.activeClassName : ''}`;\r\n\r\n return (\r\n this._mainNavClick(option) : this._handleDropdownToggle(option, activeMenu)}\r\n onMouseEnter={!this.props.isMobileView ? this._handleDropdownToggle(option, activeMenu) : false}\r\n onFocus={!this.props.isMobileView ? this._handleDropdownToggle(option, activeMenu) : false}\r\n aria-haspopup={true}\r\n aria-expanded={this.state.activeMenu && this.state.activeMenu === option.id ? true : false}\r\n data-parent={activeMenu}\r\n aria-current={isActive && 'page'}\r\n >\r\n {option.linkText}\r\n \r\n );\r\n }\r\n\r\n private _mainNavClick = (option: IMenuItemData) => {\r\n const link = option.linkURL;\r\n if (link) {\r\n window.location.href = link;\r\n }\r\n };\r\n\r\n private _renderLinkMenuItem(option: IMenuItemData, index?: number): JSX.Element | null {\r\n const { Link } = this.props;\r\n const isActive = (option === this.activeSubMenuItem) || (option === this.activeMenuItem);\r\n const activeClass = `${Link.className} ${isActive ? this.activeClassName : ''}`;\r\n\r\n return (\r\n \r\n {option.linkText}\r\n \r\n );\r\n }\r\n\r\n private _renderSpanMenuItem(option: IMenuItemData, index?: number): JSX.Element | null {\r\n const { Span } = this.props;\r\n return (\r\n {option.linkText}\r\n );\r\n }\r\n\r\n private _renderMenu(level: string, menuOptions: JSX.Element[], currentItem?: number): JSX.Element | null {\r\n const { MenuList } = this.props;\r\n this.currentLevel = 1;\r\n return (\r\n \r\n {menuOptions}\r\n \r\n );\r\n }\r\n\r\n private _handleDropdownToggle = (data: IMenuItemData, parentId?: number) => () => {\r\n let activeMenu;\r\n if(this.props.isMobileView) {\r\n activeMenu = (this.state.activeMenu && this.state.activeMenu === data.id!) ? undefined : data.id!;\r\n } else {\r\n activeMenu = data.id;\r\n }\r\n this.setState({\r\n activeMenu,\r\n parentMenu: parentId\r\n });\r\n\r\n this._resetFocus();\r\n };\r\n\r\n private _resetFocus = () => {\r\n if (this.props.isMobileView) {\r\n setTimeout(() => {\r\n this.menuNode && this.menuNode.current && this.menuNode.current.focus();\r\n }, 0);\r\n }\r\n };\r\n\r\n // tslint:disable-next-line:no-any\r\n private _handleClickOutside = (event: any) => {\r\n const burgerMenu:boolean = event.target.className === 'ms-header__nav-icon msc-btn';\r\n if (this.menuNode.current && !this.menuNode.current.contains(event.target) && !burgerMenu) {\r\n this.setState({ navOpen: false });\r\n }\r\n };\r\n\r\n private _closeSubmenu(): void {\r\n if (!this.props.isMobileView) {\r\n this.setState({ activeMenu: undefined, mobileViewLabelText: '' });\r\n }\r\n }\r\n}\r\n\r\nexport default NavigationMenuView;","/*---------------------------------------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License. See License.txt in the project root for license information.\r\n *--------------------------------------------------------------------------------------------*/\r\nimport { Module, Node } from '@msdyn365-commerce-modules/utilities';\r\nimport classnames from 'classnames';\r\nimport * as React from 'react';\r\nimport { INavigationMenuViewProps } from '../../../modules/smwe-navigation-menu/./smwe-navigation-menu';\r\nimport { IMenuItemData } from '../../../modules/smwe-navigation-menu/./smwe-navigation-menu.data';\r\nimport { ISmweNavigationMenuProps } from '../definition-extensions/smwe-navigation-menu.ext.props.autogenerated';\r\n\r\ninterface INavigationState {\r\n parentMenu?: number;\r\n activeMenu?: number;\r\n mobileViewLabelText?: string;\r\n navOpen: boolean;\r\n}\r\n\r\n/**\r\n *\r\n * NavigationMenuView component\r\n * @extends {React.PureComponent}\r\n */\r\nexport class NavigationMenuView extends React.PureComponent, INavigationState> {\r\n private supportedLevel: number = 3;\r\n private currentLevel: number = 0;\r\n private menuNode: React.RefObject;\r\n private pathName: string = '';\r\n private activeClassName: string = 'selected';\r\n private activeMenuItem: IMenuItemData = {};\r\n private activeSubMenuItem: IMenuItemData = {};\r\n\r\n constructor(props: INavigationMenuViewProps & ISmweNavigationMenuProps<{}>) {\r\n super(props);\r\n this.menuNode = React.createRef();\r\n this.state = {\r\n activeMenu: undefined,\r\n mobileViewLabelText: '',\r\n parentMenu: undefined,\r\n navOpen: false\r\n };\r\n this._closeSubmenu = this._closeSubmenu.bind(this);\r\n this._onMobNavTrigger = this._onMobNavTrigger.bind(this);\r\n }\r\n\r\n public componentDidMount(): void {\r\n document.body && document.body.addEventListener('mousedown', this._handleClickOutside);\r\n }\r\n\r\n public componentWillUnmount(): void {\r\n document.body && document.body.removeEventListener('mousedown', this._handleClickOutside, false);\r\n }\r\n\r\n public render(): JSX.Element | null {\r\n const { isMobileView, MenuList, Navigation } = this.props;\r\n const className = this.props.config.className;\r\n // get current pathname\r\n if (process.env.CURRENT_ENVIRONMENT === 'web') {\r\n this.pathName = window.location.pathname;\r\n } else {\r\n this.pathName = this.props.context.request.url.requestUrl.pathname;\r\n }\r\n\r\n this.props.menuItemData.forEach((item, index) => {\r\n const ItemPath = this._getPathNameFromURL(item.linkURL || '');\r\n item.subMenu && item.subMenu.forEach((subItem, subIndex) => {\r\n const subItemPath = this._getPathNameFromURL(subItem.linkURL || '');\r\n if (subItemPath === this.pathName) {\r\n this.activeMenuItem = item;\r\n this.activeSubMenuItem = subItem;\r\n }\r\n });\r\n if (ItemPath === this.pathName) {\r\n this.activeMenuItem = item;\r\n }\r\n });\r\n\r\n this.currentLevel = 1;\r\n return (\r\n \r\n \r\n \r\n \r\n {this._renderDisplay()}\r\n \r\n \r\n \r\n );\r\n }\r\n\r\n private _getPathNameFromURL(linkURL: string): string {\r\n let pathName = '';\r\n try {\r\n // if linkURL is a full url\r\n pathName = new URL(linkURL).pathname;\r\n } catch {\r\n pathName = linkURL.split('?')[0];\r\n }\r\n return pathName;\r\n }\r\n\r\n private _onMobNavTrigger(): void {\r\n this.setState(state => ({\r\n navOpen: !state.navOpen\r\n }));\r\n }\r\n\r\n private _renderDisplay(): JSX.Element[] {\r\n const { ListItem, menuItemData } = this.props;\r\n const menuItemList: JSX.Element[] = [];\r\n const isMobileView: boolean = this.props.isMobileView || false;\r\n const expandOnClick: boolean = this.props.config.expandOnClick || false;\r\n\r\n menuItemData.forEach((item: IMenuItemData, index: number) => {\r\n menuItemList.push(\r\n \r\n {this._createMenuItemList(item)}\r\n \r\n );\r\n });\r\n\r\n return menuItemList;\r\n }\r\n\r\n private _createMenuItemList(menuItemData: IMenuItemData): JSX.Element | null {\r\n if (menuItemData && menuItemData.subMenu && menuItemData.subMenu.length > 0) {\r\n if (this.props.isMobileView) {\r\n return (\r\n \r\n {this._renderButtonMenuItem(menuItemData)}\r\n \r\n \r\n {this._renderSubMenu(menuItemData.subMenu, menuItemData.id)}\r\n \r\n \r\n );\r\n } else {\r\n return (\r\n \r\n {this._renderButtonMenuItem(menuItemData)}\r\n {this._renderSubMenu(menuItemData.subMenu, menuItemData.id)}\r\n \r\n );\r\n }\r\n } else if (menuItemData && menuItemData.linkText && menuItemData.linkURL && menuItemData.linkURL.length > 0) {\r\n return (this._renderLinkMenuItem(menuItemData));\r\n } else if (menuItemData && menuItemData.linkText && !menuItemData.linkURL) {\r\n return (this._renderSpanMenuItem(menuItemData));\r\n }\r\n\r\n return null;\r\n }\r\n\r\n private _renderSubMenu(subMenus?: IMenuItemData[], activeMenu?: number): JSX.Element | null {\r\n const { isMobileView, ListItem } = this.props;\r\n\r\n if (!subMenus || subMenus.length === 0) {\r\n return null;\r\n }\r\n\r\n let levelClassName: string = '';\r\n const menuOptions = subMenus && subMenus.map((option: IMenuItemData, idx: number) => {\r\n const hasOptions = (option.subMenu && option.subMenu.length > 0);\r\n let menuItem: JSX.Element | null;\r\n if (hasOptions && isMobileView) {\r\n menuItem = this._renderButtonMenuItem(option, activeMenu, idx);\r\n } else {\r\n menuItem = (option.linkURL\r\n ? this._renderLinkMenuItem(option, idx)\r\n : this._renderSpanMenuItem(option)\r\n );\r\n }\r\n\r\n let subMenu;\r\n\r\n if (hasOptions) {\r\n this.currentLevel++;\r\n if (this.currentLevel <= this.supportedLevel - 1) {\r\n levelClassName = `level-${this.currentLevel.toString()}`;\r\n subMenu = this._renderSubMenu(option.subMenu, isMobileView ? option.id : undefined);\r\n }\r\n }\r\n\r\n return (\r\n \r\n {menuItem}\r\n {subMenu}\r\n \r\n );\r\n });\r\n\r\n return this._renderMenu(levelClassName, menuOptions, activeMenu);\r\n }\r\n\r\n private _renderButtonMenuItem(option: IMenuItemData, activeMenu?: number, index?: number): JSX.Element | null {\r\n const { Button } = this.props;\r\n const isActive = (option === this.activeMenuItem) || (option === this.activeSubMenuItem);\r\n const activeClass = `${Button.className} ${isActive ? this.activeClassName : ''}`;\r\n const isMobileView: boolean = this.props.isMobileView || false;\r\n const expandOnClick: boolean = this.props.config.expandOnClick || false;\r\n\r\n return (\r\n this._mainNavClick(option)}\r\n onMouseEnter={isMobileView || expandOnClick ? false : this._handleDropdownToggle(option, activeMenu)}\r\n onFocus={isMobileView || expandOnClick ? this._closeSubmenu : this._handleDropdownToggle(option, activeMenu)}\r\n aria-haspopup={true}\r\n aria-expanded={this.state.activeMenu && this.state.activeMenu === option.id ? true : false}\r\n data-parent={activeMenu}\r\n aria-current={isActive && 'page'}\r\n >\r\n {option.linkText}\r\n \r\n );\r\n }\r\n\r\n private _mainNavClick = (option: IMenuItemData) => {\r\n const link = option.linkURL;\r\n if (link) {\r\n window.location.href = link;\r\n }\r\n };\r\n\r\n private _renderLinkMenuItem(option: IMenuItemData, index?: number): JSX.Element | null {\r\n const { Link } = this.props;\r\n const { openSubmenuItemsNewTab } = this.props.config;\r\n const openSubmenuItemsNewTabArray = openSubmenuItemsNewTab && openSubmenuItemsNewTab.split(',');\r\n const openInNewTab = openSubmenuItemsNewTabArray && openSubmenuItemsNewTabArray.find(item => item.toLowerCase() === option.linkText?.toLowerCase());\r\n const isActive = (option === this.activeSubMenuItem) || (option === this.activeMenuItem);\r\n\r\n return (\r\n \r\n {option.imageSource && (\r\n
\r\n {option.linkText}\r\n
\r\n )}\r\n \r\n {option.linkText}\r\n \r\n
\r\n );\r\n }\r\n\r\n private _renderSpanMenuItem(option: IMenuItemData, index?: number): JSX.Element | null {\r\n const { Span } = this.props;\r\n return (\r\n {option.linkText}\r\n );\r\n }\r\n\r\n private _renderMenu(level: string, menuOptions: JSX.Element[], currentItem?: number): JSX.Element | null {\r\n const { MenuList } = this.props;\r\n this.currentLevel = 1;\r\n\r\n return (\r\n \r\n {level === 'level-2' && currentItem && this._renderSubNavButton(currentItem)}\r\n {menuOptions}\r\n \r\n );\r\n }\r\n\r\n private _renderSubNavButton(currentItem: number): JSX.Element {\r\n return (\r\n \r\n );\r\n }\r\n\r\n private _handleDropdownToggle = (data: IMenuItemData, parentId?: number) => () => {\r\n let activeMenu;\r\n if (this.props.isMobileView) {\r\n activeMenu = (this.state.activeMenu && this.state.activeMenu === data.id!) ? undefined : data.id!;\r\n } else {\r\n activeMenu = data.id;\r\n }\r\n this.setState({\r\n activeMenu,\r\n parentMenu: parentId\r\n });\r\n\r\n this._resetFocus();\r\n };\r\n\r\n private _resetFocus = () => {\r\n if (this.props.isMobileView) {\r\n setTimeout(() => {\r\n this.menuNode && this.menuNode.current && this.menuNode.current.focus();\r\n }, 0);\r\n }\r\n };\r\n\r\n // tslint:disable-next-line:no-any\r\n private _handleClickOutside = (event: any) => {\r\n const burgerMenu: boolean = event.target.className === 'ms-header__nav-icon msc-btn';\r\n\r\n if (this.menuNode.current && !this.menuNode.current.contains(event.target)) {\r\n this.setState({ activeMenu: undefined, mobileViewLabelText: '' });\r\n\r\n if (!burgerMenu) {\r\n this.setState({ navOpen: false });\r\n }\r\n }\r\n };\r\n\r\n private _closeSubmenu(): void {\r\n this.setState({ activeMenu: undefined, mobileViewLabelText: '' });\r\n }\r\n}\r\n\r\nexport default NavigationMenuView;\r\n","/*---------------------------------------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License. See License.txt in the project root for license information.\r\n *--------------------------------------------------------------------------------------------*/\r\nimport { Module, Node } from '@msdyn365-commerce-modules/utilities';\r\nimport classnames from 'classnames';\r\nimport * as React from 'react';\r\nimport { INavigationMenuViewProps } from '../../../modules/smwe-navigation-menu/./smwe-navigation-menu';\r\nimport { IMenuItemData } from '../../../modules/smwe-navigation-menu/./smwe-navigation-menu.data';\r\nimport { ISmweNavigationMenuProps } from '../definition-extensions/smwe-navigation-menu.ext.props.autogenerated';\r\n\r\ninterface INavigationState {\r\n parentMenu?: number;\r\n activeMenu?: number;\r\n mobileViewLabelText?: string;\r\n navOpen: boolean;\r\n}\r\n\r\n/**\r\n *\r\n * NavigationMenuView component\r\n * @extends {React.PureComponent}\r\n */\r\nexport class NavigationMenuView extends React.PureComponent, INavigationState> {\r\n private supportedLevel: number = 3;\r\n private currentLevel: number = 0;\r\n private menuNode: React.RefObject;\r\n private pathName: string = '';\r\n private activeClassName: string = 'selected';\r\n private activeMenuItem: IMenuItemData = {};\r\n private activeSubMenuItem: IMenuItemData = {};\r\n\r\n constructor(props: INavigationMenuViewProps & ISmweNavigationMenuProps<{}>) {\r\n super(props);\r\n this.menuNode = React.createRef();\r\n this.state = {\r\n activeMenu: undefined,\r\n mobileViewLabelText: '',\r\n parentMenu: undefined,\r\n navOpen: false\r\n };\r\n this._closeSubmenu = this._closeSubmenu.bind(this);\r\n this._onMobNavTrigger = this._onMobNavTrigger.bind(this);\r\n }\r\n\r\n public componentDidMount(): void {\r\n document.body && document.body.addEventListener('mousedown', this._handleClickOutside);\r\n }\r\n\r\n public componentWillUnmount(): void {\r\n document.body && document.body.removeEventListener('mousedown', this._handleClickOutside, false);\r\n }\r\n\r\n public render(): JSX.Element | null {\r\n const { isMobileView, MenuList, Navigation } = this.props;\r\n const className = this.props.config.className;\r\n // get current pathname\r\n if (process.env.CURRENT_ENVIRONMENT === 'web') {\r\n this.pathName = window.location.pathname;\r\n } else {\r\n this.pathName = this.props.context.request.url.requestUrl.pathname;\r\n }\r\n\r\n this.props.menuItemData.forEach((item, index) => {\r\n const ItemPath = this._getPathNameFromURL(item.linkURL || '');\r\n item.subMenu && item.subMenu.forEach((subItem, subIndex) => {\r\n const subItemPath = this._getPathNameFromURL(subItem.linkURL || '');\r\n if (subItemPath === this.pathName) {\r\n this.activeMenuItem = item;\r\n this.activeSubMenuItem = subItem;\r\n }\r\n });\r\n if (ItemPath === this.pathName) {\r\n this.activeMenuItem = item;\r\n }\r\n });\r\n\r\n this.currentLevel = 1;\r\n return (\r\n \r\n \r\n \r\n \r\n {this._renderDisplay()}\r\n \r\n \r\n \r\n );\r\n }\r\n\r\n private _getPathNameFromURL(linkURL: string): string {\r\n let pathName = '';\r\n try {\r\n // if linkURL is a full url\r\n pathName = new URL(linkURL).pathname;\r\n } catch {\r\n pathName = linkURL.split('?')[0];\r\n }\r\n return pathName;\r\n }\r\n\r\n private _onMobNavTrigger(): void {\r\n this.setState(state => ({\r\n navOpen: !state.navOpen\r\n }));\r\n }\r\n\r\n private _renderDisplay(): JSX.Element[] {\r\n const { ListItem, menuItemData } = this.props;\r\n const menuItemList: JSX.Element[] = [];\r\n const isMobileView: boolean = this.props.isMobileView || false;\r\n const expandOnClick: boolean = this.props.config.expandOnClick || false;\r\n\r\n menuItemData.forEach((item: IMenuItemData, index: number) => {\r\n menuItemList.push(\r\n \r\n {this._createMenuItemList(item)}\r\n \r\n );\r\n });\r\n\r\n return menuItemList;\r\n }\r\n\r\n private _createMenuItemList(menuItemData: IMenuItemData): JSX.Element | null {\r\n if (menuItemData && menuItemData.subMenu && menuItemData.subMenu.length > 0) {\r\n if (this.props.isMobileView) {\r\n return (\r\n \r\n {this._renderButtonMenuItem(menuItemData)}\r\n \r\n \r\n {this._renderSubMenu(menuItemData.subMenu, menuItemData.id)}\r\n \r\n \r\n );\r\n } else {\r\n return (\r\n \r\n {this._renderButtonMenuItem(menuItemData)}\r\n {this._renderSubMenu(menuItemData.subMenu, menuItemData.id)}\r\n \r\n );\r\n }\r\n } else if (menuItemData && menuItemData.linkText && menuItemData.linkURL && menuItemData.linkURL.length > 0) {\r\n return (this._renderLinkMenuItem(menuItemData));\r\n } else if (menuItemData && menuItemData.linkText && !menuItemData.linkURL) {\r\n return (this._renderSpanMenuItem(menuItemData));\r\n }\r\n\r\n return null;\r\n }\r\n\r\n private _renderSubMenu(subMenus?: IMenuItemData[], activeMenu?: number): JSX.Element | null {\r\n const { isMobileView, ListItem } = this.props;\r\n\r\n if (!subMenus || subMenus.length === 0) {\r\n return null;\r\n }\r\n\r\n let levelClassName: string = '';\r\n const menuOptions = subMenus && subMenus.map((option: IMenuItemData, idx: number) => {\r\n const hasOptions = (option.subMenu && option.subMenu.length > 0);\r\n let menuItem: JSX.Element | null;\r\n if (hasOptions && isMobileView) {\r\n menuItem = this._renderButtonMenuItem(option, activeMenu, idx);\r\n } else {\r\n menuItem = (option.linkURL\r\n ? this._renderLinkMenuItem(option, idx)\r\n : this._renderSpanMenuItem(option)\r\n );\r\n }\r\n\r\n let subMenu;\r\n\r\n if (hasOptions) {\r\n this.currentLevel++;\r\n if (this.currentLevel <= this.supportedLevel - 1) {\r\n levelClassName = `level-${this.currentLevel.toString()}`;\r\n subMenu = this._renderSubMenu(option.subMenu, isMobileView ? option.id : undefined);\r\n }\r\n }\r\n\r\n return (\r\n \r\n {menuItem}\r\n {subMenu}\r\n \r\n );\r\n });\r\n\r\n return this._renderMenu(levelClassName, menuOptions, activeMenu);\r\n }\r\n\r\n private _renderButtonMenuItem(option: IMenuItemData, activeMenu?: number, index?: number): JSX.Element | null {\r\n const { Button } = this.props;\r\n const isActive = (option === this.activeMenuItem) || (option === this.activeSubMenuItem);\r\n const activeClass = `${Button.className} ${isActive ? this.activeClassName : ''}`;\r\n const isMobileView: boolean = this.props.isMobileView || false;\r\n const expandOnClick: boolean = this.props.config.expandOnClick || false;\r\n\r\n return (\r\n this._mainNavClick(option)}\r\n onMouseEnter={isMobileView || expandOnClick ? false : this._handleDropdownToggle(option, activeMenu)}\r\n onFocus={isMobileView || expandOnClick ? this._closeSubmenu : this._handleDropdownToggle(option, activeMenu)}\r\n aria-haspopup={true}\r\n aria-expanded={this.state.activeMenu && this.state.activeMenu === option.id ? true : false}\r\n data-parent={activeMenu}\r\n aria-current={isActive && 'page'}\r\n >\r\n {option.linkText}\r\n \r\n );\r\n }\r\n\r\n private _mainNavClick = (option: IMenuItemData) => {\r\n const link = option.linkURL;\r\n if (link) {\r\n window.location.href = link;\r\n }\r\n };\r\n\r\n private _renderLinkMenuItem(option: IMenuItemData, index?: number): JSX.Element | null {\r\n const { Link } = this.props;\r\n const { openSubmenuItemsNewTab } = this.props.config;\r\n const openSubmenuItemsNewTabArray = openSubmenuItemsNewTab && openSubmenuItemsNewTab.split(',');\r\n const openInNewTab = openSubmenuItemsNewTabArray && openSubmenuItemsNewTabArray.find(item => item.toLowerCase() === option.linkText?.toLowerCase());\r\n const isActive = (option === this.activeSubMenuItem) || (option === this.activeMenuItem);\r\n\r\n return (\r\n \r\n {option.imageSource && (\r\n
\r\n {option.linkText}\r\n
\r\n )}\r\n \r\n {option.linkText}\r\n \r\n
\r\n );\r\n }\r\n\r\n private _renderSpanMenuItem(option: IMenuItemData, index?: number): JSX.Element | null {\r\n const { Span } = this.props;\r\n return (\r\n {option.linkText}\r\n );\r\n }\r\n\r\n private _renderMenu(level: string, menuOptions: JSX.Element[], currentItem?: number): JSX.Element | null {\r\n const { MenuList } = this.props;\r\n this.currentLevel = 1;\r\n\r\n return (\r\n \r\n {level === 'level-2' && currentItem && this._renderSubNavButton(currentItem)}\r\n {menuOptions}\r\n \r\n );\r\n }\r\n\r\n private _renderSubNavButton(currentItem: number): JSX.Element {\r\n return (\r\n \r\n );\r\n }\r\n\r\n private _handleDropdownToggle = (data: IMenuItemData, parentId?: number) => () => {\r\n let activeMenu;\r\n if (this.props.isMobileView) {\r\n activeMenu = (this.state.activeMenu && this.state.activeMenu === data.id!) ? undefined : data.id!;\r\n } else {\r\n activeMenu = data.id;\r\n }\r\n this.setState({\r\n activeMenu,\r\n parentMenu: parentId\r\n });\r\n\r\n this._resetFocus();\r\n };\r\n\r\n private _resetFocus = () => {\r\n if (this.props.isMobileView) {\r\n setTimeout(() => {\r\n this.menuNode && this.menuNode.current && this.menuNode.current.focus();\r\n }, 0);\r\n }\r\n };\r\n\r\n // tslint:disable-next-line:no-any\r\n private _handleClickOutside = (event: any) => {\r\n const burgerMenu: boolean = event.target.className === 'ms-header__nav-icon msc-btn';\r\n\r\n if (this.menuNode.current && !this.menuNode.current.contains(event.target)) {\r\n this.setState({ activeMenu: undefined, mobileViewLabelText: '' });\r\n\r\n if (!burgerMenu) {\r\n this.setState({ navOpen: false });\r\n }\r\n }\r\n };\r\n\r\n private _closeSubmenu(): void {\r\n this.setState({ activeMenu: undefined, mobileViewLabelText: '' });\r\n }\r\n}\r\n\r\nexport default NavigationMenuView;\r\n","/*---------------------------------------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License. See License.txt in the project root for license information.\r\n *--------------------------------------------------------------------------------------------*/\r\nimport { Module, Node } from '@msdyn365-commerce-modules/utilities';\r\nimport classnames from 'classnames';\r\nimport * as React from 'react';\r\nimport { INavigationMenuViewProps } from '../../../modules/smwe-navigation-menu/./smwe-navigation-menu';\r\nimport { IMenuItemData } from '../../../modules/smwe-navigation-menu/./smwe-navigation-menu.data';\r\nimport { ISmweNavigationMenuProps } from '../definition-extensions/smwe-navigation-menu.ext.props.autogenerated';\r\n\r\ninterface INavigationState {\r\n parentMenu?: number;\r\n activeMenu?: number;\r\n mobileViewLabelText?: string;\r\n navOpen: boolean;\r\n}\r\n\r\ninterface IMenuItemDataClass extends IMenuItemData {\r\n className?: string;\r\n}\r\n\r\n/**\r\n *\r\n * NavigationMenuView component\r\n * @extends {React.PureComponent}\r\n */\r\nexport class NavigationMenuView extends React.PureComponent, INavigationState> {\r\n private supportedLevel: number = 3;\r\n private currentLevel: number = 0;\r\n private menuNode: React.RefObject;\r\n private pathName: string = '';\r\n private activeClassName: string = 'selected';\r\n private activeMenuItem: IMenuItemData = {};\r\n private activeSubMenuItem: IMenuItemData = {};\r\n\r\n constructor(props: INavigationMenuViewProps & ISmweNavigationMenuProps<{}>) {\r\n super(props);\r\n this.menuNode = React.createRef();\r\n this.state = { activeMenu: undefined, mobileViewLabelText: '', parentMenu: undefined, navOpen: false };\r\n this._closeSubmenu = this._closeSubmenu.bind(this);\r\n this._onMobNavTrigger = this._onMobNavTrigger.bind(this);\r\n }\r\n\r\n public componentDidMount(): void {\r\n document.body && document.body.addEventListener('mousedown', this._handleClickOutside);\r\n }\r\n\r\n public componentWillUnmount(): void {\r\n document.body && document.body.removeEventListener('mousedown', this._handleClickOutside, false);\r\n }\r\n\r\n public render(): JSX.Element | null {\r\n const { isMobileView, MenuList, Navigation } = this.props;\r\n // get current pathname\r\n if (process.env.CURRENT_ENVIRONMENT === 'web') {\r\n this.pathName = window.location.pathname;\r\n } else {\r\n this.pathName = this.props.context.request.url.requestUrl.pathname;\r\n }\r\n\r\n // for wine-shop links, only \"all wines\" page should make \"wine shop\" link active\r\n // TODO: \"wine shop\" menu link has different behavior, it doesn't get highlighted unless on the \"all wines\" page\r\n\r\n // if (this.pathName.startsWith('/fth/wine-shop/')) {\r\n // if (this.pathName.startsWith('/fth/wine-shop/5637149842.c') || this.pathName.startsWith('/fth/wine-shop/all-wines/5637149843.c')) {\r\n // // get \"wine shop\" menu item\r\n // this.props.menuItemData.forEach((item, index) => {\r\n // if (item.linkURL && item.linkURL.startsWith('/fth/wine-shop/')) {\r\n // this.activeMenuItem = item;\r\n // }\r\n // });\r\n // }\r\n // } else {\r\n this.props.menuItemData.forEach((item, index) => {\r\n const ItemPath = this._getPathNameFromURL(item.linkURL || '');\r\n item.subMenu && item.subMenu.forEach((subItem, subIndex) => {\r\n const subItemPath = this._getPathNameFromURL(subItem.linkURL || '');\r\n if (subItemPath === this.pathName) {\r\n this.activeMenuItem = item;\r\n this.activeSubMenuItem = subItem;\r\n }\r\n });\r\n if (ItemPath === this.pathName) {\r\n this.activeMenuItem = item;\r\n }\r\n });\r\n // }\r\n\r\n this.currentLevel = 1;\r\n return (\r\n \r\n \r\n \r\n \r\n {this._renderDisplay()}\r\n \r\n \r\n \r\n );\r\n }\r\n\r\n private _getPathNameFromURL(linkURL: string): string {\r\n let pathName = '';\r\n try {\r\n // if linkURL is a full url\r\n pathName = new URL(linkURL).pathname;\r\n } catch {\r\n pathName = linkURL.split('?')[0];\r\n }\r\n return pathName;\r\n }\r\n\r\n private _onMobNavTrigger(): void {\r\n this.setState(state => ({\r\n navOpen: !state.navOpen\r\n }));\r\n }\r\n\r\n private _renderDisplay(): JSX.Element[] {\r\n const { ListItem, menuItemData } = this.props;\r\n const menuItemList: JSX.Element[] = [];\r\n const isMobileView: boolean = this.props.isMobileView || false;\r\n const expandOnClick: boolean = this.props.config.expandOnClick || false;\r\n menuItemData.forEach((item: IMenuItemData, index: number) => {\r\n menuItemList.push(\r\n \r\n {this._createMenuItemList(item)}\r\n \r\n );\r\n });\r\n\r\n return menuItemList;\r\n }\r\n\r\n private _createMenuItemList(menuItemData: IMenuItemData): JSX.Element | null {\r\n if (menuItemData && menuItemData.subMenu && menuItemData.subMenu.length > 0) {\r\n if (this.props.isMobileView) {\r\n return (\r\n \r\n {this._renderButtonMenuItem(menuItemData)}\r\n \r\n {this._renderSubMenu(menuItemData.subMenu, menuItemData.id)}\r\n \r\n );\r\n } else {\r\n return (\r\n \r\n {this._renderButtonMenuItem(menuItemData)}\r\n {this._renderSubMenu(menuItemData.subMenu, menuItemData.id)}\r\n \r\n );\r\n }\r\n } else if (menuItemData && menuItemData.linkText && menuItemData.linkURL && menuItemData.linkURL.length > 0) {\r\n return (this._renderLinkMenuItem(menuItemData));\r\n } else if (menuItemData && menuItemData.linkText && !menuItemData.linkURL) {\r\n return (this._renderSpanMenuItem(menuItemData));\r\n }\r\n\r\n return null;\r\n }\r\n\r\n private _renderSubMenu(subMenus?: IMenuItemDataClass[], activeMenu?: number): JSX.Element | null {\r\n const { isMobileView, ListItem } = this.props;\r\n if (activeMenu && this.state.activeMenu !== activeMenu && !isMobileView) {\r\n return null;\r\n }\r\n\r\n if (!subMenus || subMenus.length === 0) {\r\n return null;\r\n }\r\n\r\n let levelClassName: string = '';\r\n const menuOptions = subMenus && subMenus.map((option: IMenuItemDataClass, idx: number) => {\r\n const hasOptions = (option.subMenu && option.subMenu.length > 0);\r\n let menuItem: JSX.Element | null;\r\n if (hasOptions && isMobileView) {\r\n menuItem = this._renderButtonMenuItem(option, activeMenu, idx);\r\n } else {\r\n menuItem = (option.linkURL\r\n ? this._renderLinkMenuItem(option, idx)\r\n : this._renderSpanMenuItem(option)\r\n );\r\n }\r\n\r\n let subMenu;\r\n\r\n if (hasOptions) {\r\n this.currentLevel++;\r\n if (this.currentLevel <= this.supportedLevel - 1) {\r\n levelClassName = `level-${this.currentLevel.toString()}`;\r\n subMenu = this._renderSubMenu(option.subMenu, isMobileView ? option.id : undefined);\r\n }\r\n }\r\n\r\n return (\r\n \r\n {menuItem}\r\n {subMenu}\r\n \r\n );\r\n });\r\n\r\n return (this._renderMenu(levelClassName, menuOptions, activeMenu));\r\n }\r\n\r\n private _renderButtonMenuItem(option: IMenuItemData, activeMenu?: number, index?: number): JSX.Element | null {\r\n const { Button } = this.props;\r\n const isActive = (option === this.activeMenuItem) || (option === this.activeSubMenuItem);\r\n const activeClass = `${Button.className} ${isActive ? this.activeClassName : ''}`;\r\n const isMobileView: boolean = this.props.isMobileView || false;\r\n const expandOnClick: boolean = this.props.config.expandOnClick || false;\r\n\r\n return (\r\n this._mainNavClick(option)}\r\n onMouseEnter={isMobileView || expandOnClick ? false : this._handleDropdownToggle(option, activeMenu)}\r\n aria-haspopup={true}\r\n aria-expanded={this.state.activeMenu && this.state.activeMenu === option.id ? true : false}\r\n data-parent={activeMenu}\r\n role=\"menuitem\"\r\n aria-current={isActive && 'page'}\r\n >\r\n {option.linkText}{(this.state.navOpen && this.state.activeMenu && this.state.activeMenu === option.id) ? :}\r\n \r\n );\r\n }\r\n\r\n private _mainNavClick = (option: IMenuItemData) => {\r\n const link = option.linkURL;\r\n if (link) {\r\n window.location.href = link;\r\n }\r\n };\r\n\r\n private _renderLinkMenuItem(option: IMenuItemData, index?: number): JSX.Element | null {\r\n const { Link } = this.props;\r\n const isActive = (option === this.activeSubMenuItem) || (option === this.activeMenuItem);\r\n const activeClass = `${Link.className} ${isActive ? this.activeClassName : ''}`;\r\n\r\n return (\r\n \r\n {option.linkText}\r\n \r\n );\r\n }\r\n\r\n private _renderSpanMenuItem(option: IMenuItemData, index?: number): JSX.Element | null {\r\n const { Span } = this.props;\r\n return (\r\n {option.linkText}\r\n );\r\n }\r\n\r\n private _renderMenu(level: string, menuOptions: JSX.Element[], currentItem?: number): JSX.Element | null {\r\n const { MenuList } = this.props;\r\n this.currentLevel = 1;\r\n return (\r\n \r\n {menuOptions}\r\n \r\n );\r\n }\r\n\r\n private _handleDropdownToggle = (data: IMenuItemData, parentId?: number) => () => {\r\n let activeMenu;\r\n if(this.props.isMobileView) {\r\n activeMenu = (this.state.activeMenu && this.state.activeMenu === data.id!) ? undefined : data.id!;\r\n } else {\r\n activeMenu = data.id;\r\n }\r\n this.setState({\r\n activeMenu,\r\n parentMenu: parentId,\r\n navOpen: true\r\n });\r\n\r\n this._resetFocus();\r\n };\r\n\r\n private _resetFocus = () => {\r\n if (this.props.isMobileView) {\r\n setTimeout(() => {\r\n this.menuNode && this.menuNode.current && this.menuNode.current.focus();\r\n }, 0);\r\n }\r\n };\r\n\r\n // tslint:disable-next-line:no-any\r\n private _handleClickOutside = (event: any) => {\r\n const burgerMenu:boolean = event.target.className === 'ms-header__nav-icon msc-btn';\r\n if (this.menuNode.current && !this.menuNode.current.contains(event.target)) {\r\n this.setState({ activeMenu: undefined, mobileViewLabelText: '' });\r\n\r\n if (!burgerMenu) {\r\n this.setState({ navOpen: false });\r\n }\r\n }\r\n };\r\n\r\n private _closeSubmenu(): void {\r\n if (!this.props.isMobileView) {\r\n this.setState({ activeMenu: undefined, mobileViewLabelText: '', navOpen: false });\r\n }\r\n }\r\n}\r\n\r\nexport default NavigationMenuView;","/*---------------------------------------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License. See License.txt in the project root for license information.\r\n *--------------------------------------------------------------------------------------------*/\r\nimport { IMenuItemData, INavigationMenuViewProps } from '@msdyn365-commerce-modules/navigation-menu';\r\nimport { Module, Node } from '@msdyn365-commerce-modules/utilities';\r\nimport classnames from 'classnames';\r\nimport * as React from 'react';\r\n\r\ninterface INavigationState {\r\n parentMenu?: number;\r\n activeMenu?: number;\r\n mobileViewLabelText?: string;\r\n navOpen: boolean;\r\n}\r\n/**\r\n *\r\n * NavigationMenuView component\r\n * @extends {React.PureComponent}\r\n */\r\nexport class NavigationMenuView extends React.PureComponent {\r\n private supportedLevel: number = 3;\r\n private currentLevel: number = 0;\r\n private menuNode: React.RefObject;\r\n private pathName: string = '';\r\n private activeClassName: string = 'selected';\r\n private activeMenuItem: IMenuItemData = {};\r\n private activeSubMenuItem: IMenuItemData = {};\r\n constructor(props: INavigationMenuViewProps) {\r\n super(props);\r\n this.menuNode = React.createRef();\r\n this.state = { activeMenu: undefined, mobileViewLabelText: '', parentMenu: undefined, navOpen: false };\r\n this._closeSubmenu = this._closeSubmenu.bind(this);\r\n this._onMobNavTrigger = this._onMobNavTrigger.bind(this);\r\n }\r\n\r\n public componentDidMount(): void {\r\n document.body && document.body.addEventListener('click', this._handleClickOutside);\r\n document.body && document.body.addEventListener('keydown', this.trapFocusInsideMenu);\r\n }\r\n public componentWillUnmount(): void {\r\n document.body && document.body.removeEventListener('click', this._handleClickOutside, false);\r\n document.body && document.body.removeEventListener('keydown', this.trapFocusInsideMenu, false);\r\n }\r\n public render(): JSX.Element | null {\r\n const { isMobileView, MenuList, Navigation } = this.props;\r\n // get current pathname\r\n if (process.env.CURRENT_ENVIRONMENT === 'web') {\r\n this.pathName = window.location.pathname;\r\n } else {\r\n this.pathName = this.props.context.request.url.requestUrl.pathname;\r\n }\r\n this.props.menuItemData.forEach((item, index) => {\r\n item.subMenu && item.subMenu.forEach((subItem, subIndex) => {\r\n const subItemPath = this._getPathNameFromURL(subItem.linkURL || '');\r\n if (subItemPath === this.pathName) {\r\n this.activeMenuItem = item;\r\n this.activeSubMenuItem = subItem;\r\n }\r\n });\r\n });\r\n this.currentLevel = 1;\r\n return (\r\n \r\n \r\n \r\n \r\n {this._renderDisplay()}\r\n \r\n \r\n \r\n );\r\n }\r\n\r\n private _getPathNameFromURL(linkURL: string): string {\r\n let pathName = '';\r\n try {\r\n pathName = new URL(linkURL).pathname;\r\n } catch {\r\n pathName = linkURL.split('?')[0];\r\n }\r\n return pathName;\r\n }\r\n private _onMobNavTrigger(): void {\r\n this.setState(state => ({\r\n navOpen: !state.navOpen\r\n }));\r\n }\r\n\r\n private _renderDisplay(): JSX.Element[] {\r\n const { ListItem, menuItemData } = this.props;\r\n const menuItemList: JSX.Element[] = [];\r\n menuItemData.forEach((item: IMenuItemData, index: number) => {\r\n menuItemList.push(\r\n \r\n {this._createMenuItemList(item)}\r\n \r\n );\r\n });\r\n\r\n return menuItemList;\r\n }\r\n\r\n private _createMenuItemList(menuItemData: IMenuItemData): JSX.Element | null {\r\n if (menuItemData && menuItemData.subMenu && menuItemData.subMenu.length > 0) {\r\n return (\r\n \r\n {this._renderButtonMenuItem(menuItemData)}\r\n \r\n {this._renderSubMenu(menuItemData.subMenu, menuItemData.id)}\r\n \r\n \r\n );\r\n } else if (menuItemData && menuItemData.linkText && menuItemData.linkURL && menuItemData.linkURL.length > 0) {\r\n return (this._renderLinkMenuItem(menuItemData));\r\n } else if (menuItemData && menuItemData.linkText && !menuItemData.linkURL) {\r\n return (this._renderSpanMenuItem(menuItemData));\r\n }\r\n\r\n return null;\r\n }\r\n\r\n private _renderSubMenu(subMenus?: IMenuItemData[], activeMenu?: number): JSX.Element | null {\r\n const { isMobileView, ListItem } = this.props;\r\n if (activeMenu && this.state.activeMenu !== activeMenu && !isMobileView) {\r\n return null;\r\n }\r\n\r\n if (!subMenus || subMenus.length === 0) {\r\n return null;\r\n }\r\n\r\n let levelClassName: string = '';\r\n const menuOptions = subMenus && subMenus.map((option: IMenuItemData, idx: number) => {\r\n const hasOptions = (option.subMenu && option.subMenu.length > 0);\r\n let menuItem: JSX.Element | null;\r\n if (hasOptions && isMobileView) {\r\n menuItem = this._renderButtonMenuItem(option, activeMenu, idx);\r\n } else {\r\n menuItem = (option.linkURL\r\n ? this._renderLinkMenuItem(option, idx)\r\n : this._renderSpanMenuItem(option)\r\n );\r\n }\r\n\r\n let subMenu;\r\n\r\n if (hasOptions) {\r\n this.currentLevel++;\r\n if (this.currentLevel <= this.supportedLevel - 1) {\r\n levelClassName = `level-${this.currentLevel.toString()}`;\r\n subMenu = this._renderSubMenu(option.subMenu, isMobileView ? option.id : undefined);\r\n }\r\n }\r\n\r\n return (\r\n \r\n {menuItem}\r\n {subMenu}\r\n \r\n );\r\n });\r\n\r\n return (this._renderMenu(levelClassName, menuOptions, activeMenu));\r\n }\r\n\r\n private _renderButtonMenuItem(option: IMenuItemData, activeMenu?: number, index?: number): JSX.Element | null {\r\n const { Button } = this.props;\r\n const isActive = option === this.activeMenuItem || option === this.activeSubMenuItem;\r\n const activeClass = `${Button.className} ${isActive ? this.activeClassName : ''}`;\r\n\r\n return (\r\n \r\n {option.linkText}\r\n \r\n );\r\n }\r\n\r\n private _renderLinkMenuItem(option: IMenuItemData, index?: number): JSX.Element | null {\r\n const { Link } = this.props;\r\n const isActive = option === this.activeSubMenuItem;\r\n const activeClass = `${Link.className} ${isActive ? this.activeClassName : ''}`;\r\n\r\n return (\r\n \r\n {option.linkText}\r\n \r\n );\r\n }\r\n\r\n private _renderSpanMenuItem(option: IMenuItemData, index?: number): JSX.Element | null {\r\n const { Span } = this.props;\r\n return (\r\n {option.linkText}\r\n );\r\n }\r\n\r\n private _renderMenu(level: string, menuOptions: JSX.Element[], currentItem?: number): JSX.Element | null {\r\n const { MenuList } = this.props;\r\n this.currentLevel = 1;\r\n return (\r\n \r\n {menuOptions}\r\n \r\n );\r\n }\r\n\r\n private _handleDropdownToggle = (data: IMenuItemData, parentId?: number, type?: string) => () => {\r\n if (this.props.isMobileView && type === 'onFocus') {\r\n null;\r\n } else {\r\n let activeMenu = data.id;\r\n if (this.props.isMobileView) {\r\n activeMenu = (this.state.activeMenu && this.state.activeMenu === data.id!) ? undefined : data.id!;\r\n }\r\n\r\n this.setState({\r\n activeMenu,\r\n parentMenu: parentId\r\n });\r\n\r\n this._resetFocus();\r\n }\r\n };\r\n\r\n private _resetFocus = () => {\r\n if (this.props.isMobileView) {\r\n setTimeout(() => {\r\n this.menuNode && this.menuNode.current && this.menuNode.current.focus();\r\n }, 0);\r\n }\r\n };\r\n\r\n // tslint:disable-next-line:no-any\r\n private _handleClickOutside = (event: any) => {\r\n const burgerMenu: boolean = event.target.className === 'ms-header__nav-icon msc-btn';\r\n if (this.menuNode.current && !this.menuNode.current.contains(event.target) && !burgerMenu) {\r\n this.setState({ navOpen: false });\r\n }\r\n this._resetFocus();\r\n };\r\n\r\n private _closeSubmenu(): void {\r\n if (!this.props.isMobileView) {\r\n this.setState({ activeMenu: undefined, mobileViewLabelText: '' });\r\n }\r\n }\r\n\r\n private trapFocusInsideMenu = (event: any) => {\r\n const isTabPressed = event.key === 'Tab';\r\n if (!isTabPressed) {\r\n return;\r\n }\r\n //move forward only if tab key is pressed\r\n const firstFocusableElement: HTMLElement | null = document.getElementsByClassName(\"ms-header__nav-icon msc-btn\").length > 0 ? document.getElementsByClassName(\"ms-header__nav-icon msc-btn\")[0] as HTMLElement : null;\r\n if (document.getElementsByClassName(\"nav-open\").length === 0) {\r\n //Let's return If the navbar is not open\r\n return;\r\n }\r\n else {\r\n let navOpen = document.getElementsByClassName(\"nav-open\")[0];\r\n let lastFocusableElement = null;\r\n //This means the nav bar is open\r\n //lets trap the focus inside the navbar\r\n while (navOpen.children.length > 0) {\r\n const msNavList = navOpen.children;\r\n if (msNavList.length === 1 && msNavList[0].tagName === 'UL') {\r\n const msNavListItem = msNavList[0].children;\r\n if (msNavListItem.length > 0) {\r\n //we have menu items list with us in msNavListItem\r\n const lastMenuItem = msNavListItem[msNavListItem.length - 1];\r\n const submenu = Array.from(lastMenuItem.children);\r\n const subnavShow = submenu.find(s => s.classList.contains(\"subnav-show\"));\r\n if (subnavShow) {\r\n //if we are here then the last menu is open.\r\n //Check for inner submenus\r\n navOpen = subnavShow;\r\n }\r\n else if (submenu[submenu.length - 1].tagName === 'A' && submenu[submenu.length - 1].className.includes(\"ms-nav__list__item__link\")) {\r\n //This means we are at the last menu and there is no further submenu inside it.\r\n lastFocusableElement = submenu[submenu.length - 1];\r\n break;\r\n }\r\n else {\r\n //If we are here then the submenu is not open\r\n lastFocusableElement = Array.from(lastMenuItem.children).find(b=>b.classList.contains(\"ms-nav__list__item__button\"));\r\n break;\r\n }\r\n }\r\n }\r\n }\r\n //We need to see if the focus is on the last sub menu item if so then make the focus to menu open button, Doing so we are traping the focus\r\n //inside the menu.\r\n if (document.activeElement === lastFocusableElement && firstFocusableElement) {\r\n firstFocusableElement.focus();\r\n event.preventDefault();\r\n }\r\n }\r\n };\r\n}\r\n\r\nexport default NavigationMenuView;\r\n\r\n","/*---------------------------------------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License. See License.txt in the project root for license information.\r\n *--------------------------------------------------------------------------------------------*/\r\nimport { Module, Node } from '@msdyn365-commerce-modules/utilities';\r\nimport classnames from 'classnames';\r\nimport * as React from 'react';\r\nimport { INavigationMenuViewProps } from '../../../modules/smwe-navigation-menu/./smwe-navigation-menu';\r\nimport { IMenuItemData } from '../../../modules/smwe-navigation-menu/./smwe-navigation-menu.data';\r\nimport { ISmweNavigationMenuProps } from '../definition-extensions/smwe-navigation-menu.ext.props.autogenerated';\r\n\r\ninterface INavigationState {\r\n parentMenu?: number;\r\n activeMenu?: number;\r\n mobileViewLabelText?: string;\r\n navOpen: boolean;\r\n}\r\n\r\n/**\r\n *\r\n * NavigationMenuView component\r\n * @extends {React.PureComponent}\r\n */\r\nexport class NavigationMenuView extends React.PureComponent, INavigationState> {\r\n private supportedLevel: number = 3;\r\n private currentLevel: number = 0;\r\n private menuNode: React.RefObject;\r\n private pathName: string = '';\r\n private activeClassName: string = 'selected';\r\n private activeMenuItem: IMenuItemData = {};\r\n private activeSubMenuItem: IMenuItemData = {};\r\n\r\n constructor(props: INavigationMenuViewProps & ISmweNavigationMenuProps<{}>) {\r\n super(props);\r\n this.menuNode = React.createRef();\r\n this.state = {\r\n activeMenu: undefined,\r\n mobileViewLabelText: '',\r\n parentMenu: undefined,\r\n navOpen: false\r\n };\r\n this._closeSubmenu = this._closeSubmenu.bind(this);\r\n this._onMobNavTrigger = this._onMobNavTrigger.bind(this);\r\n }\r\n\r\n public componentDidMount(): void {\r\n document.body && document.body.addEventListener('mousedown', this._handleClickOutside);\r\n }\r\n\r\n public componentWillUnmount(): void {\r\n document.body && document.body.removeEventListener('mousedown', this._handleClickOutside, false);\r\n }\r\n\r\n public render(): JSX.Element | null {\r\n const { isMobileView, MenuList, Navigation } = this.props;\r\n const className = this.props.config.className;\r\n // get current pathname\r\n if (process.env.CURRENT_ENVIRONMENT === 'web') {\r\n this.pathName = window.location.pathname;\r\n } else {\r\n this.pathName = this.props.context.request.url.requestUrl.pathname;\r\n }\r\n\r\n this.props.menuItemData.forEach((item, index) => {\r\n const ItemPath = this._getPathNameFromURL(item.linkURL || '');\r\n item.subMenu && item.subMenu.forEach((subItem, subIndex) => {\r\n const subItemPath = this._getPathNameFromURL(subItem.linkURL || '');\r\n if (subItemPath === this.pathName) {\r\n this.activeMenuItem = item;\r\n this.activeSubMenuItem = subItem;\r\n }\r\n });\r\n if (ItemPath === this.pathName) {\r\n this.activeMenuItem = item;\r\n }\r\n });\r\n\r\n this.currentLevel = 1;\r\n return (\r\n \r\n \r\n \r\n \r\n {this._renderDisplay()}\r\n \r\n \r\n \r\n );\r\n }\r\n\r\n private _getPathNameFromURL(linkURL: string): string {\r\n let pathName = '';\r\n try {\r\n // if linkURL is a full url\r\n pathName = new URL(linkURL).pathname;\r\n } catch {\r\n pathName = linkURL.split('?')[0];\r\n }\r\n return pathName;\r\n }\r\n\r\n private _onMobNavTrigger(): void {\r\n this.setState(state => ({\r\n navOpen: !state.navOpen\r\n }));\r\n }\r\n\r\n private _renderDisplay(): JSX.Element[] {\r\n const { ListItem, menuItemData } = this.props;\r\n const menuItemList: JSX.Element[] = [];\r\n const isMobileView: boolean = this.props.isMobileView || false;\r\n const expandOnClick: boolean = this.props.config.expandOnClick || false;\r\n\r\n menuItemData.forEach((item: IMenuItemData, index: number) => {\r\n menuItemList.push(\r\n \r\n {this._createMenuItemList(item)}\r\n \r\n );\r\n });\r\n\r\n return menuItemList;\r\n }\r\n\r\n private _createMenuItemList(menuItemData: IMenuItemData): JSX.Element | null {\r\n if (menuItemData && menuItemData.subMenu && menuItemData.subMenu.length > 0) {\r\n const { openSubmenuItemsNewTab } = this.props.config;\r\n const openInNewTab = (!!openSubmenuItemsNewTab && (openSubmenuItemsNewTab.toLowerCase().includes(menuItemData.linkText!.toLowerCase())));\r\n if (this.props.isMobileView) {\r\n return (\r\n \r\n {this._renderButtonMenuItem(menuItemData)}\r\n \r\n \r\n {this._renderSubMenu(menuItemData.subMenu, menuItemData.id, openInNewTab)}\r\n \r\n );\r\n } else {\r\n return (\r\n \r\n {this._renderButtonMenuItem(menuItemData)}\r\n {this._renderSubMenu(menuItemData.subMenu, menuItemData.id, openInNewTab)}\r\n \r\n );\r\n }\r\n } else if (menuItemData && menuItemData.linkText && menuItemData.linkURL && menuItemData.linkURL.length > 0) {\r\n return (this._renderLinkMenuItem(menuItemData));\r\n } else if (menuItemData && menuItemData.linkText && !menuItemData.linkURL) {\r\n return (this._renderSpanMenuItem(menuItemData));\r\n }\r\n\r\n return null;\r\n }\r\n\r\n private _renderSubMenu(subMenus?: IMenuItemData[], activeMenu?: number, openInNewTab?: boolean): JSX.Element | null {\r\n const { isMobileView, ListItem } = this.props;\r\n\r\n if (!subMenus || subMenus.length === 0) {\r\n return null;\r\n }\r\n\r\n let levelClassName: string = '';\r\n const menuOptions = subMenus && subMenus.map((option: IMenuItemData, idx: number) => {\r\n const hasOptions = (option.subMenu && option.subMenu.length > 0);\r\n let menuItem: JSX.Element | null;\r\n if (hasOptions && isMobileView) {\r\n menuItem = this._renderButtonMenuItem(option, activeMenu, idx);\r\n } else {\r\n menuItem = (option.linkURL\r\n ? this._renderLinkMenuItem(option, idx, openInNewTab)\r\n : this._renderSpanMenuItem(option)\r\n );\r\n }\r\n\r\n let subMenu;\r\n\r\n if (hasOptions) {\r\n this.currentLevel++;\r\n if (this.currentLevel <= this.supportedLevel - 1) {\r\n levelClassName = `level-${this.currentLevel.toString()}`;\r\n subMenu = this._renderSubMenu(option.subMenu, isMobileView ? option.id : undefined, openInNewTab);\r\n }\r\n }\r\n\r\n return (\r\n \r\n {menuItem}\r\n {subMenu}\r\n \r\n );\r\n });\r\n\r\n return this._renderMenu(levelClassName, menuOptions, activeMenu);\r\n }\r\n\r\n private _renderButtonMenuItem(option: IMenuItemData, activeMenu?: number, index?: number): JSX.Element | null {\r\n const { Button } = this.props;\r\n const isActive = (option === this.activeMenuItem) || (option === this.activeSubMenuItem);\r\n const activeClass = `${Button.className} ${isActive ? this.activeClassName : ''}`;\r\n const isMobileView: boolean = this.props.isMobileView || false;\r\n const expandOnClick: boolean = this.props.config.expandOnClick || false;\r\n\r\n return (\r\n this._mainNavClick(option)}\r\n onMouseEnter={isMobileView || expandOnClick ? false : this._handleDropdownToggle(option, activeMenu)}\r\n onFocus={isMobileView || expandOnClick ? this._closeSubmenu : this._handleDropdownToggle(option, activeMenu)}\r\n aria-haspopup={true}\r\n aria-expanded={this.state.activeMenu && this.state.activeMenu === option.id ? true : false}\r\n data-parent={activeMenu}\r\n aria-current={isActive && 'page'}\r\n >\r\n {option.linkText}\r\n \r\n );\r\n }\r\n\r\n private _mainNavClick = (option: IMenuItemData) => {\r\n const link = option.linkURL;\r\n if (link) {\r\n window.location.href = link;\r\n }\r\n };\r\n\r\n private _renderLinkMenuItem(option: IMenuItemData, index?: number, openInNewTab?: boolean): JSX.Element | null {\r\n const { Link } = this.props;\r\n const isActive = (option === this.activeSubMenuItem) || (option === this.activeMenuItem);\r\n\r\n return (\r\n \r\n {option.linkText}\r\n \r\n );\r\n }\r\n\r\n private _renderSpanMenuItem(option: IMenuItemData, index?: number): JSX.Element | null {\r\n const { Span } = this.props;\r\n return (\r\n {option.linkText}\r\n );\r\n }\r\n\r\n private _renderMenu(level: string, menuOptions: JSX.Element[], currentItem?: number): JSX.Element | null {\r\n const { MenuList } = this.props;\r\n this.currentLevel = 1;\r\n\r\n return (\r\n \r\n {level === 'level-2' && currentItem && this._renderSubNavButton(currentItem)}\r\n {menuOptions}\r\n \r\n );\r\n }\r\n\r\n private _renderSubNavButton(currentItem: number): JSX.Element {\r\n return (\r\n \r\n );\r\n }\r\n\r\n private _handleDropdownToggle = (data: IMenuItemData, parentId?: number) => () => {\r\n let activeMenu;\r\n if (this.props.isMobileView) {\r\n activeMenu = (this.state.activeMenu && this.state.activeMenu === data.id!) ? undefined : data.id!;\r\n } else {\r\n activeMenu = data.id;\r\n }\r\n this.setState({\r\n activeMenu,\r\n parentMenu: parentId\r\n });\r\n\r\n this._resetFocus();\r\n };\r\n\r\n private _resetFocus = () => {\r\n if (this.props.isMobileView) {\r\n setTimeout(() => {\r\n this.menuNode && this.menuNode.current && this.menuNode.current.focus();\r\n }, 0);\r\n }\r\n };\r\n\r\n // tslint:disable-next-line:no-any\r\n private _handleClickOutside = (event: any) => {\r\n const burgerMenu: boolean = event.target.className === 'ms-header__nav-icon msc-btn';\r\n\r\n if (this.menuNode.current && !this.menuNode.current.contains(event.target)) {\r\n this.setState({ activeMenu: undefined, mobileViewLabelText: '' });\r\n\r\n if (!burgerMenu) {\r\n this.setState({ navOpen: false });\r\n }\r\n }\r\n };\r\n\r\n private _closeSubmenu(): void {\r\n this.setState({ activeMenu: undefined, mobileViewLabelText: '' });\r\n }\r\n}\r\n\r\nexport default NavigationMenuView;","/*---------------------------------------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License. See License.txt in the project root for license information.\r\n *--------------------------------------------------------------------------------------------*/\r\nimport { Module, Node } from '@msdyn365-commerce-modules/utilities';\r\nimport classnames from 'classnames';\r\nimport * as React from 'react';\r\nimport { INavigationMenuViewProps } from '../../../modules/smwe-navigation-menu/./smwe-navigation-menu';\r\nimport { IMenuItemData } from '../../../modules/smwe-navigation-menu/./smwe-navigation-menu.data';\r\nimport { ISmweNavigationMenuProps } from '../definition-extensions/smwe-navigation-menu.ext.props.autogenerated';\r\n\r\ninterface INavigationState {\r\n parentMenu?: number;\r\n activeMenu?: number;\r\n mobileViewLabelText?: string;\r\n navOpen: boolean;\r\n}\r\n\r\ninterface IMenuItemDataClass extends IMenuItemData {\r\n className?: string;\r\n}\r\n\r\n/**\r\n *\r\n * NavigationMenuView component\r\n * @extends {React.PureComponent}\r\n */\r\nexport class NavigationMenuView extends React.PureComponent, INavigationState> {\r\n private supportedLevel: number = 3;\r\n private currentLevel: number = 0;\r\n private menuNode: React.RefObject;\r\n private pathName: string = '';\r\n private activeClassName: string = 'selected';\r\n private activeMenuItem: IMenuItemData = {};\r\n private activeSubMenuItem: IMenuItemData = {};\r\n\r\n constructor(props: INavigationMenuViewProps & ISmweNavigationMenuProps<{}>) {\r\n super(props);\r\n this.menuNode = React.createRef();\r\n this.state = { activeMenu: undefined, mobileViewLabelText: '', parentMenu: undefined, navOpen: false };\r\n this._closeSubmenu = this._closeSubmenu.bind(this);\r\n this._onMobNavTrigger = this._onMobNavTrigger.bind(this);\r\n }\r\n\r\n public componentDidMount(): void {\r\n document.body && document.body.addEventListener('mousedown', this._handleClickOutside);\r\n }\r\n\r\n public componentWillUnmount(): void {\r\n document.body && document.body.removeEventListener('mousedown', this._handleClickOutside, false);\r\n }\r\n\r\n public render(): JSX.Element | null {\r\n const { isMobileView, MenuList, Navigation } = this.props;\r\n // get current pathname\r\n if (process.env.CURRENT_ENVIRONMENT === 'web') {\r\n this.pathName = window.location.pathname;\r\n } else {\r\n this.pathName = this.props.context.request.url.requestUrl.pathname;\r\n }\r\n\r\n // for wine-shop links, only \"all wines\" page should make \"wine shop\" link active\r\n // TODO: \"wine shop\" menu link has different behavior, it doesn't get highlighted unless on the \"all wines\" page\r\n\r\n // if (this.pathName.startsWith('/fth/wine-shop/')) {\r\n // if (this.pathName.startsWith('/fth/wine-shop/5637149842.c') || this.pathName.startsWith('/fth/wine-shop/all-wines/5637149843.c')) {\r\n // // get \"wine shop\" menu item\r\n // this.props.menuItemData.forEach((item, index) => {\r\n // if (item.linkURL && item.linkURL.startsWith('/fth/wine-shop/')) {\r\n // this.activeMenuItem = item;\r\n // }\r\n // });\r\n // }\r\n // } else {\r\n this.props.menuItemData.forEach((item, index) => {\r\n const ItemPath = this._getPathNameFromURL(item.linkURL || '');\r\n item.subMenu && item.subMenu.forEach((subItem, subIndex) => {\r\n const subItemPath = this._getPathNameFromURL(subItem.linkURL || '');\r\n if (subItemPath === this.pathName) {\r\n this.activeMenuItem = item;\r\n this.activeSubMenuItem = subItem;\r\n }\r\n });\r\n if (ItemPath === this.pathName) {\r\n this.activeMenuItem = item;\r\n }\r\n });\r\n // }\r\n\r\n this.currentLevel = 1;\r\n return (\r\n \r\n \r\n \r\n \r\n {this._renderDisplay()}\r\n \r\n \r\n \r\n );\r\n }\r\n\r\n private _getPathNameFromURL(linkURL: string): string {\r\n let pathName = '';\r\n try {\r\n // if linkURL is a full url\r\n pathName = new URL(linkURL).pathname;\r\n } catch {\r\n pathName = linkURL.split('?')[0];\r\n }\r\n return pathName;\r\n }\r\n\r\n private _onMobNavTrigger(): void {\r\n this.setState(state => ({\r\n navOpen: !state.navOpen\r\n }));\r\n }\r\n\r\n private _renderDisplay(): JSX.Element[] {\r\n const { ListItem, menuItemData } = this.props;\r\n const menuItemList: JSX.Element[] = [];\r\n const isMobileView: boolean = this.props.isMobileView || false;\r\n const expandOnClick: boolean = this.props.config.expandOnClick || false;\r\n menuItemData.forEach((item: IMenuItemData, index: number) => {\r\n menuItemList.push(\r\n \r\n {this._createMenuItemList(item)}\r\n \r\n );\r\n });\r\n\r\n return menuItemList;\r\n }\r\n\r\n private _createMenuItemList(menuItemData: IMenuItemData): JSX.Element | null {\r\n if (menuItemData && menuItemData.subMenu && menuItemData.subMenu.length > 0) {\r\n if (this.props.isMobileView) {\r\n return (\r\n \r\n {this._renderButtonMenuItem(menuItemData)}\r\n \r\n {this._renderSubMenu(menuItemData.subMenu, menuItemData.id)}\r\n \r\n );\r\n } else {\r\n return (\r\n \r\n {this._renderButtonMenuItem(menuItemData)}\r\n {this._renderSubMenu(menuItemData.subMenu, menuItemData.id)}\r\n \r\n );\r\n }\r\n } else if (menuItemData && menuItemData.linkText && menuItemData.linkURL && menuItemData.linkURL.length > 0) {\r\n return (this._renderLinkMenuItem(menuItemData));\r\n } else if (menuItemData && menuItemData.linkText && !menuItemData.linkURL) {\r\n return (this._renderSpanMenuItem(menuItemData));\r\n }\r\n\r\n return null;\r\n }\r\n\r\n private _renderSubMenu(subMenus?: IMenuItemDataClass[], activeMenu?: number): JSX.Element | null {\r\n const { isMobileView, ListItem } = this.props;\r\n if (activeMenu && this.state.activeMenu !== activeMenu && !isMobileView) {\r\n return null;\r\n }\r\n\r\n if (!subMenus || subMenus.length === 0) {\r\n return null;\r\n }\r\n\r\n let levelClassName: string = '';\r\n const menuOptions = subMenus && subMenus.map((option: IMenuItemDataClass, idx: number) => {\r\n const hasOptions = (option.subMenu && option.subMenu.length > 0);\r\n let menuItem: JSX.Element | null;\r\n if (hasOptions && isMobileView) {\r\n menuItem = this._renderButtonMenuItem(option, activeMenu, idx);\r\n } else {\r\n menuItem = (option.linkURL\r\n ? this._renderLinkMenuItem(option, idx)\r\n : this._renderSpanMenuItem(option)\r\n );\r\n }\r\n\r\n let subMenu;\r\n\r\n if (hasOptions) {\r\n this.currentLevel++;\r\n if (this.currentLevel <= this.supportedLevel - 1) {\r\n levelClassName = `level-${this.currentLevel.toString()}`;\r\n subMenu = this._renderSubMenu(option.subMenu, isMobileView ? option.id : undefined);\r\n }\r\n }\r\n\r\n return (\r\n \r\n {menuItem}\r\n {subMenu}\r\n \r\n );\r\n });\r\n\r\n return (this._renderMenu(levelClassName, menuOptions, activeMenu));\r\n }\r\n\r\n private _renderButtonMenuItem(option: IMenuItemData, activeMenu?: number, index?: number): JSX.Element | null {\r\n const { Button } = this.props;\r\n const isActive = (option === this.activeMenuItem) || (option === this.activeSubMenuItem);\r\n const activeClass = `${Button.className} ${isActive ? this.activeClassName : ''}`;\r\n const isMobileView: boolean = this.props.isMobileView || false;\r\n const expandOnClick: boolean = this.props.config.expandOnClick || false;\r\n\r\n return (\r\n this._mainNavClick(option)}\r\n onMouseEnter={isMobileView || expandOnClick ? false : this._handleDropdownToggle(option, activeMenu)}\r\n aria-haspopup={true}\r\n aria-expanded={this.state.activeMenu && this.state.activeMenu === option.id ? true : false}\r\n data-parent={activeMenu}\r\n aria-current={isActive && 'page'}\r\n >\r\n {option.linkText}{(this.state.navOpen && this.state.activeMenu && this.state.activeMenu === option.id) ? :}\r\n \r\n );\r\n }\r\n\r\n private _mainNavClick = (option: IMenuItemData) => {\r\n const link = option.linkURL;\r\n if (link) {\r\n window.location.href = link;\r\n }\r\n };\r\n\r\n private _renderLinkMenuItem(option: IMenuItemData, index?: number): JSX.Element | null {\r\n const { Link } = this.props;\r\n const isActive = (option === this.activeSubMenuItem) || (option === this.activeMenuItem);\r\n const activeClass = `${Link.className} ${isActive ? this.activeClassName : ''}`;\r\n\r\n return (\r\n \r\n {option.linkText}\r\n \r\n );\r\n }\r\n\r\n private _renderSpanMenuItem(option: IMenuItemData, index?: number): JSX.Element | null {\r\n const { Span } = this.props;\r\n return (\r\n {option.linkText}\r\n );\r\n }\r\n\r\n private _renderMenu(level: string, menuOptions: JSX.Element[], currentItem?: number): JSX.Element | null {\r\n const { MenuList } = this.props;\r\n this.currentLevel = 1;\r\n return (\r\n \r\n {menuOptions}\r\n \r\n );\r\n }\r\n\r\n private _handleDropdownToggle = (data: IMenuItemData, parentId?: number) => () => {\r\n let activeMenu;\r\n if(this.props.isMobileView) {\r\n activeMenu = (this.state.activeMenu && this.state.activeMenu === data.id!) ? undefined : data.id!;\r\n } else {\r\n activeMenu = data.id;\r\n }\r\n this.setState({\r\n activeMenu,\r\n parentMenu: parentId,\r\n navOpen: true\r\n });\r\n\r\n this._resetFocus();\r\n };\r\n\r\n private _resetFocus = () => {\r\n if (this.props.isMobileView) {\r\n setTimeout(() => {\r\n this.menuNode && this.menuNode.current && this.menuNode.current.focus();\r\n }, 0);\r\n }\r\n };\r\n\r\n // tslint:disable-next-line:no-any\r\n private _handleClickOutside = (event: any) => {\r\n const burgerMenu:boolean = event.target.className === 'ms-header__nav-icon msc-btn';\r\n if (this.menuNode.current && !this.menuNode.current.contains(event.target)) {\r\n this.setState({ activeMenu: undefined, mobileViewLabelText: '' });\r\n\r\n if (!burgerMenu) {\r\n this.setState({ navOpen: false });\r\n }\r\n }\r\n };\r\n\r\n private _closeSubmenu(): void {\r\n if (!this.props.isMobileView) {\r\n this.setState({ activeMenu: undefined, mobileViewLabelText: '', navOpen: false });\r\n }\r\n }\r\n}\r\n\r\nexport default NavigationMenuView;","/*---------------------------------------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License. See License.txt in the project root for license information.\r\n *--------------------------------------------------------------------------------------------*/\r\nimport { IMenuItemData, INavigationMenuViewProps } from '@msdyn365-commerce-modules/navigation-menu';\r\nimport { Module, Node } from '@msdyn365-commerce-modules/utilities';\r\nimport classnames from 'classnames';\r\nimport * as React from 'react';\r\nimport { ISmweNavigationMenuProps } from '../definition-extensions/smwe-navigation-menu.ext.props.autogenerated';\r\n\r\ninterface INavigationState {\r\n parentMenu?: number;\r\n activeMenu?: number;\r\n mobileViewLabelText?: string;\r\n navOpen: boolean;\r\n sideNavOpened: boolean;\r\n}\r\ninterface IMenuItemDataClass extends IMenuItemData {\r\n className?: string;\r\n}\r\n\r\n/**\r\n *\r\n * NavigationMenuView component\r\n * @extends {React.PureComponent}\r\n */\r\nexport class NavigationMenuView extends React.PureComponent, INavigationState> {\r\n private supportedLevel: number = 3;\r\n private currentLevel: number = 0;\r\n private menuNode: React.RefObject;\r\n private pathName: string = '';\r\n private activeClassName: string = 'selected';\r\n private activeMenuItem: IMenuItemData = {};\r\n private activeSubMenuItem: IMenuItemData = {};\r\n\r\n constructor(props: INavigationMenuViewProps & ISmweNavigationMenuProps<{}>) {\r\n super(props);\r\n this.menuNode = React.createRef();\r\n this.state = { activeMenu: undefined, mobileViewLabelText: '', parentMenu: undefined, navOpen: false, sideNavOpened: false };\r\n this._closeSubmenu = this._closeSubmenu.bind(this);\r\n this._onMobNavTrigger = this._onMobNavTrigger.bind(this);\r\n }\r\n\r\n public componentDidMount(): void {\r\n document.body && document.body.addEventListener('click', this._handleClickOutside);\r\n }\r\n\r\n public componentWillUnmount(): void {\r\n document.body && document.body.removeEventListener('click', this._handleClickOutside, false);\r\n }\r\n\r\n public render(): JSX.Element | null {\r\n const { isMobileView, MenuList, Navigation } = this.props;\r\n // get current pathname\r\n if (process.env.CURRENT_ENVIRONMENT === 'web') {\r\n this.pathName = window.location.pathname;\r\n } else {\r\n this.pathName = this.props.context.request.url.requestUrl.pathname;\r\n }\r\n\r\n this.props.menuItemData.forEach((item, index) => {\r\n const ItemPath = this._getPathNameFromURL(item.linkURL || '');\r\n item.subMenu && item.subMenu.forEach((subItem, subIndex) => {\r\n const subItemPath = this._getPathNameFromURL(subItem.linkURL || '');\r\n if (subItemPath === this.pathName) {\r\n this.activeMenuItem = item;\r\n this.activeSubMenuItem = subItem;\r\n }\r\n });\r\n if (ItemPath === this.pathName) {\r\n this.activeMenuItem = item;\r\n }\r\n });\r\n\r\n this.currentLevel = 1;\r\n return (\r\n \r\n \r\n \r\n \r\n {this._renderDisplay()}\r\n \r\n \r\n \r\n );\r\n }\r\n\r\n private _getPathNameFromURL(linkURL: string): string {\r\n let pathName = '';\r\n try {\r\n // if linkURL is a full url\r\n pathName = new URL(linkURL).pathname;\r\n } catch {\r\n pathName = linkURL.split('?')[0];\r\n }\r\n return pathName;\r\n }\r\n\r\n private _onMobNavTrigger(): void {\r\n this.setState(state => ({\r\n sideNavOpened: !state.sideNavOpened\r\n }));\r\n }\r\n\r\n private _renderDisplay(): JSX.Element[] {\r\n const { ListItem, menuItemData } = this.props;\r\n const menuItemList: JSX.Element[] = [];\r\n const isMobileView: boolean = this.props.isMobileView || false;\r\n const expandOnClick: boolean = this.props.config.expandOnClick || true;\r\n menuItemData.forEach((item: IMenuItemData, index: number) => {\r\n menuItemList.push(\r\n \r\n {this._createMenuItemList(item)}\r\n \r\n );\r\n });\r\n\r\n return menuItemList;\r\n }\r\n\r\n private _createMenuItemList(menuItemData: IMenuItemData): JSX.Element | null {\r\n if (menuItemData && menuItemData.subMenu && menuItemData.subMenu.length > 0) {\r\n if (this.props.isMobileView) {\r\n return (\r\n \r\n {this._renderButtonMenuItem(menuItemData)}\r\n \r\n {this._renderSubMenu(menuItemData.subMenu, menuItemData.id)}\r\n \r\n );\r\n } else {\r\n return (\r\n \r\n {this._renderButtonMenuItem(menuItemData)}\r\n {this._renderSubMenu(menuItemData.subMenu, menuItemData.id)}\r\n \r\n );\r\n }\r\n } else if (menuItemData && menuItemData.linkText && menuItemData.linkURL && menuItemData.linkURL.length > 0) {\r\n return (this._renderLinkMenuItem(menuItemData));\r\n } else if (menuItemData && menuItemData.linkText && !menuItemData.linkURL) {\r\n return (this._renderSpanMenuItem(menuItemData));\r\n }\r\n\r\n return null;\r\n }\r\n\r\n private _renderSubMenu(subMenus?: IMenuItemDataClass[], activeMenu?: number): JSX.Element | null {\r\n const { isMobileView, ListItem } = this.props;\r\n if (activeMenu && this.state.activeMenu !== activeMenu && !isMobileView) {\r\n return null;\r\n }\r\n\r\n if (!subMenus || subMenus.length === 0) {\r\n return null;\r\n }\r\n\r\n let levelClassName: string = '';\r\n const menuOptions = subMenus && subMenus.map((option: IMenuItemDataClass, idx: number) => {\r\n const hasOptions = (option.subMenu && option.subMenu.length > 0);\r\n let menuItem: JSX.Element | null;\r\n if (hasOptions && isMobileView) {\r\n menuItem = this._renderButtonMenuItem(option, activeMenu, idx);\r\n } else {\r\n menuItem = (option.linkURL\r\n ? this._renderLinkMenuItem(option, idx)\r\n : this._renderSpanMenuItem(option)\r\n );\r\n }\r\n\r\n let subMenu;\r\n\r\n if (hasOptions) {\r\n this.currentLevel++;\r\n if (this.currentLevel <= this.supportedLevel - 1) {\r\n levelClassName = `level-${this.currentLevel.toString()}`;\r\n subMenu = this._renderSubMenu(option.subMenu, isMobileView ? option.id : undefined);\r\n }\r\n }\r\n\r\n return (\r\n \r\n {menuItem}\r\n {subMenu}\r\n \r\n );\r\n });\r\n\r\n return (this._renderMenu(levelClassName, menuOptions, activeMenu));\r\n }\r\n private _renderButtonMenuItem(option: IMenuItemData, activeMenu?: number, index?: number): JSX.Element | null {\r\n const { Button } = this.props;\r\n const isActive = (option === this.activeMenuItem) || (option === this.activeSubMenuItem);\r\n const activeClass = `${Button.className} ${isActive ? this.activeClassName : ''} ${this.state.activeMenu && this.state.activeMenu === option.id ? 'nav-open' : 'nav-closed'}`;\r\n const isMobileView: boolean = this.props.isMobileView || false;\r\n const expandOnClick: boolean = this.props.config.expandOnClick || true;\r\n\r\n return (\r\n this._mainNavClick(option)}\r\n onMouseEnter={isMobileView || expandOnClick ? false : this._handleDropdownToggle(option, activeMenu)}\r\n aria-haspopup={true}\r\n aria-expanded={this.state.activeMenu && this.state.activeMenu === option.id ? true : false}\r\n data-parent={activeMenu}\r\n role=\"menuitem\"\r\n aria-current={isActive && 'page'}\r\n >\r\n {option.linkText}\r\n \r\n );\r\n }\r\n\r\n private _mainNavClick = (option: IMenuItemData) => {\r\n const link = option.linkURL;\r\n if (link) {\r\n window.location.href = link;\r\n }\r\n };\r\n\r\n private _renderLinkMenuItem(option: IMenuItemData, index?: number): JSX.Element | null {\r\n const { Link } = this.props;\r\n const isActive = (option === this.activeSubMenuItem) || (option === this.activeMenuItem);\r\n const activeClass = `${Link.className} ${isActive ? this.activeClassName : ''}`;\r\n\r\n return (\r\n \r\n {option.linkText}\r\n \r\n );\r\n }\r\n\r\n private _renderSpanMenuItem(option: IMenuItemData, index?: number): JSX.Element | null {\r\n const { Span } = this.props;\r\n return (\r\n {option.linkText}\r\n );\r\n }\r\n\r\n private _renderMenu(level: string, menuOptions: JSX.Element[], currentItem?: number): JSX.Element | null {\r\n const { MenuList } = this.props;\r\n this.currentLevel = 1;\r\n return (\r\n \r\n {menuOptions}\r\n \r\n );\r\n }\r\n\r\n // private _handleFocus = (data: IMenuItemData, parentId?: number) => () => {\r\n // if (!this.props.isMobileView) {\r\n // this.setState({\r\n // activeMenu: data.id!,\r\n // parentMenu: parentId\r\n // });\r\n // }\r\n\r\n // this._resetFocus();\r\n // };\r\n\r\n private _handleDropdownToggle = (data: IMenuItemData, parentId?: number) => () => {\r\n const activeMenu = (this.state.activeMenu && this.state.activeMenu === data.id!) ? undefined : data.id!;\r\n this.setState({\r\n activeMenu,\r\n parentMenu: parentId,\r\n navOpen: true\r\n });\r\n\r\n this._resetFocus();\r\n };\r\n\r\n private _resetFocus = () => {\r\n if (this.props.isMobileView) {\r\n setTimeout(() => {\r\n this.menuNode && this.menuNode.current && this.menuNode.current.focus();\r\n }, 0);\r\n }\r\n };\r\n\r\n // tslint:disable-next-line:no-any\r\n private _handleClickOutside = (event: any) => {\r\n const burgerMenu:boolean = event.target.className === 'ms-header__nav-icon msc-btn';\r\n if (this.menuNode.current && !this.menuNode.current.contains(event.target) && !burgerMenu && !(event.target instanceof HTMLButtonElement || event.target instanceof HTMLAnchorElement)) {\r\n this.setState({ navOpen: false, sideNavOpened: false });\r\n }\r\n };\r\n\r\n private _closeSubmenu(): void {\r\n if (!this.props.isMobileView) {\r\n this.setState({ activeMenu: undefined, mobileViewLabelText: '', navOpen: false });\r\n }\r\n }\r\n}\r\n\r\nexport default NavigationMenuView;","/*---------------------------------------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License. See License.txt in the project root for license information.\r\n *--------------------------------------------------------------------------------------------*/\r\nimport { Module, Node } from '@msdyn365-commerce-modules/utilities';\r\nimport classnames from 'classnames';\r\nimport * as React from 'react';\r\nimport { INavigationMenuViewProps } from '../../../modules/smwe-navigation-menu/./smwe-navigation-menu';\r\nimport { IMenuItemData } from '../../../modules/smwe-navigation-menu/./smwe-navigation-menu.data';\r\nimport { ISmweNavigationMenuProps } from '../definition-extensions/smwe-navigation-menu.ext.props.autogenerated';\r\n\r\ninterface INavigationState {\r\n parentMenu?: number;\r\n activeMenu?: number;\r\n mobileViewLabelText?: string;\r\n navOpen: boolean;\r\n}\r\n\r\ninterface IMenuItemDataClass extends IMenuItemData {\r\n className?: string;\r\n}\r\n\r\n/**\r\n *\r\n * NavigationMenuView component\r\n * @extends {React.PureComponent}\r\n */\r\nexport class NavigationMenuView extends React.PureComponent, INavigationState> {\r\n private supportedLevel: number = 3;\r\n private currentLevel: number = 0;\r\n private menuNode: React.RefObject;\r\n private pathName: string = '';\r\n private activeClassName: string = 'selected';\r\n private activeMenuItem: IMenuItemData = {};\r\n private activeSubMenuItem: IMenuItemData = {};\r\n\r\n constructor(props: INavigationMenuViewProps & ISmweNavigationMenuProps<{}>) {\r\n super(props);\r\n this.menuNode = React.createRef();\r\n this.state = {\r\n activeMenu: undefined,\r\n mobileViewLabelText: '',\r\n parentMenu: undefined,\r\n navOpen: false\r\n };\r\n this._closeSubmenu = this._closeSubmenu.bind(this);\r\n this._onMobNavOpen = this._onMobNavOpen.bind(this);\r\n this._onMobNavClose = this._onMobNavClose.bind(this);\r\n }\r\n\r\n public componentDidMount(): void {\r\n document.getElementById('ms-header__subnav-fade')?.addEventListener('mousedown', this._handleClickOutside);\r\n }\r\n\r\n public componentWillUnmount(): void {\r\n document.getElementById('ms-header__subnav-fade')?.removeEventListener('mousedown', this._handleClickOutside, false);\r\n }\r\n\r\n public render(): JSX.Element | null {\r\n const { isMobileView, MenuList, Navigation } = this.props;\r\n const className = this.props.config.className;\r\n // get current pathname\r\n if (process.env.CURRENT_ENVIRONMENT === 'web') {\r\n this.pathName = window.location.pathname;\r\n } else {\r\n this.pathName = this.props.context.request.url.requestUrl.pathname;\r\n }\r\n\r\n this.props.menuItemData.forEach((item, index) => {\r\n const ItemPath = this._getPathNameFromURL(item.linkURL || '');\r\n item.subMenu && item.subMenu.forEach((subItem, subIndex) => {\r\n const subItemPath = this._getPathNameFromURL(subItem.linkURL || '');\r\n if (subItemPath === this.pathName) {\r\n this.activeMenuItem = item;\r\n this.activeSubMenuItem = subItem;\r\n }\r\n });\r\n if (ItemPath === this.pathName) {\r\n this.activeMenuItem = item;\r\n }\r\n });\r\n\r\n this.currentLevel = 1;\r\n return (\r\n \r\n \r\n \r\n \r\n {this._renderDisplay()}\r\n \r\n \r\n
\r\n
\r\n \r\n );\r\n }\r\n\r\n private _getPathNameFromURL(linkURL: string): string {\r\n let pathName = '';\r\n try {\r\n // if linkURL is a full url\r\n pathName = new URL(linkURL).pathname;\r\n } catch {\r\n pathName = linkURL.split('?')[0];\r\n }\r\n return pathName;\r\n }\r\n\r\n private _onMobNavOpen(): void {\r\n const firstNavItem = this.props.menuItemData[0]?.id;\r\n\r\n this.setState({\r\n activeMenu: firstNavItem || undefined,\r\n navOpen: true\r\n });\r\n this._addFixedBodyPosition();\r\n }\r\n\r\n private _onMobNavClose(): void {\r\n this.setState({\r\n activeMenu: undefined,\r\n navOpen: false\r\n });\r\n this._removeFixedBodyPosition();\r\n }\r\n\r\n private _renderDisplay(): JSX.Element[] {\r\n const { ListItem, menuItemData } = this.props;\r\n const menuItemList: JSX.Element[] = [];\r\n const isMobileView: boolean = this.props.isMobileView || false;\r\n const expandOnClick: boolean = this.props.config.expandOnClick || false;\r\n\r\n menuItemData.forEach((item: IMenuItemData, index: number) => {\r\n menuItemList.push(\r\n \r\n {this._createMenuItemList(item)}\r\n \r\n );\r\n });\r\n\r\n return menuItemList;\r\n }\r\n\r\n private _createMenuItemList(menuItemData: IMenuItemData): JSX.Element | null {\r\n if (menuItemData && menuItemData.subMenu && menuItemData.subMenu.length > 0) {\r\n return (\r\n \r\n {this._renderButtonMenuItem(menuItemData)}\r\n {this._renderSubMenu(menuItemData.subMenu, menuItemData.id)}\r\n \r\n );\r\n } else if (menuItemData && menuItemData.linkText && menuItemData.linkURL && menuItemData.linkURL.length > 0) {\r\n return (this._renderLinkMenuItem(menuItemData));\r\n } else if (menuItemData && menuItemData.linkText && !menuItemData.linkURL) {\r\n return (this._renderSpanMenuItem(menuItemData));\r\n }\r\n\r\n return null;\r\n }\r\n\r\n private _renderSubMenu(subMenus?: IMenuItemDataClass[], activeMenu?: number, openInNewTab?: boolean): JSX.Element | null {\r\n const { isMobileView, ListItem } = this.props;\r\n\r\n if (!subMenus || subMenus.length === 0) {\r\n return null;\r\n }\r\n\r\n let levelClassName: string = '';\r\n const menuOptions = subMenus && subMenus.map((option: IMenuItemDataClass, idx: number) => {\r\n const hasOptions = (option.subMenu && option.subMenu.length > 0);\r\n let menuItem: JSX.Element | null;\r\n if (hasOptions) {\r\n menuItem = this._renderButtonMenuItem(option, activeMenu, idx);\r\n } else {\r\n menuItem = (option.linkURL\r\n ? this._renderLinkMenuItem(option, idx, openInNewTab)\r\n : this._renderSpanMenuItem(option)\r\n );\r\n }\r\n\r\n let subMenu;\r\n\r\n if (hasOptions) {\r\n this.currentLevel++;\r\n if (this.currentLevel <= this.supportedLevel - 1) {\r\n levelClassName = `level-${this.currentLevel.toString()}`;\r\n subMenu = this._renderSubMenu(option.subMenu, isMobileView ? option.id : undefined, openInNewTab);\r\n }\r\n }\r\n\r\n return (\r\n \r\n {menuItem}\r\n {subMenu}\r\n \r\n );\r\n });\r\n\r\n return this._renderMenu(levelClassName, menuOptions, activeMenu);\r\n }\r\n\r\n private _renderButtonMenuItem(option: IMenuItemData, activeMenu?: number, index?: number): JSX.Element | null {\r\n const { Button } = this.props;\r\n const isActive = (option === this.activeMenuItem) || (option === this.activeSubMenuItem);\r\n const activeClass = `${Button.className} ${isActive ? this.activeClassName : ''}`;\r\n const isMobileView: boolean = this.props.isMobileView || false;\r\n const expandOnClick: boolean = this.props.config.expandOnClick || false;\r\n\r\n return (\r\n this._mainNavClick(option)}\r\n onMouseEnter={isMobileView || expandOnClick ? false : this._handleDropdownToggle(option, activeMenu)}\r\n aria-haspopup={true}\r\n aria-expanded={this.state.activeMenu && this.state.activeMenu === option.id ? true : false}\r\n data-parent={activeMenu}\r\n aria-current={isActive && 'page'}\r\n >\r\n {option.linkText}\r\n \r\n );\r\n }\r\n\r\n private _mainNavClick = (option: IMenuItemData) => {\r\n const link = option.linkURL;\r\n if (link) {\r\n window.location.href = link;\r\n }\r\n };\r\n\r\n private _renderLinkMenuItem(option: IMenuItemData, index?: number, openInNewTab?: boolean): JSX.Element | null {\r\n const { Link } = this.props;\r\n const isActive = (option === this.activeSubMenuItem) || (option === this.activeMenuItem);\r\n\r\n return (\r\n \r\n {option.linkText}\r\n \r\n );\r\n }\r\n\r\n private _renderSpanMenuItem(option: IMenuItemData, index?: number): JSX.Element | null {\r\n const { Span } = this.props;\r\n return (\r\n {option.linkText}\r\n );\r\n }\r\n\r\n private _renderMenu(level: string, menuOptions: JSX.Element[], currentItem?: number): JSX.Element | null {\r\n const { MenuList } = this.props;\r\n this.currentLevel = 1;\r\n\r\n return (\r\n \r\n {menuOptions}\r\n \r\n );\r\n }\r\n\r\n private _handleDropdownToggle = (data: IMenuItemData, parentId?: number) => () => {\r\n const activeMenu = data.id;\r\n this.setState({\r\n activeMenu,\r\n parentMenu: parentId,\r\n navOpen: true\r\n });\r\n this._addFixedBodyPosition();\r\n this._resetFocus();\r\n };\r\n\r\n private _resetFocus = () => {\r\n if (this.props.isMobileView) {\r\n setTimeout(() => {\r\n this.menuNode && this.menuNode.current && this.menuNode.current.focus();\r\n }, 0);\r\n }\r\n };\r\n\r\n // tslint:disable-next-line:no-any\r\n private _handleClickOutside = (event: any) => {\r\n const burgerMenu: boolean = event.target.className === 'ms-header__nav-icon';\r\n\r\n if (this.menuNode.current && !this.menuNode.current.contains(event.target)) {\r\n this.setState({ activeMenu: undefined, mobileViewLabelText: '' });\r\n\r\n if (!burgerMenu) {\r\n this.setState({ navOpen: false });\r\n }\r\n }\r\n\r\n this._removeFixedBodyPosition();\r\n this._resetFocus();\r\n };\r\n\r\n private _closeSubmenu(): void {\r\n this.setState({\r\n activeMenu: undefined,\r\n mobileViewLabelText: '',\r\n navOpen: false\r\n });\r\n this._removeFixedBodyPosition();\r\n this._resetFocus();\r\n }\r\n\r\n private _addFixedBodyPosition(): void {\r\n document.body?.classList.add('fixed');\r\n }\r\n\r\n private _removeFixedBodyPosition(): void {\r\n document.body?.classList.remove('fixed');\r\n }\r\n}\r\n\r\nexport default NavigationMenuView;\r\n","/*---------------------------------------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License. See License.txt in the project root for license information.\r\n *--------------------------------------------------------------------------------------------*/\r\nimport { IMenuItemData, INavigationMenuViewProps } from '@msdyn365-commerce-modules/navigation-menu';\r\nimport { Module, Node } from '@msdyn365-commerce-modules/utilities';\r\nimport msdyn365Commerce from '@msdyn365-commerce/core-internal';\r\nimport classnames from 'classnames';\r\nimport * as React from 'react';\r\n\r\ninterface INavigationState {\r\n parentMenu?: number;\r\n activeMenu?: number;\r\n mobileViewLabelText?: string;\r\n navOpen: boolean;\r\n subnavHeight?: number;\r\n}\r\n\r\ninterface IMenuItemDataClass extends IMenuItemData {\r\n className?: string;\r\n}\r\n\r\n/**\r\n *\r\n * NavigationMenuView component\r\n * @extends {React.PureComponent}\r\n */\r\nexport class NavigationMenuView extends React.PureComponent {\r\n private supportedLevel: number = 3;\r\n private currentLevel: number = 0;\r\n private menuNode: React.RefObject;\r\n private pathName: string = '';\r\n private activeClassName: string = 'selected';\r\n private activeMenuItem: IMenuItemData = {};\r\n private activeSubMenuItem: IMenuItemData = {};\r\n\r\n constructor(props: INavigationMenuViewProps) {\r\n super(props);\r\n this.menuNode = React.createRef();\r\n this.state = { activeMenu: undefined, mobileViewLabelText: '', parentMenu: undefined, navOpen: false, subnavHeight: 0 };\r\n this._closeSubmenu = this._closeSubmenu.bind(this);\r\n this._onMobNavTrigger = this._onMobNavTrigger.bind(this);\r\n }\r\n\r\n public componentDidMount(): void {\r\n document.body && document.body.addEventListener('mousedown', this._handleClickOutside);\r\n }\r\n\r\n public componentDidUpdate(): void {\r\n if (msdyn365Commerce.isBrowser && document.querySelectorAll('.subnav-menu.subnav-show')) {\r\n const subnavMenuItems = document.querySelectorAll('.subnav-menu.subnav-show > ul');\r\n this.setState({ subnavHeight: subnavMenuItems?.item(0)?.clientHeight || 0 });\r\n document.documentElement.style.setProperty('--subnavHeight', `${this.state.subnavHeight}px`);\r\n }\r\n }\r\n\r\n public componentWillUnmount(): void {\r\n document.body && document.body.removeEventListener('mousedown', this._handleClickOutside, false);\r\n }\r\n\r\n public render(): JSX.Element | null {\r\n const { isMobileView, MenuList, Navigation } = this.props;\r\n // get current pathname\r\n if (process.env.CURRENT_ENVIRONMENT === 'web') {\r\n this.pathName = window.location.pathname;\r\n } else {\r\n this.pathName = this.props.context.request.url.requestUrl.pathname;\r\n }\r\n\r\n // for wine-shop links, only \"all wines\" page should make \"wine shop\" link active\r\n // TODO: \"wine shop\" menu link has different behavior, it doesn't get highlighted unless on the \"all wines\" page\r\n\r\n // if (this.pathName.startsWith('/fth/wine-shop/')) {\r\n // if (this.pathName.startsWith('/fth/wine-shop/5637149842.c') || this.pathName.startsWith('/fth/wine-shop/all-wines/5637149843.c')) {\r\n // // get \"wine shop\" menu item\r\n // this.props.menuItemData.forEach((item, index) => {\r\n // if (item.linkURL && item.linkURL.startsWith('/fth/wine-shop/')) {\r\n // this.activeMenuItem = item;\r\n // }\r\n // });\r\n // }\r\n // } else {\r\n this.props.menuItemData.forEach((item, index) => {\r\n const ItemPath = this._getPathNameFromURL(item.linkURL || '');\r\n item.subMenu && item.subMenu.forEach((subItem, subIndex) => {\r\n const subItemPath = this._getPathNameFromURL(subItem.linkURL || '');\r\n if (subItemPath === this.pathName) {\r\n this.activeMenuItem = item;\r\n this.activeSubMenuItem = subItem;\r\n }\r\n });\r\n if (ItemPath === this.pathName) {\r\n this.activeMenuItem = item;\r\n }\r\n });\r\n // }\r\n\r\n this.currentLevel = 1;\r\n return (\r\n \r\n \r\n \r\n \r\n {this._renderDisplay()}\r\n \r\n \r\n \r\n );\r\n }\r\n\r\n private _getPathNameFromURL(linkURL: string): string {\r\n let pathName = '';\r\n try {\r\n // if linkURL is a full url\r\n pathName = new URL(linkURL).pathname;\r\n } catch {\r\n pathName = linkURL.split('?')[0];\r\n }\r\n return pathName;\r\n }\r\n\r\n private _onMobNavTrigger(): void {\r\n this.setState(state => ({\r\n navOpen: !state.navOpen\r\n }));\r\n }\r\n\r\n private _renderDisplay(): JSX.Element[] {\r\n const { ListItem, menuItemData } = this.props;\r\n const menuItemList: JSX.Element[] = [];\r\n menuItemData.forEach((item: IMenuItemData, index: number) => {\r\n menuItemList.push(\r\n \r\n {this._createMenuItemList(item)}\r\n \r\n );\r\n });\r\n\r\n return menuItemList;\r\n }\r\n\r\n private _createMenuItemList(menuItemData: IMenuItemData): JSX.Element | null {\r\n if (menuItemData && menuItemData.subMenu && menuItemData.subMenu.length > 0) {\r\n if (this.props.isMobileView) {\r\n return (\r\n \r\n {this._renderButtonMenuItem(menuItemData)}\r\n \r\n {this._renderSubMenu(menuItemData.subMenu, menuItemData.id)}\r\n \r\n );\r\n } else {\r\n return (\r\n \r\n {this._renderButtonMenuItem(menuItemData)}\r\n {this._renderSubMenu(menuItemData.subMenu, menuItemData.id)}\r\n \r\n );\r\n }\r\n } else if (menuItemData && menuItemData.linkText && menuItemData.linkURL && menuItemData.linkURL.length > 0) {\r\n return (this._renderLinkMenuItem(menuItemData));\r\n } else if (menuItemData && menuItemData.linkText && !menuItemData.linkURL) {\r\n return (this._renderSpanMenuItem(menuItemData));\r\n }\r\n\r\n return null;\r\n }\r\n\r\n private _renderSubMenu(subMenus?: IMenuItemDataClass[], activeMenu?: number): JSX.Element | null {\r\n const { isMobileView, ListItem } = this.props;\r\n if (activeMenu && this.state.activeMenu !== activeMenu && !isMobileView) {\r\n return null;\r\n }\r\n\r\n if (!subMenus || subMenus.length === 0) {\r\n return null;\r\n }\r\n\r\n let levelClassName: string = '';\r\n const menuOptions = subMenus && subMenus.map((option: IMenuItemDataClass, idx: number) => {\r\n const hasOptions = (option.subMenu && option.subMenu.length > 0);\r\n let menuItem: JSX.Element | null;\r\n if (hasOptions && isMobileView) {\r\n menuItem = this._renderButtonMenuItem(option, activeMenu, idx);\r\n } else {\r\n menuItem = (option.linkURL\r\n ? this._renderLinkMenuItem(option, idx)\r\n : this._renderSpanMenuItem(option)\r\n );\r\n }\r\n\r\n let subMenu;\r\n\r\n if (hasOptions) {\r\n this.currentLevel++;\r\n if (this.currentLevel <= this.supportedLevel - 1) {\r\n levelClassName = `level-${this.currentLevel.toString()}`;\r\n subMenu = this._renderSubMenu(option.subMenu, isMobileView ? option.id : undefined);\r\n }\r\n }\r\n\r\n return (\r\n \r\n {menuItem}\r\n {subMenu}\r\n \r\n );\r\n });\r\n\r\n return (this._renderMenu(levelClassName, menuOptions, activeMenu));\r\n }\r\n\r\n private _renderButtonMenuItem(option: IMenuItemData, activeMenu?: number, index?: number): JSX.Element | null {\r\n const { Button } = this.props;\r\n const isActive = (option === this.activeMenuItem) || (option === this.activeSubMenuItem);\r\n const activeClass = `${Button.className} ${isActive ? this.activeClassName : ''}`;\r\n\r\n return (\r\n this._mainNavClick(option) : this._handleDropdownToggle(option, activeMenu)}\r\n onMouseEnter={!this.props.isMobileView ? this._handleDropdownToggle(option, activeMenu) : false}\r\n onFocus={!this.props.isMobileView ? this._handleDropdownToggle(option, activeMenu) : false}\r\n aria-haspopup={true}\r\n aria-expanded={this.state.activeMenu && this.state.activeMenu === option.id ? true : false}\r\n data-parent={activeMenu}\r\n aria-current={isActive && 'page'}\r\n >\r\n {option.linkText}\r\n \r\n );\r\n }\r\n\r\n private _mainNavClick = (option: IMenuItemData) => {\r\n const link = option.linkURL;\r\n if (link) {\r\n window.location.href = link;\r\n }\r\n };\r\n\r\n private _renderLinkMenuItem(option: IMenuItemData, index?: number): JSX.Element | null {\r\n const { Link } = this.props;\r\n const isActive = (option === this.activeSubMenuItem) || (option === this.activeMenuItem);\r\n const activeClass = `${Link.className} ${isActive ? this.activeClassName : ''}`;\r\n\r\n return (\r\n \r\n {option.linkText}\r\n \r\n );\r\n }\r\n\r\n private _renderSpanMenuItem(option: IMenuItemData, index?: number): JSX.Element | null {\r\n const { Span } = this.props;\r\n return (\r\n {option.linkText}\r\n );\r\n }\r\n\r\n private _renderMenu(level: string, menuOptions: JSX.Element[], currentItem?: number): JSX.Element | null {\r\n const { MenuList } = this.props;\r\n this.currentLevel = 1;\r\n return (\r\n \r\n {menuOptions}\r\n \r\n );\r\n }\r\n\r\n private _handleDropdownToggle = (data: IMenuItemData, parentId?: number) => () => {\r\n let activeMenu;\r\n if(this.props.isMobileView) {\r\n activeMenu = (this.state.activeMenu && this.state.activeMenu === data.id!) ? undefined : data.id!;\r\n } else {\r\n activeMenu = data.id;\r\n }\r\n this.setState({\r\n activeMenu,\r\n parentMenu: parentId\r\n });\r\n\r\n this._resetFocus();\r\n };\r\n\r\n private _resetFocus = () => {\r\n if (this.props.isMobileView) {\r\n setTimeout(() => {\r\n this.menuNode && this.menuNode.current && this.menuNode.current.focus();\r\n }, 0);\r\n }\r\n };\r\n\r\n // tslint:disable-next-line:no-any\r\n private _handleClickOutside = (event: any) => {\r\n const burgerMenu:boolean = event.target.className === 'ms-header__nav-icon msc-btn';\r\n if (this.menuNode.current && !this.menuNode.current.contains(event.target) && !burgerMenu) {\r\n this.setState({ navOpen: false });\r\n }\r\n };\r\n\r\n private _closeSubmenu(): void {\r\n if (!this.props.isMobileView) {\r\n this.setState({ activeMenu: undefined, mobileViewLabelText: '' });\r\n }\r\n }\r\n}\r\n\r\nexport default NavigationMenuView;","/*---------------------------------------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License. See License.txt in the project root for license information.\r\n *--------------------------------------------------------------------------------------------*/\r\nimport { Module, Node } from '@msdyn365-commerce-modules/utilities';\r\nimport msdyn365Commerce from '@msdyn365-commerce/core-internal';\r\nimport classnames from 'classnames';\r\nimport * as React from 'react';\r\nimport { INavigationMenuViewProps } from '../../../modules/smwe-navigation-menu/./smwe-navigation-menu';\r\nimport { IMenuItemData } from '../../../modules/smwe-navigation-menu/./smwe-navigation-menu.data';\r\nimport { ISmweNavigationMenuProps } from '../definition-extensions/smwe-navigation-menu.ext.props.autogenerated';\r\n\r\ninterface INavigationState {\r\n parentMenu?: number;\r\n activeMenu?: number;\r\n mobileViewLabelText?: string;\r\n menuHeight?: number;\r\n initialMenuItem?: number;\r\n navOpen: boolean;\r\n}\r\n\r\ninterface IMenuItemDataClass extends IMenuItemData {\r\n className?: string;\r\n}\r\n\r\n/**\r\n *\r\n * NavigationMenuView component\r\n * @extends {React.PureComponent}\r\n */\r\nexport class NavigationMenuView extends React.PureComponent, INavigationState> {\r\n private supportedLevel: number = 3;\r\n private currentLevel: number = 0;\r\n private menuNode: React.RefObject;\r\n private pathName: string = '';\r\n private activeClassName: string = 'selected';\r\n private activeMenuItem: IMenuItemData = {};\r\n private activeSubMenuItem: IMenuItemData = {};\r\n\r\n constructor(props: INavigationMenuViewProps & ISmweNavigationMenuProps<{}>) {\r\n super(props);\r\n this.menuNode = React.createRef();\r\n this.state = {\r\n activeMenu: undefined,\r\n mobileViewLabelText: '',\r\n parentMenu: undefined,\r\n navOpen: false,\r\n menuHeight: 0,\r\n initialMenuItem: undefined\r\n };\r\n this._closeSubmenu = this._closeSubmenu.bind(this);\r\n this._onMobNavOpen = this._onMobNavOpen.bind(this);\r\n this._onMobNavClose = this._onMobNavClose.bind(this);\r\n }\r\n\r\n public componentDidMount(): void {\r\n document.getElementById('ms-header__subnav-fade')?.addEventListener('mousedown', this._handleClickOutside);\r\n }\r\n\r\n public componentDidUpdate(): void {\r\n const menuHeight = this.menuNode.current?.clientHeight;\r\n this.setState({ menuHeight: menuHeight });\r\n if (msdyn365Commerce.isBrowser) {\r\n document.documentElement.style.setProperty('--navMenuHeight', `${this.state.menuHeight}px`);\r\n }\r\n }\r\n\r\n public componentWillUnmount(): void {\r\n document.getElementById('ms-header__subnav-fade')?.removeEventListener('mousedown', this._handleClickOutside, false);\r\n }\r\n\r\n public render(): JSX.Element | null {\r\n const { isMobileView, MenuList, Navigation } = this.props;\r\n const className = this.props.config.className;\r\n // get current pathname\r\n if (process.env.CURRENT_ENVIRONMENT === 'web') {\r\n this.pathName = window.location.pathname;\r\n } else {\r\n this.pathName = this.props.context.request.url.requestUrl.pathname;\r\n }\r\n\r\n this.props.menuItemData.forEach((item, index) => {\r\n const ItemPath = this._getPathNameFromURL(item.linkURL || '');\r\n item.subMenu && item.subMenu.forEach((subItem, subIndex) => {\r\n const subItemPath = this._getPathNameFromURL(subItem.linkURL || '');\r\n if (subItemPath === this.pathName) {\r\n this.activeMenuItem = item;\r\n this.activeSubMenuItem = subItem;\r\n this.setState({ initialMenuItem: this.activeMenuItem.id });\r\n }\r\n });\r\n if (ItemPath === this.pathName) {\r\n this.activeMenuItem = item;\r\n }\r\n });\r\n\r\n this.currentLevel = 1;\r\n return (\r\n \r\n \r\n \r\n \r\n {this._renderDisplay()}\r\n \r\n \r\n
\r\n \r\n );\r\n }\r\n\r\n private _getPathNameFromURL(linkURL: string): string {\r\n let pathName = '';\r\n try {\r\n // if linkURL is a full url\r\n pathName = new URL(linkURL).pathname;\r\n } catch {\r\n pathName = linkURL.split('?')[0];\r\n }\r\n return pathName;\r\n }\r\n\r\n private _onMobNavOpen(): void {\r\n const firstNavItem = this.props.menuItemData[0]?.id;\r\n\r\n this.setState({\r\n activeMenu: this.state.initialMenuItem !== undefined ? this.state.initialMenuItem : firstNavItem || undefined,\r\n navOpen: true\r\n });\r\n this._addFixedBodyPosition();\r\n }\r\n\r\n private _onMobNavClose(): void {\r\n this.setState({\r\n activeMenu: undefined,\r\n navOpen: false\r\n });\r\n this._removeFixedBodyPosition();\r\n }\r\n\r\n private _renderDisplay(): JSX.Element[] {\r\n const { ListItem, menuItemData } = this.props;\r\n const menuItemList: JSX.Element[] = [];\r\n const isMobileView: boolean = this.props.isMobileView || false;\r\n const expandOnClick: boolean = this.props.config.expandOnClick || false;\r\n menuItemData.forEach((item: IMenuItemData, index: number) => {\r\n menuItemList.push(\r\n \r\n {this._createMenuItemList(item, item.id)}\r\n \r\n );\r\n });\r\n\r\n return menuItemList;\r\n }\r\n\r\n private _createMenuItemList(menuItemData: IMenuItemData, idx?: number): JSX.Element | null {\r\n if (menuItemData && menuItemData.subMenu && menuItemData.subMenu.length > 0) {\r\n return (\r\n \r\n {this._renderButtonMenuItem(menuItemData, menuItemData.id, idx)}\r\n \r\n {this._renderSubMenu(menuItemData.subMenu, menuItemData.id)}\r\n \r\n \r\n );\r\n } else if (menuItemData && menuItemData.linkText && menuItemData.linkURL && menuItemData.linkURL.length > 0) {\r\n return (this._renderLinkMenuItem(menuItemData));\r\n } else if (menuItemData && menuItemData.linkText && !menuItemData.linkURL) {\r\n return (this._renderSpanMenuItem(menuItemData));\r\n }\r\n\r\n return null;\r\n }\r\n\r\n private _renderSubMenu(subMenus?: IMenuItemDataClass[], activeMenu?: number, openInNewTab?: boolean): JSX.Element | null {\r\n const { ListItem } = this.props;\r\n\r\n if (!subMenus || subMenus.length === 0) {\r\n return null;\r\n }\r\n\r\n let levelClassName: string = '';\r\n const menuOptions = subMenus && subMenus.map((option: IMenuItemDataClass, idx: number) => {\r\n const hasOptions = (option.subMenu && option.subMenu.length > 0);\r\n let menuItem: JSX.Element | null;\r\n if (hasOptions) {\r\n menuItem = this._renderButtonMenuItem(option, activeMenu, idx);\r\n } else {\r\n menuItem = (option.linkURL\r\n ? this._renderLinkMenuItem(option, idx, openInNewTab)\r\n : this._renderSpanMenuItem(option)\r\n );\r\n }\r\n\r\n let subMenu;\r\n\r\n if (hasOptions) {\r\n this.currentLevel++;\r\n if (this.currentLevel <= this.supportedLevel - 1) {\r\n levelClassName = `level-${this.currentLevel.toString()}`;\r\n subMenu = this._renderSubMenu(option.subMenu, option.id, openInNewTab);\r\n }\r\n }\r\n\r\n return (\r\n \r\n {menuItem}\r\n {subMenu}\r\n \r\n );\r\n });\r\n\r\n return this._renderMenu(levelClassName, menuOptions, activeMenu);\r\n }\r\n\r\n private _renderButtonMenuItem(option: IMenuItemData, activeMenu?: number, index?: number): JSX.Element | null {\r\n const { Button } = this.props;\r\n const isActive = (option === this.activeMenuItem) || (option === this.activeSubMenuItem);\r\n const activeClass = `${Button.className} ${isActive ? this.activeClassName : ''}`;\r\n const isMobileView: boolean = this.props.isMobileView || false;\r\n const expandOnClick: boolean = this.props.config.expandOnClick || false;\r\n\r\n return (\r\n this._mainNavClick(option)}\r\n onMouseEnter={isMobileView || expandOnClick ? false : this._handleDropdownToggle(option, activeMenu)}\r\n aria-haspopup={true}\r\n aria-expanded={this.state.activeMenu && this.state.activeMenu === option.id ? true : false}\r\n data-parent={activeMenu}\r\n aria-current={isActive && 'page'}\r\n >\r\n {option.linkText}\r\n \r\n );\r\n }\r\n\r\n private _mainNavClick = (option: IMenuItemData) => {\r\n const link = option.linkURL;\r\n if (link) {\r\n window.location.href = link;\r\n }\r\n };\r\n\r\n private _renderLinkMenuItem(option: IMenuItemData, index?: number, openInNewTab?: boolean): JSX.Element | null {\r\n const { Link } = this.props;\r\n const isActive = (option === this.activeSubMenuItem) || (option === this.activeMenuItem);\r\n\r\n return (\r\n \r\n {option.linkText}\r\n \r\n );\r\n }\r\n\r\n private _renderSpanMenuItem(option: IMenuItemData, index?: number): JSX.Element | null {\r\n const { Span } = this.props;\r\n return (\r\n {option.linkText}\r\n );\r\n }\r\n\r\n private _renderMenu(level: string, menuOptions: JSX.Element[], currentItem?: number): JSX.Element | null {\r\n const { MenuList } = this.props;\r\n this.currentLevel = 1;\r\n const stateClass = currentItem && currentItem === this.state.activeMenu ? 'expanded' : 'collapsed';\r\n\r\n return (\r\n \r\n {menuOptions}\r\n \r\n );\r\n }\r\n\r\n private _handleDropdownToggle = (data: IMenuItemData, parentId?: number) => () => {\r\n const activeMenu = data.id;\r\n this.setState({\r\n activeMenu,\r\n parentMenu: parentId,\r\n navOpen: true\r\n });\r\n this._addFixedBodyPosition();\r\n this._resetFocus();\r\n };\r\n\r\n private _resetFocus = () => {\r\n if (this.props.isMobileView) {\r\n setTimeout(() => {\r\n this.menuNode && this.menuNode.current && this.menuNode.current.focus();\r\n }, 0);\r\n }\r\n };\r\n\r\n // tslint:disable-next-line:no-any\r\n private _handleClickOutside = (event: any) => {\r\n const burgerMenu: boolean = event.target.className === 'ms-header__nav-icon';\r\n\r\n if (this.menuNode.current && !this.menuNode.current.contains(event.target)) {\r\n this.setState({ activeMenu: undefined, mobileViewLabelText: '' });\r\n\r\n if (!burgerMenu) {\r\n this.setState({ navOpen: false });\r\n }\r\n }\r\n\r\n this._removeFixedBodyPosition();\r\n this._resetFocus();\r\n };\r\n\r\n private _closeSubmenu(): void {\r\n this.setState({\r\n activeMenu: undefined,\r\n mobileViewLabelText: '',\r\n navOpen: false\r\n });\r\n this._removeFixedBodyPosition();\r\n this._resetFocus();\r\n }\r\n\r\n private _addFixedBodyPosition(): void {\r\n document.body?.classList.add('fixed');\r\n }\r\n\r\n private _removeFixedBodyPosition(): void {\r\n document.body?.classList.remove('fixed');\r\n }\r\n}\r\n\r\nexport default NavigationMenuView;\r\n"],"names":["navigationMenuSource","alignment","NavigationMenu","React","constructor","props","super","isRetail","isCMS","_formatLinkData","href","undefined","path","destinationUrl","URL","this","context","request","url","requestUrl","_setNavigationSource","sourceType","retailServerOnly","cmsOnly","all","_updateViewport","bind","viewport","device","Type","config","state","isMobile","menuItemList","locale","nameTranslations","nameTranslation","length","find","item","Language","toLowerCase","Text","componentDidMount","resizeThrottledEventHandler","window","addThrottledEvent","componentWillUnmount","removeEventListener","render","_mapData","isEmptyOrNullObject","data","telemetry","error","defaultImageSettings","viewports","xs","q","w","h","xl","lazyload","viewProps","_objectSpread","imageSettings","gridSettings","Navigation","moduleProps","className","classnames","tag","resources","menuAriaLabel","MenuList","ListItem","role","Link","Button","onClick","ImageContainer","Span","MobileDescriptionContainer","MobileBackButton","backButtonAriaLabel","MobileDescriptionLabel","isMobileView","menuItemData","renderView","retailServerNavItems","mergedData","navigationmenu","categories","result","_this$props$config$to","filter","x","Children","retailServerMainMenu","hiddenRetailMenuItems","hiddenItemsArray","split","map","trim","fetchedRetailMenuItems","navItem","RecordId","_navItem$Name","Name","_injectCmsMenu","cmsRetailItemMenu","topLvlCategory","Url","overrideServerName","topLvlCategoryText","push","_constructMenuItemData","cmsNavItems","idx","sliceIndex","_swapArrayPos","categoryMenu","cmsMenu","menu","cmsMenuSort","sort","first","second","idGenerator","forEach","_isInMenu","splice","Math","max","linkText","ClassName","altStyle","linkUrl","NameTranslations","category","oldIndex","newIndex","k","_constructMenuItemFromRetailItem","retailItem","arguments","id","RSItemIdInit","getFriendlyName","linkURL","subMenu","_getNestedChildren","cmsItem","CMSItemIdInit","imageDestinationURL","imageLink","imageSource","image","src","_getCMSNestedChildren","nestedChildren","hideRetailAllMenu","allCategoryMenuText","getCategoryUrl","subMenus","_getViewport","setState","innerWidth","sm","md","lg","__decorate","observable","computed","NavigationMenuView","supportedLevel","currentLevel","pathName","activeClassName","activeMenuItem","activeSubMenuItem","_mainNavClick","option","link","location","_handleDropdownToggle","parentId","activeMenu","parentMenu","_resetFocus","setTimeout","menuNode","current","focus","_handleClickOutside","event","burgerMenu","target","contains","navOpen","mobileViewLabelText","_closeSubmenu","_onMobNavTrigger","document","body","addEventListener","pathname","index","ItemPath","_getPathNameFromURL","subItem","subIndex","Module","Object","assign","Node","ref","_renderDisplay","_unused","key","onMouseLeave","_createMenuItemList","_renderButtonMenuItem","_renderSubMenu","_renderLinkMenuItem","_renderSpanMenuItem","levelClassName","menuOptions","hasOptions","menuItem","toString","_renderMenu","isActive","activeClass","onMouseEnter","onFocus","level","currentItem","_item$linkText","_this$props$config$hi","hiddenUrl","hiddenSubMenuItem","_removeSubItem","subMenuArray","subItemToRemove","i","_subMenuArray$i$linkT","trapFocusInsideMenu","firstFocusableElement","getElementsByClassName","lastFocusableElement","children","msNavList","tagName","msNavListItem","lastMenuItem","submenu","Array","from","subnavShow","s","classList","includes","b","activeElement","preventDefault","expandOnClick","isOpen","Navbar","expand","light","NavbarToggler","Collapse","navbar","Nav","UncontrolledDropdown","nav","inNavbar","DropdownMenu","right","_renderTextMenuItem","DropdownToggle","caret","NavItem","NavLink","DropdownItem","_addFixedBodyPosition","_removeFixedBodyPosition","menuHeight","initialMenuItem","_onMobNavOpen","_onMobNavClose","_document$getElementB","getElementById","componentDidUpdate","_this$menuNode$curren","clientHeight","msdyn365Commerce","isBrowser","documentElement","style","setProperty","_document$getElementB2","_this$props$menuItemD","firstNavItem","openInNewTab","rel","stateClass","_document$body","add","_document$body2","remove","openSubmenuItemsNewTab","openSubmenuItemsNewTabArray","_option$linkText","alt","_renderSubNavButton","type","HTMLButtonElement","HTMLAnchorElement","sideNavOpened","subnavHeight","querySelectorAll","_subnavMenuItems$item","subnavMenuItems"],"sourceRoot":""}