{"version":3,"file":"static/js/5e0d59032f7150004868.bundle.js","mappings":"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","sources":["webpack://Dobbies.Commerce/./src/modules/dobbies-navigation-menu/dobbies-navigation-menu.props.autogenerated.ts?e6d2","webpack://Dobbies.Commerce/./src/modules/dobbies-navigation-menu/dobbies-navigation-menu.tsx?204b","webpack://Dobbies.Commerce/./src/modules/dobbies-navigation-menu/dobbies-navigation-menu.view.tsx?6d0b","webpack://Dobbies.Commerce/./lib/dobbies-navigation-menu/module-registration.js?0f33","webpack://Dobbies.Commerce/external var \"React\"?0d3b","webpack://Dobbies.Commerce/external var \"ReactDOM\"?853b"],"sourcesContent":["/**\r\n * Copyright (c) Microsoft Corporation\r\n * All rights reserved. See License.txt in the project root for license information.\r\n * IDobbiesNavigationMenu contentModule Interface Properties\r\n * THIS FILE IS AUTO-GENERATED - MANUAL MODIFICATIONS WILL BE LOST\r\n */\r\n\r\nimport * as Msdyn365 from '@msdyn365-commerce/core';\r\nimport * as React from 'react';\r\n\r\nexport const enum navigationMenuSource {\r\n all = 'all',\r\n retailServerOnly = 'retailServerOnly',\r\n cmsOnly = 'cmsOnly'\r\n}\r\n\r\nexport interface IDobbiesNavigationMenuConfig extends Msdyn365.IModuleConfig {\r\n navigationMenuSource?: navigationMenuSource;\r\n cmsNavItems?: ICmsNavItemsData[];\r\n enableMultilevelMenu?: boolean;\r\n enabletopMenu?: boolean;\r\n menuLevelSupport?: number;\r\n rootMenuNavigation?: string;\r\n displayCategoryImage?: boolean;\r\n displayPromotionalImage?: boolean;\r\n categoryPromotionalContent?: ICategoryPromotionalContentData[];\r\n categoryImageSettings?: Msdyn365.IImageSettings;\r\n className?: string;\r\n clientRender?: boolean;\r\n cmsNavItemsNew?: ICmsNavItemsNewData[];\r\n hideMenuItemPrefix?: string;\r\n menuImagesSchedule?: IMenuImagesScheduleData[];\r\n removeExtraSubMenusOnMobile?: string[];\r\n subMenuStaticMenus?: ISubMenuStaticMenusData[];\r\n menuHeading?: string;\r\n dobbiesClubNavItemText?: string;\r\n clubFreeTierText?: string;\r\n clubPlusTierText?: string;\r\n showOptionAll?: boolean;\r\n imageSettings?: IImageSettingsData[];\r\n categoryImageLinks?: ICategoryImageLinksData[];\r\n}\r\n\r\nexport interface IDobbiesNavigationMenuResources {\r\n menuAriaLabel: string;\r\n backButtonAriaLabel: string;\r\n allCategoryMenuText: string;\r\n}\r\n\r\nexport interface ICmsNavItemsData {\r\n linkText?: string;\r\n linkUrl?: Msdyn365.ILinkData;\r\n image?: Msdyn365.IImageData;\r\n imageLink?: Msdyn365.ILinkData;\r\n ariaLabel?: string;\r\n openInNewTab?: boolean;\r\n subMenus?: ISubMenusData[];\r\n}\r\n\r\nexport interface ICategoryPromotionalContentData {\r\n categoryName?: string;\r\n image: Msdyn365.IImageData;\r\n text?: string;\r\n linkUrl: Msdyn365.ILinkData;\r\n}\r\n\r\nexport interface ICmsNavItemsNewData {\r\n linkText?: string;\r\n linkUrl?: Msdyn365.ILinkData;\r\n image?: Msdyn365.IImageData;\r\n imageLink?: Msdyn365.ILinkData;\r\n ariaLabel?: string;\r\n openInNewTab?: boolean;\r\n subMenus?: ISubMenusData[];\r\n}\r\n\r\nexport interface IMenuImagesScheduleData {\r\n menuName: string;\r\n menuImageName: string;\r\n imageShowStartDate: string;\r\n imageShowEndDate: string;\r\n imageUrl?: string;\r\n}\r\n\r\nexport interface ISubMenuStaticMenusData {\r\n linkText?: string;\r\n linkUrl?: Msdyn365.ILinkData;\r\n image?: Msdyn365.IImageData;\r\n imageLink?: Msdyn365.ILinkData;\r\n ariaLabel?: string;\r\n openInNewTab?: boolean;\r\n subMenus?: ISubMenusData[];\r\n}\r\n\r\nexport interface IImageSettingsData {\r\n width?: number;\r\n height?: number;\r\n}\r\n\r\nexport interface ICategoryImageLinksData {\r\n categoryName?: string;\r\n categoryImageLink?: Msdyn365.ILinkData;\r\n}\r\n\r\nexport interface ISubMenusData {\r\n linkText?: string;\r\n linkUrl: Msdyn365.ILinkData;\r\n ariaLabel?: string;\r\n image?: Msdyn365.IImageData;\r\n imageLink?: Msdyn365.ILinkData;\r\n subMenus?: ISubMenusData[];\r\n}\r\n\r\nexport interface ISubMenusData {\r\n linkText?: string;\r\n linkUrl: Msdyn365.ILinkData;\r\n ariaLabel?: string;\r\n image?: Msdyn365.IImageData;\r\n imageLink?: Msdyn365.ILinkData;\r\n subMenus?: ISubMenusData[];\r\n}\r\n\r\nexport interface ISubMenusData {\r\n linkText?: string;\r\n linkUrl: Msdyn365.ILinkData;\r\n ariaLabel?: string;\r\n image?: Msdyn365.IImageData;\r\n imageLink?: Msdyn365.ILinkData;\r\n subMenus?: ISubMenusData[];\r\n}\r\n\r\nexport interface ISubMenusData {\r\n linkText?: string;\r\n linkUrl: Msdyn365.ILinkData;\r\n ariaLabel?: string;\r\n image?: Msdyn365.IImageData;\r\n imageLink?: Msdyn365.ILinkData;\r\n}\r\n\r\nexport interface ISubMenusData {\r\n linkText?: string;\r\n linkUrl: Msdyn365.ILinkData;\r\n ariaLabel?: string;\r\n image?: Msdyn365.IImageData;\r\n imageLink?: Msdyn365.ILinkData;\r\n}\r\n\r\nexport interface ISubMenusData {\r\n linkText?: string;\r\n linkUrl: Msdyn365.ILinkData;\r\n ariaLabel?: string;\r\n image?: Msdyn365.IImageData;\r\n imageLink?: Msdyn365.ILinkData;\r\n}\r\n\r\nexport interface IDobbiesNavigationMenuProps extends Msdyn365.IModule {\r\n resources: IDobbiesNavigationMenuResources;\r\n config: IDobbiesNavigationMenuConfig;\r\n slots: {\r\n search: React.ReactNode[];\r\n };\r\n}\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\n/* eslint-disable no-duplicate-imports */\r\nimport { CategoryHierarchy } from '@msdyn365-commerce/commerce-entities';\r\nimport MsDyn365, { IActionContext, IGridSettings, IImageSettings, isEmptyOrNullObject } from '@msdyn365-commerce/core';\r\nimport { TextValueTranslation } from '@msdyn365-commerce/retail-proxy';\r\nimport { getCategoryUrl } from '@msdyn365-commerce-modules/retail-actions';\r\nimport { addThrottledEvent, IModuleProps, INodeProps } from '@msdyn365-commerce-modules/utilities';\r\nimport classnames from 'classnames';\r\nimport { computed, observable } from 'mobx';\r\nimport * as React from 'react';\r\nimport NavigationMenuView from './dobbies-navigation-menu.view';\r\n\r\nimport { IMenuItemData, IDobbiesNavigationMenuData } from './dobbies-navigation-menu.data';\r\nimport {\r\n ICmsNavItemsData,\r\n IDobbiesNavigationMenuProps,\r\n ISubMenusData,\r\n navigationMenuSource\r\n} from './dobbies-navigation-menu.props.autogenerated';\r\n\r\nexport interface INavigationMenuViewProps extends IDobbiesNavigationMenuProps {\r\n className: string;\r\n menuItemData: IMenuItemData[];\r\n Navigation: IModuleProps;\r\n MenuList: INodeProps;\r\n ListItem: INodeProps;\r\n Link: INodeProps;\r\n Button: INodeProps;\r\n Span: INodeProps;\r\n ImageContainer: INodeProps;\r\n MobileDescriptionContainer: INodeProps;\r\n MobileBackButton: INodeProps;\r\n MobileDescriptionLabel: INodeProps;\r\n imageSettings: IImageSettings;\r\n gridSettings: IGridSettings;\r\n isMobileView: boolean;\r\n DivContainer?: INodeProps;\r\n ImageDivContainer?: INodeProps;\r\n showCategoryImage?: boolean;\r\n showPromotionalContent?: boolean;\r\n}\r\n\r\nexport type GridSize = 'xs' | 'sm' | 'md' | 'lg' | 'xl';\r\n\r\nexport interface INavigationMenuState {\r\n isMobile: boolean;\r\n navWidthStandard?: number;\r\n navLeftPadding?: number;\r\n navRightPadding?: number;\r\n navMarginLeft?: number;\r\n navMarginRight?: number;\r\n}\r\n\r\n/**\r\n *\r\n * NavigationMenu component.\r\n * @extends {React.PureComponent>}\r\n */\r\nclass NavigationMenu extends React.PureComponent, INavigationMenuState> {\r\n // private static CMSItemIdInit: number = MenuTypeIndexId.Cms;\r\n\r\n // private static RSItemIdInit: number = MenuTypeIndexId.Retail;\r\n\r\n private resizeThrottledEventHandler?: (event: Event) => void;\r\n\r\n private menuItemList: IMenuItemData[];\r\n\r\n private isRetail: boolean = true;\r\n\r\n private isCMS: boolean = true;\r\n\r\n // private lastKnownNavHeight: number = 0;\r\n\r\n @observable\r\n private viewport: GridSize;\r\n\r\n public static getFriendlyName(locale: string, nameTranslations?: TextValueTranslation[]): string | undefined {\r\n let nameTranslation: TextValueTranslation | undefined;\r\n if (locale && nameTranslations && nameTranslations.length > 0) {\r\n nameTranslation = nameTranslations.find(item => item.Language!.toLowerCase() === locale.toLowerCase());\r\n }\r\n\r\n return nameTranslation && nameTranslation.Text;\r\n }\r\n\r\n constructor(props: IDobbiesNavigationMenuProps) {\r\n super(props);\r\n this._updateViewport = this._updateViewport.bind(this);\r\n this.viewport =\r\n props.context.request && props.context.request.device && props.context.request.device.Type === 'Mobile' ? 'xs' : 'lg';\r\n this._setNavigationSource(this.props.config && this.props.config.navigationMenuSource);\r\n this.state = { isMobile: this.isMobile };\r\n this.menuItemList = [];\r\n }\r\n\r\n @computed get isMobile(): boolean {\r\n return this.viewport === 'xs' || this.viewport === 'sm' || this.isNavOutOfBounds();\r\n }\r\n\r\n public componentDidMount(): void {\r\n if (MsDyn365.isBrowser) {\r\n this.resizeThrottledEventHandler = addThrottledEvent(window, 'resize', this._updateViewport as EventListener);\r\n }\r\n this._updateViewport();\r\n }\r\n\r\n public componentWillUnmount(): void {\r\n if (MsDyn365.isBrowser) {\r\n window.removeEventListener('resize', this.resizeThrottledEventHandler!, false);\r\n }\r\n }\r\n\r\n public render(): JSX.Element | null {\r\n this.menuItemList = this._mapData();\r\n if (!this.state.navWidthStandard && !this.state.isMobile) {\r\n this.setNavWidthStandard();\r\n }\r\n if (isEmptyOrNullObject(this.props.data)) {\r\n this.props.telemetry.error('Navigatiomenu returned null');\r\n return null;\r\n }\r\n const defaultImageSettings: IImageSettings = {\r\n viewports: {\r\n xs: { q: 'w=224&h=300&m=6', w: 0, h: 0 },\r\n xl: { q: 'w=224&h=300&m=6', w: 0, h: 0 }\r\n },\r\n lazyload: true\r\n };\r\n const viewProps = {\r\n ...this.props,\r\n ...this.state,\r\n imageSettings: defaultImageSettings,\r\n gridSettings: this.props.context.request.gridSettings,\r\n Navigation: {\r\n moduleProps: this.props,\r\n className: classnames('ms-nav', this.props.config.className, this.state.isMobile ? 'mobile-vp' : 'desktop-vp'),\r\n tag: 'nav',\r\n role: this.isMobile ? 'listbox' : 'navigation'\r\n },\r\n MenuList: {\r\n className: 'ms-nav__list',\r\n tag: 'ul',\r\n role: this.isMobile ? 'listbox' : 'menu'\r\n },\r\n ListItem: {\r\n className: 'ms-nav__list__item',\r\n role: 'presentation',\r\n tag: 'li'\r\n },\r\n showCategoryImage: this.props.config.displayCategoryImage ?? false,\r\n showPromotionalContent: this.props.config.displayPromotionalImage ?? false,\r\n Link: {\r\n tag: 'a',\r\n className: 'ms-nav__list__item__link',\r\n role: this.isMobile ? 'option' : 'menuitem'\r\n },\r\n DivContainer: {\r\n tag: 'div',\r\n className: 'ms-nav__feature'\r\n },\r\n ImageDivContainer: {\r\n tag: 'div',\r\n className: 'category-image',\r\n role: 'tabpanel'\r\n },\r\n Button: {\r\n className: 'ms-nav__list__item__button',\r\n tag: 'button',\r\n role: this.isMobile ? 'option' : 'menuitem',\r\n onClick: this.props\r\n },\r\n ImageContainer: {\r\n className: 'ms-nav__list__item__image'\r\n },\r\n Span: {\r\n className: 'ms-nav__list__item__span',\r\n tag: 'span'\r\n },\r\n MobileDescriptionContainer: {\r\n className: 'ms-nav__list__mobile__container'\r\n },\r\n MobileBackButton: {\r\n className: 'ms-nav__list__mobile__container__button',\r\n tag: 'button',\r\n 'aria-label': this.props.resources.backButtonAriaLabel,\r\n onClick: this.props\r\n },\r\n MobileDescriptionLabel: {\r\n className: 'ms-nav__list__mobile__container__span',\r\n tag: 'span'\r\n },\r\n isMobileView: this.state.isMobile,\r\n menuItemData: this.menuItemList,\r\n className: classnames('ms-nav', this.props.config.className)\r\n };\r\n\r\n return this.props.renderView(viewProps) as React.ReactElement;\r\n }\r\n\r\n // private _mapData(): IMenuItemData[] {\r\n // const { data, config } = this.props;\r\n // const mergedData: IMenuItemData[] = [];\r\n // if (this.isRetail && data && data.categories && data.categories.result && data.categories.result.length > 0) {\r\n // data.categories.result.map((item: CategoryHierarchy, index) =>\r\n // mergedData.push(this._constructMenuItemData(item, undefined, true, index, true))\r\n // );\r\n // }\r\n\r\n // if (this.isCMS && config.cmsNavItems && config.cmsNavItems.length > 0) {\r\n // config.cmsNavItems.map((item: ICmsNavItemsData, idx: number) =>\r\n // mergedData.push(this._constructMenuItemData(undefined, item, false, idx + 1))\r\n // );\r\n // }\r\n // return this._constructTopMenuItemData(mergedData);\r\n // }\r\n\r\n // private _constructTopMenuItemData(mergedData: IMenuItemData[]): IMenuItemData[] {\r\n // const enableTopLevelMenu = this.props.config.enabletopMenu ?? false;\r\n // if (!enableTopLevelMenu) {\r\n // return mergedData;\r\n // }\r\n // const mergedRootMenuData: IMenuItemData[] = [];\r\n // const topMenu = {\r\n // id: 1,\r\n // linkText: this.props.config.rootMenuNavigation ?? '...',\r\n // linkURL: '#',\r\n // imageSource: undefined,\r\n // subMenu: mergedData\r\n // } as IMenuItemData;\r\n // mergedRootMenuData.push(topMenu);\r\n\r\n // return mergedRootMenuData;\r\n // }\r\n\r\n // private _constructMenuItemData(\r\n // retailItem?: CategoryHierarchy,\r\n // cmsItem?: ICmsNavItemsData,\r\n // isRetail?: boolean,\r\n // idx?: number,\r\n // addedAllMenu?: boolean\r\n // ): IMenuItemData {\r\n // const locale =\r\n // this.props.context && this.props.context.request && this.props.context.request.locale\r\n // ? this.props.context.request.locale\r\n // : 'en-us';\r\n // const { categoryPromotionalContent } = this.props.config;\r\n // const cmsItemText = (cmsItem && cmsItem.linkText) || '';\r\n // const { menuAriaLabel } = this.props.resources;\r\n\r\n // // Filter category promotional data based on category name\r\n // const promotionalData =\r\n // retailItem &&\r\n // categoryPromotionalContent?.filter(promoItem => promoItem.categoryName?.toLowerCase() === retailItem?.Name?.toLowerCase());\r\n\r\n // // First check if image is available from promotional data else read from retail server\r\n // let imageSource: string = 'empty';\r\n // if (ArrayExtensions.hasElements(retailItem?.Images) && retailItem!.Images[0].Uri) {\r\n // imageSource = retailItem!.Images[0].Uri;\r\n // }\r\n // if (isRetail) {\r\n // return {\r\n // id: NavigationMenu.RSItemIdInit++,\r\n // linkText: NavigationMenu.getFriendlyName(locale, retailItem?.NameTranslations) ?? '',\r\n // linkURL: retailItem?.Url,\r\n // imageSource,\r\n // subMenu: this._getNestedChildren(retailItem, imageSource, addedAllMenu),\r\n // promotionalContent: this.props.config.displayPromotionalImage && promotionalData,\r\n // menuSource: MenuSource.Retail,\r\n // ariaLabel: `${NavigationMenu.getFriendlyName(locale, retailItem?.NameTranslations) ?? ''} ${menuAriaLabel}`\r\n // } as IMenuItemData;\r\n // }\r\n // return {\r\n // id: NavigationMenu.CMSItemIdInit++,\r\n // linkText: cmsItemText,\r\n // linkURL: (cmsItem && cmsItem.linkUrl && cmsItem.linkUrl.destinationUrl) || '',\r\n // imageDestinationURL: (cmsItem && cmsItem.imageLink && cmsItem.imageLink.destinationUrl) || '',\r\n // imageSource: (cmsItem && cmsItem.image && cmsItem.image.src) || '',\r\n // subMenu: this._getCMSNestedChildren(cmsItem),\r\n // menuSource: MenuSource.Cms,\r\n // shouldOpenNewTab: cmsItem?.openInNewTab,\r\n // ariaLabel: `${cmsItemText} ${menuAriaLabel}`\r\n // } as IMenuItemData;\r\n // }\r\n\r\n // private _getNestedChildren(category?: CategoryHierarchy, imageSourceUrl?: string, addedAllMenu: boolean = false): IMenuItemData[] {\r\n // const nestedChildren: IMenuItemData[] = [];\r\n // if (!category || !category.Children || category.Children.length === 0) {\r\n // return [];\r\n // }\r\n // if (!this.props.config.enabletopMenu && addedAllMenu) {\r\n // nestedChildren.push({\r\n // linkText: this.props.resources.allCategoryMenuText,\r\n // imageSource: imageSourceUrl,\r\n // linkURL: getCategoryUrl(category, (this.props.context as unknown) as IActionContext, {})\r\n // });\r\n // }\r\n // category.Children.map((item: CategoryHierarchy, index) => {\r\n // nestedChildren.push(this._constructMenuItemData(item, undefined, true, index, false));\r\n // });\r\n // return nestedChildren;\r\n // }\r\n\r\n // private _getCMSNestedChildren(category?: ICmsNavItemsData): IMenuItemData[] {\r\n // const nestedChildren: IMenuItemData[] = [];\r\n\r\n // if (!category || !category.subMenus || category.subMenus.length === 0) {\r\n // return [];\r\n // }\r\n\r\n // category.subMenus.map((item: ISubMenusData, idx: number) => {\r\n // nestedChildren.push(this._constructMenuItemData(undefined, item, false, idx));\r\n // });\r\n // return nestedChildren;\r\n // }\r\n\r\n ///////// From View ///////////////////////////////\r\n private _mapData(): IMenuItemData[] {\r\n const { data, config } = this.props;\r\n const showCannedSearches = this.props.context.request.query?.showCannedSearches;\r\n const mergedData: IMenuItemData[] = [];\r\n /* VSI Customization - START - 8/31/22 /** adding another menu */\r\n if (this.isCMS && config.cmsNavItemsNew && config.cmsNavItemsNew.length > 0) {\r\n config.cmsNavItemsNew.map((item: ICmsNavItemsData, idx: number) =>\r\n mergedData.push(this._constructMenuItemData(undefined, item, false, idx + 1))\r\n );\r\n }\r\n /* VSI Customization - END - 8/31/22 /** adding another menu */\r\n\r\n if (\r\n this.isRetail &&\r\n config.navigationMenuSource === 'all' &&\r\n data &&\r\n data.categories &&\r\n data.categories.result &&\r\n data.categories.result.length > 0\r\n ) {\r\n data.categories.result.map((item: CategoryHierarchy, index) => {\r\n if (\r\n item.Name === 'Sale' ||\r\n (this.props.config.hideMenuItemPrefix && item.NeutralizedName?.startsWith(this.props.config.hideMenuItemPrefix))\r\n ) {\r\n return;\r\n }\r\n (showCannedSearches || !this.shouldHideMenuItem(item.Name)) &&\r\n mergedData.push(this._constructMenuItemData(item, undefined, true, index, true));\r\n });\r\n }\r\n\r\n if (this.isCMS && config.cmsNavItems && config.cmsNavItems.length > 0) {\r\n config.cmsNavItems.map((item: ICmsNavItemsData, idx: number) =>\r\n mergedData.push(this._constructMenuItemData(undefined, item, false, idx + 1))\r\n );\r\n }\r\n return this._constructTopMenuItemData(mergedData);\r\n }\r\n\r\n private _constructTopMenuItemData(mergedData: IMenuItemData[]): IMenuItemData[] {\r\n const enableTopLevelMenu = this.props.config.enabletopMenu || false;\r\n if (!enableTopLevelMenu) {\r\n return mergedData;\r\n }\r\n const mergedRootMenuData: IMenuItemData[] = [];\r\n const topMenu = {\r\n id: 1,\r\n linkText: this.props.config.rootMenuNavigation || '...',\r\n linkURL: '#',\r\n imageSource: undefined,\r\n subMenu: mergedData\r\n } as IMenuItemData;\r\n mergedRootMenuData.push(topMenu);\r\n\r\n return mergedRootMenuData;\r\n }\r\n\r\n /* VSI CUSTOMIZATION - START CUSTOMIZATION - 08/11/2023 */\r\n private menuExistsInRedundantMobileMenusConfig(menuText?: string): string {\r\n if (this.props.config.removeExtraSubMenusOnMobile && this.props.config.removeExtraSubMenusOnMobile.length) {\r\n for (let i = 0; i < this.props.config.removeExtraSubMenusOnMobile.length; i++) {\r\n if (menuText === this.props.config.removeExtraSubMenusOnMobile[i]) {\r\n return menuText;\r\n }\r\n }\r\n }\r\n return '';\r\n }\r\n /* VSI CUSTOMIZATION - END CUSTOMIZATION - 08/11/2023 */\r\n\r\n // tslint:disable-next-line: cyclomatic-complexity\r\n private _constructMenuItemData(\r\n retailItem?: CategoryHierarchy,\r\n cmsItem?: ICmsNavItemsData,\r\n isRetail?: boolean,\r\n idx?: number,\r\n addedAllMenu?: boolean\r\n ): IMenuItemData {\r\n const locale =\r\n this.props.context && this.props.context.request && this.props.context.request.locale\r\n ? this.props.context.request.locale\r\n : 'en-us';\r\n const imageSouce = retailItem && retailItem.Images && retailItem.Images[0].Uri ? retailItem.Images[0].Uri : 'empty';\r\n /* VSI CUSTOMIZATION - START - 18/09/2023 */\r\n const friendlyName = NavigationMenuView.getFriendlyName(locale, retailItem && retailItem.NameTranslations) || '';\r\n const urlFromConfig = this._getUrlFromConfigOfNavItem(friendlyName);\r\n if (isRetail) {\r\n if (retailItem?.Children && retailItem.Children.length) {\r\n retailItem.Children = retailItem.Children.filter(\r\n ric => !(this.props.config.hideMenuItemPrefix && ric.NeutralizedName?.startsWith(this.props.config.hideMenuItemPrefix))\r\n );\r\n }\r\n return {\r\n id: NavigationMenuView.RSItemIdInit++,\r\n linkText: friendlyName,\r\n linkURL: urlFromConfig ? urlFromConfig : retailItem && retailItem.Url,\r\n imageSource: imageSouce,\r\n subMenu: this._getNestedChildren(retailItem, imageSouce, addedAllMenu).concat(\r\n this._constructSecondLevelStaticMenus(\r\n retailItem?.RecordId ? retailItem.RecordId : -1,\r\n retailItem?.Name ? retailItem.Name : ''\r\n )\r\n )\r\n } as IMenuItemData;\r\n } else {\r\n const isMobile = this.state.isMobile;\r\n if (isMobile) {\r\n const menuText = this.menuExistsInRedundantMobileMenusConfig(cmsItem?.linkText);\r\n if (menuText) {\r\n const subMenu = this._getCMSNestedChildren(cmsItem);\r\n if (subMenu.length === 1) {\r\n const subMenuItem = subMenu[0];\r\n if (subMenuItem.linkText === menuText) {\r\n return {\r\n id: NavigationMenuView.CMSItemIdInit++,\r\n linkText: (cmsItem && cmsItem.linkText) || '',\r\n linkURL: (cmsItem && cmsItem.linkUrl && cmsItem.linkUrl.destinationUrl) || '',\r\n imageDestinationURL: (cmsItem && cmsItem.imageLink && cmsItem.imageLink.destinationUrl) || '',\r\n imageSource: (cmsItem && cmsItem.image && cmsItem.image.src) || '',\r\n subMenu: subMenuItem.subMenu\r\n } as IMenuItemData;\r\n }\r\n }\r\n }\r\n }\r\n return {\r\n id: NavigationMenuView.CMSItemIdInit++,\r\n linkText: (cmsItem && cmsItem.linkText) || '',\r\n linkURL: (cmsItem && cmsItem.linkUrl && cmsItem.linkUrl.destinationUrl) || '',\r\n imageDestinationURL: (cmsItem && cmsItem.imageLink && cmsItem.imageLink.destinationUrl) || '',\r\n imageSource: (cmsItem && cmsItem.image && cmsItem.image.src) || '',\r\n subMenu: this._getCMSNestedChildren(cmsItem)\r\n } as IMenuItemData;\r\n }\r\n }\r\n\r\n private _getUrlFromConfigOfNavItem(linkText: string): string {\r\n var urlFromConfig: string = '';\r\n if (this.isCMS && this.props.config.subMenuStaticMenus && this.props.config.subMenuStaticMenus.length > 0) {\r\n this.props.config.subMenuStaticMenus.map((item: ICmsNavItemsData, idx: number) => {\r\n if (linkText === item.linkText) {\r\n urlFromConfig = item.linkUrl?.destinationUrl ? item.linkUrl?.destinationUrl : '';\r\n }\r\n });\r\n }\r\n return urlFromConfig;\r\n }\r\n\r\n private _constructSecondLevelStaticMenus(id: number, linkText: string): IMenuItemData[] {\r\n const staticMenuItems: IMenuItemData[] = [];\r\n /* VSI Customization - START - 8/31/22 /** adding another menu */\r\n if (this.isCMS && this.props.config.subMenuStaticMenus && this.props.config.subMenuStaticMenus.length > 0) {\r\n this.props.config.subMenuStaticMenus.map((item: ICmsNavItemsData, idx: number) => {\r\n if (linkText === item.linkText) {\r\n item.subMenus?.map(submenu => {\r\n staticMenuItems.push(this._constructMenuItemData(undefined, submenu, false, idx + 1));\r\n });\r\n }\r\n });\r\n }\r\n return staticMenuItems;\r\n }\r\n\r\n private shouldHideMenuItem = (menuName: string | undefined): boolean => {\r\n const NAMES_TO_HIDE = ['Edits', 'CS-'];\r\n if (menuName === undefined) {\r\n return true;\r\n }\r\n return NAMES_TO_HIDE.some(name => menuName.startsWith(name));\r\n };\r\n\r\n private _getNestedChildren(category?: CategoryHierarchy, imageSourceUrl?: string, addedAllMenu: boolean = false): IMenuItemData[] {\r\n const nestedChildren: IMenuItemData[] = [];\r\n const showCannedSearches = this.props.context.request.query?.showCannedSearches;\r\n if (!category || !category.Children || !category.Children.length) {\r\n return [];\r\n }\r\n if (!this.props.config.enabletopMenu && addedAllMenu) {\r\n nestedChildren.push({\r\n linkText: this.props.resources.allCategoryMenuText,\r\n imageSource: imageSourceUrl,\r\n linkURL: getCategoryUrl(category, (this.props.context as unknown) as IActionContext, {})\r\n });\r\n }\r\n category.Children.map((item: CategoryHierarchy, index) => {\r\n (showCannedSearches || !this.shouldHideMenuItem(item.Name)) &&\r\n nestedChildren.push(this._constructMenuItemData(item, undefined, true, index, true));\r\n });\r\n return nestedChildren;\r\n }\r\n\r\n private _getCMSNestedChildren(category?: ICmsNavItemsData): IMenuItemData[] {\r\n const nestedChildren: IMenuItemData[] = [];\r\n\r\n if (!category || !category.subMenus || !category.subMenus.length) {\r\n return [];\r\n }\r\n\r\n category.subMenus.map((item: ISubMenusData, idx: number) => {\r\n nestedChildren.push(this._constructMenuItemData(undefined, item, false, idx));\r\n });\r\n return nestedChildren;\r\n }\r\n ///////////////////////////////////////////////////\r\n\r\n private readonly _setNavigationSource = (sourceType?: navigationMenuSource): void => {\r\n switch (sourceType) {\r\n case navigationMenuSource.retailServerOnly:\r\n this.isRetail = true;\r\n this.isCMS = false;\r\n break;\r\n case navigationMenuSource.cmsOnly:\r\n this.isRetail = false;\r\n this.isCMS = true;\r\n break;\r\n case navigationMenuSource.all:\r\n this.isRetail = true;\r\n this.isCMS = true;\r\n break;\r\n default:\r\n }\r\n };\r\n\r\n private hasClassInParent(element: HTMLElement, className: string): boolean {\r\n // Start from the parent of the given element\r\n let parent = element.parentNode as HTMLElement;\r\n\r\n // Traverse up the DOM tree until reaching the body element\r\n while (parent && parent.tagName !== 'BODY') {\r\n // Check if the parent has the desired class\r\n if (parent.classList.contains(className)) {\r\n return true; // Class found in parent\r\n }\r\n // Move up to the next parent element\r\n parent = parent.parentNode as HTMLElement;\r\n }\r\n\r\n // If no parent with the class is found, return false\r\n return false;\r\n }\r\n\r\n private setNavWidthStandard() {\r\n if (MsDyn365.isBrowser && window) {\r\n const navs = document.getElementsByTagName('nav');\r\n let desktopNav;\r\n if (navs) {\r\n for (let i = 0; i < navs.length; i++) {\r\n if (\r\n !this.hasClassInParent(navs[i], 'ms-header__mobile-hamburger-menu-body') &&\r\n !desktopNav?.classList.contains('child') &&\r\n !this.hasClassInParent(navs[i], 'ms-search-result-container') &&\r\n !this.hasClassInParent(navs[i], 'pdp-breadcrumb') &&\r\n !navs[i].classList.contains('basket-breadcrumb') &&\r\n navs[i].classList.contains('ms-nav')\r\n ) {\r\n desktopNav = navs[i];\r\n }\r\n }\r\n }\r\n if (desktopNav) {\r\n let offsetHeight = desktopNav['offsetHeight'] ? desktopNav['offsetHeight'] : 0;\r\n if (offsetHeight === 0) {\r\n desktopNav.classList.remove('mobile-vp');\r\n if (!desktopNav.classList.contains('desktop-vp')) {\r\n desktopNav.classList.add('desktop-vp');\r\n }\r\n offsetHeight = desktopNav['offsetHeight'];\r\n desktopNav.classList.remove('desktop-vp');\r\n if (!desktopNav.classList.contains('mobile-vp')) {\r\n desktopNav.classList.add('mobile-vp');\r\n }\r\n }\r\n const ulDivs = document.getElementsByClassName('ms-nav__list');\r\n let widthOfWindowIsGreater = false;\r\n if (ulDivs && ulDivs.length > 0) {\r\n if (window && window.innerWidth > ulDivs[0]['offsetWidth']) {\r\n widthOfWindowIsGreater = true;\r\n }\r\n }\r\n if (offsetHeight < 60 || widthOfWindowIsGreater) {\r\n const style = window.getComputedStyle(ulDivs[0], null) || (ulDivs[0] as HTMLElement).style;\r\n const navPaddingLeft = style.paddingLeft.split('px')[0];\r\n const navpaddingRight = style.paddingRight.split('px')[0];\r\n const navMarginLeft = style.marginLeft.split('px')[0];\r\n const navMarginRight = style.marginRight.split('px')[0];\r\n this.setState({\r\n navWidthStandard: desktopNav['offsetWidth'],\r\n navLeftPadding: Number(navPaddingLeft),\r\n navRightPadding: Number(navpaddingRight),\r\n navMarginLeft: Number(navMarginLeft),\r\n navMarginRight: Number(navMarginRight)\r\n });\r\n }\r\n }\r\n }\r\n }\r\n\r\n private isNavOutOfBounds(): boolean {\r\n if (MsDyn365.isBrowser && window) {\r\n if (this.state && this.state.navWidthStandard) {\r\n let actualWidth = 0;\r\n if (this.state.navWidthStandard >= screen.width) {\r\n const navPaddingLeft = this.state.navLeftPadding ? this.state.navLeftPadding : 0;\r\n const navpaddingRight = this.state.navRightPadding ? this.state.navRightPadding : 0;\r\n const navMarginLeft = this.state.navMarginLeft ? this.state.navMarginLeft : 0;\r\n const navMarginRight = this.state.navMarginRight ? this.state.navMarginRight : 0;\r\n actualWidth = this.state.navWidthStandard - (navPaddingLeft + navpaddingRight + navMarginLeft + navMarginRight);\r\n if (window.innerWidth > actualWidth + 20) {\r\n return false;\r\n }\r\n }\r\n if (window.innerWidth > this.state.navWidthStandard + 20) {\r\n return false;\r\n }\r\n return true;\r\n }\r\n const navs = document.getElementsByTagName('nav');\r\n let desktopNav;\r\n if (navs) {\r\n for (let i = 0; i < navs.length; i++) {\r\n if (\r\n !this.hasClassInParent(navs[i], 'ms-header__mobile-hamburger-menu-body') &&\r\n !desktopNav?.classList.contains('child') &&\r\n !this.hasClassInParent(navs[i], 'ms-search-result-container') &&\r\n !this.hasClassInParent(navs[i], 'pdp-breadcrumb') &&\r\n !navs[i].classList.contains('basket-breadcrumb')\r\n ) {\r\n desktopNav = navs[i];\r\n }\r\n }\r\n }\r\n if (desktopNav) {\r\n let offsetHeight = desktopNav['offsetHeight'] ? desktopNav['offsetHeight'] : 0;\r\n if (offsetHeight === 0) {\r\n desktopNav.classList.remove('mobile-vp');\r\n if (!desktopNav.classList.contains('desktop-vp')) {\r\n desktopNav.classList.add('desktop-vp');\r\n }\r\n offsetHeight = desktopNav['offsetHeight'];\r\n desktopNav.classList.remove('desktop-vp');\r\n if (!desktopNav.classList.contains('mobile-vp')) {\r\n desktopNav.classList.add('mobile-vp');\r\n }\r\n }\r\n if (offsetHeight > 75) {\r\n if (offsetHeight > 200) {\r\n if (!desktopNav.classList.contains('mobile-vp')) {\r\n desktopNav.classList.add('mobile-vp');\r\n }\r\n }\r\n return true;\r\n }\r\n }\r\n }\r\n return false;\r\n }\r\n\r\n private _updateViewport(): void {\r\n this.viewport = this._getViewport();\r\n this.setState({ isMobile: this.isMobile });\r\n }\r\n\r\n private _getViewport(): GridSize {\r\n const { context } = this.props;\r\n\r\n // Always render in mobile viewport on a mobile device\r\n if (context.request && context.request.device && context.request.device.Type === 'Mobile') {\r\n return 'xs';\r\n }\r\n\r\n if (MsDyn365.isBrowser && window.innerWidth) {\r\n const gridSettings = context.request.gridSettings;\r\n if (gridSettings) {\r\n if (gridSettings.xs && window.innerWidth <= gridSettings.xs.w) {\r\n return 'xs';\r\n } else if (gridSettings.sm && window.innerWidth <= gridSettings.sm.w) {\r\n return 'sm';\r\n } else if (gridSettings.md && window.innerWidth <= gridSettings.md.w) {\r\n return 'md';\r\n } else if (gridSettings.lg && window.innerWidth <= gridSettings.lg.w) {\r\n return 'lg';\r\n }\r\n return 'xl';\r\n }\r\n }\r\n\r\n return 'xs';\r\n }\r\n}\r\n\r\nexport default NavigationMenu;\r\n","/*---------------------------------------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License. See License.txt in the project root for license information.\r\n *--------------------------------------------------------------------------------------------*/\r\nimport { ICmsNavItemsData, IMenuItemData, INavigationMenuViewProps } from '@msdyn365-commerce-modules/navigation-menu';\r\nimport {\r\n Module,\r\n getPayloadObject,\r\n getTelemetryAttributes,\r\n getTelemetryObject,\r\n IPayLoad,\r\n ITelemetryContent,\r\n Node,\r\n onTelemetryClick\r\n} from '@msdyn365-commerce-modules/utilities';\r\nimport classnames from 'classnames';\r\nimport * as React from 'react';\r\n\r\n/* VSI Customization - START */\r\nimport { generateImageUrl, getCategoryUrl } from '@msdyn365-commerce-modules/retail-actions';\r\nimport { CategoryHierarchy } from '@msdyn365-commerce/commerce-entities';\r\nimport MsDyn365, { getUrlSync, IActionContext, IImageData, Image, Text } from '@msdyn365-commerce/core';\r\nimport { LoyaltyCard, LoyaltyGroup, TextValueTranslation } from '@msdyn365-commerce/retail-proxy';\r\nimport { IDobbiesNavigationMenuProps, ISubMenusData, navigationMenuSource } from './dobbies-navigation-menu.props.autogenerated';\r\nimport { IDobbiesNavigationMenuData } from './dobbies-navigation-menu.data';\r\n/* VSI Customization - END */\r\n\r\ninterface INavigationState {\r\n parentMenu?: number;\r\n activeMenu?: number;\r\n scrollClass: boolean;\r\n mobileViewLabelText?: string;\r\n /* VSI Customization - START\r\n when mouse moves on any submneu item, currentcategory shows its option at ID if at level 2 and previous category ID (which is actually its parent ID) if at level 3 */\r\n currentCategory?: number | undefined;\r\n // checks whether back button is clicked or not on mobile menu\r\n isBackBtnClicked?: boolean;\r\n categoryName?: string;\r\n categoryImage?: string | null;\r\n categoryImageLink?: string;\r\n dobbiesClubLink?: string; // Check if user is club or club plus member, clicking on Dobbies club will navigate to loyalty page otherwise to dobbies marketing or as configured in CMS page\r\n /* VSI Customization - END */\r\n navigationSearch: boolean;\r\n}\r\n\r\nconst NAMES_TO_HIDE = ['Edits', 'CS-'];\r\n\r\nconst shouldHideMenuItem = (menuName: string | undefined): boolean => {\r\n if (menuName === undefined) {\r\n return true;\r\n }\r\n return NAMES_TO_HIDE.some(name => menuName.startsWith(name));\r\n};\r\n\r\n/**\r\n *\r\n * NavigationMenuView component\r\n * @extends {React.PureComponent}\r\n */\r\nexport class NavigationMenuView extends React.PureComponent<\r\n INavigationMenuViewProps & IDobbiesNavigationMenuProps,\r\n INavigationState\r\n> {\r\n public static isBackTrack: boolean = false;\r\n public static CMSItemIdInit: number = 1000;\r\n public static RSItemIdInit: number = 5000;\r\n public supportedLevel: number = 3;\r\n public currentLevel: number = 0;\r\n /* VSI Customization - START - 13/11/20 */\r\n // Tells current active level on mobile\r\n private currentLevelMobile: number = 0;\r\n private menuItemData: IMenuItemData[];\r\n // private isRetail: boolean = true;\r\n private isCMS: boolean = true;\r\n /* VSI Customization - END */\r\n private menuNode: React.RefObject;\r\n private telemetryContent: ITelemetryContent;\r\n private payLoad: IPayLoad;\r\n //private documentRef: Document | undefined;\r\n\r\n private mouseDownRefs: ((e: any) => void)[] = [];\r\n private navRef: React.RefObject;\r\n\r\n public static getFriendlyName(locale: string, nameTranslations?: TextValueTranslation[]): string | undefined {\r\n let nameTranslation: TextValueTranslation | undefined;\r\n if (locale && nameTranslations && nameTranslations.length > 0) {\r\n nameTranslation = nameTranslations.find(item => item.Language!.toLowerCase() === locale.toLowerCase());\r\n }\r\n\r\n return nameTranslation && nameTranslation.Text;\r\n }\r\n\r\n constructor(props: INavigationMenuViewProps & IDobbiesNavigationMenuProps, state: INavigationState) {\r\n super(props);\r\n this.menuNode = React.createRef();\r\n this.navRef = React.createRef();\r\n // this.menuItemData = [];\r\n this.menuItemData = [];\r\n this._setNavigationSource(this.props.config && this.props.config.navigationMenuSource);\r\n this.state = {\r\n navigationSearch: true,\r\n activeMenu: undefined,\r\n mobileViewLabelText: '',\r\n parentMenu: undefined,\r\n scrollClass: false,\r\n isBackBtnClicked: false\r\n };\r\n this._closeSubmenu = this._closeSubmenu.bind(this);\r\n this.telemetryContent = getTelemetryObject(\r\n this.props.context.request.telemetryPageName!,\r\n this.props.friendlyName,\r\n this.props.telemetry\r\n );\r\n this.payLoad = getPayloadObject('click', this.telemetryContent, '', '');\r\n }\r\n\r\n public componentDidMount(): void {\r\n //this.documentRef = document;\r\n\r\n if (document.body) {\r\n this.mouseDownRefs.push(this._handleClickOutside);\r\n this.mouseDownRefs.push(this._handleMouseHover(undefined));\r\n this.mouseDownRefs.push(this._handleLinkClick(undefined));\r\n this.mouseDownRefs.forEach(ref => document.body.addEventListener('mousedown', ref));\r\n }\r\n window.addEventListener('scroll', this._mainMenuScroll);\r\n\r\n // Get Customer Loyalty card details if he/she is authenticated and state is not set yet\r\n this.props.data.loyaltyCard.then(loyaltyCard => {\r\n const loyaltyGroup = loyaltyCard && loyaltyCard.LoyaltyGroups && loyaltyCard.LoyaltyGroups[0];\r\n const tierId = loyaltyGroup && this._getTierId(loyaltyGroup);\r\n const redirectionLink = loyaltyCard && tierId && this._getRedirectionLink(loyaltyCard, tierId);\r\n this.setState({ dobbiesClubLink: redirectionLink });\r\n });\r\n }\r\n\r\n public componentWillUnmount(): void {\r\n this.mouseDownRefs.forEach(ref => document.body.removeEventListener('mousedown', ref));\r\n window.addEventListener('scroll', this._mainMenuScroll);\r\n }\r\n\r\n /* VSI CUSTOMIZATION - START - 18/09/2023 */\r\n private _constructSecondLevelStaticMenus(id: number, linkText: string): IMenuItemData[] {\r\n const staticMenuItems: IMenuItemData[] = [];\r\n /* VSI Customization - START - 8/31/22 /** adding another menu */\r\n if (this.isCMS && this.props.config.subMenuStaticMenus && this.props.config.subMenuStaticMenus.length > 0) {\r\n this.props.config.subMenuStaticMenus.map((item: ICmsNavItemsData, idx: number) => {\r\n if (linkText === item.linkText) {\r\n item.subMenus?.map(submenu => {\r\n staticMenuItems.push(this._constructMenuItemData(undefined, submenu, false, idx + 1));\r\n });\r\n }\r\n });\r\n }\r\n return staticMenuItems;\r\n }\r\n private _getUrlFromConfigOfNavItem(linkText: string): string {\r\n var urlFromConfig: string = '';\r\n if (this.isCMS && this.props.config.subMenuStaticMenus && this.props.config.subMenuStaticMenus.length > 0) {\r\n this.props.config.subMenuStaticMenus.map((item: ICmsNavItemsData, idx: number) => {\r\n if (linkText === item.linkText) {\r\n urlFromConfig = item.linkUrl?.destinationUrl ? item.linkUrl?.destinationUrl : '';\r\n }\r\n });\r\n }\r\n return urlFromConfig;\r\n }\r\n /* VSI CUSTOMIZATION - END CUSTOMIZATION - 18/09/2023 */\r\n private _getCategoryScheduledImageUrl = (): string | undefined => {\r\n let scheduledImageUrl: string | undefined = '';\r\n if (this.state.categoryName && this.props.config.menuImagesSchedule) {\r\n for (const imageSchedule of this.props.config.menuImagesSchedule) {\r\n if (imageSchedule.menuName === this.state.categoryName) {\r\n try {\r\n const now = new Date();\r\n const dateTimeSplittedStartDate = imageSchedule.imageShowStartDate.split(' ');\r\n const startDateMonth = dateTimeSplittedStartDate[0].split('-')[1];\r\n const startDateDay = dateTimeSplittedStartDate[0].split('-')[0];\r\n const startDateYear = dateTimeSplittedStartDate[0].split('-')[2];\r\n const startDateHour = dateTimeSplittedStartDate[1].split(':')[0];\r\n const startDateMinutes = dateTimeSplittedStartDate[1].split(':')[1];\r\n const imageShowingStartDate = new Date(\r\n `${startDateMonth}-${startDateDay}-${startDateYear} ${startDateHour}:${startDateMinutes}:00`\r\n );\r\n const dateTimeSplittedEndDate = imageSchedule.imageShowEndDate.split(' ');\r\n const endDateMonth = dateTimeSplittedEndDate[0].split('-')[1];\r\n const endDateDay = dateTimeSplittedEndDate[0].split('-')[0];\r\n const endDateYear = dateTimeSplittedEndDate[0].split('-')[2];\r\n const endDateHour = dateTimeSplittedEndDate[1].split(':')[0];\r\n const endDateMinutes = dateTimeSplittedEndDate[1].split(':')[1];\r\n const imageShowEndDate = new Date(\r\n `${endDateMonth}-${endDateDay}-${endDateYear} ${endDateHour}:${endDateMinutes}:00`\r\n );\r\n if (now.getTime() <= imageShowEndDate.getTime() && now.getTime() >= imageShowingStartDate.getTime()) {\r\n scheduledImageUrl = imageSchedule.imageUrl;\r\n return scheduledImageUrl;\r\n }\r\n } catch (ex) {\r\n return undefined;\r\n }\r\n }\r\n }\r\n }\r\n return scheduledImageUrl;\r\n };\r\n public render(): JSX.Element | null {\r\n this.menuItemData = this.props.menuItemData; //this._mapData();\r\n if (this.props.isMobileView) {\r\n if (MsDyn365.isBrowser && window) {\r\n const body = document.getElementsByTagName('body')[0];\r\n if (body && !body.classList.contains('mobile')) {\r\n body.classList.remove('pc');\r\n body.classList.add('mobile');\r\n }\r\n }\r\n } else {\r\n if (MsDyn365.isBrowser && window) {\r\n const body = document.getElementsByTagName('body')[0];\r\n if (body && !body.classList.contains('pc')) {\r\n body.classList.remove('mobile');\r\n body.classList.add('pc');\r\n }\r\n }\r\n }\r\n const {\r\n isMobileView,\r\n MenuList,\r\n MobileBackButton,\r\n MobileDescriptionContainer,\r\n MobileDescriptionLabel,\r\n Navigation,\r\n config: { menuHeading }\r\n } = this.props;\r\n this.currentLevel = 1;\r\n const searchSlot = this._getSlot('search');\r\n const search = (searchSlot && searchSlot.length && searchSlot) || [];\r\n\r\n return (\r\n /* Below line updated for Sticky Navigation */\r\n
\r\n \r\n {/* VSI Customization - START\r\n Mobile menu heading */}\r\n {isMobileView && this.state.activeMenu === undefined && (\r\n \r\n \r\n \r\n )}\r\n {/* VSI Customization - END */}\r\n \r\n {isMobileView && this.state.activeMenu !== undefined && (\r\n \r\n \r\n {this.state.mobileViewLabelText}\r\n \r\n )}\r\n\r\n {this.state.navigationSearch ? this._renderDisplay() : ''}\r\n {this.state.scrollClass &&\r\n (this.state.navigationSearch ? (\r\n
this.setState({ navigationSearch: false })}>
\r\n ) : (\r\n <>\r\n {search} \r\n
this.setState({ navigationSearch: true })}>
\r\n \r\n ))}\r\n
\r\n \r\n
\r\n );\r\n }\r\n\r\n private _getSlot(slotName: string): React.ReactNode[] | null {\r\n const { slots } = this.props;\r\n return (slots && slots[slotName]! && slots[slotName].length && slots[slotName]!) || null;\r\n }\r\n\r\n private _renderDisplay(): JSX.Element[] {\r\n const { ListItem, isMobileView } = this.props;\r\n const { activeMenu } = this.state;\r\n const { menuItemData } = this;\r\n const menuItemList: JSX.Element[] = [];\r\n\r\n if (isMobileView && activeMenu !== undefined && menuItemData.length > 0) {\r\n let menuItem: IMenuItemData = {};\r\n for (let i = 0; i < menuItemData.length; i++) {\r\n if (menuItemData[i] && menuItemData[i].id === activeMenu) {\r\n menuItem = menuItemData[i];\r\n !NavigationMenuView.isBackTrack\r\n ? this.setState({ parentMenu: undefined })\r\n : this.setState({ parentMenu: undefined, mobileViewLabelText: menuItemData[i].linkText });\r\n break;\r\n }\r\n menuItem = this._getFromSubMenu(menuItemData[i]) as IMenuItemData;\r\n if (menuItem && menuItem.id === activeMenu) {\r\n break;\r\n }\r\n }\r\n /* VSI Customization - START - 13/11/20 */\r\n if (menuItem) {\r\n // if user is on level < supported level, add 1 in currentLevelMobile\r\n // but if user clicks on back button and go to previous menu, currentLevelMobile will not be incremented\r\n this.currentLevelMobile < this.supportedLevel && this.state.isBackBtnClicked === false && this.currentLevelMobile++;\r\n menuItemList.push(\r\n \r\n {' '}\r\n {this._createMenuItemList(menuItem)}{' '}\r\n \r\n );\r\n }\r\n /* VSI Customization - END */\r\n } else {\r\n /* VSI Customization - START -13/11/20 */\r\n // if user is on first/root navigation menu level\r\n this.currentLevelMobile = 0;\r\n /* VSI Customization - END */\r\n menuItemData.forEach((item: IMenuItemData, index: number) => {\r\n menuItemList.push(\r\n \r\n {this._createMenuItemList(item)}\r\n \r\n );\r\n });\r\n }\r\n\r\n return menuItemList;\r\n }\r\n /* VSI Customization - START - 17/06/21 - Copied following functions from tsx file to display all option on 3rd level */\r\n // private _mapData(): IMenuItemData[] {\r\n // const { data, config } = this.props;\r\n // const showCannedSearches = this.props.context.request.query?.showCannedSearches;\r\n // const mergedData: IMenuItemData[] = [];\r\n // /* VSI Customization - START - 8/31/22 /** adding another menu */\r\n // if (this.isCMS && config.cmsNavItemsNew && config.cmsNavItemsNew.length > 0) {\r\n // config.cmsNavItemsNew.map((item: ICmsNavItemsData, idx: number) =>\r\n // mergedData.push(this._constructMenuItemData(undefined, item, false, idx + 1))\r\n // );\r\n // }\r\n // /* VSI Customization - END - 8/31/22 /** adding another menu */\r\n\r\n // if (\r\n // this.isRetail &&\r\n // config.navigationMenuSource === 'all' &&\r\n // data &&\r\n // data.categories &&\r\n // data.categories.result &&\r\n // data.categories.result.length > 0\r\n // ) {\r\n // data.categories.result.map((item: CategoryHierarchy, index) => {\r\n // if (\r\n // item.Name === 'Sale' ||\r\n // (this.props.config.hideMenuItemPrefix && item.NeutralizedName?.startsWith(this.props.config.hideMenuItemPrefix))\r\n // ) {\r\n // return;\r\n // }\r\n // (showCannedSearches || !shouldHideMenuItem(item.Name)) &&\r\n // mergedData.push(this._constructMenuItemData(item, undefined, true, index, true));\r\n // });\r\n // }\r\n\r\n // if (this.isCMS && config.cmsNavItems && config.cmsNavItems.length > 0) {\r\n // config.cmsNavItems.map((item: ICmsNavItemsData, idx: number) =>\r\n // mergedData.push(this._constructMenuItemData(undefined, item, false, idx + 1))\r\n // );\r\n // }\r\n // return this._constructTopMenuItemData(mergedData);\r\n // }\r\n\r\n // private _constructTopMenuItemData(mergedData: IMenuItemData[]): IMenuItemData[] {\r\n // const enableTopLevelMenu = this.props.config.enabletopMenu || false;\r\n // if (!enableTopLevelMenu) {\r\n // return mergedData;\r\n // }\r\n // const mergedRootMenuData: IMenuItemData[] = [];\r\n // const topMenu = {\r\n // id: 1,\r\n // linkText: this.props.config.rootMenuNavigation || '...',\r\n // linkURL: '#',\r\n // imageSource: undefined,\r\n // subMenu: mergedData\r\n // } as IMenuItemData;\r\n // mergedRootMenuData.push(topMenu);\r\n\r\n // return mergedRootMenuData;\r\n // }\r\n\r\n /* VSI CUSTOMIZATION - START CUSTOMIZATION - 08/11/2023 */\r\n private menuExistsInRedundantMobileMenusConfig(menuText?: string): string {\r\n if (this.props.config.removeExtraSubMenusOnMobile && this.props.config.removeExtraSubMenusOnMobile.length) {\r\n for (let i = 0; i < this.props.config.removeExtraSubMenusOnMobile.length; i++) {\r\n if (menuText === this.props.config.removeExtraSubMenusOnMobile[i]) {\r\n return menuText;\r\n }\r\n }\r\n }\r\n return '';\r\n }\r\n /* VSI CUSTOMIZATION - END CUSTOMIZATION - 08/11/2023 */\r\n\r\n // tslint:disable-next-line: cyclomatic-complexity\r\n private _constructMenuItemData(\r\n retailItem?: CategoryHierarchy,\r\n cmsItem?: ICmsNavItemsData,\r\n isRetail?: boolean,\r\n idx?: number,\r\n addedAllMenu?: boolean\r\n ): IMenuItemData {\r\n const locale =\r\n this.props.context && this.props.context.request && this.props.context.request.locale\r\n ? this.props.context.request.locale\r\n : 'en-us';\r\n const imageSouce = retailItem && retailItem.Images && retailItem.Images[0].Uri ? retailItem.Images[0].Uri : 'empty';\r\n /* VSI CUSTOMIZATION - START - 18/09/2023 */\r\n const friendlyName = NavigationMenuView.getFriendlyName(locale, retailItem && retailItem.NameTranslations) || '';\r\n const urlFromConfig = this._getUrlFromConfigOfNavItem(friendlyName);\r\n if (isRetail) {\r\n if (retailItem?.Children && retailItem.Children.length) {\r\n retailItem.Children = retailItem.Children.filter(\r\n ric => !(this.props.config.hideMenuItemPrefix && ric.NeutralizedName?.startsWith(this.props.config.hideMenuItemPrefix))\r\n );\r\n }\r\n return {\r\n id: NavigationMenuView.RSItemIdInit++,\r\n linkText: friendlyName,\r\n linkURL: urlFromConfig ? urlFromConfig : retailItem && retailItem.Url,\r\n imageSource: imageSouce,\r\n subMenu: this._getNestedChildren(retailItem, imageSouce, addedAllMenu).concat(\r\n this._constructSecondLevelStaticMenus(\r\n retailItem?.RecordId ? retailItem.RecordId : -1,\r\n retailItem?.Name ? retailItem.Name : ''\r\n )\r\n )\r\n } as IMenuItemData;\r\n } else {\r\n const isMobile = this.props.isMobileView;\r\n if (isMobile) {\r\n const menuText = this.menuExistsInRedundantMobileMenusConfig(cmsItem?.linkText);\r\n if (menuText) {\r\n const subMenu = this._getCMSNestedChildren(cmsItem);\r\n if (subMenu.length === 1) {\r\n const subMenuItem = subMenu[0];\r\n if (subMenuItem.linkText === menuText) {\r\n return {\r\n id: NavigationMenuView.CMSItemIdInit++,\r\n linkText: (cmsItem && cmsItem.linkText) || '',\r\n linkURL: (cmsItem && cmsItem.linkUrl && cmsItem.linkUrl.destinationUrl) || '',\r\n imageDestinationURL: (cmsItem && cmsItem.imageLink && cmsItem.imageLink.destinationUrl) || '',\r\n imageSource: (cmsItem && cmsItem.image && cmsItem.image.src) || '',\r\n subMenu: subMenuItem.subMenu\r\n } as IMenuItemData;\r\n }\r\n }\r\n }\r\n }\r\n return {\r\n id: NavigationMenuView.CMSItemIdInit++,\r\n linkText: (cmsItem && cmsItem.linkText) || '',\r\n linkURL: (cmsItem && cmsItem.linkUrl && cmsItem.linkUrl.destinationUrl) || '',\r\n imageDestinationURL: (cmsItem && cmsItem.imageLink && cmsItem.imageLink.destinationUrl) || '',\r\n imageSource: (cmsItem && cmsItem.image && cmsItem.image.src) || '',\r\n subMenu: this._getCMSNestedChildren(cmsItem)\r\n } as IMenuItemData;\r\n }\r\n }\r\n\r\n private _getNestedChildren(category?: CategoryHierarchy, imageSourceUrl?: string, addedAllMenu: boolean = false): IMenuItemData[] {\r\n const nestedChildren: IMenuItemData[] = [];\r\n const showCannedSearches = this.props.context.request.query?.showCannedSearches;\r\n if (!category || !category.Children || !category.Children.length) {\r\n return [];\r\n }\r\n if (!this.props.config.enabletopMenu && addedAllMenu) {\r\n nestedChildren.push({\r\n linkText: this.props.resources.allCategoryMenuText,\r\n imageSource: imageSourceUrl,\r\n linkURL: getCategoryUrl(category, (this.props.context as unknown) as IActionContext, {})\r\n });\r\n }\r\n category.Children.map((item: CategoryHierarchy, index) => {\r\n (showCannedSearches || !shouldHideMenuItem(item.Name)) &&\r\n nestedChildren.push(this._constructMenuItemData(item, undefined, true, index, true));\r\n });\r\n return nestedChildren;\r\n }\r\n\r\n private _getCMSNestedChildren(category?: ICmsNavItemsData): IMenuItemData[] {\r\n const nestedChildren: IMenuItemData[] = [];\r\n\r\n if (!category || !category.subMenus || !category.subMenus.length) {\r\n return [];\r\n }\r\n\r\n category.subMenus.map((item: ISubMenusData, idx: number) => {\r\n nestedChildren.push(this._constructMenuItemData(undefined, item, false, idx));\r\n });\r\n return nestedChildren;\r\n }\r\n\r\n private _setNavigationSource = (sourceType?: navigationMenuSource): void => {\r\n switch (sourceType) {\r\n case navigationMenuSource.retailServerOnly:\r\n // this.isRetail = true;\r\n this.isCMS = false;\r\n break;\r\n case navigationMenuSource.cmsOnly:\r\n // this.isRetail = false;\r\n this.isCMS = true;\r\n break;\r\n case navigationMenuSource.all:\r\n // this.isRetail = true;\r\n this.isCMS = true;\r\n break;\r\n default:\r\n }\r\n };\r\n /* VSI Customization - END - 17/04/21 */\r\n private _getFromSubMenu(item?: IMenuItemData): IMenuItemData | null {\r\n const subMenus = item && item.subMenu;\r\n if (subMenus && subMenus.length > 0) {\r\n for (let i = 0; i <= subMenus.length - 1; i++) {\r\n if (subMenus[i].id === this.state.activeMenu) {\r\n !NavigationMenuView.isBackTrack\r\n ? this.setState({ parentMenu: item && item.id })\r\n : this.setState({ parentMenu: item && item.id, mobileViewLabelText: subMenus[i].linkText });\r\n return subMenus[i];\r\n }\r\n const found = this._getFromSubMenu(subMenus[i]);\r\n if (found) {\r\n return found;\r\n }\r\n }\r\n }\r\n this.props.context.telemetry.error('Submenu content is empty, module wont render.');\r\n return null;\r\n }\r\n private _renderMobileSubMenu(menuItemData: IMenuItemData): JSX.Element | null {\r\n return (\r\n \r\n {this._renderButtonMenuItem(menuItemData)}\r\n {this._renderSubMenu(menuItemData.subMenu, menuItemData.id, undefined, menuItemData.linkText)}\r\n \r\n );\r\n }\r\n\r\n private _createMenuItemList(menuItemData: IMenuItemData): JSX.Element | null {\r\n const {\r\n isMobileView,\r\n config: { dobbiesClubNavItemText },\r\n context: {\r\n request: {\r\n user: { isAuthenticated }\r\n }\r\n }\r\n } = this.props;\r\n if (menuItemData && menuItemData.subMenu && menuItemData.subMenu.length > 0) {\r\n if (isMobileView && this.state.activeMenu !== undefined) {\r\n return this._renderSubMenu(menuItemData.subMenu, menuItemData.id, undefined, menuItemData.linkText);\r\n } else {\r\n /* VSI Customization - START */\r\n if (isMobileView) {\r\n return this._renderMobileSubMenu(menuItemData);\r\n }\r\n return (\r\n \r\n {this._renderButtonMenuItem(menuItemData)}\r\n \r\n {this._renderSubMenu(menuItemData.subMenu, menuItemData.id, undefined)}\r\n \r\n \r\n \r\n );\r\n /* VSI Customization - END */\r\n }\r\n } else if (menuItemData && menuItemData.linkText && menuItemData.linkURL && menuItemData.linkURL.length > 0) {\r\n /* VSI Customization - START - 11/11/20 */\r\n // Check if user is club or club plus member, clicking on Dobbies club will navigate to loyalty page otherwise to dobbies marketing or as configured in CMS page\r\n let updatedMenuItemData: IMenuItemData = menuItemData;\r\n if (isAuthenticated && menuItemData.linkText?.toLowerCase() === dobbiesClubNavItemText?.toLowerCase()) {\r\n updatedMenuItemData = this.conditionalRoutingMenuItem(menuItemData);\r\n }\r\n /* Displayed static menu items as buttons in desktop view and as link menu items in mobile/iPad view */\r\n if (isMobileView) {\r\n return this._renderLinkMenuItem(updatedMenuItemData);\r\n }\r\n return this._renderButtonMenuItem(updatedMenuItemData);\r\n /* VSI Customization - END */\r\n } else if (menuItemData && menuItemData.linkText && !menuItemData.linkURL) {\r\n return this._renderSpanMenuItem(menuItemData);\r\n }\r\n this.props.context.telemetry.error('Navigation menu content is empty, module wont render.');\r\n return null;\r\n }\r\n\r\n /* VSI Customization - START - 07/04/21 - Conditional routing of dobbies club navigation menu item */\r\n\r\n // Route conditionally on clicking Dobbies Club nav item, it updated menu item url and returns updated menuItemData\r\n private conditionalRoutingMenuItem = (menuItemData: IMenuItemData): IMenuItemData => {\r\n const { dobbiesClubLink } = this.state;\r\n\r\n if (dobbiesClubLink) {\r\n const updatedMenuItem = menuItemData;\r\n updatedMenuItem.linkURL = dobbiesClubLink;\r\n return updatedMenuItem;\r\n }\r\n return menuItemData;\r\n };\r\n\r\n // Provide the TierId of user's loyalty\r\n private _getTierId = (loyaltyGroup: LoyaltyGroup | undefined) => {\r\n // highestLoyaltCardTier\r\n const highestActiveLoyaltyCardTier = loyaltyGroup && loyaltyGroup.HighestActiveLoyaltyCardTier;\r\n const loyaltyCardTiers = loyaltyGroup && loyaltyGroup.LoyaltyCardTiers;\r\n if (loyaltyCardTiers && loyaltyCardTiers?.length > 0) {\r\n for (const [_, loyaltyCardTier] of loyaltyCardTiers.entries()) {\r\n if (loyaltyCardTier.RecordId === highestActiveLoyaltyCardTier) {\r\n return loyaltyCardTier.TierId;\r\n }\r\n }\r\n }\r\n return;\r\n };\r\n\r\n // Redirects the user based on certain criteria defined inside function\r\n private _getRedirectionLink = (loyaltyCard: LoyaltyCard, tierId: string | undefined) => {\r\n const {\r\n config: { clubFreeTierText, clubPlusTierText }\r\n } = this.props;\r\n\r\n if (!loyaltyCard.CardNumber || !tierId || !clubFreeTierText || !clubPlusTierText) {\r\n return undefined;\r\n }\r\n\r\n tierId = tierId.toLowerCase().trim();\r\n // If user is already dobbies club free/plus member and clicks on dobbies club nav item, navigate him to loyalty page\r\n if (tierId === clubFreeTierText.toLowerCase() || tierId === clubPlusTierText.toLowerCase()) {\r\n return getUrlSync('loyalty', this.props.context.actionContext);\r\n }\r\n\r\n return undefined;\r\n };\r\n\r\n /* VSI Customization - END */\r\n private _getCategoryImage = (categoryImage: string): React.ReactNode | null => {\r\n const categoryImageUrl = generateImageUrl(`${categoryImage}`, this.props.context.actionContext.requestContext.apiSettings);\r\n if (this.state.categoryName && this.props.config.menuImagesSchedule) {\r\n for (const imageSchedule of this.props.config.menuImagesSchedule) {\r\n if (imageSchedule.menuName === this.state.categoryName) {\r\n try {\r\n const now = new Date();\r\n const dateTimeSplittedStartDate = imageSchedule.imageShowStartDate.split(' ');\r\n const startDateMonth = dateTimeSplittedStartDate[0].split('-')[1];\r\n const startDateDay = dateTimeSplittedStartDate[0].split('-')[0];\r\n const startDateYear = dateTimeSplittedStartDate[0].split('-')[2];\r\n const startDateHour = dateTimeSplittedStartDate[1].split(':')[0];\r\n const startDateMinutes = dateTimeSplittedStartDate[1].split(':')[1];\r\n const imageShowingStartDate = new Date(\r\n `${startDateMonth}-${startDateDay}-${startDateYear} ${startDateHour}:${startDateMinutes}:00`\r\n );\r\n const dateTimeSplittedEndDate = imageSchedule.imageShowEndDate.split(' ');\r\n const endDateMonth = dateTimeSplittedEndDate[0].split('-')[1];\r\n const endDateDay = dateTimeSplittedEndDate[0].split('-')[0];\r\n const endDateYear = dateTimeSplittedEndDate[0].split('-')[2];\r\n const endDateHour = dateTimeSplittedEndDate[1].split(':')[0];\r\n const endDateMinutes = dateTimeSplittedEndDate[1].split(':')[1];\r\n const imageShowEndDate = new Date(\r\n `${endDateMonth}-${endDateDay}-${endDateYear} ${endDateHour}:${endDateMinutes}:00`\r\n );\r\n if (now.getTime() <= imageShowEndDate.getTime() && now.getTime() >= imageShowingStartDate.getTime()) {\r\n const scheduledImageUrl = generateImageUrl(\r\n `${imageSchedule.menuImageName}`,\r\n this.props.context.actionContext.requestContext.apiSettings\r\n );\r\n const ImageData: IImageData = { src: scheduledImageUrl };\r\n return (\r\n \r\n );\r\n }\r\n } catch (ex) {\r\n if (categoryImageUrl !== undefined) {\r\n const ImageData: IImageData = { src: categoryImageUrl };\r\n return (\r\n \r\n );\r\n }\r\n }\r\n }\r\n }\r\n }\r\n if (categoryImageUrl !== undefined) {\r\n const ImageData: IImageData = { src: categoryImageUrl };\r\n return (\r\n \r\n );\r\n }\r\n return null;\r\n };\r\n\r\n private _updateCategoryImage = (categoryImage: string, selectedCategoryName: string) => () => {\r\n /* VSI Customization - START - 16/03/21 */\r\n // Get category image data matched with currenct category\r\n const {\r\n config: { categoryImageLinks }\r\n } = this.props;\r\n const selectedCategory =\r\n categoryImageLinks &&\r\n categoryImageLinks.find(category => {\r\n const categoryName = category.categoryName && category.categoryName.trim().toLowerCase();\r\n return selectedCategoryName.toLowerCase().trim() === categoryName;\r\n });\r\n const categoryLink = selectedCategory && selectedCategory.categoryImageLink && selectedCategory.categoryImageLink.destinationUrl;\r\n /* VSI Customization - END */\r\n this.setState({\r\n categoryName: selectedCategory?.categoryName,\r\n categoryImage: categoryImage !== '' ? categoryImage : 'empty',\r\n categoryImageLink: categoryImage !== '' ? categoryLink : undefined\r\n });\r\n };\r\n\r\n private _renderSubMenu(subMenus?: IMenuItemData[], activeMenu?: number, isChild?: boolean, parentName?: string): JSX.Element | null {\r\n const {\r\n isMobileView,\r\n ListItem,\r\n MenuList,\r\n config: { showOptionAll }\r\n } = this.props;\r\n /* VSI Customization - START */\r\n /* Added isMobileView condition to check this condition just for mobile to fill submenu by default in case of desktop */\r\n if (isMobileView && activeMenu && this.state.activeMenu !== activeMenu) {\r\n this.props.context.telemetry.error('Navigation Active menu content is empty, module wont render.');\r\n return null;\r\n }\r\n /* VSI Customization - END */\r\n if (!subMenus || subMenus.length === 0) {\r\n this.props.context.telemetry.error('Navigation Submenu content is empty, module wont render.');\r\n return null;\r\n }\r\n /* VSI Customization - START - 02/11/20 */\r\n let _subMenus: IMenuItemData[];\r\n if (isChild === undefined && !showOptionAll) {\r\n if (!isMobileView) {\r\n // Second level menu will not include option 'All' on desktop\r\n _subMenus =\r\n subMenus &&\r\n subMenus.filter(subItem => {\r\n return subItem.linkText && subItem.linkText.toLowerCase() !== 'all';\r\n });\r\n } else {\r\n // display parentName instead of all in third level on desktop\r\n let allOptionFound = false;\r\n _subMenus = subMenus;\r\n _subMenus &&\r\n _subMenus.map(submenu => {\r\n if (!allOptionFound && submenu.linkText && submenu.linkText.toLowerCase() === 'all') {\r\n submenu.linkText = `${submenu.linkText} ${parentName}`;\r\n allOptionFound = true;\r\n }\r\n });\r\n }\r\n } else {\r\n // Third level menu\r\n // on desktop, do not show the all category menu on the third level\r\n _subMenus = subMenus;\r\n _subMenus =\r\n subMenus &&\r\n subMenus.filter(subItem => {\r\n return subItem.linkText && subItem.linkText.toLowerCase() !== 'all';\r\n });\r\n }\r\n /* VSI Customization - END */\r\n let levelClassName: string = '';\r\n const menuOptions =\r\n _subMenus &&\r\n _subMenus.map((option: IMenuItemData, idx: number) => {\r\n let isActiveOption = option.id !== undefined && this.state.currentCategory === option.id;\r\n isActiveOption = isActiveOption && 'id' in option; // if any option doesn't have id value, its submenu will not be created\r\n const hasOptions = (option.subMenu && option.subMenu.length > 0) || false;\r\n const renderChildMenu = isMobileView ? hasOptions : isActiveOption;\r\n\r\n let menuItem: JSX.Element | null;\r\n if (hasOptions && isMobileView && this.currentLevelMobile < this.supportedLevel - 1) {\r\n menuItem = this._renderButtonMenuItem(option, activeMenu, idx);\r\n } else {\r\n menuItem = option.linkURL\r\n ? this._renderLinkMenuItem(option, idx, activeMenu, isChild, parentName)\r\n : this._renderSpanMenuItem(option);\r\n }\r\n let subMenu;\r\n if (renderChildMenu === isActiveOption) {\r\n this.currentLevel++;\r\n if (this.currentLevel <= this.supportedLevel - 1) {\r\n levelClassName = `level-${this.currentLevel.toString()}`;\r\n /* Last parameter indicated if it is child or not */\r\n subMenu = this._renderSubMenu(option.subMenu, isMobileView ? option.id : undefined, true, option.linkText);\r\n }\r\n }\r\n return (\r\n <>\r\n \r\n {menuItem}\r\n {/* VSI Customization - START */}\r\n {isMobileView && subMenu}\r\n {/* Following node displays submenu against a menu item when user moves mouse on it on desktop*/}\r\n {!isMobileView && (\r\n \r\n \r\n {subMenu}\r\n \r\n \r\n )}\r\n {/* VSI Customization - END */}\r\n \r\n \r\n );\r\n });\r\n\r\n return this._renderMenu(levelClassName, menuOptions, activeMenu);\r\n }\r\n /* VSI Customization - START */\r\n /* Following function navigate to category page */\r\n private _gotoCategoryPage = (categoryPageURL: string | undefined) => () => {\r\n if (categoryPageURL) {\r\n window.location.href = categoryPageURL;\r\n }\r\n };\r\n /* VSI Customization - END */\r\n private _renderButtonMenuItem(option: IMenuItemData, activeMenu?: number, index?: number): JSX.Element | null {\r\n const { Button, isMobileView } = this.props;\r\n /* VSI Customization - START */\r\n //customization to remove Offers category dynamically.\r\n if (option.linkURL === '/all/offers/5637246576.c') {\r\n return null;\r\n }\r\n\r\n if (isMobileView) {\r\n return (\r\n \r\n
{option.linkText}
\r\n \r\n );\r\n } else {\r\n /* Mouse Hover on menuitem displays its submenu till level 3 */\r\n /* Mouse Click on menuitem will navigate to its category page */\r\n\r\n return (\r\n \r\n
{option.linkText}
\r\n \r\n );\r\n }\r\n /* VSI Customization - START */\r\n }\r\n private _renderLinkMenuItem(\r\n option: IMenuItemData,\r\n index?: number,\r\n activeMenu?: number | undefined,\r\n _isChild?: boolean | undefined,\r\n parentName?: string\r\n ): JSX.Element | null {\r\n const { isMobileView } = this.props;\r\n const linkText = option.linkText ? option.linkText : '';\r\n this.payLoad.contentAction.etext = linkText;\r\n const attributes = getTelemetryAttributes(this.telemetryContent, this.payLoad);\r\n //remove linktext, when third category gets the same name of it's parent-- #task-11184\r\n const optionLinkText = _isChild && linkText === parentName ? linkText : linkText;\r\n /* VSI Customization - START*/\r\n if (isMobileView) {\r\n return (\r\n \r\n {optionLinkText}\r\n \r\n );\r\n } else {\r\n /* onClick navigates to category page if clicked item is child item (level 3) */\r\n const onClick = _isChild ? { onClick: this._handleLinkClick(option.linkText) } : undefined;\r\n return (\r\n \r\n {optionLinkText}\r\n {!_isChild && option.subMenu && option.subMenu.length > 0 ? : undefined}\r\n \r\n );\r\n }\r\n /* VSI Customization - END - 31/10/20 */\r\n }\r\n\r\n /* VSI Customization - START */\r\n /* Following function sets value of previous current category in case of level 3 and option.id in case of level 2 */\r\n private _handleMouseHover = (optionID: number | undefined, _isChild?: boolean | undefined) => () => {\r\n const _activeItem = _isChild ? this.state.currentCategory : optionID;\r\n _activeItem !== undefined && this.setState({ currentCategory: _activeItem });\r\n };\r\n /* onClick navigates to category page if clicked item is child item */\r\n private _handleLinkClick = (linkURL: string | undefined) => () => {\r\n this._gotoCategoryPage(linkURL);\r\n };\r\n /* VSI Customization - END */\r\n private _renderSpanMenuItem(option: IMenuItemData, index?: number): JSX.Element | null {\r\n const { Span } = this.props;\r\n return (\r\n \r\n {option.linkText}\r\n \r\n );\r\n }\r\n // VSI Customization - Added categoryImageLink has been added\r\n private _renderMenu(level: string, menuOptions: JSX.Element[], currentItem?: number): JSX.Element | null {\r\n const { DivContainer, MenuList, ImageDivContainer, showCategoryImage } = this.props;\r\n const { categoryImage, categoryImageLink } = this.state;\r\n this.currentLevel = 1;\r\n const scheduledImageUrl = this._getCategoryScheduledImageUrl() || categoryImageLink;\r\n if (showCategoryImage) {\r\n return (\r\n \r\n \r\n {menuOptions}\r\n \r\n \r\n {categoryImage !== undefined && categoryImage !== null && (\r\n <>\r\n {scheduledImageUrl ? (\r\n {this._getCategoryImage(categoryImage)}\r\n ) : (\r\n this._getCategoryImage(categoryImage)\r\n )}\r\n \r\n )}\r\n \r\n \r\n );\r\n }\r\n return (\r\n \r\n \r\n {menuOptions}\r\n \r\n \r\n );\r\n }\r\n\r\n /* VSI Customization - START - 04/01/21 */\r\n // private _getSubMenuLength = (menuItemId: number | undefined) => {\r\n // const menuItem = menuItemId && menuItemId.toString();\r\n // const htmlElement = menuItem && this.documentRef && this.documentRef.getElementById(menuItem);\r\n // const menuItemHeight = htmlElement && htmlElement.offsetHeight;\r\n // return menuItemHeight === 0 ? undefined : menuItemHeight;\r\n // };\r\n /* VSI Customization - END */\r\n\r\n private _handleDropdownToggle = (data: IMenuItemData, parentId?: number) => () => {\r\n if (!this.props.isMobileView) {\r\n this.setState({\r\n activeMenu: this.state.activeMenu && this.state.activeMenu === data.id! ? undefined : data.id!,\r\n parentMenu: parentId,\r\n currentCategory: undefined // parent of third menu to render third level menu\r\n });\r\n if (this.props.showCategoryImage) {\r\n this._updateCategoryImage(data.imageSource!, data.linkText!)();\r\n }\r\n } else {\r\n NavigationMenuView.isBackTrack = false;\r\n this.setState({\r\n activeMenu: data.id,\r\n mobileViewLabelText: data.linkText!,\r\n parentMenu: parentId,\r\n isBackBtnClicked: false\r\n });\r\n }\r\n\r\n this._resetFocus();\r\n };\r\n\r\n private _handleGoBack = () => () => {\r\n NavigationMenuView.isBackTrack = true;\r\n this.setState({ activeMenu: this.state.parentMenu, isBackBtnClicked: true });\r\n /* VSI Customization - START -13/11/20 */\r\n // decrement of 1 in currentLevelMobile when user clicks on back button\r\n this.currentLevelMobile--;\r\n /* VSI Customization - END */\r\n this._resetFocus();\r\n };\r\n\r\n private _resetFocus = () => {\r\n if (this.props.isMobileView) {\r\n setTimeout(() => {\r\n this.menuNode && this.menuNode.current && this.menuNode.current.focus();\r\n }, 0);\r\n }\r\n };\r\n\r\n // tslint:disable-next-line:no-any\r\n private _handleClickOutside = (event: any) => {\r\n if (this.menuNode.current && !this.menuNode.current.contains(event.target)) {\r\n this.setState({ activeMenu: undefined, mobileViewLabelText: '' });\r\n }\r\n };\r\n\r\n private _closeSubmenu(): void {\r\n if (!this.props.isMobileView) {\r\n this.setState({ activeMenu: undefined, mobileViewLabelText: '' });\r\n }\r\n }\r\n\r\n private isInViewport = () => {\r\n const bounding = this.navRef.current?.getBoundingClientRect();\r\n return bounding && bounding.top >= 0;\r\n };\r\n\r\n /* VSI Customization - START - 29/10/20 */\r\n /* Sticky Navigation function added */\r\n private _mainMenuScroll = (): void => {\r\n if (this.isInViewport()) {\r\n this.setState({\r\n scrollClass: false,\r\n navigationSearch: true\r\n });\r\n } else if (!this.state.scrollClass) {\r\n this.setState({\r\n scrollClass: true,\r\n navigationSearch: true\r\n });\r\n }\r\n };\r\n /* VSI Customization - END - 29/10/20 */\r\n}\r\n\r\nexport default NavigationMenuView;\r\n","const binding = { modules: {}, dataActions: {} };\n\n const registerActionId = (actionPath) => {\n if (binding.dataActions[actionPath] &&\n binding.dataActions[actionPath].default &&\n binding.dataActions[actionPath].default.prototype &&\n binding.dataActions[actionPath].default.prototype.id) {\n binding.dataActions[binding.dataActions[actionPath].default.prototype.id] = binding.dataActions[actionPath];\n } else {\n Object.keys(binding.dataActions[actionPath] || {}).forEach(exportName => {\n if (binding.dataActions[actionPath][exportName] &&\n binding.dataActions[actionPath][exportName].prototype &&\n binding.dataActions[actionPath][exportName].prototype.Action) {\n binding.dataActions[binding.dataActions[actionPath][exportName].prototype.id] = binding.dataActions[actionPath][exportName];\n }\n })\n }\n };\n\n const registerSanitizedActionPath = (sanitizedActionPath, dataAction) => {\n if (process.env.NODE_ENV === 'development') {\n if (!dataAction.default) {\n throw new Error('Data action path does not have a default export');\n }\n if (!(dataAction.default.prototype.id && binding.dataActions[dataAction.default.prototype.id]) || !binding.dataActions[sanitizedActionPath]) {\n binding.dataActions[sanitizedActionPath] = dataAction;\n }\n } else {\n binding.dataActions[sanitizedActionPath] = dataAction;\n if (!binding.dataActions[sanitizedActionPath].default) {\n throw new Error('Data action path ' + sanitizedActionPath + ' does not have a default export');\n }\n binding.dataActions[sanitizedActionPath].default.prototype.RegistrationId = sanitizedActionPath;\n if (binding.dataActions[sanitizedActionPath].default.prototype.id) {\n binding.dataActions[binding.dataActions[sanitizedActionPath].default.prototype.id] = sanitizedActionPath;\n }\n }\n };\n \n\n (binding.modules['dobbies-navigation-menu'] = {\n c: () => require('partner/modules/dobbies-navigation-menu/dobbies-navigation-menu.tsx'),\n $type: 'contentModule',\n da: [{name:'categories', path:'@msdyn365-commerce-modules/retail-actions/dist/lib/get-categories-hierarchy', runOn: 0},{name:'loyaltyCard', path:'@msdyn365-commerce-modules/retail-actions/dist/lib/get-loyalty-card', runOn: 0}],\n \n iNM: false,\n ns: '__local__',\n n: 'dobbies-navigation-menu',\n p: '__local__',\n \n pdp: '',\n \n \n md: 'src/modules/dobbies-navigation-menu'\n });\n \n\n {\n const sanitizedActionPath = '@msdyn365-commerce-modules/retail-actions/dist/lib/get-categories-hierarchy';\n let dataAction = require('@msdyn365-commerce-modules/retail-actions/dist/lib/get-categories-hierarchy');\n registerSanitizedActionPath(sanitizedActionPath, dataAction);\n }\n \n\n {\n const sanitizedActionPath = '@msdyn365-commerce-modules/retail-actions/dist/lib/get-loyalty-card';\n let dataAction = require('@msdyn365-commerce-modules/retail-actions/dist/lib/get-loyalty-card');\n registerSanitizedActionPath(sanitizedActionPath, dataAction);\n }\n \n\n \n window.__bindings__ = window.__bindings__ || {};\n window.__bindings__.modules = {\n ...window.__bindings__.modules || {},\n ...binding.modules\n };\n \n window.__bindings__.dataActions = {\n ...window.__bindings__.dataActions || {},\n ...binding.dataActions\n };\n export const viewDictionary = {};\n viewDictionary['__local__|__local__|modules|dobbies-navigation-menu|dobbies-navigation-menu'] = {\n c: () => require('partner/modules/dobbies-navigation-menu/dobbies-navigation-menu.view.tsx'),\n cn: '__local__-__local__-dobbies-navigation-menu'\n };\nwindow.__bindings__ = window.__bindings__ || {};\nwindow.__bindings__.viewDictionary = {\n ...window.__bindings__.viewDictionary || {},\n ...viewDictionary\n };","module.exports = React;","module.exports = ReactDOM;"],"names":["navigationMenuSource","NavigationMenu","React","constructor","props","super","isRetail","isCMS","shouldHideMenuItem","menuName","undefined","some","name","startsWith","_setNavigationSource","sourceType","retailServerOnly","this","cmsOnly","all","_updateViewport","bind","viewport","context","request","device","Type","config","state","isMobile","menuItemList","locale","nameTranslations","nameTranslation","length","find","item","Language","toLowerCase","Text","isNavOutOfBounds","componentDidMount","MsDyn365","isBrowser","resizeThrottledEventHandler","addThrottledEvent","window","componentWillUnmount","removeEventListener","render","_this$props$config$di","_this$props$config$di2","_mapData","navWidthStandard","setNavWidthStandard","isEmptyOrNullObject","data","telemetry","error","viewProps","_objectSpread","imageSettings","viewports","xs","q","w","h","xl","lazyload","gridSettings","Navigation","moduleProps","className","classnames","tag","role","MenuList","ListItem","showCategoryImage","displayCategoryImage","showPromotionalContent","displayPromotionalImage","Link","DivContainer","ImageDivContainer","Button","onClick","ImageContainer","Span","MobileDescriptionContainer","MobileBackButton","resources","backButtonAriaLabel","MobileDescriptionLabel","isMobileView","menuItemData","renderView","_this$props$context$r","showCannedSearches","query","mergedData","cmsNavItemsNew","map","idx","push","_constructMenuItemData","categories","result","index","_item$NeutralizedName","Name","hideMenuItemPrefix","NeutralizedName","cmsNavItems","_constructTopMenuItemData","enabletopMenu","mergedRootMenuData","topMenu","id","linkText","rootMenuNavigation","linkURL","imageSource","subMenu","menuExistsInRedundantMobileMenusConfig","menuText","removeExtraSubMenusOnMobile","i","retailItem","cmsItem","addedAllMenu","imageSouce","Images","Uri","friendlyName","NavigationMenuView","getFriendlyName","NameTranslations","urlFromConfig","_getUrlFromConfigOfNavItem","Children","filter","ric","_ric$NeutralizedName","RSItemIdInit","Url","_getNestedChildren","concat","_constructSecondLevelStaticMenus","RecordId","_getCMSNestedChildren","subMenuItem","CMSItemIdInit","linkUrl","destinationUrl","imageDestinationURL","imageLink","image","src","subMenuStaticMenus","_item$linkUrl","_item$linkUrl2","staticMenuItems","_item$subMenus","subMenus","submenu","category","imageSourceUrl","_this$props$context$r2","arguments","nestedChildren","allCategoryMenuText","getCategoryUrl","hasClassInParent","element","parent","parentNode","tagName","classList","contains","navs","document","getElementsByTagName","desktopNav","_desktopNav","offsetHeight","remove","add","ulDivs","getElementsByClassName","widthOfWindowIsGreater","innerWidth","style","getComputedStyle","navPaddingLeft","paddingLeft","split","navpaddingRight","paddingRight","navMarginLeft","marginLeft","navMarginRight","marginRight","setState","navLeftPadding","Number","navRightPadding","actualWidth","screen","width","_desktopNav2","_getViewport","sm","md","lg","__decorate","observable","computed","NAMES_TO_HIDE","supportedLevel","currentLevel","currentLevelMobile","mouseDownRefs","_getCategoryScheduledImageUrl","scheduledImageUrl","categoryName","menuImagesSchedule","imageSchedule","now","Date","dateTimeSplittedStartDate","imageShowStartDate","startDateMonth","startDateDay","startDateYear","startDateHour","startDateMinutes","imageShowingStartDate","dateTimeSplittedEndDate","imageShowEndDate","endDateMonth","endDateDay","endDateYear","endDateHour","endDateMinutes","getTime","imageUrl","ex","conditionalRoutingMenuItem","dobbiesClubLink","updatedMenuItem","_getTierId","loyaltyGroup","highestActiveLoyaltyCardTier","HighestActiveLoyaltyCardTier","loyaltyCardTiers","LoyaltyCardTiers","_","loyaltyCardTier","entries","TierId","_getRedirectionLink","loyaltyCard","tierId","clubFreeTierText","clubPlusTierText","CardNumber","trim","getUrlSync","actionContext","_getCategoryImage","categoryImage","categoryImageUrl","generateImageUrl","requestContext","apiSettings","ImageData","menuImageName","Image","Object","assign","loadFailureBehavior","_updateCategoryImage","selectedCategoryName","categoryImageLinks","selectedCategory","categoryLink","categoryImageLink","_gotoCategoryPage","categoryPageURL","location","href","_handleMouseHover","optionID","_isChild","_activeItem","currentCategory","_handleLinkClick","_handleDropdownToggle","parentId","isBackTrack","activeMenu","mobileViewLabelText","parentMenu","isBackBtnClicked","_resetFocus","_handleGoBack","setTimeout","menuNode","current","focus","_handleClickOutside","event","target","isInViewport","_this$navRef$current","bounding","navRef","getBoundingClientRect","top","_mainMenuScroll","scrollClass","navigationSearch","_closeSubmenu","telemetryContent","getTelemetryObject","telemetryPageName","payLoad","getPayloadObject","body","forEach","ref","addEventListener","then","LoyaltyGroups","redirectionLink","menuHeading","searchSlot","_getSlot","search","Module","Node","text","tabIndex","_renderDisplay","slotName","slots","menuItem","_getFromSubMenu","key","_createMenuItemList","found","_renderMobileSubMenu","_renderButtonMenuItem","_renderSubMenu","dobbiesClubNavItemText","user","isAuthenticated","_menuItemData$linkTex","updatedMenuItemData","_renderLinkMenuItem","_renderSpanMenuItem","isChild","parentName","showOptionAll","_subMenus","subItem","allOptionFound","levelClassName","menuOptions","option","isActiveOption","hasOptions","renderChildMenu","toString","_renderMenu","onMouseEnter","contentAction","etext","attributes","getTelemetryAttributes","optionLinkText","onTelemetryClick","onMouseOver","level","currentItem","binding","modules","dataActions","registerSanitizedActionPath","sanitizedActionPath","dataAction","default","Error","prototype","RegistrationId","c","require","$type","da","path","runOn","iNM","ns","n","p","pdp","__bindings__","viewDictionary","cn","module","exports","ReactDOM"],"sourceRoot":""}