{"version":3,"file":"static/js/1e4caf8d94b86a015d6f.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 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 }\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 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 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 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","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","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","console","log","_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","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":""}