{"version":3,"file":"static/js/7c2149dab3208d6c1f05.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 removeDomainFromCategoryURLs?: boolean;\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 isForMobile?: boolean;\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 if (this.props.config.subMenuStaticMenus && this.props.config.subMenuStaticMenus.length) {\r\n this.props.context.request.cookies.set('static_submenu_items', this.props.config.subMenuStaticMenus);\r\n }\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 const newCategories = this.props.config.removeDomainFromCategoryURLs\r\n ? this.removeDomainParameter(data.categories.result)\r\n : data.categories.result;\r\n newCategories.map((item: CategoryHierarchy, index: number) => {\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 removeDomainParameter(categoriesArray: CategoryHierarchy[]) {\r\n // Iterate over each category in the array\r\n categoriesArray.forEach(category => {\r\n // Check if the current category has a 'Url' property\r\n if (category.Url && typeof category.Url === 'string') {\r\n // Remove the '?domain=' parameter and everything after it\r\n category.Url = category.Url.split('?domain=')[0];\r\n }\r\n // If the category has Children, recursively process each child\r\n if (category.Children && Array.isArray(category.Children)) {\r\n this.removeDomainParameter(category.Children); // Recursively process children\r\n }\r\n });\r\n return categoriesArray;\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 (retailItem?.Name?.toLowerCase().includes('houseplants') || friendlyName.toLowerCase().includes('houseplants')) {\r\n console.log('Item Details', retailItem);\r\n }\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 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 friendlyName = NavigationMenuView.getFriendlyName(locale, category && category.NameTranslations) || '';\r\n nestedChildren.push({\r\n linkText: this.props.resources.allCategoryMenuText,\r\n imageSource: imageSourceUrl,\r\n linkURL:\r\n this._getUrlFromConfigOfNavItem(friendlyName) ||\r\n 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') as any;\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 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 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 let imageShowingStartDate = new Date(\r\n `${startDateMonth}-${startDateDay}-${startDateYear} ${startDateHour}:${startDateMinutes}:00`\r\n );\r\n if (this.getMobileOperatingSystem() === 'iOS') {\r\n imageShowingStartDate = new Date(\r\n parseInt(startDateYear.startsWith('20') ? startDateYear : `20${startDateYear}`, 10),\r\n parseInt(startDateMonth, 10) - 1,\r\n parseInt(startDateDay, 10),\r\n parseInt(startDateHour, 10),\r\n parseInt(startDateMinutes, 10),\r\n 0\r\n );\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 let imageShowEndDate = new Date(`${endDateMonth}-${endDateDay}-${endDateYear} ${endDateHour}:${endDateMinutes}:00`);\r\n if (this.getMobileOperatingSystem() === 'iOS') {\r\n imageShowEndDate = new Date(\r\n parseInt(endDateYear.startsWith('20') ? endDateYear : `20${endDateYear}`, 10),\r\n parseInt(endDateMonth, 10) - 1,\r\n parseInt(endDateDay, 10),\r\n parseInt(endDateHour, 10),\r\n parseInt(endDateMinutes, 10),\r\n 0\r\n );\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 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 friendlyName = NavigationMenuView.getFriendlyName(locale, category && category.NameTranslations) || '';\r\n nestedChildren.push({\r\n linkText: this.props.resources.allCategoryMenuText,\r\n imageSource: imageSourceUrl,\r\n linkURL:\r\n this._getUrlFromConfigOfNavItem(friendlyName) ||\r\n 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 private getMobileOperatingSystem(): string {\r\n // Get the user agent string\r\n const userAgent: string = navigator.userAgent || navigator.vendor || (window as any).opera;\r\n\r\n // Check for Windows Phone first because its user agent string may contain \"Android\"\r\n if (/windows phone/i.test(userAgent)) {\r\n return 'Windows Phone';\r\n }\r\n\r\n // Check for Android devices\r\n if (/android/i.test(userAgent)) {\r\n return 'Android';\r\n }\r\n\r\n // Check for iOS devices (iPad, iPhone, iPod)\r\n // The condition !window.MSStream ensures that it's not a Windows device\r\n if ((/iPad|iPhone|iPod/.test(userAgent) && !(window as any).MSStream) || userAgent.indexOf('Mac OS X') > 0) {\r\n return 'iOS';\r\n }\r\n\r\n // If no matches, return 'unknown'\r\n return 'unknown';\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.props.isMobileView && this.props.config.menuImagesSchedule) {\r\n for (const imageSchedule of this.props.config.menuImagesSchedule) {\r\n if (imageSchedule.menuName === this.state.categoryName && imageSchedule.isForMobile) {\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 let imageShowingStartDate = new Date(\r\n `${startDateMonth}-${startDateDay}-${startDateYear} ${startDateHour}:${startDateMinutes}:00`\r\n );\r\n if (this.getMobileOperatingSystem() === 'iOS') {\r\n imageShowingStartDate = new Date(\r\n parseInt(startDateYear.startsWith('20') ? startDateYear : `20${startDateYear}`, 10),\r\n parseInt(startDateMonth, 10) - 1,\r\n parseInt(startDateDay, 10),\r\n parseInt(startDateHour, 10),\r\n parseInt(startDateMinutes, 10),\r\n 0\r\n );\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 let imageShowEndDate = new Date(`${endDateMonth}-${endDateDay}-${endDateYear} ${endDateHour}:${endDateMinutes}:00`);\r\n if (this.getMobileOperatingSystem() === 'iOS') {\r\n imageShowEndDate = new Date(\r\n parseInt(endDateYear.startsWith('20') ? endDateYear : `20${endDateYear}`, 10),\r\n parseInt(endDateMonth, 10) - 1,\r\n parseInt(endDateDay, 10),\r\n parseInt(endDateHour, 10),\r\n parseInt(endDateMinutes, 10),\r\n 0\r\n );\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 console.log('Error', ex);\r\n }\r\n }\r\n }\r\n return null;\r\n }\r\n\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 && !imageSchedule.isForMobile) {\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 let imageShowingStartDate = new Date(\r\n `${startDateMonth}-${startDateDay}-${startDateYear} ${startDateHour}:${startDateMinutes}:00`\r\n );\r\n if (this.getMobileOperatingSystem() === 'iOS') {\r\n imageShowingStartDate = new Date(\r\n parseInt(startDateYear.startsWith('20') ? startDateYear : `20${startDateYear}`, 10),\r\n parseInt(startDateMonth, 10) - 1,\r\n parseInt(startDateDay, 10),\r\n parseInt(startDateHour, 10),\r\n parseInt(startDateMinutes, 10),\r\n 0\r\n );\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 let imageShowEndDate = new Date(`${endDateMonth}-${endDateDay}-${endDateYear} ${endDateHour}:${endDateMinutes}:00`);\r\n if (this.getMobileOperatingSystem() === 'iOS') {\r\n imageShowEndDate = new Date(\r\n parseInt(endDateYear.startsWith('20') ? endDateYear : `20${endDateYear}`, 10),\r\n parseInt(endDateMonth, 10) - 1,\r\n parseInt(endDateDay, 10),\r\n parseInt(endDateHour, 10),\r\n parseInt(endDateMinutes, 10),\r\n 0\r\n );\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, _subMenus);\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, _subMenus?: IMenuItemData[]): 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 (this.props.isMobileView && showCategoryImage && _subMenus) {\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 } else if (!this.props.isMobileView && 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 if (this.props.showCategoryImage && this.currentLevelMobile === 0) {\r\n this._updateCategoryImage(data.imageSource!, data.linkText!)();\r\n }\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","subMenuStaticMenus","cookies","set","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","removeDomainFromCategoryURLs","removeDomainParameter","index","_item$NeutralizedName","Name","hideMenuItemPrefix","NeutralizedName","cmsNavItems","_constructTopMenuItemData","categoriesArray","forEach","category","Url","split","Children","Array","isArray","enabletopMenu","mergedRootMenuData","topMenu","id","linkText","rootMenuNavigation","linkURL","imageSource","subMenu","menuExistsInRedundantMobileMenusConfig","menuText","removeExtraSubMenusOnMobile","i","retailItem","cmsItem","addedAllMenu","_retailItem$Name","imageSouce","Images","Uri","friendlyName","NavigationMenuView","getFriendlyName","NameTranslations","urlFromConfig","_getUrlFromConfigOfNavItem","includes","console","log","filter","ric","_ric$NeutralizedName","RSItemIdInit","_getNestedChildren","concat","_constructSecondLevelStaticMenus","RecordId","_getCMSNestedChildren","subMenuItem","CMSItemIdInit","linkUrl","destinationUrl","imageDestinationURL","imageLink","image","src","_item$linkUrl","_item$linkUrl2","staticMenuItems","_item$subMenus","subMenus","submenu","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","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","getMobileOperatingSystem","parseInt","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","isForMobile","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","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","userAgent","navigator","vendor","opera","test","MSStream","indexOf","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":""}