{"version":3,"sources":["webpack:///src/modules/tab-item/tab-item.view.tsx?76f0","webpack:///./src/themes/gardner-theme/views/components/navigation-menu-utilities.tsx?fbd2","webpack:///./src/themes/gardner-theme/views/components/navigation-menu-root-disabled.tsx?57df","webpack:///./src/themes/gardner-theme/views/components/navigation-menu-root-enabled.tsx?1fa6","webpack:///./src/themes/gardner-theme/views/navigation-menu.view.tsx?1dcf","webpack:///src/index.ts?c6ae","webpack:///src/modules/adventureworks/views/components/navigation-menu-utilities.tsx?9734","webpack:///src/modules/adventureworks/views/components/navigation-menu-root-disabled.tsx?8952","webpack:///src/modules/adventureworks/views/components/navigation-menu-root-enabled.tsx?083d","webpack:///src/modules/adventureworks/views/navigation-menu.view.tsx?c096","webpack:///src/modules/tab/tab.tsx?d713","webpack:///src/modules/tab-item/tab-item.tsx?d2c1","webpack:///src/modules/navigation-menu/navigation-menu.data.ts?a9f0","webpack:///src/modules/navigation-menu/navigation-menu.tsx?390c","webpack:///src/modules/fabrikam/views/header.view.tsx?1cde","webpack:///./src/themes/gardner-theme-b2c/views/components/navigation-menu-utilities.tsx?5026","webpack:///./src/themes/gardner-theme-b2c/views/components/navigation-menu-root-disabled.tsx?0e9a","webpack:///./src/themes/gardner-theme-b2c/views/components/navigation-menu-root-enabled.tsx?230c","webpack:///./src/themes/gardner-theme-b2c/views/navigation-menu.view.tsx?f8c1","webpack:///./src/modules/cart-line-comment/cart-line-comment.view.tsx?5b01","webpack:///src/modules/tab/tab.view.tsx?701e","webpack:///src/modules/tile-list-item/tile-list-item.view.tsx?0144","webpack:///src/modules/navigation-menu/navigation-menu.view.tsx?df40","webpack:///src/modules/tile-list-item/components/links.tsx?e54f","webpack:///src/modules/tile-list-item/tile-list-item.tsx?99bb","webpack:///./src/modules/cart-line-comment/cart-line-comment.tsx?d920"],"names":["_renderTabItemContent","items","React","length","map","item","index","key","TabItemView","props","tabItemType","tabSlots","TabContentContainer","TabHeaderContainer","TabItemContent","tabHeader","TabItemType","TabContent","Module","Object","assign","Node","tabItemContent","TabHeader","NavMenuConstants","getCategoryImage","categoryImage","alttext","categoryImageUrl","generateImageUrl","navProps","context","actionContext","requestContext","apiSettings","defaultImageSettings","viewports","xs","q","w","h","sm","md","lg","lazyload","undefined","_props$navProps$confi","imageData","src","Msdyn365","className","gridSettings","request","imageSettings","config","categoryImageSettings","loadFailureBehavior","role","altText","NavigationMenuRootDisabled","constructor","super","supportedLevel","four","currentLevel","zero","escapeKey","promotionalImage","_toggleNavBar","this","setState","previousState","activeMenu","isNavOpen","_bindDesktopCategoryClick","desktopCategoryId","state","isDrawerOpen","_updateCategoryImage","categoryImageSource","option","linkText","ArrayExtensions","hasElements","promotionalContent","imageSource","image","push","text","additionalProperties","linkUrl","destinationUrl","_handleDropdownToggle","data","parentId","isOnlyMobile","isBackTrack","id","mobileViewLabelText","parentMenu","showCategoryImage","_handleGoBack","_handleClickOutside","event","menuNode","current","contains","target","_shouldAddFocusMenuRef","optionLinkText","_closeNavMenu","_escFunction","keyCode","_customUpdateViewport","menuItemRef","menuItemData","subMenu","imagesource","telemetryContent","getTelemetryObject","telemetryPageName","friendlyName","telemetry","payLoad","getPayloadObject","attributes","getTelemetryAttributes","isMobile","variant","VariantType","Browser","componentDidMount","customResizeThrottledEventHandler","addThrottledEvent","window","document","addEventListener","body","componentDidUpdate","_this$menuItemRef$cur","children","isMobileView","focus","componentWillUnmount","removeEventListener","render","ref","_renderMobileMenu","Button","onClick","title","resources","hamburgerAriaLabel","_renderCollapseMenu","Collapse","isOpen","_renderDesktopMenu","MenuList","MobileBackButton","MobileDescriptionContainer","MobileDescriptionLabel","Navigation","classnames","tabIndex","_renderDisplay","_renderDrawerLink","linkURL","StringExtensions","isNullOrWhitespace","_renderLinkMenuItem","_renderSpanMenuItem","ListItem","menuItemList","menuItem","_getFromSubMenu","_createMenuItemList","entries","parentMenuId","menu","one","Number","found","_renderSubMenu","_renderButtonMenuItem","subMenuArray","isSubMenu","_this$props$navProps$","_this$props$navProps$2","subMenus","rootMenu","filter","subMenuItem","MenuTypeIndexId","Retail","isEnableMultiSupportMenu","enableMultilevelMenu","multiLevelSupportedMenu","menuLevelSupport","three","error","levelClassName","menuOptions","hasOptions","getMenuItem","isHavingSubmenu","Math","round","two","_renderSubMenuDrawer","toString","onMouseOver","_renderMenu","_renderLinkMenuItemLevelOne","_menuItem$linkText","Drawer","collapseProps","timeout","openGlyph","closeGlyph","glyphPlacement","toggleButtonText","onToggle","menuSubItem","Link","contentAction","etext","href","shouldOpenNewTab","onTelemetryClick","isHoverEffect","arguments","_renderPromotionalLink","Span","level","isSubmenu","_this$state$categoryI","DivContainer","ImageDivContainer","showPromotionalContent","isCategoryImageDisplay","isPromotionalContentDisplay","divContainerClass","menuLevelSupportClassName","categoryImages","imagesContainerKey","join","_item$src","_item$additionalPrope","__decorate","computed","NavigationMenuRootEnabled","_addShopAllLink","_this$menuItemData$0$","shopAllObject","allCategoryMenuText","menuSource","MenuSource","unshift","rootMenuNavigation","cmsMenuData","retailMenuItemData","retailMenuData","JSON","parse","stringify","menuItemDatum","navigationMenuView","enabletopMenu","menuId","drawerKeyValue","newPair","_objectSpread","_this$menuNode$curren","_this$menuNode$curren2","_this$props$navProps$3","buttonText","keys","colProps","ariaLabel","Tab","tabIndexQuery","handleHeadingChange","heading","value","_refHandler","link","activeLink","_onClick","e","activeTabState","activeContentIndex","tabId","update","createTabStateInput","currentTabIndex","newUrl","_setGetParameter","String","history","pushState","path","_onKeyDown","slots","slotLength","tabItems","defaultTabIndex","initialIndex","queryString","query","activeTab","queryTabIndex","indexOf","arr","split","parseInt","_getTabHeader","bind","_getTabContent","shouldComponentUpdate","nextProps","nextState","headingComponent","MsDyn365","tag","editProps","onEdit","tabViewProps","TabContainer","moduleProps","headerSection","tabsSection","tabItemContainer","tabContents","tabHeaders","renderView","params","isEditor","dataActionTabId","result","selected","contentID","getContentID","onKeyDown","isSelected","itemIndex","paramName","paramValue","url","isBrowser","URL","location","requestUrl","URLSearchParams","search","set","decodeURIComponent","observer","TabItem","moduleContentClassName","moduleHeaderClassName","_renderTabHeader","activeContentIDResult","shown","tabItemTitle","NavigationMenu","isRetail","isCMS","_setNavigationSource","sourceType","_updateViewport","viewport","device","Type","navigationMenuSource","locale","nameTranslations","nameTranslation","find","Language","toLowerCase","Text","resizeThrottledEventHandler","_this$props$config$di","_this$props$config$di2","_mapData","isEmptyOrNullObject","viewProps","xl","displayCategoryImage","displayPromotionalImage","ImageContainer","backButtonAriaLabel","mergedData","categories","_constructMenuItemData","cmsNavItems","idx","_constructTopMenuItemData","_this$props$config$en","_this$props$config$ro","mergedRootMenuData","topMenu","retailItem","cmsItem","addedAllMenu","categoryPromotionalContent","cmsItemText","menuAriaLabel","promotionalData","promoItem","_promoItem$categoryNa","_retailItem$Name","categoryName","Name","_NavigationMenu$getFr","_NavigationMenu$getFr2","Images","Uri","RSItemIdInit","getFriendlyName","NameTranslations","Url","_getNestedChildren","CMSItemIdInit","imageDestinationURL","imageLink","_getCMSNestedChildren","Cms","openInNewTab","category","imageSourceUrl","nestedChildren","Children","getCategoryUrl","_getViewport","innerWidth","observable","renderCustomerName","accountInformation","customer","FirstName","_renderReactFragment","slot","headerView","HeaderTag","HeaderContainer","HeaderTopBarContainer","Divider","navIcon","logo","preferredStore","renderForMobile","AccountInfoDropdownParentContainer","AccountInfoDropdownPopoverConentContainer","accountInfoDropdownButton","signOutLink","signInLink","accountLinks","accountClassName","_renderAccountBlock","wishListIconDesktop","cartIcon","siteOptions","MobileMenuLinksContainer","mobileMenuCollapsed","_renderMobileAccountBlock","wishListIconMobile","menuBar","staticDisplay","cartLineCommentModuleProps","modal","tabView","TileListItemViewComponent","tileListItem","paragraph","backgroundImage","links","thumbnailImage","tileListContainer","tileListImageContainer","tileListThumbnailImageContainer","tileListHeadingContainer","renderTileListItemContent","NavigationMenuView","categoryImageSrc","imageSrc","promotionalItemImageSettings","categoryImageAltText","_handleFocusOutside","relatedTarget","_closeSubmenu","_getCategoryImage","_ref","_categoryImage$imageS","Image","forEach","i","IsSubMenu","enableMultiSupportMenu","haveSubmenu","onFocus","hoverEffect","isParent","currentItem","submenu","categoryImageDisplay","promotionalContentDisplay","DivContainerClass","TileListLinks","_mapEditableLinks","linkdata","editableLinks","editableLink","onTextChange","TileListItem","_telemetryContent","handleParagraphChange","handleLinkTextChange","linkIndex","_this$props$config$li","redirectionUrl","tileListLinks","tileListLinkContainer","_createHeading","_createParagraph","_renderBackgroundImage","_renderThumbnailImage","_heading$tag","isAriaHiddenAttribute","_item$imageSettings","_this$props$config$ba","verifiedImageSettings","moduleType","typeName","imagePropertyName","itemImageSettings","_this$props$config$th","layout","msdyn365__moduleLayout","CartLineComment","_className","_updateCartLineComment","async","_dummyCart$CartLines","cartState","cart","cartLineToUpdate","CartLines","cl","LineId","cartLineId","Comment","comment","updateCartLineQuantity","newQuantity","Quantity","isCommentAreaActive","_updateCommentState","_resetCommentToProps","_toggleCommentAreaActive","prevState","_renderStaticCommentDisplay","commentLinkText","editLinkText","_getCommentPreview","_renderCommentLink","substring","_renderSaveButton","saveButtonText","_renderCancelButton","cancelButtonText","_renderTextArea","textAreaLabel","htmlFor","_getFieldId","onChange","_renderButtonArea","_renderModal","Modal","toggle","ModalHeader","_getModalTitle","ModalFooter","commentModalTitle","replace","cartProductTitle"],"mappings":"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","file":"static/js/18.b08150c7987fd683988e.chunk.js","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { Module, Node } from '@msdyn365-commerce-modules/utilities';\nimport * as React from 'react';\n\nimport { ITabItemViewProps, TabItemType } from './tab-item';\n\nconst TabItemView: React.FC = props => {\n const { tabItemType, tabSlots, TabContentContainer, TabHeaderContainer, TabItemContent, tabHeader } = props;\n\n switch (tabItemType) {\n case TabItemType.TabContent:\n return (\n \n \n {tabSlots &&\n tabSlots.tabItemContent &&\n tabSlots.tabItemContent.length &&\n _renderTabItemContent(tabSlots.tabItemContent)}\n \n \n );\n case TabItemType.TabHeader:\n return {tabHeader};\n default:\n return null;\n }\n};\n\nconst _renderTabItemContent = (items: React.ReactNode[]): JSX.Element | null => {\n return (\n <>\n {items && items.length > 0\n ? items.map((item: React.ReactNode, index: number) => {\n return {item};\n })\n : null}\n \n );\n};\nexport default TabItemView;\n","/*--------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * See License.txt in the project root for license information.\r\n *--------------------------------------------------------------*/\r\n\r\nimport * as Msdyn365 from '@msdyn365-commerce/core';\r\nimport { INavigationMenuViewProps } from '@msdyn365-commerce-modules/navigation-menu';\r\nimport { generateImageUrl } from '@msdyn365-commerce-modules/retail-actions';\r\nimport * as React from 'react';\r\n\r\nimport { INavigationMenuProps } from '../../definition-extensions/navigation-menu.ext.props.autogenerated';\r\n\r\n/**\r\n * INavigationMenuViewRootProps.\r\n */\r\nexport interface INavigationMenuViewRootProps {\r\n navProps: INavigationMenuViewProps & INavigationMenuProps<{}>;\r\n}\r\n\r\n/**\r\n * Represent navigation menu state interface.\r\n */\r\nexport interface INavigationState {\r\n parentMenu?: number;\r\n activeMenu?: number;\r\n categoryImage?: Msdyn365.IImageData[] | null;\r\n mobileViewLabelText?: string;\r\n isDrawerOpen: boolean;\r\n desktopCategoryId: number;\r\n isOnlyMobile: boolean;\r\n isNavOpen: boolean;\r\n}\r\n\r\n/**\r\n * NavMenuConstants enum.\r\n */\r\nexport enum NavMenuConstants {\r\n zero = 0,\r\n one = 1,\r\n two = 2,\r\n three = 3,\r\n four = 4,\r\n escapeKey = 27,\r\n rootMenu = 1\r\n}\r\n\r\n/**\r\n * GridSizes.\r\n */\r\nexport type GridSize = 'xs' | 'sm' | 'md' | 'lg' | 'xl';\r\n\r\n/**\r\n * Get category image.\r\n * @param props - Navigation menu props.\r\n * @param categoryImage - Category Image.\r\n * @param alttext - AltText String.\r\n * @returns Returns Node.\r\n */\r\nexport const getCategoryImage = (props: INavigationMenuViewRootProps, categoryImage: string, alttext: string): React.ReactNode | null => {\r\n\r\n const categoryImageUrl = generateImageUrl(`${categoryImage}`, props.navProps.context.actionContext.requestContext.apiSettings);\r\n const defaultImageSettings: Msdyn365.IImageSettings = {\r\n viewports: {\r\n xs: { q: 'w=162&h=162&m=8', w: 0, h: 0 },\r\n sm: { q: 'w=162&h=162&m=8', w: 0, h: 0 },\r\n md: { q: 'w=203&h=203&m=8', w: 0, h: 0 },\r\n lg: { q: 'w=203&h=203&m=8', w: 0, h: 0 }\r\n },\r\n lazyload: true\r\n };\r\n if (categoryImageUrl !== undefined) {\r\n const imageData: Msdyn365.IImageData = { src: categoryImageUrl };\r\n return (\r\n \r\n );\r\n }\r\n return null;\r\n};\r\n","/*--------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * See License.txt in the project root for license information.\r\n *--------------------------------------------------------------*/\r\n\r\nimport * as Msdyn365 from '@msdyn365-commerce/core';\r\nimport { IMenuItemData, MenuTypeIndexId } from '@msdyn365-commerce-modules/navigation-menu';\r\nimport { ArrayExtensions, StringExtensions } from '@msdyn365-commerce-modules/retail-actions';\r\nimport {\r\n addThrottledEvent,\r\n Button,\r\n Collapse, Drawer,\r\n getPayloadObject,\r\n getTelemetryAttributes,\r\n getTelemetryObject,\r\n IPayLoad,\r\n isMobile,\r\n ITelemetryContent,\r\n Module,\r\n Node,\r\n onTelemetryClick,\r\n VariantType\r\n} from '@msdyn365-commerce-modules/utilities';\r\nimport classnames from 'classnames';\r\nimport { computed } from 'mobx';\r\nimport * as React from 'react';\r\n\r\nimport { getCategoryImage, INavigationMenuViewRootProps, INavigationState, NavMenuConstants } from './navigation-menu-utilities';\r\n\r\n/**\r\n *\r\n * NavigationMenuRootDisabled component.\r\n * @extends {React.PureComponent}\r\n */\r\nexport class NavigationMenuRootDisabled extends React.PureComponent {\r\n private static isBackTrack: boolean = false;\r\n\r\n private readonly supportedLevel: number = NavMenuConstants.four;\r\n\r\n private currentLevel: number = NavMenuConstants.zero;\r\n\r\n private readonly menuNode: React.RefObject;\r\n\r\n private readonly menuItemRef: React.RefObject;\r\n\r\n private readonly escapeKey: number = NavMenuConstants.escapeKey;\r\n\r\n private readonly telemetryContent: ITelemetryContent;\r\n\r\n private readonly promotionalImage: Msdyn365.IImageData[] = [];\r\n\r\n private readonly payLoad: IPayLoad;\r\n\r\n private readonly attributes?: Msdyn365.IDictionary;\r\n\r\n private customResizeThrottledEventHandler?: (event: Event) => void;\r\n\r\n public constructor(props: INavigationMenuViewRootProps) {\r\n super(props);\r\n this.menuNode = React.createRef();\r\n this.menuItemRef = React.createRef();\r\n const { menuItemData } = this.props.navProps;\r\n if (ArrayExtensions.hasElements(menuItemData) && ArrayExtensions.hasElements(menuItemData[0].subMenu)) {\r\n const imagesource = menuItemData[0].subMenu[0].imageSource ? menuItemData[0].subMenu[0].imageSource : '';\r\n const linkText = menuItemData[0].subMenu[0].linkText ? menuItemData[0].subMenu[0].linkText : '';\r\n this.promotionalImage = [{ src: imagesource, altText: linkText }];\r\n\r\n // Read category and promotional image in one array\r\n if (ArrayExtensions.hasElements(menuItemData[0].subMenu[0].promotionalContent)) {\r\n menuItemData[0].subMenu[0].promotionalContent.map(item => {\r\n const imageSource = item.image.src;\r\n this.promotionalImage.push({ src: imageSource, altText: item.text, additionalProperties: { linkUrl: item.linkUrl.destinationUrl } });\r\n return null;\r\n });\r\n }\r\n }\r\n this.state = {\r\n activeMenu: 1,\r\n mobileViewLabelText: '',\r\n parentMenu: undefined,\r\n isDrawerOpen: false,\r\n desktopCategoryId: -1,\r\n isOnlyMobile: this.isOnlyMobile,\r\n categoryImage: this.promotionalImage,\r\n isNavOpen: false\r\n };\r\n this.telemetryContent = getTelemetryObject(this.props.navProps.context.request.telemetryPageName!,\r\n this.props.navProps.friendlyName,\r\n this.props.navProps.telemetry);\r\n this.payLoad = getPayloadObject('click', this.telemetryContent, '', '');\r\n this.attributes = getTelemetryAttributes(this.telemetryContent, this.payLoad);\r\n }\r\n\r\n @computed public get isOnlyMobile(): boolean {\r\n return (isMobile({ variant: VariantType.Browser, context: this.props.navProps.context.request }) === 'xs');\r\n }\r\n\r\n public componentDidMount(): void {\r\n this.customResizeThrottledEventHandler = addThrottledEvent(window, 'resize', this._customUpdateViewport as EventListener);\r\n document.addEventListener('keydown', (this._escFunction as unknown) as EventListener, false);\r\n this._customUpdateViewport();\r\n document.body.addEventListener('mousedown', this._handleClickOutside);\r\n }\r\n\r\n public componentDidUpdate(): void {\r\n if (this.menuItemRef.current?.children[0] && this.props.navProps.isMobileView) {\r\n (this.menuItemRef.current.children[0] as HTMLElement).focus();\r\n }\r\n }\r\n\r\n public componentWillUnmount(): void {\r\n window.removeEventListener('resize', this.customResizeThrottledEventHandler!, false);\r\n document.body.removeEventListener('mousedown', this._handleClickOutside, false);\r\n }\r\n\r\n public render(): JSX.Element | null {\r\n this.currentLevel = 1;\r\n const navbarKey = 'header-nav-mobile';\r\n return (\r\n \r\n {\r\n this.state.isOnlyMobile ? this._renderMobileMenu() : (<>\r\n \r\n {this._renderCollapseMenu()}\r\n )\r\n }\r\n \r\n );\r\n }\r\n\r\n /**\r\n * Function to handle nav bar toggle.\r\n */\r\n private readonly _toggleNavBar = (): void => {\r\n this.setState(previousState => ({\r\n activeMenu: 1,\r\n isNavOpen: !previousState.isNavOpen\r\n }));\r\n };\r\n\r\n private _renderCollapseMenu(): JSX.Element | null {\r\n return (\r\n \r\n {this.state.isOnlyMobile ? this._renderMobileMenu() : this._renderDesktopMenu()}\r\n \r\n );\r\n }\r\n\r\n private _renderMobileMenu(): JSX.Element {\r\n const { MenuList, MobileBackButton, MobileDescriptionContainer, MobileDescriptionLabel, Navigation } = this.props.navProps;\r\n\r\n this.currentLevel = 1;\r\n return (\r\n \r\n \r\n {this.state.isOnlyMobile && this.state.activeMenu !== undefined &&\r\n \r\n \r\n \r\n {this.state.mobileViewLabelText}\r\n \r\n }\r\n {this._renderDisplay()}\r\n \r\n \r\n );\r\n }\r\n\r\n private _renderDesktopMenu(): JSX.Element {\r\n const { MenuList, Navigation } = this.props.navProps;\r\n\r\n return (\r\n \r\n \r\n {this._renderDisplay()}\r\n
\r\n
\r\n
\r\n
\r\n );\r\n }\r\n\r\n private _renderDrawerLink(item: IMenuItemData): JSX.Element | null {\r\n if (item.linkURL && !StringExtensions.isNullOrWhitespace(item.linkURL)) {\r\n return (\r\n this._renderLinkMenuItem(item)\r\n );\r\n } else if (!item.linkURL) {\r\n return (\r\n this._renderSpanMenuItem(item)\r\n );\r\n }\r\n return null;\r\n }\r\n\r\n private _renderDisplay(): JSX.Element[] {\r\n const { ListItem } = this.props.navProps;\r\n const menuItemData: IMenuItemData[] = this.props.navProps.menuItemData;\r\n const { activeMenu } = this.state;\r\n const menuItemList: JSX.Element[] = [];\r\n\r\n if (ArrayExtensions.hasElements(menuItemData)) {\r\n menuItemData[0].id = 1;\r\n }\r\n\r\n if (this.state.isOnlyMobile && activeMenu !== undefined && ArrayExtensions.hasElements(menuItemData)) {\r\n const menuItem = this._getFromSubMenu(undefined, menuItemData);\r\n\r\n if (menuItem) {\r\n menuItemList.push(\r\n \r\n {' '}\r\n {this._createMenuItemList(menuItem)}\r\n {' '}\r\n \r\n );\r\n }\r\n } else {\r\n\r\n for (const [index, item] of menuItemData.entries()) {\r\n menuItemList.push(\r\n \r\n {this._createMenuItemList(item)}\r\n
\r\n );\r\n }\r\n\r\n }\r\n\r\n return menuItemList;\r\n }\r\n\r\n private _getFromSubMenu(parentMenuId?: number, menu?: IMenuItemData[]): IMenuItemData | null {\r\n if (!menu) {\r\n return null;\r\n }\r\n\r\n for (let index = 0; index <= menu.length - NavMenuConstants.one; index++) {\r\n const item: IMenuItemData = menu[Number(index)];\r\n\r\n if (item.id === this.state.activeMenu) {\r\n if (!NavigationMenuRootDisabled.isBackTrack) {\r\n this.setState({ parentMenu: parentMenuId });\r\n } else {\r\n this.setState({ parentMenu: parentMenuId, mobileViewLabelText: item.linkText });\r\n }\r\n return item;\r\n }\r\n const found = this._getFromSubMenu(item.id, item.subMenu);\r\n if (found) {\r\n return found;\r\n }\r\n }\r\n return null;\r\n }\r\n\r\n private _createMenuItemList(menuItemData: IMenuItemData): JSX.Element | null {\r\n if (ArrayExtensions.hasElements(menuItemData.subMenu)) {\r\n if (this.state.isOnlyMobile && this.state.activeMenu !== undefined) {\r\n return (this._renderSubMenu(menuItemData.subMenu, menuItemData.id, false));\r\n }\r\n\r\n return (\r\n <>\r\n {this._renderButtonMenuItem(menuItemData)}\r\n {this._renderSubMenu(menuItemData.subMenu, menuItemData.id)}\r\n \r\n );\r\n\r\n } else if (menuItemData.linkURL && !StringExtensions.isNullOrWhitespace(menuItemData.linkURL)) {\r\n return (this._renderLinkMenuItem(menuItemData, menuItemData.id));\r\n } else if (!menuItemData.linkURL && !(this.state.isOnlyMobile && this.state.activeMenu !== undefined)) {\r\n return (this._renderSpanMenuItem(menuItemData));\r\n }\r\n\r\n return null;\r\n }\r\n\r\n private _renderSubMenu(subMenuArray?: IMenuItemData[], activeMenu?: number, isSubMenu?: boolean): JSX.Element | null {\r\n\r\n let subMenus: IMenuItemData[] | undefined = subMenuArray;\r\n if (activeMenu === NavMenuConstants.rootMenu) {\r\n subMenus = subMenuArray!.filter(subMenuItem => (subMenuItem.id && subMenuItem.id >= MenuTypeIndexId.Retail));\r\n }\r\n\r\n const { ListItem } = this.props.navProps;\r\n const isEnableMultiSupportMenu = this.props.navProps.config.enableMultilevelMenu ?? false;\r\n const multiLevelSupportedMenu = this.props.navProps.config.menuLevelSupport ?? NavMenuConstants.three;\r\n\r\n if (activeMenu && this.state.activeMenu !== activeMenu) {\r\n this.props.navProps.context.telemetry.error('Navigation Active menu content is empty, module wont render.');\r\n return null;\r\n }\r\n\r\n if (!subMenus || !ArrayExtensions.hasElements(subMenus)) {\r\n this.props.navProps.context.telemetry.error('Navigation Submenu content is empty, module wont render.');\r\n return null;\r\n }\r\n\r\n let levelClassName: string = '';\r\n const menuOptions = subMenus.map((option: IMenuItemData, index: number) => {\r\n const hasOptions = (option.subMenu && ArrayExtensions.hasElements(option.subMenu));\r\n let menuItem: JSX.Element | null;\r\n if (hasOptions && this.state.isOnlyMobile) {\r\n menuItem = this._renderButtonMenuItem(option, activeMenu, index);\r\n } else if (this.currentLevel === NavMenuConstants.one || !hasOptions) {\r\n menuItem = this.getMenuItem(option, index);\r\n } else {\r\n menuItem = null;\r\n }\r\n let subMenu;\r\n const isHavingSubmenu = hasOptions && isEnableMultiSupportMenu && (this.currentLevel <= Math.round(multiLevelSupportedMenu) - NavMenuConstants.one);\r\n\r\n if (hasOptions && !this.state.isOnlyMobile) {\r\n\r\n if (this.currentLevel >= NavMenuConstants.two) {\r\n levelClassName = 'level-3';\r\n subMenu = this._renderSubMenuDrawer(levelClassName, option);\r\n } else if (this.currentLevel <= this.supportedLevel) {\r\n this.currentLevel++;\r\n levelClassName = `level-${this.currentLevel.toString()}`;\r\n subMenu = this._renderSubMenu(option.subMenu, undefined, true);\r\n }\r\n }\r\n\r\n if (isHavingSubmenu && this.state.isOnlyMobile) {\r\n this.currentLevel++;\r\n levelClassName = isEnableMultiSupportMenu ? `level-${this.currentLevel.toString()}` : '';\r\n subMenu = this._renderSubMenu(option.subMenu, option.id, true);\r\n }\r\n const imagesource = option.imageSource ? option.imageSource : '';\r\n return (\r\n \r\n { menuItem}\r\n { subMenu}\r\n \r\n );\r\n });\r\n return (this._renderMenu(levelClassName, menuOptions, isSubMenu));\r\n }\r\n\r\n private getMenuItem(option: IMenuItemData, index: number): JSX.Element | null {\r\n let menuItem: JSX.Element | null;\r\n if (this.currentLevel === NavMenuConstants.one) {\r\n menuItem = (option.linkURL ? this._renderLinkMenuItemLevelOne(option, index) : this._renderSpanMenuItem(option));\r\n } else {\r\n menuItem = (option.linkURL ? this._renderLinkMenuItem(option, index) : this._renderSpanMenuItem(option));\r\n }\r\n return menuItem;\r\n }\r\n\r\n private _renderSubMenuDrawer(levelClassName: string, menuItem: IMenuItemData): JSX.Element | null {\r\n return (\r\n \r\n
\r\n {menuItem.subMenu!.map((menuSubItem: IMenuItemData) => {\r\n return this._renderDrawerLink(menuSubItem);\r\n })}\r\n
\r\n \r\n );\r\n }\r\n\r\n /**\r\n * Handle desktop category click.\r\n * @param desktopCategoryId - Desktop category id used to identify the index of the category.\r\n * @returns Returns void.\r\n */\r\n private readonly _bindDesktopCategoryClick = (desktopCategoryId: number) => (): void => {\r\n if (this.state.desktopCategoryId !== desktopCategoryId) {\r\n this.setState({ desktopCategoryId, isDrawerOpen: true });\r\n } else {\r\n this.setState({ desktopCategoryId: -1, isDrawerOpen: false });\r\n }\r\n };\r\n\r\n private _renderButtonMenuItem(option: IMenuItemData, activeMenu?: number, index?: number): JSX.Element | null {\r\n return (\r\n \r\n { option.linkText}\r\n \r\n );\r\n }\r\n\r\n private _renderLinkMenuItem(option: IMenuItemData, index?: number): JSX.Element | null {\r\n const { Link } = this.props.navProps;\r\n const linkText = option.linkText ? option.linkText : '';\r\n this.payLoad.contentAction.etext = linkText;\r\n const attributes = getTelemetryAttributes(this.telemetryContent, this.payLoad);\r\n return (\r\n \r\n { option.linkText}\r\n \r\n );\r\n }\r\n\r\n private _renderLinkMenuItemLevelOne(option: IMenuItemData, index?: number, isHoverEffect: boolean = true): JSX.Element | null {\r\n const { Link } = this.props.navProps;\r\n const linkText = option.linkText ? option.linkText : '';\r\n const imagesource = option.imageSource ? option.imageSource : '';\r\n this.payLoad.contentAction.etext = linkText;\r\n const attributes = getTelemetryAttributes(this.telemetryContent, this.payLoad);\r\n return (\r\n \r\n { option.linkText}\r\n \r\n );\r\n }\r\n\r\n private _renderPromotionalLink(linkText?: string, linkUrl?: string): JSX.Element | null {\r\n const { Link } = this.props.navProps;\r\n this.payLoad.contentAction.etext = linkText;\r\n const attributes = getTelemetryAttributes(this.telemetryContent, this.payLoad);\r\n if (linkText && linkUrl) {\r\n return (\r\n \r\n { linkText}\r\n \r\n );\r\n }\r\n return null;\r\n\r\n }\r\n\r\n private _renderSpanMenuItem(option: IMenuItemData, index?: number): JSX.Element | null {\r\n const { Span } = this.props.navProps;\r\n return (\r\n \r\n { option.linkText}\r\n \r\n );\r\n }\r\n\r\n private _renderMenu(level: string, menuOptions: JSX.Element[], isSubmenu?: boolean): JSX.Element | null {\r\n const { DivContainer, MenuList, ImageDivContainer, showCategoryImage, showPromotionalContent } = this.props.navProps;\r\n const isCategoryImageDisplay =\r\n !this.state.isOnlyMobile && showCategoryImage && this.state.categoryImage !== null && this.state.categoryImage !== undefined && !isSubmenu;\r\n const isPromotionalContentDisplay =\r\n !this.state.isOnlyMobile && showPromotionalContent && ArrayExtensions.hasElements(this.state.categoryImage) && !isSubmenu;\r\n const divContainerClass = this.currentLevel > NavMenuConstants.two || isCategoryImageDisplay ? DivContainer!.className : 'ms-nav__deafult';\r\n this.currentLevel = NavMenuConstants.one;\r\n const menuLevelSupportClassName = isCategoryImageDisplay && this.props.navProps.config.menuLevelSupport &&\r\n this.props.navProps.config.menuLevelSupport > NavMenuConstants.two && 'navmenu-multi-level';\r\n\r\n const categoryImages = this.state.categoryImage?.filter(image => !StringExtensions.isNullOrWhitespace(image.src));\r\n const imagesContainerKey = categoryImages?.map(item => item.src).join('-');\r\n return (\r\n \r\n \r\n {menuOptions}\r\n \r\n
\r\n {\r\n isCategoryImageDisplay && ArrayExtensions.hasElements(categoryImages) && categoryImages.map(item => (\r\n \r\n { getCategoryImage(this.props, item.src ?? '', item.altText!.toString())}\r\n { isPromotionalContentDisplay && this._renderPromotionalLink(item.altText, item.additionalProperties?.linkUrl)}\r\n ))\r\n }\r\n
\r\n
\r\n );\r\n }\r\n\r\n /**\r\n * Handle Category image update.\r\n * @param categoryImageSource - Image source.\r\n * @param option - Menu Item data.\r\n * @returns Returns empty.\r\n */\r\n private readonly _updateCategoryImage = (categoryImageSource: string, option: IMenuItemData) => () => {\r\n const linkText = option.linkText ? option.linkText : '';\r\n const promotionalImage: Msdyn365.IImageData[] = [{ src: categoryImageSource, altText: linkText }];\r\n\r\n // Read category and promotional image in one array\r\n if (ArrayExtensions.hasElements(option.promotionalContent)) {\r\n for (const item of option.promotionalContent) {\r\n const imageSource = item.image.src;\r\n promotionalImage.push({ src: imageSource, altText: item.text, additionalProperties: { linkUrl: item.linkUrl.destinationUrl } });\r\n }\r\n }\r\n this.setState({\r\n categoryImage: ArrayExtensions.hasElements(promotionalImage) ? promotionalImage : [{ src: 'empty' }]\r\n });\r\n };\r\n\r\n /**\r\n * Handle dropdown toggle.\r\n * @param data - Menu Item data.\r\n * @param parentId - Number.\r\n * @returns Returns empty.\r\n */\r\n private readonly _handleDropdownToggle = (data: IMenuItemData, parentId?: number) => () => {\r\n if (!this.state.isOnlyMobile) {\r\n this.setState({\r\n activeMenu: data.id,\r\n parentMenu: parentId\r\n });\r\n if (this.props.navProps.showCategoryImage) {\r\n this._updateCategoryImage(data.imageSource!, data)();\r\n }\r\n } else {\r\n NavigationMenuRootDisabled.isBackTrack = false;\r\n this.setState({\r\n activeMenu: data.id,\r\n mobileViewLabelText: data.linkText!,\r\n parentMenu: parentId\r\n });\r\n }\r\n\r\n };\r\n\r\n /**\r\n * Handle back navigation for menu items for mobile view.\r\n * @returns Returns empty.\r\n */\r\n private readonly _handleGoBack = () => () => {\r\n NavigationMenuRootDisabled.isBackTrack = true;\r\n this.setState((previousState) => ({ activeMenu: previousState.parentMenu }));\r\n };\r\n\r\n /**\r\n * Function to close the nav menu on click on body.\r\n * @param event - MouseEvent.\r\n */\r\n private readonly _handleClickOutside = (event: MouseEvent) => {\r\n if (this.menuNode.current &&\r\n !this.menuNode.current.contains(event.target as Node)) {\r\n if (!this.state.isOnlyMobile) {\r\n this.setState({ activeMenu: 1, mobileViewLabelText: '', isNavOpen: false });\r\n } else {\r\n this.setState({ activeMenu: undefined, mobileViewLabelText: '', isNavOpen: false });\r\n }\r\n }\r\n };\r\n\r\n /**\r\n * Checks to assign a ref for focus.\r\n * @param index -Sub menu list index.\r\n * @param mobileViewLabelText -Mobile view label text.\r\n * @param optionLinkText -Sub menu item link text.\r\n * @returns Boolean.\r\n */\r\n private readonly _shouldAddFocusMenuRef = (index: number, mobileViewLabelText?: string, optionLinkText?: string) => {\r\n const firstIndex: number = 0;\r\n if (!NavigationMenuRootDisabled.isBackTrack && index === firstIndex) {\r\n return true;\r\n }\r\n if (!optionLinkText || !mobileViewLabelText) {\r\n return false;\r\n }\r\n return mobileViewLabelText === optionLinkText;\r\n };\r\n\r\n /**\r\n * Function to handle nav menu close.\r\n */\r\n private readonly _closeNavMenu = (): void => {\r\n if (!this.state.isOnlyMobile) {\r\n this.setState({ activeMenu: 1, mobileViewLabelText: '', isNavOpen: false });\r\n } else {\r\n this.setState({ activeMenu: undefined, mobileViewLabelText: '', isNavOpen: false });\r\n }\r\n };\r\n\r\n /**\r\n * Function to close the nav menu on esc key.\r\n * @param event - Event.\r\n */\r\n private readonly _escFunction = (event: React.KeyboardEvent) => {\r\n if (event.keyCode === this.escapeKey && !this.state.isOnlyMobile && this.state.isNavOpen) {\r\n this.setState({ activeMenu: 1, mobileViewLabelText: '', isNavOpen: false });\r\n }\r\n };\r\n\r\n /**\r\n * Custom update viewport.\r\n */\r\n private readonly _customUpdateViewport = (): void => {\r\n this.setState({ isOnlyMobile: this.isOnlyMobile });\r\n };\r\n}\r\n\r\nexport default NavigationMenuRootDisabled;\r\n","/*--------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * See License.txt in the project root for license information.\r\n *--------------------------------------------------------------*/\r\n\r\nimport * as Msdyn365 from '@msdyn365-commerce/core';\r\nimport { IMenuItemData, MenuSource, MenuTypeIndexId } from '@msdyn365-commerce-modules/navigation-menu';\r\nimport { ArrayExtensions, StringExtensions } from '@msdyn365-commerce-modules/retail-actions';\r\nimport {\r\n addThrottledEvent,\r\n Button,\r\n Collapse, Drawer,\r\n getPayloadObject,\r\n getTelemetryAttributes,\r\n getTelemetryObject,\r\n IPayLoad,\r\n isMobile,\r\n ITelemetryContent,\r\n Module,\r\n Node,\r\n onTelemetryClick,\r\n VariantType\r\n} from '@msdyn365-commerce-modules/utilities';\r\nimport classnames from 'classnames';\r\nimport { computed } from 'mobx';\r\nimport * as React from 'react';\r\n\r\nimport { getCategoryImage, INavigationMenuViewRootProps, INavigationState, NavMenuConstants } from './navigation-menu-utilities';\r\n\r\n/**\r\n *\r\n * NavigationMenuRootEnabled component.\r\n * @extends {React.PureComponent}\r\n */\r\nexport class NavigationMenuRootEnabled extends React.PureComponent {\r\n private static isBackTrack: boolean = false;\r\n\r\n private readonly supportedLevel: number = NavMenuConstants.four;\r\n\r\n private currentLevel: number = NavMenuConstants.zero;\r\n\r\n private readonly menuNode: React.RefObject;\r\n\r\n private readonly menuItemRef: React.RefObject;\r\n\r\n private readonly escapeKey: number = NavMenuConstants.escapeKey;\r\n\r\n private readonly telemetryContent: ITelemetryContent;\r\n\r\n private readonly promotionalImage: Msdyn365.IImageData[] = [];\r\n\r\n private menuItemData: IMenuItemData[] = [];\r\n\r\n private readonly payLoad: IPayLoad;\r\n\r\n private readonly attributes?: Msdyn365.IDictionary;\r\n\r\n private customResizeThrottledEventHandler?: (event: Event) => void;\r\n\r\n public constructor(props: INavigationMenuViewRootProps) {\r\n super(props);\r\n this.menuNode = React.createRef();\r\n this.menuItemRef = React.createRef();\r\n const { menuItemData } = this.props.navProps;\r\n if (ArrayExtensions.hasElements(menuItemData) && ArrayExtensions.hasElements(menuItemData[0].subMenu)) {\r\n const imagesource = menuItemData[0].subMenu[0].imageSource ? menuItemData[0].subMenu[0].imageSource : '';\r\n const linkText = menuItemData[0].subMenu[0].linkText ? menuItemData[0].subMenu[0].linkText : '';\r\n this.promotionalImage = [{ src: imagesource, altText: linkText }];\r\n\r\n // Read category and promotional image in one array\r\n if (ArrayExtensions.hasElements(menuItemData[0].subMenu[0].promotionalContent)) {\r\n menuItemData[0].subMenu[0].promotionalContent.map(item => {\r\n const imageSource = item.image.src;\r\n this.promotionalImage.push({ src: imageSource, altText: item.text, additionalProperties: { linkUrl: item.linkUrl.destinationUrl } });\r\n return null;\r\n });\r\n }\r\n }\r\n this.state = {\r\n activeMenu: NavMenuConstants.rootMenu,\r\n mobileViewLabelText: '',\r\n parentMenu: undefined,\r\n isDrawerOpen: false,\r\n desktopCategoryId: -1,\r\n isOnlyMobile: this.isOnlyMobile,\r\n categoryImage: this.promotionalImage,\r\n isNavOpen: false\r\n };\r\n\r\n this.telemetryContent = getTelemetryObject(this.props.navProps.context.request.telemetryPageName!,\r\n this.props.navProps.friendlyName,\r\n this.props.navProps.telemetry);\r\n this.payLoad = getPayloadObject('click', this.telemetryContent, '', '');\r\n this.attributes = getTelemetryAttributes(this.telemetryContent, this.payLoad);\r\n }\r\n\r\n @computed public get isOnlyMobile(): boolean {\r\n return (isMobile({ variant: VariantType.Browser, context: this.props.navProps.context.request }) === 'xs');\r\n }\r\n\r\n public componentDidMount(): void {\r\n this.customResizeThrottledEventHandler = addThrottledEvent(window, 'resize', this._customUpdateViewport as EventListener);\r\n document.addEventListener('keydown', (this._escFunction as unknown) as EventListener, false);\r\n this._customUpdateViewport();\r\n document.body.addEventListener('mousedown', this._handleClickOutside);\r\n this._addShopAllLink();\r\n }\r\n\r\n public componentDidUpdate(): void {\r\n if (this.menuItemRef.current?.children[0] && this.props.navProps.isMobileView) {\r\n (this.menuItemRef.current.children[0] as HTMLElement).focus();\r\n }\r\n }\r\n\r\n public componentWillUnmount(): void {\r\n window.removeEventListener('resize', this.customResizeThrottledEventHandler!, false);\r\n document.body.removeEventListener('mousedown', this._handleClickOutside, false);\r\n }\r\n\r\n public render(): JSX.Element | null {\r\n this.currentLevel = NavMenuConstants.one;\r\n const navbarKey = 'header-nav-mobile';\r\n return (\r\n \r\n {\r\n this.state.isOnlyMobile ? this._renderMobileMenu() : (<>\r\n {this.props.navProps.config.rootMenuNavigation}\r\n {this._renderCollapseMenu()}\r\n )\r\n }\r\n \r\n );\r\n }\r\n\r\n /**\r\n * Function to handle nav bar toggle.\r\n */\r\n private readonly _toggleNavBar = (): void => {\r\n this.setState(previousState => ({\r\n activeMenu: NavMenuConstants.rootMenu,\r\n isNavOpen: !previousState.isNavOpen\r\n }));\r\n };\r\n\r\n private _renderCollapseMenu(): JSX.Element | null {\r\n return (\r\n \r\n {this.state.isOnlyMobile ? this._renderMobileMenu() : this._renderDesktopMenu()}\r\n \r\n );\r\n }\r\n\r\n private _renderMobileMenu(): JSX.Element {\r\n const { MobileBackButton, MobileDescriptionContainer, MobileDescriptionLabel, Navigation } = this.props.navProps;\r\n\r\n this.currentLevel = NavMenuConstants.one;\r\n return (\r\n \r\n \r\n {this.state.isOnlyMobile && this.state.activeMenu !== undefined &&\r\n \r\n \r\n \r\n {this.state.mobileViewLabelText}\r\n \r\n }\r\n {this._renderDisplay()}\r\n \r\n \r\n );\r\n }\r\n\r\n private _renderDesktopMenu(): JSX.Element {\r\n const { Navigation } = this.props.navProps;\r\n return (\r\n \r\n \r\n {this._renderDisplay()}\r\n
\r\n
\r\n
\r\n
\r\n );\r\n }\r\n\r\n private _renderDrawerLink(item: IMenuItemData): JSX.Element | null {\r\n if (item.linkURL && !StringExtensions.isNullOrWhitespace(item.linkURL)) {\r\n return (\r\n this._renderLinkMenuItem(item)\r\n );\r\n } else if (!item.linkURL) {\r\n return (\r\n this._renderSpanMenuItem(item)\r\n );\r\n }\r\n return null;\r\n }\r\n\r\n private _renderDisplay(): JSX.Element[] {\r\n const { ListItem } = this.props.navProps;\r\n let menuItemData: IMenuItemData[] = [];\r\n if (this.state.isOnlyMobile) {\r\n menuItemData = this.menuItemData;\r\n } else {\r\n menuItemData = this.props.navProps.menuItemData;\r\n }\r\n const { activeMenu } = this.state;\r\n const menuItemList: JSX.Element[] = [];\r\n let cmsMenuData: IMenuItemData[] | undefined = [];\r\n let retailMenuItemData: IMenuItemData[] | undefined = [];\r\n const retailMenuData = JSON.parse(JSON.stringify(menuItemData)) as IMenuItemData[];\r\n\r\n for (const item of retailMenuData) {\r\n retailMenuItemData = item.subMenu!.filter(subMenuItem => (subMenuItem.id && subMenuItem.id >= MenuTypeIndexId.Retail));\r\n item.subMenu = retailMenuItemData;\r\n }\r\n\r\n for (const item of menuItemData) {\r\n cmsMenuData = item.subMenu!.filter(subMenuItem => (subMenuItem.id && subMenuItem.id < MenuTypeIndexId.Retail));\r\n }\r\n\r\n if (this.state.isOnlyMobile && activeMenu !== undefined && ArrayExtensions.hasElements(menuItemData)) {\r\n let menuItem: IMenuItemData | null = {};\r\n for (const menuItemDatum of menuItemData) {\r\n if (menuItemDatum.id === activeMenu) {\r\n menuItem = menuItemDatum;\r\n if (!NavigationMenuRootEnabled.isBackTrack) {\r\n this.setState({\r\n parentMenu: undefined\r\n });\r\n } else {\r\n this.setState({\r\n parentMenu: undefined,\r\n mobileViewLabelText: menuItemDatum.linkText\r\n });\r\n }\r\n break;\r\n }\r\n menuItem = this._getFromSubMenu(menuItemDatum);\r\n if (menuItem && menuItem.id === activeMenu) {\r\n break;\r\n }\r\n }\r\n\r\n if (menuItem) {\r\n menuItemList.push(\r\n \r\n {' '}\r\n {this._createMenuItemList(menuItem)}\r\n {' '}\r\n \r\n );\r\n }\r\n\r\n } else {\r\n for (const [index, item] of retailMenuData.entries()) {\r\n menuItemList.push(\r\n \r\n {this._createMenuItemList(item)}\r\n
\r\n );\r\n }\r\n\r\n for (const [index, item] of cmsMenuData.entries()) {\r\n menuItemList.push(\r\n \r\n {this._createMenuItemList(item)}\r\n \r\n );\r\n }\r\n }\r\n\r\n return menuItemList;\r\n }\r\n\r\n private _getFromSubMenu(item?: IMenuItemData): IMenuItemData | null {\r\n const subMenus = item?.subMenu;\r\n if (subMenus && ArrayExtensions.hasElements(subMenus)) {\r\n for (let index = 0; index <= subMenus.length - NavMenuConstants.one; index++) {\r\n const subMenu: IMenuItemData = subMenus[Number(index)];\r\n let parentMenuId = item?.id;\r\n\r\n if (subMenu.id === this.state.activeMenu) {\r\n if (parentMenuId === NavMenuConstants.rootMenu && subMenu.id! < MenuTypeIndexId.Retail) {\r\n parentMenuId = undefined;\r\n }\r\n\r\n if (!NavigationMenuRootEnabled.isBackTrack) {\r\n this.setState({ parentMenu: parentMenuId });\r\n } else {\r\n this.setState({ parentMenu: parentMenuId, mobileViewLabelText: subMenu.linkText });\r\n }\r\n return subMenu;\r\n }\r\n const found = this._getFromSubMenu(subMenu);\r\n if (found) {\r\n return found;\r\n }\r\n }\r\n }\r\n return null;\r\n }\r\n\r\n private _createMenuItemList(menuItemData: IMenuItemData): JSX.Element | null {\r\n if (ArrayExtensions.hasElements(menuItemData.subMenu)) {\r\n if (this.state.isOnlyMobile && this.state.activeMenu !== undefined) {\r\n return (this._renderSubMenu(menuItemData.subMenu, menuItemData.id, false));\r\n }\r\n return (\r\n <>\r\n {this._renderButtonMenuItem(menuItemData)}\r\n {this._renderSubMenu(menuItemData.subMenu, menuItemData.id)}\r\n \r\n );\r\n\r\n } else if (menuItemData.linkURL && !StringExtensions.isNullOrWhitespace(menuItemData.linkURL)) {\r\n return (this._renderLinkMenuItem(menuItemData, menuItemData.id));\r\n } else if (!menuItemData.linkURL) {\r\n return (this._renderSpanMenuItem(menuItemData));\r\n }\r\n\r\n return null;\r\n }\r\n\r\n private _renderSubMenu(subMenuArray?: IMenuItemData[], activeMenu?: number, isSubMenu?: boolean): JSX.Element | null {\r\n\r\n let subMenus: IMenuItemData[] | undefined = subMenuArray;\r\n if (activeMenu === NavMenuConstants.rootMenu) {\r\n subMenus = subMenuArray!.filter(subMenuItem => (subMenuItem.id && subMenuItem.id >= MenuTypeIndexId.Retail));\r\n }\r\n\r\n const { ListItem } = this.props.navProps;\r\n const isEnableMultiSupportMenu = this.props.navProps.config.enableMultilevelMenu ?? false;\r\n const multiLevelSupportedMenu = this.props.navProps.config.menuLevelSupport ?? NavMenuConstants.three;\r\n\r\n if (activeMenu && this.state.activeMenu !== activeMenu) {\r\n this.props.navProps.context.telemetry.error('Navigation Active menu content is empty, module wont render.');\r\n return null;\r\n }\r\n\r\n if (!subMenus || !ArrayExtensions.hasElements(subMenus)) {\r\n this.props.navProps.context.telemetry.error('Navigation Submenu content is empty, module wont render.');\r\n return null;\r\n }\r\n\r\n let levelClassName: string = '';\r\n const menuOptions = subMenus.map((option: IMenuItemData, index: number) => {\r\n const hasOptions = (option.subMenu && ArrayExtensions.hasElements(option.subMenu));\r\n let menuItem: JSX.Element | null;\r\n if (hasOptions && this.state.isOnlyMobile) {\r\n menuItem = this._renderButtonMenuItem(option, activeMenu, index);\r\n } else if (this.currentLevel === NavMenuConstants.one || !hasOptions) {\r\n menuItem = this.getMenuItem(option, index);\r\n } else {\r\n menuItem = null;\r\n }\r\n let subMenu;\r\n const isHavingSubmenu = hasOptions && isEnableMultiSupportMenu && (this.currentLevel <= Math.round(multiLevelSupportedMenu) - NavMenuConstants.one);\r\n\r\n if (hasOptions && !this.state.isOnlyMobile) {\r\n if (this.currentLevel >= NavMenuConstants.two) {\r\n levelClassName = 'level-3';\r\n subMenu = this._renderSubMenuDrawer(levelClassName, option);\r\n } else if (this.currentLevel <= this.supportedLevel - NavMenuConstants.one) {\r\n this.currentLevel++;\r\n levelClassName = `level-${this.currentLevel.toString()}`;\r\n subMenu = this._renderSubMenu(option.subMenu, undefined, true);\r\n }\r\n }\r\n if (isHavingSubmenu && this.state.isOnlyMobile) {\r\n this.currentLevel++;\r\n levelClassName = isEnableMultiSupportMenu ? `level-${this.currentLevel.toString()}` : '';\r\n subMenu = this._renderSubMenu(option.subMenu, option.id, true);\r\n }\r\n const imagesource = option.imageSource ? option.imageSource : '';\r\n return (\r\n \r\n { menuItem}\r\n { subMenu}\r\n \r\n );\r\n });\r\n return (this._renderMenu(levelClassName, menuOptions, isSubMenu));\r\n }\r\n\r\n private getMenuItem(option: IMenuItemData, index: number): JSX.Element | null {\r\n let menuItem: JSX.Element | null;\r\n if (this.currentLevel === NavMenuConstants.one) {\r\n menuItem = (option.linkURL ? this._renderLinkMenuItemLevelOne(option, index) : this._renderSpanMenuItem(option));\r\n } else {\r\n menuItem = (option.linkURL ? this._renderLinkMenuItem(option, index) : this._renderSpanMenuItem(option));\r\n }\r\n return menuItem;\r\n }\r\n\r\n private _renderSubMenuDrawer(levelClassName: string, menuItem: IMenuItemData): JSX.Element | null {\r\n return (\r\n \r\n
\r\n {menuItem.subMenu!.map((menuSubItem: IMenuItemData) => {\r\n return this._renderDrawerLink(menuSubItem);\r\n })}\r\n
\r\n \r\n );\r\n }\r\n\r\n /**\r\n * Handle desktop category click.\r\n * @param desktopCategoryId - Desktop category id used to identify the index of the category.\r\n * @returns Returns void.\r\n */\r\n private readonly _bindDesktopCategoryClick = (desktopCategoryId: number) => (): void => {\r\n if (this.state.desktopCategoryId !== desktopCategoryId) {\r\n this.setState({ desktopCategoryId, isDrawerOpen: true });\r\n } else {\r\n this.setState({ desktopCategoryId: -1, isDrawerOpen: false });\r\n }\r\n };\r\n\r\n private _renderButtonMenuItem(option: IMenuItemData, activeMenu?: number, index?: number): JSX.Element | null {\r\n return (\r\n \r\n { option.linkText}\r\n \r\n );\r\n }\r\n\r\n private _renderLinkMenuItem(option: IMenuItemData, index?: number): JSX.Element | null {\r\n const { Link } = this.props.navProps;\r\n const linkText = option.linkText ? option.linkText : '';\r\n this.payLoad.contentAction.etext = linkText;\r\n const attributes = getTelemetryAttributes(this.telemetryContent, this.payLoad);\r\n return (\r\n \r\n { option.linkText}\r\n \r\n );\r\n }\r\n\r\n private _renderLinkMenuItemLevelOne(option: IMenuItemData, index?: number, isHoverEffect: boolean = true): JSX.Element | null {\r\n const { Link } = this.props.navProps;\r\n const linkText = option.linkText ? option.linkText : '';\r\n const imagesource = option.imageSource ? option.imageSource : '';\r\n this.payLoad.contentAction.etext = linkText;\r\n const attributes = getTelemetryAttributes(this.telemetryContent, this.payLoad);\r\n return (\r\n \r\n { option.linkText}\r\n \r\n );\r\n }\r\n\r\n private _renderPromotionalLink(linkText?: string, linkUrl?: string): JSX.Element | null {\r\n const { Link } = this.props.navProps;\r\n this.payLoad.contentAction.etext = linkText;\r\n const attributes = getTelemetryAttributes(this.telemetryContent, this.payLoad);\r\n if (linkText && linkUrl) {\r\n return (\r\n \r\n { linkText}\r\n \r\n );\r\n }\r\n return null;\r\n\r\n }\r\n\r\n private _renderSpanMenuItem(option: IMenuItemData, index?: number): JSX.Element | null {\r\n const { Span } = this.props.navProps;\r\n return (\r\n \r\n { option.linkText}\r\n \r\n );\r\n }\r\n\r\n private _renderMenu(level: string, menuOptions: JSX.Element[], isSubmenu?: boolean): JSX.Element | null {\r\n const { DivContainer, ImageDivContainer, showCategoryImage, showPromotionalContent } = this.props.navProps;\r\n const isCategoryImageDisplay =\r\n !this.state.isOnlyMobile && showCategoryImage && this.state.categoryImage !== null && this.state.categoryImage !== undefined && !isSubmenu;\r\n const isPromotionalContentDisplay =\r\n !this.state.isOnlyMobile && showPromotionalContent && ArrayExtensions.hasElements(this.state.categoryImage) && !isSubmenu;\r\n const divContainerClass = this.currentLevel > NavMenuConstants.two || isCategoryImageDisplay ? DivContainer!.className : 'ms-nav__deafult';\r\n this.currentLevel = NavMenuConstants.one;\r\n const menuLevelSupportClassName =\r\n isCategoryImageDisplay && this.props.navProps.config.menuLevelSupport &&\r\n this.props.navProps.config.menuLevelSupport > NavMenuConstants.two && 'navmenu-multi-level';\r\n\r\n const categoryImages = this.state.categoryImage?.filter(image => !StringExtensions.isNullOrWhitespace(image.src));\r\n const imagesContainerKey = categoryImages?.map(item => item.src).join('-');\r\n return (\r\n \r\n \r\n {menuOptions}\r\n \r\n
\r\n {\r\n isCategoryImageDisplay && ArrayExtensions.hasElements(categoryImages) && categoryImages.map(item => (\r\n \r\n { getCategoryImage(this.props, item.src ?? '', item.altText!.toString())}\r\n { isPromotionalContentDisplay && this._renderPromotionalLink(item.altText, item.additionalProperties?.linkUrl)}\r\n ))\r\n }\r\n
\r\n \r\n );\r\n }\r\n\r\n /**\r\n * Handle Category image update.\r\n * @param categoryImageSource - Image source.\r\n * @param option - Menu Item data.\r\n * @returns Returns empty.\r\n */\r\n private readonly _updateCategoryImage = (categoryImageSource: string, option: IMenuItemData) => () => {\r\n const linkText = option.linkText ? option.linkText : '';\r\n const promotionalImage: Msdyn365.IImageData[] = [{ src: categoryImageSource, altText: linkText }];\r\n\r\n // Read category and promotional image in one array\r\n if (ArrayExtensions.hasElements(option.promotionalContent)) {\r\n for (const item of option.promotionalContent) {\r\n const imageSource = item.image.src;\r\n promotionalImage.push({ src: imageSource, altText: item.text, additionalProperties: { linkUrl: item.linkUrl.destinationUrl } });\r\n }\r\n }\r\n this.setState({\r\n categoryImage: ArrayExtensions.hasElements(promotionalImage) ? promotionalImage : [{ src: 'empty' }]\r\n });\r\n };\r\n\r\n /**\r\n * Handle dropdown toggle.\r\n * @param data - Menu Item data.\r\n * @param parentId - Number.\r\n * @returns Returns empty.\r\n */\r\n private readonly _handleDropdownToggle = (data: IMenuItemData, parentId?: number) => () => {\r\n if (!this.state.isOnlyMobile) {\r\n this.setState({\r\n activeMenu: data.id,\r\n parentMenu: parentId\r\n });\r\n if (this.props.navProps.showCategoryImage) {\r\n this._updateCategoryImage(data.imageSource!, data)();\r\n }\r\n } else {\r\n NavigationMenuRootEnabled.isBackTrack = false;\r\n this.setState({\r\n activeMenu: data.id,\r\n mobileViewLabelText: data.linkText!,\r\n parentMenu: parentId\r\n });\r\n }\r\n\r\n };\r\n\r\n /**\r\n * Handle back navigation for menu items for mobile view.\r\n * @returns Returns empty.\r\n */\r\n private readonly _handleGoBack = () => () => {\r\n NavigationMenuRootEnabled.isBackTrack = true;\r\n this.setState((previousState) => ({ activeMenu: previousState.parentMenu }));\r\n };\r\n\r\n /**\r\n * Function to close the nav menu on click on body.\r\n * @param event - MouseEvent.\r\n */\r\n private readonly _handleClickOutside = (event: MouseEvent) => {\r\n if (this.menuNode.current &&\r\n !this.menuNode.current.contains(event.target as Node)) {\r\n if (!this.state.isOnlyMobile) {\r\n this.setState({ activeMenu: NavMenuConstants.rootMenu, mobileViewLabelText: '', isNavOpen: false });\r\n } else {\r\n this.setState({ activeMenu: undefined, mobileViewLabelText: '', isNavOpen: false });\r\n }\r\n }\r\n };\r\n\r\n /**\r\n * Add shop all link for Mobile submenu.\r\n */\r\n private readonly _addShopAllLink = (): void => {\r\n const { menuItemData } = this.props.navProps;\r\n this.menuItemData = menuItemData;\r\n if (ArrayExtensions.hasElements(menuItemData) && ArrayExtensions.hasElements(menuItemData[0].subMenu)) {\r\n this.menuItemData[0].subMenu?.map(item => {\r\n const shopAllObject = {};\r\n Object.assign(shopAllObject, { imageSource: item.imageSource });\r\n Object.assign(shopAllObject, { linkText: this.props.navProps.resources.allCategoryMenuText });\r\n Object.assign(shopAllObject, { linkURL: item.linkURL });\r\n if (ArrayExtensions.hasElements(item.subMenu) && item.menuSource === MenuSource.Retail) {\r\n item.subMenu.unshift(shopAllObject);\r\n }\r\n return item;\r\n });\r\n }\r\n };\r\n\r\n /**\r\n * Checks to assign a ref for focus.\r\n * @param index -Sub menu list index.\r\n * @param mobileViewLabelText -Mobile view label text.\r\n * @param optionLinkText -Sub menu item link text.\r\n * @returns Boolean.\r\n */\r\n private readonly _shouldAddFocusMenuRef = (index: number, mobileViewLabelText?: string, optionLinkText?: string) => {\r\n const firstIndex: number = 0;\r\n if (!NavigationMenuRootEnabled.isBackTrack && index === firstIndex) {\r\n return true;\r\n }\r\n if (!optionLinkText || !mobileViewLabelText) {\r\n return false;\r\n }\r\n return mobileViewLabelText === optionLinkText;\r\n };\r\n\r\n /**\r\n * Function to handle nav menu close.\r\n */\r\n private readonly _closeNavMenu = (): void => {\r\n if (!this.state.isOnlyMobile) {\r\n this.setState({ activeMenu: NavMenuConstants.rootMenu, mobileViewLabelText: '', isNavOpen: false });\r\n } else {\r\n this.setState({ activeMenu: undefined, mobileViewLabelText: '', isNavOpen: false });\r\n }\r\n };\r\n\r\n /**\r\n * Function to close the nav menu on esc key.\r\n * @param event - Event.\r\n */\r\n private readonly _escFunction = (event: React.KeyboardEvent) => {\r\n if (event.keyCode === this.escapeKey && !this.state.isOnlyMobile && this.state.isNavOpen) {\r\n this.setState({ activeMenu: NavMenuConstants.rootMenu, mobileViewLabelText: '', isNavOpen: false });\r\n }\r\n };\r\n\r\n /**\r\n * Custom update viewport.\r\n */\r\n private readonly _customUpdateViewport = (): void => {\r\n this.setState({ isOnlyMobile: this.isOnlyMobile });\r\n };\r\n\r\n}\r\n\r\nexport default NavigationMenuRootEnabled;\r\n","/*--------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * See License.txt in the project root for license information.\r\n *--------------------------------------------------------------*/\r\n\r\nimport { INavigationMenuViewProps } from '@msdyn365-commerce-modules/navigation-menu';\r\nimport * as React from 'react';\r\n\r\nimport { INavigationMenuProps } from '../definition-extensions/navigation-menu.ext.props.autogenerated';\r\nimport NavigationMenuRootDisabled from './components/navigation-menu-root-disabled';\r\nimport NavigationMenuRootEnabled from './components/navigation-menu-root-enabled';\r\n\r\n/**\r\n * Render the Navigation menu.\r\n * @param props - The navigation menu view props.\r\n * @returns Return HTML having INavigationMenuViewProps props with navigation menu.\r\n */\r\nconst navigationMenuView = (props: INavigationMenuViewProps & INavigationMenuProps<{}>): JSX.Element => {\r\n\r\n if (props.config.enabletopMenu) {\r\n return ;\r\n }\r\n\r\n return ;\r\n\r\n};\r\n\r\nexport default navigationMenuView;\r\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { IActiveTabState } from './data-actions/tab-state';\nimport { createTabStateInput } from './data-actions/tab-state-data-action';\nimport tab from './modules/tab/tab';\nimport tabView from './modules/tab/tab.view';\nimport { getContentID, TabItemType } from './modules/tab-item/tab-item';\n\nexport * from './modules/tab/tab';\nexport * from './modules/tab/tab.view';\nexport { createTabStateInput, getContentID, IActiveTabState, tab, TabItemType, tabView };\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport * as Msdyn365 from '@msdyn365-commerce/core';\nimport { INavigationMenuViewProps } from '@msdyn365-commerce-modules/navigation-menu';\nimport { generateImageUrl } from '@msdyn365-commerce-modules/retail-actions';\nimport * as React from 'react';\n\nimport { INavigationMenuProps } from '../../definition-extensions/navigation-menu.ext.props.autogenerated';\n\n/**\n * INavigationMenuViewRootProps.\n */\nexport interface INavigationMenuViewRootProps {\n navProps: INavigationMenuViewProps & INavigationMenuProps<{}>;\n}\n\n/**\n * Represent navigation menu state interface.\n */\nexport interface INavigationState {\n parentMenu?: number;\n activeMenu?: number;\n categoryImage?: Msdyn365.IImageData[] | null;\n mobileViewLabelText?: string;\n drawerKeyValue: Msdyn365.IDictionary;\n isOnlyMobile: boolean;\n isNavOpen: boolean;\n}\n\n/**\n * NavMenuConstants enum.\n */\nexport enum NavMenuConstants {\n zero = 0,\n one = 1,\n two = 2,\n three = 3,\n four = 4,\n escapeKey = 27,\n rootMenu = 1\n}\n\n/**\n * GridSizes.\n */\nexport type GridSize = 'xs' | 'sm' | 'md' | 'lg' | 'xl';\n\n/**\n * Get category image.\n * @param props - Navigation menu props.\n * @param categoryImage - Category Image.\n * @param alttext - AltText String.\n * @returns Returns Node.\n */\nexport const getCategoryImage = (props: INavigationMenuViewRootProps, categoryImage: string, alttext: string): React.ReactNode | null => {\n const categoryImageUrl = generateImageUrl(`${categoryImage}`, props.navProps.context.actionContext.requestContext.apiSettings);\n const defaultImageSettings: Msdyn365.IImageSettings = {\n viewports: {\n xs: { q: 'w=162&h=162&m=8', w: 0, h: 0 },\n sm: { q: 'w=162&h=162&m=8', w: 0, h: 0 },\n md: { q: 'w=203&h=203&m=8', w: 0, h: 0 },\n lg: { q: 'w=203&h=203&m=8', w: 0, h: 0 }\n },\n lazyload: true\n };\n if (categoryImageUrl !== undefined) {\n const imageData: Msdyn365.IImageData = { src: categoryImageUrl };\n return (\n \n );\n }\n return null;\n};\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport * as Msdyn365 from '@msdyn365-commerce/core';\nimport { IMenuItemData, MenuTypeIndexId } from '@msdyn365-commerce-modules/navigation-menu';\nimport { ArrayExtensions, StringExtensions } from '@msdyn365-commerce-modules/retail-actions';\nimport {\n addThrottledEvent,\n Button,\n Collapse,\n Drawer,\n getPayloadObject,\n getTelemetryAttributes,\n getTelemetryObject,\n ICollapseProps,\n IPayLoad,\n isMobile,\n ITelemetryContent,\n Module,\n Node,\n onTelemetryClick,\n VariantType\n} from '@msdyn365-commerce-modules/utilities';\nimport classnames from 'classnames';\nimport { computed } from 'mobx';\nimport * as React from 'react';\n\nimport { getCategoryImage, INavigationMenuViewRootProps, INavigationState, NavMenuConstants } from './navigation-menu-utilities';\n\n/**\n *\n * NavigationMenuRootDisabled component.\n * @extends {React.PureComponent}\n */\nexport class NavigationMenuRootDisabled extends React.PureComponent {\n private static isBackTrack: boolean = false;\n\n private readonly supportedLevel: number = NavMenuConstants.four;\n\n private currentLevel: number = NavMenuConstants.zero;\n\n private readonly menuNode: React.RefObject;\n\n private readonly menuItemRef: React.RefObject;\n\n private readonly escapeKey: number = NavMenuConstants.escapeKey;\n\n private readonly telemetryContent: ITelemetryContent;\n\n private readonly promotionalImage: Msdyn365.IImageData[] = [];\n\n private readonly payLoad: IPayLoad;\n\n private readonly attributes?: Msdyn365.IDictionary;\n\n private customResizeThrottledEventHandler?: (event: Event) => void;\n\n public constructor(props: INavigationMenuViewRootProps) {\n super(props);\n this.menuNode = React.createRef();\n this.menuItemRef = React.createRef();\n const { menuItemData } = this.props.navProps;\n if (ArrayExtensions.hasElements(menuItemData) && ArrayExtensions.hasElements(menuItemData[0].subMenu)) {\n const imagesource = menuItemData[0].subMenu[0].imageSource ? menuItemData[0].subMenu[0].imageSource : '';\n const linkText = menuItemData[0].subMenu[0].linkText ? menuItemData[0].subMenu[0].linkText : '';\n this.promotionalImage = [{ src: imagesource, altText: linkText }];\n\n // Read category and promotional image in one array\n if (ArrayExtensions.hasElements(menuItemData[0].subMenu[0].promotionalContent)) {\n menuItemData[0].subMenu[0].promotionalContent.map(item => {\n const imageSource = item.image.src;\n this.promotionalImage.push({\n src: imageSource,\n altText: item.text,\n additionalProperties: { linkUrl: item.linkUrl.destinationUrl }\n });\n return null;\n });\n }\n }\n\n this.state = {\n activeMenu: 1,\n mobileViewLabelText: '',\n parentMenu: undefined,\n drawerKeyValue: {},\n isOnlyMobile: this.isOnlyMobile,\n categoryImage: this.promotionalImage,\n isNavOpen: false\n };\n this.telemetryContent = getTelemetryObject(\n this.props.navProps.context.request.telemetryPageName!,\n this.props.navProps.friendlyName,\n this.props.navProps.telemetry\n );\n this.payLoad = getPayloadObject('click', this.telemetryContent, '', '');\n this.attributes = getTelemetryAttributes(this.telemetryContent, this.payLoad);\n }\n\n @computed public get isOnlyMobile(): boolean {\n return isMobile({ variant: VariantType.Browser, context: this.props.navProps.context.request }) === 'xs';\n }\n\n public componentDidMount(): void {\n this.customResizeThrottledEventHandler = addThrottledEvent(window, 'resize', this._customUpdateViewport as EventListener);\n document.addEventListener('keydown', (this._escFunction as unknown) as EventListener, false);\n this._customUpdateViewport();\n document.body.addEventListener('mousedown', this._handleClickOutside);\n }\n\n public componentDidUpdate(): void {\n if (this.menuItemRef.current?.children[0] && this.props.navProps.isMobileView) {\n (this.menuItemRef.current.children[0] as HTMLElement).focus();\n }\n }\n\n public componentWillUnmount(): void {\n window.removeEventListener('resize', this.customResizeThrottledEventHandler!, false);\n document.body.removeEventListener('mousedown', this._handleClickOutside, false);\n }\n\n public render(): JSX.Element | null {\n this.currentLevel = 1;\n const navbarKey = 'header-nav-mobile';\n return (\n \n {this.state.isOnlyMobile ? (\n this._renderMobileMenu()\n ) : (\n <>\n \n {this._renderCollapseMenu()}\n \n )}\n \n );\n }\n\n /**\n * Function to handle nav bar toggle.\n */\n private readonly _toggleNavBar = (): void => {\n this.setState(previousState => ({\n activeMenu: 1,\n isNavOpen: !previousState.isNavOpen\n }));\n };\n\n private _renderCollapseMenu(): JSX.Element | null {\n return (\n \n {this.state.isOnlyMobile ? this._renderMobileMenu() : this._renderDesktopMenu()}\n \n );\n }\n\n private _renderMobileMenu(): JSX.Element {\n const { MenuList, MobileBackButton, MobileDescriptionContainer, MobileDescriptionLabel, Navigation } = this.props.navProps;\n\n this.currentLevel = 1;\n return (\n \n \n {this.state.isOnlyMobile && this.state.activeMenu !== undefined && (\n \n \n {this.state.mobileViewLabelText}\n \n )}\n {this._renderDisplay()}\n \n \n );\n }\n\n private _renderDesktopMenu(): JSX.Element {\n const { MenuList, Navigation } = this.props.navProps;\n\n return (\n \n \n {this._renderDisplay()}\n
\n
\n
\n
\n );\n }\n\n private _renderDrawerLink(item: IMenuItemData): JSX.Element | null {\n if (item.linkURL && !StringExtensions.isNullOrWhitespace(item.linkURL)) {\n return this._renderLinkMenuItem(item);\n } else if (!item.linkURL) {\n return this._renderSpanMenuItem(item);\n }\n return null;\n }\n\n private _renderDisplay(): JSX.Element[] {\n const { ListItem } = this.props.navProps;\n const menuItemData: IMenuItemData[] = this.props.navProps.menuItemData;\n const { activeMenu } = this.state;\n const menuItemList: JSX.Element[] = [];\n\n if (ArrayExtensions.hasElements(menuItemData)) {\n menuItemData[0].id = 1;\n }\n\n if (this.state.isOnlyMobile && activeMenu !== undefined && ArrayExtensions.hasElements(menuItemData)) {\n const menuItem = this._getFromSubMenu(undefined, menuItemData);\n\n if (menuItem) {\n menuItemList.push(\n \n {` `}\n {this._createMenuItemList(menuItem)} {` `}\n \n );\n }\n } else {\n for (const [index, item] of menuItemData.entries()) {\n menuItemList.push(\n \n {this._createMenuItemList(item)}\n
\n );\n }\n }\n\n return menuItemList;\n }\n\n private _getFromSubMenu(parentMenuId?: number, menu?: IMenuItemData[]): IMenuItemData | null {\n if (!menu) {\n return null;\n }\n\n for (let index = 0; index <= menu.length - NavMenuConstants.one; index++) {\n const item: IMenuItemData = menu[Number(index)];\n\n if (item.id === this.state.activeMenu) {\n if (!NavigationMenuRootDisabled.isBackTrack) {\n this.setState({ parentMenu: parentMenuId });\n } else {\n this.setState({ parentMenu: parentMenuId, mobileViewLabelText: item.linkText });\n }\n return item;\n }\n const found = this._getFromSubMenu(item.id, item.subMenu);\n if (found) {\n return found;\n }\n }\n return null;\n }\n\n private _createMenuItemList(menuItemData: IMenuItemData): JSX.Element | null {\n if (ArrayExtensions.hasElements(menuItemData.subMenu)) {\n if (this.state.isOnlyMobile && this.state.activeMenu !== undefined) {\n return this._renderSubMenu(menuItemData.subMenu, menuItemData.id, false);\n }\n\n return (\n <>\n {this._renderButtonMenuItem(menuItemData)}\n {this._renderSubMenu(menuItemData.subMenu, menuItemData.id)}\n \n );\n } else if (menuItemData.linkURL && !StringExtensions.isNullOrWhitespace(menuItemData.linkURL)) {\n return this._renderLinkMenuItem(menuItemData, menuItemData.id);\n } else if (!menuItemData.linkURL && !(this.state.isOnlyMobile && this.state.activeMenu !== undefined)) {\n return this._renderSpanMenuItem(menuItemData);\n }\n\n return null;\n }\n\n private _renderSubMenu(subMenuArray?: IMenuItemData[], activeMenu?: number, isSubMenu?: boolean): JSX.Element | null {\n let subMenus: IMenuItemData[] | undefined = subMenuArray;\n if (activeMenu === NavMenuConstants.rootMenu) {\n subMenus = subMenuArray!.filter(subMenuItem => subMenuItem.id && subMenuItem.id >= MenuTypeIndexId.Retail);\n }\n\n const { ListItem } = this.props.navProps;\n const isEnableMultiSupportMenu = this.props.navProps.config.enableMultilevelMenu ?? false;\n const multiLevelSupportedMenu = this.props.navProps.config.menuLevelSupport ?? NavMenuConstants.three;\n\n if (activeMenu && this.state.activeMenu !== activeMenu) {\n this.props.navProps.context.telemetry.error('Navigation Active menu content is empty, module wont render.');\n return null;\n }\n\n if (!subMenus || !ArrayExtensions.hasElements(subMenus)) {\n this.props.navProps.context.telemetry.error('Navigation Submenu content is empty, module wont render.');\n return null;\n }\n\n let levelClassName: string = '';\n const menuOptions = subMenus.map((option: IMenuItemData, index: number) => {\n const hasOptions = option.subMenu && ArrayExtensions.hasElements(option.subMenu);\n let menuItem: JSX.Element | null;\n if (hasOptions && this.state.isOnlyMobile) {\n menuItem = this._renderButtonMenuItem(option, activeMenu, index);\n } else if (this.currentLevel === NavMenuConstants.one || !hasOptions) {\n menuItem = this.getMenuItem(option, index);\n } else {\n menuItem = null;\n }\n let subMenu;\n const isHavingSubmenu =\n hasOptions && isEnableMultiSupportMenu && this.currentLevel <= Math.round(multiLevelSupportedMenu) - NavMenuConstants.one;\n\n if (hasOptions && !this.state.isOnlyMobile) {\n if (this.currentLevel >= NavMenuConstants.two) {\n subMenu = this._renderSubMenuDrawer(option);\n } else if (this.currentLevel <= this.supportedLevel) {\n this.currentLevel++;\n levelClassName = `level-${this.currentLevel.toString()}`;\n subMenu = this._renderSubMenu(option.subMenu, undefined, true);\n }\n }\n\n if (isHavingSubmenu && this.state.isOnlyMobile) {\n this.currentLevel++;\n levelClassName = isEnableMultiSupportMenu ? `level-${this.currentLevel.toString()}` : '';\n subMenu = this._renderSubMenu(option.subMenu, option.id, true);\n }\n const imagesource = option.imageSource ? option.imageSource : '';\n return (\n \n {menuItem}\n {subMenu}\n \n );\n });\n return this._renderMenu(levelClassName, menuOptions, isSubMenu);\n }\n\n private getMenuItem(option: IMenuItemData, index: number): JSX.Element | null {\n let menuItem: JSX.Element | null;\n if (this.currentLevel === NavMenuConstants.one) {\n menuItem = option.linkURL ? this._renderLinkMenuItemLevelOne(option, index) : this._renderSpanMenuItem(option);\n } else {\n menuItem = option.linkURL ? this._renderLinkMenuItem(option, index) : this._renderSpanMenuItem(option);\n }\n return menuItem;\n }\n\n private _renderSubMenuDrawer(menuItem: IMenuItemData): JSX.Element | null {\n const levelClassName = `level-${this.currentLevel.toString()}`;\n const toggleButtonText = menuItem.linkText;\n const keyValue = this.state.drawerKeyValue;\n const buttonText = toggleButtonText !== undefined ? toggleButtonText : '';\n const keys = keyValue;\n const multiLevelSupportedMenu = this.props.navProps.config.menuLevelSupport ?? NavMenuConstants.three;\n\n let isDrawerOpen = false;\n if (keys[menuItem.id!]) {\n isDrawerOpen = true;\n }\n const colProps: ICollapseProps = { timeout: 0, isOpen: isDrawerOpen };\n\n return (\n \n
\n {menuItem.subMenu!.map((menuSubItem: IMenuItemData) => {\n if (ArrayExtensions.hasElements(menuSubItem.subMenu)) {\n this.currentLevel++;\n if (this.currentLevel < multiLevelSupportedMenu) {\n return this._renderSubMenuDrawer(menuSubItem);\n }\n }\n return this._renderDrawerLink(menuSubItem);\n })}\n
\n \n );\n }\n\n /**\n * Method to handle escape key event.\n * @param menuId -Number.\n * @param isDrawerOpen -Boolean.\n * @returns Void.\n */\n private readonly _bindDesktopCategoryClick = (menuId: number | undefined, isDrawerOpen: boolean) => (): void => {\n const { drawerKeyValue } = this.state;\n const newPair = { [menuId!]: !isDrawerOpen };\n this.setState({ drawerKeyValue: { ...drawerKeyValue, ...newPair } });\n };\n\n private _renderButtonMenuItem(option: IMenuItemData, activeMenu?: number, index?: number): JSX.Element | null {\n return (\n \n {option.linkText}\n \n );\n }\n\n private _renderLinkMenuItem(option: IMenuItemData, index?: number): JSX.Element | null {\n const { Link } = this.props.navProps;\n const linkText = option.linkText ? option.linkText : '';\n this.payLoad.contentAction.etext = linkText;\n const attributes = getTelemetryAttributes(this.telemetryContent, this.payLoad);\n return (\n \n {option.linkText}\n \n );\n }\n\n private _renderLinkMenuItemLevelOne(option: IMenuItemData, index?: number, isHoverEffect: boolean = true): JSX.Element | null {\n const { Link } = this.props.navProps;\n const linkText = option.linkText ? option.linkText : '';\n const imagesource = option.imageSource ? option.imageSource : '';\n this.payLoad.contentAction.etext = linkText;\n const attributes = getTelemetryAttributes(this.telemetryContent, this.payLoad);\n return (\n \n {option.linkText}\n \n );\n }\n\n private _renderPromotionalLink(linkText?: string, linkUrl?: string): JSX.Element | null {\n const { Link } = this.props.navProps;\n this.payLoad.contentAction.etext = linkText;\n const attributes = getTelemetryAttributes(this.telemetryContent, this.payLoad);\n if (linkText && linkUrl) {\n return (\n \n {linkText}\n \n );\n }\n return null;\n }\n\n private _renderSpanMenuItem(option: IMenuItemData, index?: number): JSX.Element | null {\n const { Span } = this.props.navProps;\n return (\n \n {option.linkText}\n \n );\n }\n\n private _renderMenu(level: string, menuOptions: JSX.Element[], isSubmenu?: boolean): JSX.Element | null {\n const { DivContainer, MenuList, ImageDivContainer, showCategoryImage, showPromotionalContent } = this.props.navProps;\n const isCategoryImageDisplay =\n !this.state.isOnlyMobile &&\n showCategoryImage &&\n this.state.categoryImage !== null &&\n this.state.categoryImage !== undefined &&\n !isSubmenu;\n const isPromotionalContentDisplay =\n !this.state.isOnlyMobile && showPromotionalContent && ArrayExtensions.hasElements(this.state.categoryImage) && !isSubmenu;\n const divContainerClass =\n this.currentLevel > NavMenuConstants.two || isCategoryImageDisplay ? DivContainer!.className : 'ms-nav__deafult';\n this.currentLevel = NavMenuConstants.one;\n const menuLevelSupportClassName =\n isCategoryImageDisplay &&\n this.props.navProps.config.menuLevelSupport &&\n this.props.navProps.config.menuLevelSupport > NavMenuConstants.two &&\n 'navmenu-multi-level';\n\n const categoryImages = this.state.categoryImage?.filter(image => !StringExtensions.isNullOrWhitespace(image.src));\n const imagesContainerKey = categoryImages?.map(item => item.src).join('-');\n return (\n \n \n {menuOptions}\n \n
\n {isCategoryImageDisplay &&\n ArrayExtensions.hasElements(categoryImages) &&\n categoryImages.map(item => (\n \n {getCategoryImage(this.props, item.src ?? '', item.altText!.toString())}\n {isPromotionalContentDisplay &&\n this._renderPromotionalLink(item.altText, item.additionalProperties?.linkUrl)}\n \n ))}\n
\n \n );\n }\n\n /**\n * Handle Category image update.\n * @param categoryImageSource - Image source.\n * @param option - Menu Item data.\n * @returns Returns empty.\n */\n private readonly _updateCategoryImage = (categoryImageSource: string, option: IMenuItemData) => () => {\n const linkText = option.linkText ? option.linkText : '';\n const promotionalImage: Msdyn365.IImageData[] = [{ src: categoryImageSource, altText: linkText }];\n\n // Read category and promotional image in one array\n if (ArrayExtensions.hasElements(option.promotionalContent)) {\n for (const item of option.promotionalContent) {\n const imageSource = item.image.src;\n promotionalImage.push({\n src: imageSource,\n altText: item.text,\n additionalProperties: { linkUrl: item.linkUrl.destinationUrl }\n });\n }\n }\n this.setState({\n categoryImage: ArrayExtensions.hasElements(promotionalImage) ? promotionalImage : [{ src: 'empty' }]\n });\n };\n\n /**\n * Handle dropdown toggle.\n * @param data - Menu Item data.\n * @param parentId - Number.\n * @returns Returns empty.\n */\n private readonly _handleDropdownToggle = (data: IMenuItemData, parentId?: number) => () => {\n if (!this.state.isOnlyMobile) {\n this.setState({\n activeMenu: data.id,\n parentMenu: parentId\n });\n if (this.props.navProps.showCategoryImage) {\n this._updateCategoryImage(data.imageSource!, data)();\n }\n } else {\n NavigationMenuRootDisabled.isBackTrack = false;\n this.setState({\n activeMenu: data.id,\n mobileViewLabelText: data.linkText!,\n parentMenu: parentId\n });\n }\n };\n\n /**\n * Handle back navigation for menu items for mobile view.\n * @returns Returns empty.\n */\n private readonly _handleGoBack = () => () => {\n NavigationMenuRootDisabled.isBackTrack = true;\n this.setState(previousState => ({ activeMenu: previousState.parentMenu }));\n };\n\n /**\n * Function to close the nav menu on click on body.\n * @param event - MouseEvent.\n */\n private readonly _handleClickOutside = (event: MouseEvent) => {\n if (this.menuNode.current && !this.menuNode.current.contains(event.target as Node)) {\n if (!this.state.isOnlyMobile) {\n this.setState({ activeMenu: 1, mobileViewLabelText: '', isNavOpen: false });\n } else {\n this.setState({ activeMenu: undefined, mobileViewLabelText: '', isNavOpen: false });\n }\n }\n };\n\n /**\n * Checks to assign a ref for focus.\n * @param index -Sub menu list index.\n * @param mobileViewLabelText -Mobile view label text.\n * @param optionLinkText -Sub menu item link text.\n * @returns Boolean.\n */\n private readonly _shouldAddFocusMenuRef = (index: number, mobileViewLabelText?: string, optionLinkText?: string) => {\n const firstIndex: number = 0;\n if (!NavigationMenuRootDisabled.isBackTrack && index === firstIndex) {\n return true;\n }\n if (!optionLinkText || !mobileViewLabelText) {\n return false;\n }\n return mobileViewLabelText === optionLinkText;\n };\n\n /**\n * Function to handle nav menu close.\n */\n private readonly _closeNavMenu = (): void => {\n if (!this.state.isOnlyMobile) {\n this.setState({ activeMenu: 1, mobileViewLabelText: '', isNavOpen: false });\n } else {\n this.setState({ activeMenu: undefined, mobileViewLabelText: '', isNavOpen: false });\n }\n (this.menuNode.current?.children[0] as HTMLElement).focus();\n };\n\n /**\n * Function to close the nav menu on esc key.\n * @param event - Event.\n */\n private readonly _escFunction = (event: React.KeyboardEvent) => {\n if (event.keyCode === this.escapeKey && !this.state.isOnlyMobile && this.state.isNavOpen) {\n this.setState({ activeMenu: 1, mobileViewLabelText: '', isNavOpen: false });\n (this.menuNode.current?.children[0] as HTMLElement).focus();\n }\n };\n\n /**\n * Custom update viewport.\n */\n private readonly _customUpdateViewport = (): void => {\n this.setState({ isOnlyMobile: this.isOnlyMobile });\n };\n}\n\nexport default NavigationMenuRootDisabled;\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport * as Msdyn365 from '@msdyn365-commerce/core';\nimport { IMenuItemData, MenuSource, MenuTypeIndexId } from '@msdyn365-commerce-modules/navigation-menu';\nimport { ArrayExtensions, StringExtensions } from '@msdyn365-commerce-modules/retail-actions';\nimport {\n addThrottledEvent,\n Button,\n Collapse,\n Drawer,\n getPayloadObject,\n getTelemetryAttributes,\n getTelemetryObject,\n ICollapseProps,\n IPayLoad,\n isMobile,\n ITelemetryContent,\n Module,\n Node,\n onTelemetryClick,\n VariantType\n} from '@msdyn365-commerce-modules/utilities';\nimport classnames from 'classnames';\nimport { computed } from 'mobx';\nimport * as React from 'react';\n\nimport { getCategoryImage, INavigationMenuViewRootProps, INavigationState, NavMenuConstants } from './navigation-menu-utilities';\n\n/**\n *\n * NavigationMenuRootEnabled component.\n * @extends {React.PureComponent}\n */\nexport class NavigationMenuRootEnabled extends React.PureComponent {\n private static isBackTrack: boolean = false;\n\n private readonly supportedLevel: number = NavMenuConstants.four;\n\n private currentLevel: number = NavMenuConstants.zero;\n\n private readonly menuNode: React.RefObject;\n\n private readonly menuItemRef: React.RefObject;\n\n private readonly escapeKey: number = NavMenuConstants.escapeKey;\n\n private readonly telemetryContent: ITelemetryContent;\n\n private readonly promotionalImage: Msdyn365.IImageData[] = [];\n\n private menuItemData: IMenuItemData[] = [];\n\n private readonly payLoad: IPayLoad;\n\n private readonly attributes?: Msdyn365.IDictionary;\n\n private customResizeThrottledEventHandler?: (event: Event) => void;\n\n public constructor(props: INavigationMenuViewRootProps) {\n super(props);\n this.menuNode = React.createRef();\n this.menuItemRef = React.createRef();\n const { menuItemData } = this.props.navProps;\n if (ArrayExtensions.hasElements(menuItemData) && ArrayExtensions.hasElements(menuItemData[0].subMenu)) {\n const imagesource = menuItemData[0].subMenu[0].imageSource ? menuItemData[0].subMenu[0].imageSource : '';\n const linkText = menuItemData[0].subMenu[0].linkText ? menuItemData[0].subMenu[0].linkText : '';\n this.promotionalImage = [{ src: imagesource, altText: linkText }];\n\n // Read category and promotional image in one array\n if (ArrayExtensions.hasElements(menuItemData[0].subMenu[0].promotionalContent)) {\n menuItemData[0].subMenu[0].promotionalContent.map(item => {\n const imageSource = item.image.src;\n this.promotionalImage.push({\n src: imageSource,\n altText: item.text,\n additionalProperties: { linkUrl: item.linkUrl.destinationUrl }\n });\n return null;\n });\n }\n }\n this.state = {\n activeMenu: NavMenuConstants.rootMenu,\n mobileViewLabelText: '',\n parentMenu: undefined,\n drawerKeyValue: {},\n isOnlyMobile: this.isOnlyMobile,\n categoryImage: this.promotionalImage,\n isNavOpen: false\n };\n\n this.telemetryContent = getTelemetryObject(\n this.props.navProps.context.request.telemetryPageName!,\n this.props.navProps.friendlyName,\n this.props.navProps.telemetry\n );\n this.payLoad = getPayloadObject('click', this.telemetryContent, '', '');\n this.attributes = getTelemetryAttributes(this.telemetryContent, this.payLoad);\n }\n\n @computed public get isOnlyMobile(): boolean {\n return isMobile({ variant: VariantType.Browser, context: this.props.navProps.context.request }) === 'xs';\n }\n\n public componentDidMount(): void {\n this.customResizeThrottledEventHandler = addThrottledEvent(window, 'resize', this._customUpdateViewport as EventListener);\n document.addEventListener('keydown', (this._escFunction as unknown) as EventListener, false);\n this._customUpdateViewport();\n document.body.addEventListener('mousedown', this._handleClickOutside);\n this._addShopAllLink();\n }\n\n public componentDidUpdate(): void {\n if (this.menuItemRef.current?.children[0] && this.props.navProps.isMobileView) {\n (this.menuItemRef.current.children[0] as HTMLElement).focus();\n }\n }\n\n public componentWillUnmount(): void {\n window.removeEventListener('resize', this.customResizeThrottledEventHandler!, false);\n document.body.removeEventListener('mousedown', this._handleClickOutside, false);\n }\n\n public render(): JSX.Element | null {\n this.currentLevel = NavMenuConstants.one;\n const navbarKey = 'header-nav-mobile';\n return (\n \n {this.state.isOnlyMobile ? (\n this._renderMobileMenu()\n ) : (\n <>\n \n {this._renderCollapseMenu()}\n \n )}\n \n );\n }\n\n /**\n * Function to handle nav bar toggle.\n */\n private readonly _toggleNavBar = (): void => {\n this.setState(previousState => ({\n activeMenu: NavMenuConstants.rootMenu,\n isNavOpen: !previousState.isNavOpen\n }));\n };\n\n private _renderCollapseMenu(): JSX.Element | null {\n return (\n \n {this.state.isOnlyMobile ? this._renderMobileMenu() : this._renderDesktopMenu()}\n \n );\n }\n\n private _renderMobileMenu(): JSX.Element {\n const { MobileBackButton, MobileDescriptionContainer, MobileDescriptionLabel, Navigation } = this.props.navProps;\n\n this.currentLevel = NavMenuConstants.one;\n return (\n \n \n {this.state.isOnlyMobile && this.state.activeMenu !== undefined && (\n \n \n {this.state.mobileViewLabelText}\n \n )}\n {this._renderDisplay()}\n \n \n );\n }\n\n private _renderDesktopMenu(): JSX.Element {\n const { Navigation } = this.props.navProps;\n return (\n \n \n {this._renderDisplay()}\n
\n
\n
\n
\n );\n }\n\n private _renderDrawerLink(item: IMenuItemData): JSX.Element | null {\n if (item.linkURL && !StringExtensions.isNullOrWhitespace(item.linkURL)) {\n return this._renderLinkMenuItem(item);\n } else if (!item.linkURL) {\n return this._renderSpanMenuItem(item);\n }\n return null;\n }\n\n private _renderDisplay(): JSX.Element[] {\n const { ListItem } = this.props.navProps;\n let menuItemData: IMenuItemData[] = [];\n if (this.state.isOnlyMobile) {\n menuItemData = this.menuItemData;\n } else {\n menuItemData = this.props.navProps.menuItemData;\n }\n const { activeMenu } = this.state;\n const menuItemList: JSX.Element[] = [];\n let cmsMenuData: IMenuItemData[] | undefined = [];\n let retailMenuItemData: IMenuItemData[] | undefined = [];\n const retailMenuData = JSON.parse(JSON.stringify(menuItemData)) as IMenuItemData[];\n\n for (const item of retailMenuData) {\n retailMenuItemData = item.subMenu!.filter(subMenuItem => subMenuItem.id && subMenuItem.id >= MenuTypeIndexId.Retail);\n item.subMenu = retailMenuItemData;\n }\n\n for (const item of menuItemData) {\n cmsMenuData = item.subMenu!.filter(subMenuItem => subMenuItem.id && subMenuItem.id < MenuTypeIndexId.Retail);\n }\n\n if (this.state.isOnlyMobile && activeMenu !== undefined && ArrayExtensions.hasElements(menuItemData)) {\n let menuItem: IMenuItemData | null = {};\n for (const menuItemDatum of menuItemData) {\n if (menuItemDatum.id === activeMenu) {\n menuItem = menuItemDatum;\n if (!NavigationMenuRootEnabled.isBackTrack) {\n this.setState({\n parentMenu: undefined\n });\n } else {\n this.setState({\n parentMenu: undefined,\n mobileViewLabelText: menuItemDatum.linkText\n });\n }\n break;\n }\n menuItem = this._getFromSubMenu(menuItemDatum);\n if (menuItem && menuItem.id === activeMenu) {\n break;\n }\n }\n\n if (menuItem) {\n menuItemList.push(\n \n {` `}\n {this._createMenuItemList(menuItem)} {` `}\n \n );\n }\n } else {\n for (const [index, item] of retailMenuData.entries()) {\n menuItemList.push(\n \n {this._createMenuItemList(item)}\n
\n );\n }\n\n for (const [index, item] of cmsMenuData.entries()) {\n menuItemList.push(\n \n {this._createMenuItemList(item)}\n \n );\n }\n }\n\n return menuItemList;\n }\n\n private _getFromSubMenu(item?: IMenuItemData): IMenuItemData | null {\n const subMenus = item?.subMenu;\n if (subMenus && ArrayExtensions.hasElements(subMenus)) {\n for (let index = 0; index <= subMenus.length - NavMenuConstants.one; index++) {\n const subMenu: IMenuItemData = subMenus[Number(index)];\n let parentMenuId = item?.id;\n\n if (subMenu.id === this.state.activeMenu) {\n if (parentMenuId === NavMenuConstants.rootMenu && subMenu.id! < MenuTypeIndexId.Retail) {\n parentMenuId = undefined;\n }\n\n if (!NavigationMenuRootEnabled.isBackTrack) {\n this.setState({ parentMenu: parentMenuId });\n } else {\n this.setState({ parentMenu: parentMenuId, mobileViewLabelText: subMenu.linkText });\n }\n return subMenu;\n }\n const found = this._getFromSubMenu(subMenu);\n if (found) {\n return found;\n }\n }\n }\n return null;\n }\n\n private _createMenuItemList(menuItemData: IMenuItemData): JSX.Element | null {\n if (ArrayExtensions.hasElements(menuItemData.subMenu)) {\n if (this.state.isOnlyMobile && this.state.activeMenu !== undefined) {\n return this._renderSubMenu(menuItemData.subMenu, menuItemData.id, false);\n }\n return (\n <>\n {this._renderButtonMenuItem(menuItemData)}\n {this._renderSubMenu(menuItemData.subMenu, menuItemData.id)}\n \n );\n } else if (menuItemData.linkURL && !StringExtensions.isNullOrWhitespace(menuItemData.linkURL)) {\n return this._renderLinkMenuItem(menuItemData, menuItemData.id);\n } else if (!menuItemData.linkURL) {\n return this._renderSpanMenuItem(menuItemData);\n }\n\n return null;\n }\n\n private _renderSubMenu(subMenuArray?: IMenuItemData[], activeMenu?: number, isSubMenu?: boolean): JSX.Element | null {\n let subMenus: IMenuItemData[] | undefined = subMenuArray;\n if (activeMenu === NavMenuConstants.rootMenu) {\n subMenus = subMenuArray!.filter(subMenuItem => subMenuItem.id && subMenuItem.id >= MenuTypeIndexId.Retail);\n }\n\n const { ListItem } = this.props.navProps;\n const isEnableMultiSupportMenu = this.props.navProps.config.enableMultilevelMenu ?? false;\n const multiLevelSupportedMenu = this.props.navProps.config.menuLevelSupport ?? NavMenuConstants.three;\n\n if (activeMenu && this.state.activeMenu !== activeMenu) {\n this.props.navProps.context.telemetry.error('Navigation Active menu content is empty, module wont render.');\n return null;\n }\n\n if (!subMenus || !ArrayExtensions.hasElements(subMenus)) {\n this.props.navProps.context.telemetry.error('Navigation Submenu content is empty, module wont render.');\n return null;\n }\n\n let levelClassName: string = '';\n const menuOptions = subMenus.map((option: IMenuItemData, index: number) => {\n const hasOptions = option.subMenu && ArrayExtensions.hasElements(option.subMenu);\n let menuItem: JSX.Element | null;\n if (hasOptions && this.state.isOnlyMobile) {\n menuItem = this._renderButtonMenuItem(option, activeMenu, index);\n } else if (this.currentLevel === NavMenuConstants.one || !hasOptions) {\n menuItem = this.getMenuItem(option, index);\n } else {\n menuItem = null;\n }\n let subMenu;\n const isHavingSubmenu =\n hasOptions && isEnableMultiSupportMenu && this.currentLevel <= Math.round(multiLevelSupportedMenu) - NavMenuConstants.one;\n\n if (hasOptions && !this.state.isOnlyMobile) {\n if (this.currentLevel >= NavMenuConstants.two) {\n subMenu = this._renderSubMenuDrawer(option);\n } else if (this.currentLevel <= this.supportedLevel - NavMenuConstants.one) {\n this.currentLevel++;\n levelClassName = `level-${this.currentLevel.toString()}`;\n subMenu = this._renderSubMenu(option.subMenu, undefined, true);\n }\n }\n if (isHavingSubmenu && this.state.isOnlyMobile) {\n this.currentLevel++;\n levelClassName = isEnableMultiSupportMenu ? `level-${this.currentLevel.toString()}` : '';\n subMenu = this._renderSubMenu(option.subMenu, option.id, true);\n }\n const imagesource = option.imageSource ? option.imageSource : '';\n return (\n \n {menuItem}\n {subMenu}\n \n );\n });\n return this._renderMenu(levelClassName, menuOptions, isSubMenu);\n }\n\n private getMenuItem(option: IMenuItemData, index: number): JSX.Element | null {\n let menuItem: JSX.Element | null;\n if (this.currentLevel === NavMenuConstants.one) {\n menuItem = option.linkURL ? this._renderLinkMenuItemLevelOne(option, index) : this._renderSpanMenuItem(option);\n } else {\n menuItem = option.linkURL ? this._renderLinkMenuItem(option, index) : this._renderSpanMenuItem(option);\n }\n return menuItem;\n }\n\n private _renderSubMenuDrawer(menuItem: IMenuItemData): JSX.Element | null {\n const levelClassName = `level-${this.currentLevel.toString()}`;\n const toggleButtonText = menuItem.linkText;\n const keyValue = this.state.drawerKeyValue;\n const buttonText = toggleButtonText !== undefined ? toggleButtonText : '';\n const keys = keyValue;\n const multiLevelSupportedMenu = this.props.navProps.config.menuLevelSupport ?? NavMenuConstants.three;\n\n let isDrawerOpen = false;\n if (keys[menuItem.id!]) {\n isDrawerOpen = true;\n }\n const colProps: ICollapseProps = { timeout: 0, isOpen: isDrawerOpen };\n return (\n \n
\n {menuItem.subMenu!.map((menuSubItem: IMenuItemData) => {\n if (ArrayExtensions.hasElements(menuSubItem.subMenu)) {\n this.currentLevel++;\n if (this.currentLevel < multiLevelSupportedMenu) {\n return this._renderSubMenuDrawer(menuSubItem);\n }\n }\n return this._renderDrawerLink(menuSubItem);\n })}\n
\n \n );\n }\n\n /**\n * Method to handle escape key event.\n * @param menuId -Number.\n * @param isDrawerOpen -Boolean.\n * @returns Void.\n */\n private readonly _bindDesktopCategoryClick = (menuId: number | undefined, isDrawerOpen: boolean) => (): void => {\n const { drawerKeyValue } = this.state;\n const newPair = { [menuId!]: !isDrawerOpen };\n this.setState({ drawerKeyValue: { ...drawerKeyValue, ...newPair } });\n };\n\n private _renderButtonMenuItem(option: IMenuItemData, activeMenu?: number, index?: number): JSX.Element | null {\n return (\n \n {option.linkText}\n \n );\n }\n\n private _renderLinkMenuItem(option: IMenuItemData, index?: number): JSX.Element | null {\n const { Link } = this.props.navProps;\n const linkText = option.linkText ? option.linkText : '';\n this.payLoad.contentAction.etext = linkText;\n const attributes = getTelemetryAttributes(this.telemetryContent, this.payLoad);\n return (\n \n {option.linkText}\n \n );\n }\n\n private _renderLinkMenuItemLevelOne(option: IMenuItemData, index?: number, isHoverEffect: boolean = true): JSX.Element | null {\n const { Link } = this.props.navProps;\n const linkText = option.linkText ? option.linkText : '';\n const imagesource = option.imageSource ? option.imageSource : '';\n this.payLoad.contentAction.etext = linkText;\n const attributes = getTelemetryAttributes(this.telemetryContent, this.payLoad);\n return (\n \n {option.linkText}\n \n );\n }\n\n private _renderPromotionalLink(linkText?: string, linkUrl?: string): JSX.Element | null {\n const { Link } = this.props.navProps;\n this.payLoad.contentAction.etext = linkText;\n const attributes = getTelemetryAttributes(this.telemetryContent, this.payLoad);\n if (linkText && linkUrl) {\n return (\n \n {linkText}\n \n );\n }\n return null;\n }\n\n private _renderSpanMenuItem(option: IMenuItemData, index?: number): JSX.Element | null {\n const { Span } = this.props.navProps;\n return (\n \n {option.linkText}\n \n );\n }\n\n private _renderMenu(level: string, menuOptions: JSX.Element[], isSubmenu?: boolean): JSX.Element | null {\n const { DivContainer, ImageDivContainer, showCategoryImage, showPromotionalContent } = this.props.navProps;\n const isCategoryImageDisplay =\n !this.state.isOnlyMobile &&\n showCategoryImage &&\n this.state.categoryImage !== null &&\n this.state.categoryImage !== undefined &&\n !isSubmenu;\n const isPromotionalContentDisplay =\n !this.state.isOnlyMobile && showPromotionalContent && ArrayExtensions.hasElements(this.state.categoryImage) && !isSubmenu;\n const divContainerClass =\n this.currentLevel > NavMenuConstants.two || isCategoryImageDisplay ? DivContainer!.className : 'ms-nav__deafult';\n this.currentLevel = NavMenuConstants.one;\n const menuLevelSupportClassName =\n isCategoryImageDisplay &&\n this.props.navProps.config.menuLevelSupport &&\n this.props.navProps.config.menuLevelSupport > NavMenuConstants.two &&\n 'navmenu-multi-level';\n\n const categoryImages = this.state.categoryImage?.filter(image => !StringExtensions.isNullOrWhitespace(image.src));\n const imagesContainerKey = categoryImages?.map(item => item.src).join('-');\n return (\n \n \n {menuOptions}\n \n
\n {isCategoryImageDisplay &&\n ArrayExtensions.hasElements(categoryImages) &&\n categoryImages.map(item => (\n \n {getCategoryImage(this.props, item.src ?? '', item.altText!.toString())}\n {isPromotionalContentDisplay &&\n this._renderPromotionalLink(item.altText, item.additionalProperties?.linkUrl)}\n \n ))}\n
\n \n );\n }\n\n /**\n * Handle Category image update.\n * @param categoryImageSource - Image source.\n * @param option - Menu Item data.\n * @returns Returns empty.\n */\n private readonly _updateCategoryImage = (categoryImageSource: string, option: IMenuItemData) => () => {\n const linkText = option.linkText ? option.linkText : '';\n const promotionalImage: Msdyn365.IImageData[] = [{ src: categoryImageSource, altText: linkText }];\n\n // Read category and promotional image in one array\n if (ArrayExtensions.hasElements(option.promotionalContent)) {\n for (const item of option.promotionalContent) {\n const imageSource = item.image.src;\n promotionalImage.push({\n src: imageSource,\n altText: item.text,\n additionalProperties: { linkUrl: item.linkUrl.destinationUrl }\n });\n }\n }\n this.setState({\n categoryImage: ArrayExtensions.hasElements(promotionalImage) ? promotionalImage : [{ src: 'empty' }]\n });\n };\n\n /**\n * Handle dropdown toggle.\n * @param data - Menu Item data.\n * @param parentId - Number.\n * @returns Returns empty.\n */\n private readonly _handleDropdownToggle = (data: IMenuItemData, parentId?: number) => () => {\n if (!this.state.isOnlyMobile) {\n this.setState({\n activeMenu: data.id,\n parentMenu: parentId\n });\n if (this.props.navProps.showCategoryImage) {\n this._updateCategoryImage(data.imageSource!, data)();\n }\n } else {\n NavigationMenuRootEnabled.isBackTrack = false;\n this.setState({\n activeMenu: data.id,\n mobileViewLabelText: data.linkText!,\n parentMenu: parentId\n });\n }\n };\n\n /**\n * Handle back navigation for menu items for mobile view.\n * @returns Returns empty.\n */\n private readonly _handleGoBack = () => () => {\n NavigationMenuRootEnabled.isBackTrack = true;\n this.setState(previousState => ({ activeMenu: previousState.parentMenu }));\n };\n\n /**\n * Function to close the nav menu on click on body.\n * @param event - MouseEvent.\n */\n private readonly _handleClickOutside = (event: MouseEvent) => {\n if (this.menuNode.current && !this.menuNode.current.contains(event.target as Node)) {\n if (!this.state.isOnlyMobile) {\n this.setState({ activeMenu: NavMenuConstants.rootMenu, mobileViewLabelText: '', isNavOpen: false });\n } else {\n this.setState({ activeMenu: undefined, mobileViewLabelText: '', isNavOpen: false });\n }\n }\n };\n\n /**\n * Add shop all link for Mobile submenu.\n */\n private readonly _addShopAllLink = (): void => {\n const { menuItemData } = this.props.navProps;\n this.menuItemData = menuItemData;\n if (ArrayExtensions.hasElements(menuItemData) && ArrayExtensions.hasElements(menuItemData[0].subMenu)) {\n this.menuItemData[0].subMenu?.map(item => {\n const shopAllObject = {};\n Object.assign(shopAllObject, { imageSource: item.imageSource });\n Object.assign(shopAllObject, { linkText: this.props.navProps.resources.allCategoryMenuText });\n Object.assign(shopAllObject, { linkURL: item.linkURL });\n if (ArrayExtensions.hasElements(item.subMenu) && item.menuSource === MenuSource.Retail) {\n item.subMenu.unshift(shopAllObject);\n }\n return item;\n });\n }\n };\n\n /**\n * Checks to assign a ref for focus.\n * @param index -Sub menu list index.\n * @param mobileViewLabelText -Mobile view label text.\n * @param optionLinkText -Sub menu item link text.\n * @returns Boolean.\n */\n private readonly _shouldAddFocusMenuRef = (index: number, mobileViewLabelText?: string, optionLinkText?: string) => {\n const firstIndex: number = 0;\n if (!NavigationMenuRootEnabled.isBackTrack && index === firstIndex) {\n return true;\n }\n if (!optionLinkText || !mobileViewLabelText) {\n return false;\n }\n return mobileViewLabelText === optionLinkText;\n };\n\n /**\n * Function to handle nav menu close.\n */\n private readonly _closeNavMenu = (): void => {\n if (!this.state.isOnlyMobile) {\n this.setState({ activeMenu: NavMenuConstants.rootMenu, mobileViewLabelText: '', isNavOpen: false });\n } else {\n this.setState({ activeMenu: undefined, mobileViewLabelText: '', isNavOpen: false });\n }\n };\n\n /**\n * Function to close the nav menu on esc key.\n * @param event - Event.\n */\n private readonly _escFunction = (event: React.KeyboardEvent) => {\n if (event.keyCode === this.escapeKey && !this.state.isOnlyMobile && this.state.isNavOpen) {\n this.setState({ activeMenu: NavMenuConstants.rootMenu, mobileViewLabelText: '', isNavOpen: false });\n }\n };\n\n /**\n * Custom update viewport.\n */\n private readonly _customUpdateViewport = (): void => {\n this.setState({ isOnlyMobile: this.isOnlyMobile });\n };\n}\n\nexport default NavigationMenuRootEnabled;\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { INavigationMenuViewProps } from '@msdyn365-commerce-modules/navigation-menu';\nimport * as React from 'react';\n\nimport { INavigationMenuProps } from '../definition-extensions/navigation-menu.ext.props.autogenerated';\nimport NavigationMenuRootDisabled from './components/navigation-menu-root-disabled';\nimport NavigationMenuRootEnabled from './components/navigation-menu-root-enabled';\n\n/**\n * Render the Navigation menu.\n * @param props - The navigation menu view props.\n * @returns Return HTML having INavigationMenuViewProps props with navigation menu.\n */\nconst navigationMenuView = (props: INavigationMenuViewProps & INavigationMenuProps<{}>): JSX.Element => {\n if (props.config.enabletopMenu) {\n return ;\n }\n\n return ;\n};\n\nexport default navigationMenuView;\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport * as MsDyn365 from '@msdyn365-commerce/core';\nimport { IModuleProps, INodeProps, NodeTag } from '@msdyn365-commerce-modules/utilities';\nimport classnames from 'classnames';\nimport { observer } from 'mobx-react';\nimport * as React from 'react';\n\nimport { createTabStateInput, getContentID, TabItemType } from '../..';\nimport { ITabData } from './tab.data';\nimport { ITabProps } from './tab.props.autogenerated';\n\n/**\n *\n * Tab component.\n * @extends {React.PureComponent>}\n */\n\nexport interface ICallToActionProps {\n link: INodeProps[];\n}\n\nexport interface ITabViewProps extends ITabProps<{}> {\n heading?: React.ReactNode;\n TabContainer: IModuleProps;\n headerSection: INodeProps;\n tabHeaderSection: INodeProps;\n tabsSection: INodeProps;\n tabItemContainer: INodeProps;\n tabHeaders: React.ReactNode;\n tabContents: React.ReactNode;\n}\n\nexport interface ITabViewStates {\n currentTabIndex: number;\n}\n\n/**\n *\n * Tab component.\n * @extends {React.Component>}\n */\n@observer\nclass Tab extends React.Component, ITabViewStates> {\n public readonly tabIndexQuery: string = 'activeTab';\n\n private activeLink: HTMLLIElement | null;\n\n constructor(props: ITabProps) {\n super(props);\n const { defaultTabIndex } = this.props.config;\n const { slots } = this.props;\n const slotLength = (slots && slots.tabItems && slots.tabItems.length) || 0;\n let initialIndex = defaultTabIndex && defaultTabIndex <= slotLength && defaultTabIndex > 0 ? defaultTabIndex - 1 : 0;\n const queryString: string =\n (this.props.context &&\n this.props.context.request &&\n this.props.context.request.query &&\n this.props.context.request.query.activeTab) ||\n '';\n let queryTabIndex: number = 0;\n if (queryString.indexOf(':') > 0) {\n const arr = queryString.split(':');\n const moduleId = arr[0];\n if (moduleId === this.props.id) {\n queryTabIndex = Number.parseInt(arr[1], 10);\n }\n }\n initialIndex = queryTabIndex > 0 && queryTabIndex <= slotLength ? queryTabIndex - 1 : initialIndex;\n this.state = { currentTabIndex: initialIndex };\n\n this._getTabHeader = this._getTabHeader.bind(this);\n this._getTabContent = this._getTabContent.bind(this);\n this._onClick = this._onClick.bind(this);\n this._onKeyDown = this._onKeyDown.bind(this);\n this._setGetParameter = this._setGetParameter.bind(this);\n this.activeLink = null;\n }\n\n public shouldComponentUpdate(nextProps: ITabProps, nextState: ITabViewStates): boolean {\n if (this.state === nextState && this.props.data === nextProps.data) {\n return false;\n }\n return true;\n }\n\n public render(): JSX.Element {\n const { slots } = this.props;\n const { heading, className } = this.props.config;\n\n const headingComponent = heading && (\n \n );\n const slotLength = (slots && slots.tabItems && slots.tabItems.length) || 0;\n\n // Const queryTabIndex = this.props.context && this.props.context.request && this.props.context.request.query && +this.props.context.request.query.activeTabIndex || 0;\n // let activeIndex = defaultTabIndex && defaultTabIndex <= slotLength && defaultTabIndex > 0 ? defaultTabIndex - 1 : 0;\n // activeIndex = queryTabIndex > 0 && queryTabIndex <= slotLength ? queryTabIndex - 1 : activeIndex;\n\n const tabViewProps = {\n ...this.props,\n TabContainer: {\n moduleProps: this.props,\n className: classnames('ms-tab', className)\n },\n headerSection: { className: 'ms-tab-header-section' },\n tabsSection: { className: 'ms-tab-tabs-section', tag: 'ul' as NodeTag, role: 'tablist' },\n heading: headingComponent,\n config: this.props && this.props.config,\n tabItemContainer: {\n tag: 'div' as NodeTag,\n className: 'ms-tab-content-section'\n },\n tabContents: slotLength > 0 && slots.tabItems.map((item: React.ReactNode, index: number) => this._getTabContent(item, index)),\n tabHeaders: slotLength > 0 && slots.tabItems.map((item: React.ReactNode, index: number) => this._getTabHeader(item, index))\n };\n return this.props.renderView(tabViewProps) as React.ReactElement;\n }\n\n public handleHeadingChange = (event: MsDyn365.ContentEditableEvent) => (this.props.config.heading!.text = event.target.value);\n\n public componentDidUpdate(): void {\n const { data } = this.props;\n if (!this.props.context.request.params.isEditor) {\n const dataActionTabId = data && data.activeTabState && data.activeTabState.result && data.activeTabState.result.tabId;\n if (dataActionTabId) {\n if (this.props.id === dataActionTabId) {\n this.activeLink && this.activeLink.focus();\n }\n } else {\n const queryString: string =\n (this.props.context &&\n this.props.context.request &&\n this.props.context.request.query &&\n this.props.context.request.query.activeTab) ||\n '';\n if (queryString.indexOf(':') > 0) {\n const arr = queryString.split(':');\n const moduleId = arr[0];\n if (moduleId === this.props.id) {\n this.activeLink && this.activeLink.focus();\n }\n }\n }\n }\n }\n\n /**\n *Set the activate link value on tab click.\n * @param link -Ref link value.\n */\n private readonly _refHandler = (link: HTMLLIElement | null) => {\n this.activeLink = link;\n };\n\n private _getTabHeader(item: React.ReactNode, index: number): React.ReactNode {\n const { data } = this.props;\n const activeContentIndex =\n data && data.activeTabState && data.activeTabState.result && data.activeTabState.result.activeContentIndex;\n const dataActionTabId = data && data.activeTabState && data.activeTabState.result && data.activeTabState.result.tabId;\n const selected =\n activeContentIndex !== undefined && dataActionTabId === this.props.id\n ? activeContentIndex === index\n : this.state.currentTabIndex === index;\n const contentID = getContentID(index, this.props.id);\n\n return (\n \n \n {React.cloneElement(item as React.ReactElement, {\n tabItemType: TabItemType.TabHeader,\n isSelected: index === this.state.currentTabIndex,\n itemIndex: index,\n tabId: this.props.id\n })}\n \n \n );\n }\n\n private readonly _onClick = (index: number, id: string) => (e: React.MouseEvent) => {\n const activeTabState = { activeContentIndex: index, tabId: id };\n this.props.context.actionContext.update(createTabStateInput(activeTabState), activeTabState);\n this.setState({ currentTabIndex: index });\n\n // Update query paramter\n const requestContext = this.props.context.request;\n const newUrl = this._setGetParameter(requestContext, this.tabIndexQuery, `${this.props.id}:${String(index + 1)}`);\n requestContext && window.history.pushState({ path: newUrl }, '', newUrl);\n };\n\n private readonly _onKeyDown = (index: number, id: string) => (e: React.KeyboardEvent) => {\n if (e.keyCode === 13) {\n const activeTabState = { activeContentIndex: index, tabId: id };\n this.props.context.actionContext.update(createTabStateInput(activeTabState), activeTabState);\n this.setState({ currentTabIndex: index });\n\n // Update query paramter\n const requestContext = this.props.context.request;\n const newUrl = this._setGetParameter(requestContext, this.tabIndexQuery, `${this.props.id}:${String(index + 1)}`);\n requestContext && window.history.pushState({ path: newUrl }, '', newUrl);\n }\n\n if (e.keyCode === 39 || e.keyCode === 37) {\n const { slots } = this.props;\n const slotLength = (slots && slots.tabItems && slots.tabItems.length) || 0;\n\n if (e.keyCode === 39) {\n // If we're at the end, go to the start\n if (index + 1 === slotLength) {\n index = -1;\n }\n const activeTabState = { activeContentIndex: index + 1, tabId: id };\n this.props.context.actionContext.update(createTabStateInput(activeTabState), activeTabState);\n this.setState({ currentTabIndex: index + 1 });\n\n // Update query paramter\n const requestContext = this.props.context.request;\n const newUrl = this._setGetParameter(requestContext, this.tabIndexQuery, `${this.props.id}:${String(index + 2)}`);\n requestContext && window.history.pushState({ path: newUrl }, '', newUrl);\n\n // Move left\n } else if (e.keyCode === 37) {\n // If we're at the start, move to the end\n if (index === 0) {\n index = slotLength;\n }\n const activeTabState = { activeContentIndex: index - 1, tabId: id };\n this.props.context.actionContext.update(createTabStateInput(activeTabState), activeTabState);\n this.setState({ currentTabIndex: index - 1 });\n\n // Update query paramter\n const requestContext = this.props.context.request;\n const newUrl = this._setGetParameter(requestContext, this.tabIndexQuery, `${this.props.id}:${String(index)}`);\n requestContext && window.history.pushState({ path: newUrl }, '', newUrl);\n }\n }\n };\n\n private _getTabContent(item: React.ReactNode, index: number): React.ReactNode {\n return (\n \n {React.cloneElement(item as React.ReactElement, {\n tabItemType: TabItemType.TabContent,\n isSelected: index === this.state.currentTabIndex,\n itemIndex: index,\n tabId: this.props.id\n })}\n \n );\n }\n\n private _setGetParameter(requestContext: MsDyn365.IRequestContext, paramName: string, paramValue: string): string {\n let url;\n\n if (MsDyn365.msdyn365Commerce.isBrowser) {\n url = new URL(window.location.href);\n } else {\n url = new URL(requestContext.url.requestUrl.href);\n }\n\n const params = new window.URLSearchParams(url.search);\n params.set(paramName, paramValue);\n url.search = decodeURIComponent(params.toString());\n return url.toString();\n }\n}\n\nexport default Tab;\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { IModuleProps, INodeProps, NodeTag } from '@msdyn365-commerce-modules/utilities';\nimport classnames from 'classnames';\nimport { observer } from 'mobx-react';\nimport * as React from 'react';\n\nimport { ITabItemData } from './tab-item.data';\nimport { ITabItemProps } from './tab-item.props.autogenerated';\n\nexport interface ITabItemViewProps {\n TabContentContainer: IModuleProps;\n TabHeaderContainer: IModuleProps;\n tabSlots: INodeProps;\n TabItemContent: INodeProps;\n tabItemType?: TabItemType;\n tabHeader: React.ReactNode;\n}\n\nexport interface ITabItemExtentedProps extends ITabItemProps {\n tabItemType?: TabItemType;\n isSelected?: boolean;\n itemIndex?: number;\n tabId?: string;\n}\n\nexport enum TabItemType {\n TabHeader,\n TabContent\n}\n\n/**\n *\n * TabItem component.\n * @extends {React.Component}\n */\n@observer\nclass TabItem extends React.PureComponent {\n private readonly moduleContentClassName: string = 'ms-tab-item-content';\n\n private readonly moduleHeaderClassName: string = 'ms-tab-item-header';\n\n constructor(props: ITabItemProps) {\n super(props);\n this._renderTabHeader = this._renderTabHeader.bind(this);\n }\n\n public render(): JSX.Element {\n const { slots, renderView, config, data, isSelected, itemIndex } = this.props;\n const index = itemIndex || 0;\n const contentID = getContentID(index, this.props.tabId || '');\n const activeContentIDResult = data && data.activeTabState && data.activeTabState.result;\n const shown =\n activeContentIDResult &&\n activeContentIDResult.tabId === this.props.tabId &&\n activeContentIDResult.activeContentIndex !== undefined\n ? activeContentIDResult.activeContentIndex === index\n : isSelected || false;\n const viewProps = {\n ...this.props,\n TabContentContainer: {\n moduleProps: this.props,\n className: classnames(this.moduleContentClassName, config.className)\n },\n TabHeaderContainer: {\n moduleProps: this.props,\n className: classnames(this.moduleHeaderClassName, config.className)\n },\n TabItemContent: {\n className: 'ms-tab-item-content__content',\n tag: 'section' as NodeTag,\n 'aria-hidden': !shown,\n role: 'tabpanel',\n tabIndex: shown ? 0 : -1,\n id: contentID\n },\n tabHeader: this._renderTabHeader(),\n tabSlots: slots\n };\n return renderView(viewProps) as React.ReactElement;\n }\n\n private _renderTabHeader(): React.ReactNode {\n return <>{this.props.config.tabItemTitle};\n }\n}\n\nexport const getContentID = (index: number, id: string) => {\n return `tab-item-content-${id}-${index}`;\n};\n\nexport default TabItem;\n","/*--------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * See License.txt in the project root for license information.\n *--------------------------------------------------------------*/\n\nimport { CategoryHierarchy } from '@msdyn365-commerce/commerce-entities';\nimport { AsyncResult } from '@msdyn365-commerce/retail-proxy';\n\nimport { ICategoryPromotionalContentData } from './navigation-menu.props.autogenerated';\n\nexport interface INavigationMenuData {\n categories: AsyncResult;\n}\n\nexport interface IMenuItemData {\n id?: number;\n linkText?: string;\n linkURL?: string;\n imageSource?: string;\n imageDestinationURL?: string;\n subMenu?: IMenuItemData[];\n promotionalContent?: ICategoryPromotionalContentData[];\n menuSource?: string;\n shouldOpenNewTab?: boolean;\n ariaLabel?: string;\n}\n\n/**\n *\n * Menu type index id.\n */\nexport enum MenuTypeIndexId {\n Cms = 1000,\n Retail = 5000\n}\n\n/**\n *\n * Menu type source.\n */\nexport enum MenuSource {\n Cms = 'Cms',\n Retail = 'Retail'\n}\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { CategoryHierarchy } from '@msdyn365-commerce/commerce-entities';\nimport MsDyn365, { IActionContext, IGridSettings, IImageSettings, isEmptyOrNullObject } from '@msdyn365-commerce/core';\nimport { TextValueTranslation } from '@msdyn365-commerce/retail-proxy';\nimport { ArrayExtensions, getCategoryUrl } from '@msdyn365-commerce-modules/retail-actions';\nimport { addThrottledEvent, IModuleProps, INodeProps } from '@msdyn365-commerce-modules/utilities';\nimport classnames from 'classnames';\nimport { computed, observable } from 'mobx';\nimport * as React from 'react';\n\nimport { IMenuItemData, INavigationMenuData, MenuSource, MenuTypeIndexId } from './navigation-menu.data';\nimport { ICmsNavItemsData, INavigationMenuProps, ISubMenusData, navigationMenuSource } from './navigation-menu.props.autogenerated';\n\nexport interface INavigationMenuViewProps extends INavigationMenuProps {\n className: string;\n menuItemData: IMenuItemData[];\n Navigation: IModuleProps;\n MenuList: INodeProps;\n ListItem: INodeProps;\n Link: INodeProps;\n Button: INodeProps;\n Span: INodeProps;\n ImageContainer: INodeProps;\n MobileDescriptionContainer: INodeProps;\n MobileBackButton: INodeProps;\n MobileDescriptionLabel: INodeProps;\n imageSettings: IImageSettings;\n gridSettings: IGridSettings;\n isMobileView: boolean;\n DivContainer?: INodeProps;\n ImageDivContainer?: INodeProps;\n showCategoryImage?: boolean;\n showPromotionalContent?: boolean;\n}\n\nexport type GridSize = 'xs' | 'sm' | 'md' | 'lg' | 'xl';\n\nexport interface INavigationMenuState {\n isMobile: boolean;\n}\n\n/**\n *\n * NavigationMenu component.\n * @extends {React.PureComponent>}\n */\nclass NavigationMenu extends React.PureComponent, INavigationMenuState> {\n private static CMSItemIdInit: number = MenuTypeIndexId.Cms;\n\n private static RSItemIdInit: number = MenuTypeIndexId.Retail;\n\n private resizeThrottledEventHandler?: (event: Event) => void;\n\n private menuItemList: IMenuItemData[];\n\n private isRetail: boolean = true;\n\n private isCMS: boolean = true;\n\n @observable\n private viewport: GridSize;\n\n public static getFriendlyName(locale: string, nameTranslations?: TextValueTranslation[]): string | undefined {\n let nameTranslation: TextValueTranslation | undefined;\n if (locale && nameTranslations && nameTranslations.length > 0) {\n nameTranslation = nameTranslations.find(item => item.Language!.toLowerCase() === locale.toLowerCase());\n }\n\n return nameTranslation && nameTranslation.Text;\n }\n\n constructor(props: INavigationMenuProps) {\n super(props);\n this._updateViewport = this._updateViewport.bind(this);\n this.viewport =\n props.context.request && props.context.request.device && props.context.request.device.Type === 'Mobile' ? 'xs' : 'lg';\n this._setNavigationSource(this.props.config && this.props.config.navigationMenuSource);\n this.state = { isMobile: this.isMobile };\n this.menuItemList = [];\n }\n\n @computed get isMobile(): boolean {\n return this.viewport === 'xs' || this.viewport === 'sm';\n }\n\n public componentDidMount(): void {\n if (MsDyn365.isBrowser) {\n this.resizeThrottledEventHandler = addThrottledEvent(window, 'resize', this._updateViewport as EventListener);\n }\n this._updateViewport();\n }\n\n public componentWillUnmount(): void {\n if (MsDyn365.isBrowser) {\n window.removeEventListener('resize', this.resizeThrottledEventHandler!, false);\n }\n }\n\n public render(): JSX.Element | null {\n this.menuItemList = this._mapData();\n if (isEmptyOrNullObject(this.props.data)) {\n this.props.telemetry.error('Navigatiomenu returned null');\n return null;\n }\n\n const defaultImageSettings: IImageSettings = {\n viewports: {\n xs: { q: 'w=224&h=300&m=6', w: 0, h: 0 },\n xl: { q: 'w=224&h=300&m=6', w: 0, h: 0 }\n },\n lazyload: true\n };\n\n const viewProps = {\n ...this.props,\n ...this.state,\n imageSettings: defaultImageSettings,\n gridSettings: this.props.context.request.gridSettings,\n Navigation: {\n moduleProps: this.props,\n className: classnames('ms-nav', this.props.config.className, this.state.isMobile ? 'mobile-vp' : 'desktop-vp'),\n tag: 'nav',\n role: this.isMobile ? 'listbox' : 'navigation'\n },\n MenuList: {\n className: 'ms-nav__list',\n tag: 'ul',\n role: this.isMobile ? 'listbox' : 'menu'\n },\n ListItem: {\n className: 'ms-nav__list__item',\n role: 'presentation',\n tag: 'li'\n },\n showCategoryImage: this.props.config.displayCategoryImage ?? false,\n showPromotionalContent: this.props.config.displayPromotionalImage ?? false,\n Link: {\n tag: 'a',\n className: 'ms-nav__list__item__link',\n role: this.isMobile ? 'option' : 'menuitem'\n },\n DivContainer: {\n tag: 'div',\n className: 'ms-nav__feature'\n },\n ImageDivContainer: {\n tag: 'div',\n className: 'category-image',\n role: 'tabpanel'\n },\n Button: {\n className: 'ms-nav__list__item__button',\n tag: 'button',\n role: this.isMobile ? 'option' : 'menuitem',\n onClick: this.props\n },\n ImageContainer: {\n className: 'ms-nav__list__item__image'\n },\n Span: {\n className: 'ms-nav__list__item__span',\n tag: 'span'\n },\n MobileDescriptionContainer: {\n className: 'ms-nav__list__mobile__container'\n },\n MobileBackButton: {\n className: 'ms-nav__list__mobile__container__button',\n tag: 'button',\n 'aria-label': this.props.resources.backButtonAriaLabel,\n onClick: this.props\n },\n MobileDescriptionLabel: {\n className: 'ms-nav__list__mobile__container__span',\n tag: 'span'\n },\n isMobileView: this.state.isMobile,\n menuItemData: this.menuItemList,\n className: classnames('ms-nav', this.props.config.className)\n };\n\n return this.props.renderView(viewProps) as React.ReactElement;\n }\n\n private _mapData(): IMenuItemData[] {\n const { data, config } = this.props;\n const mergedData: IMenuItemData[] = [];\n if (this.isRetail && data && data.categories && data.categories.result && data.categories.result.length > 0) {\n data.categories.result.map((item: CategoryHierarchy, index) =>\n mergedData.push(this._constructMenuItemData(item, undefined, true, index, true))\n );\n }\n\n if (this.isCMS && config.cmsNavItems && config.cmsNavItems.length > 0) {\n config.cmsNavItems.map((item: ICmsNavItemsData, idx: number) =>\n mergedData.push(this._constructMenuItemData(undefined, item, false, idx + 1))\n );\n }\n return this._constructTopMenuItemData(mergedData);\n }\n\n private _constructTopMenuItemData(mergedData: IMenuItemData[]): IMenuItemData[] {\n const enableTopLevelMenu = this.props.config.enabletopMenu ?? false;\n if (!enableTopLevelMenu) {\n return mergedData;\n }\n const mergedRootMenuData: IMenuItemData[] = [];\n const topMenu = {\n id: 1,\n linkText: this.props.config.rootMenuNavigation ?? '...',\n linkURL: '#',\n imageSource: undefined,\n subMenu: mergedData\n } as IMenuItemData;\n mergedRootMenuData.push(topMenu);\n\n return mergedRootMenuData;\n }\n\n private _constructMenuItemData(\n retailItem?: CategoryHierarchy,\n cmsItem?: ICmsNavItemsData,\n isRetail?: boolean,\n idx?: number,\n addedAllMenu?: boolean\n ): IMenuItemData {\n const locale =\n this.props.context && this.props.context.request && this.props.context.request.locale\n ? this.props.context.request.locale\n : 'en-us';\n const { categoryPromotionalContent } = this.props.config;\n const cmsItemText = (cmsItem && cmsItem.linkText) || '';\n const { menuAriaLabel } = this.props.resources;\n\n // Filter category promotional data based on category name\n const promotionalData =\n retailItem &&\n categoryPromotionalContent?.filter(promoItem => promoItem.categoryName?.toLowerCase() === retailItem?.Name?.toLowerCase());\n\n // First check if image is available from promotional data else read from retail server\n let imageSource: string = 'empty';\n if (ArrayExtensions.hasElements(retailItem?.Images) && retailItem!.Images[0].Uri) {\n imageSource = retailItem!.Images[0].Uri;\n }\n if (isRetail) {\n return {\n id: NavigationMenu.RSItemIdInit++,\n linkText: NavigationMenu.getFriendlyName(locale, retailItem?.NameTranslations) ?? '',\n linkURL: retailItem?.Url,\n imageSource,\n subMenu: this._getNestedChildren(retailItem, imageSource, addedAllMenu),\n promotionalContent: this.props.config.displayPromotionalImage && promotionalData,\n menuSource: MenuSource.Retail,\n ariaLabel: `${NavigationMenu.getFriendlyName(locale, retailItem?.NameTranslations) ?? ''} ${menuAriaLabel}`\n } as IMenuItemData;\n }\n return {\n id: NavigationMenu.CMSItemIdInit++,\n linkText: cmsItemText,\n linkURL: (cmsItem && cmsItem.linkUrl && cmsItem.linkUrl.destinationUrl) || '',\n imageDestinationURL: (cmsItem && cmsItem.imageLink && cmsItem.imageLink.destinationUrl) || '',\n imageSource: (cmsItem && cmsItem.image && cmsItem.image.src) || '',\n subMenu: this._getCMSNestedChildren(cmsItem),\n menuSource: MenuSource.Cms,\n shouldOpenNewTab: cmsItem?.openInNewTab,\n ariaLabel: `${cmsItemText} ${menuAriaLabel}`\n } as IMenuItemData;\n }\n\n private _getNestedChildren(category?: CategoryHierarchy, imageSourceUrl?: string, addedAllMenu: boolean = false): IMenuItemData[] {\n const nestedChildren: IMenuItemData[] = [];\n if (!category || !category.Children || category.Children.length === 0) {\n return [];\n }\n if (!this.props.config.enabletopMenu && addedAllMenu) {\n nestedChildren.push({\n linkText: this.props.resources.allCategoryMenuText,\n imageSource: imageSourceUrl,\n linkURL: getCategoryUrl(category, (this.props.context as unknown) as IActionContext, {})\n });\n }\n category.Children.map((item: CategoryHierarchy, index) => {\n nestedChildren.push(this._constructMenuItemData(item, undefined, true, index, false));\n });\n return nestedChildren;\n }\n\n private _getCMSNestedChildren(category?: ICmsNavItemsData): IMenuItemData[] {\n const nestedChildren: IMenuItemData[] = [];\n\n if (!category || !category.subMenus || category.subMenus.length === 0) {\n return [];\n }\n\n category.subMenus.map((item: ISubMenusData, idx: number) => {\n nestedChildren.push(this._constructMenuItemData(undefined, item, false, idx));\n });\n return nestedChildren;\n }\n\n private readonly _setNavigationSource = (sourceType?: navigationMenuSource): void => {\n switch (sourceType) {\n case navigationMenuSource.retailServerOnly:\n this.isRetail = true;\n this.isCMS = false;\n break;\n case navigationMenuSource.cmsOnly:\n this.isRetail = false;\n this.isCMS = true;\n break;\n case navigationMenuSource.all:\n this.isRetail = true;\n this.isCMS = true;\n break;\n default:\n }\n };\n\n private _updateViewport(): void {\n this.viewport = this._getViewport();\n this.setState({ isMobile: this.isMobile });\n }\n\n private _getViewport(): GridSize {\n const { context } = this.props;\n\n // Always render in mobile viewport on a mobile device\n if (context.request && context.request.device && context.request.device.Type === 'Mobile') {\n return 'xs';\n }\n\n if (MsDyn365.isBrowser && window.innerWidth) {\n const gridSettings = context.request.gridSettings;\n if (gridSettings) {\n if (gridSettings.xs && window.innerWidth <= gridSettings.xs.w) {\n return 'xs';\n } else if (gridSettings.sm && window.innerWidth <= gridSettings.sm.w) {\n return 'sm';\n } else if (gridSettings.md && window.innerWidth <= gridSettings.md.w) {\n return 'md';\n } else if (gridSettings.lg && window.innerWidth <= gridSettings.lg.w) {\n return 'lg';\n }\n return 'xl';\n }\n }\n\n return 'xs';\n }\n}\n\nexport default NavigationMenu;\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { AsyncResult } from '@msdyn365-commerce/core';\nimport { Customer } from '@msdyn365-commerce/retail-proxy';\nimport { IHeaderViewProps } from '@msdyn365-commerce-modules/header';\nimport { Collapse, Drawer, Module, Node } from '@msdyn365-commerce-modules/utilities';\nimport classnames from 'classnames';\nimport * as React from 'react';\n\nconst headerView: React.FC = props => {\n const { HeaderTag, HeaderContainer, HeaderTopBarContainer, Divider } = props;\n return (\n \n \n \n {props.navIcon}\n {props.logo}\n {_renderReactFragment(props.search)}\n {props.preferredStore}\n {_renderAccountBlock(props, false)}\n {props.wishListIconDesktop}\n \n {props.cartIcon}\n {_renderReactFragment(props.siteOptions)}\n \n {_renderCollapseMenu(props)}\n {_renderReactFragment(props.menuBar)}\n \n \n );\n};\n\nfunction _renderCollapseMenu(props: IHeaderViewProps): JSX.Element | null {\n const { Divider, MobileMenuLinksContainer, mobileMenuCollapsed } = props;\n return (\n \n \n {_renderReactFragment(props.search)}\n {_renderMobileAccountBlock(props, true)}\n {props.wishListIconMobile}\n {props.siteOptions}\n \n \n {_renderReactFragment(props.menuBar)}\n \n );\n}\n\nconst renderCustomerName = (accountInformation: AsyncResult): React.ReactChild => {\n const customer = accountInformation && accountInformation.result;\n return <>{customer ? customer.FirstName || customer.Name : ''};\n};\n\nfunction _renderMobileAccountBlock(props: IHeaderViewProps, renderForMobile: boolean): JSX.Element | null {\n const { AccountInfoDropdownParentContainer, signOutLink, signInLink, data, accountLinks } = props;\n\n if (AccountInfoDropdownParentContainer) {\n const accountClassName = classnames(\n 'ms-header__drawer',\n AccountInfoDropdownParentContainer.className,\n renderForMobile ? 'account-mobile' : 'account-desktop'\n );\n\n if (accountLinks) {\n return (\n \n
\n {accountLinks ? accountLinks.map((link: React.ReactNode) => link) : false}\n {signOutLink}\n
\n \n );\n } else if (signInLink) {\n return (\n \n {signInLink}\n \n );\n }\n }\n return null;\n}\n\nfunction _renderAccountBlock(props: IHeaderViewProps, renderForMobile: boolean): JSX.Element | null {\n const {\n AccountInfoDropdownParentContainer,\n AccountInfoDropdownPopoverConentContainer,\n accountInfoDropdownButton,\n signOutLink,\n signInLink,\n accountLinks\n } = props;\n\n if (AccountInfoDropdownParentContainer) {\n const accountClassName = classnames(\n AccountInfoDropdownParentContainer.className,\n renderForMobile ? 'account-mobile' : 'account-desktop'\n );\n if (AccountInfoDropdownPopoverConentContainer) {\n return (\n \n {accountInfoDropdownButton}\n \n {accountLinks ? accountLinks.map((link: React.ReactNode) => link) : false}\n {signOutLink}\n \n \n );\n } else if (signInLink) {\n return (\n \n {signInLink}\n \n );\n }\n }\n\n return null;\n}\n\nfunction _renderReactFragment(items: React.ReactNode[]): JSX.Element | null {\n return (\n <>\n {items && items.length > 0\n ? items.map((slot: React.ReactNode, index: number) => {\n return {slot};\n })\n : null}\n \n );\n}\n\nexport default headerView;\n","/*--------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * See License.txt in the project root for license information.\r\n *--------------------------------------------------------------*/\r\n\r\nimport * as Msdyn365 from '@msdyn365-commerce/core';\r\nimport { INavigationMenuViewProps } from '@msdyn365-commerce-modules/navigation-menu';\r\nimport { generateImageUrl } from '@msdyn365-commerce-modules/retail-actions';\r\nimport * as React from 'react';\r\n\r\nimport { INavigationMenuProps } from '../../definition-extensions/navigation-menu.ext.props.autogenerated';\r\n\r\n/**\r\n * INavigationMenuViewRootProps.\r\n */\r\nexport interface INavigationMenuViewRootProps {\r\n navProps: INavigationMenuViewProps & INavigationMenuProps<{}>;\r\n}\r\n\r\n/**\r\n * Represent navigation menu state interface.\r\n */\r\nexport interface INavigationState {\r\n parentMenu?: number;\r\n activeMenu?: number;\r\n categoryImage?: Msdyn365.IImageData[] | null;\r\n mobileViewLabelText?: string;\r\n isDrawerOpen: boolean;\r\n desktopCategoryId: number;\r\n isOnlyMobile: boolean;\r\n isNavOpen: boolean;\r\n}\r\n\r\n/**\r\n * NavMenuConstants enum.\r\n */\r\nexport enum NavMenuConstants {\r\n zero = 0,\r\n one = 1,\r\n two = 2,\r\n three = 3,\r\n four = 4,\r\n escapeKey = 27,\r\n rootMenu = 1\r\n}\r\n\r\n/**\r\n * GridSizes.\r\n */\r\nexport type GridSize = 'xs' | 'sm' | 'md' | 'lg' | 'xl';\r\n\r\n/**\r\n * Get category image.\r\n * @param props - Navigation menu props.\r\n * @param categoryImage - Category Image.\r\n * @param alttext - AltText String.\r\n * @returns Returns Node.\r\n */\r\nexport const getCategoryImage = (props: INavigationMenuViewRootProps, categoryImage: string, alttext: string): React.ReactNode | null => {\r\n\r\n const categoryImageUrl = generateImageUrl(`${categoryImage}`, props.navProps.context.actionContext.requestContext.apiSettings);\r\n const defaultImageSettings: Msdyn365.IImageSettings = {\r\n viewports: {\r\n xs: { q: 'w=162&h=162&m=8', w: 0, h: 0 },\r\n sm: { q: 'w=162&h=162&m=8', w: 0, h: 0 },\r\n md: { q: 'w=203&h=203&m=8', w: 0, h: 0 },\r\n lg: { q: 'w=203&h=203&m=8', w: 0, h: 0 }\r\n },\r\n lazyload: true\r\n };\r\n if (categoryImageUrl !== undefined) {\r\n const imageData: Msdyn365.IImageData = { src: categoryImageUrl };\r\n return (\r\n \r\n );\r\n }\r\n return null;\r\n};\r\n","/*--------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * See License.txt in the project root for license information.\r\n *--------------------------------------------------------------*/\r\n\r\nimport * as Msdyn365 from '@msdyn365-commerce/core';\r\nimport { IMenuItemData, MenuTypeIndexId } from '@msdyn365-commerce-modules/navigation-menu';\r\nimport { ArrayExtensions, StringExtensions } from '@msdyn365-commerce-modules/retail-actions';\r\nimport {\r\n addThrottledEvent,\r\n Button,\r\n Collapse, Drawer,\r\n getPayloadObject,\r\n getTelemetryAttributes,\r\n getTelemetryObject,\r\n IPayLoad,\r\n isMobile,\r\n ITelemetryContent,\r\n Module,\r\n Node,\r\n onTelemetryClick,\r\n VariantType\r\n} from '@msdyn365-commerce-modules/utilities';\r\nimport classnames from 'classnames';\r\nimport { computed } from 'mobx';\r\nimport * as React from 'react';\r\n\r\nimport { getCategoryImage, INavigationMenuViewRootProps, INavigationState, NavMenuConstants } from './navigation-menu-utilities';\r\n\r\n/**\r\n *\r\n * NavigationMenuRootDisabled component.\r\n * @extends {React.PureComponent}\r\n */\r\nexport class NavigationMenuRootDisabled extends React.PureComponent {\r\n private static isBackTrack: boolean = false;\r\n\r\n private readonly supportedLevel: number = NavMenuConstants.four;\r\n\r\n private currentLevel: number = NavMenuConstants.zero;\r\n\r\n private readonly menuNode: React.RefObject;\r\n\r\n private readonly menuItemRef: React.RefObject;\r\n\r\n private readonly escapeKey: number = NavMenuConstants.escapeKey;\r\n\r\n private readonly telemetryContent: ITelemetryContent;\r\n\r\n private readonly promotionalImage: Msdyn365.IImageData[] = [];\r\n\r\n private readonly payLoad: IPayLoad;\r\n\r\n private readonly attributes?: Msdyn365.IDictionary;\r\n\r\n private customResizeThrottledEventHandler?: (event: Event) => void;\r\n\r\n public constructor(props: INavigationMenuViewRootProps) {\r\n super(props);\r\n this.menuNode = React.createRef();\r\n this.menuItemRef = React.createRef();\r\n const { menuItemData } = this.props.navProps;\r\n if (ArrayExtensions.hasElements(menuItemData) && ArrayExtensions.hasElements(menuItemData[0].subMenu)) {\r\n const imagesource = menuItemData[0].subMenu[0].imageSource ? menuItemData[0].subMenu[0].imageSource : '';\r\n const linkText = menuItemData[0].subMenu[0].linkText ? menuItemData[0].subMenu[0].linkText : '';\r\n this.promotionalImage = [{ src: imagesource, altText: linkText }];\r\n\r\n // Read category and promotional image in one array\r\n if (ArrayExtensions.hasElements(menuItemData[0].subMenu[0].promotionalContent)) {\r\n menuItemData[0].subMenu[0].promotionalContent.map(item => {\r\n const imageSource = item.image.src;\r\n this.promotionalImage.push({ src: imageSource, altText: item.text, additionalProperties: { linkUrl: item.linkUrl.destinationUrl } });\r\n return null;\r\n });\r\n }\r\n }\r\n this.state = {\r\n activeMenu: 1,\r\n mobileViewLabelText: '',\r\n parentMenu: undefined,\r\n isDrawerOpen: false,\r\n desktopCategoryId: -1,\r\n isOnlyMobile: this.isOnlyMobile,\r\n categoryImage: this.promotionalImage,\r\n isNavOpen: false\r\n };\r\n this.telemetryContent = getTelemetryObject(this.props.navProps.context.request.telemetryPageName!,\r\n this.props.navProps.friendlyName,\r\n this.props.navProps.telemetry);\r\n this.payLoad = getPayloadObject('click', this.telemetryContent, '', '');\r\n this.attributes = getTelemetryAttributes(this.telemetryContent, this.payLoad);\r\n }\r\n\r\n @computed public get isOnlyMobile(): boolean {\r\n return (isMobile({ variant: VariantType.Browser, context: this.props.navProps.context.request }) === 'xs');\r\n }\r\n\r\n public componentDidMount(): void {\r\n this.customResizeThrottledEventHandler = addThrottledEvent(window, 'resize', this._customUpdateViewport as EventListener);\r\n document.addEventListener('keydown', (this._escFunction as unknown) as EventListener, false);\r\n this._customUpdateViewport();\r\n document.body.addEventListener('mousedown', this._handleClickOutside);\r\n }\r\n\r\n public componentDidUpdate(): void {\r\n if (this.menuItemRef.current?.children[0] && this.props.navProps.isMobileView) {\r\n (this.menuItemRef.current.children[0] as HTMLElement).focus();\r\n }\r\n }\r\n\r\n public componentWillUnmount(): void {\r\n window.removeEventListener('resize', this.customResizeThrottledEventHandler!, false);\r\n document.body.removeEventListener('mousedown', this._handleClickOutside, false);\r\n }\r\n\r\n public render(): JSX.Element | null {\r\n this.currentLevel = 1;\r\n const navbarKey = 'header-nav-mobile';\r\n return (\r\n \r\n {\r\n this.state.isOnlyMobile ? this._renderMobileMenu() : (<>\r\n \r\n {this._renderCollapseMenu()}\r\n )\r\n }\r\n \r\n );\r\n }\r\n\r\n /**\r\n * Function to handle nav bar toggle.\r\n */\r\n private readonly _toggleNavBar = (): void => {\r\n this.setState(previousState => ({\r\n activeMenu: 1,\r\n isNavOpen: !previousState.isNavOpen\r\n }));\r\n };\r\n\r\n private _renderCollapseMenu(): JSX.Element | null {\r\n return (\r\n \r\n {this.state.isOnlyMobile ? this._renderMobileMenu() : this._renderDesktopMenu()}\r\n \r\n );\r\n }\r\n\r\n private _renderMobileMenu(): JSX.Element {\r\n const { MenuList, MobileBackButton, MobileDescriptionContainer, MobileDescriptionLabel, Navigation } = this.props.navProps;\r\n\r\n this.currentLevel = 1;\r\n return (\r\n \r\n \r\n {this.state.isOnlyMobile && this.state.activeMenu !== undefined &&\r\n \r\n \r\n \r\n {this.state.mobileViewLabelText}\r\n \r\n }\r\n {this._renderDisplay()}\r\n \r\n \r\n );\r\n }\r\n\r\n private _renderDesktopMenu(): JSX.Element {\r\n const { MenuList, Navigation } = this.props.navProps;\r\n\r\n return (\r\n \r\n \r\n {this._renderDisplay()}\r\n
\r\n
\r\n
\r\n
\r\n );\r\n }\r\n\r\n private _renderDrawerLink(item: IMenuItemData): JSX.Element | null {\r\n if (item.linkURL && !StringExtensions.isNullOrWhitespace(item.linkURL)) {\r\n return (\r\n this._renderLinkMenuItem(item)\r\n );\r\n } else if (!item.linkURL) {\r\n return (\r\n this._renderSpanMenuItem(item)\r\n );\r\n }\r\n return null;\r\n }\r\n\r\n private _renderDisplay(): JSX.Element[] {\r\n const { ListItem } = this.props.navProps;\r\n const menuItemData: IMenuItemData[] = this.props.navProps.menuItemData;\r\n const { activeMenu } = this.state;\r\n const menuItemList: JSX.Element[] = [];\r\n\r\n if (ArrayExtensions.hasElements(menuItemData)) {\r\n menuItemData[0].id = 1;\r\n }\r\n\r\n if (this.state.isOnlyMobile && activeMenu !== undefined && ArrayExtensions.hasElements(menuItemData)) {\r\n const menuItem = this._getFromSubMenu(undefined, menuItemData);\r\n\r\n if (menuItem) {\r\n menuItemList.push(\r\n \r\n {' '}\r\n {this._createMenuItemList(menuItem)}\r\n {' '}\r\n \r\n );\r\n }\r\n } else {\r\n\r\n for (const [index, item] of menuItemData.entries()) {\r\n menuItemList.push(\r\n \r\n {this._createMenuItemList(item)}\r\n
\r\n );\r\n }\r\n\r\n }\r\n\r\n return menuItemList;\r\n }\r\n\r\n private _getFromSubMenu(parentMenuId?: number, menu?: IMenuItemData[]): IMenuItemData | null {\r\n if (!menu) {\r\n return null;\r\n }\r\n\r\n for (let index = 0; index <= menu.length - NavMenuConstants.one; index++) {\r\n const item: IMenuItemData = menu[Number(index)];\r\n\r\n if (item.id === this.state.activeMenu) {\r\n if (!NavigationMenuRootDisabled.isBackTrack) {\r\n this.setState({ parentMenu: parentMenuId });\r\n } else {\r\n this.setState({ parentMenu: parentMenuId, mobileViewLabelText: item.linkText });\r\n }\r\n return item;\r\n }\r\n const found = this._getFromSubMenu(item.id, item.subMenu);\r\n if (found) {\r\n return found;\r\n }\r\n }\r\n return null;\r\n }\r\n\r\n private _createMenuItemList(menuItemData: IMenuItemData): JSX.Element | null {\r\n if (ArrayExtensions.hasElements(menuItemData.subMenu)) {\r\n if (this.state.isOnlyMobile && this.state.activeMenu !== undefined) {\r\n return (this._renderSubMenu(menuItemData.subMenu, menuItemData.id, false));\r\n }\r\n\r\n return (\r\n <>\r\n {this._renderButtonMenuItem(menuItemData)}\r\n {this._renderSubMenu(menuItemData.subMenu, menuItemData.id)}\r\n \r\n );\r\n\r\n } else if (menuItemData.linkURL && !StringExtensions.isNullOrWhitespace(menuItemData.linkURL)) {\r\n return (this._renderLinkMenuItem(menuItemData, menuItemData.id));\r\n } else if (!menuItemData.linkURL && !(this.state.isOnlyMobile && this.state.activeMenu !== undefined)) {\r\n return (this._renderSpanMenuItem(menuItemData));\r\n }\r\n\r\n return null;\r\n }\r\n\r\n private _renderSubMenu(subMenuArray?: IMenuItemData[], activeMenu?: number, isSubMenu?: boolean): JSX.Element | null {\r\n\r\n let subMenus: IMenuItemData[] | undefined = subMenuArray;\r\n if (activeMenu === NavMenuConstants.rootMenu) {\r\n subMenus = subMenuArray!.filter(subMenuItem => (subMenuItem.id && subMenuItem.id >= MenuTypeIndexId.Retail));\r\n }\r\n\r\n const { ListItem } = this.props.navProps;\r\n const isEnableMultiSupportMenu = this.props.navProps.config.enableMultilevelMenu ?? false;\r\n const multiLevelSupportedMenu = this.props.navProps.config.menuLevelSupport ?? NavMenuConstants.three;\r\n\r\n if (activeMenu && this.state.activeMenu !== activeMenu) {\r\n this.props.navProps.context.telemetry.error('Navigation Active menu content is empty, module wont render.');\r\n return null;\r\n }\r\n\r\n if (!subMenus || !ArrayExtensions.hasElements(subMenus)) {\r\n this.props.navProps.context.telemetry.error('Navigation Submenu content is empty, module wont render.');\r\n return null;\r\n }\r\n\r\n let levelClassName: string = '';\r\n const menuOptions = subMenus.map((option: IMenuItemData, index: number) => {\r\n const hasOptions = (option.subMenu && ArrayExtensions.hasElements(option.subMenu));\r\n let menuItem: JSX.Element | null;\r\n if (hasOptions && this.state.isOnlyMobile) {\r\n menuItem = this._renderButtonMenuItem(option, activeMenu, index);\r\n } else if (this.currentLevel === NavMenuConstants.one || !hasOptions) {\r\n menuItem = this.getMenuItem(option, index);\r\n } else {\r\n menuItem = null;\r\n }\r\n let subMenu;\r\n const isHavingSubmenu = hasOptions && isEnableMultiSupportMenu && (this.currentLevel <= Math.round(multiLevelSupportedMenu) - NavMenuConstants.one);\r\n\r\n if (hasOptions && !this.state.isOnlyMobile) {\r\n\r\n if (this.currentLevel >= NavMenuConstants.two) {\r\n levelClassName = 'level-3';\r\n subMenu = this._renderSubMenuDrawer(levelClassName, option);\r\n } else if (this.currentLevel <= this.supportedLevel) {\r\n this.currentLevel++;\r\n levelClassName = `level-${this.currentLevel.toString()}`;\r\n subMenu = this._renderSubMenu(option.subMenu, undefined, true);\r\n }\r\n }\r\n\r\n if (isHavingSubmenu && this.state.isOnlyMobile) {\r\n this.currentLevel++;\r\n levelClassName = isEnableMultiSupportMenu ? `level-${this.currentLevel.toString()}` : '';\r\n subMenu = this._renderSubMenu(option.subMenu, option.id, true);\r\n }\r\n const imagesource = option.imageSource ? option.imageSource : '';\r\n return (\r\n \r\n { menuItem}\r\n { subMenu}\r\n \r\n );\r\n });\r\n return (this._renderMenu(levelClassName, menuOptions, isSubMenu));\r\n }\r\n\r\n private getMenuItem(option: IMenuItemData, index: number): JSX.Element | null {\r\n let menuItem: JSX.Element | null;\r\n if (this.currentLevel === NavMenuConstants.one) {\r\n menuItem = (option.linkURL ? this._renderLinkMenuItemLevelOne(option, index) : this._renderSpanMenuItem(option));\r\n } else {\r\n menuItem = (option.linkURL ? this._renderLinkMenuItem(option, index) : this._renderSpanMenuItem(option));\r\n }\r\n return menuItem;\r\n }\r\n\r\n private _renderSubMenuDrawer(levelClassName: string, menuItem: IMenuItemData): JSX.Element | null {\r\n return (\r\n \r\n
\r\n {menuItem.subMenu!.map((menuSubItem: IMenuItemData) => {\r\n return this._renderDrawerLink(menuSubItem);\r\n })}\r\n
\r\n \r\n );\r\n }\r\n\r\n /**\r\n * Handle desktop category click.\r\n * @param desktopCategoryId - Desktop category id used to identify the index of the category.\r\n * @returns Returns void.\r\n */\r\n private readonly _bindDesktopCategoryClick = (desktopCategoryId: number) => (): void => {\r\n if (this.state.desktopCategoryId !== desktopCategoryId) {\r\n this.setState({ desktopCategoryId, isDrawerOpen: true });\r\n } else {\r\n this.setState({ desktopCategoryId: -1, isDrawerOpen: false });\r\n }\r\n };\r\n\r\n private _renderButtonMenuItem(option: IMenuItemData, activeMenu?: number, index?: number): JSX.Element | null {\r\n return (\r\n \r\n { option.linkText}\r\n \r\n );\r\n }\r\n\r\n private _renderLinkMenuItem(option: IMenuItemData, index?: number): JSX.Element | null {\r\n const { Link } = this.props.navProps;\r\n const linkText = option.linkText ? option.linkText : '';\r\n this.payLoad.contentAction.etext = linkText;\r\n const attributes = getTelemetryAttributes(this.telemetryContent, this.payLoad);\r\n return (\r\n \r\n { option.linkText}\r\n \r\n );\r\n }\r\n\r\n private _renderLinkMenuItemLevelOne(option: IMenuItemData, index?: number, isHoverEffect: boolean = true): JSX.Element | null {\r\n const { Link } = this.props.navProps;\r\n const linkText = option.linkText ? option.linkText : '';\r\n const imagesource = option.imageSource ? option.imageSource : '';\r\n this.payLoad.contentAction.etext = linkText;\r\n const attributes = getTelemetryAttributes(this.telemetryContent, this.payLoad);\r\n return (\r\n \r\n { option.linkText}\r\n \r\n );\r\n }\r\n\r\n private _renderPromotionalLink(linkText?: string, linkUrl?: string): JSX.Element | null {\r\n const { Link } = this.props.navProps;\r\n this.payLoad.contentAction.etext = linkText;\r\n const attributes = getTelemetryAttributes(this.telemetryContent, this.payLoad);\r\n if (linkText && linkUrl) {\r\n return (\r\n \r\n { linkText}\r\n \r\n );\r\n }\r\n return null;\r\n\r\n }\r\n\r\n private _renderSpanMenuItem(option: IMenuItemData, index?: number): JSX.Element | null {\r\n const { Span } = this.props.navProps;\r\n return (\r\n \r\n { option.linkText}\r\n \r\n );\r\n }\r\n\r\n private _renderMenu(level: string, menuOptions: JSX.Element[], isSubmenu?: boolean): JSX.Element | null {\r\n const { DivContainer, MenuList, ImageDivContainer, showCategoryImage, showPromotionalContent } = this.props.navProps;\r\n const isCategoryImageDisplay =\r\n !this.state.isOnlyMobile && showCategoryImage && this.state.categoryImage !== null && this.state.categoryImage !== undefined && !isSubmenu;\r\n const isPromotionalContentDisplay =\r\n !this.state.isOnlyMobile && showPromotionalContent && ArrayExtensions.hasElements(this.state.categoryImage) && !isSubmenu;\r\n const divContainerClass = this.currentLevel > NavMenuConstants.two || isCategoryImageDisplay ? DivContainer!.className : 'ms-nav__deafult';\r\n this.currentLevel = NavMenuConstants.one;\r\n const menuLevelSupportClassName = isCategoryImageDisplay && this.props.navProps.config.menuLevelSupport &&\r\n this.props.navProps.config.menuLevelSupport > NavMenuConstants.two && 'navmenu-multi-level';\r\n\r\n const categoryImages = this.state.categoryImage?.filter(image => !StringExtensions.isNullOrWhitespace(image.src));\r\n const imagesContainerKey = categoryImages?.map(item => item.src).join('-');\r\n return (\r\n \r\n \r\n {menuOptions}\r\n \r\n
\r\n {\r\n isCategoryImageDisplay && ArrayExtensions.hasElements(categoryImages) && categoryImages.map(item => (\r\n \r\n { getCategoryImage(this.props, item.src ?? '', item.altText!.toString())}\r\n { isPromotionalContentDisplay && this._renderPromotionalLink(item.altText, item.additionalProperties?.linkUrl)}\r\n ))\r\n }\r\n
\r\n
\r\n );\r\n }\r\n\r\n /**\r\n * Handle Category image update.\r\n * @param categoryImageSource - Image source.\r\n * @param option - Menu Item data.\r\n * @returns Returns empty.\r\n */\r\n private readonly _updateCategoryImage = (categoryImageSource: string, option: IMenuItemData) => () => {\r\n const linkText = option.linkText ? option.linkText : '';\r\n const promotionalImage: Msdyn365.IImageData[] = [{ src: categoryImageSource, altText: linkText }];\r\n\r\n // Read category and promotional image in one array\r\n if (ArrayExtensions.hasElements(option.promotionalContent)) {\r\n for (const item of option.promotionalContent) {\r\n const imageSource = item.image.src;\r\n promotionalImage.push({ src: imageSource, altText: item.text, additionalProperties: { linkUrl: item.linkUrl.destinationUrl } });\r\n }\r\n }\r\n this.setState({\r\n categoryImage: ArrayExtensions.hasElements(promotionalImage) ? promotionalImage : [{ src: 'empty' }]\r\n });\r\n };\r\n\r\n /**\r\n * Handle dropdown toggle.\r\n * @param data - Menu Item data.\r\n * @param parentId - Number.\r\n * @returns Returns empty.\r\n */\r\n private readonly _handleDropdownToggle = (data: IMenuItemData, parentId?: number) => () => {\r\n if (!this.state.isOnlyMobile) {\r\n this.setState({\r\n activeMenu: data.id,\r\n parentMenu: parentId\r\n });\r\n if (this.props.navProps.showCategoryImage) {\r\n this._updateCategoryImage(data.imageSource!, data)();\r\n }\r\n } else {\r\n NavigationMenuRootDisabled.isBackTrack = false;\r\n this.setState({\r\n activeMenu: data.id,\r\n mobileViewLabelText: data.linkText!,\r\n parentMenu: parentId\r\n });\r\n }\r\n\r\n };\r\n\r\n /**\r\n * Handle back navigation for menu items for mobile view.\r\n * @returns Returns empty.\r\n */\r\n private readonly _handleGoBack = () => () => {\r\n NavigationMenuRootDisabled.isBackTrack = true;\r\n this.setState((previousState) => ({ activeMenu: previousState.parentMenu }));\r\n };\r\n\r\n /**\r\n * Function to close the nav menu on click on body.\r\n * @param event - MouseEvent.\r\n */\r\n private readonly _handleClickOutside = (event: MouseEvent) => {\r\n if (this.menuNode.current &&\r\n !this.menuNode.current.contains(event.target as Node)) {\r\n if (!this.state.isOnlyMobile) {\r\n this.setState({ activeMenu: 1, mobileViewLabelText: '', isNavOpen: false });\r\n } else {\r\n this.setState({ activeMenu: undefined, mobileViewLabelText: '', isNavOpen: false });\r\n }\r\n }\r\n };\r\n\r\n /**\r\n * Checks to assign a ref for focus.\r\n * @param index -Sub menu list index.\r\n * @param mobileViewLabelText -Mobile view label text.\r\n * @param optionLinkText -Sub menu item link text.\r\n * @returns Boolean.\r\n */\r\n private readonly _shouldAddFocusMenuRef = (index: number, mobileViewLabelText?: string, optionLinkText?: string) => {\r\n const firstIndex: number = 0;\r\n if (!NavigationMenuRootDisabled.isBackTrack && index === firstIndex) {\r\n return true;\r\n }\r\n if (!optionLinkText || !mobileViewLabelText) {\r\n return false;\r\n }\r\n return mobileViewLabelText === optionLinkText;\r\n };\r\n\r\n /**\r\n * Function to handle nav menu close.\r\n */\r\n private readonly _closeNavMenu = (): void => {\r\n if (!this.state.isOnlyMobile) {\r\n this.setState({ activeMenu: 1, mobileViewLabelText: '', isNavOpen: false });\r\n } else {\r\n this.setState({ activeMenu: undefined, mobileViewLabelText: '', isNavOpen: false });\r\n }\r\n };\r\n\r\n /**\r\n * Function to close the nav menu on esc key.\r\n * @param event - Event.\r\n */\r\n private readonly _escFunction = (event: React.KeyboardEvent) => {\r\n if (event.keyCode === this.escapeKey && !this.state.isOnlyMobile && this.state.isNavOpen) {\r\n this.setState({ activeMenu: 1, mobileViewLabelText: '', isNavOpen: false });\r\n }\r\n };\r\n\r\n /**\r\n * Custom update viewport.\r\n */\r\n private readonly _customUpdateViewport = (): void => {\r\n this.setState({ isOnlyMobile: this.isOnlyMobile });\r\n };\r\n}\r\n\r\nexport default NavigationMenuRootDisabled;\r\n","/*--------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * See License.txt in the project root for license information.\r\n *--------------------------------------------------------------*/\r\n\r\nimport * as Msdyn365 from '@msdyn365-commerce/core';\r\nimport { IMenuItemData, MenuSource, MenuTypeIndexId } from '@msdyn365-commerce-modules/navigation-menu';\r\nimport { ArrayExtensions, StringExtensions } from '@msdyn365-commerce-modules/retail-actions';\r\nimport {\r\n addThrottledEvent,\r\n Button,\r\n Collapse, Drawer,\r\n getPayloadObject,\r\n getTelemetryAttributes,\r\n getTelemetryObject,\r\n IPayLoad,\r\n isMobile,\r\n ITelemetryContent,\r\n Module,\r\n Node,\r\n onTelemetryClick,\r\n VariantType\r\n} from '@msdyn365-commerce-modules/utilities';\r\nimport classnames from 'classnames';\r\nimport { computed } from 'mobx';\r\nimport * as React from 'react';\r\n\r\nimport { getCategoryImage, INavigationMenuViewRootProps, INavigationState, NavMenuConstants } from './navigation-menu-utilities';\r\n\r\n/**\r\n *\r\n * NavigationMenuRootEnabled component.\r\n * @extends {React.PureComponent}\r\n */\r\nexport class NavigationMenuRootEnabled extends React.PureComponent {\r\n private static isBackTrack: boolean = false;\r\n\r\n private readonly supportedLevel: number = NavMenuConstants.four;\r\n\r\n private currentLevel: number = NavMenuConstants.zero;\r\n\r\n private readonly menuNode: React.RefObject;\r\n\r\n private readonly menuItemRef: React.RefObject;\r\n\r\n private readonly escapeKey: number = NavMenuConstants.escapeKey;\r\n\r\n private readonly telemetryContent: ITelemetryContent;\r\n\r\n private readonly promotionalImage: Msdyn365.IImageData[] = [];\r\n\r\n private menuItemData: IMenuItemData[] = [];\r\n\r\n private readonly payLoad: IPayLoad;\r\n\r\n private readonly attributes?: Msdyn365.IDictionary;\r\n\r\n private customResizeThrottledEventHandler?: (event: Event) => void;\r\n\r\n public constructor(props: INavigationMenuViewRootProps) {\r\n super(props);\r\n this.menuNode = React.createRef();\r\n this.menuItemRef = React.createRef();\r\n const { menuItemData } = this.props.navProps;\r\n if (ArrayExtensions.hasElements(menuItemData) && ArrayExtensions.hasElements(menuItemData[0].subMenu)) {\r\n const imagesource = menuItemData[0].subMenu[0].imageSource ? menuItemData[0].subMenu[0].imageSource : '';\r\n const linkText = menuItemData[0].subMenu[0].linkText ? menuItemData[0].subMenu[0].linkText : '';\r\n this.promotionalImage = [{ src: imagesource, altText: linkText }];\r\n\r\n // Read category and promotional image in one array\r\n if (ArrayExtensions.hasElements(menuItemData[0].subMenu[0].promotionalContent)) {\r\n menuItemData[0].subMenu[0].promotionalContent.map(item => {\r\n const imageSource = item.image.src;\r\n this.promotionalImage.push({ src: imageSource, altText: item.text, additionalProperties: { linkUrl: item.linkUrl.destinationUrl } });\r\n return null;\r\n });\r\n }\r\n }\r\n this.state = {\r\n activeMenu: NavMenuConstants.rootMenu,\r\n mobileViewLabelText: '',\r\n parentMenu: undefined,\r\n isDrawerOpen: false,\r\n desktopCategoryId: -1,\r\n isOnlyMobile: this.isOnlyMobile,\r\n categoryImage: this.promotionalImage,\r\n isNavOpen: false\r\n };\r\n\r\n this.telemetryContent = getTelemetryObject(this.props.navProps.context.request.telemetryPageName!,\r\n this.props.navProps.friendlyName,\r\n this.props.navProps.telemetry);\r\n this.payLoad = getPayloadObject('click', this.telemetryContent, '', '');\r\n this.attributes = getTelemetryAttributes(this.telemetryContent, this.payLoad);\r\n }\r\n\r\n @computed public get isOnlyMobile(): boolean {\r\n return (isMobile({ variant: VariantType.Browser, context: this.props.navProps.context.request }) === 'xs');\r\n }\r\n\r\n public componentDidMount(): void {\r\n this.customResizeThrottledEventHandler = addThrottledEvent(window, 'resize', this._customUpdateViewport as EventListener);\r\n document.addEventListener('keydown', (this._escFunction as unknown) as EventListener, false);\r\n this._customUpdateViewport();\r\n document.body.addEventListener('mousedown', this._handleClickOutside);\r\n this._addShopAllLink();\r\n }\r\n\r\n public componentDidUpdate(): void {\r\n if (this.menuItemRef.current?.children[0] && this.props.navProps.isMobileView) {\r\n (this.menuItemRef.current.children[0] as HTMLElement).focus();\r\n }\r\n }\r\n\r\n public componentWillUnmount(): void {\r\n window.removeEventListener('resize', this.customResizeThrottledEventHandler!, false);\r\n document.body.removeEventListener('mousedown', this._handleClickOutside, false);\r\n }\r\n\r\n public render(): JSX.Element | null {\r\n this.currentLevel = NavMenuConstants.one;\r\n const navbarKey = 'header-nav-mobile';\r\n return (\r\n \r\n {\r\n this.state.isOnlyMobile ? this._renderMobileMenu() : (<>\r\n {this.props.navProps.config.rootMenuNavigation}\r\n {this._renderCollapseMenu()}\r\n )\r\n }\r\n \r\n );\r\n }\r\n\r\n /**\r\n * Function to handle nav bar toggle.\r\n */\r\n private readonly _toggleNavBar = (): void => {\r\n this.setState(previousState => ({\r\n activeMenu: NavMenuConstants.rootMenu,\r\n isNavOpen: !previousState.isNavOpen\r\n }));\r\n };\r\n\r\n private _renderCollapseMenu(): JSX.Element | null {\r\n return (\r\n \r\n {this.state.isOnlyMobile ? this._renderMobileMenu() : this._renderDesktopMenu()}\r\n \r\n );\r\n }\r\n\r\n private _renderMobileMenu(): JSX.Element {\r\n const { MobileBackButton, MobileDescriptionContainer, MobileDescriptionLabel, Navigation } = this.props.navProps;\r\n\r\n this.currentLevel = NavMenuConstants.one;\r\n return (\r\n \r\n \r\n {this.state.isOnlyMobile && this.state.activeMenu !== undefined &&\r\n \r\n \r\n \r\n {this.state.mobileViewLabelText}\r\n \r\n }\r\n {this._renderDisplay()}\r\n \r\n \r\n );\r\n }\r\n\r\n private _renderDesktopMenu(): JSX.Element {\r\n const { Navigation } = this.props.navProps;\r\n return (\r\n \r\n \r\n {this._renderDisplay()}\r\n
\r\n
\r\n
\r\n
\r\n );\r\n }\r\n\r\n private _renderDrawerLink(item: IMenuItemData): JSX.Element | null {\r\n if (item.linkURL && !StringExtensions.isNullOrWhitespace(item.linkURL)) {\r\n return (\r\n this._renderLinkMenuItem(item)\r\n );\r\n } else if (!item.linkURL) {\r\n return (\r\n this._renderSpanMenuItem(item)\r\n );\r\n }\r\n return null;\r\n }\r\n\r\n private _renderDisplay(): JSX.Element[] {\r\n const { ListItem } = this.props.navProps;\r\n let menuItemData: IMenuItemData[] = [];\r\n if (this.state.isOnlyMobile) {\r\n menuItemData = this.menuItemData;\r\n } else {\r\n menuItemData = this.props.navProps.menuItemData;\r\n }\r\n const { activeMenu } = this.state;\r\n const menuItemList: JSX.Element[] = [];\r\n let cmsMenuData: IMenuItemData[] | undefined = [];\r\n let retailMenuItemData: IMenuItemData[] | undefined = [];\r\n const retailMenuData = JSON.parse(JSON.stringify(menuItemData)) as IMenuItemData[];\r\n\r\n for (const item of retailMenuData) {\r\n retailMenuItemData = item.subMenu!.filter(subMenuItem => (subMenuItem.id && subMenuItem.id >= MenuTypeIndexId.Retail));\r\n item.subMenu = retailMenuItemData;\r\n }\r\n\r\n for (const item of menuItemData) {\r\n cmsMenuData = item.subMenu!.filter(subMenuItem => (subMenuItem.id && subMenuItem.id < MenuTypeIndexId.Retail));\r\n }\r\n\r\n if (this.state.isOnlyMobile && activeMenu !== undefined && ArrayExtensions.hasElements(menuItemData)) {\r\n let menuItem: IMenuItemData | null = {};\r\n for (const menuItemDatum of menuItemData) {\r\n if (menuItemDatum.id === activeMenu) {\r\n menuItem = menuItemDatum;\r\n if (!NavigationMenuRootEnabled.isBackTrack) {\r\n this.setState({\r\n parentMenu: undefined\r\n });\r\n } else {\r\n this.setState({\r\n parentMenu: undefined,\r\n mobileViewLabelText: menuItemDatum.linkText\r\n });\r\n }\r\n break;\r\n }\r\n menuItem = this._getFromSubMenu(menuItemDatum);\r\n if (menuItem && menuItem.id === activeMenu) {\r\n break;\r\n }\r\n }\r\n\r\n if (menuItem) {\r\n menuItemList.push(\r\n \r\n {' '}\r\n {this._createMenuItemList(menuItem)}\r\n {' '}\r\n \r\n );\r\n }\r\n\r\n } else {\r\n for (const [index, item] of retailMenuData.entries()) {\r\n menuItemList.push(\r\n \r\n {this._createMenuItemList(item)}\r\n
\r\n );\r\n }\r\n\r\n for (const [index, item] of cmsMenuData.entries()) {\r\n menuItemList.push(\r\n \r\n {this._createMenuItemList(item)}\r\n \r\n );\r\n }\r\n }\r\n\r\n return menuItemList;\r\n }\r\n\r\n private _getFromSubMenu(item?: IMenuItemData): IMenuItemData | null {\r\n const subMenus = item?.subMenu;\r\n if (subMenus && ArrayExtensions.hasElements(subMenus)) {\r\n for (let index = 0; index <= subMenus.length - NavMenuConstants.one; index++) {\r\n const subMenu: IMenuItemData = subMenus[Number(index)];\r\n let parentMenuId = item?.id;\r\n\r\n if (subMenu.id === this.state.activeMenu) {\r\n if (parentMenuId === NavMenuConstants.rootMenu && subMenu.id! < MenuTypeIndexId.Retail) {\r\n parentMenuId = undefined;\r\n }\r\n\r\n if (!NavigationMenuRootEnabled.isBackTrack) {\r\n this.setState({ parentMenu: parentMenuId });\r\n } else {\r\n this.setState({ parentMenu: parentMenuId, mobileViewLabelText: subMenu.linkText });\r\n }\r\n return subMenu;\r\n }\r\n const found = this._getFromSubMenu(subMenu);\r\n if (found) {\r\n return found;\r\n }\r\n }\r\n }\r\n return null;\r\n }\r\n\r\n private _createMenuItemList(menuItemData: IMenuItemData): JSX.Element | null {\r\n if (ArrayExtensions.hasElements(menuItemData.subMenu)) {\r\n if (this.state.isOnlyMobile && this.state.activeMenu !== undefined) {\r\n return (this._renderSubMenu(menuItemData.subMenu, menuItemData.id, false));\r\n }\r\n return (\r\n <>\r\n {this._renderButtonMenuItem(menuItemData)}\r\n {this._renderSubMenu(menuItemData.subMenu, menuItemData.id)}\r\n \r\n );\r\n\r\n } else if (menuItemData.linkURL && !StringExtensions.isNullOrWhitespace(menuItemData.linkURL)) {\r\n return (this._renderLinkMenuItem(menuItemData, menuItemData.id));\r\n } else if (!menuItemData.linkURL) {\r\n return (this._renderSpanMenuItem(menuItemData));\r\n }\r\n\r\n return null;\r\n }\r\n\r\n private _renderSubMenu(subMenuArray?: IMenuItemData[], activeMenu?: number, isSubMenu?: boolean): JSX.Element | null {\r\n\r\n let subMenus: IMenuItemData[] | undefined = subMenuArray;\r\n if (activeMenu === NavMenuConstants.rootMenu) {\r\n subMenus = subMenuArray!.filter(subMenuItem => (subMenuItem.id && subMenuItem.id >= MenuTypeIndexId.Retail));\r\n }\r\n\r\n const { ListItem } = this.props.navProps;\r\n const isEnableMultiSupportMenu = this.props.navProps.config.enableMultilevelMenu ?? false;\r\n const multiLevelSupportedMenu = this.props.navProps.config.menuLevelSupport ?? NavMenuConstants.three;\r\n\r\n if (activeMenu && this.state.activeMenu !== activeMenu) {\r\n this.props.navProps.context.telemetry.error('Navigation Active menu content is empty, module wont render.');\r\n return null;\r\n }\r\n\r\n if (!subMenus || !ArrayExtensions.hasElements(subMenus)) {\r\n this.props.navProps.context.telemetry.error('Navigation Submenu content is empty, module wont render.');\r\n return null;\r\n }\r\n\r\n let levelClassName: string = '';\r\n const menuOptions = subMenus.map((option: IMenuItemData, index: number) => {\r\n const hasOptions = (option.subMenu && ArrayExtensions.hasElements(option.subMenu));\r\n let menuItem: JSX.Element | null;\r\n if (hasOptions && this.state.isOnlyMobile) {\r\n menuItem = this._renderButtonMenuItem(option, activeMenu, index);\r\n } else if (this.currentLevel === NavMenuConstants.one || !hasOptions) {\r\n menuItem = this.getMenuItem(option, index);\r\n } else {\r\n menuItem = null;\r\n }\r\n let subMenu;\r\n const isHavingSubmenu = hasOptions && isEnableMultiSupportMenu && (this.currentLevel <= Math.round(multiLevelSupportedMenu) - NavMenuConstants.one);\r\n\r\n if (hasOptions && !this.state.isOnlyMobile) {\r\n if (this.currentLevel >= NavMenuConstants.two) {\r\n levelClassName = 'level-3';\r\n subMenu = this._renderSubMenuDrawer(levelClassName, option);\r\n } else if (this.currentLevel <= this.supportedLevel - NavMenuConstants.one) {\r\n this.currentLevel++;\r\n levelClassName = `level-${this.currentLevel.toString()}`;\r\n subMenu = this._renderSubMenu(option.subMenu, undefined, true);\r\n }\r\n }\r\n if (isHavingSubmenu && this.state.isOnlyMobile) {\r\n this.currentLevel++;\r\n levelClassName = isEnableMultiSupportMenu ? `level-${this.currentLevel.toString()}` : '';\r\n subMenu = this._renderSubMenu(option.subMenu, option.id, true);\r\n }\r\n const imagesource = option.imageSource ? option.imageSource : '';\r\n return (\r\n \r\n { menuItem}\r\n { subMenu}\r\n \r\n );\r\n });\r\n return (this._renderMenu(levelClassName, menuOptions, isSubMenu));\r\n }\r\n\r\n private getMenuItem(option: IMenuItemData, index: number): JSX.Element | null {\r\n let menuItem: JSX.Element | null;\r\n if (this.currentLevel === NavMenuConstants.one) {\r\n menuItem = (option.linkURL ? this._renderLinkMenuItemLevelOne(option, index) : this._renderSpanMenuItem(option));\r\n } else {\r\n menuItem = (option.linkURL ? this._renderLinkMenuItem(option, index) : this._renderSpanMenuItem(option));\r\n }\r\n return menuItem;\r\n }\r\n\r\n private _renderSubMenuDrawer(levelClassName: string, menuItem: IMenuItemData): JSX.Element | null {\r\n return (\r\n \r\n
\r\n {menuItem.subMenu!.map((menuSubItem: IMenuItemData) => {\r\n return this._renderDrawerLink(menuSubItem);\r\n })}\r\n
\r\n \r\n );\r\n }\r\n\r\n /**\r\n * Handle desktop category click.\r\n * @param desktopCategoryId - Desktop category id used to identify the index of the category.\r\n * @returns Returns void.\r\n */\r\n private readonly _bindDesktopCategoryClick = (desktopCategoryId: number) => (): void => {\r\n if (this.state.desktopCategoryId !== desktopCategoryId) {\r\n this.setState({ desktopCategoryId, isDrawerOpen: true });\r\n } else {\r\n this.setState({ desktopCategoryId: -1, isDrawerOpen: false });\r\n }\r\n };\r\n\r\n private _renderButtonMenuItem(option: IMenuItemData, activeMenu?: number, index?: number): JSX.Element | null {\r\n return (\r\n \r\n { option.linkText}\r\n \r\n );\r\n }\r\n\r\n private _renderLinkMenuItem(option: IMenuItemData, index?: number): JSX.Element | null {\r\n const { Link } = this.props.navProps;\r\n const linkText = option.linkText ? option.linkText : '';\r\n this.payLoad.contentAction.etext = linkText;\r\n const attributes = getTelemetryAttributes(this.telemetryContent, this.payLoad);\r\n return (\r\n \r\n { option.linkText}\r\n \r\n );\r\n }\r\n\r\n private _renderLinkMenuItemLevelOne(option: IMenuItemData, index?: number, isHoverEffect: boolean = true): JSX.Element | null {\r\n const { Link } = this.props.navProps;\r\n const linkText = option.linkText ? option.linkText : '';\r\n const imagesource = option.imageSource ? option.imageSource : '';\r\n this.payLoad.contentAction.etext = linkText;\r\n const attributes = getTelemetryAttributes(this.telemetryContent, this.payLoad);\r\n return (\r\n \r\n { option.linkText}\r\n \r\n );\r\n }\r\n\r\n private _renderPromotionalLink(linkText?: string, linkUrl?: string): JSX.Element | null {\r\n const { Link } = this.props.navProps;\r\n this.payLoad.contentAction.etext = linkText;\r\n const attributes = getTelemetryAttributes(this.telemetryContent, this.payLoad);\r\n if (linkText && linkUrl) {\r\n return (\r\n \r\n { linkText}\r\n \r\n );\r\n }\r\n return null;\r\n\r\n }\r\n\r\n private _renderSpanMenuItem(option: IMenuItemData, index?: number): JSX.Element | null {\r\n const { Span } = this.props.navProps;\r\n return (\r\n \r\n { option.linkText}\r\n \r\n );\r\n }\r\n\r\n private _renderMenu(level: string, menuOptions: JSX.Element[], isSubmenu?: boolean): JSX.Element | null {\r\n const { DivContainer, ImageDivContainer, showCategoryImage, showPromotionalContent } = this.props.navProps;\r\n const isCategoryImageDisplay =\r\n !this.state.isOnlyMobile && showCategoryImage && this.state.categoryImage !== null && this.state.categoryImage !== undefined && !isSubmenu;\r\n const isPromotionalContentDisplay =\r\n !this.state.isOnlyMobile && showPromotionalContent && ArrayExtensions.hasElements(this.state.categoryImage) && !isSubmenu;\r\n const divContainerClass = this.currentLevel > NavMenuConstants.two || isCategoryImageDisplay ? DivContainer!.className : 'ms-nav__deafult';\r\n this.currentLevel = NavMenuConstants.one;\r\n const menuLevelSupportClassName =\r\n isCategoryImageDisplay && this.props.navProps.config.menuLevelSupport &&\r\n this.props.navProps.config.menuLevelSupport > NavMenuConstants.two && 'navmenu-multi-level';\r\n\r\n const categoryImages = this.state.categoryImage?.filter(image => !StringExtensions.isNullOrWhitespace(image.src));\r\n const imagesContainerKey = categoryImages?.map(item => item.src).join('-');\r\n return (\r\n \r\n \r\n {menuOptions}\r\n \r\n
\r\n {\r\n isCategoryImageDisplay && ArrayExtensions.hasElements(categoryImages) && categoryImages.map(item => (\r\n \r\n { getCategoryImage(this.props, item.src ?? '', item.altText!.toString())}\r\n { isPromotionalContentDisplay && this._renderPromotionalLink(item.altText, item.additionalProperties?.linkUrl)}\r\n ))\r\n }\r\n
\r\n \r\n );\r\n }\r\n\r\n /**\r\n * Handle Category image update.\r\n * @param categoryImageSource - Image source.\r\n * @param option - Menu Item data.\r\n * @returns Returns empty.\r\n */\r\n private readonly _updateCategoryImage = (categoryImageSource: string, option: IMenuItemData) => () => {\r\n const linkText = option.linkText ? option.linkText : '';\r\n const promotionalImage: Msdyn365.IImageData[] = [{ src: categoryImageSource, altText: linkText }];\r\n\r\n // Read category and promotional image in one array\r\n if (ArrayExtensions.hasElements(option.promotionalContent)) {\r\n for (const item of option.promotionalContent) {\r\n const imageSource = item.image.src;\r\n promotionalImage.push({ src: imageSource, altText: item.text, additionalProperties: { linkUrl: item.linkUrl.destinationUrl } });\r\n }\r\n }\r\n this.setState({\r\n categoryImage: ArrayExtensions.hasElements(promotionalImage) ? promotionalImage : [{ src: 'empty' }]\r\n });\r\n };\r\n\r\n /**\r\n * Handle dropdown toggle.\r\n * @param data - Menu Item data.\r\n * @param parentId - Number.\r\n * @returns Returns empty.\r\n */\r\n private readonly _handleDropdownToggle = (data: IMenuItemData, parentId?: number) => () => {\r\n if (!this.state.isOnlyMobile) {\r\n this.setState({\r\n activeMenu: data.id,\r\n parentMenu: parentId\r\n });\r\n if (this.props.navProps.showCategoryImage) {\r\n this._updateCategoryImage(data.imageSource!, data)();\r\n }\r\n } else {\r\n NavigationMenuRootEnabled.isBackTrack = false;\r\n this.setState({\r\n activeMenu: data.id,\r\n mobileViewLabelText: data.linkText!,\r\n parentMenu: parentId\r\n });\r\n }\r\n\r\n };\r\n\r\n /**\r\n * Handle back navigation for menu items for mobile view.\r\n * @returns Returns empty.\r\n */\r\n private readonly _handleGoBack = () => () => {\r\n NavigationMenuRootEnabled.isBackTrack = true;\r\n this.setState((previousState) => ({ activeMenu: previousState.parentMenu }));\r\n };\r\n\r\n /**\r\n * Function to close the nav menu on click on body.\r\n * @param event - MouseEvent.\r\n */\r\n private readonly _handleClickOutside = (event: MouseEvent) => {\r\n if (this.menuNode.current &&\r\n !this.menuNode.current.contains(event.target as Node)) {\r\n if (!this.state.isOnlyMobile) {\r\n this.setState({ activeMenu: NavMenuConstants.rootMenu, mobileViewLabelText: '', isNavOpen: false });\r\n } else {\r\n this.setState({ activeMenu: undefined, mobileViewLabelText: '', isNavOpen: false });\r\n }\r\n }\r\n };\r\n\r\n /**\r\n * Add shop all link for Mobile submenu.\r\n */\r\n private readonly _addShopAllLink = (): void => {\r\n const { menuItemData } = this.props.navProps;\r\n this.menuItemData = menuItemData;\r\n if (ArrayExtensions.hasElements(menuItemData) && ArrayExtensions.hasElements(menuItemData[0].subMenu)) {\r\n this.menuItemData[0].subMenu?.map(item => {\r\n const shopAllObject = {};\r\n Object.assign(shopAllObject, { imageSource: item.imageSource });\r\n Object.assign(shopAllObject, { linkText: this.props.navProps.resources.allCategoryMenuText });\r\n Object.assign(shopAllObject, { linkURL: item.linkURL });\r\n if (ArrayExtensions.hasElements(item.subMenu) && item.menuSource === MenuSource.Retail) {\r\n item.subMenu.unshift(shopAllObject);\r\n }\r\n return item;\r\n });\r\n }\r\n };\r\n\r\n /**\r\n * Checks to assign a ref for focus.\r\n * @param index -Sub menu list index.\r\n * @param mobileViewLabelText -Mobile view label text.\r\n * @param optionLinkText -Sub menu item link text.\r\n * @returns Boolean.\r\n */\r\n private readonly _shouldAddFocusMenuRef = (index: number, mobileViewLabelText?: string, optionLinkText?: string) => {\r\n const firstIndex: number = 0;\r\n if (!NavigationMenuRootEnabled.isBackTrack && index === firstIndex) {\r\n return true;\r\n }\r\n if (!optionLinkText || !mobileViewLabelText) {\r\n return false;\r\n }\r\n return mobileViewLabelText === optionLinkText;\r\n };\r\n\r\n /**\r\n * Function to handle nav menu close.\r\n */\r\n private readonly _closeNavMenu = (): void => {\r\n if (!this.state.isOnlyMobile) {\r\n this.setState({ activeMenu: NavMenuConstants.rootMenu, mobileViewLabelText: '', isNavOpen: false });\r\n } else {\r\n this.setState({ activeMenu: undefined, mobileViewLabelText: '', isNavOpen: false });\r\n }\r\n };\r\n\r\n /**\r\n * Function to close the nav menu on esc key.\r\n * @param event - Event.\r\n */\r\n private readonly _escFunction = (event: React.KeyboardEvent) => {\r\n if (event.keyCode === this.escapeKey && !this.state.isOnlyMobile && this.state.isNavOpen) {\r\n this.setState({ activeMenu: NavMenuConstants.rootMenu, mobileViewLabelText: '', isNavOpen: false });\r\n }\r\n };\r\n\r\n /**\r\n * Custom update viewport.\r\n */\r\n private readonly _customUpdateViewport = (): void => {\r\n this.setState({ isOnlyMobile: this.isOnlyMobile });\r\n };\r\n\r\n}\r\n\r\nexport default NavigationMenuRootEnabled;\r\n","/*--------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * See License.txt in the project root for license information.\r\n *--------------------------------------------------------------*/\r\n\r\nimport { INavigationMenuViewProps } from '@msdyn365-commerce-modules/navigation-menu';\r\nimport * as React from 'react';\r\n\r\nimport { INavigationMenuProps } from '../definition-extensions/navigation-menu.ext.props.autogenerated';\r\nimport NavigationMenuRootDisabled from './components/navigation-menu-root-disabled';\r\nimport NavigationMenuRootEnabled from './components/navigation-menu-root-enabled';\r\n\r\n/**\r\n * Render the Navigation menu.\r\n * @param props - The navigation menu view props.\r\n * @returns Return HTML having INavigationMenuViewProps props with navigation menu.\r\n */\r\nconst navigationMenuView = (props: INavigationMenuViewProps & INavigationMenuProps<{}>): JSX.Element => {\r\n\r\n if (props.config.enabletopMenu) {\r\n return ;\r\n }\r\n\r\n return ;\r\n\r\n};\r\n\r\nexport default navigationMenuView;\r\n","/*!\r\n * Copyright (c) Microsoft Corporation.\r\n * All rights reserved. See LICENSE in the project root for license information.\r\n */\r\n\r\nimport * as React from 'react';\r\nimport { ICartLineCommentViewProps } from './cart-line-comment';\r\nimport { Module, Node } from '@msdyn365-commerce-modules/utilities';\r\n\r\nexport default (props: ICartLineCommentViewProps) => {\r\n const { staticDisplay, cartLineCommentModuleProps, modal } = props;\r\n return (\r\n \r\n {modal}\r\n \r\n \r\n );\r\n};\r\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { Module, Node } from '@msdyn365-commerce-modules/utilities';\nimport * as React from 'react';\n\nimport { ITabViewProps } from './tab';\n\nconst tabView: React.FC = props => {\n const { heading, TabContainer, tabHeaders, tabContents } = props;\n if (!props.heading && !props.tabHeaders && !props.tabContents) {\n props.context.telemetry.error('Tab content is empty, module wont render');\n return null;\n }\n return (\n \n {heading}\n {tabHeaders}\n {tabContents}\n \n );\n};\n\nexport default tabView;\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { Module, Node } from '@msdyn365-commerce-modules/utilities';\nimport * as React from 'react';\n\nimport { ITileListItemViewProps } from './tile-list-item';\n\n/**\n *\n * ITileListItemViewProps component.\n * @param props - Component props.\n * @returns TileListView.\n */\nconst renderTileListItemContent = (props: ITileListItemViewProps): JSX.Element => {\n const {\n heading,\n paragraph,\n backgroundImage,\n links,\n thumbnailImage,\n tileListContainer,\n tileListImageContainer,\n tileListThumbnailImageContainer,\n tileListHeadingContainer\n } = props;\n\n return (\n \n {backgroundImage}\n \n {heading}\n {paragraph}\n {links}\n \n {thumbnailImage}\n \n );\n};\n\n/**\n *\n * TileListItemViewProps component.\n * @param props - Component props.\n * @returns TileListView.\n */\nexport const TileListItemViewComponent: React.FC = props => {\n const { tileListItem } = props;\n return {renderTileListItemContent(props)};\n};\n\nexport default TileListItemViewComponent;\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport MsDyn365, { IImageData, IImageSettings, Image } from '@msdyn365-commerce/core';\nimport { ArrayExtensions, generateImageUrl } from '@msdyn365-commerce-modules/retail-actions';\nimport {\n getPayloadObject,\n getTelemetryAttributes,\n getTelemetryObject,\n IPayLoad,\n ITelemetryContent,\n Module,\n Node,\n onTelemetryClick\n} from '@msdyn365-commerce-modules/utilities';\nimport classnames from 'classnames';\nimport * as React from 'react';\n\nimport { INavigationMenuViewProps } from './navigation-menu';\nimport { IMenuItemData } from './navigation-menu.data';\n\ninterface INavigationState {\n parentMenu?: number;\n activeMenu?: number;\n categoryImage?: IImageData[] | null;\n mobileViewLabelText?: string;\n categoryImageAltText: string;\n}\n\n/**\n *\n * NavigationMenuView component.\n * @extends {React.PureComponent}\n */\nexport class NavigationMenuView extends React.PureComponent {\n private static isBackTrack: boolean = false;\n\n private currentLevel: number = 0;\n\n private readonly menuNode: React.RefObject;\n\n private readonly menuItemRef: React.RefObject;\n\n private readonly telemetryContent: ITelemetryContent;\n\n private readonly payLoad: IPayLoad;\n\n constructor(props: INavigationMenuViewProps) {\n super(props);\n this.menuNode = React.createRef();\n this.menuItemRef = React.createRef();\n this.state = { activeMenu: undefined, mobileViewLabelText: '', parentMenu: undefined, categoryImageAltText: '' };\n this._closeSubmenu = this._closeSubmenu.bind(this);\n this.telemetryContent = getTelemetryObject(\n this.props.context.request.telemetryPageName!,\n this.props.friendlyName,\n this.props.telemetry\n );\n this.payLoad = getPayloadObject('click', this.telemetryContent, '', '');\n }\n\n public componentDidMount(): void {\n if (MsDyn365.isBrowser) {\n document.body.addEventListener('mousedown', this._handleClickOutside);\n document.body.addEventListener('focusout', this._handleFocusOutside);\n }\n }\n\n public componentDidUpdate(): void {\n if (this.menuItemRef.current?.children[0] && this.props.isMobileView) {\n (this.menuItemRef.current.children[0] as HTMLElement).focus();\n }\n }\n\n public componentWillUnmount(): void {\n if (MsDyn365.isBrowser) {\n document.body.removeEventListener('mousedown', this._handleClickOutside, false);\n document.body.removeEventListener('focusout', this._handleFocusOutside, false);\n }\n }\n\n public render(): JSX.Element | null {\n const { isMobileView, MenuList, MobileBackButton, MobileDescriptionContainer, MobileDescriptionLabel, Navigation } = this.props;\n\n this.currentLevel = 1;\n return (\n \n \n {isMobileView && this.state.activeMenu !== undefined && (\n \n \n {this.state.mobileViewLabelText}\n \n )}\n {this._renderDisplay()}\n \n \n );\n }\n\n private _renderDisplay(): JSX.Element[] {\n const { ListItem, menuItemData, isMobileView } = this.props;\n const { activeMenu } = this.state;\n const menuItemList: JSX.Element[] = [];\n\n if (isMobileView && activeMenu !== undefined && menuItemData.length > 0) {\n let menuItem: IMenuItemData = {};\n for (const menuItemDatum of menuItemData) {\n if (menuItemDatum && menuItemDatum.id === activeMenu) {\n menuItem = menuItemDatum;\n !NavigationMenuView.isBackTrack\n ? this.setState({ parentMenu: undefined })\n : this.setState({ parentMenu: undefined, mobileViewLabelText: menuItemDatum.linkText });\n break;\n }\n menuItem = this._getFromSubMenu(menuItemDatum) as IMenuItemData;\n if (menuItem && menuItem.id === activeMenu) {\n break;\n }\n }\n\n menuItem &&\n menuItemList.push(\n \n {' '}\n {this._createMenuItemList(menuItem)}{' '}\n \n );\n } else {\n menuItemData.forEach((item: IMenuItemData, index: number) => {\n menuItemList.push(\n \n {this._createMenuItemList(item)}\n \n );\n });\n }\n\n return menuItemList;\n }\n\n private _getFromSubMenu(item?: IMenuItemData): IMenuItemData | null {\n const subMenus = item && item.subMenu;\n if (subMenus && subMenus.length > 0) {\n for (let i = 0; i <= subMenus.length - 1; i++) {\n if (subMenus[i].id === this.state.activeMenu) {\n !NavigationMenuView.isBackTrack\n ? this.setState({ parentMenu: item?.id })\n : this.setState({ parentMenu: item && item.id, mobileViewLabelText: subMenus[i].linkText });\n return subMenus[i];\n }\n const found = this._getFromSubMenu(subMenus[i]);\n if (found) {\n return found;\n }\n }\n }\n this.props.context.telemetry.error('Submenu content is empty, module wont render.');\n return null;\n }\n\n private _createMenuItemList(menuItemData: IMenuItemData): JSX.Element | null {\n if (menuItemData && menuItemData.subMenu && menuItemData.subMenu.length > 0) {\n if (this.props.isMobileView && this.state.activeMenu !== undefined) {\n return this._renderSubMenu(menuItemData.subMenu, menuItemData.id, false);\n }\n return (\n <>\n {this._renderButtonMenuItem(menuItemData)}\n {this._renderSubMenu(menuItemData.subMenu, menuItemData.id, false)}\n \n );\n } else if (menuItemData && menuItemData.linkText && menuItemData.linkURL && menuItemData.linkURL.length > 0) {\n return this._renderLinkMenuItem(menuItemData, menuItemData.id, false, true);\n } else if (menuItemData && menuItemData.linkText && !menuItemData.linkURL) {\n return this._renderSpanMenuItem(menuItemData, menuItemData.id, true);\n }\n this.props.context.telemetry.error('Navigation menu content is empty, module wont render.');\n return null;\n }\n\n private _renderSubMenu(subMenus?: IMenuItemData[], activeMenu?: number, IsSubMenu?: boolean): JSX.Element | null {\n const { isMobileView, ListItem } = this.props;\n const enableMultiSupportMenu = this.props.config.enableMultilevelMenu || false;\n const multiLevelSupportedMenu = this.props.config.menuLevelSupport || 3;\n\n // Const isParentMenu:boolean= false;\n if (activeMenu && this.state.activeMenu !== activeMenu) {\n this.props.context.telemetry.error('Navigation Active menu content is empty, module wont render.');\n return null;\n }\n\n if (!subMenus || subMenus.length === 0) {\n this.props.context.telemetry.error('Navigation Submenu content is empty, module wont render.');\n return null;\n }\n\n let levelClassName: string = '';\n const menuOptions =\n subMenus &&\n subMenus.map((option: IMenuItemData, idx: number) => {\n const hasOptions = option.subMenu && option.subMenu.length > 0;\n let menuItem: JSX.Element | null;\n if (hasOptions && isMobileView) {\n menuItem = this._renderButtonMenuItem(option, activeMenu, idx);\n } else {\n menuItem = option.linkURL ? this._renderLinkMenuItem(option, idx) : this._renderSpanMenuItem(option);\n }\n\n let subMenu;\n const haveSubmenu = hasOptions && enableMultiSupportMenu && this.currentLevel <= Math.round(multiLevelSupportedMenu) - 1;\n if (haveSubmenu) {\n this.currentLevel++;\n levelClassName = enableMultiSupportMenu ? `level-${this.currentLevel.toString()}` : '';\n subMenu = this._renderSubMenu(option.subMenu, isMobileView ? option.id : undefined, true);\n }\n return (\n \n {menuItem}\n {subMenu}\n \n );\n });\n return this._renderMenu(levelClassName, menuOptions, activeMenu, IsSubMenu);\n }\n\n private _renderButtonMenuItem(option: IMenuItemData, activeMenu?: number, index?: number): JSX.Element | null {\n const { Button } = this.props;\n return (\n \n {option.linkText}\n \n );\n }\n\n private _renderLinkMenuItem(\n option: IMenuItemData,\n index?: number,\n hoverEffect: boolean = true,\n isParent: boolean = false\n ): JSX.Element | null {\n const { Link } = this.props;\n const linkText = option.linkText ? option.linkText : '';\n const imagesource = option.imageSource ? option.imageSource : '';\n this.payLoad.contentAction.etext = linkText;\n const attributes = getTelemetryAttributes(this.telemetryContent, this.payLoad);\n return (\n \n {option.linkText}\n \n );\n }\n\n private _renderPromotionalLink(linkText?: string, linkUrl?: string): JSX.Element | null {\n const { Link } = this.props;\n this.payLoad.contentAction.etext = linkText;\n const attributes = getTelemetryAttributes(this.telemetryContent, this.payLoad);\n if (linkText && linkUrl) {\n return (\n \n {linkText}\n \n );\n }\n return null;\n }\n\n private _renderSpanMenuItem(option: IMenuItemData, index?: number, isParent: boolean = false): JSX.Element | null {\n const { Span } = this.props;\n return (\n \n {option.linkText}\n \n );\n }\n\n private _renderMenu(level: string, menuOptions: JSX.Element[], currentItem?: number, submenu?: boolean): JSX.Element | null {\n const { DivContainer, MenuList, ImageDivContainer, showCategoryImage, showPromotionalContent, isMobileView } = this.props;\n const categoryImageDisplay =\n !isMobileView &&\n (showCategoryImage || showPromotionalContent) &&\n !ArrayExtensions.hasElements(this.state.categoryImage) &&\n !submenu;\n const promotionalContentDisplay =\n !isMobileView && showPromotionalContent && ArrayExtensions.hasElements(this.state.categoryImage) && !submenu;\n const DivContainerClass = this.currentLevel > 2 || categoryImageDisplay ? DivContainer!.className : 'ms-nav__deafult';\n this.currentLevel = 1;\n return (\n \n 2 &&\n 'navmenu-multi-level'\n )}\n >\n {menuOptions}\n \n {categoryImageDisplay &&\n this.state.categoryImage &&\n this.state.categoryImage.map(item => (\n \n {this.state.categoryImage && this._getCategoryImage(item)}\n {promotionalContentDisplay && this._renderPromotionalLink(item.altText, item.additionalProperties?.linkUrl)}\n \n ))}\n \n );\n }\n\n private readonly _updateCategoryImage = (categoryImageSrc: string, option: IMenuItemData) => () => {\n const linkText = option && option.linkText ? option.linkText : '';\n const promotionalImage: IImageData[] = [{ src: categoryImageSrc, altText: linkText }];\n\n // Read category and promotional image in one array\n if (ArrayExtensions.hasElements(option.promotionalContent)) {\n option.promotionalContent.map(item => {\n if (item && item.image) {\n const imageSrc = item.image.src;\n const promotionalItemImageSettings = item.image.imageSettings;\n promotionalImage.push({\n src: imageSrc,\n altText: item.text,\n imageSettings: promotionalItemImageSettings,\n additionalProperties: { linkUrl: item.linkUrl.destinationUrl }\n });\n }\n });\n }\n this.setState({\n categoryImage: promotionalImage.length > 0 ? promotionalImage : [{ src: 'empty' }],\n categoryImageAltText: linkText\n });\n };\n\n private readonly _handleDropdownToggle = (data: IMenuItemData, parentId?: number) => () => {\n if (!this.props.isMobileView) {\n this.setState({\n activeMenu: this.state.activeMenu && this.state.activeMenu === data.id! ? undefined : data.id!,\n parentMenu: parentId\n });\n if (this.props.showCategoryImage) {\n this._updateCategoryImage(data.imageSource!, data)();\n }\n } else {\n NavigationMenuView.isBackTrack = false;\n this.setState({\n activeMenu: data.id,\n mobileViewLabelText: data.linkText!,\n parentMenu: parentId\n });\n }\n };\n\n private readonly _handleGoBack = () => () => {\n NavigationMenuView.isBackTrack = true;\n this.setState({ activeMenu: this.state.parentMenu });\n };\n\n /**\n * Method to handle click outside of menu.\n * @param event -HTML event.\n */\n private readonly _handleClickOutside = (event: MouseEvent) => {\n if (this.menuNode.current && !this.menuNode.current.contains(event.target as Node)) {\n this.setState({\n activeMenu: undefined,\n mobileViewLabelText: '',\n categoryImage: null\n });\n }\n };\n\n /**\n * Method to handle click outside of menu.\n * @param event -HTML event.\n */\n private readonly _handleFocusOutside = (event: FocusEvent) => {\n if (this.menuNode.current && !this.menuNode.current.contains(event.relatedTarget as Node)) {\n this._closeSubmenu();\n }\n };\n\n /**\n * Checks to assign a ref for focus.\n * @param index -Sub menu list index.\n * @param mobileViewLabelText -Parent user clicked Sub menu list.\n * @param optionLinkText -Sub menu list.\n * @returns Ref.\n */\n private readonly _shouldAddFocusMenuRef = (index: number, mobileViewLabelText?: string, optionLinkText?: string) => {\n if (!NavigationMenuView.isBackTrack && index === 0) {\n return true;\n }\n if (!optionLinkText || !mobileViewLabelText) {\n return false;\n }\n return mobileViewLabelText === optionLinkText;\n };\n\n private _closeSubmenu(): void {\n if (!this.props.isMobileView) {\n this.setState({ activeMenu: undefined, categoryImage: null, mobileViewLabelText: '' });\n }\n }\n\n private readonly _getCategoryImage = (categoryImage?: IImageData): React.ReactNode | null => {\n if (!categoryImage || !categoryImage.src) {\n return null;\n }\n\n const categoryImageUrl = generateImageUrl(`${categoryImage.src}`, this.props.context.actionContext.requestContext.apiSettings);\n const defaultImageSettings: IImageSettings = {\n viewports: {\n xs: { q: 'w=300&h=250&m=8', w: 0, h: 0 },\n sm: { q: 'w=300&h=250&m=8', w: 0, h: 0 },\n md: { q: 'w=300&h=250&m=8', w: 0, h: 0 },\n lg: { q: 'w=300&h=250&m=8', w: 0, h: 0 }\n },\n lazyload: true\n };\n if (categoryImageUrl !== undefined) {\n return (\n \n );\n }\n return null;\n };\n}\n\nexport default NavigationMenuView;\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport * as Msdyn365 from '@msdyn365-commerce/core';\nimport { ArrayExtensions } from '@msdyn365-commerce-modules/retail-actions';\nimport { getPayloadObject, getTelemetryAttributes, ITelemetryContent, onTelemetryClick } from '@msdyn365-commerce-modules/utilities';\nimport * as React from 'react';\n\nimport { ILinksData } from '../tile-list-item.props.autogenerated';\n\n/**\n * Tile List links.\n */\nexport interface ITileListLinks {\n links: ILinksData[];\n requestContext: Msdyn365.IRequestContext;\n telemetryContent: ITelemetryContent;\n onTextChange?(index: number): (event: Msdyn365.ContentEditableEvent) => void;\n}\n\n/**\n *\n * ITileListLinks component.\n * @extends {React.PureComponent}\n */\nexport class TileListLinks extends React.PureComponent {\n public render(): JSX.Element {\n const editableLinks = this._mapEditableLinks(this.props.links);\n return (\n
\n {editableLinks && ArrayExtensions.hasElements(editableLinks) ? (\n \n ) : null}\n
\n );\n }\n\n /**\n * ITileListLinks component.\n * @param linkdata - Link data.\n * @returns Editable links.\n */\n private readonly _mapEditableLinks = (linkdata: ILinksData[]): Msdyn365.ILinksData[] | null => {\n if (!ArrayExtensions.hasElements(linkdata)) {\n return null;\n }\n const editableLinks: Msdyn365.ILinksData[] = [];\n for (const link of linkdata) {\n // Construct telemetry attribute to render\n const payLoad = getPayloadObject('click', this.props.telemetryContent, '', '');\n const linkText = link.linkText ? link.linkText : '';\n payLoad.contentAction.etext = linkText;\n const attributes = getTelemetryAttributes(this.props.telemetryContent, payLoad);\n const editableLink: Msdyn365.ILinksData = {\n ariaLabel: link.ariaLabel,\n className: 'ms-tile-list__link',\n linkText: link.linkText,\n linkUrl: link.linkUrl.destinationUrl,\n openInNewTab: link.openInNewTab,\n role: 'button',\n additionalProperties: attributes,\n onClick: onTelemetryClick(this.props.telemetryContent, payLoad, linkText)\n };\n editableLinks.push(editableLink);\n }\n\n return editableLinks;\n };\n}\nexport default TileListLinks;\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport * as Msdyn365 from '@msdyn365-commerce/core';\nimport { ArrayExtensions, StringExtensions } from '@msdyn365-commerce-modules/retail-actions';\nimport { getTelemetryObject, IModuleProps, INodeProps, ITelemetryContent, NodeTag } from '@msdyn365-commerce-modules/utilities';\nimport * as React from 'react';\n\nimport { TileListLinks } from './components';\nimport { IHeadingData, ITileListItemProps } from './tile-list-item.props.autogenerated';\n\n/**\n * Tile-list-item view props.\n */\nexport interface ITileListItemViewProps extends ITileListItemProps<{}> {\n heading?: React.ReactNode;\n paragraph?: React.ReactNode;\n links?: React.ReactNode;\n backgroundImage?: React.ReactNode;\n thumbnailImage?: React.ReactNode;\n tileListItem: IModuleProps;\n tileListContainer: INodeProps;\n tileListImageContainer: INodeProps;\n tileListThumbnailImageContainer: INodeProps;\n tileListHeadingContainer: INodeProps;\n}\n\n/**\n *\n * TileListItem component.\n * @extends {React.PureComponent>}\n */\nexport class TileListItem extends React.PureComponent> {\n private readonly _telemetryContent: ITelemetryContent = getTelemetryObject(\n this.props.context.request.telemetryPageName!,\n this.props.friendlyName,\n this.props.telemetry\n );\n\n public constructor(props: ITileListItemProps<{}>) {\n super(props);\n }\n\n public render(): JSX.Element {\n const { heading, paragraph, backgroundImage, thumbnailImage, redirectionUrl, links } = this.props.config;\n const tileListLinks = links && ArrayExtensions.hasElements(links) && (\n \n );\n const tileListLinkContainer = {\n tag: 'a' as NodeTag,\n className: 'ms-tile-list-container',\n role: 'link',\n href: redirectionUrl?.linkUrl.destinationUrl,\n 'aria-label': redirectionUrl?.ariaLabel\n };\n\n const tileListButtonContainer = {\n tag: 'button' as NodeTag,\n className: 'ms-tile-list-container'\n };\n const viewProps: ITileListItemViewProps = {\n ...this.props,\n heading: this._createHeading(heading),\n paragraph: this._createParagraph(paragraph),\n backgroundImage: this._renderBackgroundImage(backgroundImage),\n thumbnailImage: this._renderThumbnailImage(thumbnailImage),\n links: tileListLinks,\n tileListItem: {\n moduleProps: this.props,\n className: ''\n },\n tileListContainer: redirectionUrl ? tileListLinkContainer : tileListButtonContainer,\n tileListImageContainer: {\n className: 'ms-tile-list__image'\n },\n tileListThumbnailImageContainer: {\n className: 'ms-tile-list__thumbnail_image',\n 'aria-hidden': 'true'\n },\n tileListHeadingContainer: {\n className: 'ms-tile-list__heading'\n }\n };\n\n return this.props.renderView(viewProps) as React.ReactElement;\n }\n\n /**\n * Handles heading content change event.\n * @param event - Content editable event.\n */\n public handleHeadingChange = (event: Msdyn365.ContentEditableEvent): void => {\n this.props.config.heading!.text = event.target.value;\n };\n\n /**\n * Handles paragraph content change event.\n * @param event - Content editable event.\n */\n public handleParagraphChange = (event: Msdyn365.ContentEditableEvent): void => {\n this.props.config.paragraph = event.target.value;\n };\n\n /**\n * Handles paragraph content change event.\n * @param linkIndex - Index of link in linkarray.\n * @returns Void.\n */\n public handleLinkTextChange = (linkIndex: number) => (event: Msdyn365.ContentEditableEvent): void => {\n if (this.props.config.links?.[Number(linkIndex)]) {\n this.props.config.links[Number(linkIndex)].linkText = event.target.value;\n }\n };\n\n private _createParagraph(text?: Msdyn365.RichText): React.ReactNode | null {\n if (!text) {\n return null;\n }\n return (\n \n );\n }\n\n private _createHeading(heading?: IHeadingData): React.ReactNode | null {\n if (!heading) {\n return null;\n }\n if (StringExtensions.isNullOrWhitespace(heading.text)) {\n return null;\n }\n\n return (\n \n );\n }\n\n private _renderBackgroundImage(item?: Msdyn365.IImageData, isAriaHiddenAttribute?: boolean): React.ReactNode | null {\n // If image is null, we want to render the placeholder SVG - by passing image data with empty src\n\n const defaultImageSettings: Msdyn365.IImageSettings = {\n viewports: {\n xs: { q: 'w=328&h=412&m=6', w: 328, h: 412 },\n sm: { q: 'w=328&h=412&m=6', w: 328, h: 412 },\n md: { q: 'w=315&h=412&m=6', w: 315, h: 412 },\n lg: { q: 'w=315&h=412&m=6', w: 315, h: 412 },\n xl: { q: 'w=315&h=412&m=6', w: 315, h: 412 }\n },\n lazyload: true\n };\n const verifiedImageSettings = item?.imageSettings?.viewports ? item.imageSettings : defaultImageSettings;\n\n return (\n \n );\n }\n\n private _renderThumbnailImage(\n item?: Msdyn365.IImageData,\n itemImageSettings?: Msdyn365.IImageSettings,\n isAriaHiddenAttribute?: boolean\n ): React.ReactNode | null {\n if (!item) {\n return null;\n }\n if (StringExtensions.isNullOrWhitespace(item.src)) {\n return null;\n }\n\n return (\n \n );\n }\n}\n\nexport default TileListItem;\n","/*!\r\n * Copyright (c) Microsoft Corporation.\r\n * All rights reserved. See LICENSE in the project root for license information.\r\n */\r\n\r\nimport * as React from 'react';\r\n\r\nimport { ICartLineCommentData } from './cart-line-comment.data';\r\nimport { ICartLineCommentProps } from './cart-line-comment.props.autogenerated';\r\nimport { Button, IModuleProps, INodeProps, Modal, ModalFooter, ModalHeader } from '@msdyn365-commerce-modules/utilities';\r\nimport classnames from 'classnames';\r\n\r\nexport interface ICartLineCommentViewProps extends ICartLineCommentProps {\r\n staticDisplay: INodeProps;\r\n cartLineCommentModuleProps: IModuleProps;\r\n modal: React.ReactNode;\r\n}\r\n\r\ninterface ICartLineCommentExtendedProps extends ICartLineCommentProps {\r\n comment: string;\r\n cartLineId: string;\r\n cartProductTitle: string;\r\n}\r\n\r\ninterface ICartLineCommentState {\r\n comment: string;\r\n isCommentAreaActive: boolean;\r\n}\r\n/**\r\n *\r\n * CartLineComment component\r\n * @extends {React.PureComponent>}\r\n */\r\nclass CartLineComment extends React.PureComponent {\r\n private _className = 'gar-cart-comment';\r\n constructor(props: ICartLineCommentExtendedProps) {\r\n super(props);\r\n this.state = {\r\n comment: props.comment,\r\n isCommentAreaActive: false\r\n };\r\n }\r\n\r\n /**\r\n * Saves cart comment\r\n * Method must call updateCartLineQuantity on the cart state because\r\n * updateCart does not update the cart line comment. Calling the other method with an additional\r\n * parameter for the comment successfully updates the comment\r\n */\r\n private _updateCartLineComment = async (): Promise => {\r\n const cartState = this.props.data.cart.result;\r\n if (!cartState) {\r\n return;\r\n }\r\n const dummyCart = { ...cartState.cart };\r\n const cartLineToUpdate = dummyCart.CartLines?.find(cl => cl.LineId === this.props.cartLineId);\r\n if (cartLineToUpdate) {\r\n cartLineToUpdate.Comment = this.state.comment;\r\n }\r\n await cartState.updateCartLineQuantity({\r\n cartLineId: this.props.cartLineId,\r\n newQuantity: cartLineToUpdate?.Quantity!,\r\n additionalProperties: { Comment: this.state.comment }\r\n });\r\n\r\n this.setState({ isCommentAreaActive: false });\r\n };\r\n\r\n /**\r\n * Updates the comment in state\r\n * @param event new comment from event\r\n */\r\n private _updateCommentState = (event: React.ChangeEvent): void => {\r\n this.setState({ comment: event.target.value });\r\n };\r\n /**\r\n * Resets Cart Comment\r\n */\r\n private _resetCommentToProps = (): void => {\r\n this.setState({ comment: this.props.comment, isCommentAreaActive: false });\r\n };\r\n\r\n /**\r\n * Toggles the isCommentAreaActive state property\r\n */\r\n private _toggleCommentAreaActive = () =>\r\n this.setState(prevState => {\r\n return {\r\n isCommentAreaActive: !prevState.isCommentAreaActive\r\n };\r\n });\r\n\r\n /**\r\n * Renders the static comment display for when the isCommentAreaActive state param is false\r\n * @return React.ReactNode\r\n */\r\n private _renderStaticCommentDisplay = (): React.ReactNode => {\r\n const {\r\n resources: { commentLinkText, editLinkText }\r\n } = this.props;\r\n if (!this.props.comment) {\r\n return this._renderCommentLink(commentLinkText);\r\n } else {\r\n return (\r\n \r\n

{this._getCommentPreview()}

\r\n {this._renderCommentLink(editLinkText)}\r\n
\r\n );\r\n }\r\n };\r\n\r\n private _getCommentPreview = (): string => {\r\n const { comment } = this.props;\r\n if (comment.length > 50) {\r\n return `${comment.substring(0, 50)}...`;\r\n } else {\r\n return comment;\r\n }\r\n };\r\n\r\n /**\r\n * Renders a comment link which toggles the active area state\r\n * @param linkText text for the link\r\n */\r\n private _renderCommentLink = (linkText: string): React.ReactNode => (\r\n \r\n {linkText}\r\n \r\n );\r\n\r\n /**\r\n * Renders a button to save comments to the cartlines\r\n * @return React.ReactNode\r\n */\r\n private _renderSaveButton = (): React.ReactNode => {\r\n const {\r\n resources: { saveButtonText }\r\n } = this.props;\r\n return (\r\n \r\n );\r\n };\r\n\r\n /**\r\n * Renders a button to cancel the comment entry and set the state to default\r\n * @return React.ReactNode\r\n */\r\n private _renderCancelButton = (): React.ReactNode => {\r\n const {\r\n resources: { cancelButtonText }\r\n } = this.props;\r\n return (\r\n \r\n );\r\n };\r\n\r\n /**\r\n * Renders the text area for inputting comments\r\n */\r\n private _renderTextArea = (): React.ReactNode => {\r\n const {\r\n resources: { textAreaLabel }\r\n } = this.props;\r\n const { comment } = this.state;\r\n return (\r\n
\r\n \r\n \r\n
\r\n );\r\n };\r\n /**\r\n * Renders the button area\r\n */\r\n private _renderButtonArea = (): React.ReactNode => (\r\n
\r\n {this._renderSaveButton()}\r\n {this._renderCancelButton()}\r\n
\r\n );\r\n\r\n private _renderModal = () => {\r\n return (\r\n \r\n {this._getModalTitle()}\r\n {this._renderTextArea()}\r\n {this._renderButtonArea()}\r\n \r\n );\r\n };\r\n\r\n /**\r\n * Gets ID for the text field\r\n */\r\n private _getFieldId = (): string => `${this.props.cartLineId}__commentInput`;\r\n\r\n /**\r\n * Gets the title for the comment modal\r\n */\r\n private _getModalTitle = (): string => {\r\n const {\r\n resources: { commentModalTitle }\r\n } = this.props;\r\n\r\n return commentModalTitle.replace('{0}', this.props.cartProductTitle);\r\n };\r\n\r\n public render(): JSX.Element | null {\r\n const {\r\n config: { className }\r\n } = this.props;\r\n const viewProps: ICartLineCommentViewProps = {\r\n ...this.props,\r\n staticDisplay: {\r\n tag: 'div',\r\n className: `${this._className}__static-display`,\r\n children: this._renderStaticCommentDisplay()\r\n },\r\n cartLineCommentModuleProps: {\r\n className: classnames(className, this._className),\r\n tag: 'div',\r\n moduleProps: { ...this.props }\r\n },\r\n modal: this._renderModal()\r\n };\r\n return this.props.renderView(viewProps);\r\n }\r\n}\r\n\r\nexport default CartLineComment;\r\n"],"sourceRoot":""}